code: @NonNull
      Map<String, Object> hashMapFromCard(@NonNull Card card) {
          final Map<String, Object> tokenParams = new HashMap<>();
  
          final AbstractMap<String, Object> cardParams = new HashMap<>();
          cardParams.put("number", StripeTextUtils.nullIfBlank(card.getNumber()));
          cardParams.put("cvc", StripeTextUtils.nullIfBlank(card.getCVC()));
          cardParams.put("exp_month", card.getExpMonth());
          cardParams.put("exp_year", card.getExpYear());
          cardParams.put("name", StripeTextUtils.nullIfBlank(card.getName()));
          cardParams.put("currency", StripeTextUtils.nullIfBlank(card.getCurrency()));
          cardParams.put("address_line1", StripeTextUtils.nullIfBlank(card.getAddressLine1()));
          cardParams.put("address_line2", StripeTextUtils.nullIfBlank(card.getAddressLine2()));
          cardParams.put("address_city", StripeTextUtils.nullIfBlank(card.getAddressCity()));
          cardParams.put("address_zip", StripeTextUtils.nullIfBlank(card.getAddressZip()));
          cardParams.put("address_state", StripeTextUtils.nullIfBlank(card.getAddressState()));
          cardParams.put("address_country", StripeTextUtils.nullIfBlank(card.getAddressCountry()));
  
          // Remove all null values; they cause validation errors
          removeNullAndEmptyParams(cardParams);
  
          // We store the logging items in this field, which is extracted from the parameters
          // sent to the API.
          tokenParams.put(LoggingUtils.FIELD_PRODUCT_USAGE, card.getLoggingTokens());
  
          tokenParams.put(Token.TYPE_CARD, cardParams);
  
          addUidParams(tokenParams);
          return tokenParams;
      }
docs: A utility function to map the fields of a {@link Card} object into a {@link Map} we
  can use in network communications.
  
  @param card the {@link Card} to be read
  @return a {@link Map} containing the appropriate values read from the card