code: def roles_accepted(*role_names):
      
      # convert the list to a list containing that list.
      # Because roles_required(a, b) requires A AND B
      # while roles_required([a, b]) requires A OR B
      def wrapper(view_function):
  
          @wraps(view_function)    # Tells debuggers that is is a function wrapper
          def decorator(*args, **kwargs):
              user_manager = current_app.user_manager
  
              # User must be logged in with a confirmed email address
              allowed = _is_logged_in_with_confirmed_email(user_manager)
              if not allowed:
                  # Redirect to unauthenticated page
                  return user_manager.unauthenticated_view()
  
              # User must have the required roles
              # NB: roles_required would call has_roles(*role_names): ('A', 'B') --> ('A', 'B')
              # But: roles_accepted must call has_roles(role_names):  ('A', 'B') --< (('A', 'B'),)
              if not current_user.has_roles(role_names):
                  # Redirect to the unauthorized page
                  return user_manager.unauthorized_view()
  
              # It's OK to call the view
              return view_function(*args, **kwargs)
  
          return decorator
  
      return wrapper
docs: | This decorator ensures that the current user is logged in,
      | and has *at least one* of the specified roles (OR operation).
  
      Example::
  
          @route('/edit_article')
          @roles_accepted('Writer', 'Editor')
          def edit_article():  # User must be 'Writer' OR 'Editor'
              ...
  
      | Calls unauthenticated_view() when the user is not logged in
          or when user has not confirmed their email address.
      | Calls unauthorized_view() when the user does not have the required roles.
      | Calls the decorated view otherwise.