prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  Drop contributor profile URL with email addresses
  We should drop support for accessing contributor profiles by using user email addresses in the URLs. This feature, while not used internally in the app, leaks otherwise hidden user email addressed on sites like on web.archive.org index.
  
  This is particularly problematic for users without any contributions.
  
  
  </issue>
  <code>
  [start of pontoon/contributors/urls.py]
  1 from django.urls import path, register_converter
  2 from django.urls.converters import StringConverter
  3 from django.views.generic import RedirectView
  4 
  5 from . import views
  6 
  7 
  8 class EmailConverter(StringConverter):
  9     regex = r"[\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}"
  10 
  11 
  12 class UsernameConverter(StringConverter):
  13     regex = r"[\w.@+-]+"
  14 
  15 
  16 register_converter(EmailConverter, "email")
  17 register_converter(UsernameConverter, "username")
  18 
  19 urlpatterns = [
  20     # Legacy: Redirect to /contributors/email
  21     path(
  22         "contributor/<email:email>/",
  23         RedirectView.as_view(url="/contributors/%(email)s/", permanent=True),
  24     ),
  25     # List contributors
  26     path(
  27         "contributors/",
  28         views.ContributorsView.as_view(),
  29         name="pontoon.contributors",
  30     ),
  31     # Contributor profile by email
  32     path(
  33         "contributors/<email:email>/",
  34         views.contributor_email,
  35         name="pontoon.contributors.contributor.email",
  36     ),
  37     # Contributor profile by username
  38     path(
  39         "contributors/<username:username>/",
  40         views.contributor_username,
  41         name="pontoon.contributors.contributor.username",
  42     ),
  43     # Verify email address
  44     path(
  45         "verify-email-address/<str:token>/",
  46         views.verify_email_address,
  47         name="pontoon.contributors.verify.email",
  48     ),
  49     # Current user's profile
  50     path("profile/", views.profile, name="pontoon.contributors.profile"),
  51     # Current user's settings
  52     path("settings/", views.settings, name="pontoon.contributors.settings"),
  53     # Current user's notifications
  54     path(
  55         "notifications/",
  56         views.notifications,
  57         name="pontoon.contributors.notifications",
  58     ),
  59     # Mark current user's notifications as read
  60     path(
  61         "notifications/mark-all-as-read/",
  62         views.mark_all_notifications_as_read,
  63         name="pontoon.contributors.notifications.mark.all.as.read",
  64     ),
  65     # API: Toggle user profile attribute
  66     path(
  67         "api/v1/user/<username:username>/",
  68         views.toggle_user_profile_attribute,
  69         name="pontoon.contributors.toggle_user_profile_attribute",
  70     ),
  71     # AJAX: Save custom homepage
  72     path(
  73         "save-custom-homepage/",
  74         views.save_custom_homepage,
  75         name="pontoon.contributors.save_custom_homepage",
  76     ),
  77     # AJAX: Save preferred source locale
  78     path(
  79         "save-preferred-source-locale/",
  80         views.save_preferred_source_locale,
  81         name="pontoon.contributors.save_preferred_source_locale",
  82     ),
  83     # AJAX: Dismiss Add-On Promotion
  84     path(
  85         "dismiss-addon-promotion/",
  86         views.dismiss_addon_promotion,
  87         name="pontoon.contributors.dismiss_addon_promotion",
  88     ),
  89     # AJAX: Update contribution graph
  90     path(
  91         "update-contribution-graph/",
  92         views.update_contribution_graph,
  93         name="pontoon.contributors.update_contribution_graph",
  94     ),
  95     # AJAX: Update contribution timeline
  96     path(
  97         "update-contribution-timeline/",
  98         views.update_contribution_timeline,
  99         name="pontoon.contributors.update_contribution_timeline",
  100     ),
  101 ]
  102
  [end of pontoon/contributors/urls.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/pontoon/contributors/urls.py b/pontoon/contributors/urls.py
  --- a/pontoon/contributors/urls.py
  +++ b/pontoon/contributors/urls.py
  @@ -28,12 +28,6 @@
           views.ContributorsView.as_view(),
           name="pontoon.contributors",
       ),
  -    # Contributor profile by email
  -    path(
  -        "contributors/<email:email>/",
  -        views.contributor_email,
  -        name="pontoon.contributors.contributor.email",
  -    ),
       # Contributor profile by username
       path(
           "contributors/<username:username>/",
  
verification_info: {"golden_diff": "diff --git a/pontoon/contributors/urls.py b/pontoon/contributors/urls.py\n--- a/pontoon/contributors/urls.py\n+++ b/pontoon/contributors/urls.py\n@@ -28,12 +28,6 @@\n         views.ContributorsView.as_view(),\n         name=\"pontoon.contributors\",\n     ),\n-    # Contributor profile by email\n-    path(\n-        \"contributors/<email:email>/\",\n-        views.contributor_email,\n-        name=\"pontoon.contributors.contributor.email\",\n-    ),\n     # Contributor profile by username\n     path(\n         \"contributors/<username:username>/\",\n", "issue": "Drop contributor profile URL with email addresses\nWe should drop support for accessing contributor profiles by using user email addresses in the URLs. This feature, while not used internally in the app, leaks otherwise hidden user email addressed on sites like on web.archive.org index.\r\n\r\nThis is particularly problematic for users without any contributions.\r\n\n", "before_files": [{"content": "from django.urls import path, register_converter\nfrom django.urls.converters import StringConverter\nfrom django.views.generic import RedirectView\n\nfrom . import views\n\n\nclass EmailConverter(StringConverter):\n    regex = r\"[\\w.%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}\"\n\n\nclass UsernameConverter(StringConverter):\n    regex = r\"[\\w.@+-]+\"\n\n\nregister_converter(EmailConverter, \"email\")\nregister_converter(UsernameConverter, \"username\")\n\nurlpatterns = [\n    # Legacy: Redirect to /contributors/email\n    path(\n        \"contributor/<email:email>/\",\n        RedirectView.as_view(url=\"/contributors/%(email)s/\", permanent=True),\n    ),\n    # List contributors\n    path(\n        \"contributors/\",\n        views.ContributorsView.as_view(),\n        name=\"pontoon.contributors\",\n    ),\n    # Contributor profile by email\n    path(\n        \"contributors/<email:email>/\",\n        views.contributor_email,\n        name=\"pontoon.contributors.contributor.email\",\n    ),\n    # Contributor profile by username\n    path(\n        \"contributors/<username:username>/\",\n        views.contributor_username,\n        name=\"pontoon.contributors.contributor.username\",\n    ),\n    # Verify email address\n    path(\n        \"verify-email-address/<str:token>/\",\n        views.verify_email_address,\n        name=\"pontoon.contributors.verify.email\",\n    ),\n    # Current user's profile\n    path(\"profile/\", views.profile, name=\"pontoon.contributors.profile\"),\n    # Current user's settings\n    path(\"settings/\", views.settings, name=\"pontoon.contributors.settings\"),\n    # Current user's notifications\n    path(\n        \"notifications/\",\n        views.notifications,\n        name=\"pontoon.contributors.notifications\",\n    ),\n    # Mark current user's notifications as read\n    path(\n        \"notifications/mark-all-as-read/\",\n        views.mark_all_notifications_as_read,\n        name=\"pontoon.contributors.notifications.mark.all.as.read\",\n    ),\n    # API: Toggle user profile attribute\n    path(\n        \"api/v1/user/<username:username>/\",\n        views.toggle_user_profile_attribute,\n        name=\"pontoon.contributors.toggle_user_profile_attribute\",\n    ),\n    # AJAX: Save custom homepage\n    path(\n        \"save-custom-homepage/\",\n        views.save_custom_homepage,\n        name=\"pontoon.contributors.save_custom_homepage\",\n    ),\n    # AJAX: Save preferred source locale\n    path(\n        \"save-preferred-source-locale/\",\n        views.save_preferred_source_locale,\n        name=\"pontoon.contributors.save_preferred_source_locale\",\n    ),\n    # AJAX: Dismiss Add-On Promotion\n    path(\n        \"dismiss-addon-promotion/\",\n        views.dismiss_addon_promotion,\n        name=\"pontoon.contributors.dismiss_addon_promotion\",\n    ),\n    # AJAX: Update contribution graph\n    path(\n        \"update-contribution-graph/\",\n        views.update_contribution_graph,\n        name=\"pontoon.contributors.update_contribution_graph\",\n    ),\n    # AJAX: Update contribution timeline\n    path(\n        \"update-contribution-timeline/\",\n        views.update_contribution_timeline,\n        name=\"pontoon.contributors.update_contribution_timeline\",\n    ),\n]\n", "path": "pontoon/contributors/urls.py"}]}