laddercodec 0.2.0__tar.gz → 0.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (569) hide show
  1. {laddercodec-0.2.0 → laddercodec-0.2.1}/.github/workflows/ci.yml +3 -3
  2. {laddercodec-0.2.0 → laddercodec-0.2.1}/.github/workflows/docs.yml +3 -3
  3. {laddercodec-0.2.0 → laddercodec-0.2.1}/.github/workflows/publish.yml +3 -3
  4. laddercodec-0.2.0/CLAUDE.md → laddercodec-0.2.1/AGENTS.md +2 -2
  5. {laddercodec-0.2.0 → laddercodec-0.2.1}/CHANGELOG.md +10 -0
  6. laddercodec-0.2.1/CLAUDE.md +1 -0
  7. {laddercodec-0.2.0 → laddercodec-0.2.1}/PKG-INFO +2 -2
  8. {laddercodec-0.2.0 → laddercodec-0.2.1}/devtools/inspect_bin.py +3 -3
  9. laddercodec-0.2.0/docs/CLAUDE.md → laddercodec-0.2.1/docs/AGENTS.md +1 -1
  10. laddercodec-0.2.1/docs/CLAUDE.md +1 -0
  11. {laddercodec-0.2.0 → laddercodec-0.2.1}/mkdocs.yml +4 -0
  12. {laddercodec-0.2.0 → laddercodec-0.2.1}/pyproject.toml +6 -3
  13. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/csv/converter.py +9 -0
  14. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/csv/writer.py +7 -0
  15. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/send_receive.py +6 -1
  16. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/csv/test_writer.py +87 -0
  17. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/ladder/test_decode_program.py +35 -0
  18. {laddercodec-0.2.0 → laddercodec-0.2.1}/uv.lock +48 -44
  19. {laddercodec-0.2.0 → laddercodec-0.2.1}/.claude/settings.local.json +0 -0
  20. {laddercodec-0.2.0 → laddercodec-0.2.1}/.gitignore +0 -0
  21. {laddercodec-0.2.0 → laddercodec-0.2.1}/LICENSE +0 -0
  22. {laddercodec-0.2.0 → laddercodec-0.2.1}/Makefile +0 -0
  23. {laddercodec-0.2.0 → laddercodec-0.2.1}/README.md +0 -0
  24. {laddercodec-0.2.0 → laddercodec-0.2.1}/add-features-workflow.md +0 -0
  25. {laddercodec-0.2.0 → laddercodec-0.2.1}/devtools/analyze_scr.py +0 -0
  26. {laddercodec-0.2.0 → laddercodec-0.2.1}/devtools/combine_coverage.py +0 -0
  27. {laddercodec-0.2.0 → laddercodec-0.2.1}/devtools/compare_blobs.py +0 -0
  28. {laddercodec-0.2.0 → laddercodec-0.2.1}/devtools/compare_csv.py +0 -0
  29. {laddercodec-0.2.0 → laddercodec-0.2.1}/devtools/coverage_golden.py +0 -0
  30. {laddercodec-0.2.0 → laddercodec-0.2.1}/devtools/create_mr_max_csv.py +0 -0
  31. {laddercodec-0.2.0 → laddercodec-0.2.1}/devtools/diag_blob.py +0 -0
  32. {laddercodec-0.2.0 → laddercodec-0.2.1}/devtools/dump_scr_tags.py +0 -0
  33. {laddercodec-0.2.0 → laddercodec-0.2.1}/devtools/gen_modbus_coverage.py +0 -0
  34. {laddercodec-0.2.0 → laddercodec-0.2.1}/devtools/golden.py +0 -0
  35. {laddercodec-0.2.0 → laddercodec-0.2.1}/devtools/inspect_scr.py +0 -0
  36. {laddercodec-0.2.0 → laddercodec-0.2.1}/devtools/lint.py +0 -0
  37. {laddercodec-0.2.0 → laddercodec-0.2.1}/devtools/pdf_to_png.py +0 -0
  38. {laddercodec-0.2.0 → laddercodec-0.2.1}/devtools/test_decode_scr.py +0 -0
  39. {laddercodec-0.2.0 → laddercodec-0.2.1}/devtools/validate_scr.py +0 -0
  40. {laddercodec-0.2.0 → laddercodec-0.2.1}/devtools/walk_scr.py +0 -0
  41. {laddercodec-0.2.0 → laddercodec-0.2.1}/docs/gen_reference.py +0 -0
  42. {laddercodec-0.2.0 → laddercodec-0.2.1}/docs/guides/adding-instructions.md +0 -0
  43. {laddercodec-0.2.0 → laddercodec-0.2.1}/docs/guides/csv-format.md +0 -0
  44. {laddercodec-0.2.0 → laddercodec-0.2.1}/docs/guides/decoding.md +0 -0
  45. {laddercodec-0.2.0 → laddercodec-0.2.1}/docs/guides/encoding.md +0 -0
  46. {laddercodec-0.2.0 → laddercodec-0.2.1}/docs/guides/troubleshooting.md +0 -0
  47. {laddercodec-0.2.0 → laddercodec-0.2.1}/docs/index.md +0 -0
  48. {laddercodec-0.2.0 → laddercodec-0.2.1}/docs/internals/binary-format.md +0 -0
  49. {laddercodec-0.2.0 → laddercodec-0.2.1}/docs/internals/instruction-blobs.md +0 -0
  50. {laddercodec-0.2.0 → laddercodec-0.2.1}/docs/internals/wire-rendering.md +0 -0
  51. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/__init__.py +0 -0
  52. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/_grid.py +0 -0
  53. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/binary_helpers.py +0 -0
  54. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/cell.py +0 -0
  55. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/csv/__init__.py +0 -0
  56. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/csv/ast.py +0 -0
  57. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/csv/bundle.py +0 -0
  58. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/csv/contract.py +0 -0
  59. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/csv/parser.py +0 -0
  60. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/csv/token_parser.py +0 -0
  61. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/decode.py +0 -0
  62. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/decode_program.py +0 -0
  63. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/empty_multirow.py +0 -0
  64. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/encode.py +0 -0
  65. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/encode_multi.py +0 -0
  66. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/__init__.py +0 -0
  67. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/call.py +0 -0
  68. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/coil.py +0 -0
  69. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/comparison.py +0 -0
  70. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/contact.py +0 -0
  71. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/copy.py +0 -0
  72. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/counter.py +0 -0
  73. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/drum.py +0 -0
  74. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/email.py +0 -0
  75. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/end.py +0 -0
  76. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/family.py +0 -0
  77. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/forloop.py +0 -0
  78. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/home.py +0 -0
  79. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/math.py +0 -0
  80. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/position.py +0 -0
  81. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/raw.py +0 -0
  82. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/return_.py +0 -0
  83. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/search.py +0 -0
  84. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/shift.py +0 -0
  85. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/timer.py +0 -0
  86. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/instructions/velocity.py +0 -0
  87. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/model.py +0 -0
  88. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/resources/empty_multirow_rule_minimal.scaffold.bin +0 -0
  89. {laddercodec-0.2.0 → laddercodec-0.2.1}/src/laddercodec/topology.py +0 -0
  90. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/__init__.py +0 -0
  91. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/csv/test_bundle.py +0 -0
  92. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/csv/test_contract.py +0 -0
  93. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/csv/test_converter.py +0 -0
  94. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/csv/test_parser.py +0 -0
  95. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/csv/test_token_parser.py +0 -0
  96. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/csv/test_writer_raw_validator.py +0 -0
  97. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/coverage.ckp +0 -0
  98. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/blockcopy__block.bin +0 -0
  99. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/blockcopy__block.csv +0 -0
  100. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/blockcopy__oneshot.bin +0 -0
  101. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/blockcopy__oneshot.csv +0 -0
  102. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/blockcopy__to_ascii.bin +0 -0
  103. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/blockcopy__to_ascii.csv +0 -0
  104. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/blockcopy__to_value.bin +0 -0
  105. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/blockcopy__to_value.csv +0 -0
  106. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/call__basic.bin +0 -0
  107. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/call__basic.csv +0 -0
  108. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__and.bin +0 -0
  109. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__and.csv +0 -0
  110. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__eq.bin +0 -0
  111. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__eq.csv +0 -0
  112. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__fall.bin +0 -0
  113. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__fall.csv +0 -0
  114. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__ge.bin +0 -0
  115. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__ge.csv +0 -0
  116. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__gt.bin +0 -0
  117. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__gt.csv +0 -0
  118. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__immediate.bin +0 -0
  119. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__immediate.csv +0 -0
  120. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__le.bin +0 -0
  121. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__le.csv +0 -0
  122. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__lt.bin +0 -0
  123. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__lt.csv +0 -0
  124. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__nc.bin +0 -0
  125. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__nc.csv +0 -0
  126. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__ne.bin +0 -0
  127. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__ne.csv +0 -0
  128. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__no.bin +0 -0
  129. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__no.csv +0 -0
  130. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__or.bin +0 -0
  131. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__or.csv +0 -0
  132. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__rise.bin +0 -0
  133. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__rise.csv +0 -0
  134. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__literal_float.bin +0 -0
  135. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__literal_float.csv +0 -0
  136. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__literal_int.bin +0 -0
  137. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__literal_int.csv +0 -0
  138. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__oneshot.bin +0 -0
  139. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__oneshot.csv +0 -0
  140. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__tag.bin +0 -0
  141. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__tag.csv +0 -0
  142. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_ascii.bin +0 -0
  143. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_ascii.csv +0 -0
  144. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_binary.bin +0 -0
  145. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_binary.csv +0 -0
  146. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_text.bin +0 -0
  147. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_text.csv +0 -0
  148. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_text_exp.bin +0 -0
  149. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_text_exp.csv +0 -0
  150. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_text_sz.bin +0 -0
  151. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_text_sz.csv +0 -0
  152. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_text_term.bin +0 -0
  153. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_text_term.csv +0 -0
  154. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_value.bin +0 -0
  155. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_value.csv +0 -0
  156. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/count_down.bin +0 -0
  157. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/count_down.csv +0 -0
  158. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/count_up__down.bin +0 -0
  159. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/count_up__down.csv +0 -0
  160. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/count_up__reset.bin +0 -0
  161. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/count_up__reset.csv +0 -0
  162. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/end.bin +0 -0
  163. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/end.csv +0 -0
  164. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/event_drum__basic.bin +0 -0
  165. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/event_drum__basic.csv +0 -0
  166. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/event_drum__full.bin +0 -0
  167. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/event_drum__full.csv +0 -0
  168. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/event_drum__jog.bin +0 -0
  169. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/event_drum__jog.csv +0 -0
  170. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/event_drum__jump.bin +0 -0
  171. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/event_drum__jump.csv +0 -0
  172. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/event_drum__max.bin +0 -0
  173. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/event_drum__max.csv +0 -0
  174. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/fill__literal.bin +0 -0
  175. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/fill__literal.csv +0 -0
  176. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/fill__oneshot.bin +0 -0
  177. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/fill__oneshot.csv +0 -0
  178. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/fill__tag.bin +0 -0
  179. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/fill__tag.csv +0 -0
  180. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/forloop__basic.bin +0 -0
  181. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/forloop__basic.csv +0 -0
  182. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/forloop__oneshot.bin +0 -0
  183. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/forloop__oneshot.csv +0 -0
  184. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/latch__block.bin +0 -0
  185. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/latch__block.csv +0 -0
  186. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/latch__immediate.bin +0 -0
  187. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/latch__immediate.csv +0 -0
  188. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/latch__tag.bin +0 -0
  189. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/latch__tag.csv +0 -0
  190. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/math__decimal.bin +0 -0
  191. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/math__decimal.csv +0 -0
  192. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/math__hex.bin +0 -0
  193. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/math__hex.csv +0 -0
  194. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/math__oneshot.bin +0 -0
  195. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/math__oneshot.csv +0 -0
  196. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/off_delay__tof.bin +0 -0
  197. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/off_delay__tof.csv +0 -0
  198. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/on_delay__rton.bin +0 -0
  199. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/on_delay__rton.csv +0 -0
  200. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/on_delay__ton.bin +0 -0
  201. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/on_delay__ton.csv +0 -0
  202. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/out__block.bin +0 -0
  203. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/out__block.csv +0 -0
  204. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/out__immediate.bin +0 -0
  205. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/out__immediate.csv +0 -0
  206. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/out__oneshot.bin +0 -0
  207. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/out__oneshot.csv +0 -0
  208. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/out__tag.bin +0 -0
  209. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/out__tag.csv +0 -0
  210. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_bits.bin +0 -0
  211. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_bits.csv +0 -0
  212. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_bits__oneshot.bin +0 -0
  213. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_bits__oneshot.csv +0 -0
  214. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_text.bin +0 -0
  215. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_text.csv +0 -0
  216. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_text__allow_whitespace.bin +0 -0
  217. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_text__allow_whitespace.csv +0 -0
  218. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_text__oneshot.bin +0 -0
  219. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_text__oneshot.csv +0 -0
  220. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_words.bin +0 -0
  221. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_words.csv +0 -0
  222. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_words__oneshot.bin +0 -0
  223. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_words__oneshot.csv +0 -0
  224. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/raw_instructions__email.bin +0 -0
  225. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/raw_instructions__email.csv +0 -0
  226. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/raw_instructions__home.bin +0 -0
  227. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/raw_instructions__home.csv +0 -0
  228. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/raw_instructions__position.bin +0 -0
  229. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/raw_instructions__position.csv +0 -0
  230. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/raw_instructions__velocity.bin +0 -0
  231. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/raw_instructions__velocity.csv +0 -0
  232. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__rtu_click_block.bin +0 -0
  233. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__rtu_click_block.csv +0 -0
  234. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__rtu_click_single.bin +0 -0
  235. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__rtu_click_single.csv +0 -0
  236. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__rtu_modbus_block.bin +0 -0
  237. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__rtu_modbus_block.csv +0 -0
  238. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__rtu_modbus_single.bin +0 -0
  239. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__rtu_modbus_single.csv +0 -0
  240. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__tcp_click_coil.bin +0 -0
  241. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__tcp_click_coil.csv +0 -0
  242. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__tcp_click_input.bin +0 -0
  243. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__tcp_click_input.csv +0 -0
  244. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__tcp_click_input_reg.bin +0 -0
  245. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__tcp_click_input_reg.csv +0 -0
  246. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__tcp_click_wordswap.bin +0 -0
  247. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__tcp_click_wordswap.csv +0 -0
  248. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/reset__block.bin +0 -0
  249. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/reset__block.csv +0 -0
  250. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/reset__immediate.bin +0 -0
  251. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/reset__immediate.csv +0 -0
  252. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/reset__tag.bin +0 -0
  253. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/reset__tag.csv +0 -0
  254. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/return_early__basic.bin +0 -0
  255. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/return_early__basic.csv +0 -0
  256. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__continuous.bin +0 -0
  257. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__continuous.csv +0 -0
  258. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__eq.bin +0 -0
  259. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__eq.csv +0 -0
  260. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__ge.bin +0 -0
  261. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__ge.csv +0 -0
  262. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__gt.bin +0 -0
  263. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__gt.csv +0 -0
  264. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__le.bin +0 -0
  265. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__le.csv +0 -0
  266. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__lt.bin +0 -0
  267. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__lt.csv +0 -0
  268. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__ne.bin +0 -0
  269. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__ne.csv +0 -0
  270. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__oneshot.bin +0 -0
  271. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__oneshot.csv +0 -0
  272. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__error_off.bin +0 -0
  273. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__error_off.csv +0 -0
  274. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__errorcode_off.bin +0 -0
  275. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__errorcode_off.csv +0 -0
  276. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__rtu_click_block.bin +0 -0
  277. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__rtu_click_block.csv +0 -0
  278. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__rtu_click_single.bin +0 -0
  279. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__rtu_click_single.csv +0 -0
  280. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__rtu_modbus_block.bin +0 -0
  281. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__rtu_modbus_block.csv +0 -0
  282. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__rtu_modbus_single.bin +0 -0
  283. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__rtu_modbus_single.csv +0 -0
  284. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__sending_off.bin +0 -0
  285. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__sending_off.csv +0 -0
  286. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__success_off.bin +0 -0
  287. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__success_off.csv +0 -0
  288. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__tcp_click_coil.bin +0 -0
  289. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__tcp_click_coil.csv +0 -0
  290. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__tcp_click_coils.bin +0 -0
  291. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__tcp_click_coils.csv +0 -0
  292. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__tcp_click_wordswap.bin +0 -0
  293. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__tcp_click_wordswap.csv +0 -0
  294. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/shift__basic.bin +0 -0
  295. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/shift__basic.csv +0 -0
  296. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/time_drum__basic.bin +0 -0
  297. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/time_drum__basic.csv +0 -0
  298. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/time_drum__basic_td.bin +0 -0
  299. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/time_drum__basic_td.csv +0 -0
  300. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/unpack_to_bits.bin +0 -0
  301. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/unpack_to_bits.csv +0 -0
  302. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/unpack_to_bits__oneshot.bin +0 -0
  303. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/unpack_to_bits__oneshot.csv +0 -0
  304. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/unpack_to_words.bin +0 -0
  305. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/unpack_to_words.csv +0 -0
  306. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/unpack_to_words__oneshot.bin +0 -0
  307. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/unpack_to_words__oneshot.csv +0 -0
  308. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/verify_progress.log +0 -0
  309. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/coverage/subroutines/coverage_sub.csv +0 -0
  310. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/drum_weird_branch.bin +0 -0
  311. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-1row-fullwire-nop.bin +0 -0
  312. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-1row-fullwire-nop.csv +0 -0
  313. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-1row-max1400.bin +0 -0
  314. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-1row-max1400.csv +0 -0
  315. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-1row-styled-mixed.bin +0 -0
  316. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-1row-styled-mixed.csv +0 -0
  317. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-2row-max1324.bin +0 -0
  318. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-2row-max1324.csv +0 -0
  319. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-2row-nop-wire.bin +0 -0
  320. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-2row-nop-wire.csv +0 -0
  321. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-32row-sparse.bin +0 -0
  322. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-32row-sparse.csv +0 -0
  323. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-3row-mixed.bin +0 -0
  324. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-3row-mixed.csv +0 -0
  325. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-2row-cond__and.bin +0 -0
  326. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-2row-cond__and.csv +0 -0
  327. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-2row-r0only.bin +0 -0
  328. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-2row-r0only.csv +0 -0
  329. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-2row-spread.bin +0 -0
  330. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-2row-spread.csv +0 -0
  331. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-3row-branch.bin +0 -0
  332. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-3row-branch.csv +0 -0
  333. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-3row-or-colA.bin +0 -0
  334. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-3row-or-colA.csv +0 -0
  335. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-3row-or.bin +0 -0
  336. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-3row-or.csv +0 -0
  337. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-3row-scatter.bin +0 -0
  338. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-3row-scatter.csv +0 -0
  339. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-6row-multi-output.bin +0 -0
  340. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-6row-multi-output.csv +0 -0
  341. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-coil-timer-ret.bin +0 -0
  342. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-coil-timer-ret.csv +0 -0
  343. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-compare-ge.bin +0 -0
  344. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-compare-ge.csv +0 -0
  345. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-compare-series.bin +0 -0
  346. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-compare-series.csv +0 -0
  347. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-compare-timer.bin +0 -0
  348. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-compare-timer.csv +0 -0
  349. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-cond__and.bin +0 -0
  350. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-cond__and.csv +0 -0
  351. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af-T.bin +0 -0
  352. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af-T.csv +0 -0
  353. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af.bin +0 -0
  354. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af.csv +0 -0
  355. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-count_down-row0-data.bin +0 -0
  356. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-count_down-row0-data.csv +0 -0
  357. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-no-out.bin +0 -0
  358. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-no-out.csv +0 -0
  359. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-series.bin +0 -0
  360. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-series.csv +0 -0
  361. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-timer-off.bin +0 -0
  362. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-timer-off.csv +0 -0
  363. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-timer-on.bin +0 -0
  364. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-timer-on.csv +0 -0
  365. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-timer-ret.bin +0 -0
  366. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-timer-ret.csv +0 -0
  367. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-2rung-2row.bin +0 -0
  368. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-2rung-2row.csv +0 -0
  369. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-2rung-wire.bin +0 -0
  370. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-2rung-wire.csv +0 -0
  371. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-3rung-wire-nop.bin +0 -0
  372. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-3rung-wire-nop.csv +0 -0
  373. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-2row.bin +0 -0
  374. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-2row.csv +0 -0
  375. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-both.bin +0 -0
  376. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-both.csv +0 -0
  377. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-r1-max1400.bin +0 -0
  378. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-r1-max1400.csv +0 -0
  379. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-all.bin +0 -0
  380. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-all.csv +0 -0
  381. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-multiinstructions.bin +0 -0
  382. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-multiinstructions.csv +0 -0
  383. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-nopaddedrows.bin +0 -0
  384. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-nopaddedrows.csv +0 -0
  385. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow.bin +0 -0
  386. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow.csv +0 -0
  387. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-instr-2rung.bin +0 -0
  388. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-instr-2rung.csv +0 -0
  389. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-instr-cond__and.bin +0 -0
  390. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-instr-cond__and.csv +0 -0
  391. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/nc-1row-empty.bin +0 -0
  392. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/nc-1row-empty.csv +0 -0
  393. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/nc-1row-fullwire-nop.bin +0 -0
  394. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/nc-1row-fullwire-nop.csv +0 -0
  395. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/nc-32row-empty.bin +0 -0
  396. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/nc-32row-empty.csv +0 -0
  397. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/nc-3row-t-junction.bin +0 -0
  398. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/nc-3row-t-junction.csv +0 -0
  399. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/nc-4row-vertical.bin +0 -0
  400. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/nc-4row-vertical.csv +0 -0
  401. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/verify_progress.log +0 -0
  402. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/scr_captures/counter_scr.bin +0 -0
  403. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/scr_captures/counter_scr.csv +0 -0
  404. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/scr_captures/counter_scr.scr +0 -0
  405. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/scr_captures/coverage.bin +0 -0
  406. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/scr_captures/coverage.csv +0 -0
  407. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/scr_captures/coverage.scr +0 -0
  408. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/scr_captures/or_topology.bin +0 -0
  409. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/scr_captures/or_topology.csv +0 -0
  410. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/scr_captures/or_topology.scr +0 -0
  411. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/scr_captures/shift_scr.bin +0 -0
  412. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/scr_captures/shift_scr.csv +0 -0
  413. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/scr_captures/shift_scr.scr +0 -0
  414. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/scr_captures/time_drums.bin +0 -0
  415. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/scr_captures/time_drums.csv +0 -0
  416. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/scr_captures/time_drums.scr +0 -0
  417. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/main.clipboard.bin +0 -0
  418. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/main.clipboard.csv +0 -0
  419. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/main.csv +0 -0
  420. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/main.scr +0 -0
  421. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/AckAlarm.clipboard.bin +0 -0
  422. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/AckAlarm.clipboard.csv +0 -0
  423. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/AckAlarm.csv +0 -0
  424. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/AckAlarm.scr +0 -0
  425. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.clipboard.bin +0 -0
  426. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.clipboard.csv +0 -0
  427. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.csv +0 -0
  428. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.scr +0 -0
  429. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/AckWarning.clipboard.bin +0 -0
  430. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/AckWarning.clipboard.csv +0 -0
  431. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/AckWarning.csv +0 -0
  432. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/AckWarning.scr +0 -0
  433. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/AlmHistorian.clipboard.bin +0 -0
  434. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/AlmHistorian.clipboard.csv +0 -0
  435. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/AlmHistorian.csv +0 -0
  436. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/AlmHistorian.scr +0 -0
  437. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Blower.clipboard.bin +0 -0
  438. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Blower.clipboard.csv +0 -0
  439. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Blower.csv +0 -0
  440. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Blower.scr +0 -0
  441. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/DisableOutputs.clipboard.bin +0 -0
  442. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/DisableOutputs.clipboard.csv +0 -0
  443. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/DisableOutputs.csv +0 -0
  444. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/DisableOutputs.scr +0 -0
  445. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Heat.clipboard.bin +0 -0
  446. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Heat.clipboard.csv +0 -0
  447. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Heat.csv +0 -0
  448. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Heat.scr +0 -0
  449. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Init.clipboard.bin +0 -0
  450. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Init.clipboard.csv +0 -0
  451. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Init.csv +0 -0
  452. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Init.scr +0 -0
  453. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Maint.clipboard.bin +0 -0
  454. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Maint.clipboard.csv +0 -0
  455. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Maint.csv +0 -0
  456. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Maint.scr +0 -0
  457. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Manual.clipboard.bin +0 -0
  458. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Manual.clipboard.csv +0 -0
  459. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Manual.csv +0 -0
  460. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Manual.scr +0 -0
  461. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ModeChange.clipboard.bin +0 -0
  462. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ModeChange.clipboard.csv +0 -0
  463. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ModeChange.csv +0 -0
  464. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ModeChange.scr +0 -0
  465. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/PLCDateTime.clipboard.bin +0 -0
  466. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/PLCDateTime.clipboard.csv +0 -0
  467. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/PLCDateTime.csv +0 -0
  468. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/PLCDateTime.scr +0 -0
  469. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/PLCErrors.clipboard.bin +0 -0
  470. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/PLCErrors.clipboard.csv +0 -0
  471. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/PLCErrors.csv +0 -0
  472. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/PLCErrors.scr +0 -0
  473. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.clipboard.bin +0 -0
  474. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.clipboard.csv +0 -0
  475. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.csv +0 -0
  476. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.scr +0 -0
  477. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ProductionErrors.clipboard.bin +0 -0
  478. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ProductionErrors.clipboard.csv +0 -0
  479. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ProductionErrors.csv +0 -0
  480. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ProductionErrors.scr +0 -0
  481. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.clipboard.bin +0 -0
  482. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.clipboard.csv +0 -0
  483. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.csv +0 -0
  484. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.scr +0 -0
  485. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ProductionHMI.clipboard.bin +0 -0
  486. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ProductionHMI.clipboard.csv +0 -0
  487. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ProductionHMI.csv +0 -0
  488. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ProductionHMI.scr +0 -0
  489. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ProductionStates.clipboard.bin +0 -0
  490. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ProductionStates.clipboard.csv +0 -0
  491. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ProductionStates.csv +0 -0
  492. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ProductionStates.scr +0 -0
  493. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ReadInputs.clipboard.bin +0 -0
  494. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ReadInputs.clipboard.csv +0 -0
  495. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ReadInputs.csv +0 -0
  496. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ReadInputs.scr +0 -0
  497. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/RecipeChange.clipboard.bin +0 -0
  498. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/RecipeChange.clipboard.csv +0 -0
  499. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/RecipeChange.csv +0 -0
  500. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/RecipeChange.scr +0 -0
  501. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Rotate.clipboard.bin +0 -0
  502. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Rotate.clipboard.csv +0 -0
  503. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Rotate.csv +0 -0
  504. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Rotate.scr +0 -0
  505. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/SFCExample.clipboard.bin +0 -0
  506. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/SFCExample.clipboard.csv +0 -0
  507. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/SFCExample.csv +0 -0
  508. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/SFCExample.scr +0 -0
  509. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/SetOutputs.clipboard.bin +0 -0
  510. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/SetOutputs.clipboard.csv +0 -0
  511. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/SetOutputs.csv +0 -0
  512. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/SetOutputs.scr +0 -0
  513. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/SetOutputsManual.clipboard.bin +0 -0
  514. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/SetOutputsManual.clipboard.csv +0 -0
  515. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/SetOutputsManual.csv +0 -0
  516. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/SetOutputsManual.scr +0 -0
  517. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ThermErrors.clipboard.bin +0 -0
  518. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ThermErrors.clipboard.csv +0 -0
  519. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ThermErrors.csv +0 -0
  520. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/ThermErrors.scr +0 -0
  521. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Validation.clipboard.bin +0 -0
  522. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Validation.clipboard.csv +0 -0
  523. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Validation.csv +0 -0
  524. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/Validation.scr +0 -0
  525. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/WarnTimestamp.clipboard.bin +0 -0
  526. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/WarnTimestamp.clipboard.csv +0 -0
  527. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/WarnTimestamp.csv +0 -0
  528. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/WarnTimestamp.scr +0 -0
  529. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.clipboard.bin +0 -0
  530. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.clipboard.csv +0 -0
  531. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.csv +0 -0
  532. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.scr +0 -0
  533. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.clipboard.bin +0 -0
  534. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.clipboard.csv +0 -0
  535. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.csv +0 -0
  536. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.scr +0 -0
  537. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.clipboard.bin +0 -0
  538. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.clipboard.csv +0 -0
  539. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.csv +0 -0
  540. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.scr +0 -0
  541. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.clipboard.bin +0 -0
  542. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.clipboard.csv +0 -0
  543. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.csv +0 -0
  544. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.scr +0 -0
  545. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.clipboard.bin +0 -0
  546. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.clipboard.csv +0 -0
  547. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.csv +0 -0
  548. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.scr +0 -0
  549. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.clipboard.bin +0 -0
  550. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.clipboard.csv +0 -0
  551. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.csv +0 -0
  552. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.scr +0 -0
  553. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/golden_io.py +0 -0
  554. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/ladder/test_counter.py +0 -0
  555. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/ladder/test_decode.py +0 -0
  556. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/ladder/test_decode_multi.py +0 -0
  557. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/ladder/test_decode_program_tumbler.py +0 -0
  558. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/ladder/test_decode_rtf_oracle.py +0 -0
  559. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/ladder/test_empty_multirow.py +0 -0
  560. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/ladder/test_encode.py +0 -0
  561. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/ladder/test_encode_multi.py +0 -0
  562. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/ladder/test_forloop.py +0 -0
  563. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/ladder/test_math.py +0 -0
  564. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/ladder/test_model.py +0 -0
  565. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/ladder/test_shift.py +0 -0
  566. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/ladder/test_verify_status.py +0 -0
  567. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/test_coverage.py +0 -0
  568. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/test_public_api.py +0 -0
  569. {laddercodec-0.2.0 → laddercodec-0.2.1}/tests/test_smoke.py +0 -0
@@ -25,10 +25,10 @@ jobs:
25
25
  fetch-depth: 0
26
26
 
27
27
  - name: Install uv (official Astral action)
28
- uses: astral-sh/setup-uv@v7
28
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
29
29
  with:
30
- version: "0.9.25"
31
- enable-cache: true
30
+ version: "0.11.29"
31
+ enable-cache: auto
32
32
  python-version: ${{ matrix.python-version }}
33
33
 
34
34
  - name: Set up Python (using uv)
@@ -22,10 +22,10 @@ jobs:
22
22
  uses: actions/checkout@v6
23
23
 
24
24
  - name: Install uv
25
- uses: astral-sh/setup-uv@v7
25
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
26
26
  with:
27
- version: "0.9.25"
28
- enable-cache: true
27
+ version: "0.11.29"
28
+ enable-cache: auto
29
29
  python-version: "3.12"
30
30
 
31
31
  - name: Set up Python
@@ -18,10 +18,10 @@ jobs:
18
18
  fetch-depth: 0
19
19
 
20
20
  - name: Install uv (official Astral action)
21
- uses: astral-sh/setup-uv@v7
21
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
22
22
  with:
23
- version: "0.9.25"
24
- enable-cache: true
23
+ version: "0.11.29"
24
+ enable-cache: auto
25
25
  python-version: "3.12"
26
26
 
27
27
  - name: Set up Python (using uv)
@@ -1,9 +1,9 @@
1
- # CLAUDE.md
1
+ # laddercodec Agent Guidance
2
2
 
3
3
  **IMPORTANT: Don't use `cd` before commands. The working directory is already set to the project root.**
4
4
  **IMPORTANT: Always use `make` commands, not direct `uv run` commands.**
5
5
 
6
- This file provides guidance to Claude Code when working with code in this repository.
6
+ This file provides guidance to coding agents working in this repository.
7
7
 
8
8
  ## Project Overview
9
9
 
@@ -8,6 +8,16 @@
8
8
  Review and condense before release — entries accumulate during development and
9
9
  should be edited into shape before moving from Unreleased to a version heading. -->
10
10
 
11
+ ## 0.2.1 (Unreleased)
12
+
13
+ ### Fixed
14
+ - **SCR decode**: a Modbus `Send` at `device_id=0` no longer decodes as `device_id=1` — SCR blobs elide fields at their class default, and Send's device_id default (0) differs from Receive's (1).
15
+ - **CSV writer**: a `count_up` with `.reset()` wired but `.down()` unused always dehydrates the empty `.down()` row, so the `.reset()` pin row directly follows the counter row even when the reset branch has a floating OR-leg below it.
16
+ - **CSV read**: rows after a counter/shift `.reset()` pin row stay below the instruction's span instead of being absorbed into it, which misplaced a floating OR-leg onto the unused `.down()` row.
17
+
18
+ ### Added
19
+ - **Tests**: synthetic regression coverage for default-elided Send/Receive fields and for floating OR-leg rows below every pinned instruction span (timer, count_up, count_down, shift).
20
+
11
21
  ## 0.2.0
12
22
 
13
23
  ### Fixed
@@ -0,0 +1 @@
1
+ @AGENTS.md
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: laddercodec
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: Binary codec for AutomationDirect CLICK PLC ladder clipboard format
5
5
  Project-URL: Repository, https://github.com/ssweber/laddercodec
6
6
  Project-URL: Documentation, https://ssweber.github.io/laddercodec/
@@ -150,12 +150,12 @@ def main() -> None:
150
150
  print(f"{'=' * 60}")
151
151
 
152
152
  result = decode(data)
153
- if isinstance(result, list):
153
+ if isinstance(result, Rung):
154
+ _print_rung(result, 0)
155
+ else:
154
156
  print(f" Multi-rung: {len(result)} rungs")
155
157
  for i, rung in enumerate(result):
156
158
  _print_rung(rung, i)
157
- else:
158
- _print_rung(result, 0)
159
159
 
160
160
 
161
161
  if __name__ == "__main__":
@@ -1,4 +1,4 @@
1
- # laddercodec Documentation — Context for Claude
1
+ # laddercodec Documentation — Agent Context
2
2
 
3
3
  ## What is laddercodec
4
4
 
@@ -0,0 +1 @@
1
+ @AGENTS.md
@@ -24,6 +24,10 @@ nav:
24
24
  - CSV I/O API: reference/api/csv.md
25
25
  - Instructions API: reference/api/instructions.md
26
26
 
27
+ not_in_nav: |
28
+ AGENTS.md
29
+ CLAUDE.md
30
+
27
31
  plugins:
28
32
  - search
29
33
  - gen-files:
@@ -40,9 +40,9 @@ dependencies = []
40
40
  [dependency-groups]
41
41
  dev = [
42
42
  "pytest>=8.3.5",
43
- "ruff>=0.11.0",
43
+ "ruff>=0.16.0",
44
44
  "striprtf>=0.0.29",
45
- "ty>=0.0.14",
45
+ "ty>=0.0.65",
46
46
  ]
47
47
  docs = [
48
48
  "mkdocs>=1.6.1,<2",
@@ -74,12 +74,15 @@ bump = true
74
74
  packages = ["src/laddercodec"]
75
75
 
76
76
  [tool.uv]
77
+ required-version = ">=0.11.29"
77
78
  exclude-newer = "7 days"
79
+ exclude-newer-package = { ty = "0 days" }
78
80
 
79
81
  # ---- Settings ----
80
82
 
81
83
  [tool.ruff]
82
84
  line-length = 100
85
+ extend-exclude = ["*.md"]
83
86
 
84
87
  [tool.ruff.lint]
85
88
  select = [
@@ -113,7 +116,7 @@ python-version = "3.11"
113
116
  root = ["./src", "./tests", "./devtools"]
114
117
 
115
118
  [tool.ty.src]
116
- exclude = ["tests", "scratchpad"]
119
+ exclude = ["tests", "scratchpad", "devtools/pdf_to_png.py"]
117
120
 
118
121
  [tool.ty.rules]
119
122
  unresolved-import = "ignore"
@@ -240,6 +240,15 @@ def _consume_active_row(block: _ActiveBlock, row: _ParsedRow) -> bool:
240
240
  if len(block.continuations) >= _max_continuations(block):
241
241
  return False
242
242
 
243
+ # .reset() occupies the last row of a counter/shift span, so nothing after
244
+ # it belongs to the block — following rows are floating rows below the
245
+ # span (e.g. the OR-leg of the reset branch). This is what lets the
246
+ # writer dehydrate an unused .down() row above the .reset() pin.
247
+ if isinstance(block.token, (Counter, Shift)) and any(
248
+ c.kind == "pin" and c.pin_name == ".reset" for c in block.continuations
249
+ ):
250
+ return False
251
+
243
252
  if row.kind == "blank":
244
253
  block.continuations.append(row)
245
254
  return True
@@ -201,6 +201,13 @@ def _emit_counter_block(
201
201
  data_row_count = _append_data_row(
202
202
  rows, data_row_count, condition_rows[start + 1], ".down()"
203
203
  )
204
+ elif counter.reset_enabled:
205
+ # The unused .down() row is always empty padding, and the .reset()
206
+ # pin row anchors any following floating rows on reparse — so the
207
+ # empty row always dehydrates, even above a floating row.
208
+ data_row_count = _emit_blank_continuation(
209
+ rows, data_row_count, condition_rows[start + 1]
210
+ )
204
211
  else:
205
212
  data_row_count = _emit_blank_continuation(
206
213
  rows, data_row_count, condition_rows[start + 1], keep
@@ -606,6 +606,8 @@ def _build_remote_start(
606
606
 
607
607
  def _from_tags_rd(tags: dict[int, str], lens: dict[int, int]) -> Receive | None:
608
608
  protocol_mode = tags.get(0x220C, "0")
609
+ # SCR blobs elide fields at their class default. Receive's device_id
610
+ # default is 1; Send's is 0 (see _from_tags_sd).
609
611
  device_id = int(tags.get(0x320E, tags.get(0x60B2, "1")) or "1")
610
612
  target = _build_target(protocol_mode, device_id, tags)
611
613
 
@@ -629,7 +631,10 @@ def _from_tags_rd(tags: dict[int, str], lens: dict[int, int]) -> Receive | None:
629
631
 
630
632
  def _from_tags_sd(tags: dict[int, str], lens: dict[int, int]) -> Send | None:
631
633
  protocol_mode = tags.get(0x220C, "0")
632
- device_id = int(tags.get(0x320E, tags.get(0x60B2, "1")) or "1")
634
+ # SCR blobs elide fields at their class default, and Send's device_id
635
+ # default is 0 (a Send at device_id 0 stores no 0x320E/0x60B2 tag, while
636
+ # one at 1 stores both — verified against a native scr+clipboard pair).
637
+ device_id = int(tags.get(0x320E, tags.get(0x60B2, "0")) or "0")
633
638
  target = _build_target(protocol_mode, device_id, tags)
634
639
 
635
640
  remote_start = _build_remote_start(tags, lens, rd=False)
@@ -1027,3 +1027,90 @@ class TestIndexedMarkers:
1027
1027
  assert rt_indexed.conditions == rt_plain.conditions
1028
1028
  assert rt_indexed.instructions == rt_plain.instructions
1029
1029
  assert rt_indexed.comment == rt_plain.comment
1030
+
1031
+
1032
+ # ---------------------------------------------------------------------------
1033
+ # Floating rows below pinned-instruction spans
1034
+ # ---------------------------------------------------------------------------
1035
+
1036
+
1037
+ def _cells(marker: str, cells: dict[int, str], af: str, fill: str = "-") -> list[str]:
1038
+ """Build one 33-column CSV data row from sparse condition cells."""
1039
+ return [marker] + [cells.get(i, fill) for i in range(31)] + [af]
1040
+
1041
+
1042
+ def _floating_leg_rows(*span_rows: list[str]) -> list[list[str]]:
1043
+ """Append a floating OR-leg row (contact joining a T on the row above)."""
1044
+ return [*span_rows, _cells("", {0: "C1"}, "", fill="")]
1045
+
1046
+
1047
+ _FLOATING_CASES = [
1048
+ pytest.param(
1049
+ _floating_leg_rows(
1050
+ _cells("R", {0: "X001"}, "on_delay(T1,TD1,preset=5000,unit=Tms)"),
1051
+ _cells("", {0: "rise(C2)", 1: "T"}, ".reset()"),
1052
+ ),
1053
+ id="timer_retained",
1054
+ ),
1055
+ pytest.param(
1056
+ _floating_leg_rows(
1057
+ _cells("R", {0: "X001"}, "count_up(CT1,CTD1,preset=60)"),
1058
+ _cells("", {0: "rise(C2)", 1: "T"}, ".reset()"),
1059
+ ),
1060
+ id="count_up_reset_dehydrated",
1061
+ ),
1062
+ pytest.param(
1063
+ _floating_leg_rows(
1064
+ _cells("R", {0: "X001"}, "count_up(CT1,CTD1,preset=60)"),
1065
+ _cells("", {0: "X002"}, ".down()"),
1066
+ _cells("", {0: "rise(C2)", 1: "T"}, ".reset()"),
1067
+ ),
1068
+ id="count_up_down_and_reset",
1069
+ ),
1070
+ pytest.param(
1071
+ _floating_leg_rows(
1072
+ _cells("R", {0: "X001"}, "count_down(CT3,CTD3,preset=50)"),
1073
+ _cells("", {0: "rise(C2)", 1: "T"}, ".reset()"),
1074
+ ),
1075
+ id="count_down",
1076
+ ),
1077
+ pytest.param(
1078
+ _floating_leg_rows(
1079
+ _cells("R", {0: "X001"}, "shift(C99..C106)"),
1080
+ _cells("", {0: "X002"}, ".clock()"),
1081
+ _cells("", {0: "rise(C2)", 1: "T"}, ".reset()"),
1082
+ ),
1083
+ id="shift",
1084
+ ),
1085
+ ]
1086
+
1087
+
1088
+ class TestFloatingRowBelowPinnedSpan:
1089
+ """A floating OR-leg row below a pinned instruction's span must survive
1090
+ CSV -> encode -> decode -> CSV without moving onto a span row, and the
1091
+ writer's emission must equal the canonical input (unused span padding
1092
+ dehydrated, pin rows adjacent)."""
1093
+
1094
+ @pytest.mark.parametrize("data_rows", _FLOATING_CASES)
1095
+ def test_round_trip_preserves_geometry(
1096
+ self, data_rows: list[list[str]], tmp_path: Path
1097
+ ) -> None:
1098
+ from laddercodec import encode
1099
+ from laddercodec.csv import CSV_HEADER
1100
+
1101
+ src = tmp_path / "case.csv"
1102
+ with src.open("w", newline="", encoding="utf-8") as fh:
1103
+ writer = csv.writer(fh)
1104
+ writer.writerow(CSV_HEADER)
1105
+ writer.writerows(data_rows)
1106
+
1107
+ rungs = read_csv(src)
1108
+ assert len(rungs) == 1
1109
+
1110
+ # Writer emission is canonical: identical to the hand-written rows.
1111
+ assert decoded_rung_to_rows(rungs[0]) == data_rows
1112
+
1113
+ # Binary round-trip preserves the same emission.
1114
+ decoded = decode(encode(rungs))
1115
+ decoded_list = decoded if isinstance(decoded, list) else [decoded]
1116
+ assert decoded_rung_to_rows(decoded_list[0]) == data_rows
@@ -24,6 +24,13 @@ from laddercodec.instructions.home import from_tags as home_from_tags
24
24
  from laddercodec.instructions.math import Math
25
25
  from laddercodec.instructions.position import from_tags as position_from_tags
26
26
  from laddercodec.instructions.raw import _decompose_blob, _fields_to_tag_dicts
27
+ from laddercodec.instructions.send_receive import (
28
+ _RD_TYPE_CODE,
29
+ _SD_TYPE_CODE,
30
+ Receive,
31
+ Send,
32
+ )
33
+ from laddercodec.instructions.send_receive import from_tags as send_receive_from_tags
27
34
  from laddercodec.instructions.timer import Timer
28
35
 
29
36
  decode_program_module = importlib.import_module("laddercodec.decode_program")
@@ -532,6 +539,34 @@ def test_decode_program_matches_counter_scr_fixture():
532
539
  assert [_rung_to_lines(r) for r in scr_rungs] == [_rung_to_lines(r) for r in clip_rungs]
533
540
 
534
541
 
542
+ def test_send_receive_elided_device_id_defaults():
543
+ """SCR blobs elide fields at their class default, and the defaults differ
544
+ per class: a Send with no 0x320E/0x60B2 tag is device_id 0, a Receive is
545
+ device_id 1. Verified against a native scr+clipboard pair where a Send at
546
+ device_id 0 stored no tag while one at 1 stored both."""
547
+ base = {
548
+ 0x220C: "2", # protocol: modbus tcp
549
+ 0x320F: "2", # remote_start address type: raw string
550
+ 0x6085: "DS12", # remote_start
551
+ 0x607E: "DS3", # source / dest
552
+ 0x622B: "10.0.0.9",
553
+ }
554
+
555
+ send = send_receive_from_tags("SD", _SD_TYPE_CODE, dict(base), {})
556
+ assert isinstance(send, Send)
557
+ assert send.target.device_id == 0
558
+
559
+ receive = send_receive_from_tags("RD", _RD_TYPE_CODE, dict(base), {})
560
+ assert isinstance(receive, Receive)
561
+ assert receive.target.device_id == 1
562
+
563
+ explicit = dict(base) | {0x320E: "5"}
564
+ send = send_receive_from_tags("SD", _SD_TYPE_CODE, explicit, {})
565
+ receive = send_receive_from_tags("RD", _RD_TYPE_CODE, explicit, {})
566
+ assert send is not None and send.target.device_id == 5
567
+ assert receive is not None and receive.target.device_id == 5
568
+
569
+
535
570
  def test_time_drums_scr_and_bin_both_match_golden_csv():
536
571
  """Time drums across all units + jog/jump, a T-wire branch, and a drum
537
572
  carrying a stray pin-row NOP: SCR, clipboard, and golden CSV all agree."""
@@ -3,9 +3,12 @@ revision = 3
3
3
  requires-python = ">=3.11, <4.0"
4
4
 
5
5
  [options]
6
- exclude-newer = "2026-03-31T13:32:16.9089311Z"
6
+ exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for backwards compatibility when using relative exclude-newer values.
7
7
  exclude-newer-span = "P7D"
8
8
 
9
+ [options.exclude-newer-package]
10
+ ty = { timestamp = "0001-01-01T00:00:00Z", span = "PT0S" }
11
+
9
12
  [[package]]
10
13
  name = "babel"
11
14
  version = "2.18.0"
@@ -236,9 +239,9 @@ docs = [
236
239
  [package.metadata.requires-dev]
237
240
  dev = [
238
241
  { name = "pytest", specifier = ">=8.3.5" },
239
- { name = "ruff", specifier = ">=0.11.0" },
242
+ { name = "ruff", specifier = ">=0.16.0" },
240
243
  { name = "striprtf", specifier = ">=0.0.29" },
241
- { name = "ty", specifier = ">=0.0.14" },
244
+ { name = "ty", specifier = ">=0.0.65" },
242
245
  ]
243
246
  docs = [
244
247
  { name = "mkdocs", specifier = ">=1.6.1,<2" },
@@ -748,27 +751,27 @@ wheels = [
748
751
 
749
752
  [[package]]
750
753
  name = "ruff"
751
- version = "0.15.7"
752
- source = { registry = "https://pypi.org/simple" }
753
- sdist = { url = "https://files.pythonhosted.org/packages/a1/22/9e4f66ee588588dc6c9af6a994e12d26e19efbe874d1a909d09a6dac7a59/ruff-0.15.7.tar.gz", hash = "sha256:04f1ae61fc20fe0b148617c324d9d009b5f63412c0b16474f3d5f1a1a665f7ac", size = 4601277, upload-time = "2026-03-19T16:26:22.605Z" }
754
- wheels = [
755
- { url = "https://files.pythonhosted.org/packages/41/2f/0b08ced94412af091807b6119ca03755d651d3d93a242682bf020189db94/ruff-0.15.7-py3-none-linux_armv6l.whl", hash = "sha256:a81cc5b6910fb7dfc7c32d20652e50fa05963f6e13ead3c5915c41ac5d16668e", size = 10489037, upload-time = "2026-03-19T16:26:32.47Z" },
756
- { url = "https://files.pythonhosted.org/packages/91/4a/82e0fa632e5c8b1eba5ee86ecd929e8ff327bbdbfb3c6ac5d81631bef605/ruff-0.15.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:722d165bd52403f3bdabc0ce9e41fc47070ac56d7a91b4e0d097b516a53a3477", size = 10955433, upload-time = "2026-03-19T16:27:00.205Z" },
757
- { url = "https://files.pythonhosted.org/packages/ab/10/12586735d0ff42526ad78c049bf51d7428618c8b5c467e72508c694119df/ruff-0.15.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7fbc2448094262552146cbe1b9643a92f66559d3761f1ad0656d4991491af49e", size = 10269302, upload-time = "2026-03-19T16:26:26.183Z" },
758
- { url = "https://files.pythonhosted.org/packages/eb/5d/32b5c44ccf149a26623671df49cbfbd0a0ae511ff3df9d9d2426966a8d57/ruff-0.15.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b39329b60eba44156d138275323cc726bbfbddcec3063da57caa8a8b1d50adf", size = 10607625, upload-time = "2026-03-19T16:27:03.263Z" },
759
- { url = "https://files.pythonhosted.org/packages/5d/f1/f0001cabe86173aaacb6eb9bb734aa0605f9a6aa6fa7d43cb49cbc4af9c9/ruff-0.15.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87768c151808505f2bfc93ae44e5f9e7c8518943e5074f76ac21558ef5627c85", size = 10324743, upload-time = "2026-03-19T16:27:09.791Z" },
760
- { url = "https://files.pythonhosted.org/packages/7a/87/b8a8f3d56b8d848008559e7c9d8bf367934d5367f6d932ba779456e2f73b/ruff-0.15.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb0511670002c6c529ec66c0e30641c976c8963de26a113f3a30456b702468b0", size = 11138536, upload-time = "2026-03-19T16:27:06.101Z" },
761
- { url = "https://files.pythonhosted.org/packages/e4/f2/4fd0d05aab0c5934b2e1464784f85ba2eab9d54bffc53fb5430d1ed8b829/ruff-0.15.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0d19644f801849229db8345180a71bee5407b429dd217f853ec515e968a6912", size = 11994292, upload-time = "2026-03-19T16:26:48.718Z" },
762
- { url = "https://files.pythonhosted.org/packages/64/22/fc4483871e767e5e95d1622ad83dad5ebb830f762ed0420fde7dfa9d9b08/ruff-0.15.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4806d8e09ef5e84eb19ba833d0442f7e300b23fe3f0981cae159a248a10f0036", size = 11398981, upload-time = "2026-03-19T16:26:54.513Z" },
763
- { url = "https://files.pythonhosted.org/packages/b0/99/66f0343176d5eab02c3f7fcd2de7a8e0dd7a41f0d982bee56cd1c24db62b/ruff-0.15.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dce0896488562f09a27b9c91b1f58a097457143931f3c4d519690dea54e624c5", size = 11242422, upload-time = "2026-03-19T16:26:29.277Z" },
764
- { url = "https://files.pythonhosted.org/packages/5d/3a/a7060f145bfdcce4c987ea27788b30c60e2c81d6e9a65157ca8afe646328/ruff-0.15.7-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:1852ce241d2bc89e5dc823e03cff4ce73d816b5c6cdadd27dbfe7b03217d2a12", size = 11232158, upload-time = "2026-03-19T16:26:42.321Z" },
765
- { url = "https://files.pythonhosted.org/packages/a7/53/90fbb9e08b29c048c403558d3cdd0adf2668b02ce9d50602452e187cd4af/ruff-0.15.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5f3e4b221fb4bd293f79912fc5e93a9063ebd6d0dcbd528f91b89172a9b8436c", size = 10577861, upload-time = "2026-03-19T16:26:57.459Z" },
766
- { url = "https://files.pythonhosted.org/packages/2f/aa/5f486226538fe4d0f0439e2da1716e1acf895e2a232b26f2459c55f8ddad/ruff-0.15.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b15e48602c9c1d9bdc504b472e90b90c97dc7d46c7028011ae67f3861ceba7b4", size = 10327310, upload-time = "2026-03-19T16:26:35.909Z" },
767
- { url = "https://files.pythonhosted.org/packages/99/9e/271afdffb81fe7bfc8c43ba079e9d96238f674380099457a74ccb3863857/ruff-0.15.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1b4705e0e85cedc74b0a23cf6a179dbb3df184cb227761979cc76c0440b5ab0d", size = 10840752, upload-time = "2026-03-19T16:26:45.723Z" },
768
- { url = "https://files.pythonhosted.org/packages/bf/29/a4ae78394f76c7759953c47884eb44de271b03a66634148d9f7d11e721bd/ruff-0.15.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:112c1fa316a558bb34319282c1200a8bf0495f1b735aeb78bfcb2991e6087580", size = 11336961, upload-time = "2026-03-19T16:26:39.076Z" },
769
- { url = "https://files.pythonhosted.org/packages/26/6b/8786ba5736562220d588a2f6653e6c17e90c59ced34a2d7b512ef8956103/ruff-0.15.7-py3-none-win32.whl", hash = "sha256:6d39e2d3505b082323352f733599f28169d12e891f7dd407f2d4f54b4c2886de", size = 10582538, upload-time = "2026-03-19T16:26:15.992Z" },
770
- { url = "https://files.pythonhosted.org/packages/2b/e9/346d4d3fffc6871125e877dae8d9a1966b254fbd92a50f8561078b88b099/ruff-0.15.7-py3-none-win_amd64.whl", hash = "sha256:4d53d712ddebcd7dace1bc395367aec12c057aacfe9adbb6d832302575f4d3a1", size = 11755839, upload-time = "2026-03-19T16:26:19.897Z" },
771
- { url = "https://files.pythonhosted.org/packages/8f/e8/726643a3ea68c727da31570bde48c7a10f1aa60eddd628d94078fec586ff/ruff-0.15.7-py3-none-win_arm64.whl", hash = "sha256:18e8d73f1c3fdf27931497972250340f92e8c861722161a9caeb89a58ead6ed2", size = 11023304, upload-time = "2026-03-19T16:26:51.669Z" },
754
+ version = "0.16.0"
755
+ source = { registry = "https://pypi.org/simple" }
756
+ sdist = { url = "https://files.pythonhosted.org/packages/4d/94/1e5e4967626faf12fa56999cd6222dff6992ceb086ad7945756baf70c7a7/ruff-0.16.0.tar.gz", hash = "sha256:e460aafd5495ec89efaa6ced2e4a9a581116451e1c88b9d37ef497e0f8e93982", size = 4790557, upload-time = "2026-07-23T19:11:30.981Z" }
757
+ wheels = [
758
+ { url = "https://files.pythonhosted.org/packages/4b/81/1c8818fee7ce1a04cd7d1b3172e0a8f8e4f1dc4feb7fc390e16daa8af323/ruff-0.16.0-py3-none-linux_armv6l.whl", hash = "sha256:e5115729eb08c585e5121978ba5d5b60caeae394ce21b9fb5e6cd33a1c6c9b1e", size = 10754633, upload-time = "2026-07-23T19:10:46.415Z" },
759
+ { url = "https://files.pythonhosted.org/packages/23/df/beaf59c09d68db84304d555f188b276a77132a5d5b0b67a5c762aa143628/ruff-0.16.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3c954b1d580bfa035b41654f7858cc7e71d5fc3ac5b723dd62bd9133830ed522", size = 10969164, upload-time = "2026-07-23T19:10:50.271Z" },
760
+ { url = "https://files.pythonhosted.org/packages/42/ce/741cd197496a1abbf51352710fd15ed995d2a2be87189c1da26a450d6e83/ruff-0.16.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e01c21d10eb1b29f47b7454e1f4056db9a3f0260c646aa88457c610291db9f81", size = 10488846, upload-time = "2026-07-23T19:10:52.639Z" },
761
+ { url = "https://files.pythonhosted.org/packages/52/2a/a2db8e88cade358f5cdcb05674a917751074109315d014eb6352d9a893f7/ruff-0.16.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e364e5ed22ed8dc05082fd78e35308618260907ac2d3c1d637b2e682415b6c9", size = 10889729, upload-time = "2026-07-23T19:10:54.89Z" },
762
+ { url = "https://files.pythonhosted.org/packages/42/65/62a771694ebd63029dc953e27dbad40e1588bd4860ff9fe881018fddaa49/ruff-0.16.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d327b8fc113a1d4421a04f3839d3752057c8dd1ee320223a6f3f52d04ada462a", size = 10568275, upload-time = "2026-07-23T19:10:56.993Z" },
763
+ { url = "https://files.pythonhosted.org/packages/3f/e2/ced249fe8af5f086c5c58cc21cc3356d50f32f7401c5df87050c999620a7/ruff-0.16.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9b50c55e263103586b3dcf5f73d479eb8cb5fdb6098fec59a62891dab653717", size = 11385112, upload-time = "2026-07-23T19:10:59.615Z" },
764
+ { url = "https://files.pythonhosted.org/packages/87/0b/05154977a8fd69eeb6c103271f55403bfd8711f5c0f8ed07489d95a504e7/ruff-0.16.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ff4a79ce3ec0172f3241943835de1c4cb4e2dcd07f0f8c2d02603dbbbee4b17", size = 12207008, upload-time = "2026-07-23T19:11:02.154Z" },
765
+ { url = "https://files.pythonhosted.org/packages/fb/29/98225831a3a1eab0e02f4acc6ca6559a98611dcc68b6965ff4b7234627c1/ruff-0.16.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e95c448fca1fb2a18372a9440926c5a6ee789639bb975c72e7ae6d0b04218ab4", size = 11650842, upload-time = "2026-07-23T19:11:04.557Z" },
766
+ { url = "https://files.pythonhosted.org/packages/91/66/6bd3cf90500653d55dc0ffc8507aa8300bd49d0214b2e8cb4d3fef2943ba/ruff-0.16.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f11a8d11010301d0a398a2fdef67691feca7294da6aef55e2150e8fa2cd520b", size = 11400718, upload-time = "2026-07-23T19:11:09.233Z" },
767
+ { url = "https://files.pythonhosted.org/packages/8e/a2/a54eb4eae05d66364050a5d3b8a9c5ef88196531b3cbe7109d873f87f819/ruff-0.16.0-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:48044c678e9cb8698246c99b14aaccfa6601dea7379eb48a6f8f73f7a6d86cd0", size = 11426177, upload-time = "2026-07-23T19:11:11.994Z" },
768
+ { url = "https://files.pythonhosted.org/packages/1a/be/16e3eea4b2a478a496919f5e36f17c4559e54620bd3bbac5d6affa068006/ruff-0.16.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:7aa0959bad8eb8bef50340154fc9b58678dae31fa4293afa38b44b6e552c0213", size = 10856126, upload-time = "2026-07-23T19:11:14.221Z" },
769
+ { url = "https://files.pythonhosted.org/packages/a2/84/252eb8b868a16eec7257c14f504f77537e734b2d69c762e639e588e304a3/ruff-0.16.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:28ea2b7df8ebf7f9da6b7d47b230ab48f387c0a29be3b474c4d0740e197bb9af", size = 10571208, upload-time = "2026-07-23T19:11:16.378Z" },
770
+ { url = "https://files.pythonhosted.org/packages/21/09/817a482f542f7570cbb4554b26e896610c7114f539b1d9e2d2145bf6bef6/ruff-0.16.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:33a3dfac8c35f81498dea9181bccc2f4c4bc8f1521a1dd9406e77643e0f0fb09", size = 11063329, upload-time = "2026-07-23T19:11:19.173Z" },
771
+ { url = "https://files.pythonhosted.org/packages/2e/23/9403c180ca1cb9b1f7335f5c3e5305c09d49ea5b345196682a36028bde4a/ruff-0.16.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a5237a0bda500d30d81b8e07a6973a5cbc772864cbf746ae2f4e8a2e01c9f4ed", size = 11489751, upload-time = "2026-07-23T19:11:21.74Z" },
772
+ { url = "https://files.pythonhosted.org/packages/b2/1d/1b2ef7bcde851c78d7f17f1cca13fd6dc695fc4b3d6197941e72cae5b132/ruff-0.16.0-py3-none-win32.whl", hash = "sha256:7fab76fa065c873f41ff744347c6e77bcc3dfec4bcc754dc26b63d23c0f7f5fb", size = 10785885, upload-time = "2026-07-23T19:11:23.947Z" },
773
+ { url = "https://files.pythonhosted.org/packages/b2/a3/d5e4ef7a56be3f928ffb90b94c25ba7d3cb9c7fe0736aeaaedf361770712/ruff-0.16.0-py3-none-win_amd64.whl", hash = "sha256:429c117f022bf481fabd9d551e7a3952b24c65e6ef44337ea09d90bebef14472", size = 11923141, upload-time = "2026-07-23T19:11:26.409Z" },
774
+ { url = "https://files.pythonhosted.org/packages/cb/9a/8415f2657cbe200f41a4531ccededf135505a92d4a012229121f885b26f9/ruff-0.16.0-py3-none-win_arm64.whl", hash = "sha256:14296fedcd2705c77ab8235439278bbb38f285cf7da5528b00b3e330c3d4872d", size = 11273407, upload-time = "2026-07-23T19:11:28.705Z" },
772
775
  ]
773
776
 
774
777
  [[package]]
@@ -800,26 +803,27 @@ wheels = [
800
803
 
801
804
  [[package]]
802
805
  name = "ty"
803
- version = "0.0.25"
804
- source = { registry = "https://pypi.org/simple" }
805
- sdist = { url = "https://files.pythonhosted.org/packages/12/bf/3c3147c7237277b0e8a911ff89de7183408be96b31fb42b38edb666d287f/ty-0.0.25.tar.gz", hash = "sha256:8ae3891be17dfb6acab51a2df3a8f8f6c551eb60ea674c10946dc92aae8d4401", size = 5375500, upload-time = "2026-03-24T22:32:34.608Z" }
806
- wheels = [
807
- { url = "https://files.pythonhosted.org/packages/97/a4/6c289cbd1474285223124a4ffb55c078dbe9ae1d925d0b6a948643c7f115/ty-0.0.25-py3-none-linux_armv6l.whl", hash = "sha256:26d6d5aede5d54fb055779460f896d9c1473c6fb996716bd11cb90f027d8fee7", size = 10452747, upload-time = "2026-03-24T22:32:32.662Z" },
808
- { url = "https://files.pythonhosted.org/packages/00/13/74cb9de356b9ceb3f281ab048f8c4ac2207122161b0ac0066886ce129abe/ty-0.0.25-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:aedcfbc7b6b96dbc55b0da78fa02bd049373ff3d8a827f613dadd8bd17d10758", size = 10271349, upload-time = "2026-03-24T22:32:13.041Z" },
809
- { url = "https://files.pythonhosted.org/packages/0e/93/ffc5a20cc9e14fa9b32b0c54884864bede30d144ce2ae013805bce0c86d0/ty-0.0.25-py3-none-macosx_11_0_arm64.whl", hash = "sha256:0a8fb3c1e28f73618941811e2568dca195178a1a6314651d4ee97086a4497253", size = 9730308, upload-time = "2026-03-24T22:32:19.24Z" },
810
- { url = "https://files.pythonhosted.org/packages/6d/78/52e05ef32a5f172fce70633a4e19d8e04364271a4322ae12382c7344b0de/ty-0.0.25-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:814870b7f347b5d0276304cddb98a0958f08de183bf159abc920ebe321247ad4", size = 10247664, upload-time = "2026-03-24T22:32:08.669Z" },
811
- { url = "https://files.pythonhosted.org/packages/c2/64/0d0a47ed0aa1d634c666c2cc15d3b0af4b95d0fd3dbb796032bd493f3433/ty-0.0.25-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:781150e23825dc110cd5e1f50ca3d61664f7a5db5b4a55d5dbf7d3b1e246b917", size = 10261961, upload-time = "2026-03-24T22:32:43.935Z" },
812
- { url = "https://files.pythonhosted.org/packages/3e/ba/4666b96f0499465efb97c244554107c541d74a1add393e62276b3de9b54f/ty-0.0.25-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc81ff2a0143911321251dc81d1c259fa5cdc56d043019a733c845d55409e2a", size = 10746076, upload-time = "2026-03-24T22:32:26.37Z" },
813
- { url = "https://files.pythonhosted.org/packages/e7/ed/aa958ccbcd85cc206600e48fbf0a1c27aef54b4b90112d9a73f69ed0c739/ty-0.0.25-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f03c5c5b5c10355ea030cbe3cd93b2e759b9492c66688288ea03a68086069f2e", size = 11287331, upload-time = "2026-03-24T22:32:21.607Z" },
814
- { url = "https://files.pythonhosted.org/packages/26/e4/f4a004e1952e6042f5bfeeb7d09cffb379270ef009d9f8568471863e86e6/ty-0.0.25-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fc1ef49cd6262eb9223ccf6e258ac899aaa53e7dc2151ba65a2c9fa248dfa75", size = 11028804, upload-time = "2026-03-24T22:32:39.088Z" },
815
- { url = "https://files.pythonhosted.org/packages/56/32/5c15bb8ea20ed54d43c734f253a2a5da95d41474caecf4ef3682df9f68f5/ty-0.0.25-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad98da1393161096235a387cc36abecd31861060c68416761eccdb7c1bc326b", size = 10845246, upload-time = "2026-03-24T22:32:41.33Z" },
816
- { url = "https://files.pythonhosted.org/packages/6f/fe/4ddd83e810c8682fcfada0d1c9d38936a34a024d32d7736075c1e53a038e/ty-0.0.25-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2d4336aa5381eb4eab107c3dec75fe22943a648ef6646f5a8431ef1c8cdabb66", size = 10233515, upload-time = "2026-03-24T22:32:17.012Z" },
817
- { url = "https://files.pythonhosted.org/packages/ad/db/9fe54f6fb952e5b218f2e661e64ed656512edf2046cfbb9c159558e255db/ty-0.0.25-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e10ed39564227de2b7bd89398250b65daaedbef15a25cef8eee70078f5d9e0b2", size = 10275289, upload-time = "2026-03-24T22:32:28.21Z" },
818
- { url = "https://files.pythonhosted.org/packages/b1/e0/090d7b33791b42bc7ec29463ac6a634738e16b289e027608ebe542682773/ty-0.0.25-py3-none-musllinux_1_2_i686.whl", hash = "sha256:aca04e9ed9b61c706064a1c0b71a247c3f92f373d0222103f3bc54b649421796", size = 10461195, upload-time = "2026-03-24T22:32:24.252Z" },
819
- { url = "https://files.pythonhosted.org/packages/42/31/5bf12bce01b80b72a7a4e627380779b41510e730f6000862a1d078e423f7/ty-0.0.25-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:18a5443e4ef339c1bd8c57fc13112c22080617ea582bfc22b497d82d65361325", size = 10931471, upload-time = "2026-03-24T22:32:14.985Z" },
820
- { url = "https://files.pythonhosted.org/packages/6a/5e/ab60c11f8a6dd2a0ae96daac83458ef2e9be1ae70481d1ad9c59d3eaf20f/ty-0.0.25-py3-none-win32.whl", hash = "sha256:a685b9a611b69195b5a557e05dbb7ebcd12815f6c32fb27fdf15edeb1fa33d8f", size = 9835974, upload-time = "2026-03-24T22:32:36.86Z" },
821
- { url = "https://files.pythonhosted.org/packages/41/55/625acc2ef34646268bc2baa8fdd6e22fb47cd5965e2acd3be92c687fb6b0/ty-0.0.25-py3-none-win_amd64.whl", hash = "sha256:0d4d37a1f1ab7f2669c941c38c65144ff223eb51ececd7ccfc0d623afbc0f729", size = 10815449, upload-time = "2026-03-24T22:32:11.031Z" },
822
- { url = "https://files.pythonhosted.org/packages/82/c7/0147bfb543df97740b45b222c54ff79ef20fa57f14b9d2c1dab3cd7d3faa/ty-0.0.25-py3-none-win_arm64.whl", hash = "sha256:d80b8cd965cbacbfd887ac2d985f5b6da09b7aa3569371e2894e0b30b26b89cd", size = 10225494, upload-time = "2026-03-24T22:32:30.611Z" },
806
+ version = "0.0.65"
807
+ source = { registry = "https://pypi.org/simple" }
808
+ sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cf561927e8e9ab5c1892a833b664aa9cd6f051a75f6280c66d8047246bda/ty-0.0.65.tar.gz", hash = "sha256:b7134bffcc00b715fa8291e84d845782ced810a998dc1f7f11d71c85c4046325", size = 6460098, upload-time = "2026-07-29T18:31:03.27Z" }
809
+ wheels = [
810
+ { url = "https://files.pythonhosted.org/packages/7b/4e/71e2d325d2b53a1afad81624ad076b2ede413213fc4a18cb05b78c568571/ty-0.0.65-py3-none-linux_armv6l.whl", hash = "sha256:dc556c9f05408bef4c4ef02b2cc382e4e5f797b4b20d64410289848f0d76705f", size = 12298466, upload-time = "2026-07-29T18:30:12.744Z" },
811
+ { url = "https://files.pythonhosted.org/packages/57/77/fec8f29647c55794efa430a7f365e44f5ce7ffb6459d9445a87fac569bec/ty-0.0.65-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:29d2e0d34cc0a28a17ef0cf81135c5ebabc3562131f9079138ba5e7bae0f56bd", size = 11942421, upload-time = "2026-07-29T18:30:16.076Z" },
812
+ { url = "https://files.pythonhosted.org/packages/13/09/7f3766aef9dc627e2698cf4e3e59cf53389dcae3812040d33c1aa931230f/ty-0.0.65-py3-none-macosx_11_0_arm64.whl", hash = "sha256:685f49a9312bbf69d5b65bbb66384fed1f927403ea030c217b9289092d7e46c4", size = 11451922, upload-time = "2026-07-29T18:30:19.155Z" },
813
+ { url = "https://files.pythonhosted.org/packages/cb/7b/1a77cd50e0befb50f55b8bf9bd3ed3eddf184bf28c61b56727039e0774fc/ty-0.0.65-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f564b5ebe78e2f3a8e7b8eacb1292eb88b7c0f3c8630671cfca31abc0709cd9", size = 11994999, upload-time = "2026-07-29T18:30:22.315Z" },
814
+ { url = "https://files.pythonhosted.org/packages/63/7b/feda16f3a4a0a99be27431e0c9598eeeec0db1eb2fec9a15976698209418/ty-0.0.65-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c983e156fe9e113fb56389e13d327b6b8549fe866de9b269684723a88e9b732d", size = 12090662, upload-time = "2026-07-29T18:30:24.93Z" },
815
+ { url = "https://files.pythonhosted.org/packages/ed/3e/3f69bf9c9307dbdc0771719f65ce5b556e7bdeeaccbdd599d4f57866d801/ty-0.0.65-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3663b7396e8b1a9954e20e732de7ccb0192bf4118473069b4945920d6923921", size = 12822094, upload-time = "2026-07-29T18:30:28.012Z" },
816
+ { url = "https://files.pythonhosted.org/packages/90/38/8fa791b3bb503ee2b46ad81690cd1bdd54519582df6d805cee57fe143e85/ty-0.0.65-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:306ed01f29d6e108e98feb233dbbf5878a027603b71bd3743b343977933a9f16", size = 13357833, upload-time = "2026-07-29T18:30:31.122Z" },
817
+ { url = "https://files.pythonhosted.org/packages/c1/73/4dda396a201e1dd0ed3594a9b48e559cb41c4bc048c6cd4c4d1b39eb4313/ty-0.0.65-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28bcfc8898c94f079a9100e684bcf312b6a64ad3a7d4ebb35a4591546030a2cd", size = 12977303, upload-time = "2026-07-29T18:30:33.944Z" },
818
+ { url = "https://files.pythonhosted.org/packages/a5/26/c250c2c569adc53a8591716641388397bcb2a442e4a30b952ae81b50c0e0/ty-0.0.65-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a75bd0c245c38802a8f488378e74f92feb7dd33db7d63fbdd6fdf82791ba730", size = 12579338, upload-time = "2026-07-29T18:30:37.199Z" },
819
+ { url = "https://files.pythonhosted.org/packages/d3/94/4a5647d44753ca218fc930d7e4d9bf468d0ed4a0ad4b3d57588bc1bbacf7/ty-0.0.65-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9e5e1bdea9662d2b5312b4e99f319f4e6e2ea427511b5fbc546141b79ec53f76", size = 12957731, upload-time = "2026-07-29T18:30:39.937Z" },
820
+ { url = "https://files.pythonhosted.org/packages/36/b6/1e22fa11a1e0dfb20b1c7f3cbfd8170273aada2a82f9ecd3055275370c44/ty-0.0.65-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:03a88493d4842889f65280ae241e06b399d57eb3c63571054cad21a4c33b3b69", size = 11938625, upload-time = "2026-07-29T18:30:42.603Z" },
821
+ { url = "https://files.pythonhosted.org/packages/5c/0a/fe5f22ef62b193201bc5566762e22049762cd485bfafb5095a7050760054/ty-0.0.65-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:600b8bf6f4940cf7ffb2f43d3716faaf38dcb97cd8617c55771451bc0276408f", size = 12105592, upload-time = "2026-07-29T18:30:45.419Z" },
822
+ { url = "https://files.pythonhosted.org/packages/76/fd/922b3a6e9d697452cdbb4b7e3f636868add5ec652154518a736e4364f3b7/ty-0.0.65-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0c28007bc79d648c1ddaf1e65885d07baec48eb87240da442f608e4107c1b7d8", size = 12387335, upload-time = "2026-07-29T18:30:48.405Z" },
823
+ { url = "https://files.pythonhosted.org/packages/77/22/a1a08ebc84c083db2fb55e3b5cd186db0c067692f4921146f601360231e2/ty-0.0.65-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:c852da96091ad22361e6586b7c7ba98e1334dcd4d8ffb67e47f4fb673de33f77", size = 12682710, upload-time = "2026-07-29T18:30:51.364Z" },
824
+ { url = "https://files.pythonhosted.org/packages/81/14/eaaa410a25bbdea19722109b5422380a0e211b3afcf3071d15953ddbd5db/ty-0.0.65-py3-none-win32.whl", hash = "sha256:cf529d538f1403b14b0511e6ec3cdb95d3d974adabf24cc76cedc533368c3edc", size = 11692341, upload-time = "2026-07-29T18:30:54.35Z" },
825
+ { url = "https://files.pythonhosted.org/packages/bc/0f/6d48f206dce9d7e53fe3b5ea0f0ab5800dd9d2365b2b48f736783436c43f/ty-0.0.65-py3-none-win_amd64.whl", hash = "sha256:234a321e33c7cbbfbd67bfa0b01b685dd9c21f1841781a21e5ca1fa0b25f1d5d", size = 12729355, upload-time = "2026-07-29T18:30:57.275Z" },
826
+ { url = "https://files.pythonhosted.org/packages/96/aa/7446f7725e303cf78e058c893af1f0552b9451895454908706f4c6c3494b/ty-0.0.65-py3-none-win_arm64.whl", hash = "sha256:b9424be1ec56d93ff18609fb1c0a0a2283fe1282cd6d1c7604f97d73b94d61f2", size = 12051375, upload-time = "2026-07-29T18:31:00.579Z" },
823
827
  ]
824
828
 
825
829
  [[package]]
File without changes
File without changes
File without changes
File without changes
File without changes