docs: def _get_token_possibilities(cls, token, mode):
          """
          Returns all possible component types of a token without regard to its context. For example "26" could be year,
          date or minute, but can't be a month or an hour.
          :param token: the token to classify
          :param mode: the parse mode
          :return: the dict of possible types and values if token was of that type
          """
          token = token.lower().strip()
          possibilities = {}
          try:
              as_int = int(token)
  
              if mode != Mode.TIME:
                  if 1 <= as_int <= 9999 and (len(token) == 2 or len(token) == 4):
                      possibilities[Component.YEAR] = as_int
                  if 1 <= as_int <= 12:
                      possibilities[Component.MONTH] = as_int
                  if 1 <= as_int <= 31:
                      possibilities[Component.DAY] = as_int
  
              if mode != Mode.DATE:
                  if 0 <= as_int <= 23:
                      possibilities[Component.HOUR] = as_int
                  if 0 <= as_int <= 59:
                      possibilities[Component.MINUTE] = as_int
                  if 0 <= as_int <= 59:
                      possibilities[Component.SECOND] = as_int
                  if len(token) == 3 or len(token) == 6 or len(token) == 9:
                      nano = 0
                      if len(token) == 3:  # millisecond precision
                          nano = as_int * 1000000
                      elif len(token) == 6:  # microsecond precision
                          nano = as_int * 1000
                      elif len(token) == 9:
                          nano = as_int
                      possibilities[Component.NANO] = nano
                  if len(token) == 4:
                      hour = as_int // 100
                      minute = as_int - (hour * 100)
                      if 1 <= hour <= 24 and 1 <= minute <= 59:
                          possibilities[Component.HOUR_AND_MINUTE] = as_int
  
          except ValueError:
              if mode != Mode.TIME:
                  # could it be a month alias?
                  month = MONTHS_BY_ALIAS.get(token, None)
                  if month is not None:
                      possibilities[Component.MONTH] = month
  
              if mode != Mode.DATE:
                  # could it be an AM/PM marker?
                  is_am_marker = token == "am"
                  is_pm_marker = token == "pm"
                  if is_am_marker or is_pm_marker:
                      possibilities[Component.AM_PM] = cls.AM if is_am_marker else cls.PM
  
                  # offset parsing is limited to Z meaning UTC for now
                  if token == "z":
                      possibilities[Component.OFFSET] = 0
  
          return possibilities