nmarshall commited on
Commit
6d0ce63
·
1 Parent(s): f3fe185

gameplay: port session restore and scratch ownership

Browse files
crates/urt-gameplay/src/bin/urt-native-policy.rs CHANGED
@@ -451,6 +451,62 @@ fn run() -> Result<String, String> {
451
  .unwrap_or("null".into())
452
  ))
453
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
454
  _ => Err("unknown command".into()),
455
  }
456
  }
 
451
  .unwrap_or("null".into())
452
  ))
453
  }
454
+ "restore-session" => {
455
+ if w.len() < 83 {
456
+ return Err("missing restore header".into());
457
+ }
458
+ let mut p = 83;
459
+ let session = input_blob(&w, &mut p)?.ok_or("null session")?;
460
+ let ignore = input_blob(&w, &mut p)?.ok_or("null ignore")?;
461
+ let info = input_blob(&w, &mut p)?.ok_or("null info")?;
462
+ let data = input_blob(&w, &mut p)?.ok_or("null data")?;
463
+ if p != w.len() {
464
+ return Err("trailing restore words".into());
465
+ }
466
+ let mut state = RestoreState {
467
+ values: std::array::from_fn(|j| w[4 + j] as i32),
468
+ ignore: std::array::from_fn(|j| w[13 + j] as i32),
469
+ position: w[77..83].try_into().unwrap(),
470
+ };
471
+ let mut ring = 0;
472
+ let out = restore_session(
473
+ &mut state,
474
+ RestoreInput {
475
+ flags: w[1],
476
+ session: &session,
477
+ ignore_text: &ignore,
478
+ scratch: [w[3]; 5],
479
+ position: PositionInput {
480
+ mode: w[0] as i32,
481
+ enabled: 1,
482
+ slot: w[2] as usize,
483
+ userinfo: &info,
484
+ mapname: b"ut4_test",
485
+ name: b"",
486
+ values: [0; 6],
487
+ handle: 7,
488
+ },
489
+ file_length: data.len() as i32,
490
+ file_data: &data,
491
+ },
492
+ &mut ring,
493
+ )
494
+ .map_err(|e| format!("{e:?}"))?;
495
+ Ok(format!(
496
+ "{{\"scan_result\":{},\"values\":{},\"ignore\":{},\"origin\":{},\"ring\":{},\"info_ring\":{ring},\"cvars\":{},\"load_events\":{},\"load_scan\":{}}}",
497
+ out.scan_result,
498
+ list(&state.values.map(|v| v as u32)),
499
+ list(&state.ignore.map(|v| v as u32)),
500
+ list(&state.position),
501
+ out.ring_advance,
502
+ sets_json(&out.cvars),
503
+ position_events(&out.position.io.events),
504
+ out.position
505
+ .scan_result
506
+ .map(|v| v.to_string())
507
+ .unwrap_or("null".into())
508
+ ))
509
+ }
510
  _ => Err("unknown command".into()),
511
  }
512
  }
crates/urt-gameplay/src/native_policy.rs CHANGED
@@ -780,12 +780,7 @@ pub struct NumericScan {
780
  /// returns-1 and preserves remaining caller-supplied destination words.
781
  pub fn scan_numeric(text: &[u8], kind: NumericKind, initial: &[u32]) -> Result<NumericScan, Error> {
782
  let text = text.split(|v| *v == 0).next().unwrap_or_default();
783
- if initial.is_empty()
784
- || initial.len() > 9
785
- || text.len() > 4096
786
- || !text.is_ascii()
787
- || kind == NumericKind::Float && text.contains(&b'E')
788
- {
789
  return Err(Error::InvalidInput);
790
  }
791
  let mut p = 0;
@@ -831,6 +826,9 @@ pub fn scan_numeric(text: &[u8], kind: NumericKind, initial: &[u32]) -> Result<N
831
  p += 1;
832
  }
833
  }
 
 
 
834
  let x = x * sign;
835
  if !x.is_finite() {
836
  return Err(Error::NonFinite);
@@ -1141,3 +1139,196 @@ mod load_position_tests {
1141
  assert_eq!(out.io.events.last(), Some(&PositionEvent::Close(9)));
1142
  }
1143
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
780
  /// returns-1 and preserves remaining caller-supplied destination words.
781
  pub fn scan_numeric(text: &[u8], kind: NumericKind, initial: &[u32]) -> Result<NumericScan, Error> {
782
  let text = text.split(|v| *v == 0).next().unwrap_or_default();
783
+ if initial.is_empty() || initial.len() > 9 || text.len() > 4096 || !text.is_ascii() {
 
 
 
 
 
784
  return Err(Error::InvalidInput);
785
  }
786
  let mut p = 0;
 
826
  p += 1;
827
  }
828
  }
829
+ if p < text.len() && text[p] == b'E' {
830
+ return Err(Error::InvalidInput);
831
+ }
832
  let x = x * sign;
833
  if !x.is_finite() {
834
  return Err(Error::NonFinite);
 
1139
  assert_eq!(out.io.events.last(), Some(&PositionEvent::Close(9)));
1140
  }
1141
  }
1142
+
1143
+ #[derive(Clone, Debug, PartialEq, Eq)]
1144
+ pub struct RestoreState {
1145
+ pub values: [i32; 9],
1146
+ pub ignore: [i32; 64],
1147
+ pub position: [u32; 6],
1148
+ }
1149
+ pub struct RestoreInput<'a> {
1150
+ pub flags: u32,
1151
+ pub session: &'a [u8],
1152
+ pub ignore_text: &'a [u8],
1153
+ pub scratch: [u32; 5],
1154
+ pub position: PositionInput<'a>,
1155
+ pub file_length: i32,
1156
+ pub file_data: &'a [u8],
1157
+ }
1158
+ #[derive(Clone, Debug, PartialEq, Eq)]
1159
+ pub struct RestoredSession {
1160
+ pub scan_result: i32,
1161
+ pub cvars: Vec<(Vec<u8>, Vec<u8>)>,
1162
+ pub position: PositionLoad,
1163
+ pub ring_advance: u32,
1164
+ }
1165
+ fn signed_prefix(v: &[u8]) -> i32 {
1166
+ let mut p = 0;
1167
+ while p < v.len() && (v[p] as i8) <= 32 {
1168
+ p += 1;
1169
+ }
1170
+ if p == v.len() {
1171
+ return 0;
1172
+ }
1173
+ let negative = v[p] == b'-';
1174
+ if matches!(v[p], b'+' | b'-') {
1175
+ p += 1;
1176
+ }
1177
+ let mut n = 0i32;
1178
+ while p < v.len() && v[p].is_ascii_digit() {
1179
+ n = n.wrapping_mul(10).wrapping_add((v[p] - b'0') as i32);
1180
+ p += 1;
1181
+ }
1182
+ if negative { n.wrapping_neg() } else { n }
1183
+ }
1184
+ /// Actual247219 composition. Scratch is an explicit caller-owned snapshot,
1185
+ /// required because the original ignores scanner failure and reads these words.
1186
+ pub fn restore_session(
1187
+ state: &mut RestoreState,
1188
+ input: RestoreInput<'_>,
1189
+ info_ring: &mut u32,
1190
+ ) -> Result<RestoredSession, Error> {
1191
+ if input.position.slot >= 64 {
1192
+ return Err(Error::InvalidIndex);
1193
+ }
1194
+ let mut staged = state.clone();
1195
+ let mut selector = *info_ring;
1196
+ let session = cbytes(input.session);
1197
+ let session = &session[..session.len().min(1023)];
1198
+ let ignored = cbytes(input.ignore_text);
1199
+ let ignored = &ignored[..ignored.len().min(1023)];
1200
+ let mut initial = vec![input.scratch[0]];
1201
+ initial.extend(staged.values[1..5].iter().map(|v| *v as u32));
1202
+ initial.extend_from_slice(&input.scratch[1..]);
1203
+ let scan = scan_numeric(session, NumericKind::Integer, &initial)?;
1204
+ for j in 0..5 {
1205
+ staged.values[j] = scan.words[j] as i32;
1206
+ }
1207
+ for j in 5..8 {
1208
+ staged.values[j] = i32::from(scan.words[j] as i32 > 0);
1209
+ }
1210
+ staged.values[8] = i32::from(
1211
+ scan.words[8] as i32 > 0
1212
+ && crate::intermission::team_mode(input.position.mode)
1213
+ && input.flags & 1 != 0,
1214
+ );
1215
+ let mut p = 0;
1216
+ while p < ignored.len() {
1217
+ let end = ignored[p..]
1218
+ .iter()
1219
+ .position(|v| *v == b',')
1220
+ .map(|j| p + j)
1221
+ .unwrap_or(ignored.len());
1222
+ let index = signed_prefix(&ignored[p..end]);
1223
+ if (0..64).contains(&index) {
1224
+ staged.ignore[index as usize] = 1;
1225
+ }
1226
+ p = if end < ignored.len() { end + 1 } else { end };
1227
+ }
1228
+ let slot = input.position.slot;
1229
+ let mut context = input.position;
1230
+ context.values = staged.position;
1231
+ let position = load_position(context, input.file_length, input.file_data, &mut selector)?;
1232
+ staged.position = position.values;
1233
+ let cvars = vec![
1234
+ (format!("session{slot}").into_bytes(), session.to_vec()),
1235
+ (format!("sessIgnore{slot}").into_bytes(), ignored.to_vec()),
1236
+ ];
1237
+ let ring_advance = 2 + position.io.ring_advance;
1238
+ *state = staged;
1239
+ *info_ring = selector;
1240
+ Ok(RestoredSession {
1241
+ scan_result: scan.result,
1242
+ cvars,
1243
+ position,
1244
+ ring_advance,
1245
+ })
1246
+ }
1247
+ #[cfg(test)]
1248
+ mod restore_tests {
1249
+ use super::*;
1250
+ #[test]
1251
+ fn partial_integer_parse_retains_explicit_scratch() {
1252
+ let mut state = RestoreState {
1253
+ values: [7; 9],
1254
+ ignore: [2; 64],
1255
+ position: [0; 6],
1256
+ };
1257
+ let mut ring = 0;
1258
+ let out = restore_session(
1259
+ &mut state,
1260
+ RestoreInput {
1261
+ flags: 1,
1262
+ session: b"1,-2,3",
1263
+ ignore_text: b"-1,64,x,",
1264
+ scratch: [1; 5],
1265
+ position: PositionInput {
1266
+ mode: 3,
1267
+ enabled: 1,
1268
+ slot: 0,
1269
+ userinfo: b"",
1270
+ mapname: b"",
1271
+ name: b"",
1272
+ values: [0; 6],
1273
+ handle: 0,
1274
+ },
1275
+ file_length: 0,
1276
+ file_data: b"",
1277
+ },
1278
+ &mut ring,
1279
+ )
1280
+ .unwrap();
1281
+ assert_eq!(out.scan_result, -1);
1282
+ assert_eq!(state.values, [1, 0, 7, 7, 7, 1, 1, 1, 1]);
1283
+ assert_eq!(state.ignore[0], 1);
1284
+ assert_eq!(state.ignore[1], 2);
1285
+ }
1286
+ #[test]
1287
+ fn unsupported_scan_does_not_commit_state() {
1288
+ let mut state = RestoreState {
1289
+ values: [7; 9],
1290
+ ignore: [2; 64],
1291
+ position: [0; 6],
1292
+ };
1293
+ let old = state.clone();
1294
+ let mut ring = 0;
1295
+ assert_eq!(
1296
+ restore_session(
1297
+ &mut state,
1298
+ RestoreInput {
1299
+ flags: 1,
1300
+ session: b"\xff",
1301
+ ignore_text: b"x",
1302
+ scratch: [1; 5],
1303
+ position: PositionInput {
1304
+ mode: 3,
1305
+ enabled: 1,
1306
+ slot: 0,
1307
+ userinfo: b"",
1308
+ mapname: b"",
1309
+ name: b"",
1310
+ values: [0; 6],
1311
+ handle: 0
1312
+ },
1313
+ file_length: 0,
1314
+ file_data: b""
1315
+ },
1316
+ &mut ring
1317
+ ),
1318
+ Err(Error::InvalidInput)
1319
+ );
1320
+ assert_eq!(state, old);
1321
+ assert_eq!(ring, 0);
1322
+ }
1323
+ }
1324
+
1325
+ #[cfg(test)]
1326
+ mod restore_tail_tests {
1327
+ use super::*;
1328
+ #[test]
1329
+ fn uppercase_name_after_six_floats_is_not_scanned() {
1330
+ let out = scan_numeric(b"1,2,3,4,5,6\nPLAYER", NumericKind::Float, &[0; 6]).unwrap();
1331
+ assert_eq!(out.result, 6);
1332
+ assert_eq!(out.words[5], 6f32.to_bits());
1333
+ }
1334
+ }
docs/FINDINGS.md CHANGED
@@ -1706,3 +1706,6 @@ RE-813–822 replaces the scoreboard decimal assumption with actual37914 executi
1706
 
1707
 
1708
  **RE-902:** 144 actual247219 compositions execute original scanner, signed atoi, comma search, mode classifier and246554 load. Session scan result is ignored: partial fields and explicitly supplied caller-scratch words determine subsequent values; restored booleans use>0, with the final one also requiring team mode and flag1. Ignore tokens set in-range entries to1 without clearing old entries; invalid text maps to0. Actual saved-position load follows cvar restoration. Engine cvars/file bytes and initial scratch are supplied, not assumed initialized; native ownership and full reload integration remain open. [Evidence](research/QVM_SESSION_RESTORE.md).
 
 
 
 
1706
 
1707
 
1708
  **RE-902:** 144 actual247219 compositions execute original scanner, signed atoi, comma search, mode classifier and246554 load. Session scan result is ignored: partial fields and explicitly supplied caller-scratch words determine subsequent values; restored booleans use>0, with the final one also requiring team mode and flag1. Ignore tokens set in-range entries to1 without clearing old entries; invalid text maps to0. Actual saved-position load follows cvar restoration. Engine cvars/file bytes and initial scratch are supplied, not assumed initialized; native ownership and full reload integration remain open. [Evidence](research/QVM_SESSION_RESTORE.md).
1709
+
1710
+
1711
+ **RE-903:** Rust matches144 actual247219/scanner/atoi/mode/position-load compositions, preserving ignored parse result, explicit caller scratch, positive-only booleans and final team/flag gate. Ignore entries accumulate without clearing and invalid numeric text addresses slot0. State and selector stage atomically on unsupported domains. Native cvars/files, real scratch provenance and full map reload remain open. [Evidence](research/RUST_SESSION_RESTORE.md).
docs/PROVISIONAL_TODO.md CHANGED
@@ -1740,3 +1740,9 @@ RE-901: Rust matches96 original246554 read cases, preserving mode/enabled/userin
1740
 
1741
 
1742
  RE-902: 144 actual247219 compositions execute original scanner, signed atoi, comma search, mode classifier and246554 load. Session scan result is ignored: partial fields and explicitly supplied caller-scratch words determine subsequent values; restored booleans use>0, with the final one also requiring team mode and flag1. Ignore tokens set in-range entries to1 without clearing old entries; invalid text maps to0. Actual saved-position load follows cvar restoration. Engine cvars/file bytes and initial scratch are supplied, not assumed initialized; native ownership and full reload integration remain open. Full runtime completion remains open. [Evidence](research/QVM_SESSION_RESTORE.md).
 
 
 
 
 
 
 
1740
 
1741
 
1742
  RE-902: 144 actual247219 compositions execute original scanner, signed atoi, comma search, mode classifier and246554 load. Session scan result is ignored: partial fields and explicitly supplied caller-scratch words determine subsequent values; restored booleans use>0, with the final one also requiring team mode and flag1. Ignore tokens set in-range entries to1 without clearing old entries; invalid text maps to0. Actual saved-position load follows cvar restoration. Engine cvars/file bytes and initial scratch are supplied, not assumed initialized; native ownership and full reload integration remain open. Full runtime completion remains open. [Evidence](research/QVM_SESSION_RESTORE.md).
1743
+
1744
+
1745
+ RE-903: Rust matches144 actual247219/scanner/atoi/mode/position-load compositions, preserving ignored parse result, explicit caller scratch, positive-only booleans and final team/flag gate. Ignore entries accumulate without clearing and invalid numeric text addresses slot0. State and selector stage atomically on unsupported domains. Native cvars/files, real scratch provenance and full map reload remain open. Full runtime completion remains open. [Evidence](research/RUST_SESSION_RESTORE.md).
1746
+
1747
+
1748
+ RE-894–903 completed bounded userinfo/scanner/saved-file/session-restore source and Rust contracts. RE-904 tracks remaining numeric/scratch domains, real reload and native IO/runtime integration. [Batch and next work](research/QVM_SAVED_RESTORE_BATCH.md).
docs/RESEARCH_LEDGER.md CHANGED
@@ -2225,3 +2225,13 @@ Rust matches96 original246554 read cases, preserving mode/enabled/userinfo gatin
2225
  ## 2026-10-28 — RE-902 Original session restore with actual saved-position load
2226
 
2227
  144 actual247219 compositions execute original scanner, signed atoi, comma search, mode classifier and246554 load. Session scan result is ignored: partial fields and explicitly supplied caller-scratch words determine subsequent values; restored booleans use>0, with the final one also requiring team mode and flag1. Ignore tokens set in-range entries to1 without clearing old entries; invalid text maps to0. Actual saved-position load follows cvar restoration. Engine cvars/file bytes and initial scratch are supplied, not assumed initialized; native ownership and full reload integration remain open. Focused `cargo xtask test-group qvm-session-restore` passes (10 Python tests); selected reports regenerate twice deterministically, with storage, documentation links and whitespace guards. Full suite deferred to task ten. Original assets unchanged; source fixtures do not establish complete native/runtime parity.
 
 
 
 
 
 
 
 
 
 
 
2225
  ## 2026-10-28 — RE-902 Original session restore with actual saved-position load
2226
 
2227
  144 actual247219 compositions execute original scanner, signed atoi, comma search, mode classifier and246554 load. Session scan result is ignored: partial fields and explicitly supplied caller-scratch words determine subsequent values; restored booleans use>0, with the final one also requiring team mode and flag1. Ignore tokens set in-range entries to1 without clearing old entries; invalid text maps to0. Actual saved-position load follows cvar restoration. Engine cvars/file bytes and initial scratch are supplied, not assumed initialized; native ownership and full reload integration remain open. Focused `cargo xtask test-group qvm-session-restore` passes (10 Python tests); selected reports regenerate twice deterministically, with storage, documentation links and whitespace guards. Full suite deferred to task ten. Original assets unchanged; source fixtures do not establish complete native/runtime parity.
2228
+
2229
+
2230
+ ## 2026-10-28 — RE-903 Rust session restore with caller-scratch ownership
2231
+
2232
+ Rust matches144 actual247219/scanner/atoi/mode/position-load compositions, preserving ignored parse result, explicit caller scratch, positive-only booleans and final team/flag gate. Ignore entries accumulate without clearing and invalid numeric text addresses slot0. State and selector stage atomically on unsupported domains. Native cvars/files, real scratch provenance and full map reload remain open. Focused `cargo xtask test-group rust-session-restore` passes (9 Python tests); selected reports regenerate twice deterministically, with storage, documentation links and whitespace guards. Full suite deferred to task ten. Original assets unchanged; source fixtures do not establish complete native/runtime parity.
2233
+
2234
+
2235
+ ### RE-894–903 full batch validation (2026-10-28)
2236
+
2237
+ After the tenth commit, `cargo xtask test-full --since 6e01995b` passed with the flake-declared Nix Python: 1,753 Python tests,199 Rust tests (assets10, gameplay159, xtask30),22 affected report producers regenerated twice deterministically, storage policy,469 documentation link checks and whitespace guards. No generated-report drift. Ten task commits since6e01995b; results are amended into the tenth commit. [Findings and next work](research/QVM_SAVED_RESTORE_BATCH.md).
docs/REVERSE_ENGINEERING_TODO.md CHANGED
@@ -1749,7 +1749,7 @@ Purpose: turn the supplied installation into an evidence-backed specification of
1749
  - [x] RE-893 Rust normal map transition with session persistence ([evidence](research/RUST_NORMAL_MAP_SESSION.md)).
1750
 
1751
 
1752
- - [ ] RE-894 Recover saved-position/session restore/native collision and complete map/intermission/runtime ownership ([next tasks](research/QVM_QUERIED_PERSISTENCE_BATCH.md)).
1753
 
1754
 
1755
  - [x] RE-894 Original userinfo key lookup and alternating buffers ([evidence](research/QVM_INFO_LOOKUP.md)).
@@ -1777,3 +1777,9 @@ Purpose: turn the supplied installation into an evidence-backed specification of
1777
 
1778
 
1779
  - [x] RE-902 Original session restore with actual saved-position load ([evidence](research/QVM_SESSION_RESTORE.md)).
 
 
 
 
 
 
 
1749
  - [x] RE-893 Rust normal map transition with session persistence ([evidence](research/RUST_NORMAL_MAP_SESSION.md)).
1750
 
1751
 
1752
+ - [ ] Follow-up after RE-893: recover saved-position/session restore/native collision and complete map/intermission/runtime ownership ([next tasks](research/QVM_QUERIED_PERSISTENCE_BATCH.md)).
1753
 
1754
 
1755
  - [x] RE-894 Original userinfo key lookup and alternating buffers ([evidence](research/QVM_INFO_LOOKUP.md)).
 
1777
 
1778
 
1779
  - [x] RE-902 Original session restore with actual saved-position load ([evidence](research/QVM_SESSION_RESTORE.md)).
1780
+
1781
+
1782
+ - [x] RE-903 Rust session restore with caller-scratch ownership ([evidence](research/RUST_SESSION_RESTORE.md)).
1783
+
1784
+
1785
+ - [ ] RE-904 Complete numeric/fatal/alias domains, scratch provenance, real reload and native IO/runtime integration ([next tasks](research/QVM_SAVED_RESTORE_BATCH.md)).
docs/TESTING.md CHANGED
@@ -163,3 +163,6 @@ RE-874–883 adds focused groups `qvm-bot-best`, `rust-bot-best`, `qvm-bot-breed
163
 
164
 
165
  RE-884–893 adds focused groups `qvm-queried-spawn`, `rust-queried-spawn`, `qvm-queried-camera`, `rust-queried-camera`, `qvm-session-write`, `rust-session-write`, `qvm-post-map-session`, `rust-post-map-session`, `qvm-normal-map-session` and `rust-normal-map-session`. Invoke one group per `cargo xtask test-group <name>`. Full batch validation after task ten uses `cargo xtask test-full --since b9a94452` with explicit flake-declared Nix PYTHON. [Evidence and limits](research/QVM_QUERIED_PERSISTENCE_BATCH.md).
 
 
 
 
163
 
164
 
165
  RE-884–893 adds focused groups `qvm-queried-spawn`, `rust-queried-spawn`, `qvm-queried-camera`, `rust-queried-camera`, `qvm-session-write`, `rust-session-write`, `qvm-post-map-session`, `rust-post-map-session`, `qvm-normal-map-session` and `rust-normal-map-session`. Invoke one group per `cargo xtask test-group <name>`. Full batch validation after task ten uses `cargo xtask test-full --since b9a94452` with explicit flake-declared Nix PYTHON. [Evidence and limits](research/QVM_QUERIED_PERSISTENCE_BATCH.md).
166
+
167
+
168
+ RE-894–903 adds focused groups `qvm-info-lookup`, `rust-info-lookup`, `qvm-numeric-scan`, `rust-numeric-scan`, `qvm-position-save`, `rust-position-save`, `qvm-position-load`, `rust-position-load`, `qvm-session-restore` and `rust-session-restore`. Use one group per invocation. Full validation after task ten uses `cargo xtask test-full --since 6e01995b` with explicit flake-declared Nix PYTHON. [Source domains and scratch ownership](research/QVM_SAVED_RESTORE_BATCH.md).
docs/research/QVM_QUERIED_PERSISTENCE_BATCH.md CHANGED
@@ -41,7 +41,7 @@ Focused `cargo xtask test-group <name>` ran before each task commit, with determ
41
 
42
  Dependency-selection regression coverage includes all five source/Rust report pairs, camera/native-policy consumers, and the transition, formatting and map-command dependencies of normal session composition. Python uses only the resolved Nix runtime declared by flake.nix, with explicit PYTHON for xtask and Git hooks. No original asset payload changed. After commit ten, `cargo xtask test-full --since b9a94452` passed once: 1,738 Python tests and188 Rust tests (assets10, gameplay148, xtask30). All33 affected report producers regenerated twice deterministically. Storage policy, links across458 documentation files and whitespace checks passed with no generated-report drift. These notes were amended into task ten.
43
 
44
- ## Next work: RE-894
45
 
46
  - [ ] Recover246746 saved-position behavior, actual userinfo70503 lookup, GUID/map path generation, floating formatter70386, native file write/close and ownership/error branches.
47
  - [ ] Recover session restore and clear246938 callers; trace each metadata producer and ignore-table mutation, validating persistence across an actual map reload.
@@ -51,3 +51,5 @@ Dependency-selection regression coverage includes all five source/Rust report pa
51
  - [ ] Recover221662 map-list parsing and compose it with7188, normal/series6939 and readiness, including real engine cvar refresh and command dispatch.
52
  - [ ] Compose respawn175123/slow setup156523 and complete begin-intermission, plus allocator/event lifetime and real ranking/scoreboard/network integration.
53
  - [ ] Validate actual Linux/macOS Rust/Bevy/Solari gameplay and rendering. Cross-platform game completion remains open.
 
 
 
41
 
42
  Dependency-selection regression coverage includes all five source/Rust report pairs, camera/native-policy consumers, and the transition, formatting and map-command dependencies of normal session composition. Python uses only the resolved Nix runtime declared by flake.nix, with explicit PYTHON for xtask and Git hooks. No original asset payload changed. After commit ten, `cargo xtask test-full --since b9a94452` passed once: 1,738 Python tests and188 Rust tests (assets10, gameplay148, xtask30). All33 affected report producers regenerated twice deterministically. Storage policy, links across458 documentation files and whitespace checks passed with no generated-report drift. These notes were amended into task ten.
43
 
44
+ ## Follow-up work (expanded by RE-894–903)
45
 
46
  - [ ] Recover246746 saved-position behavior, actual userinfo70503 lookup, GUID/map path generation, floating formatter70386, native file write/close and ownership/error branches.
47
  - [ ] Recover session restore and clear246938 callers; trace each metadata producer and ignore-table mutation, validating persistence across an actual map reload.
 
51
  - [ ] Recover221662 map-list parsing and compose it with7188, normal/series6939 and readiness, including real engine cvar refresh and command dispatch.
52
  - [ ] Compose respawn175123/slow setup156523 and complete begin-intermission, plus allocator/event lifetime and real ranking/scoreboard/network integration.
53
  - [ ] Validate actual Linux/macOS Rust/Bevy/Solari gameplay and rendering. Cross-platform game completion remains open.
54
+
55
+ [RE-894–903](QVM_SAVED_RESTORE_BATCH.md) recovers userinfo/scanning, saved-position read/write and bounded session restore. Its RE-904 list supersedes the historical follow-up list above.
docs/research/QVM_SAVED_RESTORE_BATCH.md ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Userinfo, numeric scanning and restore: RE-894–903
2
+
3
+ Ten separately committed tasks recover original QVM persistence behavior and compare it with Rust across504 paired source cases. File handles, file bytes, engine userinfo/cvars and initial caller scratch are supplied inputs; native writes/reads/closes are captured as intentions. This evidence does not establish a playable game or native engine/file acceptance.
4
+
5
+ | Task | Evidence | Cases |
6
+ | --- | --- | ---: |
7
+ | RE-894 | [Userinfo70503 lookup](QVM_INFO_LOOKUP.md) | 96 |
8
+ | RE-895 | [Rust userinfo and selector ownership](RUST_INFO_LOOKUP.md) | 96 |
9
+ | RE-896 | [Numeric38326/38355/37159/36779 scanner](QVM_NUMERIC_SCAN.md) | 72 |
10
+ | RE-897 | [Rust comma numeric scanner](RUST_NUMERIC_SCAN.md) | 72 |
11
+ | RE-898 | [Saved-position246746 writes](QVM_POSITION_SAVE.md) | 96 |
12
+ | RE-899 | [Rust saved-position writes](RUST_POSITION_SAVE.md) | 96 |
13
+ | RE-900 | [Saved-position246554 reads](QVM_POSITION_LOAD.md) | 96 |
14
+ | RE-901 | [Rust saved-position reads](RUST_POSITION_LOAD.md) | 96 |
15
+ | RE-902 | [Session247219 restore with actual load](QVM_SESSION_RESTORE.md) | 144 |
16
+ | RE-903 | [Rust session restore and scratch ownership](RUST_SESSION_RESTORE.md) | 144 |
17
+
18
+ ## Userinfo and numeric parsing
19
+
20
+ 70503 strips an optional initial backslash, walks complete key/value pairs, compares keys case-insensitively through actual69386 and returns the first matching value. An empty matched value has a different pointer result from a miss. Non-null calls XOR selector23712 between two8192-byte buffers even on a miss; null arguments preserve the selector. Embedded NUL ends logical strings. The finite corpus covers incomplete pairs, duplicate/case-varied keys, empty values and null arguments; oversized/fatal and alias domains remain open.
21
+
22
+ Numeric38326 delegates to actual38355, which calls37159 for integers and36779 for floats. The recovered comma-template subset does not consume integer signs or leading whitespace. It writes0 for an unparsed field without incrementing the assignment count, then a literal mismatch can return-1 after earlier writes. Integer digit accumulation wraps32 bits. The float path uses f32 at each accumulation/scaling step, supports signs/decimal whitespace, and stops at lowercase e. Empty or unparsed final fields can still write0. The caller's untouched words are explicit inputs to both the Rust API and the independent oracle.
23
+
24
+ Uppercase exponent handling, non-ASCII numeric text and other scanf conversions remain outside the Rust scanner domain. Unsupported uppercase E is checked at the active numeric cursor, so a valid six-float prefix followed by newline/PLAYER is accepted without scanning the name. The source restore fixtures and a Rust regression verify that unconsumed name suffix. This is a bounded comma-template port, not a general scanner implementation.
25
+
26
+ ## Saved-position file flow
27
+
28
+ 246746 gates on mode9, then fetches userinfo and extracts cl_guid before testing enable>=1, nonempty GUID and any nonzero position component at offsets3716/3720/3724. Angles alone at3728/3732/3736 do not trigger saving. It reads mapname with capacity64, formats positions/map/GUID.pos through actual70458/37914, and opens in mode1. GUID bytes pass into this path unchanged in this body. The supplied open return is ignored; a nonzero handle requests actual70386/37914 float/name formatting, then native write and close. The file payload has six comma-separated source float values, newline, and the logical name at client offset504. Native strncpy remains modeled inside the bounded formatter wrapper.
29
+
30
+ 246554 uses the same userinfo/path gates and opens in mode0. A nonzero handle plus signed length>0 and unsigned length<1023 permits reading. Actual38326 must report exactly6 assignments before all six position/angle words are copied. Malformed/truncated input leaves the previous six words. Valid-length read paths close after scanning, including failures; invalid-length exits issue no close in this body. Native handle ownership and the engine open/close API remain unverified, so the port preserves these observed intentions rather than inferring cleanup semantics.
31
+
32
+ The load integration exposed a fixture byte-coherence gap for short userinfo values: nested handlers now transfer the returned value's exact bytes/NUL as well as changed words. The two original info-buffer domains are explicitly initialized for the fixture snapshot, providing the optimized strlen word lookahead around short values. Existing saved-write fixtures were rerun; the emitted file events stayed unchanged. These are analysis-memory fixes, not modifications to the game binary.
33
+
34
+ ## Session restore and caller scratch
35
+
36
+ 247219 requests sessionN and scans nine integers. It ignores the scanner result, stores the first temporary into field3096, and leaves the four direct destination fields subject to partial parsing. It converts the next three temporaries using signed>0; the final boolean additionally requires original33715 team classification and flag1 in35000468. A malformed session can therefore depend on previous caller-stack words. Fixtures supply two explicit scratch snapshots at the original local offsets instead of assuming initialized memory. The Rust API requires that snapshot and stages its state on unsupported-domain errors. Actual stack provenance and a production compatibility/default policy remain open.
37
+
38
+ sessIgnoreN is read separately. Actual36489 finds commas and37159 parses signed integer prefixes. Valid indices0..63 set the corresponding existing table word to1; the table is not cleared. Duplicate entries remain harmless repeated stores, negative/out-of-range indices are skipped, and invalid/empty numeric tokens can select index0. The root then executes actual246554 saved-position loading, including the original userinfo, path, scanner and file-ownership branches. The144 compositions vary modes, team flag, complete/partial/empty sessions, prior ignore words and scratch snapshots. Real cvar storage and an actual map-reload round trip remain open.
39
+
40
+ ## Validation
41
+
42
+ Each task used focused `cargo xtask test-group <name>` before its commit, with deterministic double report regeneration, relevant source/Rust tests, scoped gameplay tests and storage/documentation/whitespace guards. Groups are qvm-info-lookup, rust-info-lookup, qvm-numeric-scan, rust-numeric-scan, qvm-position-save, rust-position-save, qvm-position-load, rust-position-load, qvm-session-restore and rust-session-restore. Shared byte/oracle changes also received focused writer/scanner/load regression checks.
43
+
44
+ Dependency-selection regression coverage includes all five new source-to-Rust report pairs, native_policy consumers, formatting dependencies and intermission classification used by restore. Every Python process uses the resolved Nix runtime declared by flake.nix, with explicit PYTHON for xtask and Git hooks. No original asset payload changed. After commit ten, `cargo xtask test-full --since 6e01995b` passed once: 1,753 Python tests and199 Rust tests (assets10, gameplay159, xtask30). All22 affected report producers regenerated twice deterministically. Storage policy, links across469 documentation files and whitespace checks passed with no generated-report drift. These notes were amended into task ten.
45
+
46
+ ## Next work: RE-904
47
+
48
+ - [ ] Recover uppercase exponent behavior and remaining38355 conversions, non-ASCII parsing, oversized/fatal userinfo and pointer/buffer alias contracts.
49
+ - [ ] Trace actual scratch provenance on malformed session restore; decide a documented production compatibility/default policy after validating native behavior.
50
+ - [ ] Recover session clear246938 callers and initialization, metadata producers and ignore-table mutations; execute write/restore across a real map reload.
51
+ - [ ] Integrate actual246746 and246963 together in249007 and full normal/series6939 flows; carry native file/cvar ownership and real command dispatch.
52
+ - [ ] Connect saved-file IO intentions to a platform-neutral engine adapter and validate real file-open return/handle/close semantics on Linux/macOS.
53
+ - [ ] Replace supplied spatial-query answers with recovered native broadphase, integrate bot rotation/native genetic behavior, and recover221662 map-list parsing.
54
+ - [ ] Compose complete respawn/begin-intermission, event lifetime and ranking/scoreboard/network execution.
55
+ - [ ] Validate actual Linux/macOS Rust/Bevy/Solari gameplay/rendering. Full-game completion remains open.
docs/research/README.md CHANGED
@@ -1312,3 +1312,9 @@ The extension collector adds five focused tests for native tail calls, command-r
1312
 
1313
 
1314
  [RE-902: Original session restore with actual saved-position load](QVM_SESSION_RESTORE.md).
 
 
 
 
 
 
 
1312
 
1313
 
1314
  [RE-902: Original session restore with actual saved-position load](QVM_SESSION_RESTORE.md).
1315
+
1316
+
1317
+ [RE-903: Rust session restore with caller-scratch ownership](RUST_SESSION_RESTORE.md).
1318
+
1319
+
1320
+ [RE-894–903 saved-position and session restore batch](QVM_SAVED_RESTORE_BATCH.md).
docs/research/RUST_SESSION_RESTORE.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ # Rust session restore with caller-scratch ownership
2
+
3
+ RE-903. Reproduce with `python3 scripts/analyze_rust_session_restore.py`; focused validation: `cargo xtask test-group rust-session-restore`. [Machine report](rust-session-restore.json).
4
+
5
+ Rust matches144 actual247219/scanner/atoi/mode/position-load compositions, preserving ignored parse result, explicit caller scratch, positive-only booleans and final team/flag gate. Ignore entries accumulate without clearing and invalid numeric text addresses slot0. State and selector stage atomically on unsupported domains. Native cvars/files, real scratch provenance and full map reload remain open.
6
+
7
+ Original executable/native runtime and complete Linux/macOS Rust/Bevy/Solari acceptance remain unverified.
docs/research/qvm-session-restore.json CHANGED
@@ -162,7 +162,7 @@
162
  ],
163
  "info_ring": 0,
164
  "input": {
165
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
166
  "flags": 0,
167
  "ignore": "312c332c312c",
168
  "ignore_before": [
@@ -456,7 +456,7 @@
456
  ],
457
  "info_ring": 0,
458
  "input": {
459
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
460
  "flags": 0,
461
  "ignore": "312c332c312c",
462
  "ignore_before": [
@@ -750,7 +750,7 @@
750
  ],
751
  "info_ring": 0,
752
  "input": {
753
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
754
  "flags": 0,
755
  "ignore": "2d312c36342c322c782c",
756
  "ignore_before": [
@@ -1049,7 +1049,7 @@
1049
  ],
1050
  "info_ring": 0,
1051
  "input": {
1052
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
1053
  "flags": 0,
1054
  "ignore": "2d312c36342c322c782c",
1055
  "ignore_before": [
@@ -1333,7 +1333,7 @@
1333
  ],
1334
  "info_ring": 0,
1335
  "input": {
1336
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
1337
  "flags": 0,
1338
  "ignore": "",
1339
  "ignore_before": [
@@ -1622,7 +1622,7 @@
1622
  ],
1623
  "info_ring": 0,
1624
  "input": {
1625
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
1626
  "flags": 0,
1627
  "ignore": "",
1628
  "ignore_before": [
@@ -1881,7 +1881,7 @@
1881
  ],
1882
  "info_ring": 0,
1883
  "input": {
1884
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
1885
  "flags": 0,
1886
  "ignore": "312c332c312c",
1887
  "ignore_before": [
@@ -2140,7 +2140,7 @@
2140
  ],
2141
  "info_ring": 0,
2142
  "input": {
2143
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
2144
  "flags": 0,
2145
  "ignore": "312c332c312c",
2146
  "ignore_before": [
@@ -2404,7 +2404,7 @@
2404
  ],
2405
  "info_ring": 0,
2406
  "input": {
2407
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
2408
  "flags": 0,
2409
  "ignore": "2d312c36342c322c782c",
2410
  "ignore_before": [
@@ -2668,7 +2668,7 @@
2668
  ],
2669
  "info_ring": 0,
2670
  "input": {
2671
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
2672
  "flags": 0,
2673
  "ignore": "2d312c36342c322c782c",
2674
  "ignore_before": [
@@ -2922,7 +2922,7 @@
2922
  ],
2923
  "info_ring": 0,
2924
  "input": {
2925
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
2926
  "flags": 0,
2927
  "ignore": "",
2928
  "ignore_before": [
@@ -3176,7 +3176,7 @@
3176
  ],
3177
  "info_ring": 0,
3178
  "input": {
3179
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
3180
  "flags": 0,
3181
  "ignore": "",
3182
  "ignore_before": [
@@ -3425,7 +3425,7 @@
3425
  ],
3426
  "info_ring": 0,
3427
  "input": {
3428
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
3429
  "flags": 0,
3430
  "ignore": "312c332c312c",
3431
  "ignore_before": [
@@ -3679,7 +3679,7 @@
3679
  ],
3680
  "info_ring": 0,
3681
  "input": {
3682
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
3683
  "flags": 0,
3684
  "ignore": "312c332c312c",
3685
  "ignore_before": [
@@ -3933,7 +3933,7 @@
3933
  ],
3934
  "info_ring": 0,
3935
  "input": {
3936
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
3937
  "flags": 0,
3938
  "ignore": "2d312c36342c322c782c",
3939
  "ignore_before": [
@@ -4192,7 +4192,7 @@
4192
  ],
4193
  "info_ring": 0,
4194
  "input": {
4195
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
4196
  "flags": 0,
4197
  "ignore": "2d312c36342c322c782c",
4198
  "ignore_before": [
@@ -4436,7 +4436,7 @@
4436
  ],
4437
  "info_ring": 0,
4438
  "input": {
4439
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
4440
  "flags": 0,
4441
  "ignore": "",
4442
  "ignore_before": [
@@ -4685,7 +4685,7 @@
4685
  ],
4686
  "info_ring": 0,
4687
  "input": {
4688
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
4689
  "flags": 0,
4690
  "ignore": "",
4691
  "ignore_before": [
@@ -6678,7 +6678,7 @@
6678
  ],
6679
  "info_ring": 0,
6680
  "input": {
6681
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
6682
  "flags": 1,
6683
  "ignore": "312c332c312c",
6684
  "ignore_before": [
@@ -6972,7 +6972,7 @@
6972
  ],
6973
  "info_ring": 0,
6974
  "input": {
6975
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
6976
  "flags": 1,
6977
  "ignore": "312c332c312c",
6978
  "ignore_before": [
@@ -7266,7 +7266,7 @@
7266
  ],
7267
  "info_ring": 0,
7268
  "input": {
7269
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
7270
  "flags": 1,
7271
  "ignore": "2d312c36342c322c782c",
7272
  "ignore_before": [
@@ -7565,7 +7565,7 @@
7565
  ],
7566
  "info_ring": 0,
7567
  "input": {
7568
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
7569
  "flags": 1,
7570
  "ignore": "2d312c36342c322c782c",
7571
  "ignore_before": [
@@ -7849,7 +7849,7 @@
7849
  ],
7850
  "info_ring": 0,
7851
  "input": {
7852
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
7853
  "flags": 1,
7854
  "ignore": "",
7855
  "ignore_before": [
@@ -8138,7 +8138,7 @@
8138
  ],
8139
  "info_ring": 0,
8140
  "input": {
8141
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
8142
  "flags": 1,
8143
  "ignore": "",
8144
  "ignore_before": [
@@ -8397,7 +8397,7 @@
8397
  ],
8398
  "info_ring": 0,
8399
  "input": {
8400
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
8401
  "flags": 1,
8402
  "ignore": "312c332c312c",
8403
  "ignore_before": [
@@ -8656,7 +8656,7 @@
8656
  ],
8657
  "info_ring": 0,
8658
  "input": {
8659
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
8660
  "flags": 1,
8661
  "ignore": "312c332c312c",
8662
  "ignore_before": [
@@ -8920,7 +8920,7 @@
8920
  ],
8921
  "info_ring": 0,
8922
  "input": {
8923
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
8924
  "flags": 1,
8925
  "ignore": "2d312c36342c322c782c",
8926
  "ignore_before": [
@@ -9184,7 +9184,7 @@
9184
  ],
9185
  "info_ring": 0,
9186
  "input": {
9187
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
9188
  "flags": 1,
9189
  "ignore": "2d312c36342c322c782c",
9190
  "ignore_before": [
@@ -9438,7 +9438,7 @@
9438
  ],
9439
  "info_ring": 0,
9440
  "input": {
9441
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
9442
  "flags": 1,
9443
  "ignore": "",
9444
  "ignore_before": [
@@ -9692,7 +9692,7 @@
9692
  ],
9693
  "info_ring": 0,
9694
  "input": {
9695
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
9696
  "flags": 1,
9697
  "ignore": "",
9698
  "ignore_before": [
@@ -9941,7 +9941,7 @@
9941
  ],
9942
  "info_ring": 0,
9943
  "input": {
9944
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
9945
  "flags": 1,
9946
  "ignore": "312c332c312c",
9947
  "ignore_before": [
@@ -10195,7 +10195,7 @@
10195
  ],
10196
  "info_ring": 0,
10197
  "input": {
10198
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
10199
  "flags": 1,
10200
  "ignore": "312c332c312c",
10201
  "ignore_before": [
@@ -10449,7 +10449,7 @@
10449
  ],
10450
  "info_ring": 0,
10451
  "input": {
10452
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
10453
  "flags": 1,
10454
  "ignore": "2d312c36342c322c782c",
10455
  "ignore_before": [
@@ -10708,7 +10708,7 @@
10708
  ],
10709
  "info_ring": 0,
10710
  "input": {
10711
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
10712
  "flags": 1,
10713
  "ignore": "2d312c36342c322c782c",
10714
  "ignore_before": [
@@ -10952,7 +10952,7 @@
10952
  ],
10953
  "info_ring": 0,
10954
  "input": {
10955
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
10956
  "flags": 1,
10957
  "ignore": "",
10958
  "ignore_before": [
@@ -11201,7 +11201,7 @@
11201
  ],
11202
  "info_ring": 0,
11203
  "input": {
11204
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
11205
  "flags": 1,
11206
  "ignore": "",
11207
  "ignore_before": [
@@ -13194,7 +13194,7 @@
13194
  ],
13195
  "info_ring": 0,
13196
  "input": {
13197
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
13198
  "flags": 0,
13199
  "ignore": "312c332c312c",
13200
  "ignore_before": [
@@ -13488,7 +13488,7 @@
13488
  ],
13489
  "info_ring": 0,
13490
  "input": {
13491
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
13492
  "flags": 0,
13493
  "ignore": "312c332c312c",
13494
  "ignore_before": [
@@ -13782,7 +13782,7 @@
13782
  ],
13783
  "info_ring": 0,
13784
  "input": {
13785
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
13786
  "flags": 0,
13787
  "ignore": "2d312c36342c322c782c",
13788
  "ignore_before": [
@@ -14081,7 +14081,7 @@
14081
  ],
14082
  "info_ring": 0,
14083
  "input": {
14084
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
14085
  "flags": 0,
14086
  "ignore": "2d312c36342c322c782c",
14087
  "ignore_before": [
@@ -14365,7 +14365,7 @@
14365
  ],
14366
  "info_ring": 0,
14367
  "input": {
14368
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
14369
  "flags": 0,
14370
  "ignore": "",
14371
  "ignore_before": [
@@ -14654,7 +14654,7 @@
14654
  ],
14655
  "info_ring": 0,
14656
  "input": {
14657
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
14658
  "flags": 0,
14659
  "ignore": "",
14660
  "ignore_before": [
@@ -14913,7 +14913,7 @@
14913
  ],
14914
  "info_ring": 0,
14915
  "input": {
14916
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
14917
  "flags": 0,
14918
  "ignore": "312c332c312c",
14919
  "ignore_before": [
@@ -15172,7 +15172,7 @@
15172
  ],
15173
  "info_ring": 0,
15174
  "input": {
15175
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
15176
  "flags": 0,
15177
  "ignore": "312c332c312c",
15178
  "ignore_before": [
@@ -15436,7 +15436,7 @@
15436
  ],
15437
  "info_ring": 0,
15438
  "input": {
15439
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
15440
  "flags": 0,
15441
  "ignore": "2d312c36342c322c782c",
15442
  "ignore_before": [
@@ -15700,7 +15700,7 @@
15700
  ],
15701
  "info_ring": 0,
15702
  "input": {
15703
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
15704
  "flags": 0,
15705
  "ignore": "2d312c36342c322c782c",
15706
  "ignore_before": [
@@ -15954,7 +15954,7 @@
15954
  ],
15955
  "info_ring": 0,
15956
  "input": {
15957
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
15958
  "flags": 0,
15959
  "ignore": "",
15960
  "ignore_before": [
@@ -16208,7 +16208,7 @@
16208
  ],
16209
  "info_ring": 0,
16210
  "input": {
16211
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
16212
  "flags": 0,
16213
  "ignore": "",
16214
  "ignore_before": [
@@ -16457,7 +16457,7 @@
16457
  ],
16458
  "info_ring": 0,
16459
  "input": {
16460
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
16461
  "flags": 0,
16462
  "ignore": "312c332c312c",
16463
  "ignore_before": [
@@ -16711,7 +16711,7 @@
16711
  ],
16712
  "info_ring": 0,
16713
  "input": {
16714
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
16715
  "flags": 0,
16716
  "ignore": "312c332c312c",
16717
  "ignore_before": [
@@ -16965,7 +16965,7 @@
16965
  ],
16966
  "info_ring": 0,
16967
  "input": {
16968
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
16969
  "flags": 0,
16970
  "ignore": "2d312c36342c322c782c",
16971
  "ignore_before": [
@@ -17224,7 +17224,7 @@
17224
  ],
17225
  "info_ring": 0,
17226
  "input": {
17227
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
17228
  "flags": 0,
17229
  "ignore": "2d312c36342c322c782c",
17230
  "ignore_before": [
@@ -17468,7 +17468,7 @@
17468
  ],
17469
  "info_ring": 0,
17470
  "input": {
17471
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
17472
  "flags": 0,
17473
  "ignore": "",
17474
  "ignore_before": [
@@ -17717,7 +17717,7 @@
17717
  ],
17718
  "info_ring": 0,
17719
  "input": {
17720
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
17721
  "flags": 0,
17722
  "ignore": "",
17723
  "ignore_before": [
@@ -19710,7 +19710,7 @@
19710
  ],
19711
  "info_ring": 0,
19712
  "input": {
19713
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
19714
  "flags": 1,
19715
  "ignore": "312c332c312c",
19716
  "ignore_before": [
@@ -20004,7 +20004,7 @@
20004
  ],
20005
  "info_ring": 0,
20006
  "input": {
20007
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
20008
  "flags": 1,
20009
  "ignore": "312c332c312c",
20010
  "ignore_before": [
@@ -20298,7 +20298,7 @@
20298
  ],
20299
  "info_ring": 0,
20300
  "input": {
20301
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
20302
  "flags": 1,
20303
  "ignore": "2d312c36342c322c782c",
20304
  "ignore_before": [
@@ -20597,7 +20597,7 @@
20597
  ],
20598
  "info_ring": 0,
20599
  "input": {
20600
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
20601
  "flags": 1,
20602
  "ignore": "2d312c36342c322c782c",
20603
  "ignore_before": [
@@ -20881,7 +20881,7 @@
20881
  ],
20882
  "info_ring": 0,
20883
  "input": {
20884
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
20885
  "flags": 1,
20886
  "ignore": "",
20887
  "ignore_before": [
@@ -21170,7 +21170,7 @@
21170
  ],
21171
  "info_ring": 0,
21172
  "input": {
21173
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
21174
  "flags": 1,
21175
  "ignore": "",
21176
  "ignore_before": [
@@ -21429,7 +21429,7 @@
21429
  ],
21430
  "info_ring": 0,
21431
  "input": {
21432
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
21433
  "flags": 1,
21434
  "ignore": "312c332c312c",
21435
  "ignore_before": [
@@ -21688,7 +21688,7 @@
21688
  ],
21689
  "info_ring": 0,
21690
  "input": {
21691
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
21692
  "flags": 1,
21693
  "ignore": "312c332c312c",
21694
  "ignore_before": [
@@ -21952,7 +21952,7 @@
21952
  ],
21953
  "info_ring": 0,
21954
  "input": {
21955
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
21956
  "flags": 1,
21957
  "ignore": "2d312c36342c322c782c",
21958
  "ignore_before": [
@@ -22216,7 +22216,7 @@
22216
  ],
22217
  "info_ring": 0,
22218
  "input": {
22219
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
22220
  "flags": 1,
22221
  "ignore": "2d312c36342c322c782c",
22222
  "ignore_before": [
@@ -22470,7 +22470,7 @@
22470
  ],
22471
  "info_ring": 0,
22472
  "input": {
22473
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
22474
  "flags": 1,
22475
  "ignore": "",
22476
  "ignore_before": [
@@ -22724,7 +22724,7 @@
22724
  ],
22725
  "info_ring": 0,
22726
  "input": {
22727
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
22728
  "flags": 1,
22729
  "ignore": "",
22730
  "ignore_before": [
@@ -22973,7 +22973,7 @@
22973
  ],
22974
  "info_ring": 0,
22975
  "input": {
22976
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
22977
  "flags": 1,
22978
  "ignore": "312c332c312c",
22979
  "ignore_before": [
@@ -23227,7 +23227,7 @@
23227
  ],
23228
  "info_ring": 0,
23229
  "input": {
23230
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
23231
  "flags": 1,
23232
  "ignore": "312c332c312c",
23233
  "ignore_before": [
@@ -23481,7 +23481,7 @@
23481
  ],
23482
  "info_ring": 0,
23483
  "input": {
23484
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
23485
  "flags": 1,
23486
  "ignore": "2d312c36342c322c782c",
23487
  "ignore_before": [
@@ -23740,7 +23740,7 @@
23740
  ],
23741
  "info_ring": 0,
23742
  "input": {
23743
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
23744
  "flags": 1,
23745
  "ignore": "2d312c36342c322c782c",
23746
  "ignore_before": [
@@ -23984,7 +23984,7 @@
23984
  ],
23985
  "info_ring": 0,
23986
  "input": {
23987
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
23988
  "flags": 1,
23989
  "ignore": "",
23990
  "ignore_before": [
@@ -24233,7 +24233,7 @@
24233
  ],
24234
  "info_ring": 0,
24235
  "input": {
24236
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
24237
  "flags": 1,
24238
  "ignore": "",
24239
  "ignore_before": [
@@ -26266,7 +26266,7 @@
26266
  ],
26267
  "info_ring": 1,
26268
  "input": {
26269
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
26270
  "flags": 0,
26271
  "ignore": "312c332c312c",
26272
  "ignore_before": [
@@ -26574,7 +26574,7 @@
26574
  },
26575
  {
26576
  "handle": 7,
26577
- "length": 24,
26578
  "op": "read"
26579
  },
26580
  {
@@ -26817,7 +26817,7 @@
26817
  ],
26818
  "info_ring": 1,
26819
  "input": {
26820
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
26821
  "flags": 0,
26822
  "ignore": "312c332c312c",
26823
  "ignore_before": [
@@ -27125,7 +27125,7 @@
27125
  },
27126
  {
27127
  "handle": 7,
27128
- "length": 24,
27129
  "op": "read"
27130
  },
27131
  {
@@ -27368,7 +27368,7 @@
27368
  ],
27369
  "info_ring": 1,
27370
  "input": {
27371
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
27372
  "flags": 0,
27373
  "ignore": "2d312c36342c322c782c",
27374
  "ignore_before": [
@@ -27676,7 +27676,7 @@
27676
  },
27677
  {
27678
  "handle": 7,
27679
- "length": 24,
27680
  "op": "read"
27681
  },
27682
  {
@@ -27924,7 +27924,7 @@
27924
  ],
27925
  "info_ring": 1,
27926
  "input": {
27927
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
27928
  "flags": 0,
27929
  "ignore": "2d312c36342c322c782c",
27930
  "ignore_before": [
@@ -28232,7 +28232,7 @@
28232
  },
28233
  {
28234
  "handle": 7,
28235
- "length": 24,
28236
  "op": "read"
28237
  },
28238
  {
@@ -28465,7 +28465,7 @@
28465
  ],
28466
  "info_ring": 1,
28467
  "input": {
28468
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
28469
  "flags": 0,
28470
  "ignore": "",
28471
  "ignore_before": [
@@ -28773,7 +28773,7 @@
28773
  },
28774
  {
28775
  "handle": 7,
28776
- "length": 24,
28777
  "op": "read"
28778
  },
28779
  {
@@ -29011,7 +29011,7 @@
29011
  ],
29012
  "info_ring": 1,
29013
  "input": {
29014
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
29015
  "flags": 0,
29016
  "ignore": "",
29017
  "ignore_before": [
@@ -29319,7 +29319,7 @@
29319
  },
29320
  {
29321
  "handle": 7,
29322
- "length": 24,
29323
  "op": "read"
29324
  },
29325
  {
@@ -29527,7 +29527,7 @@
29527
  ],
29528
  "info_ring": 1,
29529
  "input": {
29530
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
29531
  "flags": 0,
29532
  "ignore": "312c332c312c",
29533
  "ignore_before": [
@@ -29840,7 +29840,7 @@
29840
  },
29841
  {
29842
  "handle": 7,
29843
- "length": 24,
29844
  "op": "read"
29845
  },
29846
  {
@@ -30048,7 +30048,7 @@
30048
  ],
30049
  "info_ring": 1,
30050
  "input": {
30051
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
30052
  "flags": 0,
30053
  "ignore": "312c332c312c",
30054
  "ignore_before": [
@@ -30361,7 +30361,7 @@
30361
  },
30362
  {
30363
  "handle": 7,
30364
- "length": 24,
30365
  "op": "read"
30366
  },
30367
  {
@@ -30574,7 +30574,7 @@
30574
  ],
30575
  "info_ring": 1,
30576
  "input": {
30577
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
30578
  "flags": 0,
30579
  "ignore": "2d312c36342c322c782c",
30580
  "ignore_before": [
@@ -30887,7 +30887,7 @@
30887
  },
30888
  {
30889
  "handle": 7,
30890
- "length": 24,
30891
  "op": "read"
30892
  },
30893
  {
@@ -31100,7 +31100,7 @@
31100
  ],
31101
  "info_ring": 1,
31102
  "input": {
31103
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
31104
  "flags": 0,
31105
  "ignore": "2d312c36342c322c782c",
31106
  "ignore_before": [
@@ -31413,7 +31413,7 @@
31413
  },
31414
  {
31415
  "handle": 7,
31416
- "length": 24,
31417
  "op": "read"
31418
  },
31419
  {
@@ -31616,7 +31616,7 @@
31616
  ],
31617
  "info_ring": 1,
31618
  "input": {
31619
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
31620
  "flags": 0,
31621
  "ignore": "",
31622
  "ignore_before": [
@@ -31929,7 +31929,7 @@
31929
  },
31930
  {
31931
  "handle": 7,
31932
- "length": 24,
31933
  "op": "read"
31934
  },
31935
  {
@@ -32132,7 +32132,7 @@
32132
  ],
32133
  "info_ring": 1,
32134
  "input": {
32135
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
32136
  "flags": 0,
32137
  "ignore": "",
32138
  "ignore_before": [
@@ -32445,7 +32445,7 @@
32445
  },
32446
  {
32447
  "handle": 7,
32448
- "length": 24,
32449
  "op": "read"
32450
  },
32451
  {
@@ -32608,7 +32608,7 @@
32608
  ],
32609
  "info_ring": 1,
32610
  "input": {
32611
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
32612
  "flags": 0,
32613
  "ignore": "312c332c312c",
32614
  "ignore_before": [
@@ -32883,7 +32883,7 @@
32883
  ],
32884
  "info_ring": 1,
32885
  "input": {
32886
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
32887
  "flags": 0,
32888
  "ignore": "312c332c312c",
32889
  "ignore_before": [
@@ -33158,7 +33158,7 @@
33158
  ],
33159
  "info_ring": 1,
33160
  "input": {
33161
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
33162
  "flags": 0,
33163
  "ignore": "2d312c36342c322c782c",
33164
  "ignore_before": [
@@ -33438,7 +33438,7 @@
33438
  ],
33439
  "info_ring": 1,
33440
  "input": {
33441
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
33442
  "flags": 0,
33443
  "ignore": "2d312c36342c322c782c",
33444
  "ignore_before": [
@@ -33703,7 +33703,7 @@
33703
  ],
33704
  "info_ring": 1,
33705
  "input": {
33706
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
33707
  "flags": 0,
33708
  "ignore": "",
33709
  "ignore_before": [
@@ -33973,7 +33973,7 @@
33973
  ],
33974
  "info_ring": 1,
33975
  "input": {
33976
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
33977
  "flags": 0,
33978
  "ignore": "",
33979
  "ignore_before": [
@@ -37234,7 +37234,7 @@
37234
  ],
37235
  "info_ring": 1,
37236
  "input": {
37237
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
37238
  "flags": 1,
37239
  "ignore": "312c332c312c",
37240
  "ignore_before": [
@@ -37542,7 +37542,7 @@
37542
  },
37543
  {
37544
  "handle": 7,
37545
- "length": 24,
37546
  "op": "read"
37547
  },
37548
  {
@@ -37785,7 +37785,7 @@
37785
  ],
37786
  "info_ring": 1,
37787
  "input": {
37788
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
37789
  "flags": 1,
37790
  "ignore": "312c332c312c",
37791
  "ignore_before": [
@@ -38093,7 +38093,7 @@
38093
  },
38094
  {
38095
  "handle": 7,
38096
- "length": 24,
38097
  "op": "read"
38098
  },
38099
  {
@@ -38336,7 +38336,7 @@
38336
  ],
38337
  "info_ring": 1,
38338
  "input": {
38339
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
38340
  "flags": 1,
38341
  "ignore": "2d312c36342c322c782c",
38342
  "ignore_before": [
@@ -38644,7 +38644,7 @@
38644
  },
38645
  {
38646
  "handle": 7,
38647
- "length": 24,
38648
  "op": "read"
38649
  },
38650
  {
@@ -38892,7 +38892,7 @@
38892
  ],
38893
  "info_ring": 1,
38894
  "input": {
38895
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
38896
  "flags": 1,
38897
  "ignore": "2d312c36342c322c782c",
38898
  "ignore_before": [
@@ -39200,7 +39200,7 @@
39200
  },
39201
  {
39202
  "handle": 7,
39203
- "length": 24,
39204
  "op": "read"
39205
  },
39206
  {
@@ -39433,7 +39433,7 @@
39433
  ],
39434
  "info_ring": 1,
39435
  "input": {
39436
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
39437
  "flags": 1,
39438
  "ignore": "",
39439
  "ignore_before": [
@@ -39741,7 +39741,7 @@
39741
  },
39742
  {
39743
  "handle": 7,
39744
- "length": 24,
39745
  "op": "read"
39746
  },
39747
  {
@@ -39979,7 +39979,7 @@
39979
  ],
39980
  "info_ring": 1,
39981
  "input": {
39982
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
39983
  "flags": 1,
39984
  "ignore": "",
39985
  "ignore_before": [
@@ -40287,7 +40287,7 @@
40287
  },
40288
  {
40289
  "handle": 7,
40290
- "length": 24,
40291
  "op": "read"
40292
  },
40293
  {
@@ -40495,7 +40495,7 @@
40495
  ],
40496
  "info_ring": 1,
40497
  "input": {
40498
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
40499
  "flags": 1,
40500
  "ignore": "312c332c312c",
40501
  "ignore_before": [
@@ -40808,7 +40808,7 @@
40808
  },
40809
  {
40810
  "handle": 7,
40811
- "length": 24,
40812
  "op": "read"
40813
  },
40814
  {
@@ -41016,7 +41016,7 @@
41016
  ],
41017
  "info_ring": 1,
41018
  "input": {
41019
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
41020
  "flags": 1,
41021
  "ignore": "312c332c312c",
41022
  "ignore_before": [
@@ -41329,7 +41329,7 @@
41329
  },
41330
  {
41331
  "handle": 7,
41332
- "length": 24,
41333
  "op": "read"
41334
  },
41335
  {
@@ -41542,7 +41542,7 @@
41542
  ],
41543
  "info_ring": 1,
41544
  "input": {
41545
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
41546
  "flags": 1,
41547
  "ignore": "2d312c36342c322c782c",
41548
  "ignore_before": [
@@ -41855,7 +41855,7 @@
41855
  },
41856
  {
41857
  "handle": 7,
41858
- "length": 24,
41859
  "op": "read"
41860
  },
41861
  {
@@ -42068,7 +42068,7 @@
42068
  ],
42069
  "info_ring": 1,
42070
  "input": {
42071
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
42072
  "flags": 1,
42073
  "ignore": "2d312c36342c322c782c",
42074
  "ignore_before": [
@@ -42381,7 +42381,7 @@
42381
  },
42382
  {
42383
  "handle": 7,
42384
- "length": 24,
42385
  "op": "read"
42386
  },
42387
  {
@@ -42584,7 +42584,7 @@
42584
  ],
42585
  "info_ring": 1,
42586
  "input": {
42587
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
42588
  "flags": 1,
42589
  "ignore": "",
42590
  "ignore_before": [
@@ -42897,7 +42897,7 @@
42897
  },
42898
  {
42899
  "handle": 7,
42900
- "length": 24,
42901
  "op": "read"
42902
  },
42903
  {
@@ -43100,7 +43100,7 @@
43100
  ],
43101
  "info_ring": 1,
43102
  "input": {
43103
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
43104
  "flags": 1,
43105
  "ignore": "",
43106
  "ignore_before": [
@@ -43413,7 +43413,7 @@
43413
  },
43414
  {
43415
  "handle": 7,
43416
- "length": 24,
43417
  "op": "read"
43418
  },
43419
  {
@@ -43576,7 +43576,7 @@
43576
  ],
43577
  "info_ring": 1,
43578
  "input": {
43579
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
43580
  "flags": 1,
43581
  "ignore": "312c332c312c",
43582
  "ignore_before": [
@@ -43851,7 +43851,7 @@
43851
  ],
43852
  "info_ring": 1,
43853
  "input": {
43854
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
43855
  "flags": 1,
43856
  "ignore": "312c332c312c",
43857
  "ignore_before": [
@@ -44126,7 +44126,7 @@
44126
  ],
44127
  "info_ring": 1,
44128
  "input": {
44129
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
44130
  "flags": 1,
44131
  "ignore": "2d312c36342c322c782c",
44132
  "ignore_before": [
@@ -44406,7 +44406,7 @@
44406
  ],
44407
  "info_ring": 1,
44408
  "input": {
44409
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
44410
  "flags": 1,
44411
  "ignore": "2d312c36342c322c782c",
44412
  "ignore_before": [
@@ -44671,7 +44671,7 @@
44671
  ],
44672
  "info_ring": 1,
44673
  "input": {
44674
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
44675
  "flags": 1,
44676
  "ignore": "",
44677
  "ignore_before": [
@@ -44941,7 +44941,7 @@
44941
  ],
44942
  "info_ring": 1,
44943
  "input": {
44944
- "data": "312e32352c2d322e352c332c39302c3138302c2d34352e35",
44945
  "flags": 1,
44946
  "ignore": "",
44947
  "ignore_before": [
 
162
  ],
163
  "info_ring": 0,
164
  "input": {
165
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
166
  "flags": 0,
167
  "ignore": "312c332c312c",
168
  "ignore_before": [
 
456
  ],
457
  "info_ring": 0,
458
  "input": {
459
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
460
  "flags": 0,
461
  "ignore": "312c332c312c",
462
  "ignore_before": [
 
750
  ],
751
  "info_ring": 0,
752
  "input": {
753
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
754
  "flags": 0,
755
  "ignore": "2d312c36342c322c782c",
756
  "ignore_before": [
 
1049
  ],
1050
  "info_ring": 0,
1051
  "input": {
1052
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
1053
  "flags": 0,
1054
  "ignore": "2d312c36342c322c782c",
1055
  "ignore_before": [
 
1333
  ],
1334
  "info_ring": 0,
1335
  "input": {
1336
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
1337
  "flags": 0,
1338
  "ignore": "",
1339
  "ignore_before": [
 
1622
  ],
1623
  "info_ring": 0,
1624
  "input": {
1625
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
1626
  "flags": 0,
1627
  "ignore": "",
1628
  "ignore_before": [
 
1881
  ],
1882
  "info_ring": 0,
1883
  "input": {
1884
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
1885
  "flags": 0,
1886
  "ignore": "312c332c312c",
1887
  "ignore_before": [
 
2140
  ],
2141
  "info_ring": 0,
2142
  "input": {
2143
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
2144
  "flags": 0,
2145
  "ignore": "312c332c312c",
2146
  "ignore_before": [
 
2404
  ],
2405
  "info_ring": 0,
2406
  "input": {
2407
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
2408
  "flags": 0,
2409
  "ignore": "2d312c36342c322c782c",
2410
  "ignore_before": [
 
2668
  ],
2669
  "info_ring": 0,
2670
  "input": {
2671
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
2672
  "flags": 0,
2673
  "ignore": "2d312c36342c322c782c",
2674
  "ignore_before": [
 
2922
  ],
2923
  "info_ring": 0,
2924
  "input": {
2925
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
2926
  "flags": 0,
2927
  "ignore": "",
2928
  "ignore_before": [
 
3176
  ],
3177
  "info_ring": 0,
3178
  "input": {
3179
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
3180
  "flags": 0,
3181
  "ignore": "",
3182
  "ignore_before": [
 
3425
  ],
3426
  "info_ring": 0,
3427
  "input": {
3428
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
3429
  "flags": 0,
3430
  "ignore": "312c332c312c",
3431
  "ignore_before": [
 
3679
  ],
3680
  "info_ring": 0,
3681
  "input": {
3682
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
3683
  "flags": 0,
3684
  "ignore": "312c332c312c",
3685
  "ignore_before": [
 
3933
  ],
3934
  "info_ring": 0,
3935
  "input": {
3936
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
3937
  "flags": 0,
3938
  "ignore": "2d312c36342c322c782c",
3939
  "ignore_before": [
 
4192
  ],
4193
  "info_ring": 0,
4194
  "input": {
4195
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
4196
  "flags": 0,
4197
  "ignore": "2d312c36342c322c782c",
4198
  "ignore_before": [
 
4436
  ],
4437
  "info_ring": 0,
4438
  "input": {
4439
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
4440
  "flags": 0,
4441
  "ignore": "",
4442
  "ignore_before": [
 
4685
  ],
4686
  "info_ring": 0,
4687
  "input": {
4688
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
4689
  "flags": 0,
4690
  "ignore": "",
4691
  "ignore_before": [
 
6678
  ],
6679
  "info_ring": 0,
6680
  "input": {
6681
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
6682
  "flags": 1,
6683
  "ignore": "312c332c312c",
6684
  "ignore_before": [
 
6972
  ],
6973
  "info_ring": 0,
6974
  "input": {
6975
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
6976
  "flags": 1,
6977
  "ignore": "312c332c312c",
6978
  "ignore_before": [
 
7266
  ],
7267
  "info_ring": 0,
7268
  "input": {
7269
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
7270
  "flags": 1,
7271
  "ignore": "2d312c36342c322c782c",
7272
  "ignore_before": [
 
7565
  ],
7566
  "info_ring": 0,
7567
  "input": {
7568
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
7569
  "flags": 1,
7570
  "ignore": "2d312c36342c322c782c",
7571
  "ignore_before": [
 
7849
  ],
7850
  "info_ring": 0,
7851
  "input": {
7852
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
7853
  "flags": 1,
7854
  "ignore": "",
7855
  "ignore_before": [
 
8138
  ],
8139
  "info_ring": 0,
8140
  "input": {
8141
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
8142
  "flags": 1,
8143
  "ignore": "",
8144
  "ignore_before": [
 
8397
  ],
8398
  "info_ring": 0,
8399
  "input": {
8400
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
8401
  "flags": 1,
8402
  "ignore": "312c332c312c",
8403
  "ignore_before": [
 
8656
  ],
8657
  "info_ring": 0,
8658
  "input": {
8659
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
8660
  "flags": 1,
8661
  "ignore": "312c332c312c",
8662
  "ignore_before": [
 
8920
  ],
8921
  "info_ring": 0,
8922
  "input": {
8923
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
8924
  "flags": 1,
8925
  "ignore": "2d312c36342c322c782c",
8926
  "ignore_before": [
 
9184
  ],
9185
  "info_ring": 0,
9186
  "input": {
9187
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
9188
  "flags": 1,
9189
  "ignore": "2d312c36342c322c782c",
9190
  "ignore_before": [
 
9438
  ],
9439
  "info_ring": 0,
9440
  "input": {
9441
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
9442
  "flags": 1,
9443
  "ignore": "",
9444
  "ignore_before": [
 
9692
  ],
9693
  "info_ring": 0,
9694
  "input": {
9695
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
9696
  "flags": 1,
9697
  "ignore": "",
9698
  "ignore_before": [
 
9941
  ],
9942
  "info_ring": 0,
9943
  "input": {
9944
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
9945
  "flags": 1,
9946
  "ignore": "312c332c312c",
9947
  "ignore_before": [
 
10195
  ],
10196
  "info_ring": 0,
10197
  "input": {
10198
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
10199
  "flags": 1,
10200
  "ignore": "312c332c312c",
10201
  "ignore_before": [
 
10449
  ],
10450
  "info_ring": 0,
10451
  "input": {
10452
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
10453
  "flags": 1,
10454
  "ignore": "2d312c36342c322c782c",
10455
  "ignore_before": [
 
10708
  ],
10709
  "info_ring": 0,
10710
  "input": {
10711
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
10712
  "flags": 1,
10713
  "ignore": "2d312c36342c322c782c",
10714
  "ignore_before": [
 
10952
  ],
10953
  "info_ring": 0,
10954
  "input": {
10955
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
10956
  "flags": 1,
10957
  "ignore": "",
10958
  "ignore_before": [
 
11201
  ],
11202
  "info_ring": 0,
11203
  "input": {
11204
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
11205
  "flags": 1,
11206
  "ignore": "",
11207
  "ignore_before": [
 
13194
  ],
13195
  "info_ring": 0,
13196
  "input": {
13197
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
13198
  "flags": 0,
13199
  "ignore": "312c332c312c",
13200
  "ignore_before": [
 
13488
  ],
13489
  "info_ring": 0,
13490
  "input": {
13491
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
13492
  "flags": 0,
13493
  "ignore": "312c332c312c",
13494
  "ignore_before": [
 
13782
  ],
13783
  "info_ring": 0,
13784
  "input": {
13785
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
13786
  "flags": 0,
13787
  "ignore": "2d312c36342c322c782c",
13788
  "ignore_before": [
 
14081
  ],
14082
  "info_ring": 0,
14083
  "input": {
14084
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
14085
  "flags": 0,
14086
  "ignore": "2d312c36342c322c782c",
14087
  "ignore_before": [
 
14365
  ],
14366
  "info_ring": 0,
14367
  "input": {
14368
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
14369
  "flags": 0,
14370
  "ignore": "",
14371
  "ignore_before": [
 
14654
  ],
14655
  "info_ring": 0,
14656
  "input": {
14657
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
14658
  "flags": 0,
14659
  "ignore": "",
14660
  "ignore_before": [
 
14913
  ],
14914
  "info_ring": 0,
14915
  "input": {
14916
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
14917
  "flags": 0,
14918
  "ignore": "312c332c312c",
14919
  "ignore_before": [
 
15172
  ],
15173
  "info_ring": 0,
15174
  "input": {
15175
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
15176
  "flags": 0,
15177
  "ignore": "312c332c312c",
15178
  "ignore_before": [
 
15436
  ],
15437
  "info_ring": 0,
15438
  "input": {
15439
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
15440
  "flags": 0,
15441
  "ignore": "2d312c36342c322c782c",
15442
  "ignore_before": [
 
15700
  ],
15701
  "info_ring": 0,
15702
  "input": {
15703
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
15704
  "flags": 0,
15705
  "ignore": "2d312c36342c322c782c",
15706
  "ignore_before": [
 
15954
  ],
15955
  "info_ring": 0,
15956
  "input": {
15957
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
15958
  "flags": 0,
15959
  "ignore": "",
15960
  "ignore_before": [
 
16208
  ],
16209
  "info_ring": 0,
16210
  "input": {
16211
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
16212
  "flags": 0,
16213
  "ignore": "",
16214
  "ignore_before": [
 
16457
  ],
16458
  "info_ring": 0,
16459
  "input": {
16460
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
16461
  "flags": 0,
16462
  "ignore": "312c332c312c",
16463
  "ignore_before": [
 
16711
  ],
16712
  "info_ring": 0,
16713
  "input": {
16714
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
16715
  "flags": 0,
16716
  "ignore": "312c332c312c",
16717
  "ignore_before": [
 
16965
  ],
16966
  "info_ring": 0,
16967
  "input": {
16968
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
16969
  "flags": 0,
16970
  "ignore": "2d312c36342c322c782c",
16971
  "ignore_before": [
 
17224
  ],
17225
  "info_ring": 0,
17226
  "input": {
17227
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
17228
  "flags": 0,
17229
  "ignore": "2d312c36342c322c782c",
17230
  "ignore_before": [
 
17468
  ],
17469
  "info_ring": 0,
17470
  "input": {
17471
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
17472
  "flags": 0,
17473
  "ignore": "",
17474
  "ignore_before": [
 
17717
  ],
17718
  "info_ring": 0,
17719
  "input": {
17720
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
17721
  "flags": 0,
17722
  "ignore": "",
17723
  "ignore_before": [
 
19710
  ],
19711
  "info_ring": 0,
19712
  "input": {
19713
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
19714
  "flags": 1,
19715
  "ignore": "312c332c312c",
19716
  "ignore_before": [
 
20004
  ],
20005
  "info_ring": 0,
20006
  "input": {
20007
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
20008
  "flags": 1,
20009
  "ignore": "312c332c312c",
20010
  "ignore_before": [
 
20298
  ],
20299
  "info_ring": 0,
20300
  "input": {
20301
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
20302
  "flags": 1,
20303
  "ignore": "2d312c36342c322c782c",
20304
  "ignore_before": [
 
20597
  ],
20598
  "info_ring": 0,
20599
  "input": {
20600
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
20601
  "flags": 1,
20602
  "ignore": "2d312c36342c322c782c",
20603
  "ignore_before": [
 
20881
  ],
20882
  "info_ring": 0,
20883
  "input": {
20884
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
20885
  "flags": 1,
20886
  "ignore": "",
20887
  "ignore_before": [
 
21170
  ],
21171
  "info_ring": 0,
21172
  "input": {
21173
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
21174
  "flags": 1,
21175
  "ignore": "",
21176
  "ignore_before": [
 
21429
  ],
21430
  "info_ring": 0,
21431
  "input": {
21432
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
21433
  "flags": 1,
21434
  "ignore": "312c332c312c",
21435
  "ignore_before": [
 
21688
  ],
21689
  "info_ring": 0,
21690
  "input": {
21691
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
21692
  "flags": 1,
21693
  "ignore": "312c332c312c",
21694
  "ignore_before": [
 
21952
  ],
21953
  "info_ring": 0,
21954
  "input": {
21955
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
21956
  "flags": 1,
21957
  "ignore": "2d312c36342c322c782c",
21958
  "ignore_before": [
 
22216
  ],
22217
  "info_ring": 0,
22218
  "input": {
22219
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
22220
  "flags": 1,
22221
  "ignore": "2d312c36342c322c782c",
22222
  "ignore_before": [
 
22470
  ],
22471
  "info_ring": 0,
22472
  "input": {
22473
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
22474
  "flags": 1,
22475
  "ignore": "",
22476
  "ignore_before": [
 
22724
  ],
22725
  "info_ring": 0,
22726
  "input": {
22727
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
22728
  "flags": 1,
22729
  "ignore": "",
22730
  "ignore_before": [
 
22973
  ],
22974
  "info_ring": 0,
22975
  "input": {
22976
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
22977
  "flags": 1,
22978
  "ignore": "312c332c312c",
22979
  "ignore_before": [
 
23227
  ],
23228
  "info_ring": 0,
23229
  "input": {
23230
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
23231
  "flags": 1,
23232
  "ignore": "312c332c312c",
23233
  "ignore_before": [
 
23481
  ],
23482
  "info_ring": 0,
23483
  "input": {
23484
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
23485
  "flags": 1,
23486
  "ignore": "2d312c36342c322c782c",
23487
  "ignore_before": [
 
23740
  ],
23741
  "info_ring": 0,
23742
  "input": {
23743
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
23744
  "flags": 1,
23745
  "ignore": "2d312c36342c322c782c",
23746
  "ignore_before": [
 
23984
  ],
23985
  "info_ring": 0,
23986
  "input": {
23987
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
23988
  "flags": 1,
23989
  "ignore": "",
23990
  "ignore_before": [
 
24233
  ],
24234
  "info_ring": 0,
24235
  "input": {
24236
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
24237
  "flags": 1,
24238
  "ignore": "",
24239
  "ignore_before": [
 
26266
  ],
26267
  "info_ring": 1,
26268
  "input": {
26269
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
26270
  "flags": 0,
26271
  "ignore": "312c332c312c",
26272
  "ignore_before": [
 
26574
  },
26575
  {
26576
  "handle": 7,
26577
+ "length": 31,
26578
  "op": "read"
26579
  },
26580
  {
 
26817
  ],
26818
  "info_ring": 1,
26819
  "input": {
26820
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
26821
  "flags": 0,
26822
  "ignore": "312c332c312c",
26823
  "ignore_before": [
 
27125
  },
27126
  {
27127
  "handle": 7,
27128
+ "length": 31,
27129
  "op": "read"
27130
  },
27131
  {
 
27368
  ],
27369
  "info_ring": 1,
27370
  "input": {
27371
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
27372
  "flags": 0,
27373
  "ignore": "2d312c36342c322c782c",
27374
  "ignore_before": [
 
27676
  },
27677
  {
27678
  "handle": 7,
27679
+ "length": 31,
27680
  "op": "read"
27681
  },
27682
  {
 
27924
  ],
27925
  "info_ring": 1,
27926
  "input": {
27927
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
27928
  "flags": 0,
27929
  "ignore": "2d312c36342c322c782c",
27930
  "ignore_before": [
 
28232
  },
28233
  {
28234
  "handle": 7,
28235
+ "length": 31,
28236
  "op": "read"
28237
  },
28238
  {
 
28465
  ],
28466
  "info_ring": 1,
28467
  "input": {
28468
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
28469
  "flags": 0,
28470
  "ignore": "",
28471
  "ignore_before": [
 
28773
  },
28774
  {
28775
  "handle": 7,
28776
+ "length": 31,
28777
  "op": "read"
28778
  },
28779
  {
 
29011
  ],
29012
  "info_ring": 1,
29013
  "input": {
29014
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
29015
  "flags": 0,
29016
  "ignore": "",
29017
  "ignore_before": [
 
29319
  },
29320
  {
29321
  "handle": 7,
29322
+ "length": 31,
29323
  "op": "read"
29324
  },
29325
  {
 
29527
  ],
29528
  "info_ring": 1,
29529
  "input": {
29530
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
29531
  "flags": 0,
29532
  "ignore": "312c332c312c",
29533
  "ignore_before": [
 
29840
  },
29841
  {
29842
  "handle": 7,
29843
+ "length": 31,
29844
  "op": "read"
29845
  },
29846
  {
 
30048
  ],
30049
  "info_ring": 1,
30050
  "input": {
30051
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
30052
  "flags": 0,
30053
  "ignore": "312c332c312c",
30054
  "ignore_before": [
 
30361
  },
30362
  {
30363
  "handle": 7,
30364
+ "length": 31,
30365
  "op": "read"
30366
  },
30367
  {
 
30574
  ],
30575
  "info_ring": 1,
30576
  "input": {
30577
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
30578
  "flags": 0,
30579
  "ignore": "2d312c36342c322c782c",
30580
  "ignore_before": [
 
30887
  },
30888
  {
30889
  "handle": 7,
30890
+ "length": 31,
30891
  "op": "read"
30892
  },
30893
  {
 
31100
  ],
31101
  "info_ring": 1,
31102
  "input": {
31103
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
31104
  "flags": 0,
31105
  "ignore": "2d312c36342c322c782c",
31106
  "ignore_before": [
 
31413
  },
31414
  {
31415
  "handle": 7,
31416
+ "length": 31,
31417
  "op": "read"
31418
  },
31419
  {
 
31616
  ],
31617
  "info_ring": 1,
31618
  "input": {
31619
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
31620
  "flags": 0,
31621
  "ignore": "",
31622
  "ignore_before": [
 
31929
  },
31930
  {
31931
  "handle": 7,
31932
+ "length": 31,
31933
  "op": "read"
31934
  },
31935
  {
 
32132
  ],
32133
  "info_ring": 1,
32134
  "input": {
32135
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
32136
  "flags": 0,
32137
  "ignore": "",
32138
  "ignore_before": [
 
32445
  },
32446
  {
32447
  "handle": 7,
32448
+ "length": 31,
32449
  "op": "read"
32450
  },
32451
  {
 
32608
  ],
32609
  "info_ring": 1,
32610
  "input": {
32611
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
32612
  "flags": 0,
32613
  "ignore": "312c332c312c",
32614
  "ignore_before": [
 
32883
  ],
32884
  "info_ring": 1,
32885
  "input": {
32886
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
32887
  "flags": 0,
32888
  "ignore": "312c332c312c",
32889
  "ignore_before": [
 
33158
  ],
33159
  "info_ring": 1,
33160
  "input": {
33161
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
33162
  "flags": 0,
33163
  "ignore": "2d312c36342c322c782c",
33164
  "ignore_before": [
 
33438
  ],
33439
  "info_ring": 1,
33440
  "input": {
33441
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
33442
  "flags": 0,
33443
  "ignore": "2d312c36342c322c782c",
33444
  "ignore_before": [
 
33703
  ],
33704
  "info_ring": 1,
33705
  "input": {
33706
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
33707
  "flags": 0,
33708
  "ignore": "",
33709
  "ignore_before": [
 
33973
  ],
33974
  "info_ring": 1,
33975
  "input": {
33976
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
33977
  "flags": 0,
33978
  "ignore": "",
33979
  "ignore_before": [
 
37234
  ],
37235
  "info_ring": 1,
37236
  "input": {
37237
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
37238
  "flags": 1,
37239
  "ignore": "312c332c312c",
37240
  "ignore_before": [
 
37542
  },
37543
  {
37544
  "handle": 7,
37545
+ "length": 31,
37546
  "op": "read"
37547
  },
37548
  {
 
37785
  ],
37786
  "info_ring": 1,
37787
  "input": {
37788
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
37789
  "flags": 1,
37790
  "ignore": "312c332c312c",
37791
  "ignore_before": [
 
38093
  },
38094
  {
38095
  "handle": 7,
38096
+ "length": 31,
38097
  "op": "read"
38098
  },
38099
  {
 
38336
  ],
38337
  "info_ring": 1,
38338
  "input": {
38339
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
38340
  "flags": 1,
38341
  "ignore": "2d312c36342c322c782c",
38342
  "ignore_before": [
 
38644
  },
38645
  {
38646
  "handle": 7,
38647
+ "length": 31,
38648
  "op": "read"
38649
  },
38650
  {
 
38892
  ],
38893
  "info_ring": 1,
38894
  "input": {
38895
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
38896
  "flags": 1,
38897
  "ignore": "2d312c36342c322c782c",
38898
  "ignore_before": [
 
39200
  },
39201
  {
39202
  "handle": 7,
39203
+ "length": 31,
39204
  "op": "read"
39205
  },
39206
  {
 
39433
  ],
39434
  "info_ring": 1,
39435
  "input": {
39436
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
39437
  "flags": 1,
39438
  "ignore": "",
39439
  "ignore_before": [
 
39741
  },
39742
  {
39743
  "handle": 7,
39744
+ "length": 31,
39745
  "op": "read"
39746
  },
39747
  {
 
39979
  ],
39980
  "info_ring": 1,
39981
  "input": {
39982
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
39983
  "flags": 1,
39984
  "ignore": "",
39985
  "ignore_before": [
 
40287
  },
40288
  {
40289
  "handle": 7,
40290
+ "length": 31,
40291
  "op": "read"
40292
  },
40293
  {
 
40495
  ],
40496
  "info_ring": 1,
40497
  "input": {
40498
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
40499
  "flags": 1,
40500
  "ignore": "312c332c312c",
40501
  "ignore_before": [
 
40808
  },
40809
  {
40810
  "handle": 7,
40811
+ "length": 31,
40812
  "op": "read"
40813
  },
40814
  {
 
41016
  ],
41017
  "info_ring": 1,
41018
  "input": {
41019
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
41020
  "flags": 1,
41021
  "ignore": "312c332c312c",
41022
  "ignore_before": [
 
41329
  },
41330
  {
41331
  "handle": 7,
41332
+ "length": 31,
41333
  "op": "read"
41334
  },
41335
  {
 
41542
  ],
41543
  "info_ring": 1,
41544
  "input": {
41545
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
41546
  "flags": 1,
41547
  "ignore": "2d312c36342c322c782c",
41548
  "ignore_before": [
 
41855
  },
41856
  {
41857
  "handle": 7,
41858
+ "length": 31,
41859
  "op": "read"
41860
  },
41861
  {
 
42068
  ],
42069
  "info_ring": 1,
42070
  "input": {
42071
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
42072
  "flags": 1,
42073
  "ignore": "2d312c36342c322c782c",
42074
  "ignore_before": [
 
42381
  },
42382
  {
42383
  "handle": 7,
42384
+ "length": 31,
42385
  "op": "read"
42386
  },
42387
  {
 
42584
  ],
42585
  "info_ring": 1,
42586
  "input": {
42587
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
42588
  "flags": 1,
42589
  "ignore": "",
42590
  "ignore_before": [
 
42897
  },
42898
  {
42899
  "handle": 7,
42900
+ "length": 31,
42901
  "op": "read"
42902
  },
42903
  {
 
43100
  ],
43101
  "info_ring": 1,
43102
  "input": {
43103
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
43104
  "flags": 1,
43105
  "ignore": "",
43106
  "ignore_before": [
 
43413
  },
43414
  {
43415
  "handle": 7,
43416
+ "length": 31,
43417
  "op": "read"
43418
  },
43419
  {
 
43576
  ],
43577
  "info_ring": 1,
43578
  "input": {
43579
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
43580
  "flags": 1,
43581
  "ignore": "312c332c312c",
43582
  "ignore_before": [
 
43851
  ],
43852
  "info_ring": 1,
43853
  "input": {
43854
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
43855
  "flags": 1,
43856
  "ignore": "312c332c312c",
43857
  "ignore_before": [
 
44126
  ],
44127
  "info_ring": 1,
44128
  "input": {
44129
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
44130
  "flags": 1,
44131
  "ignore": "2d312c36342c322c782c",
44132
  "ignore_before": [
 
44406
  ],
44407
  "info_ring": 1,
44408
  "input": {
44409
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
44410
  "flags": 1,
44411
  "ignore": "2d312c36342c322c782c",
44412
  "ignore_before": [
 
44671
  ],
44672
  "info_ring": 1,
44673
  "input": {
44674
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
44675
  "flags": 1,
44676
  "ignore": "",
44677
  "ignore_before": [
 
44941
  ],
44942
  "info_ring": 1,
44943
  "input": {
44944
+ "data": "312e32352c2d322e352c332c39302c3138302c2d34352e350a504c41594552",
44945
  "flags": 1,
44946
  "ignore": "",
44947
  "ignore_before": [
docs/research/rust-health-impulse.json CHANGED
@@ -2985,7 +2985,7 @@
2985
  "exit_code": 2
2986
  }
2987
  ],
2988
- "rust_unit_tests": 156,
2989
  "source_report": "docs/research/qvm-health-impulse.json",
2990
  "source_report_sha256": "625fd8064004ea6dbdf398d51d0af844d9c635ff04c0a0790886dddb6ab81e71"
2991
  }
 
2985
  "exit_code": 2
2986
  }
2987
  ],
2988
+ "rust_unit_tests": 159,
2989
  "source_report": "docs/research/qvm-health-impulse.json",
2990
  "source_report_sha256": "625fd8064004ea6dbdf398d51d0af844d9c635ff04c0a0790886dddb6ab81e71"
2991
  }
docs/research/rust-session-restore.json ADDED
The diff for this file is too large to render. See raw diff
 
scripts/analyze_qvm_session_restore.py CHANGED
@@ -20,7 +20,7 @@ def main():
20
  for j,value in enumerate(old_ignore):m[pointer+3780+4*j]=value
21
  for j,value in enumerate(origin):m[pointer+3716+4*j]=value
22
  for o in SCRATCH:m[RESTORE+o]=scratch
23
- data=b'1.25,-2.5,3,90,180,-45.5' if profile!=3 else b'1,2,x,4,5,6';userinfo=b'' if profile==2 else b'\\cl_guid\\ID';m,p,b=restore_session(ins,m,b,pointer,sessions[profile],ignores[ignore],userinfo,b'ut4_test',7,len(data),data);p.update(input=dict(mode=mode,flags=flags,slot=3,profile=profile,session=sessions[profile].hex(),ignore=ignores[ignore].hex(),scratch=scratch,values=values,ignore_before=old_ignore,origin=origin,userinfo=userinfo.hex(),data=data.hex()),values=[m[pointer+o]&0xffffffff for o in FIELDS],ignore=[m[pointer+3780+4*j]&0xffffffff for j in range(64)],origin=[m[pointer+3716+4*j]&0xffffffff for j in range(6)],ring=m[23708]&0xffffffff,info_ring=m[23712]&0xffffffff);rows.append(p)
24
 
25
  write_json(Path('docs/research/qvm-session-restore.json'),{'source':q['source'],'sha256':q['sha256'],'root':247219,'probes':rows,'limits':'144 actual247219 compositions execute original scanner, signed atoi, comma search, mode classifier and246554 load. Session scan result is ignored: partial fields and explicitly supplied caller-scratch words determine subsequent values; restored booleans use>0, with the final one also requiring team mode and flag1. Ignore tokens set in-range entries to1 without clearing old entries; invalid text maps to0. Actual saved-position load follows cvar restoration. Engine cvars/file bytes and initial scratch are supplied, not assumed initialized; native ownership and full reload integration remain open.'})
26
  if __name__=='__main__':main()
 
20
  for j,value in enumerate(old_ignore):m[pointer+3780+4*j]=value
21
  for j,value in enumerate(origin):m[pointer+3716+4*j]=value
22
  for o in SCRATCH:m[RESTORE+o]=scratch
23
+ data=b'1.25,-2.5,3,90,180,-45.5\nPLAYER' if profile!=3 else b'1,2,x,4,5,6';userinfo=b'' if profile==2 else b'\\cl_guid\\ID';m,p,b=restore_session(ins,m,b,pointer,sessions[profile],ignores[ignore],userinfo,b'ut4_test',7,len(data),data);p.update(input=dict(mode=mode,flags=flags,slot=3,profile=profile,session=sessions[profile].hex(),ignore=ignores[ignore].hex(),scratch=scratch,values=values,ignore_before=old_ignore,origin=origin,userinfo=userinfo.hex(),data=data.hex()),values=[m[pointer+o]&0xffffffff for o in FIELDS],ignore=[m[pointer+3780+4*j]&0xffffffff for j in range(64)],origin=[m[pointer+3716+4*j]&0xffffffff for j in range(6)],ring=m[23708]&0xffffffff,info_ring=m[23712]&0xffffffff);rows.append(p)
24
 
25
  write_json(Path('docs/research/qvm-session-restore.json'),{'source':q['source'],'sha256':q['sha256'],'root':247219,'probes':rows,'limits':'144 actual247219 compositions execute original scanner, signed atoi, comma search, mode classifier and246554 load. Session scan result is ignored: partial fields and explicitly supplied caller-scratch words determine subsequent values; restored booleans use>0, with the final one also requiring team mode and flag1. Ignore tokens set in-range entries to1 without clearing old entries; invalid text maps to0. Actual saved-position load follows cvar restoration. Engine cvars/file bytes and initial scratch are supplied, not assumed initialized; native ownership and full reload integration remain open.'})
26
  if __name__=='__main__':main()
scripts/analyze_rust_session_restore.py ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ import hashlib,json
3
+ from pathlib import Path
4
+ from rust_native_policy_support import binary,result,invoke
5
+ from analyze_qvm import write_json
6
+ def blob(s):return [len(bytes.fromhex(s)),*bytes.fromhex(s)]
7
+ def encode(s):
8
+ a=s['input'];return [a['mode'],a['flags'],a['slot'],a['scratch'],*a['values'],*a['ignore_before'],*a['origin'],*blob(a['session']),*blob(a['ignore']),*blob(a['userinfo']),*blob(a['data'])]
9
+ def project(s):return {k:s[k] for k in ['scan_result','values','ignore','origin','ring','info_ring','cvars']}|{'load_events':s['load']['events'],'load_scan':s['load']['scan_result']}
10
+
11
+ def main():
12
+ b=binary();p=Path('docs/research/qvm-session-restore.json');data=p.read_bytes();rows=[]
13
+ for s in json.loads(data)['probes']:rows.append({'source':project(s),'rust':result(b,'restore-session',encode(s))})
14
+ write_json(Path('docs/research/rust-session-restore.json'),{'source_report':str(p),'source_report_sha256':hashlib.sha256(data).hexdigest(),'probes':rows,'limits':'Rust matches144 actual247219/scanner/atoi/mode/position-load compositions, preserving ignored parse result, explicit caller scratch, positive-only booleans and final team/flag gate. Ignore entries accumulate without clearing and invalid numeric text addresses slot0. State and selector stage atomically on unsupported domains. Native cvars/files, real scratch provenance and full map reload remain open.'})
15
+ if __name__=='__main__':main()
scripts/test_rust_session_restore.py ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ import hashlib,json,unittest
2
+ from pathlib import Path
3
+ class PortTests(unittest.TestCase):
4
+ def test_all_original_cases(self):
5
+ r=json.loads(Path('docs/research/rust-session-restore.json').read_text());src=json.loads(Path(r['source_report']).read_text());self.assertEqual(len(r['probes']),len(src['probes']));self.assertGreater(len(r['probes']),20)
6
+ for p in r['probes']:self.assertEqual(p['rust'],p['source'])
7
+ def test_source_identity(self):
8
+ r=json.loads(Path('docs/research/rust-session-restore.json').read_text());self.assertEqual(hashlib.sha256(Path(r['source_report']).read_bytes()).hexdigest(),r['source_report_sha256'])
9
+ if __name__=='__main__':unittest.main()
xtask/checks.tsv CHANGED
@@ -2788,3 +2788,18 @@ group qvm-session-restore scripts/analyze_qvm_session_restore.py
2788
  edge scripts/analyze_qvm_session_restore.py scripts/analyze_qvm_resumer_audit.py
2789
  group qvm-session-restore scripts/analyze_qvm_numeric_scan.py
2790
  group qvm-session-restore scripts/analyze_qvm_position_load.py
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2788
  edge scripts/analyze_qvm_session_restore.py scripts/analyze_qvm_resumer_audit.py
2789
  group qvm-session-restore scripts/analyze_qvm_numeric_scan.py
2790
  group qvm-session-restore scripts/analyze_qvm_position_load.py
2791
+ edge Cargo.toml scripts/analyze_rust_session_restore.py
2792
+ edge Cargo.lock scripts/analyze_rust_session_restore.py
2793
+ edge crates/urt-gameplay/Cargo.toml scripts/analyze_rust_session_restore.py
2794
+ edge crates/urt-gameplay/src/lib.rs scripts/analyze_rust_session_restore.py
2795
+ edge crates/urt-gameplay/src/native_policy.rs scripts/analyze_rust_session_restore.py
2796
+ edge crates/urt-gameplay/src/bin/urt-native-policy.rs scripts/analyze_rust_session_restore.py
2797
+ edge docs/research/qvm-session-restore.json scripts/analyze_rust_session_restore.py
2798
+ group rust-session-restore scripts/analyze_rust_health_impulse.py
2799
+ group gameplay scripts/analyze_rust_session_restore.py
2800
+ edge crates/urt-gameplay/src/intermission.rs scripts/analyze_rust_session_restore.py
2801
+ report scripts/analyze_rust_session_restore.py docs/research/rust-session-restore.json
2802
+ edge docs/research/rust-session-restore.json scripts/test_rust_session_restore.py
2803
+ group rust-session-restore scripts/analyze_rust_session_restore.py
2804
+ edge scripts/analyze_rust_session_restore.py scripts/analyze_qvm_resumer_audit.py
2805
+ group rust-session-restore scripts/analyze_qvm_session_restore.py
xtask/src/lib.rs CHANGED
@@ -1099,6 +1099,12 @@ mod integration_tests {
1099
  ("map_commands", "normal_map_session"),
1100
  ("transition", "normal_map_session"),
1101
  ("qvm_format", "normal_map_session"),
 
 
 
 
 
 
1102
  ("protected", "protected_update"),
1103
  ("mode10", "mode10_entry"),
1104
  ("intercept_animation", "mode10_animation"),
@@ -1168,6 +1174,11 @@ mod integration_tests {
1168
  ("qvm-session-write", "session_write"),
1169
  ("qvm-post-map-session", "post_map_session"),
1170
  ("qvm-normal-map-session", "normal_map_session"),
 
 
 
 
 
1171
  ("qvm-rank-small-sort", "rank_sort"),
1172
  ("qvm-rank-large-sort", "rank_sort"),
1173
  ("qvm-ranking-complete", "ranking_complete"),
 
1099
  ("map_commands", "normal_map_session"),
1100
  ("transition", "normal_map_session"),
1101
  ("qvm_format", "normal_map_session"),
1102
+ ("native_policy", "info_lookup"),
1103
+ ("native_policy", "numeric_scan"),
1104
+ ("native_policy", "position_save"),
1105
+ ("native_policy", "position_load"),
1106
+ ("native_policy", "session_restore"),
1107
+ ("intermission", "session_restore"),
1108
  ("protected", "protected_update"),
1109
  ("mode10", "mode10_entry"),
1110
  ("intercept_animation", "mode10_animation"),
 
1174
  ("qvm-session-write", "session_write"),
1175
  ("qvm-post-map-session", "post_map_session"),
1176
  ("qvm-normal-map-session", "normal_map_session"),
1177
+ ("qvm-info-lookup", "info_lookup"),
1178
+ ("qvm-numeric-scan", "numeric_scan"),
1179
+ ("qvm-position-save", "position_save"),
1180
+ ("qvm-position-load", "position_load"),
1181
+ ("qvm-session-restore", "session_restore"),
1182
  ("qvm-rank-small-sort", "rank_sort"),
1183
  ("qvm-rank-large-sort", "rank_sort"),
1184
  ("qvm-ranking-complete", "ranking_complete"),