err = json.Unmarshal(data, &state)
if err != nil {
return nil, "", fmt.Errorf("decode pending import names: %w", err)
err = json.Unmarshal(data, &state)
if err != nil {
return nil, "", fmt.Errorf("decode pending import names: %w", err)
plan.added, err = rebuildMerge(nil, plan.added)
if err != nil {
return plan, fmt.Errorf("order import batches: %w", err)
plan.added, err = rebuildMerge(nil, plan.added)
if err != nil {
return plan, fmt.Errorf("order import batches: %w", err)
for _, entry := range archive.File {
if filepath.Base(entry.Name) == "_chat.txt" && !entry.FileInfo().IsDir() {
if file != nil {
for _, entry := range archive.File {
if filepath.Base(entry.Name) == "_chat.txt" && !entry.FileInfo().IsDir() {
if file != nil {
scanner := bufio.NewScanner(io.LimitReader(reader, whatsappImportBytes+1))
scanner.Buffer(make([]byte, 64*1024), buildLineBytes)
scanner := bufio.NewScanner(io.LimitReader(reader, whatsappImportBytes+1))
scanner.Buffer(make([]byte, 64*1024), buildLineBytes)
for scanner.Scan() {
line := strings.ReplaceAll(scanner.Text(), "\u200e", "")
match := whatsappImportStart.FindStringSubmatch(line)
for scanner.Scan() {
line := strings.ReplaceAll(scanner.Text(), "\u200e", "")
match := whatsappImportStart.FindStringSubmatch(line)