diff --git a/docs/CARS.md b/docs/CARS.md index 6de24235386..fb841819960 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -1,6 +1,6 @@ -# Support Information for 402 Known Cars +# Support Information for 403 Known Cars |Make|Model|Package|Support Level| |---|---|---|:---:| @@ -263,6 +263,7 @@ |Nissan|Rogue 2018-20|ProPILOT Assist|[Upstream](#upstream)| |Nissan|X-Trail 2017|ProPILOT Assist|[Upstream](#upstream)| |Peugeot|208 2019-25|Adaptive Cruise Control (ACC) & Lane Assist|[Dashcam mode](#dashcam)| +|Peugeot|308 2018|Conventional cruise control|[Dashcam mode](#dashcam)| |Porsche|Macan 2017-24|Adaptive Cruise Control (ACC) & Lane Assist|[Dashcam mode](#dashcam)| |Ram|1500 2019-24|Adaptive Cruise Control (ACC)|[Upstream](#upstream)| |Ram|2500 2020-24|Adaptive Cruise Control (ACC)|[Dashcam mode](#dashcam)| diff --git a/opendbc/car/psa/carcontroller.py b/opendbc/car/psa/carcontroller.py index 792deccee9d..553fd8262d0 100644 --- a/opendbc/car/psa/carcontroller.py +++ b/opendbc/car/psa/carcontroller.py @@ -1,9 +1,9 @@ from opendbc.can.packer import CANPacker -from opendbc.car import Bus +from opendbc.car import Bus, structs from opendbc.car.lateral import apply_std_steer_angle_limits from opendbc.car.interfaces import CarControllerBase from opendbc.car.psa.psacan import create_lka_steering -from opendbc.car.psa.values import CarControllerParams +from opendbc.car.psa.values import CAR, CarControllerParams class CarController(CarControllerBase): @@ -12,8 +12,15 @@ def __init__(self, dbc_names, CP): self.packer = CANPacker(dbc_names[Bus.main]) self.apply_angle_last = 0 self.status = 2 + self.read_only = CP.carFingerprint == CAR.PSA_PEUGEOT_308_T9 def update(self, CC, CS, now_nanos): + if self.read_only: + self.frame += 1 + # No CAN output, even if a caller explicitly requests lateral/longitudinal + # control. Report zero applied actuators rather than echoing the request. + return structs.CarControl.Actuators(), [] + can_sends = [] actuators = CC.actuators diff --git a/opendbc/car/psa/carstate.py b/opendbc/car/psa/carstate.py index 0daaafe1756..7bc51bf15a0 100644 --- a/opendbc/car/psa/carstate.py +++ b/opendbc/car/psa/carstate.py @@ -1,13 +1,16 @@ from opendbc.car import structs, Bus from opendbc.can.parser import CANParser from opendbc.car.common.conversions import Conversions as CV -from opendbc.car.psa.values import DBC, CarControllerParams +from opendbc.car.psa.values import CAR, DBC, CarControllerParams from opendbc.car.interfaces import CarStateBase GearShifter = structs.CarState.GearShifter class CarState(CarStateBase): def update(self, can_parsers) -> structs.CarState: + if self.CP.carFingerprint == CAR.PSA_PEUGEOT_308_T9: + return self._update_t9(can_parsers[Bus.main]) + cp = can_parsers[Bus.main] cp_adas = can_parsers[Bus.adas] cp_cam = can_parsers[Bus.cam] @@ -62,8 +65,70 @@ def update(self, can_parsers) -> structs.CarState: ret.seatbeltUnlatched = cp_cam.vl['RESTRAINTS']['DRIVER_SEATBELT'] != 2 return ret + def _update_t9(self, cp) -> structs.CarState: + ret = structs.CarState() + self.parse_wheel_speeds(ret, + cp.vl['T9_WHEEL_SPEEDS_30D']['WheelSpeedFrontLeftKph'], + cp.vl['T9_WHEEL_SPEEDS_30D']['WheelSpeedFrontRightKph'], + cp.vl['T9_WHEEL_SPEEDS_30D']['WheelSpeedRearLeftKph'], + cp.vl['T9_WHEEL_SPEEDS_30D']['WheelSpeedRearRightKph'], + ) + ret.standstill = ret.vEgoRaw < 0.1 + ret.yawRate = cp.vl['T9_BRAKE_DYNAMICS_3CD']['YawRateDegS'] * CV.DEG_TO_RAD + ret.gasPressed = cp.vl['T9_ENGINE_DYNAMICS_208']['AcceleratorPositionPct'] > 0 + ret.brakePressed = bool(cp.vl['T9_BODY_STATUS_412']['BrakePedalActive']) + # The 0x412 parking-brake bit never became active in the local corpus. + ret.parkingBrake = cp.vl['T9_EASY_MOVE_3AD']['ParkingBrakeState'] == 1 + + ret.steeringAngleDeg = cp.vl['T9_STEERING_DYNAMICS_305']['SteeringAngleDeg'] + rate = cp.vl['T9_STEERING_DYNAMICS_305']['SteeringRateMagnitudeDegS'] + rate_sign = cp.vl['T9_STEERING_DYNAMICS_305']['SteeringRateSign'] + ret.steeringRateDeg = rate * (1 if rate_sign == 0 else -1) + ret.steeringTorque = cp.vl['T9_STEERING_TORQUE_2F5']['DriverTorqueRaw'] + ret.steeringPressed = self.update_steering_pressed(abs(ret.steeringTorque) > CarControllerParams.T9_STEER_DRIVER_THRESHOLD_RAW, 5) + + # 0x208 carries the persistent RVV state; 0x452 carries a request, not a latch. + cruise_mode = cp.vl['T9_CRUISE_SETPOINT_50E']['CruiseMode'] + ret.cruiseState.available = cruise_mode == 1 + ret.cruiseState.enabled = cruise_mode == 1 and cp.vl['T9_ENGINE_DYNAMICS_208']['CruiseStateCandidate'] == 2 + setpoint = cp.vl['T9_CRUISE_SETPOINT_50E']['CruiseSetpointKph'] + ret.cruiseState.speed = setpoint * CV.KPH_TO_MS if cruise_mode == 1 and setpoint < 255 else 0. + # Only the conventional-cruise reference vehicle is covered. + ret.cruiseState.nonAdaptive = True + + reverse = bool(cp.vl['T9_BODY_STATUS_412']['ReverseGearActive']) + # The candidate gear field in 0x348 stays zero even in the moving capture. + # Only the independent reverse indication is used until gear is validated. + ret.gearShifter = GearShifter.reverse if reverse else GearShifter.unknown + + blinker = cp.vl['T9_DRIVER_CRUISE_COMMAND_452']['TurnSignalStatus'] + ret.leftBlinker = blinker in (2, 3) + ret.rightBlinker = blinker in (1, 3) + ret.doorOpen = any(cp.vl['T9_BODY_STATUS_412'][signal] for signal in ( + 'DriverDoorOpen', 'PassengerDoorOpen', 'RearLeftDoorOpen', 'RearRightDoorOpen', + )) + ret.seatbeltUnlatched = cp.vl['T9_RESTRAINTS_572']['DriverSeatbeltState'] != 2 + return ret + @staticmethod def get_can_parsers(CP): + if CP.carFingerprint == CAR.PSA_PEUGEOT_308_T9: + # Only the observed live CAN stream is mapped to logical bus 0. + # A split camera/powertrain harness topology has not been validated. + messages = [ + ('T9_ENGINE_DYNAMICS_208', 100), + ('T9_STEERING_TORQUE_2F5', 100), + ('T9_STEERING_DYNAMICS_305', 100), + ('T9_WHEEL_SPEEDS_30D', 50), + ('T9_EASY_MOVE_3AD', 50), + ('T9_BRAKE_DYNAMICS_3CD', 100), + ('T9_BODY_STATUS_412', 20), + ('T9_DRIVER_CRUISE_COMMAND_452', 20), + ('T9_CRUISE_SETPOINT_50E', 10), + ('T9_RESTRAINTS_572', 10), + ] + return {Bus.main: CANParser(DBC[CP.carFingerprint][Bus.pt], messages, 0)} + return { Bus.main: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 0), Bus.adas: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 1), diff --git a/opendbc/car/psa/fingerprints.py b/opendbc/car/psa/fingerprints.py index 497f8bb134d..58b908f4956 100644 --- a/opendbc/car/psa/fingerprints.py +++ b/opendbc/car/psa/fingerprints.py @@ -4,6 +4,80 @@ Ecu = CarParams.Ecu +FINGERPRINTS = { + # Captured from the reference 308 T9 on the AEE2010 live bus. Diagnostic + # response 0x7E8 is intentionally excluded by openpilot fingerprinting. + CAR.PSA_PEUGEOT_308_T9: [{ + 0x072: 5, + 0x1E8: 8, + 0x208: 8, + 0x228: 8, + 0x2E8: 4, + 0x2ED: 7, + 0x2F5: 7, + 0x305: 7, + 0x30D: 8, + 0x329: 4, + 0x348: 8, + 0x349: 8, + 0x34D: 8, + 0x389: 5, + 0x38D: 8, + 0x3AD: 8, + 0x3B8: 7, + 0x3C8: 2, + 0x3C9: 8, + 0x3CD: 8, + 0x3F2: 8, + 0x40D: 8, + 0x412: 8, + 0x42D: 4, + 0x432: 8, + 0x438: 8, + 0x44D: 8, + 0x452: 6, + 0x468: 7, + 0x488: 8, + 0x489: 8, + 0x48E: 4, + 0x492: 6, + 0x495: 4, + 0x4B2: 8, + 0x4CE: 8, + 0x4D2: 3, + 0x4F2: 8, + 0x50D: 8, + 0x50E: 8, + 0x517: 7, + 0x52E: 8, + 0x532: 5, + 0x54E: 8, + 0x552: 8, + 0x56E: 6, + 0x572: 8, + 0x57C: 6, + 0x588: 8, + 0x58E: 8, + 0x592: 8, + 0x5AE: 5, + 0x5B2: 8, + 0x5CE: 3, + 0x5D2: 4, + 0x5ED: 3, + 0x5EE: 4, + 0x5F8: 5, + 0x608: 8, + 0x612: 8, + 0x788: 8, + 0x789: 8, + 0x78D: 8, + 0x792: 8, + 0x795: 6, + 0x797: 6, + 0x7A8: 4, + }], +} + FW_VERSIONS = { CAR.PSA_PEUGEOT_208: { (Ecu.fwdRadar, 0x6b6, None): [ diff --git a/opendbc/car/psa/interface.py b/opendbc/car/psa/interface.py index f719a3d6aaa..f7539aca3ff 100644 --- a/opendbc/car/psa/interface.py +++ b/opendbc/car/psa/interface.py @@ -2,6 +2,7 @@ from opendbc.car.interfaces import CarInterfaceBase from opendbc.car.psa.carcontroller import CarController from opendbc.car.psa.carstate import CarState +from opendbc.car.psa.values import CAR TransmissionType = structs.CarParams.TransmissionType @@ -27,4 +28,17 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_lo ret.alphaLongitudinalAvailable = False - return ret \ No newline at end of file + if candidate == CAR.PSA_PEUGEOT_308_T9: + ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.noOutput)] + # Factory captures suggest a torque API; no EPS calibration is supplied. + # Keep an inert PID configuration for this observation-only interface. + ret.steerControlType = structs.CarParams.SteerControlType.torque + ret.lateralTuning.pid.kpBP = [0.] + ret.lateralTuning.pid.kpV = [0.] + ret.lateralTuning.pid.kiBP = [0.] + ret.lateralTuning.pid.kiV = [0.] + ret.steerAtStandstill = False + ret.openpilotLongitudinalControl = False + ret.autoResumeSng = False + + return ret diff --git a/opendbc/car/psa/psacan.py b/opendbc/car/psa/psacan.py index a039e752a0e..195a6dd3b55 100644 --- a/opendbc/car/psa/psacan.py +++ b/opendbc/car/psa/psacan.py @@ -1,5 +1,5 @@ def psa_checksum(address: int, sig, d: bytearray) -> int: - chk_ini = {0x452: 0x4, 0x38D: 0x7, 0x42D: 0xC}.get(address, 0xB) + chk_ini = {0x3AD: 0xD, 0x3CD: 0x3, 0x452: 0x4, 0x38D: 0x7, 0x42D: 0xC}.get(address, 0xB) byte = sig.start_bit // 8 d[byte] &= 0x0F if sig.start_bit % 8 >= 4 else 0xF0 checksum = sum((b >> 4) + (b & 0xF) for b in d) diff --git a/opendbc/car/psa/tests/__init__.py b/opendbc/car/psa/tests/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/opendbc/car/psa/tests/fixtures/README.md b/opendbc/car/psa/tests/fixtures/README.md new file mode 100644 index 00000000000..511dd83d04b --- /dev/null +++ b/opendbc/car/psa/tests/fixtures/README.md @@ -0,0 +1,40 @@ +# Peugeot 308 T9 RX fixtures + +These are two-second excerpts from a single 2018 Peugeot 308 II T9 reference +vehicle with conventional cruise control. They are ESP32 recordings, not comma +routes. `provenance.json` records the source and exported file SHA-256 hashes, +source clock offsets and frame counts. + +The export keeps only standard, non-RTR, RX frames from the `live` bus, with the +address and DLC declared in `psa_308_t9_2018.dbc`. Payload bytes and frame order +are unchanged. `time_us` is the ESP32 source timestamp minus `source_start_us`. +Only frames in `[source_start_us, source_start_us + duration_us)` are retained. +The live stream is mapped to logical bus 0. This does not establish the physical +camera/powertrain bus topology on a comma harness. + +| Fixture | Frames | Final mean wheel speed | Final steering angle | +| --- | ---: | ---: | ---: | +| `stationary.csv` | 1,120 | 0 km/h | 534.7 degrees | +| `moving.csv` | 1,140 | 125.815 km/h | 5.2 degrees | + +The files contain ten allowlisted messages. VIN, diagnostic traffic, GPS, +absolute wall-clock timestamps, session metadata and actuation messages are +excluded. The source journals remain local to the research repository. + +Run the replay, protection, fingerprint and no-output tests from the repo root: + +```sh +uv run python -m unittest opendbc.car.psa.tests.test_peugeot_308_t9 +``` + +The test feeds frames at their recorded relative times, checks validity after +initialization, verifies final decoded values and tests timeout after reception +stops. Other tests use explicitly synthetic signal overrides and single-bit +corruptions; those are not additional vehicle observations. + +Known gaps: no comma route or validated production harness, no ECU firmware +fingerprint, no EPS torque calibration, and no validated forward/Park/Neutral +gear signal. The former candidate in the low nibble of `0x348` stays zero in +both complete source captures, including the moving one, so it is omitted. +Geometry and the inactive lateral-acceleration placeholder need separate review +before any future control work. This contribution provides no actuation support. diff --git a/opendbc/car/psa/tests/fixtures/moving.csv b/opendbc/car/psa/tests/fixtures/moving.csv new file mode 100644 index 00000000000..5fc5c99a20f --- /dev/null +++ b/opendbc/car/psa/tests/fixtures/moving.csv @@ -0,0 +1,1141 @@ +time_us,address,data +0,30D,31923182309B30C4 +182,2F5,1302007FFF0001 +395,305,001A0007B70020 +672,3AD,000000008011005E +1690,2F5,1401007FFF0001 +1881,208,539C613648613261 +1971,305,001A0007480020 +2152,3CD,000200000B2260FD +3468,208,5377613648613261 +3567,305,001A0087D90020 +3763,2F5,0501007FFF0001 +3852,3CD,000200000B2260EE +3954,452,000000030000 +4169,30D,3182318D30A630B9 +4448,3AD,000000008031006B +4903,3CD,000300000B2260CF +4992,2F5,F601007FFF0001 +5176,208,539C613648613261 +5591,305,001A00076A0020 +5730,412,1000000000760000 +7612,3CD,000300000B2260B0 +8387,208,539C613648613261 +8605,305,001A00077B0020 +9076,30D,3192319830A630AD +9325,2F5,E701007FFF0001 +9532,50E,220000142C427FAD +10006,572,98807D8081000011 +10611,3AD,000000008001007D +17789,2F5,D801007FFF0001 +18375,208,539C613648613261 +18601,305,001A00070C0020 +19076,3CD,000100000B2260C1 +28524,208,539C613648613261 +28660,305,001A00071D0020 +29060,2F5,B902007FFF0001 +29311,3CD,000100000B2260B2 +29801,30D,318D317F309830C4 +31593,3AD,0000000080310089 +37588,3CD,000100000B2260A3 +37817,2F5,BA01007FFF0001 +38416,208,539C613648613261 +38759,305,001A00072E0020 +39818,452,000000030000 +47713,3CD,000100000B226094 +48377,208,539C613648613261 +48621,305,001A00073F0020 +49121,30D,3182318D30A330B3 +49282,2F5,8B01007FFF0021 +49564,412,1000000000760000 +50599,3AD,000000008001009B +57753,2F5,8C00007FFF0021 +58373,208,539C613648613261 +58592,305,001A0087400020 +59070,3CD,000100000B226085 +67594,3CD,000100000B226076 +68383,208,539C613648613261 +68613,305,001A0007D10020 +69081,30D,3195319530A330AB +69326,2F5,7D01007FFF0011 +70598,3AD,00000000800100AA +77582,3CD,000000000B226077 +77832,2F5,4E01007FFF0031 +78447,208,5377613648623261 +78614,305,001A0007E20020 +88359,208,5377613648623261 +88592,305,001A0007F30020 +89045,2F5,4F01007FFF0021 +89317,3CD,000000000B226068 +89502,452,000000030000 +89743,30D,31873182309B30C4 +91617,3AD,00000000804100B5 +97745,2F5,4000007FFF0021 +98372,208,5377613648623261 +98585,305,001A0007840020 +99081,3CD,000300000B226029 +99514,412,1000000000760000 +108367,208,539C613648623261 +108608,305,001A0007950020 +109066,3CD,000300000B22601A +109312,2F5,2100007FFF0031 +109543,50E,220000142C427FAF +109749,30D,3187319230A630B0 +109984,572,98807D8081000011 +111616,3AD,00000000800100C8 +117593,3CD,000200000B22601B +117822,2F5,0200007FFF0041 +118437,208,5377613648623261 +118625,305,001A0007A60020 +127590,3CD,000200000B22600C +128378,208,5377613648623261 +128613,305,001A0007B70020 +129054,30D,3195318A30A030B3 +129348,2F5,0300007FFF0031 +130581,3AD,00000000800100D7 +137772,2F5,E400007FFF0041 +138384,208,539C613648623261 +138627,305,001A0007480020 +139082,3CD,000000000B22601D +139506,452,000000030000 +148378,208,539C613648623261 +148623,305,001A0007590020 +149089,2F5,F500007FFF0021 +149347,3CD,000000000B22600E +149554,412,1000000000760000 +149773,30D,31853185309B30C4 +151603,3AD,00000000804100E2 +157615,3CD,000300000B2260CF +157817,2F5,D600007FFF0031 +158443,208,539C613648623261 +158621,305,001A00076A0020 +167577,3CD,000300000B2260B0 +168384,208,539C613648623261 +168625,305,001A00077B0020 +169091,30D,3190319830AB30A9 +169353,2F5,C700007FFF0031 +170613,3AD,000000007FD100FA +177762,2F5,A800007FFF0041 +178354,208,539C613648623261 +178621,305,001A00070C0020 +179044,3CD,000200000B2260B1 +188342,208,539C613648623261 +188575,305,001A00071D0020 +189062,3CD,000200000B2260A2 +189293,2F5,B900007FFF0021 +189489,452,000000030000 +189726,30D,31953187309830B9 +191602,3AD,0000000080010004 +197582,3CD,FFFF00000B2260F3 +197827,2F5,9A00007FFF0031 +198437,208,539C613648623261 +198627,305,001A00072E0020 +199374,412,1000000000760000 +207598,3CD,FFFF00000B2260E4 +208395,208,539C613648623262 +208626,305,001A00073F0020 +208893,30D,318A3192309B30BE +209072,50E,220000142C427FA1 +209553,2F5,5B00007FFF0061 +210033,572,98807D8081000011 +210590,3AD,000000008051001E +217788,2F5,3C00007FFF0071 +218359,208,539C623748623262 +218629,305,001A0007C00020 +219098,3CD,000300000B226065 +228395,208,539C623748623262 +228570,305,001A0007D10020 +229049,3CD,000300000B226056 +229303,2F5,4D00007FFF0051 +229743,30D,319A319D30AB30A9 +231599,3AD,000000007FF10025 +237599,3CD,000200000B226057 +237819,2F5,0E00007FFF0081 +238464,208,53C0623748623262 +238628,305,001A0007E20020 +239553,452,000000030000 +247589,3CD,000200000B226048 +248386,208,53C0623748623262 +248613,305,001A0007F30020 +249096,30D,3195318A309B30BE +249376,2F5,0F00007FFF0071 +249538,412,1000000000760000 +250622,3AD,0000000080010031 +257782,2F5,1000007FFF0051 +258423,208,539C623748623262 +258650,305,001A0007840020 +259121,3CD,000200000B226039 +267611,3CD,000200000B22602A +268590,305,001A0107850120 +268804,30D,318A3198309B30B9 +269033,208,539C623748623262 +269268,2F5,D100007FFF0081 +270615,3AD,000000008011004F +277585,3CD,000400010B2260EB +277812,2F5,D200007FFF0071 +278435,208,539C623748623262 +278624,305,001A0007A60020 +288353,208,539C623748623262 +288577,305,001B0007A70020 +289054,3CD,000400010B2260DC +289300,2F5,C300007FFF0071 +289511,452,000000030000 +289715,30D,31A031A330A930A3 +291598,3AD,000000007FF10052 +297785,2F5,B400007FFF0071 +298559,305,001B0007580020 +298791,3CD,000200020B2260DD +299020,208,539C623748623262 +299514,412,1000000000760000 +308369,208,539C623748623262 +308576,305,001B0107590120 +309062,3CD,000200020B2260CE +309342,2F5,9500007FFF0081 +309504,50E,220000142C427FA3 +309737,30D,3198318D308C30BE +309996,572,98807D8081000011 +311602,3AD,000000008041006A +317601,3CD,000200020B2260BF +317834,2F5,8600007FFF0081 +318341,208,539C623748623262 +318579,305,001C01071A0120 +327591,3CD,000200020B2260A0 +328584,305,001C01070B0120 +328792,208,53C0623748623262 +329006,30D,319531A630A030B9 +329476,2F5,6700007FFF0091 +330653,3AD,0000000080410079 +337793,2F5,4800007FFF00A1 +338375,208,53C0623748623262 +338623,305,001D01076C0120 +339113,3CD,000300040B226061 +339470,452,000000030000 +347582,3CD,000300040B226052 +348378,208,539C623748623262 +348609,305,001E01074D0120 +349053,30D,31A0319A30AB30B0 +349366,2F5,6900007FFF0071 +349541,412,1000000000760000 +350596,3AD,000000008001008C +357601,3CD,000200040B226053 +357806,2F5,6A00007FFF0061 +358597,305,001E01077E0120 +358863,208,539C623748623262 +368356,208,539C623748623262 +368568,305,001E01076F0120 +369041,3CD,000200040B226044 +369302,2F5,5B00007FFF0061 +369747,30D,31923190309B30BE +371615,3AD,000000008011009A +377785,2F5,5C00007FFF0051 +378362,208,53C0623748623262 +378637,305,001F0107800120 +379074,3CD,000500040B226005 +388588,305,001F0107910120 +388827,208,53C0623748623262 +389070,3CD,000500040B2260F6 +389267,2F5,3D00007FFF0061 +389463,452,000000030000 +389702,30D,319831AB309B30B0 +391597,3AD,000000007FF100AD +397601,3CD,000700040B2260C7 +397830,2F5,FE00007FFF0091 +398335,208,53C0623748623262 +398598,305,00200107620120 +399418,412,1000000000760000 +407598,3CD,000700040B2260B8 +408394,208,539C623748623262 +408590,305,00200107730120 +409066,30D,31A03198309D30AD +409339,2F5,0F00007FFF0071 +409525,50E,220000142C427FA5 +409998,572,98807D8081000011 +410605,3AD,00000000800100B9 +417772,2F5,2000007FFF0041 +418599,305,00200107040120 +418799,208,53C0623748623262 +419033,3CD,000400060B2260B9 +427598,3CD,000400060B2260AA +428385,208,53C0623748623262 +428615,305,00210107050120 +429071,30D,31953198309D30C7 +429355,2F5,D100007FFF0081 +430592,3AD,00000000805100C3 +437597,3CD,000800060B22605B +437821,2F5,B200007FFF0091 +438326,208,539C623748623262 +439021,305,00210107360120 +439532,452,000000030000 +447687,3CD,000800060B22604C +448593,208,539C623748623262 +448771,30D,319A31AB30A930B6 +449198,2F5,B300007FFF0081 +449505,305,00220107170120 +449906,412,1000000000760000 +450603,3AD,00000000800100D7 +457776,2F5,8400007FFF00A1 +458361,208,539C623748623262 +458823,3CD,000700060B22604D +459090,305,00230107F80120 +467593,3CD,000700060B22603E +468389,208,539C623748623262 +468586,305,00230207D90220 +469043,30D,3198319230A630BC +469326,2F5,8500007FFF0091 +470597,3AD,00000000800100E6 +477605,3CD,000700060B22602F +477814,2F5,9600007FFF0071 +478538,208,539C623748623262 +479004,305,002402079A0220 +487589,3CD,000700060B226010 +488370,208,539C623648613261 +488615,305,002502079B0220 +489045,30D,3190319D30A330CF +489302,2F5,6700007FFF0091 +489499,452,000000030000 +490587,3AD,00000000805100F0 +497757,2F5,5800007FFF0091 +498347,208,539C623648613261 +498846,3CD,000C00060B2260B1 +499053,305,00260107EC0120 +499522,412,1000000000760000 +508486,208,53C0623648613261 +508736,3CD,000C00060B2260A2 +508956,305,00260107FD0120 +509173,2F5,4900007FFF0091 +509646,30D,319A31A630B330B6 +509884,50E,220000142C427FA7 +510209,572,98807D8081000011 +511613,3AD,0000000080310001 +517605,3CD,000900070B2260B3 +517805,2F5,4A00007FFF0081 +518348,208,53C0623648613261 +519041,305,00270207EE0220 +527582,3CD,000900070B2260A4 +528352,208,539C623648613261 +528591,305,002802070F0220 +529049,30D,3190318D30A030CF +529291,2F5,7B00007FFF0041 +530600,3AD,0000000080010013 +537789,2F5,2C01007FFF0071 +538480,208,539C623648613261 +538730,3CD,000800090B226085 +538946,305,00280207F00220 +539507,452,000000030000 +547606,3CD,000800090B226076 +548369,208,539C623648613261 +548586,305,00290207F10220 +549057,30D,319031A030A630CF +549370,2F5,1D00007FFF0081 +549546,412,1000000000770000 +550602,3AD,000000008051002D +557606,3CD,000E00070B226027 +557827,2F5,0E00007FFF0081 +558343,208,539C623648613261 +559032,305,00290107F20120 +567600,3CD,000E00070B226018 +568587,305,002A0107D30120 +568823,30D,31A0319A30B330B6 +569098,2F5,FF00007FFF0081 +569320,208,539C623648613261 +570701,3AD,0000000080010031 +577780,2F5,1000007FFF0051 +578376,208,539C623648613261 +578625,305,002A0107A40120 +579070,3CD,000B00070B226039 +588357,208,539C623648613261 +588602,305,002B0207950220 +589070,3CD,000B00070B22602A +589328,2F5,F100007FFF0061 +589503,452,000000030000 +589713,30D,3187318D30A030D1 +591613,3AD,000000008011004F +604953,3CD,000C00070B22600B +605048,2F5,E200007FFF0061 +605227,305,002C0207D60220 +605406,208,539C623648613261 +605496,412,1000000000770000 +607617,3CD,000C00070B2260FC +608383,208,539C623648613261 +608598,305,002C0107F70120 +609082,30D,319031A930A630C7 +609293,2F5,F300007FFF0041 +609563,50E,220000142C427FA9 +609995,572,98807D8081000011 +610605,3AD,0000000080810057 +617793,2F5,F400007FFF0031 +618380,208,539C623648613261 +618641,305,002D0107180120 +619109,3CD,001000070B22609D +627597,3CD,001000070B22608E +628605,305,002D0107090120 +628829,30D,319A319530B030BE +629304,208,539C623648613261 +629505,2F5,C500007FFF0051 +630689,3AD,000000008001006E +637612,3CD,000D00090B22609F +637831,2F5,D600007FFF0031 +638336,208,539C623648613261 +639014,305,002D01073A0120 +639805,452,000000030000 +648365,208,53C0623648613261 +648888,3CD,000D00090B226080 +649064,305,002D01072B0120 +649340,2F5,B700007FFF0041 +649538,412,1000000000770000 +649770,30D,31873192309D30D7 +651604,3AD,000000008011007C +657787,2F5,9800007FFF0051 +658605,305,002E01076C0120 +658814,3CD,000E000A0B226051 +659105,208,539C623648613261 +668325,208,539C623648613261 +668791,3CD,000E000A0B226042 +669023,305,002E00076D0020 +669250,2F5,7900007FFF0061 +669850,30D,319531AE30A930C4 +671620,3AD,0000000080410088 +677601,3CD,000F000A0B226023 +677833,2F5,5A00007FFF0071 +678354,208,539C623648603260 +679048,305,002E01074E0120 +688592,305,002F01074F0120 +688808,208,539C623648603260 +689066,3CD,000F000A0B226014 +689532,2F5,4B00007FFF0071 +689756,30D,3198319530AB30BE +689960,452,000000030000 +691601,3AD,000000007FD10090 +697789,2F5,6C00007FFF0041 +698622,208,539C623648603260 +698806,3CD,000F000B0B2260F5 +699242,305,00300207600220 +699947,412,1000000000770000 +708317,208,539C623648603260 +708806,3CD,000F000B0B2260E6 +709035,305,00310207610220 +709257,2F5,4D00007FFF0051 +709469,50E,220000142C427FAB +709698,30D,3187319D309D30D4 +709953,572,98807D8081000011 +711610,3AD,00000000803100A7 +717605,3CD,0012000B0B226097 +717829,2F5,4E00007FFF0041 +718586,305,00310207520220 +718870,208,539C613648603260 +727607,3CD,0012000B0B226088 +728330,208,539C613648603260 +728818,30D,319831AB30A930C1 +729023,305,00320107430120 +729238,2F5,3F00007FFF0041 +730615,3AD,00000000803100B6 +737798,2F5,3000007FFF0031 +738328,208,53C0613548603260 +738802,3CD,0012000B0B226079 +739095,305,00320107340120 +739439,452,000000030000 +747605,3CD,0012000B0B22606A +748533,208,539C613548603260 +748753,30D,3192319530A630C7 +749191,2F5,4100007FFF0011 +749449,305,00320107250120 +749925,412,1000000000770000 +750617,3AD,000000007FF100CB +757591,3CD,000F000B0B22609B +757830,2F5,3200007FFF0011 +758321,208,539C613548603260 +759005,305,00320007060020 +767611,3CD,000F000B0B22608C +768343,208,539C613548603260 +768790,30D,318D31AB309D30DA +769037,305,00320107070120 +769233,2F5,2300007FFF0011 +770612,3AD,00000000803100D4 +777790,2F5,F400007FFF0031 +778575,208,53C0613548603260 +778762,3CD,0015000B0B22600D +779232,305,00330007F80020 +788323,208,53C0613548603260 +788802,3CD,0015000B0B2260FE +789008,305,00330007E90020 +789226,2F5,0500007FFF0011 +789453,452,000000030000 +789803,30D,31A631AE30A930BE +791598,3AD,000000007FF100E9 +797604,3CD,0015000C0B2260DF +797829,2F5,F600007FFF0011 +798311,208,53C0613548603260 +798614,305,00330007DA0020 +799365,412,1000000000770000 +808532,208,53C0613548603260 +808772,3CD,0015000C0B2260C0 +809241,2F5,E700007FFF0011 +809448,305,00330107DB0120 +809681,30D,3190319830A030C7 +809916,50E,220000142C427FAD +810273,572,98807D8081000011 +811612,3AD,000000007FD100FA +817784,2F5,D800007FFF0011 +818324,208,53C0613548603260 +818796,3CD,0012000C0B2260E1 +819101,305,00340107DC0120 +827597,3CD,0012000C0B2260D2 +828322,208,53C0613548603260 +828621,305,00340007DD0020 +829075,30D,319231B3309830D1 +829366,2F5,C900007FFF0011 +830603,3AD,0000000080310001 +837607,3CD,0016000D0B226073 +837823,2F5,AA00007FFF0021 +838567,208,539C613548603260 +839020,305,00340007EE0020 +839560,452,000000030000 +847606,3CD,0016000D0B226064 +848306,208,539C613548603260 +848624,305,00340007FF0020 +849069,30D,31A331A930A030B0 +849367,2F5,AB00007FFF0011 +849561,412,1000000000770000 +850596,3AD,0000000080010013 +857792,2F5,7C00007FFF0031 +858622,305,00340007000020 +858844,208,539C613548603260 +859074,3CD,0014000D0B226075 +868504,208,53C0613548603260 +868743,3CD,0014000D0B226066 +869212,2F5,9D00007FFF0001 +869419,305,00340107010120 +869633,30D,31873198309830CF +871622,3AD,0000000080010022 +877605,3CD,0013000D0B226067 +877829,2F5,8E00007FFF0001 +878309,208,53C0613548603260 +879007,305,00340007220020 +888556,208,539C613548603260 +888773,3CD,0013000D0B226058 +889037,305,00350007230020 +889476,2F5,6F00007FFF0011 +889684,30D,319831AE309D30CF +889898,452,000000030000 +891614,3AD,000000008031003E +897785,2F5,2000007FFF0041 +898493,208,539C613548603260 +898734,3CD,0017000D0B226009 +899159,305,00350007540020 +899862,412,1000000000770000 +908318,208,539C613548603260 +908803,3CD,0017000D0B2260FA +909002,305,00350007450020 +909233,2F5,2100007FFF0031 +909486,50E,220000142C427FAF +909701,30D,319D31A030AB30BE +909949,572,98807D8081000011 +911603,3AD,0000000080010040 +917605,3CD,0014000D0B22601B +917826,2F5,F200007FFF0051 +918500,208,53C0613548603260 +919172,305,00350007760020 +927605,3CD,0014000D0B22600C +928514,208,539C613548603260 +928734,30D,318731A0309B30DD +929201,2F5,0300007FFF0031 +929448,305,00350107770120 +930605,3AD,000000008001005F +937793,2F5,E401007FFF0031 +938392,208,539C613548603260 +938631,305,00360107B80120 +939115,3CD,0014000F0B2260DD +939535,452,000000030000 +948466,208,539C603548603260 +948674,3CD,0014000F0B2260CE +949161,2F5,F500007FFF0021 +949374,305,00360107A90120 +949589,30D,319A31AB30A330D4 +949846,412,1000000000770000 +951612,3AD,0000000080510069 +957598,3CD,0017000F0B22608F +957814,2F5,0600007FFF0001 +958619,305,003600078A0020 +958893,208,539C613548603260 +967597,3CD,0017000F0B226070 +968306,208,539C613548603260 +968773,30D,3195319830AD30C1 +968988,305,003701079B0120 +969225,2F5,F700007FFF0001 +970595,3AD,000000008001007D +977795,2F5,E800007FFF0001 +978460,208,539C613548603260 +978679,3CD,0012000F0B2260B1 +979131,305,00370007FC0020 +988477,208,539C603548603260 +988691,3CD,0012000F0B2260A2 +989147,2F5,D900007FFF0001 +989388,305,00370007ED0020 +989596,30D,318231A6309B30DD +989809,452,000000030000 +991620,3AD,0000000080410088 +997597,3CD,001400100B226053 +997829,2F5,CA00007FFF0001 +998292,208,539C603548603260 +998994,305,00370007DE0020 +999415,412,1000000000770000 +1008324,208,539C603548603260 +1008876,3CD,001400100B226044 +1009053,305,00370007CF0020 +1009343,2F5,BB00007FFF0001 +1009511,50E,220000142C427FA1 +1009734,30D,319531A630A330D1 +1009956,572,98807D8081000011 +1011599,3AD,0000000080310098 +1017772,2F5,AC00007FFF0001 +1018422,208,539C603548603260 +1018659,3CD,001700110B2260F5 +1019121,305,00370007300020 +1028308,208,539C603548603260 +1028760,3CD,001700110B2260E6 +1028999,305,00370007210020 +1029231,2F5,8D00007FFF0011 +1029677,30D,318D319230AB30C4 +1031608,3AD,00000000801100A9 +1037597,3CD,001300110B226017 +1037838,2F5,8E00007FFF0001 +1038291,208,539C603548603260 +1038995,305,00370007120020 +1039510,452,000000030000 +1047608,3CD,001300110B226008 +1048298,208,53C0603548603260 +1048762,30D,318531AB309830DD +1048978,305,00370007030020 +1049214,2F5,7F00007FFF0001 +1049484,412,1000000000770000 +1050607,3AD,00000000807100B2 +1057785,2F5,6000007FFF0001 +1058303,208,539C603548603260 +1058768,3CD,001500110B2260D9 +1059087,305,00370007740020 +1067605,3CD,001500110B2260CA +1068273,208,539C603548603260 +1068769,30D,319831A330A630CA +1068993,305,00370007650020 +1069220,2F5,4101007FFF0001 +1070618,3AD,00000000800100C8 +1077605,3CD,001700100B2260AB +1077828,2F5,6201007FFFFFF1 +1078289,208,539C603548603260 +1078990,305,00370007560020 +1088288,208,539C603548603260 +1088767,3CD,001700100B22609C +1088987,305,00370007470020 +1089215,2F5,2301007FFF0001 +1089425,452,000000030000 +1089653,30D,3185319030A630CF +1091596,3AD,00000000800100D7 +1097797,2F5,1401007FFF0001 +1098291,208,539C603548603260 +1098781,3CD,001400100B2260BD +1099081,305,00370007B80020 +1099449,412,1000000000770000 +1108293,208,5377603548603260 +1108767,3CD,001400100B2260AE +1109000,305,00370107B90120 +1109216,2F5,2502007FFFFFF1 +1109460,50E,220000142C427FA3 +1109675,30D,318531AE309530D7 +1109900,572,98807D8081000011 +1111599,3AD,00000000808100EE +1117600,3CD,001600100B22607F +1117840,2F5,F601007FFF0001 +1118293,208,539C603548603260 +1118998,305,003700079A0020 +1127601,3CD,001600100B226060 +1128277,208,539C603548603260 +1128777,30D,3192319530A930C4 +1128966,305,003700078B0020 +1129200,2F5,D702007FFF0001 +1130595,3AD,00000000800100F5 +1137807,2F5,C802007FFF0001 +1138283,208,53C0603548603260 +1138769,3CD,001400100B226071 +1138992,305,00370007FC0020 +1139404,452,000000030000 +1148295,208,539C603548603260 +1148768,3CD,001400100B226062 +1149005,305,00370107FD0120 +1149303,2F5,B902007FFF0001 +1149478,412,1000000000770000 +1149693,30D,317C3192309D30D1 +1151611,3AD,0000000080010004 +1157605,3CD,001300110B226053 +1157828,2F5,9A03007FFF0001 +1158290,208,539C603548603260 +1159002,305,003800072E0020 +1167769,3CD,001300110B226044 +1168314,208,539C603548603260 +1168776,30D,318A31AE309830DA +1168976,305,003801072F0120 +1169206,2F5,7B03007FFF0011 +1170596,3AD,000000008041001F +1177777,2F5,5C03007FFF0021 +1178280,208,53C0603548603260 +1178768,3CD,001500100B226025 +1179056,305,00380007C00020 +1188349,208,53C0603548603260 +1188815,3CD,001500100B226016 +1189048,305,00380007D10020 +1189263,2F5,4D04007FFF0011 +1189477,452,000000030000 +1189734,30D,3192318D30AB30C1 +1191622,3AD,000000007FC10028 +1197594,3CD,0014000F0B226037 +1197810,2F5,4E04007FFF0001 +1198304,208,5377603548603260 +1199005,305,00380107F20120 +1199397,412,1000000000770000 +1207585,3CD,0014000F0B226028 +1208314,208,5377603548603260 +1208855,30D,317F31A9309530D4 +1208996,305,00390007E30020 +1209303,2F5,2F04007FFF0011 +1209480,50E,220000142C427FA5 +1209964,572,98807D8081000011 +1210608,3AD,0000000080110030 +1217793,2F5,0004007FFF0021 +1218263,208,5377603548603260 +1218769,3CD,001700100B2260C9 +1219061,305,00390107840120 +1227616,3CD,001700100B2260BA +1228309,208,539C603548603260 +1228785,30D,319031AB309530CF +1228990,305,00390107950120 +1229203,2F5,0105007FFF0001 +1230615,3AD,000000008031004D +1237615,3CD,001900100B22608B +1237835,2F5,D204007FFF0031 +1238300,208,5377603548603260 +1238990,305,00390007B60020 +1239563,452,000000030000 +1247598,3CD,001900100B22607C +1248303,208,5377603548603260 +1248784,30D,318A317F30AB30BC +1248987,305,003A0107870120 +1249202,2F5,2304007FFFFFF1 +1249481,412,1000000000770000 +1250604,3AD,000000007FD10054 +1257796,2F5,F403007FFF0001 +1258279,208,539C603548603260 +1258769,3CD,001400110B2260AD +1258973,305,003A0007680020 +1268301,208,539C603548603260 +1268824,3CD,001400110B22609E +1269000,305,00390087C90020 +1269278,2F5,1503007FFFFFF1 +1269688,30D,317F31A9309530CF +1271608,3AD,000000008041006A +1277615,3CD,001600100B22607F +1277835,2F5,0603007FFFFFF1 +1278300,208,539C603548603260 +1278989,305,003900077A0020 +1288305,208,539C603548603260 +1288837,3CD,001600100B226060 +1289004,305,003900076B0020 +1289302,2F5,D702007FFF0001 +1289443,452,000000030000 +1289654,30D,319231A3309530C4 +1291613,3AD,000000008001007D +1297807,2F5,B803007FFF0001 +1298267,208,53C0603548603260 +1298757,3CD,0019000D0B226061 +1298979,305,003900071C0020 +1299440,412,1000000000770000 +1308302,208,53C0603548613260 +1308826,3CD,0019000D0B226052 +1309004,305,003900070D0020 +1309266,2F5,D903007FFFFFF1 +1309460,50E,220000142B427FA7 +1309695,30D,3185319030A930C1 +1309933,572,98807D8081000011 +1311608,3AD,000000007FB10083 +1317597,3CD,0015000D0B226083 +1317837,2F5,9A03007FFF0001 +1318295,208,53C0603548613260 +1318994,305,003900073E0020 +1327606,3CD,0015000D0B226074 +1328293,208,539C603548613261 +1328773,30D,318D31A6309230D1 +1328973,305,003900072F0020 +1329204,2F5,7B04007FFF0001 +1330619,3AD,0000000080510096 +1337792,2F5,5C05007FFF0001 +1338264,208,539C613548613260 +1338742,3CD,0013000F0B226065 +1338965,305,00390007D00020 +1339375,452,000000030000 +1347607,3CD,0013000F0B226056 +1348262,208,539C603648613260 +1348745,30D,319A3198309830C1 +1348942,305,003A0007F10020 +1349179,2F5,4D05007FFF0001 +1349446,412,1000000000770000 +1350615,3AD,00000000800100AA +1357597,3CD,001500100B226007 +1357829,2F5,5E06007FFFFFF1 +1358300,208,539C603648613260 +1359011,305,003A0007C20020 +1367593,3CD,001500100B2260F8 +1368282,208,539C603648613261 +1368773,30D,317F319A30A030BE +1368972,305,003A0007D30020 +1369202,2F5,1F06007FFF0001 +1370603,3AD,000000007F9100B2 +1377802,2F5,4006007FFFFFE1 +1378266,208,5377613648613261 +1378752,3CD,0014000F0B226019 +1378971,305,003A0007A40020 +1388293,208,539C613648613261 +1388832,3CD,0014000F0B22600A +1389008,305,003A0007B50020 +1389262,2F5,3106007FFFFFE1 +1389431,452,000000030000 +1389676,30D,319231B0308C30CA +1391614,3AD,00000000805100C3 +1397607,3CD,0016000F0B2260DB +1397829,2F5,E206007FFF0001 +1398290,208,539C613648613261 +1398973,305,003A0007860020 +1399365,412,1000000000770000 +1407590,3CD,0016000F0B2260CC +1408267,208,53C0613648613261 +1408734,30D,319A3195309230BE +1408940,305,003A0007970020 +1409174,2F5,D306007FFF0001 +1409423,50E,220000142B427FA9 +1409909,572,98807D8081000011 +1410600,3AD,00000000800100D7 +1417792,2F5,A407007FFF0011 +1418253,208,539C613648613261 +1418738,3CD,0015000F0B2260CD +1418961,305,003A0007680020 +1428293,208,539C613648613261 +1428845,3CD,0015000F0B2260BE +1428986,305,003A0007790020 +1429278,2F5,B506007FFF0001 +1429673,30D,3182319D309D30C7 +1431618,3AD,000000007FC100EC +1437599,3CD,001200100B2260BF +1437812,2F5,9606007FFF0011 +1438300,208,53C0613648613261 +1438988,305,003A00074A0020 +1439526,452,000000030000 +1447601,3CD,001200100B2260A0 +1448293,208,53C0613648613261 +1448763,30D,319831B3308C30C4 +1448973,305,003A00075B0020 +1449225,2F5,9706007FFF0001 +1449473,412,1000000000770000 +1450593,3AD,00000000809100FC +1457807,2F5,A807007FFFFFF1 +1458275,208,53C0613648613261 +1458751,3CD,001700100B226041 +1458974,305,003A00072C0020 +1468287,208,539C613648613261 +1468831,3CD,001700100B226032 +1468971,305,003A00073D0020 +1469260,2F5,6907007FFF0001 +1469652,30D,31983195309830B6 +1471618,3AD,000000007FC1000A +1477597,3CD,0017000F0B226043 +1477805,2F5,AA07007FFFFFD1 +1478278,208,539C613648613261 +1478981,305,003A00070E0020 +1488288,208,539C613648613261 +1488832,3CD,0017000F0B226034 +1488972,305,003A00071F0020 +1489260,2F5,7B07007FFFFFF1 +1489401,452,000000030000 +1489629,30D,3187319D309530D4 +1491606,3AD,000000007FC10019 +1497792,2F5,3C07007FFF0001 +1498263,208,539C613648613261 +1498745,3CD,0014000F0B226055 +1498963,305,003A0007E00020 +1499430,412,1000000000770000 +1508268,208,539C613648613261 +1508833,3CD,0014000F0B226046 +1508974,305,003A0007F10020 +1509264,2F5,5D08007FFFFFE1 +1509441,50E,220000142B427FAB +1509667,30D,319A31AE308C30B9 +1509906,572,98807D8081000011 +1511592,3AD,0000000080B10027 +1517616,3CD,001400100B226017 +1517829,2F5,1E07007FFF0001 +1518290,208,539C613648613261 +1518975,305,003A0007C20020 +1527597,3CD,001400100B226008 +1528270,208,539C613648613261 +1528756,30D,3190319230A630BC +1528977,305,003A0087530020 +1529202,2F5,4F08007FFFFFD1 +1530605,3AD,000000007FF10034 +1537791,2F5,4008007FFFFFC1 +1538288,208,539C613648613261 +1538772,3CD,0014000F0B226019 +1539071,305,003A0087240020 +1539441,452,000000030000 +1547607,3CD,0014000F0B22600A +1548280,208,539C613648613261 +1548769,30D,318531A0309830D4 +1548991,305,003A0007B50020 +1549215,2F5,3107007FFFFFD1 +1549468,412,1000000000770000 +1550597,3AD,000000007FF10043 +1557606,3CD,0015000D0B22600B +1557827,2F5,0207007FFFFFF1 +1558293,208,539C613648613261 +1558990,305,003A0087060020 +1567593,3CD,0015000D0B2260FC +1568292,208,539C613648613261 +1568637,305,003A0007970020 +1568878,30D,319D31A0308F30C4 +1569330,2F5,F307007FFFFFF1 +1570612,3AD,0000000080710058 +1577814,2F5,C406007FFF0001 +1578281,208,539C613648613261 +1578764,3CD,0017000D0B2260CD +1578986,305,003A0087E80020 +1588270,208,53C0613648613261 +1588821,3CD,0017000D0B2260BE +1588997,305,003A0007790020 +1589296,2F5,B506007FFF0001 +1589436,452,000000030000 +1589628,30D,318D319230AB30BE +1591602,3AD,000000007FC10064 +1605089,3CD,0014000F0B2260BF +1605179,2F5,F606007FFFFFD1 +1605359,208,539C613648613261 +1605448,305,003A00074A0020 +1605853,412,1000000000770000 +1607605,3CD,0014000F0B2260A0 +1608314,208,539C623648613261 +1608769,30D,319231BE309B30DA +1608973,305,003A00075B0020 +1609193,2F5,2706007FFFFF91 +1609434,50E,220000142B427FAD +1609903,572,98807D8081000011 +1610604,3AD,000000008031007A +1617799,2F5,F806007FFFFFB1 +1618342,208,539C613648613261 +1618745,3CD,0011000F0B2260C1 +1618964,305,003A0087AC0020 +1628280,208,539C613648613261 +1628633,305,003A0087BD0020 +1628871,3CD,0011000F0B2260B2 +1629317,2F5,E906007FFFFFB1 +1629781,30D,31983195309830CC +1631610,3AD,0000000080410088 +1637601,3CD,0015000D0B226083 +1637811,2F5,DA05007FFFFFC1 +1638275,208,539C613648613261 +1638982,305,003A00070E0020 +1639480,452,000000030000 +1647601,3CD,0015000D0B226074 +1648301,208,5377613648613261 +1648791,30D,3182318230AD30BC +1649019,305,003A00879F0020 +1649229,2F5,CB06007FFFFFB1 +1649471,412,1000000000770000 +1650596,3AD,000000007F810095 +1657803,2F5,AC06007FFFFFC1 +1658647,305,003A0007E00020 +1658876,208,539C613648613261 +1659110,3CD,0012000F0B226075 +1668266,208,539C613648613261 +1668808,3CD,0012000F0B226066 +1668976,305,003A0007F10020 +1669268,2F5,DD06007FFFFF81 +1669661,30D,319231B6308530CA +1671595,3AD,00000000805100A5 +1677597,3CD,001500100B226007 +1677830,2F5,6E06007FFFFFE1 +1678276,208,539C613648613261 +1678990,305,003A0007C20020 +1688645,305,003A0007D30020 +1688865,208,539C613648613261 +1689104,3CD,001500100B2260F8 +1689589,2F5,BF05007FFFFF91 +1689768,30D,31983195309230B9 +1689978,452,000000030000 +1691700,3AD,00000000801100B8 +1697826,2F5,6006007FFFFFC1 +1698293,208,539C613648613261 +1698778,3CD,001500100B2260E9 +1698975,305,003A0007A40020 +1699441,412,1000000000770000 +1707589,3CD,001500100B2260DA +1708228,208,539C613648613261 +1708698,30D,3187319D30AB30CC +1708942,305,00390187150120 +1709125,50E,220000142B427FAF +1709370,2F5,B106007FFFFF61 +1709867,572,98807D8081000011 +1710596,3AD,000000007FD100CD +1717593,3CD,000F00100B22603B +1717806,2F5,5205007FFFFFC1 +1718597,208,53C0613648613261 +1719368,305,00390187260120 +1727611,3CD,000F00100B22602C +1728231,208,53C0613648613261 +1728764,30D,319D31B3309D30DD +1728962,305,00390187370120 +1729171,2F5,7305007FFFFF91 +1730599,3AD,0000000080B100DC +1737794,2F5,5405007FFFFFA1 +1738269,208,53C0623648613261 +1738763,3CD,0011000F0B22600D +1738982,305,00380187D80120 +1739554,452,000000030000 +1748544,208,539C623648613261 +1748803,3CD,0011000F0B2260FE +1749032,305,00380087D90020 +1749499,2F5,2504007FFFFFD1 +1749691,30D,3195318D30A930C7 +1749945,412,1000000000770000 +1751606,3AD,000000007F5100E3 +1757577,3CD,0016000D0B2260BF +1757828,2F5,3605007FFFFFA1 +1758270,208,539C623648613261 +1758968,305,00380087EA0020 +1767607,3CD,0016000D0B2260A0 +1768214,208,53C0623648613261 +1768694,30D,318A31A630A030CC +1768968,305,00380187EB0120 +1769132,2F5,2705007FFFFFA1 +1770611,3AD,000000007F4100F3 +1777817,2F5,D806007FFFFFD1 +1778562,208,539C623648613261 +1778806,3CD,0015000D0B2260A1 +1779013,305,003800070C0020 +1788226,208,539C623648613261 +1788681,3CD,0015000D0B226092 +1788920,305,003800879D0020 +1789149,2F5,B906007FFFFFE1 +1789361,452,000000030000 +1789763,30D,31A631AE308830BE +1791598,3AD,0000000080B10009 +1797582,3CD,0011000D0B2260C3 +1797814,2F5,5A07007FFF0001 +1798274,208,539C613648613261 +1798985,305,003800072E0020 +1799367,412,1000000000770000 +1808490,208,539C613648613261 +1808699,3CD,0011000D0B2260B4 +1808961,305,00380087BF0020 +1809162,2F5,8B08007FFFFFD1 +1809447,50E,220000142B427FA1 +1809618,30D,3190319030A630B6 +1810106,572,98807D8081000011 +1811603,3AD,0000000080010013 +1817806,2F5,2C08007FFF0001 +1818254,208,539C613648613261 +1818750,3CD,000C000C0B226015 +1818965,305,00380007C00020 +1828218,208,539C613648613261 +1828685,3CD,000C000C0B226006 +1828921,305,00380087510020 +1829152,2F5,1D08007FFF0001 +1829755,30D,318D31B330A630D1 +1831612,3AD,000000007FF10025 +1837595,3CD,000F000B0B2260D7 +1837807,2F5,EE09007FFF0011 +1838454,208,539C613648613261 +1838640,305,00380087620020 +1839556,452,000000030000 +1847601,3CD,000F000B0B2260C8 +1848219,208,539C613648613261 +1848683,30D,31A931A0309D30D1 +1848962,305,00380007F30020 +1849130,2F5,EF09007FFF0001 +1849373,412,1000000000770000 +1850620,3AD,000000008041003D +1857817,2F5,D009007FFF0001 +1858271,208,53C0613648613261 +1858769,3CD,0012000A0B226089 +1858979,305,00380087040020 +1868376,208,539C613648613261 +1868641,305,00380007950020 +1868877,3CD,0012000A0B22607A +1869102,2F5,C109007FFF0001 +1869591,30D,3187319530B330C1 +1871597,3AD,000000007F910049 +1877600,3CD,0011000A0B22607B +1877808,2F5,F209007FFFFFE1 +1878276,208,539C613648613261 +1878739,305,00380007A60020 +1888198,208,539C613648613261 +1888698,3CD,0011000A0B22606C +1888923,305,00380007B70020 +1889143,2F5,A309007FFF0001 +1889357,452,000000030000 +1889759,30D,319231AB309D30DA +1891603,3AD,000000008001005F +1897816,2F5,E409007FFFFFD1 +1898318,208,53C0613648613261 +1898677,305,00380007480020 +1898874,3CD,000F000C0B22606D +1899372,412,1000000000770000 +1908198,208,53C0613648613261 +1908698,3CD,000F000C0B22605E +1908918,305,00380087D90020 +1909143,2F5,C509007FFFFFE1 +1909354,50E,220000142D427FA3 +1909579,30D,31A03195309B30BE +1909847,572,98807D8081000011 +1911592,3AD,0000000080B10063 +1917611,3CD,000C000C0B22607F +1917827,2F5,B609007FFFFFE1 +1918270,208,539C613648613261 +1918979,305,003800076A0020 +1927607,3CD,000C000C0B226060 +1928357,208,539C613648613261 +1928649,305,003700870B0020 +1928929,30D,3187319A30B630BC +1929371,2F5,D709007FFFFFB1 +1930599,3AD,000000007FF10070 +1937817,2F5,C808007FFFFFC1 +1938280,208,539C613648613261 +1938744,3CD,000B000A0B226081 +1938985,305,003701876C0120 +1939404,452,000000030000 +1948196,208,539C613648613261 +1948674,3CD,000B000A0B226072 +1948905,305,003701877D0120 +1949126,2F5,A908007FFFFFD1 +1949359,412,1000000000770000 +1949710,30D,319A31AB309D30DD +1951612,3AD,000000008001008C +1957594,3CD,000F00090B226033 +1957826,2F5,CA08007FFFFFA1 +1958627,305,003701874E0120 +1959091,208,539C613648613261 +1967584,3CD,000F00090B226024 +1968203,208,539C613648613261 +1968665,30D,3198318A30A330CA +1968942,305,003602877F0220 +1969118,2F5,BB08007FFFFFA1 +1970600,3AD,0000000080510096 +1977807,2F5,9C08007FFFFFB1 +1978270,208,539C613648613261 +1978761,3CD,001000070B226015 +1978975,305,00350187800120 +1988629,305,00350287A10220 +1988870,3CD,001000070B226006 +1989099,208,539C613648603260 +1989336,2F5,DD08007FFFFF61 +1989788,30D,3185319A30B330C4 +1989976,452,000000030000 +1991607,3AD,00000000800100AA +1997612,3CD,000D00090B226017 +1997827,2F5,8E08007FFFFFA1 +1998273,208,539C613648603260 +1999186,305,00340287820220 +1999422,412,1000000000770000 diff --git a/opendbc/car/psa/tests/fixtures/provenance.json b/opendbc/car/psa/tests/fixtures/provenance.json new file mode 100644 index 00000000000..fa4dcd2fc39 --- /dev/null +++ b/opendbc/car/psa/tests/fixtures/provenance.json @@ -0,0 +1,23 @@ +{ + "format": "RX-only live CAN, 10 allowlisted messages, timestamps relative to window start; no VIN, diagnostics, location or session metadata. Payloads are unchanged.", + "captures": [ + { + "file": "stationary.csv", + "source_session": "learn-20260811T170039Z-e1fe3ff3", + "source_sha256": "7896b885c5f0bd7643a928fa4cef72771fc0ecb36a4fc984ddd46a89b7adca2d", + "source_start_us": 1514235, + "duration_us": 2000000, + "frames": 1120, + "fixture_sha256": "7cc30050d9f54e75ebd3d1ed781e41ce4868cfeba603ad13fd708a3deadc4010" + }, + { + "file": "moving.csv", + "source_session": "learn-20260822T183431Z-34fe1801", + "source_sha256": "0aae0913f50e1df156b823215c83b45c111bca3af278194ef97d0422b2a3d45a", + "source_start_us": 1560482, + "duration_us": 2000000, + "frames": 1140, + "fixture_sha256": "48aada653dca7e9eb5c1cca466807505b2874c5b7cba3904bd52ea0977fda392" + } + ] +} diff --git a/opendbc/car/psa/tests/fixtures/stationary.csv b/opendbc/car/psa/tests/fixtures/stationary.csv new file mode 100644 index 00000000000..0b7f9f608ab --- /dev/null +++ b/opendbc/car/psa/tests/fixtures/stationary.csv @@ -0,0 +1,1121 @@ +time_us,address,data +0,2F5,BB00007FFF0001 +3736,3CD,FFFD00000B226040 +4173,412,10000000007C0000 +4674,305,14E30007E10020 +35506,208,1AC133004C333233 +35865,2F5,AC00007FFF0001 +36152,3CD,FFFD00000B226031 +36456,50E,022600045E42FF2D +36550,572,98807FC088000001 +36640,30D,0000000000000000 +37136,3AD,500000018072008E +37226,305,14E30007D20020 +37497,208,1A9433004C333233 +37787,2F5,9D00007FFF0001 +37877,3CD,FFFD00000B226022 +38513,305,14E30007C30020 +38693,208,1A9433004C333233 +39020,2F5,8E00007FFF0001 +39302,3CD,FFFD00000B226013 +39750,30D,0000000000000000 +40296,3AD,500000018052009F +40513,305,14E30007B40020 +41151,208,1A9433004C333233 +41562,2F5,7F00007FFF0001 +41663,3CD,FFFC00000B226014 +41842,452,000000030000 +44149,305,14E30007A50020 +48287,208,1A9433004C333233 +48761,2F5,6000007FFF0001 +50530,3CD,FFFC00000B226005 +50715,412,10000000007C0000 +51496,30D,0000000000000000 +53491,3AD,50000001805200AE +54040,305,14E30007960020 +58176,208,1A9833004C333233 +60020,2F5,5100007FFF0001 +60444,3CD,FFFD00000B2260E6 +64042,305,14E30007870020 +70253,208,1A9833004C333233 +70698,2F5,4200007FFF0001 +71097,3CD,FFFD00000B2260D7 +71504,30D,0000000000000000 +73558,3AD,50000001803200BF +74043,305,14E30007780020 +78108,208,1A9833004C333233 +80004,2F5,3300007FFF0001 +83132,3CD,FFFC00000B2260D8 +84642,305,14E30007690020 +88095,208,1A9833004C333233 +88919,2F5,2400007FFF0001 +90640,452,000000030000 +94082,3CD,FFFC00000B2260C9 +94417,30D,0000000000000000 +95088,305,14E300075A0020 +95267,3AD,50000001805200CC +98093,208,1A9833004C333233 +102716,2F5,1500007FFF0001 +103040,3CD,FFFC00000B2260BA +103259,412,10000000007C0000 +104053,305,14E300074B0020 +110899,208,1AAE33004C333233 +111582,2F5,0600007FFF0001 +111817,50E,022600045E42FF2F +111942,572,98807FC088000001 +112046,3CD,FFFC00000B2260AB +112756,30D,0000000000000000 +114067,305,14E300073C0020 +114460,3AD,50000001804200DC +120162,208,1AAE33004C333233 +120721,2F5,F700007FFF0001 +120818,3CD,FFFC00000B22609C +124043,305,14E300072D0020 +128115,208,1AAE33004C333233 +128917,2F5,E800007FFF0001 +130458,3CD,FFFC00000B22608D +131661,30D,0000000000000000 +136360,3AD,50000001803200EC +136734,305,14E300071E0020 +138072,208,1AAE33004C333233 +140024,2F5,D900007FFF0001 +140449,3CD,FFFC00000B22607E +140995,452,000000030000 +145389,305,14E300070F0020 +148073,208,1AAE33004C333233 +148943,2F5,CA00007FFF0001 +153141,412,10000000007C0000 +153573,3CD,FFFC00000B22606F +153675,30D,0000000000000000 +154383,305,14E30007F00020 +154606,3AD,50000001807200F7 +158091,208,1ABD33004C333233 +162751,2F5,BB00007FFF0001 +163076,3CD,FFFD00000B226040 +164196,305,14E30007E10020 +168090,208,1ABD33004C333233 +171585,2F5,AC00007FFF0001 +171910,3CD,FFFD00000B226031 +172191,30D,0000000000000000 +173474,3AD,5000000180520008 +174042,305,14E30007D20020 +179822,208,1ABD33004C333233 +180358,2F5,9D00007FFF0001 +180600,3CD,FFFD00000B226022 +184065,305,14E30007C30020 +188083,208,1ABD33004C333233 +188917,2F5,8E00007FFF0001 +190941,452,000000030000 +191477,3CD,FFFD00000B226013 +192459,30D,0000000000000000 +194058,305,14E30007B40020 +194490,3AD,5000000180720015 +198080,208,1ABD33004C333233 +200016,2F5,7F00007FFF0001 +200455,3CD,FFFD00000B226004 +201011,412,10000000007C0000 +204039,305,14E30007A50020 +208075,208,1AC533004C333233 +208923,2F5,6000007FFF0001 +210459,3CD,FFFD00000B2260F5 +211017,50E,022600045E42FF21 +211310,572,98807FC088000001 +211506,30D,0000000000000000 +213479,3AD,5000000180520026 +214040,305,14E30007960020 +218080,208,1AC533004C333233 +220005,2F5,5100007FFF0001 +220461,3CD,FFFC00000B2260F6 +224040,305,14E30007870020 +228075,208,1AC533004C333233 +228903,2F5,4200007FFF0001 +230480,3CD,FFFC00000B2260E7 +231669,30D,0000000000000000 +233470,3AD,5000000180520035 +234177,305,14E30007780020 +238089,208,1AC533004C333233 +240013,2F5,3300007FFF0001 +240450,3CD,FFFC00000B2260D8 +240970,452,000000030000 +244086,305,14E30007690020 +248071,208,1AC833004C333233 +248925,2F5,2400007FFF0001 +250463,3CD,FFFC00000B2260C9 +250711,412,10000000007C0000 +251489,30D,0000000000000000 +253454,3AD,5000000180520044 +254057,305,14E300075A0020 +258206,208,1AC833004C333233 +260007,2F5,1500007FFF0001 +260460,3CD,FFFD00000B2260AA +264059,305,14E300074B0020 +268072,208,1AC833004C333233 +268939,2F5,0600007FFF0001 +270459,3CD,FFFD00000B22609B +271495,30D,0000000000000000 +273466,3AD,5000000180320055 +274039,305,14E300073C0020 +278080,208,1AC833004C333233 +280005,2F5,F700007FFF0001 +280461,3CD,FFFC00000B22609C +284049,305,14E300072D0020 +288086,208,1AC833004C333233 +288955,2F5,E800007FFF0001 +290525,452,000000030000 +291476,3CD,FFFC00000B22608D +292481,30D,0000000000000000 +294045,305,14E300071E0020 +294450,3AD,5000000180720060 +298076,208,1AB933004C333233 +300024,2F5,D900007FFF0001 +300469,3CD,FFFD00000B22606E +300717,412,10000000007C0000 +304041,305,14E300070F0020 +308071,208,1AB933004C333233 +308954,2F5,CA00007FFF0001 +310964,50E,022600045E42FF23 +311198,572,98807FC088000000 +311496,3CD,FFFD00000B22605F +312480,30D,0000000000000000 +314056,305,14E30007F00020 +314482,3AD,5000000180520071 +318083,208,1AB933004C333233 +320002,2F5,BB00007FFF0001 +320454,3CD,FFFD00000B226040 +324071,305,14E30007E10020 +328067,208,1AB933004C333233 +328914,2F5,AC00007FFF0001 +330478,3CD,FFFD00000B226031 +331655,30D,0000000000000000 +333457,3AD,500000018072008E +334048,305,14E30007D20020 +338075,208,1AB933004C333233 +340020,2F5,9D00007FFF0001 +340458,3CD,FFFD00000B226022 +341054,452,000000030000 +344053,305,14E30007C30020 +348239,208,1AA733004C333233 +348925,2F5,8E00007FFF0001 +350463,3CD,FFFD00000B226013 +350711,412,10000000007C0000 +351511,30D,0000000000000000 +353473,3AD,500000018052009F +354101,305,14E30007B40020 +358084,208,1AA733004C333233 +360012,2F5,7F00007FFF0001 +360454,3CD,FFFC00000B226014 +364074,305,14E30007A50020 +368068,208,1AA733004C333233 +368930,2F5,6000007FFF0001 +370458,3CD,FFFC00000B226005 +371507,30D,0000000000000000 +373455,3AD,50000001805200AE +374062,305,14E30007960020 +378071,208,1AA733004C333233 +380020,2F5,5100007FFF0001 +380459,3CD,FFFC00000B2260F6 +384050,305,14E30007870020 +388058,208,1A9B33004C333233 +388919,2F5,4200007FFF0001 +390554,452,000000030000 +391495,3CD,FFFC00000B2260E7 +392480,30D,0000000000000000 +394098,305,14E30007780020 +394471,3AD,50000001805200BD +398456,208,1A9B33004C333233 +400012,2F5,3300007FFF0001 +400495,3CD,FFFD00000B2260C8 +400834,412,10000000007C0000 +404046,305,14E30007690020 +408079,208,1A9B33004C333233 +408955,2F5,2400007FFF0001 +410467,3CD,FFFD00000B2260B9 +411124,50E,022600045E42FF25 +411359,572,98807FC088000001 +411617,30D,0000000000000000 +413465,3AD,50000001805200CC +414061,305,14E300075A0020 +418062,208,1A9B33004C333233 +420006,2F5,1500007FFF0001 +420461,3CD,FFFD00000B2260AA +424067,305,14E300074B0020 +428072,208,1A9B33004C333233 +428785,2F5,0600007FFF0001 +430460,3CD,FFFD00000B22609B +431572,30D,0000000000000000 +433463,3AD,50000001807200D9 +434042,305,14E300073C0020 +438061,208,1A9033004C333233 +440017,2F5,F700007FFF0001 +440458,3CD,FFFD00000B22608C +441034,452,000000030000 +444048,305,14E300072D0020 +448052,208,1A9033004C333233 +448788,2F5,E800007FFF0001 +450462,3CD,FFFD00000B22607D +450706,412,10000000007C0000 +451493,30D,0000000000000000 +453455,3AD,50000001805200EA +454057,305,14E300071E0020 +458062,208,1A9033004C333233 +460007,2F5,D900007FFF0001 +460461,3CD,FFFC00000B22607E +464043,305,14E300070F0020 +468058,208,1A9033004C333233 +468777,2F5,CA00007FFF0001 +470467,3CD,FFFC00000B22606F +471492,30D,0000000000000000 +473524,3AD,50000001805200F9 +474093,305,14E30007F00020 +478071,208,1A9033004C333233 +480007,2F5,BB00007FFF0001 +480460,3CD,FFFD00000B226040 +484066,305,14E30007E10020 +488489,208,1AA333004C333233 +489128,2F5,AC00007FFF0001 +490471,3CD,FFFD00000B226031 +490676,452,000000030000 +491507,30D,0000000000000000 +493466,3AD,5000000180520008 +494052,305,14E30007D20020 +498053,208,1AA333004C333233 +500012,2F5,9D00007FFF0001 +500465,3CD,FFFD00000B226022 +500790,412,10000000007C0000 +504058,305,14E30007C30020 +508057,208,1AA333004C333233 +508779,2F5,8E00007FFF0001 +511050,50E,022600045E42FF27 +511294,572,98807FC088000001 +511537,3CD,FFFD00000B226013 +512487,30D,0000000000000000 +514060,305,14E30007B40020 +514475,3AD,5000000180520017 +518058,208,1AA333004C333233 +520013,2F5,7F00007FFF0001 +520469,3CD,FFFC00000B226014 +524070,305,14E30007A50020 +528053,208,1AB933004C333233 +528771,2F5,6000007FFF0001 +530469,3CD,FFFC00000B226005 +531668,30D,0000000000000000 +533454,3AD,5000000180520026 +534046,305,14E30007960020 +538061,208,1AB933004C333233 +540021,2F5,5100007FFF0001 +540455,3CD,FFFD00000B2260E6 +541082,452,000000030000 +544049,305,14E30007870020 +548066,208,1AB933004C333233 +548780,2F5,4200007FFF0001 +550455,3CD,FFFD00000B2260D7 +550725,412,10000000007C0000 +551503,30D,0000000000000000 +553479,3AD,5000000180520035 +554102,305,14E30007780020 +558053,208,1AB933004C333233 +560017,2F5,3300007FFF0001 +560458,3CD,FFFC00000B2260D8 +564075,305,14E30007690020 +568049,208,1AB933004C333233 +568780,2F5,2400007FFF0001 +570459,3CD,FFFC00000B2260C9 +571499,30D,0000000000000000 +573570,3AD,5000000180720042 +574058,305,14E300075A0020 +578061,208,1AB633004C333233 +580009,2F5,1500007FFF0001 +580472,3CD,FFFD00000B2260AA +584065,305,14E300074B0020 +588049,208,1AB633004C333233 +588796,2F5,0600007FFF0001 +590510,452,000000030000 +591507,3CD,FFFD00000B22609B +592485,30D,0000000000000000 +594071,305,14E300073C0020 +594491,3AD,5000000180320055 +598065,208,1AB633004C333233 +600013,2F5,F700007FFF0001 +600455,3CD,FFFC00000B22609C +600754,412,10000000007C0000 +604066,305,14E300072D0020 +608057,208,1AB633004C333233 +608786,2F5,E800007FFF0001 +610475,3CD,FFFC00000B22608D +611150,50E,022600045E42FF29 +611386,572,98807FC088000001 +611645,30D,0000000000000000 +613469,3AD,5000000180520062 +614070,305,14E300071E0020 +618044,208,1AB633004C333233 +620029,2F5,D900007FFF0001 +620473,3CD,FFFD00000B22606E +624073,305,14E300070F0020 +628695,208,1AB933004C333233 +628925,2F5,CA00007FFF0001 +630481,3CD,FFFD00000B22605F +631675,30D,0000000000000000 +633550,3AD,5000000180520071 +634249,305,14E30007F00020 +638060,208,1AB933004C333233 +640025,2F5,BB00007FFF0001 +640461,3CD,FFFD00000B226040 +640782,452,000000030000 +644073,305,14E30007E10020 +648061,208,1AB933004C333233 +648781,2F5,AC00007FFF0001 +650471,3CD,FFFD00000B226031 +650723,412,10000000007C0000 +651515,30D,0000000000000000 +653696,3AD,5000000180520080 +654058,305,14E30007D20020 +658057,208,1AB933004C333233 +660021,2F5,9D00007FFF0001 +660458,3CD,FFFC00000B226032 +664072,305,14E30007C30020 +668053,208,1AA733004C333233 +668786,2F5,8E00007FFF0001 +670467,3CD,FFFC00000B226023 +671503,30D,0000000000000000 +673457,3AD,500000018072009D +674098,305,14E30007B40020 +678045,208,1AA733004C333233 +680027,2F5,7F00007FFF0001 +680468,3CD,FFFE00000B2260F4 +684058,305,14E30007A50020 +688039,208,1AA733004C333233 +688955,2F5,6000007FFF0001 +690749,452,000000030000 +691537,3CD,FFFE00000B2260E5 +692497,30D,0000000000000000 +694069,305,14E30007960020 +694459,3AD,50000001805200AE +698046,208,1AA733004C333233 +700006,2F5,5100007FFF0001 +700482,3CD,FFFD00000B2260E6 +700831,412,10000000007C0000 +704068,305,14E30007870020 +708039,208,1AA733004C333233 +708964,2F5,4200007FFF0001 +710835,50E,022600045E42FF2B +711321,572,98807FC088000000 +711539,3CD,FFFD00000B2260D7 +712480,30D,0000000000000000 +714082,305,14E30007780020 +714483,3AD,50000001805200BD +718039,208,1A9B33004C333233 +720025,2F5,3300007FFF0001 +720465,3CD,FFFD00000B2260C8 +724103,305,14E30007690020 +728047,208,1A9B33004C333233 +728974,2F5,2400007FFF0001 +730458,3CD,FFFD00000B2260B9 +731741,30D,0000000000000000 +733680,3AD,50000001804200CD +734070,305,14E300075A0020 +738039,208,1A9B33004C333233 +740013,2F5,1500007FFF0001 +740477,3CD,FFFC00000B2260BA +741058,452,000000030000 +744076,305,14E300074B0020 +748049,208,1A9B33004C333233 +748970,2F5,0600007FFF0001 +750475,3CD,FFFC00000B2260AB +750727,412,10000000007C0000 +751496,30D,0000000000000000 +753708,3AD,50000001807200D9 +754143,305,14E300073C0020 +758043,208,1A9B33004C333233 +760038,2F5,F700007FFF0001 +760458,3CD,FFFD00000B22608C +764071,305,14E300072D0020 +768031,208,1AA733004C333233 +768970,2F5,E800007FFF0001 +770467,3CD,FFFD00000B22607D +771511,30D,0000000000000000 +773462,3AD,50000001807200E8 +774067,305,14E300071E0020 +778035,208,1AA733004C333233 +780016,2F5,D900007FFF0001 +780476,3CD,FFFD00000B22606E +784037,305,14E300070F0020 +788047,208,1AA733004C333233 +788959,2F5,CA00007FFF0001 +790495,452,000000030000 +791509,3CD,FFFD00000B22605F +792475,30D,0000000000000000 +794079,305,14E30007F00020 +794482,3AD,50000001805200F9 +798043,208,1AA733004C333233 +800043,2F5,BB00007FFF0001 +800459,3CD,FFFC00000B226050 +800721,412,10000000007C0000 +804060,305,14E30007E10020 +808039,208,1A9433004C333233 +808955,2F5,AC00007FFF0001 +821244,50E,022600045E42FF2D +821343,572,98807FC088000001 +821433,3CD,FFFC00000B226041 +821664,30D,0000000000000000 +822132,305,14E30007D20020 +822221,3AD,5000000180520008 +822747,208,1A9433004C333233 +822926,2F5,9D00007FFF0001 +823023,3CD,FFFD00000B226022 +824068,305,14E30007C30020 +828025,208,1A9433004C333233 +828839,2F5,8E00007FFF0001 +830481,3CD,FFFD00000B226013 +831677,30D,0000000000000000 +833695,3AD,5000000180720015 +834086,305,14E30007B40020 +838251,208,1A9433004C333233 +840039,2F5,7F00007FFF0001 +840474,3CD,FFFD00000B226004 +840969,452,000000030000 +844072,305,14E30007A50020 +848039,208,1A9433004C333233 +849018,2F5,6000007FFF0001 +850575,412,10000000007C0000 +851494,3CD,FFFD00000B2260F5 +852488,30D,0000000000000000 +854068,305,14E30007960020 +854481,3AD,5000000180820023 +858039,208,1A9F33004C333233 +860030,2F5,5100007FFF0001 +860472,3CD,FFFD00000B2260E6 +864102,305,14E30007870020 +868171,208,1A9F33004C333233 +868784,2F5,4200007FFF0001 +870488,3CD,FFFD00000B2260D7 +871503,30D,0000000000000000 +873476,3AD,5000000180720033 +874080,305,14E30007780020 +878034,208,1A9F33004C333233 +880029,2F5,3300007FFF0001 +880469,3CD,FFFD00000B2260C8 +884065,305,14E30007690020 +888039,208,1A9F33004C333233 +889024,2F5,2400007FFF0001 +890541,452,000000030000 +891489,3CD,FFFD00000B2260B9 +892473,30D,0000000000000000 +894063,305,14E300075A0020 +894473,3AD,5000000180720042 +898039,208,1A9F33004C333233 +900021,2F5,1500007FFF0001 +900485,3CD,FFFD00010B22609A +900737,412,10000000007C0000 +904077,305,14E300074B0020 +908029,208,1A9F33004C333233 +908823,2F5,0600007FFF0001 +910973,50E,022600045E42FF2F +911194,572,98807FC088000001 +911684,3CD,FFFD00010B22608B +912489,30D,0000000000000000 +914077,305,14E300073C0020 +914470,3AD,5000000180520053 +918043,208,1A9F33004C333233 +920021,2F5,F700007FFF0001 +920481,3CD,FFFD00000B22608C +924079,305,14E300072D0020 +928035,208,1A9F33004C333233 +929027,2F5,E800007FFF0001 +931559,3CD,FFFD00000B22607D +932473,30D,0000000000000000 +934075,305,14E300071E0020 +934463,3AD,5000000180520062 +938015,208,1A9F33004C333233 +940031,2F5,D900007FFF0001 +940469,3CD,FFFC00000B22607E +941379,452,000000030000 +944067,305,14E300070F0020 +948016,208,1A9F33004C333233 +948813,2F5,CA00007FFF0001 +950477,412,10000000007C0000 +950729,3CD,FFFC00000B22606F +951505,30D,0000000000000000 +953693,3AD,5000000180520071 +954088,305,14E30007F00020 +958166,208,1AA733004C333233 +960047,2F5,BB00007FFF0001 +960469,3CD,FFFD00000B226040 +964082,305,14E30007E10020 +968025,208,1AA733004C333233 +968814,2F5,AC00007FFF0001 +970488,3CD,FFFD00000B226031 +971503,30D,0000000000000000 +973467,3AD,5000000180420081 +974089,305,14E30007D20020 +978029,208,1AA733004C333233 +980042,2F5,9D00007FFF0001 +980465,3CD,FFFD00000B226022 +984092,305,14E30007C30020 +988029,208,1AA733004C333233 +988822,2F5,8E00007FFF0001 +990491,452,000000030000 +991491,3CD,FFFD00000B226013 +992489,30D,0000000000000000 +994067,305,14E30007B40020 +994469,3AD,500000018072009D +998021,208,1A9033004C333233 +1000031,2F5,7F00007FFF0001 +1000468,3CD,FFFD00000B226004 +1000992,412,10000000007C0000 +1004073,305,14E30087250020 +1008408,208,1A9033004C333233 +1008817,2F5,6000007FFF0001 +1010482,3CD,FFFD00000B2260F5 +1011077,50E,022600045E42FF21 +1011349,572,98807FC088000001 +1011567,30D,0000000000000000 +1013479,3AD,50000001805200AE +1014047,305,14E30007960020 +1018021,208,1A9033004C333233 +1020035,2F5,5100007FFF0001 +1020481,3CD,FFFD00000B2260E6 +1024062,305,14E30007870020 +1028017,208,1A9033004C333233 +1028826,2F5,4200007FFF0001 +1030484,3CD,FFFD00000B2260D7 +1031670,30D,0000000000000000 +1033665,3AD,50000001807200BB +1034068,305,14E30007780020 +1038020,208,1A9033004C333233 +1040039,2F5,3300007FFF0001 +1040481,3CD,FFFD00000B2260C8 +1040674,452,000000030000 +1044086,305,14E30007690020 +1048013,208,1A8233004C333233 +1049035,2F5,2400007FFF0001 +1050481,3CD,FFFD00000B2260B9 +1050733,412,10000000007C0000 +1051522,30D,0000000000000000 +1055405,3AD,50000001807200CA +1055531,305,14E300075A0020 +1058005,208,1A8233004C333233 +1060026,2F5,1500007FFF0001 +1060461,3CD,FFFD00000B2260AA +1064790,305,14E300074B0020 +1068003,208,1A8233004C333233 +1068815,2F5,0600007FFF0001 +1072436,3CD,FFFD00000B22609B +1072666,30D,0000000000000000 +1074129,305,14E300073C0020 +1074480,3AD,50000001807200D9 +1079216,208,1A8233004C333233 +1080034,2F5,F700007FFF0001 +1080480,3CD,FFFC00000B22609C +1086703,305,14E300072D0020 +1088020,208,1A8233004C333233 +1089010,2F5,E800007FFF0001 +1090584,452,000000030000 +1094070,3CD,FFFC00000B22608D +1094409,30D,0000000000000000 +1095087,305,14E300071E0020 +1095266,3AD,50000001805200EA +1098616,208,1A8533004C333233 +1100080,2F5,D900007FFF0001 +1103055,3CD,FFFD00000B22606E +1103363,412,10000000007C0000 +1104127,305,14E300070F0020 +1108021,208,1A8533004C333233 +1108818,2F5,CA00007FFF0001 +1112339,50E,022600045E42FF23 +1112467,572,98807FC088000000 +1112568,3CD,FFFD00000B22605F +1112884,30D,0000000000000000 +1114084,305,14E30007F00020 +1114468,3AD,50000001803200FB +1120113,208,1A8533004C333233 +1120564,2F5,BB00007FFF0001 +1120654,3CD,FFFD00000B226040 +1124077,305,14E30007E10020 +1128027,208,1A8533004C333233 +1129015,2F5,AC00007FFF0001 +1131568,3CD,FFFD00000B226031 +1132561,30D,0000000000000000 +1136774,305,14E30007D20020 +1136863,3AD,5000000180820005 +1138016,208,1A8933004C333233 +1140059,2F5,9D00007FFF0001 +1140481,3CD,FFFD00000B226022 +1141100,452,000000030000 +1144099,305,14E30007C30020 +1148004,208,1A8933004C333233 +1148834,2F5,8E00007FFF0001 +1150521,412,10000000007C0000 +1151509,3CD,FFFD00000B226013 +1152489,30D,0000000000000000 +1154100,305,14E30007B40020 +1154512,3AD,5000000180720015 +1158018,208,1A8933004C333233 +1160047,2F5,7F00007FFF0001 +1160472,3CD,FFFC00000B226014 +1164082,305,14E30007A50020 +1168009,208,1A8933004C333233 +1169001,2F5,6000007FFF0001 +1170475,3CD,FFFC00000B226005 +1171511,30D,0000000000000000 +1173483,3AD,5000000180520026 +1174083,305,14E30007960020 +1178014,208,1A8933004C333233 +1180029,2F5,5100007FFF0001 +1180473,3CD,FFFD00000B2260E6 +1184072,305,14E30007870020 +1188005,208,1A7E33004C333233 +1188831,2F5,4200007FFF0001 +1190721,452,000000030000 +1191553,3CD,FFFD00000B2260D7 +1192493,30D,0000000000000000 +1194080,305,14E30007780020 +1194475,3AD,5000000180520035 +1198009,208,1A7E33004C333233 +1200039,2F5,3300007FFF0001 +1200481,3CD,FFFD00000B2260C8 +1200732,412,10000000007C0000 +1204088,305,14E30007690020 +1208015,208,1A7E33004C333233 +1209010,2F5,2400007FFF0001 +1211049,50E,022600045E42FF25 +1211293,572,98807FC088000000 +1211514,3CD,FFFD00000B2260B9 +1212496,30D,0000000000000000 +1214081,305,14E300075A0020 +1214480,3AD,5000000180720042 +1218004,208,1A7E33004C333233 +1220035,2F5,1500007FFF0001 +1220481,3CD,FFFB00000B2260CA +1224084,305,14E300074B0020 +1228009,208,1A7E33004C333233 +1228835,2F5,0600007FFF0001 +1230475,3CD,FFFB00000B2260BB +1231684,30D,0000000000000000 +1233653,3AD,5000000180720051 +1234061,305,14E300073C0020 +1238014,208,1AA733004C333233 +1240047,2F5,F700007FFF0001 +1240473,3CD,FFFD00000B22608C +1241022,452,000000030000 +1244251,305,14E300072D0020 +1248005,208,1AA733004C333233 +1249017,2F5,E800007FFF0001 +1250477,3CD,FFFD00000B22607D +1250729,412,10000000007C0000 +1251519,30D,0000000000000000 +1253650,3AD,5000000180320064 +1254079,305,14E300071E0020 +1258004,208,1AA733004C333233 +1260035,2F5,D900007FFF0001 +1260481,3CD,FFFD00000B22606E +1264086,305,14E300070F0020 +1268000,208,1AA733004C333233 +1268827,2F5,CA00007FFF0001 +1271517,3CD,FFFD00000B22605F +1272499,30D,0000000000000000 +1274092,305,14E30007F00020 +1274494,3AD,5000000180520071 +1278004,208,1A9833004C333233 +1280054,2F5,BB00007FFF0001 +1280481,3CD,FFFD00000B226040 +1284058,305,14E30007E10020 +1287996,208,1A9833004C333233 +1288990,2F5,AC00007FFF0001 +1290488,452,000000030000 +1291500,3CD,FFFD00000B226031 +1292503,30D,0000000000000000 +1294086,305,14E30007D20020 +1294481,3AD,5000000180520080 +1298010,208,1A9833004C333233 +1300043,2F5,9D00007FFF0001 +1300487,3CD,FFFC00000B226032 +1300757,412,10000000007C0000 +1304095,305,14E30007C30020 +1308004,208,1A9833004C333233 +1308830,2F5,8E00007FFF0001 +1311028,50E,022600045E42FF27 +1311271,572,98807FC088000001 +1311512,3CD,FFFC00000B226023 +1312499,30D,0000000000000000 +1314084,305,14E30007B40020 +1314486,3AD,500000018072009D +1318008,208,1A9833004C333233 +1320061,2F5,7F00007FFF0001 +1320487,3CD,FFFD00000B226004 +1324094,305,14E30007A50020 +1328005,208,1A9833004C333233 +1329015,2F5,6000007FFF0001 +1330485,3CD,FFFD00000B2260F5 +1331693,30D,0000000000000000 +1333481,3AD,50000001805200AE +1334095,305,14E30007960020 +1338175,208,1A9833004C333233 +1340054,2F5,5100007FFF0001 +1340481,3CD,FFFD00000B2260E6 +1341008,452,000000030000 +1344080,305,14E30007870020 +1348000,208,1A9833004C333233 +1348973,2F5,4200007FFF0001 +1350481,412,10000000007C0000 +1351498,3CD,FFFD00000B2260D7 +1352499,30D,0000000000000000 +1354090,305,14E30007780020 +1354485,3AD,50000001805200BD +1357989,208,1A9833004C333233 +1360043,2F5,3300007FFF0001 +1360487,3CD,FFFC00000B2260D8 +1364086,305,14E30007690020 +1367996,208,1A9833004C333233 +1368995,2F5,2400007FFF0001 +1370485,3CD,FFFC00000B2260C9 +1371521,30D,0000000000000000 +1373495,3AD,50000001807200CA +1374090,305,14E300075A0020 +1378004,208,1A9033004C333233 +1380036,2F5,1500007FFF0001 +1380480,3CD,FFFD00000B2260AA +1384092,305,14E300074B0020 +1387990,208,1A9033004C333233 +1388970,2F5,0600007FFF0001 +1390489,452,000000030000 +1391501,3CD,FFFD00000B22609B +1392490,30D,0000000000000000 +1394063,305,14E300073C0020 +1394478,3AD,50000001803200DD +1397997,208,1A9033004C333233 +1400047,2F5,F700007FFF0001 +1400491,3CD,FFFC00010B22608C +1400743,412,10000000007C0000 +1404086,305,14E300072D0020 +1408000,208,1A9033004C333233 +1408993,2F5,E800007FFF0001 +1411044,50E,022600045E42FF29 +1411287,572,98807FC088000001 +1411527,3CD,FFFC00010B22607D +1412499,30D,0000000000000000 +1414080,305,14E300071E0020 +1414497,3AD,50000001807200E8 +1418008,208,1A9033004C333233 +1420053,2F5,D900007FFF0001 +1421517,3CD,FFFC00000B22607E +1424089,305,14E300070F0020 +1428185,208,1AA333004C333233 +1429009,2F5,CA00007FFF0001 +1431574,3CD,FFFC00000B22606F +1432499,30D,0000000000000000 +1434100,305,14E30007F00020 +1434489,3AD,50000001805200F9 +1437996,208,1AA333004C333233 +1440053,2F5,BB00007FFF0001 +1440481,3CD,FFFC00000B226050 +1441006,452,000000030000 +1444095,305,14E30007E10020 +1447982,208,1AA333004C333233 +1448994,2F5,AC00007FFF0001 +1450490,3CD,FFFC00000B226041 +1450742,412,10000000007C0000 +1451535,30D,0000000000000000 +1453659,3AD,5000000180520008 +1454089,305,14E30007D20020 +1457990,208,1AA333004C333233 +1460058,2F5,9D00007FFF0001 +1460482,3CD,FFFD00000B226022 +1464113,305,14E30007C30020 +1467986,208,1A9F33004C333233 +1468963,2F5,8E00007FFF0001 +1471521,3CD,FFFD00000B226013 +1472503,30D,0000000000000000 +1474090,305,14E30007B40020 +1474495,3AD,5000000180520017 +1478584,208,1A9F33004C333233 +1480063,2F5,7F00007FFF0001 +1480487,3CD,FFFD00000B226004 +1484082,305,14E30007A50020 +1487990,208,1A9F33004C333233 +1488985,2F5,6000007FFF0001 +1490507,452,000000030000 +1491503,3CD,FFFD00000B2260F5 +1492492,30D,0000000000000000 +1494080,305,14E30007960020 +1494589,3AD,5000000180520026 +1497982,208,1A9F33004C333233 +1500049,2F5,5100007FFF0001 +1500476,3CD,FFFC00010B2260E6 +1500728,412,10000000007C0000 +1504086,305,14E30007870020 +1507990,208,1A9F33004C333233 +1508970,2F5,4200007FFF0001 +1511016,50E,022600045E42FF2B +1511241,572,98807FC088000002 +1511503,3CD,FFFC00010B2260D7 +1512495,30D,0000000000000000 +1514085,305,14E30007780020 +1514491,3AD,5000000180720033 +1517979,208,1AB233004C333233 +1520049,2F5,3300007FFF0001 +1520499,3CD,FFFD00000B2260C8 +1524068,305,14E30007690020 +1527996,208,1AB233004C333233 +1528971,2F5,2400007FFF0001 +1530481,3CD,FFFD00000B2260B9 +1531688,30D,0000000000000000 +1533643,3AD,5000000180520044 +1534103,305,14E300075A0020 +1537984,208,1AB233004C333233 +1540053,2F5,1500007FFF0001 +1540481,3CD,FFFD00000B2260AA +1541006,452,000000030000 +1544107,305,14E300074B0020 +1547980,208,1AB233004C333233 +1548959,2F5,0600007FFF0001 +1550608,412,10000000007C0000 +1551505,3CD,FFFD00000B22609B +1552503,30D,0000000000000000 +1554076,305,14E300073C0020 +1554492,3AD,5000000180520053 +1557991,208,1AB233004C333233 +1560062,2F5,F700007FFF0001 +1560482,3CD,FFFD00000B22608C +1564097,305,14E300072D0020 +1568402,208,1AAE33004C333233 +1569189,2F5,E800007FFF0001 +1570487,3CD,FFFD00000B22607D +1571521,30D,0000000000000000 +1573491,3AD,5000000180520062 +1574104,305,14E300071E0020 +1577974,208,1AAE33004C333233 +1580047,2F5,D900007FFF0001 +1580491,3CD,FFFC00000B22607E +1584086,305,14E300070F0020 +1587984,208,1AAE33004C333233 +1588959,2F5,CA00007FFF0001 +1590516,452,000000030000 +1591511,3CD,FFFC00000B22606F +1592492,30D,0000000000000000 +1594103,305,14E30007F00020 +1594504,3AD,5000000180420072 +1597978,208,1AAE33004C333233 +1600067,2F5,BB00007FFF0001 +1600495,3CD,FFFD00000B226040 +1601020,412,10000000007C0000 +1604105,305,14E30007E10020 +1607988,208,1AA733004C333233 +1608964,2F5,AC00007FFF0001 +1611040,50E,022600045E42FF2D +1611283,572,98807FC088000001 +1611523,3CD,FFFD00000B226031 +1612495,30D,0000000000000000 +1614098,305,14E30007D20020 +1614493,3AD,5000000180520080 +1617984,208,1AA733004C333233 +1620053,2F5,9D00007FFF0001 +1621517,3CD,FFFD00000B226022 +1624093,305,14E30007C30020 +1627984,208,1AA733004C333233 +1628959,2F5,8E00007FFF0001 +1631536,3CD,FFFD00000B226013 +1632494,30D,0000000000000000 +1634111,305,14E30007B40020 +1634523,3AD,500000018072009D +1637971,208,1AA733004C333233 +1640061,2F5,7F00007FFF0001 +1640487,3CD,FFFC00000B226014 +1640702,452,000000030000 +1644103,305,14E30007A50020 +1647984,208,1AA733004C333233 +1648979,2F5,6000007FFF0001 +1650494,3CD,FFFC00000B226005 +1650746,412,10000000007C0000 +1651536,30D,0000000000000000 +1653682,3AD,50000001807200AC +1654068,305,14E30007960020 +1657964,208,1A9833004C333233 +1660053,2F5,5100007FFF0001 +1660480,3CD,FFFD00010B2260D6 +1664090,305,14E30007870020 +1667970,208,1A9833004C333233 +1668944,2F5,4200007FFF0001 +1670485,3CD,FFFD00010B2260C7 +1671521,30D,0000000000000000 +1673499,3AD,50000001803200BF +1674096,305,14E30007780020 +1677970,208,1A9833004C333233 +1680061,2F5,3300007FFF0001 +1680487,3CD,FFFC00010B2260C8 +1684311,305,14E30007690020 +1687970,208,1A9833004C333233 +1688946,2F5,2400007FFF0001 +1690747,452,000000030000 +1691560,3CD,FFFC00010B2260B9 +1692499,30D,0000000000000000 +1694101,305,14E300075A0020 +1694495,3AD,50000001807200CA +1697970,208,1A9833004C333233 +1700061,2F5,1500007FFF0001 +1700497,3CD,FFFD00000B2260AA +1700756,412,10000000007C0000 +1704096,305,14E300074B0020 +1707970,208,1AA333004C333233 +1708945,2F5,0600007FFF0001 +1711005,50E,022600045E42FF2F +1711230,572,98807FC088000001 +1711511,3CD,FFFD00000B22609B +1712499,30D,0000000000000000 +1714094,305,14E300073C0020 +1714494,3AD,50000001805200DB +1717959,208,1AA333004C333233 +1720075,2F5,F700007FFF0001 +1720496,3CD,FFFD00000B22608C +1724097,305,14E300072D0020 +1727964,208,1AA333004C333233 +1728983,2F5,E800007FFF0001 +1730495,3CD,FFFD00000B22607D +1731690,30D,0000000000000000 +1733594,3AD,50000001807200E8 +1734089,305,14E300071E0020 +1737959,208,1AA333004C333233 +1740071,2F5,D900007FFF0001 +1740498,3CD,FFFD00000B22606E +1741003,452,000000030000 +1744093,305,14E300070F0020 +1747944,208,1AAE33004C333233 +1748964,2F5,CA00007FFF0001 +1750521,412,10000000007C0000 +1751527,3CD,FFFD00000B22605F +1752507,30D,0000000000000000 +1754100,305,14E30007F00020 +1754496,3AD,50000001805200F9 +1757964,208,1AAE33004C333233 +1760053,2F5,BB00007FFF0001 +1760499,3CD,FFFD00000B226040 +1764102,305,14E30007E10020 +1767964,208,1AAE33004C333233 +1768963,2F5,AC00007FFF0001 +1770489,3CD,FFFD00000B226031 +1771523,30D,0000000000000000 +1773485,3AD,5000000180420009 +1774105,305,14E30007D20020 +1778057,208,1AAE33004C333233 +1780075,2F5,9D00007FFF0001 +1780498,3CD,FFFC00000B226032 +1784107,305,14E30007C30020 +1788017,208,1AAE33004C333233 +1788941,2F5,8E00007FFF0001 +1790438,452,000000030000 +1791521,3CD,FFFC00000B226023 +1792494,30D,0000000000000000 +1794109,305,14E30007B40020 +1794512,3AD,5000000180720015 +1797955,208,1AA733004C333233 +1800065,2F5,7F00007FFF0001 +1800491,3CD,FFFD00000B226004 +1800744,412,10000000007C0000 +1804100,305,14E30007A50020 +1807959,208,1AA733004C333233 +1808959,2F5,6000007FFF0001 +1819636,3CD,FFFD00000B2260F5 +1819945,50E,022600045E42FF21 +1820183,572,98807FC088000000 +1820286,30D,0000000000000000 +1820768,3AD,5000000180520026 +1820865,305,14E30007960020 +1821254,208,1AA733004C333233 +1821434,2F5,5100007FFF0001 +1821657,3CD,FFFD00000B2260E6 +1824103,305,14E30007870020 +1827964,208,1AA733004C333233 +1828942,2F5,4200007FFF0001 +1831522,3CD,FFFD00000B2260D7 +1832565,30D,0000000000000000 +1834089,305,14E30007780020 +1834488,3AD,5000000180420036 +1837971,208,1AA733004C333233 +1840063,2F5,3300007FFF0001 +1840500,3CD,FFFC00000B2260D8 +1840748,452,000000030000 +1844111,305,14E30007690020 +1847964,208,1A9B33004C333233 +1848990,2F5,2400007FFF0001 +1850467,412,10000000007C0000 +1850715,3CD,FFFC00000B2260C9 +1851531,30D,0000000000000000 +1853511,3AD,5000000180420045 +1854376,305,14E300075A0020 +1857939,208,1A9B33004C333233 +1860065,2F5,1500007FFF0001 +1860487,3CD,FFFD00000B2260AA +1864098,305,14E300074B0020 +1867959,208,1A9B33004C333233 +1868938,2F5,0600007FFF0001 +1870492,3CD,FFFD00000B22609B +1871549,30D,0000000000000000 +1873489,3AD,5000000180420054 +1874098,305,14E300073C0020 +1877964,208,1A9B33004C333233 +1880061,2F5,F700007FFF0001 +1880504,3CD,FFFD00000B22608C +1884097,305,14E300072D0020 +1887970,208,1A9B33004C333233 +1888935,2F5,E800007FFF0001 +1890555,452,000000030000 +1891530,3CD,FFFD00000B22607D +1892503,30D,0000000000000000 +1894097,305,14E300071E0020 +1894485,3AD,5000000180520062 +1898062,208,1A8933004C333233 +1900061,2F5,D900007FFF0001 +1900504,3CD,FFFD00000B22606E +1900756,412,10000000007C0000 +1904103,305,14E300070F0020 +1907940,208,1A8933004C333233 +1908926,2F5,CA00007FFF0001 +1910993,50E,022600045E42FF23 +1911229,572,98807FC088000000 +1911728,3CD,FFFD00000B22605F +1912501,30D,0000000000000000 +1914114,305,14E30007F00020 +1914510,3AD,500000018072007F +1917964,208,1A8933004C333233 +1920057,2F5,BB00007FFF0001 +1920503,3CD,FFFB00000B226060 +1924100,305,14E30007E10020 +1927959,208,1A8933004C333233 +1928931,2F5,9C00007FFF0011 +1930493,3CD,FFFB00000B226051 +1931658,30D,0000000000000000 +1933613,3AD,500000018072008E +1934111,305,14E30007D20020 +1937955,208,1A8533004C333233 +1940075,2F5,9D00007FFF0001 +1940500,3CD,FFFD00000B226022 +1941160,452,000000030000 +1944126,305,14E30007C30020 +1948018,208,1A8533004C333233 +1948932,2F5,8E00007FFF0001 +1950457,412,10000000007C0000 +1950702,3CD,FFFD00000B226013 +1951535,30D,0000000000000000 +1953613,3AD,500000018052009F +1954117,305,14E30007B40020 +1957960,208,1A8533004C333233 +1960075,2F5,7F00007FFF0001 +1960495,3CD,FFFD00000B226004 +1964116,305,14E30007A50020 +1967939,208,1A8533004C333233 +1968935,2F5,6000007FFF0001 +1971509,3CD,FFFD00000B2260F5 +1972503,30D,0000000000000000 +1974099,305,14E30007960020 +1974487,3AD,50000001805200AE +1977926,208,1A8533004C333233 +1980062,2F5,5100007FFF0001 +1980504,3CD,FFFD00000B2260E6 +1984102,305,14E30007870020 +1987930,208,1A7A33004C333233 +1988922,2F5,4200007FFF0001 +1990470,452,000000030000 +1991517,3CD,FFFD00000B2260D7 +1992517,30D,0000000000000000 +1994114,305,14E30007780020 +1994516,3AD,50000001807200BB +1997930,208,1A7A33004C333233 diff --git a/opendbc/car/psa/tests/test_peugeot_308_t9.py b/opendbc/car/psa/tests/test_peugeot_308_t9.py new file mode 100644 index 00000000000..f241140fe95 --- /dev/null +++ b/opendbc/car/psa/tests/test_peugeot_308_t9.py @@ -0,0 +1,250 @@ +import unittest +import csv +import itertools +from pathlib import Path +from types import SimpleNamespace + +from opendbc.car import Bus, structs +from opendbc.can.parser import CANParser +from opendbc.car.can_definitions import CanData +from opendbc.car.fingerprints import ( + all_legacy_fingerprint_cars, + eliminate_incompatible_cars, +) +from opendbc.car.psa.fingerprints import FINGERPRINTS +from opendbc.car.psa.interface import CarInterface +from opendbc.car.psa.psacan import psa_checksum +from opendbc.car.psa.values import CAR, DBC + + +# RX snapshot from learn-20260811T170039Z-e1fe3ff3. +# Overrides in the signal tests below are synthetic unless stated otherwise. +STATIONARY_CAPTURE = { + 0x208: "1AC133004C333233", + 0x2F5: "BB00007FFF0001", + 0x305: "14E30007E10020", + 0x30D: "0000000000000000", + 0x3AD: "500000018072008E", + 0x3CD: "FFFD00000B226040", + 0x412: "10000000007C0000", + 0x452: "000000030000", + 0x50E: "022600045E42FF2D", + 0x572: "98807FC088000001", +} + + +class TestPeugeot308T9(unittest.TestCase): + def setUp(self): + self.CP = CarInterface.get_non_essential_params(CAR.PSA_PEUGEOT_308_T9) + self.CI = CarInterface(self.CP) + + def update_from_stationary_capture(self, overrides=None): + capture = STATIONARY_CAPTURE | (overrides or {}) + frames = [ + CanData(address, bytes.fromhex(data_hex), 0) + for address, data_hex in capture.items() + ] + return self.CI.update([(1_000_000_000, frames)]) + + def test_platform_is_hard_read_only(self): + self.assertTrue(self.CP.dashcamOnly) + self.assertEqual( + self.CP.safetyConfigs[0].safetyModel, + structs.CarParams.SafetyModel.noOutput, + ) + self.assertEqual(self.CP.safetyConfigs[0].safetyParam, 0) + self.assertFalse(self.CP.openpilotLongitudinalControl) + self.assertFalse(self.CP.alphaLongitudinalAvailable) + self.assertTrue(self.CP.pcmCruise) + self.assertFalse(self.CP.autoResumeSng) + self.assertEqual(self.CP.steerControlType, structs.CarParams.SteerControlType.torque) + self.assertEqual(self.CP.lateralTuning.which(), "pid") + + def test_uses_vehicle_specific_dbc_and_fingerprint(self): + self.assertEqual( + DBC[CAR.PSA_PEUGEOT_308_T9][Bus.pt], + "psa_308_t9_2018", + ) + fingerprint = FINGERPRINTS[CAR.PSA_PEUGEOT_308_T9][0] + for address, data_hex in STATIONARY_CAPTURE.items(): + self.assertEqual(fingerprint[address], len(bytes.fromhex(data_hex))) + + def test_recorded_snapshot_fingerprints_as_t9(self): + candidates = all_legacy_fingerprint_cars() + for address, data_hex in STATIONARY_CAPTURE.items(): + candidates = eliminate_incompatible_cars( + CanData(address, bytes.fromhex(data_hex), 0), + candidates, + ) + + self.assertEqual(candidates, [CAR.PSA_PEUGEOT_308_T9]) + + def test_decodes_recorded_stationary_carstate(self): + state = self.update_from_stationary_capture() + + self.assertAlmostEqual(state.vEgoRaw, 0.0) + self.assertTrue(state.standstill) + self.assertAlmostEqual(state.steeringAngleDeg, 534.7, places=3) + self.assertAlmostEqual(state.steeringRateDeg, 0.0) + self.assertAlmostEqual(state.steeringTorque, 0.0) + self.assertFalse(state.steeringPressed) + self.assertFalse(state.gasPressed) + self.assertFalse(state.brakePressed) + self.assertTrue(state.parkingBrake) + self.assertFalse(state.doorOpen) + self.assertFalse(state.seatbeltUnlatched) + self.assertEqual(state.gearShifter, structs.CarState.GearShifter.unknown) + self.assertTrue(state.cruiseState.available) + self.assertFalse(state.cruiseState.enabled) + self.assertTrue(state.cruiseState.nonAdaptive) + self.assertAlmostEqual(state.cruiseState.speed, 0.0) + + def test_only_reverse_gear_is_reported(self): + reverse = self.update_from_stationary_capture({ + 0x412: "14000000007C0000", + }) + self.assertEqual(reverse.gearShifter, structs.CarState.GearShifter.reverse) + state = self.update_from_stationary_capture() + self.assertEqual(state.gearShifter, structs.CarState.GearShifter.unknown) + + def test_parking_brake_uses_validated_esp_state(self): + released = self.update_from_stationary_capture({ + 0x3AD: "000000007EE10054", + }) + self.assertFalse(released.parkingBrake) + + self.CI = CarInterface(self.CP) + applied = self.update_from_stationary_capture({ + 0x3AD: "50000001805200EA", + }) + self.assertTrue(applied.parkingBrake) + + def test_driver_body_and_rvv_signals(self): + state = self.update_from_stationary_capture({ + # Accelerator > 0 and persistent RVV state 2. + 0x208: "1AC1332048333233", + # Brake pedal plus driver and rear-left doors open. + 0x412: "30000000007C2800", + # Driver seatbelt state 1 (unlatched). + 0x572: "58807FC088000001", + }) + + self.assertTrue(state.gasPressed) + self.assertTrue(state.brakePressed) + self.assertTrue(state.doorOpen) + self.assertTrue(state.seatbeltUnlatched) + self.assertTrue(state.cruiseState.available) + self.assertTrue(state.cruiseState.enabled) + self.assertTrue(state.cruiseState.nonAdaptive) + + def test_vehicle_validated_psa_checksums(self): + # One real payload per protected message. The complete 72-session corpus + # and pass counts are recorded beside the DBC in the OBD repository. + samples = { + # address: (payload, checksum start bit, transmitted checksum) + 0x2F5: ("9D00007FFF0001", 7, 0x9), + 0x3AD: ("50000001805200EA", 59, 0xA), + 0x3CD: ("000100000B33B17E", 63, 0x7), + } + + for address, (payload, start_bit, expected) in samples.items(): + with self.subTest(address=hex(address)): + signal = SimpleNamespace(start_bit=start_bit) + self.assertEqual( + psa_checksum(address, signal, bytearray.fromhex(payload)), + expected, + ) + + def test_real_capture_replay(self): + for name, speed_kph, angle_deg, parked in ( + ('stationary', 0., 534.7, True), + ('moving', 125.815, 5.2, False), + ): + with self.subTest(capture=name): + ci = CarInterface(self.CP) + with (Path(__file__).parent / 'fixtures' / f'{name}.csv').open() as f: + packets = [(1_000_000_000 + int(row['time_us']) * 1000, + [CanData(int(row['address'], 16), bytes.fromhex(row['data']), 0)]) for row in csv.DictReader(f)] + cursor = 0 + for now in range(1_010_000_000, 3_000_000_001, 10_000_000): + start = cursor + while cursor < len(packets) and packets[cursor][0] <= now: + cursor += 1 + state = ci.update(packets[start:cursor] or [(now, [])]) + if now >= 2_000_000_000: + self.assertTrue(state.canValid) + self.assertFalse(state.canTimeout) + self.assertEqual(ci.apply(structs.CarControl().as_reader(), now)[1], []) + self.assertAlmostEqual(state.vEgoRaw * 3.6, speed_kph, places=3) + self.assertAlmostEqual(state.steeringAngleDeg, angle_deg, places=3) + self.assertEqual(state.parkingBrake, parked) + # All protected streams remain sequential with no counter failures. + for message in ci.can_parsers[Bus.main].message_states.values(): + self.assertEqual(message.counter_fail, 0) + # No new messages: the stream must eventually become invalid. + for now in range(5_000_000_000, 5_100_000_000, 10_000_000): + state = ci.update([(now, [])]) + self.assertFalse(state.canValid) + self.assertTrue(state.canTimeout) + + def test_corrupt_protected_frames_do_not_refresh_signals(self): + for address, signal in ((0x2F5, 'DriverTorqueRaw'), (0x3AD, 'ParkingBrakeState'), (0x3CD, 'YawRateDegS')): + original = bytes.fromhex(STATIONARY_CAPTURE[address]) + # Flip each individual bit, including opaque bytes and the checksum. + for bit in range(len(original) * 8): + with self.subTest(address=hex(address), bit=bit): + cp = CANParser('psa_308_t9_2018', [(address, 100)], 0) + cp.update([(1_000_000_000, [CanData(address, original, 0)])]) + self.assertEqual(cp.ts_nanos[address][signal], 1_000_000_000) + corrupted = bytearray(original) + corrupted[bit // 8] ^= 1 << (bit % 8) + cp.update([(1_010_000_000, [CanData(address, bytes(corrupted), 0)])]) + self.assertEqual(cp.ts_nanos[address][signal], 1_000_000_000) + + def test_repeated_counter_is_rejected(self): + cp = CANParser('psa_308_t9_2018', [(0x2F5, 100)], 0) + frame = CanData(0x2F5, bytes.fromhex(STATIONARY_CAPTURE[0x2F5]), 0) + for i in range(20): + cp.update([(1_000_000_000 + i * 10_000_000, [frame])]) + self.assertFalse(cp.can_valid) + self.assertLess(cp.ts_nanos[0x2F5]['DriverTorqueRaw'], 1_100_000_000) + + def test_other_buses_do_not_update_carstate(self): + for bus in (1, 2): + ci = CarInterface(self.CP) + frames = [CanData(address, bytes.fromhex(data), bus) for address, data in STATIONARY_CAPTURE.items()] + ci.update([(1_000_000_000, frames)]) + cp = ci.can_parsers[Bus.main] + self.assertEqual(cp.ts_nanos[0x305]['SteeringAngleDeg'], 0) + self.assertFalse(cp.can_valid) + + def test_limiter_and_off_are_not_cruise(self): + for mode in (0, 2, 3): + payload = bytearray.fromhex(STATIONARY_CAPTURE[0x50E]) + payload[6] = 90 + payload[7] = mode << 5 + state = self.update_from_stationary_capture({0x50E: payload.hex(), 0x208: '1AC1332048333233'}) + self.assertFalse(state.cruiseState.enabled) + self.assertFalse(state.cruiseState.available) + self.assertEqual(state.cruiseState.speed, 0.) + + def test_controller_never_emits_can(self): + for enabled, lateral, longitudinal, have_can in itertools.product((False, True), repeat=4): + self.CI = CarInterface(self.CP) + if have_can: + self.update_from_stationary_capture() + control = structs.CarControl(enabled=enabled, latActive=lateral, longActive=longitudinal) + control.actuators.steeringAngleDeg = 90.0 + control.actuators.torque = 1.0 + control.actuators.accel = 2.0 + control = control.as_reader() + for frame in range(100): + applied, can_sends = self.CI.apply(control, frame * 10_000_000) + self.assertEqual(applied.torque, 0.) + self.assertEqual(applied.steeringAngleDeg, 0.) + self.assertEqual(applied.accel, 0.) + self.assertEqual(can_sends, []) + + +if __name__ == "__main__": + unittest.main() diff --git a/opendbc/car/psa/values.py b/opendbc/car/psa/values.py index 42698e76e18..8fe04875b0b 100644 --- a/opendbc/car/psa/values.py +++ b/opendbc/car/psa/values.py @@ -19,6 +19,17 @@ class CarControllerParams: ) STEER_DRIVER_ALLOWANCE = 5 # Driver intervention threshold, 0.5 Nm + # T9 driver effort is only calibrated in raw units. + T9_STEER_DRIVER_THRESHOLD_RAW = 5 + + def __init__(self, CP): + if CP.carFingerprint == CAR.PSA_PEUGEOT_308_T9: + # No permitted actuation in the dashcam port. These normalized limits + # do not describe the EPS torque scale or a vehicle calibration. + self.STEER_MAX = 1 + self.STEER_DELTA_UP = 0 + self.STEER_DELTA_DOWN = 0 + @dataclass class PSACarDocs(CarDocs): @@ -38,6 +49,13 @@ class CAR(Platforms): [PSACarDocs("Peugeot 208 2019-25")], CarSpecs(mass=1530, wheelbase=2.54, steerRatio=17.6), ) + PSA_PEUGEOT_308_T9 = PSAPlatformConfig( + [PSACarDocs("Peugeot 308 2018", package="Conventional cruise control", car_parts=CarParts())], + # Preliminary geometry inherited from the local T9 research profile. + # Mass and steering ratio require variant-specific validation before control. + CarSpecs(mass=1300, wheelbase=2.62, steerRatio=15.0), + dbc_dict={Bus.pt: 'psa_308_t9_2018'}, + ) # Placeholder, FW Query will be added in separate PR diff --git a/opendbc/car/tests/routes.py b/opendbc/car/tests/routes.py index 492e5679497..3c7ac3da5d8 100644 --- a/opendbc/car/tests/routes.py +++ b/opendbc/car/tests/routes.py @@ -20,6 +20,7 @@ # FIXME: add routes for these cars non_tested_cars = [ + PSA.PSA_PEUGEOT_308_T9, # Draft dashcam port: ESP32 RX fixtures only; comma route pending. MOCK.MOCK, GM.CADILLAC_ATS, GM.HOLDEN_ASTRA, diff --git a/opendbc/car/torque_data/override.toml b/opendbc/car/torque_data/override.toml index 59bd959511f..97ee4ea4c03 100644 --- a/opendbc/car/torque_data/override.toml +++ b/opendbc/car/torque_data/override.toml @@ -10,6 +10,10 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] # PSA angle based controllers "PSA_PEUGEOT_208" = [nan, 2.0, nan] +# Dashcam-only T9: unused interface placeholder, not measured lateral authority. +# No torque tune; the controller and safety mode both prohibit all CAN output. +"PSA_PEUGEOT_308_T9" = [nan, 1.0, nan] + # New subarus angle based controllers "SUBARU_FORESTER_2022" = [nan, 3.0, nan] "SUBARU_OUTBACK_2023" = [nan, 3.0, nan] diff --git a/opendbc/dbc/psa_308_t9_2018.dbc b/opendbc/dbc/psa_308_t9_2018.dbc new file mode 100644 index 00000000000..b99ec22bfec --- /dev/null +++ b/opendbc/dbc/psa_308_t9_2018.dbc @@ -0,0 +1,89 @@ +VERSION "Peugeot 308 T9 2018 - passive CarState subset" + +NS_ : + CM_ + VAL_ + +BS_: + +BU_: ENGINE ABS_ESP BSI STEERING Vector__XXX + +BO_ 520 T9_ENGINE_DYNAMICS_208: 8 ENGINE + SG_ AcceleratorPositionPct : 24|8@1+ (0.5,0) [0|100] "%" Vector__XXX + SG_ CruiseStateCandidate : 34|2@1+ (1,0) [0|3] "state" Vector__XXX + +BO_ 757 T9_STEERING_TORQUE_2F5: 7 STEERING + SG_ COUNTER : 3|4@0+ (1,0) [0|15] "raw" Vector__XXX + SG_ CHECKSUM : 7|4@0+ (1,0) [0|15] "raw" Vector__XXX + SG_ DriverTorqueRaw : 15|8@0- (1,0) [-128|127] "raw" Vector__XXX + +BO_ 773 T9_STEERING_DYNAMICS_305: 7 STEERING + SG_ SteeringAngleDeg : 7|16@0- (0.1,0) [-1080|1080] "deg" Vector__XXX + SG_ SteeringRateMagnitudeDegS : 23|8@0+ (1,0) [0|255] "deg/s" Vector__XXX + SG_ SteeringRateSign : 31|1@0+ (1,0) [0|1] "state" Vector__XXX + +BO_ 781 T9_WHEEL_SPEEDS_30D: 8 ABS_ESP + SG_ WheelSpeedFrontLeftKph : 7|16@0+ (0.01,0) [0|655.35] "km/h" Vector__XXX + SG_ WheelSpeedFrontRightKph : 23|16@0+ (0.01,0) [0|655.35] "km/h" Vector__XXX + SG_ WheelSpeedRearLeftKph : 39|16@0+ (0.01,0) [0|655.35] "km/h" Vector__XXX + SG_ WheelSpeedRearRightKph : 55|16@0+ (0.01,0) [0|655.35] "km/h" Vector__XXX + +BO_ 941 T9_EASY_MOVE_3AD: 8 ABS_ESP + SG_ ParkingBrakeState : 24|3@1+ (1,0) [0|3] "state" Vector__XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "raw" Vector__XXX + SG_ COUNTER : 63|4@0+ (1,0) [0|15] "raw" Vector__XXX + +BO_ 973 T9_BRAKE_DYNAMICS_3CD: 8 ABS_ESP + SG_ YawRateDegS : 23|16@0- (0.1,0) [-3276.8|3276.7] "deg/s" Vector__XXX + SG_ CHECKSUM : 63|4@0+ (1,0) [0|15] "raw" Vector__XXX + SG_ COUNTER : 59|4@0+ (1,0) [0|15] "raw" Vector__XXX + +BO_ 1042 T9_BODY_STATUS_412: 8 BSI + SG_ ReverseGearActive : 2|1@1+ (1,0) [0|1] "state" Vector__XXX + SG_ BrakePedalActive : 5|1@1+ (1,0) [0|1] "state" Vector__XXX + SG_ DriverDoorOpen : 51|1@0+ (1,0) [0|1] "state" Vector__XXX + SG_ PassengerDoorOpen : 52|1@0+ (1,0) [0|1] "state" Vector__XXX + SG_ RearLeftDoorOpen : 53|1@1+ (1,0) [0|1] "state" Vector__XXX + SG_ RearRightDoorOpen : 54|1@1+ (1,0) [0|1] "state" Vector__XXX + +BO_ 1106 T9_DRIVER_CRUISE_COMMAND_452: 6 BSI + SG_ TurnSignalStatus : 5|2@0+ (1,0) [0|3] "state" Vector__XXX + +BO_ 1294 T9_CRUISE_SETPOINT_50E: 8 BSI + SG_ CruiseSetpointKph : 48|8@1+ (1,0) [0|255] "km/h" Vector__XXX + SG_ CruiseMode : 61|2@1+ (1,0) [0|3] "state" Vector__XXX + +BO_ 1394 T9_RESTRAINTS_572: 8 BSI + SG_ DriverSeatbeltState : 7|2@0+ (1,0) [0|3] "state" Vector__XXX + +CM_ "Receive-only subset from local T9 captures. Signal layouts partly derived from commaai/opendbc psa_aee2010_r3.dbc revision a0febba355168a5cb6168b535144c8c41a5ce323, Copyright (c) 2020 Comma.ai, Inc., MIT License."; +CM_ SG_ 520 AcceleratorPositionPct "Validated against the independent 0x228 accelerator channel."; +CM_ SG_ 520 CruiseStateCandidate "Vehicle-observed state. Active is derived as raw value 2; it is not an official PSA enum."; +CM_ BO_ 757 "Steering torque frame protection was validated over 933226 local frames: checksum in byte 0 high nibble, rolling counter in byte 0 low nibble, CHK_INI=0xB, zero mismatches."; +CM_ SG_ 757 DriverTorqueRaw "Direction and dynamics validated on the vehicle. No physical Nm scale has been established, therefore the unit remains raw."; +CM_ SG_ 773 SteeringAngleDeg "Scale and direction validated on the vehicle."; +CM_ SG_ 773 SteeringRateMagnitudeDegS "Validated rate magnitude. Signed steering rate must be derived using SteeringRateSign: sign 1 means negative in the local replay."; +CM_ BO_ 781 "All four wheel speeds validated together over a road capture; mean inter-wheel spread 0.86 km/h."; +CM_ BO_ 941 "ESP EasyMove frame. ParkingBrakeState and frame protection are source-confirmed and locally observed. CHECKSUM/COUNTER: 480554 frames, CHK_INI=0xD, zero mismatches."; +CM_ SG_ 941 ParkingBrakeState "Observed counts over the checksum-valid corpus: state 0=405148, 1=74389, 2=496, 3=521. Source semantics confirm 0 released, 1 applied and 3 actuator moving; state 2 remains reserved/transition."; +CM_ SG_ 973 YawRateDegS "Scale and direction validated against steering and wheel-speed differential."; +CM_ BO_ 973 "Brake dynamics protection was checked over 961914 local frames with CHK_INI=0x3; 961913 passed and one isolated frame was a corrupt/outlier."; +CM_ SG_ 1042 DriverDoorOpen "Source-confirmed at Dat_BSI.DRIVER_DOOR (byte 6 mask 0x08). Both closed and open states were observed locally; five learn sessions contain transitions."; +CM_ SG_ 1042 RearLeftDoorOpen "Undocumented byte 6 mask 0x20, confirmed by repeated closed-open-closed tests on the rear-left door."; +CM_ SG_ 1042 RearRightDoorOpen "Undocumented byte 6 mask 0x40, confirmed by repeated closed-open-closed tests on the rear-right door."; +CM_ SG_ 1294 CruiseSetpointKph "Confirmed over five cruise engagements in four independent tests. Raw 255 means inactive/unavailable."; +CM_ SG_ 1294 CruiseMode "Validated during learn-20260805T065418Z-fca10a57: the selector sequence cruise-off-limiter-off-cruise produced 1-0-2-0-1."; +CM_ SG_ 1394 DriverSeatbeltState "Vehicle-validated on learn-20260805T154951Z-57acfc99 at standstill: 2-1-2-1-2 while DriverDoorOpen and ParkingBrakeActive stayed false. Seven local sessions contain 1/2 transitions; road captures support 1=unlatched and 2=latched. Values 0 and 3 remain reserved/unknown."; +VAL_ 520 CruiseStateCandidate 0 "Inactive_observed" 2 "Active_observed" 3 "Transient_observed"; +VAL_ 773 SteeringRateSign 0 "Positive_local_replay" 1 "Negative_local_replay"; +VAL_ 1042 ReverseGearActive 0 "Inactive" 1 "Active"; +VAL_ 1042 BrakePedalActive 0 "Released" 1 "Pressed"; +VAL_ 1042 DriverDoorOpen 0 "Closed" 1 "Open"; +VAL_ 1042 PassengerDoorOpen 0 "Closed" 1 "Open"; +VAL_ 1042 RearLeftDoorOpen 0 "Closed" 1 "Open"; +VAL_ 1042 RearRightDoorOpen 0 "Closed" 1 "Open"; +VAL_ 941 ParkingBrakeState 0 "Released" 1 "Applied" 2 "Reserved_or_transition" 3 "Actuator_moving"; +VAL_ 1106 TurnSignalStatus 0 "Off" 1 "Right" 2 "Left" 3 "Hazard"; +VAL_ 1294 CruiseSetpointKph 255 "Inactive_or_unavailable"; +VAL_ 1294 CruiseMode 0 "Off" 1 "Cruise_RVV" 2 "Limiter_LVV" 3 "Reserved"; +VAL_ 1394 DriverSeatbeltState 0 "Unknown_or_reserved" 1 "Unlatched" 2 "Latched" 3 "Unknown_or_reserved";