From a0af71d2e8dfb219fe9075ccae50c62c67079b47 Mon Sep 17 00:00:00 2001 From: "Benedicto Franco Jr." Date: Fri, 6 Nov 2026 18:47:55 -0800 Subject: [PATCH 1/2] pxf: DatasetReader ends a table only at the end of input or a directive (#164) A row cut short, an unterminated string, or anything else where a row could begin ended the row sequence cleanly, so an interrupted append read as a shorter, complete dataset. The reader now finds each row's end with the lexer Parse uses, as protowire-go's does: a row ends at its `)`, the sequence at a directive or the end of the input, and anything else is the error Parse reports for the same input, at its position. Also as protowire-go does: - the bytes held while a row's end is sought are capped at max_message_size; - Scan binds a row under the default max_message_size, since the body it binds repeats the column names and is wider than the row; - the header is found with the lexer too, stepping over @proto bodies, and a broken header is refused with Parse's error rather than "no @dataset directive in stream" or the byte scanner's own text. The byte scanner is gone. A token is taken as complete once the source has ended or four bytes follow it, since the lexer looks at most one byte past a token. The row fast path parses on the buffer and stops at the `)`, dropping comments before the `(`, which makes streaming a 300,000-row table about 15% faster than before. testdata/dataset-stream/go_sweep.tsv is protowire-go v1.16.1's result on 590 inputs (tools/dataset_stream_sweep): the spec fixtures, cut and broken rows and headers, the cap, Scan's limit, and the 4096-byte read boundary at every offset in 14 row shapes. cpp matches all 590; the reader before this change missed 219 of the first 576. The corpus test now reads the dataset fixtures through the reader alone and requires the error text Parse gives. --- CHANGELOG.md | 4 + include/protowire/pxf/dataset_reader.h | 41 +- src/pxf/dataset_reader.cc | 542 +++++++++++------------ src/pxf/parser.cc | 64 ++- src/pxf/parser_internal.h | 26 +- test/pxf_corpus_test.cc | 19 +- test/pxf_dataset_reader_test.cc | 73 +++ testdata/dataset-stream/go_sweep.tsv | 590 +++++++++++++++++++++++++ tools/dataset_stream_sweep/go.mod | 8 + tools/dataset_stream_sweep/main.go | 172 +++++++ 10 files changed, 1199 insertions(+), 340 deletions(-) create mode 100644 testdata/dataset-stream/go_sweep.tsv create mode 100644 tools/dataset_stream_sweep/go.mod create mode 100644 tools/dataset_stream_sweep/main.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 96183dc..328709d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,10 @@ number says nothing about any other port. See the Releases section of - **`DatasetReader` reads a row under the caller's `max_bytes_literal_length`** (#160), as protowire-go does. A row's cells were parsed under the default `kMaxBytesLiteralLength` whatever the options said. A caller who lowered the limit still got a row whose `b"…"` cell was past it, and a caller who raised it had that cell refused. `0` still means the default. Only the nesting depth used to reach the row parser. The header (a `@header` block and the `@dataset` line) was parsed under the defaults for both limits. It is now parsed under the caller's `max_nesting_depth` and `max_bytes_literal_length`, so `Create` refuses such a header as protowire-go's `NewDatasetReader` does, with the same text and position. - **`DatasetReader` positions count from the start of the stream** (#161), as protowire-go's do. A row's `pos`, its cells' positions and the line and column of an error from `Next` or `Scan` counted from the start of that row, so every row was at `1:1`. A refused row in a long stream now names its own line. `pxf::Lexer` gains a constructor that starts at a given `Position`, which the reader uses for each row. +- **A `@dataset` row cut short no longer reads as the end of the table** (#164), as protowire-go's streaming reader does. `DatasetReader::Next` and `Scan` ended the table cleanly at a row whose `)` never came, at an unterminated string, or at anything else where a row could begin. So an interrupted append read as a shorter, complete dataset, and the rows after a broken one were dropped. The rows now end only at the end of the input or at the next directive. Anything else is an error, and it is the error `Parse` reports for the same input, at the same position. This narrows what streams: the spec's `truncated-row-eof`, `truncated-row-then-rows` and `junk-between-rows` fixtures are now refused through the reader as well as by `Parse`. At the end of the input the reader consumes what is left, so `Tail()` is empty there. +- **`DatasetReader` caps the bytes it holds while looking for a row's end at `max_message_size`** (#164), as protowire-go does: `dataset input holds N bytes without a row boundary, MaxMessageSize=M`. A row that never closed was buffered whole, whatever the limit. +- **`DatasetReader::Scan` binds a row under the default `max_message_size`** (#164), as protowire-go does. The body a row is bound as repeats the column names, so it is wider than the row, and a row whose bytes fit the caller's limit could still be refused when bound. The row's bytes are still capped as they are read. The other limits apply as before. +- **A broken `@dataset` header is refused with the error `Parse` gives** (#164), as protowire-go does. `Create` said `no @dataset directive in stream` for a header cut short, and gave its own text for an unterminated string in it. The reader now finds the header's and each row's end with the lexer `Parse` uses rather than a byte scanner of its own. Streaming is about 15% faster on a 300,000-row table. ## [2.0.0] — 2026-11-05 diff --git a/include/protowire/pxf/dataset_reader.h b/include/protowire/pxf/dataset_reader.h index 3d24355..2642559 100644 --- a/include/protowire/pxf/dataset_reader.h +++ b/include/protowire/pxf/dataset_reader.h @@ -14,9 +14,9 @@ // Per draft §3.4.4: streaming consumers MUST enforce per-row arity and // the v1 cell-grammar rule on each row as it is consumed (not deferred // to end-of-input) and MUST yield rows in source order. Both invariants -// fall out of this implementation: the byte-level row scanner produces -// one (...) slice at a time, and the same `Parse()` used by the -// materializing path validates it. +// fall out of this implementation: the row scanner, which reads with +// the lexer `Parse()` uses, produces one (...) slice at a time, and the +// row parser the materializing path uses validates it. // // Convenience: `Scan(msg)` reads the next row and binds its cells to // `msg`'s fields by column name; `BindRow` is exported for callers that @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -65,9 +66,13 @@ class DatasetReader { // stream") or on a parse / I/O error. static StatusOr> Create(std::istream* src); - // Create under options: Scan binds rows with them, so a cell holding an - // Any block needs opts.type_resolver, and opts.skip_validate turns off - // Scan's schema check. + // Create under options. The bytes held while a row's end is sought are + // capped at opts.max_message_size, and the header and every row are + // parsed under its nesting and bytes-literal limits. Scan binds rows with + // the options, but under the default max_message_size, since a row's body + // repeats the column names. So a cell holding an Any block needs + // opts.type_resolver, and opts.skip_validate turns off Scan's schema + // check. static StatusOr> Create(std::istream* src, UnmarshalOptions opts); // Row message type declared by the @dataset header (e.g. "trades.v1.Trade"). @@ -83,8 +88,12 @@ class DatasetReader { // Reads the next row into `*out`. Returns OK on success; returns OK // and sets `done_` when the row sequence is exhausted (callers check - // `Done()` to distinguish "got a row" from "EOF"). Returns a non-OK - // Status on parse / I/O error. + // `Done()` to distinguish "got a row" from "EOF"): at the end of the + // input, or before the next directive (read it via Tail). Anything else + // that is not a well-formed row, a row cut short at the end of the input + // included, is an error, and it is the error Parse reports for the same + // input, at the same position. So is a read failure, and holding more + // than the options' max_message_size bytes while seeking a row's end. // // After EOF or error, all subsequent calls return the same sticky // result. @@ -114,8 +123,19 @@ class DatasetReader { private: DatasetReader() = default; + // What ScanRow or ScanHeader found; see dataset_reader.cc. + enum class RowScan { kNeedMore, kRow, kBad, kEnd, kNotRow }; + Status ReadHeader(); Status Pull(size_t n); + Status Fail(Status st); + int MaxBytesLiteral() const; + StatusOr ParseRow(int start, int end, int* end_offset = nullptr) const; + std::optional TryWholeRow(); + Status RowError(int start) const; + RowScan ScanRow(int* start, int* end); + RowScan ScanHeader(int* end) const; + bool Complete(int tok_end) const; std::istream* src_ = nullptr; Position PosAt(size_t i) const; @@ -123,6 +143,11 @@ class DatasetReader { std::string pending_; // bytes pulled from src_ but not yet consumed Position base_; // where pending_[0] is in the stream + // The row scan resumes where the last read left it: scan_pos_ is the + // first token not known to be complete, row_start_ the open row's `(` + // or -1 between rows. Both index pending_. + int scan_pos_ = 0; + int row_start_ = -1; bool src_eof_ = false; bool finished_ = false; Status err_; diff --git a/src/pxf/dataset_reader.cc b/src/pxf/dataset_reader.cc index 455717e..345307c 100644 --- a/src/pxf/dataset_reader.cc +++ b/src/pxf/dataset_reader.cc @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -15,6 +16,7 @@ #include "protowire/limits.h" #include "protowire/pxf.h" // Unmarshal, UnmarshalOptions #include "protowire/pxf/format.h" +#include "protowire/pxf/lexer.h" #include "protowire/pxf/parser.h" namespace protowire::pxf { @@ -26,254 +28,6 @@ namespace { // row sizes and the Go reference's streamPullSize. constexpr size_t kStreamPullSize = 4096; -bool IsIdentPart(char c) { - return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_'; -} - -// SkipResult is the byte offset past a string / bytes literal / comment -// starting at `i`. Returned value semantics mirror the Go reference's -// skipStringOrComment: -// - returns `i` unchanged if the byte at `i` is not an opener -// - returns -1 if the construct is incomplete (caller pulls more) -// - sets `*err` to non-OK for malformed constructs that can't be -// fixed by more bytes (unterminated single-line string already -// containing a newline) -// -// Strings, triple-quoted strings, bytes literals (`b"..."`), `#` -// line comments, `//` line comments, and `/* ... */` block comments -// are all handled. -int SkipStringOrComment(std::string_view input, int i, Status* err); - -int SkipSimpleString(std::string_view input, int i, Status* err) { - int j = i + 1; - while (j < static_cast(input.size())) { - char c = input[j]; - if (c == '\\') { - if (j + 1 >= static_cast(input.size())) return -1; - j += 2; - continue; - } - if (c == '"') return j + 1; - if (c == '\n') { - *err = Status::Error("pxf: unterminated string literal"); - return 0; - } - ++j; - } - return -1; -} - -int SkipTripleString(std::string_view input, int i) { - int j = i + 3; - int n = static_cast(input.size()); - while (j + 2 < n) { - if (input[j] == '"' && input[j + 1] == '"' && input[j + 2] == '"') return j + 3; - ++j; - } - return -1; -} - -int SkipBytesLiteral(std::string_view input, int i, Status* err) { - int j = i + 2; // past `b"` - int n = static_cast(input.size()); - while (j < n) { - char c = input[j]; - if (c == '"') return j + 1; - if (c == '\n') { - *err = Status::Error("pxf: unterminated bytes literal"); - return 0; - } - ++j; - } - return -1; -} - -int SkipLineComment(std::string_view input, int from) { - int j = from; - int n = static_cast(input.size()); - while (j < n && input[j] != '\n') ++j; - return j; -} - -int SkipBlockComment(std::string_view input, int from) { - int j = from; - int n = static_cast(input.size()); - while (j + 1 < n) { - if (input[j] == '*' && input[j + 1] == '/') return j + 2; - ++j; - } - return -1; -} - -int SkipStringOrComment(std::string_view input, int i, Status* err) { - int n = static_cast(input.size()); - if (i >= n) return i; - char c = input[i]; - if (c == '"') { - if (i + 2 < n && input[i + 1] == '"' && input[i + 2] == '"') { - return SkipTripleString(input, i); - } - return SkipSimpleString(input, i, err); - } - if (c == 'b' && i + 1 < n && input[i + 1] == '"') { - return SkipBytesLiteral(input, i, err); - } - if (c == '#') return SkipLineComment(input, i + 1); - if (c == '/' && i + 1 < n && input[i + 1] == '/') return SkipLineComment(input, i + 2); - if (c == '/' && i + 1 < n && input[i + 1] == '*') return SkipBlockComment(input, i + 2); - return i; -} - -// Returns (offset, found, err). On error, `*err` is set non-OK. -int FindAtTable(std::string_view input, bool* found, Status* err) { - *found = false; - int i = 0; - int n = static_cast(input.size()); - static constexpr std::string_view kAtDataset = "@dataset"; - while (i < n) { - int j = SkipStringOrComment(input, i, err); - if (!err->ok()) return 0; - if (j == -1) return 0; // incomplete — pull more - if (j != i) { - i = j; - continue; - } - if (input[i] == '@' && i + static_cast(kAtDataset.size()) <= n && - input.substr(i, kAtDataset.size()) == kAtDataset) { - int after = i + static_cast(kAtDataset.size()); - if (after == n) return 0; // could be `@dataset` + more bytes — conservative - if (!IsIdentPart(input[after])) { - *found = true; - return i; - } - } - ++i; - } - return 0; -} - -int FindNextChar(std::string_view input, int start_from, char ch, bool* found, Status* err) { - *found = false; - int i = start_from; - int n = static_cast(input.size()); - while (i < n) { - int j = SkipStringOrComment(input, i, err); - if (!err->ok()) return 0; - if (j == -1) return 0; - if (j != i) { - i = j; - continue; - } - if (input[i] == ch) { - *found = true; - return i; - } - ++i; - } - return 0; -} - -// FindMatchingParenSafe returns the index of the `)` matching the `(` -// at `open_idx`. Sets `*found` to true on success; on incomplete -// input, returns 0 with `*found=false` and `*err` OK; on malformed -// string / comment inside, sets `*err` non-OK. -int FindMatchingParenSafe(std::string_view input, int open_idx, bool* found, Status* err) { - *found = false; - int depth = 1; - int i = open_idx + 1; - int n = static_cast(input.size()); - while (i < n) { - int j = SkipStringOrComment(input, i, err); - if (!err->ok()) return 0; - if (j == -1) return 0; - if (j != i) { - i = j; - continue; - } - char c = input[i]; - if (c == '(') { - ++depth; - ++i; - } else if (c == ')') { - --depth; - if (depth == 0) { - *found = true; - return i; - } - ++i; - } else { - ++i; - } - } - return 0; -} - -// Locates the closing `)` of the first complete `@dataset TYPE ( cols )` -// header in `input`. Returns the index of that `)`; `*found` is false -// when more bytes are needed. -int ScanHeaderEnd(std::string_view input, bool* found, Status* err) { - *found = false; - bool ok = false; - int at_idx = FindAtTable(input, &ok, err); - if (!err->ok()) return 0; - if (!ok) return 0; - bool lp_ok = false; - int lparen = FindNextChar( - input, at_idx + static_cast(std::string_view("@dataset").size()), '(', &lp_ok, err); - if (!err->ok()) return 0; - if (!lp_ok) return 0; - bool rp_ok = false; - int end = FindMatchingParenSafe(input, lparen, &rp_ok, err); - if (!err->ok()) return 0; - if (!rp_ok) return 0; - *found = true; - return end; -} - -// FindNextRow locates the next `( ... )` row in `input`, skipping -// leading whitespace + comments. Sets *found true when a complete row -// is in the buffer; returns inclusive [start, end] bounds via *out_start -// / *out_end. Sets *out_done true when the next significant byte isn't -// `(` — i.e. the row sequence is over. -void FindNextRow(std::string_view input, - bool* found, - bool* out_done, - int* out_start, - int* out_end, - Status* err) { - *found = false; - *out_done = false; - int i = 0; - int n = static_cast(input.size()); - while (i < n) { - char c = input[i]; - if (c == ' ' || c == '\t' || c == '\r' || c == '\n') { - ++i; - continue; - } - int j = SkipStringOrComment(input, i, err); - if (!err->ok()) return; - if (j == -1) return; - if (j != i) { - i = j; - continue; - } - break; - } - if (i >= n) return; - if (input[i] != '(') { - *out_done = true; - return; - } - bool ok = false; - int end = FindMatchingParenSafe(input, i, &ok, err); - if (!err->ok()) return; - if (!ok) return; - *found = true; - *out_start = i; - *out_end = end; -} - // ---- BindRow helpers ------------------------------------------------------ // BodyNode is one level of the block tree a dotted row body is written @@ -450,7 +204,7 @@ StatusOr> DatasetReader::Create(std::istream* src if (src == nullptr) return Status::Error("pxf: DatasetReader: null istream"); auto tr = std::unique_ptr(new DatasetReader()); tr->src_ = src; - tr->opts_ = opts; + tr->opts_ = std::move(opts); if (Status s = tr->ReadHeader(); !s.ok()) return s; return tr; } @@ -458,48 +212,49 @@ StatusOr> DatasetReader::Create(std::istream* src Status DatasetReader::Next(DatasetRow* out) { if (!err_.ok()) return err_; if (finished_) return Status::OK(); + if (row_start_ < 0) { + if (auto row = TryWholeRow(); row.has_value()) { + *out = std::move(*row); + return Status::OK(); + } + } for (;;) { - bool found = false; - bool done = false; int start = 0; int end = 0; - Status scan_err; - FindNextRow(pending_, &found, &done, &start, &end, &scan_err); - if (!scan_err.ok()) { - err_ = scan_err; - return err_; - } - if (found) { - std::string_view row_bytes(pending_.data() + start, end - start + 1); - auto parsed = - ParseDatasetRow(row_bytes, - static_cast(columns_.size()), - opts_.max_nesting_depth > 0 ? opts_.max_nesting_depth : kMaxNestingDepth, - opts_.max_bytes_literal_length > 0 ? opts_.max_bytes_literal_length - : kMaxBytesLiteralLength, - PosAt(static_cast(start))); - // Advance past the consumed bytes whether parse succeeded or not - // — on failure we don't want to retry the same bad row forever. - Consume(static_cast(end) + 1); - if (!parsed.ok()) { - err_ = parsed.status(); - return err_; + switch (ScanRow(&start, &end)) { + case RowScan::kRow: { + auto parsed = ParseRow(start, end); + Consume(static_cast(end)); + if (!parsed.ok()) return Fail(parsed.status()); + *out = std::move(parsed).consume(); + return Status::OK(); } - *out = std::move(parsed).consume(); - return Status::OK(); - } - if (done) { - finished_ = true; - return Status::OK(); + case RowScan::kBad: + // Parse the rest of the buffer, not just through the token that + // stopped the scan: the lexer may reject a token before its end (an + // oversized bytes literal), and cut there it would read as + // unterminated instead. + return Fail(RowError(start)); + case RowScan::kEnd: + // The directive and what precedes it stay buffered, for Tail. + finished_ = true; + return Status::OK(); + case RowScan::kNotRow: { + const Position at = PosAt(static_cast(start)); + return Fail(Status::Error(at.line, at.column, kDatasetBesideEntries)); + } + case RowScan::kNeedMore: + break; } + // At the end of the source only spaces and comments may remain; anything + // else is a row cut short. if (src_eof_) { + if (start >= 0) return Fail(RowError(start)); + Consume(pending_.size()); finished_ = true; return Status::OK(); } - if (Status s = Pull(kStreamPullSize); !s.ok()) { - err_ = s; - return err_; - } + if (Status s = Pull(kStreamPullSize); !s.ok()) return Fail(s); } } @@ -525,8 +280,13 @@ Status DatasetReader::Scan(google::protobuf::Message* msg) { } checked_type_ = desc; } + // The caller's limits but max_message_size, which is left at its default, + // as protowire-go binds a row: the row's bytes were capped as they were + // read, and the body it stands for repeats the column names, so it is + // wider than the row. UnmarshalOptions opts = opts_; opts.skip_validate = true; + opts.max_message_size = 0; return BindCheckedRow(msg, columns_, row, opts); } @@ -555,10 +315,118 @@ Position DatasetReader::PosAt(size_t i) const { return p; } -// Consume drops the first n pending bytes, moving base_ past them. +// Consume drops the first n pending bytes, moving base_ and the scan's +// offsets past them. void DatasetReader::Consume(size_t n) { base_ = PosAt(n); pending_.erase(0, n); + const int k = static_cast(n); + scan_pos_ = std::max(scan_pos_ - k, 0); + if (row_start_ >= 0) row_start_ = row_start_ >= k ? row_start_ - k : -1; +} + +Status DatasetReader::Fail(Status st) { + err_ = std::move(st); + return err_; +} + +int DatasetReader::MaxBytesLiteral() const { + return opts_.max_bytes_literal_length > 0 ? opts_.max_bytes_literal_length + : kMaxBytesLiteralLength; +} + +// ParseRow parses pending_ from `start` as one row, with the parser Parse +// uses, at its stream position. `end` bounds the bytes it may read. +StatusOr DatasetReader::ParseRow(int start, int end, int* end_offset) const { + return ParseDatasetRow(std::string_view(pending_).substr(start, end - start), + static_cast(columns_.size()), + opts_.max_nesting_depth > 0 ? opts_.max_nesting_depth : kMaxNestingDepth, + MaxBytesLiteral(), + PosAt(static_cast(start)), + end_offset); +} + +// TryWholeRow is the fast path for a row already in the buffer: the row +// parser runs on the buffer directly, so the row is lexed once. If it +// parses a complete row, every token in it ended before its `)`, so it is +// the row Parse reads, and it is consumed. Anything else (a row cut by a +// read, a malformed row, no row) returns nothing, and ScanRow finds the +// boundary. Called only between rows. +std::optional DatasetReader::TryWholeRow() { + int end_offset = 0; + auto row = ParseRow(scan_pos_, static_cast(pending_.size()), &end_offset); + if (!row.ok()) return std::nullopt; + Consume(static_cast(end_offset - base_.offset)); + return std::move(row).consume(); +} + +// RowError is the error Parse reports for the row starting at pending_[start], +// which the scan found cannot close well. Every token before the one that +// stopped the scan is the same as Parse sees, so the row parser fails where +// Parse fails on the whole document. +Status DatasetReader::RowError(int start) const { + auto row = ParseRow(start, static_cast(pending_.size())); + if (!row.ok()) return row.status(); + // Unreachable: the bytes hold no `)` that closes the row. + return Status::Error("pxf: DatasetReader: row at offset " + std::to_string(start) + + " neither closes nor fails"); +} + +// ScanRow finds the next row with the lexer Parse uses, resuming at +// scan_pos_, so a complete token is not lexed again on the next read. +// Between rows it skips newlines and comments: `(` starts a row, a directive +// ends the sequence, and anything else is not a row. Inside a row it stops +// at the `)` that closes it, or at a `(` (no value holds one) or a token the +// lexer rejects, which make the row bad. Returns kNeedMore with *start the +// open row's `(`, or -1 between rows, when the buffer ends first. +DatasetReader::RowScan DatasetReader::ScanRow(int* start, int* end) { + Lexer lx(std::string_view(pending_).substr(scan_pos_), Position{1, 1, scan_pos_}); + lx.SetMaxBytesLiteral(MaxBytesLiteral()); + for (;;) { + const Token tok = lx.Next(); + const int tok_end = lx.CurrentPos().offset; + if (tok.kind == TokenKind::kEOF || !Complete(tok_end)) { + *start = row_start_; + return RowScan::kNeedMore; + } + const int at = tok.pos.offset; + if (tok.kind == TokenKind::kNewline || tok.kind == TokenKind::kComment) { + scan_pos_ = tok_end; + continue; + } + if (row_start_ < 0) { + switch (tok.kind) { + case TokenKind::kLParen: + row_start_ = at; + scan_pos_ = tok_end; + continue; + case TokenKind::kAtType: + case TokenKind::kAtDirective: + case TokenKind::kAtDataset: + case TokenKind::kAtProto: + *start = at; + return RowScan::kEnd; + default: + *start = at; + return RowScan::kNotRow; + } + } + switch (tok.kind) { + case TokenKind::kRParen: + *start = row_start_; + *end = tok_end; + row_start_ = -1; + scan_pos_ = tok_end; + return RowScan::kRow; + case TokenKind::kLParen: + case TokenKind::kIllegal: + *start = row_start_; + *end = tok_end; + return RowScan::kBad; + default: + scan_pos_ = tok_end; + } + } } Status DatasetReader::Pull(size_t n) { @@ -566,7 +434,16 @@ Status DatasetReader::Pull(size_t n) { std::string buf(n, '\0'); src_->read(buf.data(), static_cast(n)); std::streamsize got = src_->gcount(); - if (got > 0) pending_.append(buf.data(), static_cast(got)); + if (got > 0) { + pending_.append(buf.data(), static_cast(got)); + // A stream that never ends a row cannot grow the buffer without bound. + const int max_size = opts_.max_message_size > 0 ? opts_.max_message_size : kMaxMessageSize; + if (pending_.size() > static_cast(max_size)) { + return Status::Error( + "dataset input holds " + std::to_string(pending_.size()) + + " bytes without a row boundary, MaxMessageSize=" + std::to_string(max_size)); + } + } if (src_->eof()) { src_eof_ = true; return Status::OK(); @@ -577,19 +454,87 @@ Status DatasetReader::Pull(size_t n) { return Status::OK(); } +// Complete reports whether a token ending at pending_[tok_end] is known +// complete: the source has ended, or a few bytes follow it. The lexer looks +// at most one byte past a token to end it (the `.` of `1.5`, the `p` of a +// precision, the second byte of `µs`), so bytes that arrive later cannot +// change it. +bool DatasetReader::Complete(int tok_end) const { + constexpr int kLookahead = 4; + return src_eof_ || tok_end + kLookahead <= static_cast(pending_.size()); +} + +// ScanHeader finds the end of the first `@dataset TYPE ( cols )` header with +// the lexer Parse uses: the offset just past the `)` that closes the column +// list, the first `)` after an @dataset token. An @proto body is raw +// protobuf source, which Parse skips by matching its braces, so the scan +// does too. Returns kNeedMore when the buffer ends first, and kBad at a +// token the lexer rejects or an @proto body that can never close. +DatasetReader::RowScan DatasetReader::ScanHeader(int* end) const { + Lexer lx(pending_); + lx.SetMaxBytesLiteral(MaxBytesLiteral()); + bool in_dataset = false; + int proto = 0; // 1 after @proto, 2 after its type name + for (;;) { + const Token tok = lx.Next(); + const int tok_end = lx.CurrentPos().offset; + if (tok.kind == TokenKind::kEOF || !Complete(tok_end)) return RowScan::kNeedMore; + switch (tok.kind) { + case TokenKind::kIllegal: + return RowScan::kBad; + case TokenKind::kNewline: + case TokenKind::kComment: + // Parse skips these between @proto, its name and `{`. + continue; + default: + break; + } + if (in_dataset) { + if (tok.kind == TokenKind::kRParen) { + *end = tok_end; + return RowScan::kRow; + } + continue; + } + if (tok.kind == TokenKind::kAtDataset) { + in_dataset = true; + proto = 0; + } else if (tok.kind == TokenKind::kAtProto) { + proto = 1; + } else if (tok.kind == TokenKind::kIdent && proto == 1) { + proto = 2; + } else if (tok.kind == TokenKind::kLBrace && proto > 0) { + bool failed = false; + const int close = FindMatchingBrace(pending_, tok.pos.offset, &failed); + if (failed) return RowScan::kBad; + if (close < 0) return RowScan::kNeedMore; + lx.RepositionTo(close + 1); + proto = 0; + } else { + proto = 0; + } + } +} + Status DatasetReader::ReadHeader() { + // The header is parsed under the caller's limits, as the rows are and as + // protowire-go parses both (#160). + ParseOptions popts; + popts.max_nesting_depth = opts_.max_nesting_depth; + popts.max_bytes_literal_length = opts_.max_bytes_literal_length; for (;;) { - bool found = false; - Status scan_err; - int header_end = ScanHeaderEnd(pending_, &found, &scan_err); - if (!scan_err.ok()) return scan_err; - if (found) { - std::string_view header(pending_.data(), static_cast(header_end) + 1); - // The header is parsed under the caller's limits, as the rows are and - // as protowire-go parses both (#160). - ParseOptions popts; - popts.max_nesting_depth = opts_.max_nesting_depth; - popts.max_bytes_literal_length = opts_.max_bytes_literal_length; + int header_end = 0; + const RowScan scan = ScanHeader(&header_end); + if (scan == RowScan::kBad) { + // Every token before the one the scan stopped at is complete, so + // Parse fails at or before it. + auto doc = Parse(pending_, popts); + if (!doc.ok()) return doc.status(); + // Unreachable: Parse reads what the scan read. + return Status::Error("pxf: DatasetReader: the @dataset header neither ends nor fails"); + } + if (scan == RowScan::kRow) { + std::string_view header(pending_.data(), static_cast(header_end)); auto doc = Parse(header, popts); if (!doc.ok()) return doc.status(); if (doc->datasets.empty()) { @@ -598,10 +543,15 @@ Status DatasetReader::ReadHeader() { type_ = std::move(doc->datasets[0].type); columns_ = std::move(doc->datasets[0].columns); directives_ = std::move(doc->directives); - Consume(static_cast(header_end) + 1); + Consume(static_cast(header_end)); return Status::OK(); } if (src_eof_) { + // The input ended without a complete header. A malformed document (a + // header cut short, a literal that never closes) reports what Parse + // reports for it; only a well-formed one has no dataset. + auto doc = Parse(pending_, popts); + if (!doc.ok()) return doc.status(); return Status::Error("pxf: no @dataset directive in stream"); } if (static_cast(pending_.size()) >= kDefaultHeaderMaxBytes) { diff --git a/src/pxf/parser.cc b/src/pxf/parser.cc index 6277e20..5236305 100644 --- a/src/pxf/parser.cc +++ b/src/pxf/parser.cc @@ -49,6 +49,19 @@ class Parser { Advance(); } + // A parser that reads no comments before its first token. + struct DropLeadingCommentsTag {}; + Parser(DropLeadingCommentsTag, + std::string_view input, + int max_depth, + int max_bytes_literal, + Position start) + : lex_(input, start), max_depth_(max_depth), drop_comments_(true) { + lex_.SetMaxBytesLiteral(max_bytes_literal); + Advance(); + drop_comments_ = false; + } + struct TolerantTag {}; Parser(TolerantTag, std::string_view input, int max_depth, int max_bytes_literal) : lex_(input), max_depth_(max_depth), tolerant_(true) { @@ -66,9 +79,10 @@ class Parser { *current = current_; } + const Token& current() const { return current_; } StatusOr ParseDocument(); StatusOr ParseTableDirective(int* end_offset); - StatusOr ParseTableRow(int expected, int* end_offset); + StatusOr ParseTableRow(int expected, int* end_offset, bool read_past = true); std::vector TakeErrors() { std::stable_sort(errs_.begin(), errs_.end(), [](const Error& a, const Error& b) { @@ -153,6 +167,9 @@ class Parser { int max_depth_ = kMaxNestingDepth; bool for_decoder_ = false; bool tolerant_ = false; + // Advance skips comments without keeping them, for a caller that reads + // none: DatasetReader's row parse, before the row's `(`. + bool drop_comments_ = false; std::vector errs_; Position err_pos_; // Just past the last significant token consumed: where a missing value @@ -160,18 +177,13 @@ class Parser { Position prev_end_; }; -// FindMatchingBrace returns the offset of the `}` matching the `{` at -// open_offset, or -1 if there is none. Mirrors protowire-go's braceMatch, so -// braces inside literals and comments don't count. -int FindMatchingBrace(std::string_view input, int open_offset); - void Parser::Advance() { prev_end_ = lex_.CurrentPos(); for (;;) { current_ = lex_.Next(); if (current_.kind == TokenKind::kNewline) continue; if (current_.kind == TokenKind::kComment) { - comments_.push_back(Comment{current_.pos, std::string(current_.value)}); + if (!drop_comments_) comments_.push_back(Comment{current_.pos, std::string(current_.value)}); continue; } return; @@ -342,10 +354,7 @@ StatusOr Parser::ParseDocument() { } } if (current_.kind != TokenKind::kEOF) { - if (Status s = Soft(current_.pos, - "@dataset directive cannot coexist with top-level field entries; the " - "document's payload is the @dataset rows (draft §3.4.4)"); - !s.ok()) { + if (Status s = Soft(current_.pos, kDatasetBesideEntries); !s.ok()) { return s; } } @@ -915,7 +924,7 @@ StatusOr Parser::ParseTableDirective(int* end_offset) { // ParseTableRow reads `( cell ( ',' cell )* )` with an arity check // against `expected`. kLParen is current on entry. Writes the byte // offset immediately past the closing `)` to *end_offset. -StatusOr Parser::ParseTableRow(int expected, int* end_offset) { +StatusOr Parser::ParseTableRow(int expected, int* end_offset, bool read_past) { Position pos = current_.pos; Advance(); // consume ( @@ -939,7 +948,9 @@ StatusOr Parser::ParseTableRow(int expected, int* end_offset) { std::string("expected ',' or ')' in @dataset row, got ") + DatasetTokenMsg()); } int eo = current_.pos.offset + 1; - Advance(); // consume ) + // Consume the `)`, unless the caller reads nothing after the row: lexing on + // would read the comments after it for nothing. + if (read_past) Advance(); if (static_cast(row.cells.size()) != expected) { return Err(pos, @@ -1051,7 +1062,9 @@ StatusOr> Parser::ParseRowCell() { return std::optional(std::move(v).consume()); } -int FindMatchingBrace(std::string_view input, int open_offset) { +} // namespace + +int FindMatchingBrace(std::string_view input, int open_offset, bool* failed) { enum class Mode : uint8_t { kCode, kString, kTripleString, kBytes, kLineComment, kBlockComment }; Mode mode = Mode::kCode; int depth = 1; @@ -1069,6 +1082,7 @@ int FindMatchingBrace(std::string_view input, int open_offset) { } else if (ch == '"') { mode = Mode::kCode; } else if (ch == '\n') { + if (failed != nullptr) *failed = true; return -1; } continue; @@ -1084,6 +1098,7 @@ int FindMatchingBrace(std::string_view input, int open_offset) { if (ch == '"') { mode = Mode::kCode; } else if (ch == '\n') { + if (failed != nullptr) *failed = true; return -1; } continue; @@ -1143,8 +1158,6 @@ int FindMatchingBrace(std::string_view input, int open_offset) { return -1; } -} // namespace - StatusOr ParseDatasetAt(Lexer* lex, Token* current, int max_depth) { Parser p(std::move(*lex), *current, max_depth); int end = 0; @@ -1153,11 +1166,22 @@ StatusOr ParseDatasetAt(Lexer* lex, Token* current, int max_de return tbl; } -StatusOr ParseDatasetRow( - std::string_view row, int expected, int max_depth, int max_bytes_literal, Position start) { - Parser p(row, max_depth, max_bytes_literal, start); +StatusOr ParseDatasetRow(std::string_view row, + int expected, + int max_depth, + int max_bytes_literal, + Position start, + int* end_offset) { + Parser p(Parser::DropLeadingCommentsTag{}, row, max_depth, max_bytes_literal, start); + if (p.current().kind != TokenKind::kLParen) { + // Parse reports any token here, a lexical error included, as a + // top-level entry beside the dataset. + return Status::Error(p.current().pos.line, p.current().pos.column, kDatasetBesideEntries); + } int end = 0; - return p.ParseTableRow(expected, &end); + auto r = p.ParseTableRow(expected, &end, /*read_past=*/false); + if (r.ok() && end_offset != nullptr) *end_offset = end; + return r; } StatusOr Parse(std::string_view input, ParseOptions opts) { diff --git a/src/pxf/parser_internal.h b/src/pxf/parser_internal.h index a457f83..055df7a 100644 --- a/src/pxf/parser_internal.h +++ b/src/pxf/parser_internal.h @@ -20,12 +20,32 @@ namespace protowire::pxf { // token *lex produces, and leaves both on the token after it. StatusOr ParseDatasetAt(Lexer* lex, Token* current, int max_depth); +// FindMatchingBrace returns the offset of the `}` matching the `{` at +// open_offset, or -1 if there is none. Mirrors protowire-go's braceMatch, so +// braces inside literals and comments don't count. When there is none +// because the body can never close, a simple string or bytes literal meeting +// a newline, *failed (if given) is set; otherwise the input ends first. +int FindMatchingBrace(std::string_view input, int open_offset, bool* failed = nullptr); + +// The error for anything after a @dataset header that is neither a row nor +// a directive (draft §3.4.4). +inline constexpr const char* kDatasetBesideEntries = + "@dataset directive cannot coexist with top-level field entries; the document's payload is " + "the @dataset rows (draft §3.4.4)"; + // ParseDatasetRow parses one `( cell, ... )` of expected cells, under the // caller's nesting and bytes-literal limits. The row starts at `start` in // its stream, and the row, its cells and its errors carry positions in the -// stream, as protowire-go's do (#161). -StatusOr ParseDatasetRow( - std::string_view row, int expected, int max_depth, int max_bytes_literal, Position start); +// stream, as protowire-go's do (#161). Input that does not open with `(` +// is an entry beside the dataset, as Parse reports it. On success +// *end_offset, if given, is the stream offset just past the row's `)`; +// what follows it in `row` is not read. +StatusOr ParseDatasetRow(std::string_view row, + int expected, + int max_depth, + int max_bytes_literal, + Position start, + int* end_offset = nullptr); // CheckDescriptorSchema runs ValidateDescriptor and joins any violations // into one error, the bind-time check Unmarshal and DatasetReader share. diff --git a/test/pxf_corpus_test.cc b/test/pxf_corpus_test.cc index 8c61163..c2b1142 100644 --- a/test/pxf_corpus_test.cc +++ b/test/pxf_corpus_test.cc @@ -556,6 +556,9 @@ Status BindMaterialized(const Schema& schema, const std::string& text) { } // BindStreaming reads every dataset of the document through DatasetReader. +// The reader decides where the rows end: a table's rows end at the end of +// the input or at the next directive, which its Tail starts with, and +// anything else is its error (#164). Status BindStreaming(const Schema& schema, const std::string& text) { auto input = std::make_unique(text); for (;;) { @@ -570,17 +573,7 @@ Status BindStreaming(const Schema& schema, const std::string& text) { } auto tail = (*reader)->Tail(); std::string rest((std::istreambuf_iterator(*tail)), std::istreambuf_iterator()); - bool blank = true; - std::istringstream lines(rest); - std::string line; - while (std::getline(lines, line)) { - auto at = line.find_first_not_of(" \t\r"); - if (at != std::string::npos && line[at] != '#') blank = false; - } - if (blank) return Status::OK(); - if (rest.find("@dataset") == std::string::npos) { - return Status::Error("junk after the rows: top-level field entries"); - } + if (rest.empty()) return Status::OK(); input = std::make_unique(std::move(rest)); } } @@ -599,8 +592,8 @@ TEST(PxfCorpus, Dataset) { std::string text = ReadFile(path); Status materialized = BindMaterialized(schema, text); Status streamed = BindStreaming(schema, text); - EXPECT_EQ(materialized.ok(), streamed.ok()) - << "materialized: " << materialized.ToString() << "\nstreamed: " << streamed.ToString(); + // The reader reports the error Parse reports, at the same position. + EXPECT_EQ(materialized.ToString(), streamed.ToString()); if (it->second.gap != nullptr) { // A closed gap fails here until its entry is removed. EXPECT_NE(materialized.ok(), it->second.accept) diff --git a/test/pxf_dataset_reader_test.cc b/test/pxf_dataset_reader_test.cc index c6056ce..795d9bc 100644 --- a/test/pxf_dataset_reader_test.cc +++ b/test/pxf_dataset_reader_test.cc @@ -10,6 +10,7 @@ #include #include "protoc_compat.h" +#include #include #include #include @@ -481,4 +482,76 @@ TEST(DatasetReaderPositions, MatchProtowireGo) { } } +// ---- A row ends at a `)`, a directive or the end of input (#164) --------- + +std::string FromHex(const std::string& hex) { + std::string out; + for (size_t i = 0; i + 1 < hex.size(); i += 2) { + out.push_back(static_cast(std::stoi(hex.substr(i, 2), nullptr, 16))); + } + return out; +} + +// testdata/dataset-stream/go_sweep.tsv is protowire-go's verdict on streaming +// inputs: rows and headers cut short, junk where a row could begin, the cap on the bytes +// held while a row's end is sought, Scan's limits, and the 4096-byte read +// boundary at every offset in and around a row. Each line is name, +// max_message_size, mode, head, pad, tail and the result: the rows read, then +// EOF or the error. tools/dataset_stream_sweep wrote it; its header says how +// to regenerate it. +TEST(DatasetReaderEnds, MatchProtowireGo) { + std::ifstream in(std::string(TESTDATA_DIR) + "/dataset-stream/go_sweep.tsv"); + ASSERT_TRUE(in) << "testdata/dataset-stream/go_sweep.tsv"; + int cases = 0; + int errors = 0; + for (std::string line; std::getline(in, line);) { + std::vector f; + for (size_t at = 0;;) { + const size_t tab = line.find('\t', at); + f.push_back(line.substr(at, tab == std::string::npos ? std::string::npos : tab - at)); + if (tab == std::string::npos) break; + at = tab + 1; + } + ASSERT_EQ(f.size(), 7u) << line; + SCOPED_TRACE(f[0] + " max_message_size=" + f[1]); + std::string input = FromHex(f[3]); + if (const int pad = std::stoi(f[4]); pad >= 0) { + input += "(\"" + std::string(pad, 'p') + "\")\n"; + } + input += FromHex(f[5]); + std::istringstream src(input); + protowire::pxf::UnmarshalOptions opts; + opts.max_message_size = std::stoi(f[1]); + auto tr = DatasetReader::Create(&src, opts); + std::string got; + if (!tr.ok()) { + got = "create: " + tr.status().ToString(); + } else { + for (int rows = 0;; ++rows) { + protowire::Status st; + if (f[2] == "scan") { + pb::FileOptions msg; + st = (*tr)->Scan(&msg); + } else { + DatasetRow row; + st = (*tr)->Next(&row); + } + if (!st.ok() || (*tr)->Done()) { + got = "rows=" + std::to_string(rows) + " " + (st.ok() ? "EOF" : st.ToString()); + break; + } + } + } + EXPECT_EQ(got, f[6]); + ++cases; + if (f[6].rfind("rows=", 0) != 0 || f[6].find(' ') != f[6].size() - 4 || + f[6].substr(f[6].size() - 4) != " EOF") { + ++errors; + } + } + // The table reads whole: 590 cases, of which 230 end in an error. + EXPECT_EQ(cases, 590); + EXPECT_EQ(errors, 230); +} + } // namespace diff --git a/testdata/dataset-stream/go_sweep.tsv b/testdata/dataset-stream/go_sweep.tsv new file mode 100644 index 0000000..386926e --- /dev/null +++ b/testdata/dataset-stream/go_sweep.tsv @@ -0,0 +1,590 @@ +truncated-row-eof 0 next 2320c2a7332e342e3420617070656e64696e672e20546865206c61737420726f77206973206375742073686f727420627920656e64206f6620696e70757420e28094207468652073686170650a2320616e20696e74657272757074656420617070656e64206c656176657320626568696e642e204d5553542062652072656a65637465642c206279207468652073747265616d696e670a23204150492061732077656c6c20617320746865206d6174657269616c697a696e67206f6e653a206120726f772077686f736520636c6f73696e6720222922206e657665720a2320617272697665732069732061206465636f6465206572726f722c206e6f742074686520656e64206f662074686520726f772073657175656e63652e0a0a406461746173657420746573742e76312e416c6c54797065732028737472696e675f6669656c642c20696e7433325f6669656c64290a0a2822726f772d31222c2031290a2822726f772d32222c20320a -1 rows=1 10:1: expected ',' or ')' in @dataset row, got EOF +truncated-row-then-rows 0 next 2320c2a7332e342e3420617070656e64696e672e204120726f77206375742073686f7274206d69642d6e756d6265722c20666f6c6c6f77656420627920636f6d706c65746520726f77730a2320617070656e646564206c617465722e204d5553542062652072656a656374656420e280942061206465636f64657220746861742074726561746564207468652062726f6b656e20726f770a232061732074686520656e64206f66207468652073657175656e636520776f756c642073696c656e746c792064726f7020657665727920726f772061667465722069742e0a0a406461746173657420746573742e76312e416c6c54797065732028737472696e675f6669656c642c20696e7433325f6669656c64290a0a2822726f772d31222c2031290a2822726f772d32222c20320a2822726f772d33222c2033290a2822726f772d34222c2034290a -1 rows=1 9:1: expected ',' or ')' in @dataset row, got ( +junk-between-rows 0 next 2320c2a7332e342e3420617070656e64696e672e20536f6d657468696e67206f74686572207468616e206120726f77206f7220612064697265637469766520776865726520746865206e6578740a2320726f7720636f756c6420626567696e2e204d5553542062652072656a656374656420e280942074686520726f772073657175656e636520656e6473206f6e6c7920617420656e64206f660a2320696e707574206f7220617420746865206e657874206469726563746976652e0a0a406461746173657420746573742e76312e416c6c54797065732028737472696e675f6669656c642c20696e7433325f6669656c64290a0a2822726f772d31222c2031290a78797a0a2822726f772d32222c2032290a -1 rows=1 8:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +rows-end-at-directive 0 next 2320c2a7332e342e3420617070656e64696e672e2054776f20646174617365747320696e206f6e6520646f63756d656e742e20546865206669727374206f6e65277320726f777320656e640a2320617420746865207365636f6e642022406461746173657422206469726563746976652c2077686963682069732061206c65676974696d61746520656e64206f66207468650a232073657175656e63652e204d5553542062652061636365707465643a2074776f2064617461736574732c2074776f20726f777320616e64206f6e6520726f772e0a0a406461746173657420746573742e76312e416c6c54797065732028737472696e675f6669656c642c20696e7433325f6669656c64290a0a2822726f772d31222c2031290a2822726f772d32222c2032290a0a406461746173657420746573742e76312e416c6c54797065732028737472696e675f6669656c642c20656e756d5f6669656c64290a0a2822726f772d33222c205354415455535f414354495645290a -1 rows=2 EOF +no close 0 next 406461746173657420782e526f772028206120290a28227979220a -1 rows=0 3:1: expected ',' or ')' in @dataset row, got EOF +newline in string 0 next 406461746173657420782e526f772028206120290a282279790a -1 rows=0 2:2: newline in string literal: write it as \n, or use a """triple-quoted""" string +unterminated string at eof 0 next 406461746173657420782e526f772028206120290a28227979 -1 rows=0 2:2: unterminated string +unterminated bytes 0 next 406461746173657420782e526f772028206120290a28622251554a440a -1 rows=0 2:2: unterminated bytes literal +unterminated triple 0 next 406461746173657420782e526f772028206120290a282222226162630a -1 rows=0 2:2: unterminated triple-quoted string +open paren in row 0 next 406461746173657420782e526f772028206120290a28203120290a282028322920290a -1 rows=1 3:3: expected value, got ( ("(") +bare at 0 next 406461746173657420782e526f772028206120290a28203120290a4020780a -1 rows=1 3:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +at digits 0 next 406461746173657420782e526f772028206120290a28203120290a40310a -1 rows=1 EOF +directive 0 next 406461746173657420782e526f772028206120290a28203120290a40666f6f20780a -1 rows=1 EOF +block comment open between rows 0 next 406461746173657420782e526f772028206120290a28203120290a2f2a20616263 -1 rows=1 3:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +block comment open in row 0 next 406461746173657420782e526f772028206120290a282031202f2a20616263 -1 rows=0 2:5: expected ',' or ')' in @dataset row, got ILLEGAL +junk at eof 0 next 406461746173657420782e526f772028206120290a28203120290a78797a -1 rows=1 3:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +brace at eof 0 next 406461746173657420782e526f772028206120290a28203120290a7d -1 rows=1 3:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +field entry 0 next 406461746173657420782e526f772028206120290a28203120290a666f6f203d20310a -1 rows=1 3:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +comments after rows 0 next 406461746173657420782e526f772028206120290a2820312029202320630a2f2f20640a2f2a2065202a2f0a28203220290a2320656e64 -1 rows=2 EOF +illegal in row 0 next 406461746173657420782e526f772028206120290a282031202420290a -1 rows=0 2:5: expected ',' or ')' in @dataset row, got ILLEGAL +illegal between rows 0 next 406461746173657420782e526f772028206120290a28203120290a240a -1 rows=1 3:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +lone paren 0 next 406461746173657420782e526f772028206120290a2820 -1 rows=0 2:3: expected value, got EOF ("") +close paren between rows 0 next 406461746173657420782e526f772028206120290a28203120290a290a -1 rows=1 3:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +header cut 0 next 406461746173657420782e526f7720282061 -1 create: 1:19: expected ',' or ')' in @dataset column list, got EOF +header cut after type 0 next 406461746173657420782e526f77 -1 create: 1:15: expected '(' to start @dataset column list, got EOF +header cols cut 0 next 406461746173657420782e526f77202820612c20 -1 create: 1:21: expected column field name, got EOF +header string open 0 next 40666f6f20226162630a406461746173657420782e526f772028206120290a28203120290a -1 create: 1:6: expected identifier, string, integer, or bool, got newline in string literal: write it as \n, or use a """triple-quoted""" string +header comment open 0 next 2f2a206162630a406461746173657420782e526f772028206120290a -1 create: 1:1: expected identifier, string, integer, or bool, got unterminated block comment +header bytes open 0 next 40666f6f20622251554a440a406461746173657420782e526f772028206120290a -1 create: 1:6: expected identifier, string, integer, or bool, got unterminated bytes literal +header illegal 0 next 2420406461746173657420782e526f772028206120290a -1 create: 1:1: expected identifier, string, integer, or bool, got unexpected character '$' +header paren in string 0 next 40666f6f2022282220406461746173657420782e526f772028206120290a28203120290a -1 create: 1:10: expected '=', ':', or '{' after "(", got @dataset +header proto body 0 next 4070726f746f20782e526f77207b20737472696e672061203d20313b207d0a406461746173657420782e526f772028206120290a28203120290a -1 rows=1 EOF +header proto paren 0 next 4070726f746f20782e526f77207b202f2f20280a20737472696e672061203d20313b207d0a406461746173657420782e526f772028206120290a28203120290a -1 rows=1 EOF +header proto string open 0 next 4070726f746f20782e526f77207b206f7074696f6e2078203d2022610a3b207d0a406461746173657420782e526f772028206120290a -1 create: 1:14: @proto x.Row: unmatched '{' +header proto cut 0 next 4070726f746f20782e526f77207b20737472696e672061203d20313b0a -1 create: 1:14: @proto x.Row: unmatched '{' +header no dataset 0 next 40666f6f20780a -1 create: pxf: no @dataset directive in stream +header empty 0 next -1 create: pxf: no @dataset directive in stream +open row over a small cap 56 next 406461746173657420782e526f772028206120290a2822 10000 create: dataset input holds 4096 bytes without a row boundary, MaxMessageSize=56 +open row over 5000 5000 next 406461746173657420782e526f772028206120290a282278787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878 -1 rows=0 dataset input holds 8172 bytes without a row boundary, MaxMessageSize=5000 +doc over a small cap 30 next 406461746173657420782e526f772028206120290a28203120290a28203220290a -1 create: dataset input holds 33 bytes without a row boundary, MaxMessageSize=30 +rows past 4096, cap 4200 4200 next 406461746173657420782e526f772028206120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a -1 rows=2000 EOF +rows past 4096, cap 4096 4096 next 406461746173657420782e526f772028206120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a28203120290a -1 rows=679 dataset input holds 4098 bytes without a row boundary, MaxMessageSize=4096 +scan body wider than the cap 4500 scan 406461746173657420676f6f676c652e70726f746f6275662e46696c654f7074696f6e732028207068705f6d657461646174615f6e616d65737061636520290a 4027 28227676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767622290a rows=2 EOF +scan body under the default cap 0 scan 406461746173657420676f6f676c652e70726f746f6275662e46696c654f7074696f6e732028207068705f6d657461646174615f6e616d65737061636520290a 4027 28227676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767622290a rows=2 EOF +boundary float k=0 0 next 406461746173657420782e526f772028206120290a 4070 2820312e3520290a28203220290a rows=3 EOF +boundary float k=0 4200 next 406461746173657420782e526f772028206120290a 4070 2820312e3520290a28203220290a rows=3 EOF +boundary float k=0 4100 next 406461746173657420782e526f772028206120290a 4070 2820312e3520290a28203220290a rows=3 EOF +boundary float k=1 0 next 406461746173657420782e526f772028206120290a 4069 2820312e3520290a28203220290a rows=3 EOF +boundary float k=1 4200 next 406461746173657420782e526f772028206120290a 4069 2820312e3520290a28203220290a rows=3 EOF +boundary float k=1 4100 next 406461746173657420782e526f772028206120290a 4069 2820312e3520290a28203220290a rows=3 EOF +boundary float k=2 0 next 406461746173657420782e526f772028206120290a 4068 2820312e3520290a28203220290a rows=3 EOF +boundary float k=2 4200 next 406461746173657420782e526f772028206120290a 4068 2820312e3520290a28203220290a rows=3 EOF +boundary float k=2 4100 next 406461746173657420782e526f772028206120290a 4068 2820312e3520290a28203220290a rows=3 EOF +boundary float k=3 0 next 406461746173657420782e526f772028206120290a 4067 2820312e3520290a28203220290a rows=3 EOF +boundary float k=3 4200 next 406461746173657420782e526f772028206120290a 4067 2820312e3520290a28203220290a rows=3 EOF +boundary float k=3 4100 next 406461746173657420782e526f772028206120290a 4067 2820312e3520290a28203220290a rows=3 EOF +boundary float k=4 0 next 406461746173657420782e526f772028206120290a 4066 2820312e3520290a28203220290a rows=3 EOF +boundary float k=4 4200 next 406461746173657420782e526f772028206120290a 4066 2820312e3520290a28203220290a rows=3 EOF +boundary float k=4 4100 next 406461746173657420782e526f772028206120290a 4066 2820312e3520290a28203220290a rows=3 EOF +boundary float k=5 0 next 406461746173657420782e526f772028206120290a 4065 2820312e3520290a28203220290a rows=3 EOF +boundary float k=5 4200 next 406461746173657420782e526f772028206120290a 4065 2820312e3520290a28203220290a rows=3 EOF +boundary float k=5 4100 next 406461746173657420782e526f772028206120290a 4065 2820312e3520290a28203220290a rows=3 EOF +boundary float k=6 0 next 406461746173657420782e526f772028206120290a 4064 2820312e3520290a28203220290a rows=3 EOF +boundary float k=6 4200 next 406461746173657420782e526f772028206120290a 4064 2820312e3520290a28203220290a rows=3 EOF +boundary float k=6 4100 next 406461746173657420782e526f772028206120290a 4064 2820312e3520290a28203220290a rows=3 EOF +boundary float k=7 0 next 406461746173657420782e526f772028206120290a 4063 2820312e3520290a28203220290a rows=3 EOF +boundary float k=7 4200 next 406461746173657420782e526f772028206120290a 4063 2820312e3520290a28203220290a rows=3 EOF +boundary float k=7 4100 next 406461746173657420782e526f772028206120290a 4063 2820312e3520290a28203220290a rows=3 EOF +boundary float k=8 0 next 406461746173657420782e526f772028206120290a 4062 2820312e3520290a28203220290a rows=3 EOF +boundary float k=8 4200 next 406461746173657420782e526f772028206120290a 4062 2820312e3520290a28203220290a rows=3 EOF +boundary float k=8 4100 next 406461746173657420782e526f772028206120290a 4062 2820312e3520290a28203220290a rows=3 EOF +boundary float k=9 0 next 406461746173657420782e526f772028206120290a 4061 2820312e3520290a28203220290a rows=3 EOF +boundary float k=9 4200 next 406461746173657420782e526f772028206120290a 4061 2820312e3520290a28203220290a rows=3 EOF +boundary float k=9 4100 next 406461746173657420782e526f772028206120290a 4061 2820312e3520290a28203220290a rows=3 EOF +boundary float k=10 0 next 406461746173657420782e526f772028206120290a 4060 2820312e3520290a28203220290a rows=3 EOF +boundary float k=10 4200 next 406461746173657420782e526f772028206120290a 4060 2820312e3520290a28203220290a rows=3 EOF +boundary float k=10 4100 next 406461746173657420782e526f772028206120290a 4060 2820312e3520290a28203220290a rows=3 EOF +boundary float k=11 0 next 406461746173657420782e526f772028206120290a 4059 2820312e3520290a28203220290a rows=3 EOF +boundary float k=11 4200 next 406461746173657420782e526f772028206120290a 4059 2820312e3520290a28203220290a rows=3 EOF +boundary float k=11 4100 next 406461746173657420782e526f772028206120290a 4059 2820312e3520290a28203220290a rows=3 EOF +boundary float k=12 0 next 406461746173657420782e526f772028206120290a 4058 2820312e3520290a28203220290a rows=3 EOF +boundary float k=12 4200 next 406461746173657420782e526f772028206120290a 4058 2820312e3520290a28203220290a rows=3 EOF +boundary float k=12 4100 next 406461746173657420782e526f772028206120290a 4058 2820312e3520290a28203220290a rows=3 EOF +boundary neg inf k=0 0 next 406461746173657420782e526f772028206120290a 4070 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=0 4200 next 406461746173657420782e526f772028206120290a 4070 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=0 4100 next 406461746173657420782e526f772028206120290a 4070 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=1 0 next 406461746173657420782e526f772028206120290a 4069 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=1 4200 next 406461746173657420782e526f772028206120290a 4069 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=1 4100 next 406461746173657420782e526f772028206120290a 4069 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=2 0 next 406461746173657420782e526f772028206120290a 4068 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=2 4200 next 406461746173657420782e526f772028206120290a 4068 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=2 4100 next 406461746173657420782e526f772028206120290a 4068 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=3 0 next 406461746173657420782e526f772028206120290a 4067 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=3 4200 next 406461746173657420782e526f772028206120290a 4067 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=3 4100 next 406461746173657420782e526f772028206120290a 4067 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=4 0 next 406461746173657420782e526f772028206120290a 4066 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=4 4200 next 406461746173657420782e526f772028206120290a 4066 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=4 4100 next 406461746173657420782e526f772028206120290a 4066 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=5 0 next 406461746173657420782e526f772028206120290a 4065 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=5 4200 next 406461746173657420782e526f772028206120290a 4065 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=5 4100 next 406461746173657420782e526f772028206120290a 4065 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=6 0 next 406461746173657420782e526f772028206120290a 4064 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=6 4200 next 406461746173657420782e526f772028206120290a 4064 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=6 4100 next 406461746173657420782e526f772028206120290a 4064 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=7 0 next 406461746173657420782e526f772028206120290a 4063 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=7 4200 next 406461746173657420782e526f772028206120290a 4063 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=7 4100 next 406461746173657420782e526f772028206120290a 4063 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=8 0 next 406461746173657420782e526f772028206120290a 4062 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=8 4200 next 406461746173657420782e526f772028206120290a 4062 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=8 4100 next 406461746173657420782e526f772028206120290a 4062 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=9 0 next 406461746173657420782e526f772028206120290a 4061 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=9 4200 next 406461746173657420782e526f772028206120290a 4061 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=9 4100 next 406461746173657420782e526f772028206120290a 4061 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=10 0 next 406461746173657420782e526f772028206120290a 4060 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=10 4200 next 406461746173657420782e526f772028206120290a 4060 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=10 4100 next 406461746173657420782e526f772028206120290a 4060 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=11 0 next 406461746173657420782e526f772028206120290a 4059 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=11 4200 next 406461746173657420782e526f772028206120290a 4059 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=11 4100 next 406461746173657420782e526f772028206120290a 4059 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=12 0 next 406461746173657420782e526f772028206120290a 4058 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=12 4200 next 406461746173657420782e526f772028206120290a 4058 28202d696e6620290a28203220290a rows=3 EOF +boundary neg inf k=12 4100 next 406461746173657420782e526f772028206120290a 4058 28202d696e6620290a28203220290a rows=3 EOF +boundary string k=0 0 next 406461746173657420782e526f772028206120290a 4070 2820226162632220290a28203220290a rows=3 EOF +boundary string k=0 4200 next 406461746173657420782e526f772028206120290a 4070 2820226162632220290a28203220290a rows=3 EOF +boundary string k=0 4100 next 406461746173657420782e526f772028206120290a 4070 2820226162632220290a28203220290a rows=3 EOF +boundary string k=1 0 next 406461746173657420782e526f772028206120290a 4069 2820226162632220290a28203220290a rows=3 EOF +boundary string k=1 4200 next 406461746173657420782e526f772028206120290a 4069 2820226162632220290a28203220290a rows=3 EOF +boundary string k=1 4100 next 406461746173657420782e526f772028206120290a 4069 2820226162632220290a28203220290a rows=3 EOF +boundary string k=2 0 next 406461746173657420782e526f772028206120290a 4068 2820226162632220290a28203220290a rows=3 EOF +boundary string k=2 4200 next 406461746173657420782e526f772028206120290a 4068 2820226162632220290a28203220290a rows=3 EOF +boundary string k=2 4100 next 406461746173657420782e526f772028206120290a 4068 2820226162632220290a28203220290a rows=3 EOF +boundary string k=3 0 next 406461746173657420782e526f772028206120290a 4067 2820226162632220290a28203220290a rows=3 EOF +boundary string k=3 4200 next 406461746173657420782e526f772028206120290a 4067 2820226162632220290a28203220290a rows=3 EOF +boundary string k=3 4100 next 406461746173657420782e526f772028206120290a 4067 2820226162632220290a28203220290a rows=3 EOF +boundary string k=4 0 next 406461746173657420782e526f772028206120290a 4066 2820226162632220290a28203220290a rows=3 EOF +boundary string k=4 4200 next 406461746173657420782e526f772028206120290a 4066 2820226162632220290a28203220290a rows=3 EOF +boundary string k=4 4100 next 406461746173657420782e526f772028206120290a 4066 2820226162632220290a28203220290a rows=3 EOF +boundary string k=5 0 next 406461746173657420782e526f772028206120290a 4065 2820226162632220290a28203220290a rows=3 EOF +boundary string k=5 4200 next 406461746173657420782e526f772028206120290a 4065 2820226162632220290a28203220290a rows=3 EOF +boundary string k=5 4100 next 406461746173657420782e526f772028206120290a 4065 2820226162632220290a28203220290a rows=3 EOF +boundary string k=6 0 next 406461746173657420782e526f772028206120290a 4064 2820226162632220290a28203220290a rows=3 EOF +boundary string k=6 4200 next 406461746173657420782e526f772028206120290a 4064 2820226162632220290a28203220290a rows=3 EOF +boundary string k=6 4100 next 406461746173657420782e526f772028206120290a 4064 2820226162632220290a28203220290a rows=3 EOF +boundary string k=7 0 next 406461746173657420782e526f772028206120290a 4063 2820226162632220290a28203220290a rows=3 EOF +boundary string k=7 4200 next 406461746173657420782e526f772028206120290a 4063 2820226162632220290a28203220290a rows=3 EOF +boundary string k=7 4100 next 406461746173657420782e526f772028206120290a 4063 2820226162632220290a28203220290a rows=3 EOF +boundary string k=8 0 next 406461746173657420782e526f772028206120290a 4062 2820226162632220290a28203220290a rows=3 EOF +boundary string k=8 4200 next 406461746173657420782e526f772028206120290a 4062 2820226162632220290a28203220290a rows=3 EOF +boundary string k=8 4100 next 406461746173657420782e526f772028206120290a 4062 2820226162632220290a28203220290a rows=3 EOF +boundary string k=9 0 next 406461746173657420782e526f772028206120290a 4061 2820226162632220290a28203220290a rows=3 EOF +boundary string k=9 4200 next 406461746173657420782e526f772028206120290a 4061 2820226162632220290a28203220290a rows=3 EOF +boundary string k=9 4100 next 406461746173657420782e526f772028206120290a 4061 2820226162632220290a28203220290a rows=3 EOF +boundary string k=10 0 next 406461746173657420782e526f772028206120290a 4060 2820226162632220290a28203220290a rows=3 EOF +boundary string k=10 4200 next 406461746173657420782e526f772028206120290a 4060 2820226162632220290a28203220290a rows=3 EOF +boundary string k=10 4100 next 406461746173657420782e526f772028206120290a 4060 2820226162632220290a28203220290a rows=3 EOF +boundary string k=11 0 next 406461746173657420782e526f772028206120290a 4059 2820226162632220290a28203220290a rows=3 EOF +boundary string k=11 4200 next 406461746173657420782e526f772028206120290a 4059 2820226162632220290a28203220290a rows=3 EOF +boundary string k=11 4100 next 406461746173657420782e526f772028206120290a 4059 2820226162632220290a28203220290a rows=3 EOF +boundary string k=12 0 next 406461746173657420782e526f772028206120290a 4058 2820226162632220290a28203220290a rows=3 EOF +boundary string k=12 4200 next 406461746173657420782e526f772028206120290a 4058 2820226162632220290a28203220290a rows=3 EOF +boundary string k=12 4100 next 406461746173657420782e526f772028206120290a 4058 2820226162632220290a28203220290a rows=3 EOF +boundary triple k=0 0 next 406461746173657420782e526f772028206120290a 4070 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=0 4200 next 406461746173657420782e526f772028206120290a 4070 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=0 4100 next 406461746173657420782e526f772028206120290a 4070 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=1 0 next 406461746173657420782e526f772028206120290a 4069 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=1 4200 next 406461746173657420782e526f772028206120290a 4069 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=1 4100 next 406461746173657420782e526f772028206120290a 4069 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=2 0 next 406461746173657420782e526f772028206120290a 4068 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=2 4200 next 406461746173657420782e526f772028206120290a 4068 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=2 4100 next 406461746173657420782e526f772028206120290a 4068 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=3 0 next 406461746173657420782e526f772028206120290a 4067 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=3 4200 next 406461746173657420782e526f772028206120290a 4067 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=3 4100 next 406461746173657420782e526f772028206120290a 4067 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=4 0 next 406461746173657420782e526f772028206120290a 4066 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=4 4200 next 406461746173657420782e526f772028206120290a 4066 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=4 4100 next 406461746173657420782e526f772028206120290a 4066 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=5 0 next 406461746173657420782e526f772028206120290a 4065 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=5 4200 next 406461746173657420782e526f772028206120290a 4065 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=5 4100 next 406461746173657420782e526f772028206120290a 4065 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=6 0 next 406461746173657420782e526f772028206120290a 4064 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=6 4200 next 406461746173657420782e526f772028206120290a 4064 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=6 4100 next 406461746173657420782e526f772028206120290a 4064 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=7 0 next 406461746173657420782e526f772028206120290a 4063 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=7 4200 next 406461746173657420782e526f772028206120290a 4063 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=7 4100 next 406461746173657420782e526f772028206120290a 4063 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=8 0 next 406461746173657420782e526f772028206120290a 4062 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=8 4200 next 406461746173657420782e526f772028206120290a 4062 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=8 4100 next 406461746173657420782e526f772028206120290a 4062 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=9 0 next 406461746173657420782e526f772028206120290a 4061 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=9 4200 next 406461746173657420782e526f772028206120290a 4061 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=9 4100 next 406461746173657420782e526f772028206120290a 4061 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=10 0 next 406461746173657420782e526f772028206120290a 4060 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=10 4200 next 406461746173657420782e526f772028206120290a 4060 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=10 4100 next 406461746173657420782e526f772028206120290a 4060 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=11 0 next 406461746173657420782e526f772028206120290a 4059 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=11 4200 next 406461746173657420782e526f772028206120290a 4059 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=11 4100 next 406461746173657420782e526f772028206120290a 4059 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=12 0 next 406461746173657420782e526f772028206120290a 4058 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=12 4200 next 406461746173657420782e526f772028206120290a 4058 282022222261626322222220290a28203220290a rows=3 EOF +boundary triple k=12 4100 next 406461746173657420782e526f772028206120290a 4058 282022222261626322222220290a28203220290a rows=3 EOF +boundary bytes k=0 0 next 406461746173657420782e526f772028206120290a 4070 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=0 4200 next 406461746173657420782e526f772028206120290a 4070 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=0 4100 next 406461746173657420782e526f772028206120290a 4070 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=1 0 next 406461746173657420782e526f772028206120290a 4069 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=1 4200 next 406461746173657420782e526f772028206120290a 4069 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=1 4100 next 406461746173657420782e526f772028206120290a 4069 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=2 0 next 406461746173657420782e526f772028206120290a 4068 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=2 4200 next 406461746173657420782e526f772028206120290a 4068 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=2 4100 next 406461746173657420782e526f772028206120290a 4068 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=3 0 next 406461746173657420782e526f772028206120290a 4067 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=3 4200 next 406461746173657420782e526f772028206120290a 4067 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=3 4100 next 406461746173657420782e526f772028206120290a 4067 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=4 0 next 406461746173657420782e526f772028206120290a 4066 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=4 4200 next 406461746173657420782e526f772028206120290a 4066 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=4 4100 next 406461746173657420782e526f772028206120290a 4066 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=5 0 next 406461746173657420782e526f772028206120290a 4065 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=5 4200 next 406461746173657420782e526f772028206120290a 4065 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=5 4100 next 406461746173657420782e526f772028206120290a 4065 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=6 0 next 406461746173657420782e526f772028206120290a 4064 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=6 4200 next 406461746173657420782e526f772028206120290a 4064 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=6 4100 next 406461746173657420782e526f772028206120290a 4064 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=7 0 next 406461746173657420782e526f772028206120290a 4063 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=7 4200 next 406461746173657420782e526f772028206120290a 4063 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=7 4100 next 406461746173657420782e526f772028206120290a 4063 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=8 0 next 406461746173657420782e526f772028206120290a 4062 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=8 4200 next 406461746173657420782e526f772028206120290a 4062 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=8 4100 next 406461746173657420782e526f772028206120290a 4062 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=9 0 next 406461746173657420782e526f772028206120290a 4061 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=9 4200 next 406461746173657420782e526f772028206120290a 4061 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=9 4100 next 406461746173657420782e526f772028206120290a 4061 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=10 0 next 406461746173657420782e526f772028206120290a 4060 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=10 4200 next 406461746173657420782e526f772028206120290a 4060 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=10 4100 next 406461746173657420782e526f772028206120290a 4060 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=11 0 next 406461746173657420782e526f772028206120290a 4059 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=11 4200 next 406461746173657420782e526f772028206120290a 4059 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=11 4100 next 406461746173657420782e526f772028206120290a 4059 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=12 0 next 406461746173657420782e526f772028206120290a 4058 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=12 4200 next 406461746173657420782e526f772028206120290a 4058 2820622251554a442220290a28203220290a rows=3 EOF +boundary bytes k=12 4100 next 406461746173657420782e526f772028206120290a 4058 2820622251554a442220290a28203220290a rows=3 EOF +boundary timestamp k=0 0 next 406461746173657420782e526f772028206120290a 4070 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=0 4200 next 406461746173657420782e526f772028206120290a 4070 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=0 4100 next 406461746173657420782e526f772028206120290a 4070 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=1 0 next 406461746173657420782e526f772028206120290a 4069 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=1 4200 next 406461746173657420782e526f772028206120290a 4069 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=1 4100 next 406461746173657420782e526f772028206120290a 4069 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=2 0 next 406461746173657420782e526f772028206120290a 4068 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=2 4200 next 406461746173657420782e526f772028206120290a 4068 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=2 4100 next 406461746173657420782e526f772028206120290a 4068 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=3 0 next 406461746173657420782e526f772028206120290a 4067 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=3 4200 next 406461746173657420782e526f772028206120290a 4067 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=3 4100 next 406461746173657420782e526f772028206120290a 4067 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=4 0 next 406461746173657420782e526f772028206120290a 4066 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=4 4200 next 406461746173657420782e526f772028206120290a 4066 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=4 4100 next 406461746173657420782e526f772028206120290a 4066 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=5 0 next 406461746173657420782e526f772028206120290a 4065 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=5 4200 next 406461746173657420782e526f772028206120290a 4065 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=5 4100 next 406461746173657420782e526f772028206120290a 4065 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=6 0 next 406461746173657420782e526f772028206120290a 4064 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=6 4200 next 406461746173657420782e526f772028206120290a 4064 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=6 4100 next 406461746173657420782e526f772028206120290a 4064 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=7 0 next 406461746173657420782e526f772028206120290a 4063 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=7 4200 next 406461746173657420782e526f772028206120290a 4063 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=7 4100 next 406461746173657420782e526f772028206120290a 4063 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=8 0 next 406461746173657420782e526f772028206120290a 4062 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=8 4200 next 406461746173657420782e526f772028206120290a 4062 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=8 4100 next 406461746173657420782e526f772028206120290a 4062 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=9 0 next 406461746173657420782e526f772028206120290a 4061 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=9 4200 next 406461746173657420782e526f772028206120290a 4061 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=9 4100 next 406461746173657420782e526f772028206120290a 4061 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=10 0 next 406461746173657420782e526f772028206120290a 4060 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=10 4200 next 406461746173657420782e526f772028206120290a 4060 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=10 4100 next 406461746173657420782e526f772028206120290a 4060 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=11 0 next 406461746173657420782e526f772028206120290a 4059 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=11 4200 next 406461746173657420782e526f772028206120290a 4059 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=11 4100 next 406461746173657420782e526f772028206120290a 4059 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=12 0 next 406461746173657420782e526f772028206120290a 4058 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=12 4200 next 406461746173657420782e526f772028206120290a 4058 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary timestamp k=12 4100 next 406461746173657420782e526f772028206120290a 4058 2820323032342d30312d30325430333a30343a30355a20290a28203220290a rows=3 EOF +boundary duration k=0 0 next 406461746173657420782e526f772028206120290a 4070 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=0 4200 next 406461746173657420782e526f772028206120290a 4070 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=0 4100 next 406461746173657420782e526f772028206120290a 4070 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=1 0 next 406461746173657420782e526f772028206120290a 4069 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=1 4200 next 406461746173657420782e526f772028206120290a 4069 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=1 4100 next 406461746173657420782e526f772028206120290a 4069 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=2 0 next 406461746173657420782e526f772028206120290a 4068 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=2 4200 next 406461746173657420782e526f772028206120290a 4068 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=2 4100 next 406461746173657420782e526f772028206120290a 4068 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=3 0 next 406461746173657420782e526f772028206120290a 4067 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=3 4200 next 406461746173657420782e526f772028206120290a 4067 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=3 4100 next 406461746173657420782e526f772028206120290a 4067 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=4 0 next 406461746173657420782e526f772028206120290a 4066 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=4 4200 next 406461746173657420782e526f772028206120290a 4066 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=4 4100 next 406461746173657420782e526f772028206120290a 4066 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=5 0 next 406461746173657420782e526f772028206120290a 4065 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=5 4200 next 406461746173657420782e526f772028206120290a 4065 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=5 4100 next 406461746173657420782e526f772028206120290a 4065 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=6 0 next 406461746173657420782e526f772028206120290a 4064 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=6 4200 next 406461746173657420782e526f772028206120290a 4064 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=6 4100 next 406461746173657420782e526f772028206120290a 4064 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=7 0 next 406461746173657420782e526f772028206120290a 4063 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=7 4200 next 406461746173657420782e526f772028206120290a 4063 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=7 4100 next 406461746173657420782e526f772028206120290a 4063 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=8 0 next 406461746173657420782e526f772028206120290a 4062 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=8 4200 next 406461746173657420782e526f772028206120290a 4062 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=8 4100 next 406461746173657420782e526f772028206120290a 4062 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=9 0 next 406461746173657420782e526f772028206120290a 4061 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=9 4200 next 406461746173657420782e526f772028206120290a 4061 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=9 4100 next 406461746173657420782e526f772028206120290a 4061 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=10 0 next 406461746173657420782e526f772028206120290a 4060 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=10 4200 next 406461746173657420782e526f772028206120290a 4060 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=10 4100 next 406461746173657420782e526f772028206120290a 4060 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=11 0 next 406461746173657420782e526f772028206120290a 4059 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=11 4200 next 406461746173657420782e526f772028206120290a 4059 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=11 4100 next 406461746173657420782e526f772028206120290a 4059 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=12 0 next 406461746173657420782e526f772028206120290a 4058 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=12 4200 next 406461746173657420782e526f772028206120290a 4058 282035c2b57320290a28203220290a rows=3 EOF +boundary duration k=12 4100 next 406461746173657420782e526f772028206120290a 4058 282035c2b57320290a28203220290a rows=3 EOF +boundary comments k=0 0 next 406461746173657420782e526f772028206120290a 4070 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=0 4200 next 406461746173657420782e526f772028206120290a 4070 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=0 4100 next 406461746173657420782e526f772028206120290a 4070 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=1 0 next 406461746173657420782e526f772028206120290a 4069 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=1 4200 next 406461746173657420782e526f772028206120290a 4069 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=1 4100 next 406461746173657420782e526f772028206120290a 4069 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=2 0 next 406461746173657420782e526f772028206120290a 4068 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=2 4200 next 406461746173657420782e526f772028206120290a 4068 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=2 4100 next 406461746173657420782e526f772028206120290a 4068 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=3 0 next 406461746173657420782e526f772028206120290a 4067 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=3 4200 next 406461746173657420782e526f772028206120290a 4067 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=3 4100 next 406461746173657420782e526f772028206120290a 4067 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=4 0 next 406461746173657420782e526f772028206120290a 4066 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=4 4200 next 406461746173657420782e526f772028206120290a 4066 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=4 4100 next 406461746173657420782e526f772028206120290a 4066 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=5 0 next 406461746173657420782e526f772028206120290a 4065 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=5 4200 next 406461746173657420782e526f772028206120290a 4065 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=5 4100 next 406461746173657420782e526f772028206120290a 4065 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=6 0 next 406461746173657420782e526f772028206120290a 4064 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=6 4200 next 406461746173657420782e526f772028206120290a 4064 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=6 4100 next 406461746173657420782e526f772028206120290a 4064 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=7 0 next 406461746173657420782e526f772028206120290a 4063 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=7 4200 next 406461746173657420782e526f772028206120290a 4063 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=7 4100 next 406461746173657420782e526f772028206120290a 4063 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=8 0 next 406461746173657420782e526f772028206120290a 4062 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=8 4200 next 406461746173657420782e526f772028206120290a 4062 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=8 4100 next 406461746173657420782e526f772028206120290a 4062 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=9 0 next 406461746173657420782e526f772028206120290a 4061 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=9 4200 next 406461746173657420782e526f772028206120290a 4061 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=9 4100 next 406461746173657420782e526f772028206120290a 4061 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=10 0 next 406461746173657420782e526f772028206120290a 4060 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=10 4200 next 406461746173657420782e526f772028206120290a 4060 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=10 4100 next 406461746173657420782e526f772028206120290a 4060 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=11 0 next 406461746173657420782e526f772028206120290a 4059 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=11 4200 next 406461746173657420782e526f772028206120290a 4059 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=11 4100 next 406461746173657420782e526f772028206120290a 4059 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=12 0 next 406461746173657420782e526f772028206120290a 4058 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=12 4200 next 406461746173657420782e526f772028206120290a 4058 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary comments k=12 4100 next 406461746173657420782e526f772028206120290a 4058 2f2a2063202a2f202820312029202f2f20640a2320650a28203220290a rows=3 EOF +boundary directive k=0 0 next 406461746173657420782e526f772028206120290a 4070 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=0 4200 next 406461746173657420782e526f772028206120290a 4070 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=0 4100 next 406461746173657420782e526f772028206120290a 4070 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=1 0 next 406461746173657420782e526f772028206120290a 4069 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=1 4200 next 406461746173657420782e526f772028206120290a 4069 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=1 4100 next 406461746173657420782e526f772028206120290a 4069 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=2 0 next 406461746173657420782e526f772028206120290a 4068 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=2 4200 next 406461746173657420782e526f772028206120290a 4068 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=2 4100 next 406461746173657420782e526f772028206120290a 4068 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=3 0 next 406461746173657420782e526f772028206120290a 4067 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=3 4200 next 406461746173657420782e526f772028206120290a 4067 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=3 4100 next 406461746173657420782e526f772028206120290a 4067 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=4 0 next 406461746173657420782e526f772028206120290a 4066 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=4 4200 next 406461746173657420782e526f772028206120290a 4066 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=4 4100 next 406461746173657420782e526f772028206120290a 4066 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=5 0 next 406461746173657420782e526f772028206120290a 4065 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=5 4200 next 406461746173657420782e526f772028206120290a 4065 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=5 4100 next 406461746173657420782e526f772028206120290a 4065 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=6 0 next 406461746173657420782e526f772028206120290a 4064 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=6 4200 next 406461746173657420782e526f772028206120290a 4064 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=6 4100 next 406461746173657420782e526f772028206120290a 4064 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=7 0 next 406461746173657420782e526f772028206120290a 4063 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=7 4200 next 406461746173657420782e526f772028206120290a 4063 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=7 4100 next 406461746173657420782e526f772028206120290a 4063 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=8 0 next 406461746173657420782e526f772028206120290a 4062 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=8 4200 next 406461746173657420782e526f772028206120290a 4062 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=8 4100 next 406461746173657420782e526f772028206120290a 4062 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=9 0 next 406461746173657420782e526f772028206120290a 4061 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=9 4200 next 406461746173657420782e526f772028206120290a 4061 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=9 4100 next 406461746173657420782e526f772028206120290a 4061 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=10 0 next 406461746173657420782e526f772028206120290a 4060 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=10 4200 next 406461746173657420782e526f772028206120290a 4060 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=10 4100 next 406461746173657420782e526f772028206120290a 4060 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=11 0 next 406461746173657420782e526f772028206120290a 4059 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=11 4200 next 406461746173657420782e526f772028206120290a 4059 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=11 4100 next 406461746173657420782e526f772028206120290a 4059 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=12 0 next 406461746173657420782e526f772028206120290a 4058 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=12 4200 next 406461746173657420782e526f772028206120290a 4058 28203120290a40666f6f20780a rows=2 EOF +boundary directive k=12 4100 next 406461746173657420782e526f772028206120290a 4058 28203120290a40666f6f20780a rows=2 EOF +boundary cut float k=0 0 next 406461746173657420782e526f772028206120290a 4070 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=0 4200 next 406461746173657420782e526f772028206120290a 4070 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=0 4100 next 406461746173657420782e526f772028206120290a 4070 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=1 0 next 406461746173657420782e526f772028206120290a 4069 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=1 4200 next 406461746173657420782e526f772028206120290a 4069 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=1 4100 next 406461746173657420782e526f772028206120290a 4069 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=2 0 next 406461746173657420782e526f772028206120290a 4068 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=2 4200 next 406461746173657420782e526f772028206120290a 4068 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=2 4100 next 406461746173657420782e526f772028206120290a 4068 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=3 0 next 406461746173657420782e526f772028206120290a 4067 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=3 4200 next 406461746173657420782e526f772028206120290a 4067 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=3 4100 next 406461746173657420782e526f772028206120290a 4067 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=4 0 next 406461746173657420782e526f772028206120290a 4066 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=4 4200 next 406461746173657420782e526f772028206120290a 4066 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=4 4100 next 406461746173657420782e526f772028206120290a 4066 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=5 0 next 406461746173657420782e526f772028206120290a 4065 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=5 4200 next 406461746173657420782e526f772028206120290a 4065 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=5 4100 next 406461746173657420782e526f772028206120290a 4065 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=6 0 next 406461746173657420782e526f772028206120290a 4064 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=6 4200 next 406461746173657420782e526f772028206120290a 4064 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=6 4100 next 406461746173657420782e526f772028206120290a 4064 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=7 0 next 406461746173657420782e526f772028206120290a 4063 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=7 4200 next 406461746173657420782e526f772028206120290a 4063 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=7 4100 next 406461746173657420782e526f772028206120290a 4063 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=8 0 next 406461746173657420782e526f772028206120290a 4062 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=8 4200 next 406461746173657420782e526f772028206120290a 4062 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=8 4100 next 406461746173657420782e526f772028206120290a 4062 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=9 0 next 406461746173657420782e526f772028206120290a 4061 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=9 4200 next 406461746173657420782e526f772028206120290a 4061 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=9 4100 next 406461746173657420782e526f772028206120290a 4061 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=10 0 next 406461746173657420782e526f772028206120290a 4060 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=10 4200 next 406461746173657420782e526f772028206120290a 4060 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=10 4100 next 406461746173657420782e526f772028206120290a 4060 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=11 0 next 406461746173657420782e526f772028206120290a 4059 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=11 4200 next 406461746173657420782e526f772028206120290a 4059 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=11 4100 next 406461746173657420782e526f772028206120290a 4059 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=12 0 next 406461746173657420782e526f772028206120290a 4058 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=12 4200 next 406461746173657420782e526f772028206120290a 4058 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut float k=12 4100 next 406461746173657420782e526f772028206120290a 4058 2820312e35 rows=1 3:6: expected ',' or ')' in @dataset row, got EOF +boundary cut string k=0 0 next 406461746173657420782e526f772028206120290a 4070 282022616263 rows=1 3:3: unterminated string +boundary cut string k=0 4200 next 406461746173657420782e526f772028206120290a 4070 282022616263 rows=1 3:3: unterminated string +boundary cut string k=0 4100 next 406461746173657420782e526f772028206120290a 4070 282022616263 rows=1 3:3: unterminated string +boundary cut string k=1 0 next 406461746173657420782e526f772028206120290a 4069 282022616263 rows=1 3:3: unterminated string +boundary cut string k=1 4200 next 406461746173657420782e526f772028206120290a 4069 282022616263 rows=1 3:3: unterminated string +boundary cut string k=1 4100 next 406461746173657420782e526f772028206120290a 4069 282022616263 rows=1 3:3: unterminated string +boundary cut string k=2 0 next 406461746173657420782e526f772028206120290a 4068 282022616263 rows=1 3:3: unterminated string +boundary cut string k=2 4200 next 406461746173657420782e526f772028206120290a 4068 282022616263 rows=1 3:3: unterminated string +boundary cut string k=2 4100 next 406461746173657420782e526f772028206120290a 4068 282022616263 rows=1 3:3: unterminated string +boundary cut string k=3 0 next 406461746173657420782e526f772028206120290a 4067 282022616263 rows=1 3:3: unterminated string +boundary cut string k=3 4200 next 406461746173657420782e526f772028206120290a 4067 282022616263 rows=1 3:3: unterminated string +boundary cut string k=3 4100 next 406461746173657420782e526f772028206120290a 4067 282022616263 rows=1 3:3: unterminated string +boundary cut string k=4 0 next 406461746173657420782e526f772028206120290a 4066 282022616263 rows=1 3:3: unterminated string +boundary cut string k=4 4200 next 406461746173657420782e526f772028206120290a 4066 282022616263 rows=1 3:3: unterminated string +boundary cut string k=4 4100 next 406461746173657420782e526f772028206120290a 4066 282022616263 rows=1 3:3: unterminated string +boundary cut string k=5 0 next 406461746173657420782e526f772028206120290a 4065 282022616263 rows=1 3:3: unterminated string +boundary cut string k=5 4200 next 406461746173657420782e526f772028206120290a 4065 282022616263 rows=1 3:3: unterminated string +boundary cut string k=5 4100 next 406461746173657420782e526f772028206120290a 4065 282022616263 rows=1 3:3: unterminated string +boundary cut string k=6 0 next 406461746173657420782e526f772028206120290a 4064 282022616263 rows=1 3:3: unterminated string +boundary cut string k=6 4200 next 406461746173657420782e526f772028206120290a 4064 282022616263 rows=1 3:3: unterminated string +boundary cut string k=6 4100 next 406461746173657420782e526f772028206120290a 4064 282022616263 rows=1 3:3: unterminated string +boundary cut string k=7 0 next 406461746173657420782e526f772028206120290a 4063 282022616263 rows=1 3:3: unterminated string +boundary cut string k=7 4200 next 406461746173657420782e526f772028206120290a 4063 282022616263 rows=1 3:3: unterminated string +boundary cut string k=7 4100 next 406461746173657420782e526f772028206120290a 4063 282022616263 rows=1 3:3: unterminated string +boundary cut string k=8 0 next 406461746173657420782e526f772028206120290a 4062 282022616263 rows=1 3:3: unterminated string +boundary cut string k=8 4200 next 406461746173657420782e526f772028206120290a 4062 282022616263 rows=1 3:3: unterminated string +boundary cut string k=8 4100 next 406461746173657420782e526f772028206120290a 4062 282022616263 rows=1 3:3: unterminated string +boundary cut string k=9 0 next 406461746173657420782e526f772028206120290a 4061 282022616263 rows=1 3:3: unterminated string +boundary cut string k=9 4200 next 406461746173657420782e526f772028206120290a 4061 282022616263 rows=1 3:3: unterminated string +boundary cut string k=9 4100 next 406461746173657420782e526f772028206120290a 4061 282022616263 rows=1 3:3: unterminated string +boundary cut string k=10 0 next 406461746173657420782e526f772028206120290a 4060 282022616263 rows=1 3:3: unterminated string +boundary cut string k=10 4200 next 406461746173657420782e526f772028206120290a 4060 282022616263 rows=1 3:3: unterminated string +boundary cut string k=10 4100 next 406461746173657420782e526f772028206120290a 4060 282022616263 rows=1 3:3: unterminated string +boundary cut string k=11 0 next 406461746173657420782e526f772028206120290a 4059 282022616263 rows=1 3:3: unterminated string +boundary cut string k=11 4200 next 406461746173657420782e526f772028206120290a 4059 282022616263 rows=1 3:3: unterminated string +boundary cut string k=11 4100 next 406461746173657420782e526f772028206120290a 4059 282022616263 rows=1 3:3: unterminated string +boundary cut string k=12 0 next 406461746173657420782e526f772028206120290a 4058 282022616263 rows=1 3:3: unterminated string +boundary cut string k=12 4200 next 406461746173657420782e526f772028206120290a 4058 282022616263 rows=1 3:3: unterminated string +boundary cut string k=12 4100 next 406461746173657420782e526f772028206120290a 4058 282022616263 rows=1 3:3: unterminated string +boundary newline in string k=0 0 next 406461746173657420782e526f772028206120290a 4070 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=0 4200 next 406461746173657420782e526f772028206120290a 4070 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=0 4100 next 406461746173657420782e526f772028206120290a 4070 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=1 0 next 406461746173657420782e526f772028206120290a 4069 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=1 4200 next 406461746173657420782e526f772028206120290a 4069 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=1 4100 next 406461746173657420782e526f772028206120290a 4069 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=2 0 next 406461746173657420782e526f772028206120290a 4068 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=2 4200 next 406461746173657420782e526f772028206120290a 4068 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=2 4100 next 406461746173657420782e526f772028206120290a 4068 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=3 0 next 406461746173657420782e526f772028206120290a 4067 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=3 4200 next 406461746173657420782e526f772028206120290a 4067 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=3 4100 next 406461746173657420782e526f772028206120290a 4067 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=4 0 next 406461746173657420782e526f772028206120290a 4066 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=4 4200 next 406461746173657420782e526f772028206120290a 4066 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=4 4100 next 406461746173657420782e526f772028206120290a 4066 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=5 0 next 406461746173657420782e526f772028206120290a 4065 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=5 4200 next 406461746173657420782e526f772028206120290a 4065 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=5 4100 next 406461746173657420782e526f772028206120290a 4065 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=6 0 next 406461746173657420782e526f772028206120290a 4064 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=6 4200 next 406461746173657420782e526f772028206120290a 4064 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=6 4100 next 406461746173657420782e526f772028206120290a 4064 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=7 0 next 406461746173657420782e526f772028206120290a 4063 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=7 4200 next 406461746173657420782e526f772028206120290a 4063 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=7 4100 next 406461746173657420782e526f772028206120290a 4063 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=8 0 next 406461746173657420782e526f772028206120290a 4062 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=8 4200 next 406461746173657420782e526f772028206120290a 4062 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=8 4100 next 406461746173657420782e526f772028206120290a 4062 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=9 0 next 406461746173657420782e526f772028206120290a 4061 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=9 4200 next 406461746173657420782e526f772028206120290a 4061 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=9 4100 next 406461746173657420782e526f772028206120290a 4061 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=10 0 next 406461746173657420782e526f772028206120290a 4060 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=10 4200 next 406461746173657420782e526f772028206120290a 4060 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=10 4100 next 406461746173657420782e526f772028206120290a 4060 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=11 0 next 406461746173657420782e526f772028206120290a 4059 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=11 4200 next 406461746173657420782e526f772028206120290a 4059 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=11 4100 next 406461746173657420782e526f772028206120290a 4059 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=12 0 next 406461746173657420782e526f772028206120290a 4058 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=12 4200 next 406461746173657420782e526f772028206120290a 4058 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary newline in string k=12 4100 next 406461746173657420782e526f772028206120290a 4058 28202261620a632220290a rows=1 3:3: newline in string literal: write it as \n, or use a """triple-quoted""" string +boundary junk k=0 0 next 406461746173657420782e526f772028206120290a 4070 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=0 4200 next 406461746173657420782e526f772028206120290a 4070 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=0 4100 next 406461746173657420782e526f772028206120290a 4070 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=1 0 next 406461746173657420782e526f772028206120290a 4069 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=1 4200 next 406461746173657420782e526f772028206120290a 4069 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=1 4100 next 406461746173657420782e526f772028206120290a 4069 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=2 0 next 406461746173657420782e526f772028206120290a 4068 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=2 4200 next 406461746173657420782e526f772028206120290a 4068 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=2 4100 next 406461746173657420782e526f772028206120290a 4068 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=3 0 next 406461746173657420782e526f772028206120290a 4067 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=3 4200 next 406461746173657420782e526f772028206120290a 4067 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=3 4100 next 406461746173657420782e526f772028206120290a 4067 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=4 0 next 406461746173657420782e526f772028206120290a 4066 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=4 4200 next 406461746173657420782e526f772028206120290a 4066 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=4 4100 next 406461746173657420782e526f772028206120290a 4066 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=5 0 next 406461746173657420782e526f772028206120290a 4065 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=5 4200 next 406461746173657420782e526f772028206120290a 4065 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=5 4100 next 406461746173657420782e526f772028206120290a 4065 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=6 0 next 406461746173657420782e526f772028206120290a 4064 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=6 4200 next 406461746173657420782e526f772028206120290a 4064 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=6 4100 next 406461746173657420782e526f772028206120290a 4064 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=7 0 next 406461746173657420782e526f772028206120290a 4063 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=7 4200 next 406461746173657420782e526f772028206120290a 4063 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=7 4100 next 406461746173657420782e526f772028206120290a 4063 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=8 0 next 406461746173657420782e526f772028206120290a 4062 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=8 4200 next 406461746173657420782e526f772028206120290a 4062 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=8 4100 next 406461746173657420782e526f772028206120290a 4062 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=9 0 next 406461746173657420782e526f772028206120290a 4061 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=9 4200 next 406461746173657420782e526f772028206120290a 4061 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=9 4100 next 406461746173657420782e526f772028206120290a 4061 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=10 0 next 406461746173657420782e526f772028206120290a 4060 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=10 4200 next 406461746173657420782e526f772028206120290a 4060 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=10 4100 next 406461746173657420782e526f772028206120290a 4060 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=11 0 next 406461746173657420782e526f772028206120290a 4059 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=11 4200 next 406461746173657420782e526f772028206120290a 4059 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=11 4100 next 406461746173657420782e526f772028206120290a 4059 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=12 0 next 406461746173657420782e526f772028206120290a 4058 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=12 4200 next 406461746173657420782e526f772028206120290a 4058 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary junk k=12 4100 next 406461746173657420782e526f772028206120290a 4058 28203120290a78797a0a rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=0 0 next 406461746173657420782e526f772028206120290a 4070 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=0 4200 next 406461746173657420782e526f772028206120290a 4070 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=0 4100 next 406461746173657420782e526f772028206120290a 4070 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=1 0 next 406461746173657420782e526f772028206120290a 4069 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=1 4200 next 406461746173657420782e526f772028206120290a 4069 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=1 4100 next 406461746173657420782e526f772028206120290a 4069 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=2 0 next 406461746173657420782e526f772028206120290a 4068 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=2 4200 next 406461746173657420782e526f772028206120290a 4068 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=2 4100 next 406461746173657420782e526f772028206120290a 4068 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=3 0 next 406461746173657420782e526f772028206120290a 4067 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=3 4200 next 406461746173657420782e526f772028206120290a 4067 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=3 4100 next 406461746173657420782e526f772028206120290a 4067 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=4 0 next 406461746173657420782e526f772028206120290a 4066 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=4 4200 next 406461746173657420782e526f772028206120290a 4066 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=4 4100 next 406461746173657420782e526f772028206120290a 4066 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=5 0 next 406461746173657420782e526f772028206120290a 4065 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=5 4200 next 406461746173657420782e526f772028206120290a 4065 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=5 4100 next 406461746173657420782e526f772028206120290a 4065 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=6 0 next 406461746173657420782e526f772028206120290a 4064 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=6 4200 next 406461746173657420782e526f772028206120290a 4064 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=6 4100 next 406461746173657420782e526f772028206120290a 4064 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=7 0 next 406461746173657420782e526f772028206120290a 4063 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=7 4200 next 406461746173657420782e526f772028206120290a 4063 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=7 4100 next 406461746173657420782e526f772028206120290a 4063 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=8 0 next 406461746173657420782e526f772028206120290a 4062 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=8 4200 next 406461746173657420782e526f772028206120290a 4062 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=8 4100 next 406461746173657420782e526f772028206120290a 4062 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=9 0 next 406461746173657420782e526f772028206120290a 4061 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=9 4200 next 406461746173657420782e526f772028206120290a 4061 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=9 4100 next 406461746173657420782e526f772028206120290a 4061 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=10 0 next 406461746173657420782e526f772028206120290a 4060 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=10 4200 next 406461746173657420782e526f772028206120290a 4060 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=10 4100 next 406461746173657420782e526f772028206120290a 4060 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=11 0 next 406461746173657420782e526f772028206120290a 4059 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=11 4200 next 406461746173657420782e526f772028206120290a 4059 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=11 4100 next 406461746173657420782e526f772028206120290a 4059 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=12 0 next 406461746173657420782e526f772028206120290a 4058 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=12 4200 next 406461746173657420782e526f772028206120290a 4058 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) +boundary open block comment k=12 4100 next 406461746173657420782e526f772028206120290a 4058 28203120290a2f2a20616263 rows=2 4:1: @dataset directive cannot coexist with top-level field entries; the document's payload is the @dataset rows (draft §3.4.4) diff --git a/tools/dataset_stream_sweep/go.mod b/tools/dataset_stream_sweep/go.mod new file mode 100644 index 0000000..723669b --- /dev/null +++ b/tools/dataset_stream_sweep/go.mod @@ -0,0 +1,8 @@ +module github.com/trendvidia/protowire-cpp/tools/dataset_stream_sweep + +go 1.26.2 + +require ( + github.com/trendvidia/protowire-go v1.16.1 + google.golang.org/protobuf v1.36.12 +) diff --git a/tools/dataset_stream_sweep/main.go b/tools/dataset_stream_sweep/main.go new file mode 100644 index 0000000..17b50e6 --- /dev/null +++ b/tools/dataset_stream_sweep/main.go @@ -0,0 +1,172 @@ +// Copyright 2026 TrendVidia LLC +// SPDX-License-Identifier: MIT + +// dataset_stream_sweep writes protowire-go's verdict on streaming @dataset +// inputs, for testdata/dataset-stream/go_sweep.tsv (#164): rows and headers +// cut short, junk where a row could begin, the cap on the bytes held while +// a row's end is sought, and the 4096-byte read boundary falling at every +// offset in and around a row. Each line is name, MaxMessageSize, mode (next or scan, which +// binds into google.protobuf.FileOptions), head, pad, tail and the result: +// the rows read, then EOF or the error. The input is head, then a row of pad +// 'p' characters in a string when pad >= 0, then tail; head and tail are hex. +// +// cd tools/dataset_stream_sweep +// GOWORK=off GOFLAGS=-mod=mod go mod edit -replace github.com/trendvidia/protowire-go=../../../protowire-go +// GOWORK=off GOFLAGS=-mod=mod go run . ../../testdata/dataset > ../../testdata/dataset-stream/go_sweep.tsv +// +// The table above was written by protowire-go v1.16.1 (903b4a7). +package main + +import ( + "encoding/hex" + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/trendvidia/protowire-go/encoding/pxf" + "google.golang.org/protobuf/types/descriptorpb" +) + +type tc struct { + name string + mms int + scan bool + head string + pad int + tail string +} + +func (c tc) input() string { + if c.pad < 0 { + return c.head + c.tail + } + return c.head + "(\"" + strings.Repeat("p", c.pad) + "\")\n" + c.tail +} + +func run(c tc) string { + tr, err := pxf.UnmarshalOptions{MaxMessageSize: c.mms}.NewDatasetReader(strings.NewReader(c.input())) + if err != nil { + return "create: " + err.Error() + } + for i := 0; ; i++ { + if c.scan { + err = tr.Scan(&descriptorpb.FileOptions{}) + } else { + _, err = tr.Next() + } + if err != nil { + return fmt.Sprintf("rows=%d %v", i, err) + } + } +} + +const h = "@dataset x.Row ( a )\n" + +func main() { + if len(os.Args) != 2 { + fmt.Fprintln(os.Stderr, "usage: dataset_stream_sweep ") + os.Exit(2) + } + var cases []tc + for _, f := range []string{"truncated-row-eof", "truncated-row-then-rows", "junk-between-rows", "rows-end-at-directive"} { + b, err := os.ReadFile(filepath.Join(os.Args[1], f+".pxf")) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + cases = append(cases, tc{f, 0, false, string(b), -1, ""}) + } + for _, c := range []struct{ name, rows string }{ + {"no close", "(\"yy\"\n"}, + {"newline in string", "(\"yy\n"}, + {"unterminated string at eof", "(\"yy"}, + {"unterminated bytes", "(b\"QUJD\n"}, + {"unterminated triple", "(\"\"\"abc\n"}, + {"open paren in row", "( 1 )\n( (2) )\n"}, + {"bare at", "( 1 )\n@ x\n"}, + {"at digits", "( 1 )\n@1\n"}, + {"directive", "( 1 )\n@foo x\n"}, + {"block comment open between rows", "( 1 )\n/* abc"}, + {"block comment open in row", "( 1 /* abc"}, + {"junk at eof", "( 1 )\nxyz"}, + {"brace at eof", "( 1 )\n}"}, + {"field entry", "( 1 )\nfoo = 1\n"}, + {"comments after rows", "( 1 ) # c\n// d\n/* e */\n( 2 )\n# end"}, + {"illegal in row", "( 1 $ )\n"}, + {"illegal between rows", "( 1 )\n$\n"}, + {"lone paren", "( "}, + {"close paren between rows", "( 1 )\n)\n"}, + } { + cases = append(cases, tc{c.name, 0, false, h + c.rows, -1, ""}) + } + // A header cut short or broken reports what Parse reports for it. + for _, c := range []struct{ name, in string }{ + {"header cut", "@dataset x.Row ( a"}, + {"header cut after type", "@dataset x.Row"}, + {"header cols cut", "@dataset x.Row ( a, "}, + {"header string open", "@foo \"abc\n@dataset x.Row ( a )\n( 1 )\n"}, + {"header comment open", "/* abc\n@dataset x.Row ( a )\n"}, + {"header bytes open", "@foo b\"QUJD\n@dataset x.Row ( a )\n"}, + {"header illegal", "$ @dataset x.Row ( a )\n"}, + {"header paren in string", "@foo \"(\" @dataset x.Row ( a )\n( 1 )\n"}, + {"header proto body", "@proto x.Row { string a = 1; }\n@dataset x.Row ( a )\n( 1 )\n"}, + {"header proto paren", "@proto x.Row { // (\n string a = 1; }\n@dataset x.Row ( a )\n( 1 )\n"}, + {"header proto string open", "@proto x.Row { option x = \"a\n; }\n@dataset x.Row ( a )\n"}, + {"header proto cut", "@proto x.Row { string a = 1;\n"}, + {"header no dataset", "@foo x\n"}, + {"header empty", ""}, + } { + cases = append(cases, tc{c.name, 0, false, c.in, -1, ""}) + } + cases = append(cases, + tc{"open row over a small cap", 56, false, h + "(\"", 10000, ""}, + tc{"open row over 5000", 5000, false, h + "(\"" + strings.Repeat("x", 10000), -1, ""}, + tc{"doc over a small cap", 30, false, h + "( 1 )\n( 2 )\n", -1, ""}, + tc{"rows past 4096, cap 4200", 4200, false, h + strings.Repeat("( 1 )\n", 2000), -1, ""}, + tc{"rows past 4096, cap 4096", 4096, false, h + strings.Repeat("( 1 )\n", 2000), -1, ""}, + ) + // Scan: a row read after the first 4096 bytes, whose body repeats the + // column name and so is wider than MaxMessageSize, while the bytes held + // are not. + head := "@dataset google.protobuf.FileOptions ( php_metadata_namespace )\n" + wide := "(\"" + strings.Repeat("v", 4480) + "\")\n" + pad := 4096 - len(head) - len("(\"\")\n") + cases = append(cases, + tc{"scan body wider than the cap", 4500, true, head, pad, wide}, + tc{"scan body under the default cap", 0, true, head, pad, wide}, + ) + // The read boundary at 4096 falls at every offset in and around each row. + targets := []struct{ name, rows string }{ + {"float", "( 1.5 )\n( 2 )\n"}, + {"neg inf", "( -inf )\n( 2 )\n"}, + {"string", "( \"abc\" )\n( 2 )\n"}, + {"triple", "( \"\"\"abc\"\"\" )\n( 2 )\n"}, + {"bytes", "( b\"QUJD\" )\n( 2 )\n"}, + {"timestamp", "( 2024-01-02T03:04:05Z )\n( 2 )\n"}, + {"duration", "( 5µs )\n( 2 )\n"}, + {"comments", "/* c */ ( 1 ) // d\n# e\n( 2 )\n"}, + {"directive", "( 1 )\n@foo x\n"}, + {"cut float", "( 1.5"}, + {"cut string", "( \"abc"}, + {"newline in string", "( \"ab\nc\" )\n"}, + {"junk", "( 1 )\nxyz\n"}, + {"open block comment", "( 1 )\n/* abc"}, + } + for _, t := range targets { + for k := 0; k <= 12; k++ { + pad := 4096 - k - len(h) - len("(\"\")\n") + for _, mms := range []int{0, 4200, 4100} { + cases = append(cases, tc{fmt.Sprintf("boundary %s k=%d", t.name, k), mms, false, h, pad, t.rows}) + } + } + } + for _, c := range cases { + mode := "next" + if c.scan { + mode = "scan" + } + fmt.Printf("%s\t%d\t%s\t%s\t%d\t%s\t%s\n", c.name, c.mms, mode, + hex.EncodeToString([]byte(c.head)), c.pad, hex.EncodeToString([]byte(c.tail)), run(c)) + } +} From 50953c557cefeabef91a06ba17be45b36b0864b2 Mon Sep 17 00:00:00 2001 From: "Benedicto Franco Jr." Date: Fri, 6 Nov 2026 19:32:41 -0800 Subject: [PATCH 2/2] pxf: DatasetReader::RowScan is a uint8_t enum (clang-tidy performance-enum-size) --- include/protowire/pxf/dataset_reader.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/protowire/pxf/dataset_reader.h b/include/protowire/pxf/dataset_reader.h index 2642559..47f3df5 100644 --- a/include/protowire/pxf/dataset_reader.h +++ b/include/protowire/pxf/dataset_reader.h @@ -24,6 +24,7 @@ #pragma once +#include #include #include #include @@ -124,7 +125,7 @@ class DatasetReader { DatasetReader() = default; // What ScanRow or ScanHeader found; see dataset_reader.cc. - enum class RowScan { kNeedMore, kRow, kBad, kEnd, kNotRow }; + enum class RowScan : uint8_t { kNeedMore, kRow, kBad, kEnd, kNotRow }; Status ReadHeader(); Status Pull(size_t n);