code: func verifyToken() error {
  	// get the token
  	tokData, err := loadData(*flagVerify)
  	if err != nil {
  		return fmt.Errorf("Couldn't read token: %v", err)
  	}
  
  	// trim possible whitespace from token
  	tokData = regexp.MustCompile(`\s*$`).ReplaceAll(tokData, []byte{})
  	if *flagDebug {
  		fmt.Fprintf(os.Stderr, "Token len: %v bytes\n", len(tokData))
  	}
  
  	// Parse the token.  Load the key from command line option
  	token, err := jwt.Parse(string(tokData), func(t *jwt.Token) (interface{}, error) {
  		data, err := loadData(*flagKey)
  		if err != nil {
  			return nil, err
  		}
  		if isEs() {
  			return jwt.ParseECPublicKeyFromPEM(data)
  		} else if isRs() {
  			return jwt.ParseRSAPublicKeyFromPEM(data)
  		}
  		return data, nil
  	})
  
  	// Print some debug data
  	if *flagDebug && token != nil {
  		fmt.Fprintf(os.Stderr, "Header:\n%v\n", token.Header)
  		fmt.Fprintf(os.Stderr, "Claims:\n%v\n", token.Claims)
  	}
  
  	// Print an error if we can't parse for some reason
  	if err != nil {
  		return fmt.Errorf("Couldn't parse token: %v", err)
  	}
  
  	// Is token invalid?
  	if !token.Valid {
  		return fmt.Errorf("Token is invalid")
  	}
  
  	// Print the token details
  	if err := printJSON(token.Claims); err != nil {
  		return fmt.Errorf("Failed to output claims: %v", err)
  	}
  
  	return nil
  }
docs: // Verify a token and output the claims.  This is a great example
  // of how to verify and view a token.