package dns

import (
	
	
	
	
	
	
)

// A remainder of the rdata with embedded spaces, return the parsed string (sans the spaces)
// or an error
func endingToString( *zlexer,  string) (string, *ParseError) {
	var  strings.Builder
	,  := .Next() // zString
	for .value != zNewline && .value != zEOF {
		if .err {
			return .String(), &ParseError{err: , lex: }
		}
		switch .value {
		case zString:
			.WriteString(.token)
		case zBlank: // Ok
		default:
			return "", &ParseError{err: , lex: }
		}
		, _ = .Next()
	}

	return .String(), nil
}

// A remainder of the rdata with embedded spaces, split on unquoted whitespace
// and return the parsed string slice or an error
func endingToTxtSlice( *zlexer,  string) ([]string, *ParseError) {
	// Get the remaining data until we see a zNewline
	,  := .Next()
	if .err {
		return nil, &ParseError{err: , lex: }
	}

	// Build the slice
	 := make([]string, 0)
	 := false
	 := false
	for .value != zNewline && .value != zEOF {
		if .err {
			return nil, &ParseError{err: , lex: }
		}
		switch .value {
		case zString:
			 = false
			// split up tokens that are larger than 255 into 255-chunks
			 := []string{}
			 := 0
			for {
				,  := escapedStringOffset(.token[:], 255)
				if ! {
					return nil, &ParseError{err: , lex: }
				}
				if  != -1 && + != len(.token) {
					 = append(, .token[:+])
				} else {
					 = append(, .token[:])
					break

				}
				 += 
			}
			 = append(, ...)
		case zBlank:
			if  {
				// zBlank can only be seen in between txt parts.
				return nil, &ParseError{err: , lex: }
			}
		case zQuote:
			if  &&  {
				 = append(, "")
			}
			 = !
			 = true
		default:
			return nil, &ParseError{err: , lex: }
		}
		, _ = .Next()
	}

	if  {
		return nil, &ParseError{err: , lex: }
	}

	return , nil
}

func ( *A) ( *zlexer,  string) *ParseError {
	,  := .Next()
	.A = net.ParseIP(.token)
	// IPv4 addresses cannot include ":".
	// We do this rather than use net.IP's To4() because
	// To4() treats IPv4-mapped IPv6 addresses as being
	// IPv4.
	 := !strings.Contains(.token, ":")
	if .A == nil || ! || .err {
		return &ParseError{err: "bad A A", lex: }
	}
	return slurpRemainder()
}

func ( *AAAA) ( *zlexer,  string) *ParseError {
	,  := .Next()
	.AAAA = net.ParseIP(.token)
	// IPv6 addresses must include ":", and IPv4
	// addresses cannot include ":".
	 := strings.Contains(.token, ":")
	if .AAAA == nil || ! || .err {
		return &ParseError{err: "bad AAAA AAAA", lex: }
	}
	return slurpRemainder()
}

func ( *NS) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad NS Ns", lex: }
	}
	.Ns = 
	return slurpRemainder()
}

func ( *PTR) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad PTR Ptr", lex: }
	}
	.Ptr = 
	return slurpRemainder()
}

func ( *NSAPPTR) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad NSAP-PTR Ptr", lex: }
	}
	.Ptr = 
	return slurpRemainder()
}

func ( *RP) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad RP Mbox", lex: }
	}
	.Mbox = 

	.Next() // zBlank
	, _ = .Next()
	.Txt = .token

	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad RP Txt", lex: }
	}
	.Txt = 

	return slurpRemainder()
}

func ( *MR) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad MR Mr", lex: }
	}
	.Mr = 
	return slurpRemainder()
}

func ( *MB) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad MB Mb", lex: }
	}
	.Mb = 
	return slurpRemainder()
}

func ( *MG) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad MG Mg", lex: }
	}
	.Mg = 
	return slurpRemainder()
}

func ( *HINFO) ( *zlexer,  string) *ParseError {
	,  := endingToTxtSlice(, "bad HINFO Fields")
	if  != nil {
		return 
	}

	if  := len();  == 0 {
		return nil
	} else if  == 1 {
		// Can we split it?
		if  := strings.Fields([0]); len() > 1 {
			 = 
		} else {
			 = append(, "")
		}
	}

	.Cpu = [0]
	.Os = strings.Join([1:], " ")
	return nil
}

// according to RFC 1183 the parsing is identical to HINFO, so just use that code.
func ( *ISDN) ( *zlexer,  string) *ParseError {
	,  := endingToTxtSlice(, "bad ISDN Fields")
	if  != nil {
		return 
	}

	if  := len();  == 0 {
		return nil
	} else if  == 1 {
		// Can we split it?
		if  := strings.Fields([0]); len() > 1 {
			 = 
		} else {
			 = append(, "")
		}
	}

	.Address = [0]
	.SubAddress = strings.Join([1:], " ")

	return nil
}

func ( *MINFO) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad MINFO Rmail", lex: }
	}
	.Rmail = 

	.Next() // zBlank
	, _ = .Next()
	.Email = .token

	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad MINFO Email", lex: }
	}
	.Email = 

	return slurpRemainder()
}

func ( *MF) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad MF Mf", lex: }
	}
	.Mf = 
	return slurpRemainder()
}

func ( *MD) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad MD Md", lex: }
	}
	.Md = 
	return slurpRemainder()
}

func ( *MX) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad MX Pref", lex: }
	}
	.Preference = uint16()

	.Next()        // zBlank
	, _ = .Next() // zString
	.Mx = .token

	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad MX Mx", lex: }
	}
	.Mx = 

	return slurpRemainder()
}

func ( *RT) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil {
		return &ParseError{err: "bad RT Preference", lex: }
	}
	.Preference = uint16()

	.Next()        // zBlank
	, _ = .Next() // zString
	.Host = .token

	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad RT Host", lex: }
	}
	.Host = 

	return slurpRemainder()
}

func ( *AFSDB) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad AFSDB Subtype", lex: }
	}
	.Subtype = uint16()

	.Next()        // zBlank
	, _ = .Next() // zString
	.Hostname = .token

	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad AFSDB Hostname", lex: }
	}
	.Hostname = 
	return slurpRemainder()
}

func ( *X25) ( *zlexer,  string) *ParseError {
	,  := .Next()
	if .err {
		return &ParseError{err: "bad X25 PSDNAddress", lex: }
	}
	.PSDNAddress = .token
	return slurpRemainder()
}

func ( *KX) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad KX Pref", lex: }
	}
	.Preference = uint16()

	.Next()        // zBlank
	, _ = .Next() // zString
	.Exchanger = .token

	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad KX Exchanger", lex: }
	}
	.Exchanger = 
	return slurpRemainder()
}

func ( *CNAME) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad CNAME Target", lex: }
	}
	.Target = 
	return slurpRemainder()
}

func ( *DNAME) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad DNAME Target", lex: }
	}
	.Target = 
	return slurpRemainder()
}

func ( *SOA) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad SOA Ns", lex: }
	}
	.Ns = 

	.Next() // zBlank
	, _ = .Next()
	.Mbox = .token

	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad SOA Mbox", lex: }
	}
	.Mbox = 

	.Next() // zBlank

	var (
		  uint32
		 bool
	)
	for  := 0;  < 5; ++ {
		, _ = .Next()
		if .err {
			return &ParseError{err: "bad SOA zone parameter", lex: }
		}
		if ,  := strconv.ParseUint(.token, 10, 32);  != nil {
			if  == 0 {
				// Serial must be a number
				return &ParseError{err: "bad SOA zone parameter", lex: }
			}
			// We allow other fields to be unitful duration strings
			if ,  = stringToTTL(.token); ! {
				return &ParseError{err: "bad SOA zone parameter", lex: }

			}
		} else {
			 = uint32()
		}
		switch  {
		case 0:
			.Serial = 
			.Next() // zBlank
		case 1:
			.Refresh = 
			.Next() // zBlank
		case 2:
			.Retry = 
			.Next() // zBlank
		case 3:
			.Expire = 
			.Next() // zBlank
		case 4:
			.Minttl = 
		}
	}
	return slurpRemainder()
}

func ( *SRV) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad SRV Priority", lex: }
	}
	.Priority = uint16()

	.Next()        // zBlank
	, _ = .Next() // zString
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad SRV Weight", lex: }
	}
	.Weight = uint16()

	.Next()        // zBlank
	, _ = .Next() // zString
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad SRV Port", lex: }
	}
	.Port = uint16()

	.Next()        // zBlank
	, _ = .Next() // zString
	.Target = .token

	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad SRV Target", lex: }
	}
	.Target = 
	return slurpRemainder()
}

func ( *NAPTR) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad NAPTR Order", lex: }
	}
	.Order = uint16()

	.Next()        // zBlank
	, _ = .Next() // zString
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad NAPTR Preference", lex: }
	}
	.Preference = uint16()

	// Flags
	.Next()        // zBlank
	, _ = .Next() // _QUOTE
	if .value != zQuote {
		return &ParseError{err: "bad NAPTR Flags", lex: }
	}
	, _ = .Next() // Either String or Quote
	if .value == zString {
		.Flags = .token
		, _ = .Next() // _QUOTE
		if .value != zQuote {
			return &ParseError{err: "bad NAPTR Flags", lex: }
		}
	} else if .value == zQuote {
		.Flags = ""
	} else {
		return &ParseError{err: "bad NAPTR Flags", lex: }
	}

	// Service
	.Next()        // zBlank
	, _ = .Next() // _QUOTE
	if .value != zQuote {
		return &ParseError{err: "bad NAPTR Service", lex: }
	}
	, _ = .Next() // Either String or Quote
	if .value == zString {
		.Service = .token
		, _ = .Next() // _QUOTE
		if .value != zQuote {
			return &ParseError{err: "bad NAPTR Service", lex: }
		}
	} else if .value == zQuote {
		.Service = ""
	} else {
		return &ParseError{err: "bad NAPTR Service", lex: }
	}

	// Regexp
	.Next()        // zBlank
	, _ = .Next() // _QUOTE
	if .value != zQuote {
		return &ParseError{err: "bad NAPTR Regexp", lex: }
	}
	, _ = .Next() // Either String or Quote
	if .value == zString {
		.Regexp = .token
		, _ = .Next() // _QUOTE
		if .value != zQuote {
			return &ParseError{err: "bad NAPTR Regexp", lex: }
		}
	} else if .value == zQuote {
		.Regexp = ""
	} else {
		return &ParseError{err: "bad NAPTR Regexp", lex: }
	}

	// After quote no space??
	.Next()        // zBlank
	, _ = .Next() // zString
	.Replacement = .token

	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad NAPTR Replacement", lex: }
	}
	.Replacement = 
	return slurpRemainder()
}

func ( *TALINK) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad TALINK PreviousName", lex: }
	}
	.PreviousName = 

	.Next() // zBlank
	, _ = .Next()
	.NextName = .token

	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad TALINK NextName", lex: }
	}
	.NextName = 

	return slurpRemainder()
}

func ( *LOC) ( *zlexer,  string) *ParseError {
	// Non zero defaults for LOC record, see RFC 1876, Section 3.
	.Size = 0x12     // 1e2 cm (1m)
	.HorizPre = 0x16 // 1e6 cm (10000m)
	.VertPre = 0x13  // 1e3 cm (10m)
	 := false

	// North
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 32)
	if  != nil || .err ||  > 90 {
		return &ParseError{err: "bad LOC Latitude", lex: }
	}
	.Latitude = 1000 * 60 * 60 * uint32()

	.Next() // zBlank
	// Either number, 'N' or 'S'
	, _ = .Next()
	if .Latitude,  = locCheckNorth(.token, .Latitude);  {
		goto 
	}
	if ,  := strconv.ParseUint(.token, 10, 32);  != nil || .err ||  > 59 {
		return &ParseError{err: "bad LOC Latitude minutes", lex: }
	} else {
		.Latitude += 1000 * 60 * uint32()
	}

	.Next() // zBlank
	, _ = .Next()
	if ,  := strconv.ParseFloat(.token, 64);  != nil || .err ||  < 0 ||  >= 60 {
		return &ParseError{err: "bad LOC Latitude seconds", lex: }
	} else {
		.Latitude += uint32(1000 * )
	}
	.Next() // zBlank
	// Either number, 'N' or 'S'
	, _ = .Next()
	if .Latitude,  = locCheckNorth(.token, .Latitude);  {
		goto 
	}
	// If still alive, flag an error
	return &ParseError{err: "bad LOC Latitude North/South", lex: }

:
	// East
	.Next() // zBlank
	, _ = .Next()
	if ,  := strconv.ParseUint(.token, 10, 32);  != nil || .err ||  > 180 {
		return &ParseError{err: "bad LOC Longitude", lex: }
	} else {
		.Longitude = 1000 * 60 * 60 * uint32()
	}
	.Next() // zBlank
	// Either number, 'E' or 'W'
	, _ = .Next()
	if .Longitude,  = locCheckEast(.token, .Longitude);  {
		goto 
	}
	if ,  := strconv.ParseUint(.token, 10, 32);  != nil || .err ||  > 59 {
		return &ParseError{err: "bad LOC Longitude minutes", lex: }
	} else {
		.Longitude += 1000 * 60 * uint32()
	}
	.Next() // zBlank
	, _ = .Next()
	if ,  := strconv.ParseFloat(.token, 64);  != nil || .err ||  < 0 ||  >= 60 {
		return &ParseError{err: "bad LOC Longitude seconds", lex: }
	} else {
		.Longitude += uint32(1000 * )
	}
	.Next() // zBlank
	// Either number, 'E' or 'W'
	, _ = .Next()
	if .Longitude,  = locCheckEast(.token, .Longitude);  {
		goto 
	}
	// If still alive, flag an error
	return &ParseError{err: "bad LOC Longitude East/West", lex: }

:
	.Next() // zBlank
	, _ = .Next()
	if .token == "" || .err {
		return &ParseError{err: "bad LOC Altitude", lex: }
	}
	if .token[len(.token)-1] == 'M' || .token[len(.token)-1] == 'm' {
		.token = .token[0 : len(.token)-1]
	}
	if ,  := strconv.ParseFloat(.token, 64);  != nil {
		return &ParseError{err: "bad LOC Altitude", lex: }
	} else {
		.Altitude = uint32(*100.0 + 10000000.0 + 0.5)
	}

	// And now optionally the other values
	, _ = .Next()
	 := 0
	for .value != zNewline && .value != zEOF {
		switch .value {
		case zString:
			switch  {
			case 0: // Size
				, ,  := stringToCm(.token)
				if ! {
					return &ParseError{err: "bad LOC Size", lex: }
				}
				.Size = &0x0f | <<4&0xf0
			case 1: // HorizPre
				, ,  := stringToCm(.token)
				if ! {
					return &ParseError{err: "bad LOC HorizPre", lex: }
				}
				.HorizPre = &0x0f | <<4&0xf0
			case 2: // VertPre
				, ,  := stringToCm(.token)
				if ! {
					return &ParseError{err: "bad LOC VertPre", lex: }
				}
				.VertPre = &0x0f | <<4&0xf0
			}
			++
		case zBlank:
			// Ok
		default:
			return &ParseError{err: "bad LOC Size, HorizPre or VertPre", lex: }
		}
		, _ = .Next()
	}
	return nil
}

func ( *HIP) ( *zlexer,  string) *ParseError {
	// HitLength is not represented
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad HIP PublicKeyAlgorithm", lex: }
	}
	.PublicKeyAlgorithm = uint8()

	.Next()        // zBlank
	, _ = .Next() // zString
	if .token == "" || .err {
		return &ParseError{err: "bad HIP Hit", lex: }
	}
	.Hit = .token // This can not contain spaces, see RFC 5205 Section 6.
	.HitLength = uint8(len(.Hit)) / 2

	.Next()        // zBlank
	, _ = .Next() // zString
	if .token == "" || .err {
		return &ParseError{err: "bad HIP PublicKey", lex: }
	}
	.PublicKey = .token // This cannot contain spaces
	,  := base64.StdEncoding.DecodeString(.PublicKey)
	if  != nil {
		return &ParseError{err: "bad HIP PublicKey", lex: }
	}
	.PublicKeyLength = uint16(len())

	// RendezvousServers (if any)
	, _ = .Next()
	var  []string
	for .value != zNewline && .value != zEOF {
		switch .value {
		case zString:
			,  := toAbsoluteName(.token, )
			if .err || ! {
				return &ParseError{err: "bad HIP RendezvousServers", lex: }
			}
			 = append(, )
		case zBlank:
			// Ok
		default:
			return &ParseError{err: "bad HIP RendezvousServers", lex: }
		}
		, _ = .Next()
	}

	.RendezvousServers = 
	return nil
}

func ( *CERT) ( *zlexer,  string) *ParseError {
	,  := .Next()
	if ,  := StringToCertType[.token];  {
		.Type = 
	} else if ,  := strconv.ParseUint(.token, 10, 16);  != nil {
		return &ParseError{err: "bad CERT Type", lex: }
	} else {
		.Type = uint16()
	}
	.Next()        // zBlank
	, _ = .Next() // zString
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad CERT KeyTag", lex: }
	}
	.KeyTag = uint16()
	.Next()        // zBlank
	, _ = .Next() // zString
	if ,  := StringToAlgorithm[.token];  {
		.Algorithm = 
	} else if ,  := strconv.ParseUint(.token, 10, 8);  != nil {
		return &ParseError{err: "bad CERT Algorithm", lex: }
	} else {
		.Algorithm = uint8()
	}
	,  := endingToString(, "bad CERT Certificate")
	if  != nil {
		return 
	}
	.Certificate = 
	return nil
}

func ( *OPENPGPKEY) ( *zlexer,  string) *ParseError {
	,  := endingToString(, "bad OPENPGPKEY PublicKey")
	if  != nil {
		return 
	}
	.PublicKey = 
	return nil
}

func ( *CSYNC) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 32)
	if  != nil {
		// Serial must be a number
		return &ParseError{err: "bad CSYNC serial", lex: }
	}
	.Serial = uint32()

	.Next() // zBlank

	, _ = .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil {
		// Serial must be a number
		return &ParseError{err: "bad CSYNC flags", lex: }
	}
	.Flags = uint16()

	.TypeBitMap = make([]uint16, 0)
	var (
		  uint16
		 bool
	)
	, _ = .Next()
	for .value != zNewline && .value != zEOF {
		switch .value {
		case zBlank:
			// Ok
		case zString:
			 := strings.ToUpper(.token)
			if ,  = StringToType[]; ! {
				if ,  = typeToInt(.token); ! {
					return &ParseError{err: "bad CSYNC TypeBitMap", lex: }
				}
			}
			.TypeBitMap = append(.TypeBitMap, )
		default:
			return &ParseError{err: "bad CSYNC TypeBitMap", lex: }
		}
		, _ = .Next()
	}
	return nil
}

func ( *ZONEMD) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 32)
	if  != nil || .err {
		return &ParseError{err: "bad ZONEMD Serial", lex: }
	}
	.Serial = uint32()

	.Next() // zBlank
	, _ = .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad ZONEMD Scheme", lex: }
	}
	.Scheme = uint8()

	.Next() // zBlank
	, _ = .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad ZONEMD Hash Algorithm", lex: }
	}
	.Hash = uint8()

	,  := endingToString(, "bad ZONEMD Digest")
	if  != nil {
		return 
	}
	.Digest = 
	return nil
}

func ( *SIG) ( *zlexer,  string) *ParseError { return .RRSIG.parse(, ) }

func ( *RRSIG) ( *zlexer,  string) *ParseError {
	,  := .Next()
	 := strings.ToUpper(.token)
	if ,  := StringToType[]; ! {
		if strings.HasPrefix(, "TYPE") {
			,  = typeToInt(.token)
			if ! {
				return &ParseError{err: "bad RRSIG Typecovered", lex: }
			}
			.TypeCovered = 
		} else {
			return &ParseError{err: "bad RRSIG Typecovered", lex: }
		}
	} else {
		.TypeCovered = 
	}

	.Next() // zBlank
	, _ = .Next()
	if .err {
		return &ParseError{err: "bad RRSIG Algorithm", lex: }
	}
	,  := strconv.ParseUint(.token, 10, 8)
	.Algorithm = uint8() // if 0 we'll check the mnemonic in the if
	if  != nil {
		,  := StringToAlgorithm[.token]
		if ! {
			return &ParseError{err: "bad RRSIG Algorithm", lex: }
		}
		.Algorithm = 
	}

	.Next() // zBlank
	, _ = .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad RRSIG Labels", lex: }
	}
	.Labels = uint8()

	.Next() // zBlank
	, _ = .Next()
	,  := strconv.ParseUint(.token, 10, 32)
	if  != nil || .err {
		return &ParseError{err: "bad RRSIG OrigTtl", lex: }
	}
	.OrigTtl = uint32()

	.Next() // zBlank
	, _ = .Next()
	if ,  := StringToTime(.token);  != nil {
		// Try to see if all numeric and use it as epoch
		if ,  := strconv.ParseUint(.token, 10, 32);  == nil {
			.Expiration = uint32()
		} else {
			return &ParseError{err: "bad RRSIG Expiration", lex: }
		}
	} else {
		.Expiration = 
	}

	.Next() // zBlank
	, _ = .Next()
	if ,  := StringToTime(.token);  != nil {
		if ,  := strconv.ParseUint(.token, 10, 32);  == nil {
			.Inception = uint32()
		} else {
			return &ParseError{err: "bad RRSIG Inception", lex: }
		}
	} else {
		.Inception = 
	}

	.Next() // zBlank
	, _ = .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad RRSIG KeyTag", lex: }
	}
	.KeyTag = uint16()

	.Next() // zBlank
	, _ = .Next()
	.SignerName = .token
	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad RRSIG SignerName", lex: }
	}
	.SignerName = 

	,  := endingToString(, "bad RRSIG Signature")
	if  != nil {
		return 
	}
	.Signature = 

	return nil
}

func ( *NXT) ( *zlexer,  string) *ParseError { return .NSEC.parse(, ) }

func ( *NSEC) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad NSEC NextDomain", lex: }
	}
	.NextDomain = 

	.TypeBitMap = make([]uint16, 0)
	var (
		  uint16
		 bool
	)
	, _ = .Next()
	for .value != zNewline && .value != zEOF {
		switch .value {
		case zBlank:
			// Ok
		case zString:
			 := strings.ToUpper(.token)
			if ,  = StringToType[]; ! {
				if ,  = typeToInt(.token); ! {
					return &ParseError{err: "bad NSEC TypeBitMap", lex: }
				}
			}
			.TypeBitMap = append(.TypeBitMap, )
		default:
			return &ParseError{err: "bad NSEC TypeBitMap", lex: }
		}
		, _ = .Next()
	}
	return nil
}

func ( *NSEC3) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad NSEC3 Hash", lex: }
	}
	.Hash = uint8()
	.Next() // zBlank
	, _ = .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad NSEC3 Flags", lex: }
	}
	.Flags = uint8()
	.Next() // zBlank
	, _ = .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad NSEC3 Iterations", lex: }
	}
	.Iterations = uint16()
	.Next()
	, _ = .Next()
	if .token == "" || .err {
		return &ParseError{err: "bad NSEC3 Salt", lex: }
	}
	if .token != "-" {
		.SaltLength = uint8(len(.token)) / 2
		.Salt = .token
	}

	.Next()
	, _ = .Next()
	if .token == "" || .err {
		return &ParseError{err: "bad NSEC3 NextDomain", lex: }
	}
	.HashLength = 20 // Fix for NSEC3 (sha1 160 bits)
	.NextDomain = .token

	.TypeBitMap = make([]uint16, 0)
	var (
		  uint16
		 bool
	)
	, _ = .Next()
	for .value != zNewline && .value != zEOF {
		switch .value {
		case zBlank:
			// Ok
		case zString:
			 := strings.ToUpper(.token)
			if ,  = StringToType[]; ! {
				if ,  = typeToInt(.token); ! {
					return &ParseError{err: "bad NSEC3 TypeBitMap", lex: }
				}
			}
			.TypeBitMap = append(.TypeBitMap, )
		default:
			return &ParseError{err: "bad NSEC3 TypeBitMap", lex: }
		}
		, _ = .Next()
	}
	return nil
}

func ( *NSEC3PARAM) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad NSEC3PARAM Hash", lex: }
	}
	.Hash = uint8()
	.Next() // zBlank
	, _ = .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad NSEC3PARAM Flags", lex: }
	}
	.Flags = uint8()
	.Next() // zBlank
	, _ = .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad NSEC3PARAM Iterations", lex: }
	}
	.Iterations = uint16()
	.Next()
	, _ = .Next()
	if .token != "-" {
		.SaltLength = uint8(len(.token) / 2)
		.Salt = .token
	}
	return slurpRemainder()
}

func ( *EUI48) ( *zlexer,  string) *ParseError {
	,  := .Next()
	if len(.token) != 17 || .err {
		return &ParseError{err: "bad EUI48 Address", lex: }
	}
	 := make([]byte, 12)
	 := 0
	for  := 0;  < 10;  += 2 {
		[] = .token[+]
		[+1] = .token[+1+]
		++
		if .token[+1+] != '-' {
			return &ParseError{err: "bad EUI48 Address", lex: }
		}
	}
	[10] = .token[15]
	[11] = .token[16]

	,  := strconv.ParseUint(string(), 16, 48)
	if  != nil {
		return &ParseError{err: "bad EUI48 Address", lex: }
	}
	.Address = 
	return slurpRemainder()
}

func ( *EUI64) ( *zlexer,  string) *ParseError {
	,  := .Next()
	if len(.token) != 23 || .err {
		return &ParseError{err: "bad EUI64 Address", lex: }
	}
	 := make([]byte, 16)
	 := 0
	for  := 0;  < 14;  += 2 {
		[] = .token[+]
		[+1] = .token[+1+]
		++
		if .token[+1+] != '-' {
			return &ParseError{err: "bad EUI64 Address", lex: }
		}
	}
	[14] = .token[21]
	[15] = .token[22]

	,  := strconv.ParseUint(string(), 16, 64)
	if  != nil {
		return &ParseError{err: "bad EUI68 Address", lex: }
	}
	.Address = 
	return slurpRemainder()
}

func ( *SSHFP) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad SSHFP Algorithm", lex: }
	}
	.Algorithm = uint8()
	.Next() // zBlank
	, _ = .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad SSHFP Type", lex: }
	}
	.Type = uint8()
	.Next() // zBlank
	,  := endingToString(, "bad SSHFP Fingerprint")
	if  != nil {
		return 
	}
	.FingerPrint = 
	return nil
}

func ( *DNSKEY) ( *zlexer, ,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad " +  + " Flags", lex: }
	}
	.Flags = uint16()
	.Next()        // zBlank
	, _ = .Next() // zString
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad " +  + " Protocol", lex: }
	}
	.Protocol = uint8()
	.Next()        // zBlank
	, _ = .Next() // zString
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad " +  + " Algorithm", lex: }
	}
	.Algorithm = uint8()
	,  := endingToString(, "bad "++" PublicKey")
	if  != nil {
		return 
	}
	.PublicKey = 
	return nil
}

func ( *DNSKEY) ( *zlexer,  string) *ParseError  { return .parseDNSKEY(, , "DNSKEY") }
func ( *KEY) ( *zlexer,  string) *ParseError     { return .parseDNSKEY(, , "KEY") }
func ( *CDNSKEY) ( *zlexer,  string) *ParseError { return .parseDNSKEY(, , "CDNSKEY") }
func ( *DS) ( *zlexer,  string) *ParseError      { return .parseDS(, , "DS") }
func ( *DLV) ( *zlexer,  string) *ParseError     { return .parseDS(, , "DLV") }
func ( *CDS) ( *zlexer,  string) *ParseError     { return .parseDS(, , "CDS") }

func ( *IPSECKEY) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad IPSECKEY value", lex: }
	}
	.Precedence = uint8()
	.Next() // zBlank

	, _ = .Next()
	,  = strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad IPSECKEY value", lex: }
	}
	.GatewayType = uint8()
	.Next() // zBlank

	, _ = .Next()
	,  = strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad IPSECKEY value", lex: }
	}
	.Algorithm = uint8()
	.Next() // zBlank

	, _ = .Next()
	if .err {
		return &ParseError{err: "bad IPSECKEY gateway", lex: }
	}

	.GatewayAddr, .GatewayHost,  = parseAddrHostUnion(.token, , .GatewayType)
	if  != nil {
		return &ParseError{wrappedErr: fmt.Errorf("IPSECKEY %w", ), lex: }
	}

	.Next() // zBlank

	,  := endingToString(, "bad IPSECKEY PublicKey")
	if  != nil {
		return 
	}
	.PublicKey = 
	return slurpRemainder()
}

func ( *AMTRELAY) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad AMTRELAY value", lex: }
	}
	.Precedence = uint8()
	.Next() // zBlank

	, _ = .Next()
	if .err || !(.token == "0" || .token == "1") {
		return &ParseError{err: "bad discovery value", lex: }
	}
	if .token == "1" {
		.GatewayType = 0x80
	}

	.Next() // zBlank

	, _ = .Next()
	,  = strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad AMTRELAY value", lex: }
	}
	.GatewayType |= uint8()
	.Next() // zBlank

	, _ = .Next()
	if .err {
		return &ParseError{err: "bad AMTRELAY gateway", lex: }
	}

	.GatewayAddr, .GatewayHost,  = parseAddrHostUnion(.token, , .GatewayType&0x7f)
	if  != nil {
		return &ParseError{wrappedErr: fmt.Errorf("AMTRELAY %w", ), lex: }
	}

	return slurpRemainder()
}

// same constants and parsing between IPSECKEY and AMTRELAY
func parseAddrHostUnion(,  string,  uint8) ( net.IP,  string,  error) {
	switch  {
	case IPSECGatewayNone:
		if  != "." {
			return , , errors.New("gateway type none with gateway set")
		}
	case IPSECGatewayIPv4, IPSECGatewayIPv6:
		 = net.ParseIP()
		if  == nil {
			return , , errors.New("gateway IP invalid")
		}
		if (.To4() == nil) == ( == IPSECGatewayIPv4) {
			return , , errors.New("gateway IP family mismatch")
		}
	case IPSECGatewayHost:
		var  bool
		,  = toAbsoluteName(, )
		if ! {
			return , , errors.New("invalid gateway host")
		}
	}

	return , , nil
}

func ( *RKEY) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad RKEY Flags", lex: }
	}
	.Flags = uint16()
	.Next()        // zBlank
	, _ = .Next() // zString
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad RKEY Protocol", lex: }
	}
	.Protocol = uint8()
	.Next()        // zBlank
	, _ = .Next() // zString
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad RKEY Algorithm", lex: }
	}
	.Algorithm = uint8()
	,  := endingToString(, "bad RKEY PublicKey")
	if  != nil {
		return 
	}
	.PublicKey = 
	return nil
}

func ( *EID) ( *zlexer,  string) *ParseError {
	,  := endingToString(, "bad EID Endpoint")
	if  != nil {
		return 
	}
	.Endpoint = 
	return nil
}

func ( *NIMLOC) ( *zlexer,  string) *ParseError {
	,  := endingToString(, "bad NIMLOC Locator")
	if  != nil {
		return 
	}
	.Locator = 
	return nil
}

func ( *GPOS) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseFloat(.token, 64)
	if  != nil || .err {
		return &ParseError{err: "bad GPOS Longitude", lex: }
	}
	.Longitude = .token
	.Next() // zBlank
	, _ = .Next()
	,  := strconv.ParseFloat(.token, 64)
	if  != nil || .err {
		return &ParseError{err: "bad GPOS Latitude", lex: }
	}
	.Latitude = .token
	.Next() // zBlank
	, _ = .Next()
	,  := strconv.ParseFloat(.token, 64)
	if  != nil || .err {
		return &ParseError{err: "bad GPOS Altitude", lex: }
	}
	.Altitude = .token
	return slurpRemainder()
}

func ( *DS) ( *zlexer, ,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad " +  + " KeyTag", lex: }
	}
	.KeyTag = uint16()
	.Next() // zBlank
	, _ = .Next()
	if ,  := strconv.ParseUint(.token, 10, 8);  != nil {
		 := strings.ToUpper(.token)
		,  := StringToAlgorithm[]
		if ! || .err {
			return &ParseError{err: "bad " +  + " Algorithm", lex: }
		}
		.Algorithm = 
	} else {
		.Algorithm = uint8()
	}
	.Next() // zBlank
	, _ = .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad " +  + " DigestType", lex: }
	}
	.DigestType = uint8()
	,  := endingToString(, "bad "++" Digest")
	if  != nil {
		return 
	}
	.Digest = 
	return nil
}

func ( *TA) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad TA KeyTag", lex: }
	}
	.KeyTag = uint16()
	.Next() // zBlank
	, _ = .Next()
	if ,  := strconv.ParseUint(.token, 10, 8);  != nil {
		 := strings.ToUpper(.token)
		,  := StringToAlgorithm[]
		if ! || .err {
			return &ParseError{err: "bad TA Algorithm", lex: }
		}
		.Algorithm = 
	} else {
		.Algorithm = uint8()
	}
	.Next() // zBlank
	, _ = .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad TA DigestType", lex: }
	}
	.DigestType = uint8()
	,  := endingToString(, "bad TA Digest")
	if  != nil {
		return 
	}
	.Digest = 
	return nil
}

func ( *TLSA) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad TLSA Usage", lex: }
	}
	.Usage = uint8()
	.Next() // zBlank
	, _ = .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad TLSA Selector", lex: }
	}
	.Selector = uint8()
	.Next() // zBlank
	, _ = .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad TLSA MatchingType", lex: }
	}
	.MatchingType = uint8()
	// So this needs be e2 (i.e. different than e), because...??t
	,  := endingToString(, "bad TLSA Certificate")
	if  != nil {
		return 
	}
	.Certificate = 
	return nil
}

func ( *SMIMEA) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad SMIMEA Usage", lex: }
	}
	.Usage = uint8()
	.Next() // zBlank
	, _ = .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad SMIMEA Selector", lex: }
	}
	.Selector = uint8()
	.Next() // zBlank
	, _ = .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad SMIMEA MatchingType", lex: }
	}
	.MatchingType = uint8()
	// So this needs be e2 (i.e. different than e), because...??t
	,  := endingToString(, "bad SMIMEA Certificate")
	if  != nil {
		return 
	}
	.Certificate = 
	return nil
}

func ( *RFC3597) ( *zlexer,  string) *ParseError {
	,  := .Next()
	if .token != "\\#" {
		return &ParseError{err: "bad RFC3597 Rdata", lex: }
	}

	.Next() // zBlank
	, _ = .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad RFC3597 Rdata ", lex: }
	}

	,  := endingToString(, "bad RFC3597 Rdata")
	if  != nil {
		return 
	}
	if int()*2 != len() {
		return &ParseError{err: "bad RFC3597 Rdata", lex: }
	}
	.Rdata = 
	return nil
}

func ( *SPF) ( *zlexer,  string) *ParseError {
	,  := endingToTxtSlice(, "bad SPF Txt")
	if  != nil {
		return 
	}
	.Txt = 
	return nil
}

func ( *AVC) ( *zlexer,  string) *ParseError {
	,  := endingToTxtSlice(, "bad AVC Txt")
	if  != nil {
		return 
	}
	.Txt = 
	return nil
}

func ( *TXT) ( *zlexer,  string) *ParseError {
	// no zBlank reading here, because all this rdata is TXT
	,  := endingToTxtSlice(, "bad TXT Txt")
	if  != nil {
		return 
	}
	.Txt = 
	return nil
}

// identical to setTXT
func ( *NINFO) ( *zlexer,  string) *ParseError {
	,  := endingToTxtSlice(, "bad NINFO ZSData")
	if  != nil {
		return 
	}
	.ZSData = 
	return nil
}

// Uses the same format as TXT
func ( *RESINFO) ( *zlexer,  string) *ParseError {
	,  := endingToTxtSlice(, "bad RESINFO Resinfo")
	if  != nil {
		return 
	}
	.Txt = 
	return nil
}

func ( *URI) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad URI Priority", lex: }
	}
	.Priority = uint16()
	.Next() // zBlank
	, _ = .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad URI Weight", lex: }
	}
	.Weight = uint16()

	.Next() // zBlank
	,  := endingToTxtSlice(, "bad URI Target")
	if  != nil {
		return 
	}
	if len() != 1 {
		return &ParseError{err: "bad URI Target", lex: }
	}
	.Target = [0]
	return nil
}

func ( *DHCID) ( *zlexer,  string) *ParseError {
	// awesome record to parse!
	,  := endingToString(, "bad DHCID Digest")
	if  != nil {
		return 
	}
	.Digest = 
	return nil
}

func ( *NID) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad NID Preference", lex: }
	}
	.Preference = uint16()
	.Next()        // zBlank
	, _ = .Next() // zString
	,  := stringToNodeID()
	if  != nil || .err {
		return 
	}
	.NodeID = 
	return slurpRemainder()
}

func ( *L32) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad L32 Preference", lex: }
	}
	.Preference = uint16()
	.Next()        // zBlank
	, _ = .Next() // zString
	.Locator32 = net.ParseIP(.token)
	if .Locator32 == nil || .err {
		return &ParseError{err: "bad L32 Locator", lex: }
	}
	return slurpRemainder()
}

func ( *LP) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad LP Preference", lex: }
	}
	.Preference = uint16()

	.Next()        // zBlank
	, _ = .Next() // zString
	.Fqdn = .token
	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad LP Fqdn", lex: }
	}
	.Fqdn = 
	return slurpRemainder()
}

func ( *L64) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad L64 Preference", lex: }
	}
	.Preference = uint16()
	.Next()        // zBlank
	, _ = .Next() // zString
	,  := stringToNodeID()
	if  != nil || .err {
		return 
	}
	.Locator64 = 
	return slurpRemainder()
}

func ( *UID) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 32)
	if  != nil || .err {
		return &ParseError{err: "bad UID Uid", lex: }
	}
	.Uid = uint32()
	return slurpRemainder()
}

func ( *GID) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 32)
	if  != nil || .err {
		return &ParseError{err: "bad GID Gid", lex: }
	}
	.Gid = uint32()
	return slurpRemainder()
}

func ( *UINFO) ( *zlexer,  string) *ParseError {
	,  := endingToTxtSlice(, "bad UINFO Uinfo")
	if  != nil {
		return 
	}
	if  := len();  == 0 {
		return nil
	}
	.Uinfo = [0] // silently discard anything after the first character-string
	return nil
}

func ( *PX) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 16)
	if  != nil || .err {
		return &ParseError{err: "bad PX Preference", lex: }
	}
	.Preference = uint16()

	.Next()        // zBlank
	, _ = .Next() // zString
	.Map822 = .token
	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad PX Map822", lex: }
	}
	.Map822 = 

	.Next()        // zBlank
	, _ = .Next() // zString
	.Mapx400 = .token
	,  := toAbsoluteName(.token, )
	if .err || ! {
		return &ParseError{err: "bad PX Mapx400", lex: }
	}
	.Mapx400 = 
	return slurpRemainder()
}

func ( *CAA) ( *zlexer,  string) *ParseError {
	,  := .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad CAA Flag", lex: }
	}
	.Flag = uint8()

	.Next()        // zBlank
	, _ = .Next() // zString
	if .value != zString {
		return &ParseError{err: "bad CAA Tag", lex: }
	}
	.Tag = .token

	.Next() // zBlank
	,  := endingToTxtSlice(, "bad CAA Value")
	if  != nil {
		return 
	}
	if len() != 1 {
		return &ParseError{err: "bad CAA Value", lex: }
	}
	.Value = [0]
	return nil
}

func ( *TKEY) ( *zlexer,  string) *ParseError {
	,  := .Next()

	// Algorithm
	if .value != zString {
		return &ParseError{err: "bad TKEY algorithm", lex: }
	}
	.Algorithm = .token
	.Next() // zBlank

	// Get the key length and key values
	, _ = .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad TKEY key length", lex: }
	}
	.KeySize = uint16()
	.Next() // zBlank
	, _ = .Next()
	if .value != zString {
		return &ParseError{err: "bad TKEY key", lex: }
	}
	.Key = .token
	.Next() // zBlank

	// Get the otherdata length and string data
	, _ = .Next()
	,  := strconv.ParseUint(.token, 10, 8)
	if  != nil || .err {
		return &ParseError{err: "bad TKEY otherdata length", lex: }
	}
	.OtherLen = uint16()
	.Next() // zBlank
	, _ = .Next()
	if .value != zString {
		return &ParseError{err: "bad TKEY otherday", lex: }
	}
	.OtherData = .token
	return nil
}

func ( *APL) ( *zlexer,  string) *ParseError {
	var  []APLPrefix

	for {
		,  := .Next()
		if .value == zNewline || .value == zEOF {
			break
		}
		if .value == zBlank &&  != nil {
			continue
		}
		if .value != zString {
			return &ParseError{err: "unexpected APL field", lex: }
		}

		// Expected format: [!]afi:address/prefix

		 := strings.IndexByte(.token, ':')
		if  == -1 {
			return &ParseError{err: "missing colon in APL field", lex: }
		}

		,  := .token[:], .token[+1:]

		var  bool
		if  != "" && [0] == '!' {
			 = true
			 = [1:]
		}

		,  := strconv.ParseUint(, 10, 16)
		if  != nil {
			return &ParseError{wrappedErr: fmt.Errorf("failed to parse APL family: %w", ), lex: }
		}
		var  int
		switch  {
		case 1:
			 = net.IPv4len
		case 2:
			 = net.IPv6len
		default:
			return &ParseError{err: "unrecognized APL family", lex: }
		}

		, ,  := net.ParseCIDR()
		if  != nil {
			return &ParseError{wrappedErr: fmt.Errorf("failed to parse APL address: %w", ), lex: }
		}
		if !.Equal(.IP) {
			return &ParseError{err: "extra bits in APL address", lex: }
		}

		if len(.IP) !=  {
			return &ParseError{err: "address mismatch with the APL family", lex: }
		}

		 = append(, APLPrefix{
			Negation: ,
			Network:  *,
		})
	}

	.Prefixes = 
	return nil
}

// escapedStringOffset finds the offset within a string (which may contain escape
// sequences) that corresponds to a certain byte offset. If the input offset is
// out of bounds, -1 is returned (which is *not* considered an error).
func escapedStringOffset( string,  int) (int, bool) {
	if  == 0 {
		return 0, true
	}

	,  := 0, 0

	for  < len() {
		 += 1

		// Skip escape sequences
		if [] != '\\' {
			// Single plain byte, not an escape sequence.
			++
		} else if isDDD([+1:]) {
			// Skip backslash and DDD.
			 += 4
		} else if len([+1:]) < 1 {
			// No character following the backslash; that's an error.
			return 0, false
		} else {
			// Skip backslash and following byte.
			 += 2
		}

		if  >=  {
			return , true
		}
	}

	return -1, true
}