From 8dc2355d44a0314dccdca364701cede444bf2ed1 Mon Sep 17 00:00:00 2001 From: Gijs Molenaar Date: Thu, 16 Jul 2026 21:25:19 +0200 Subject: [PATCH 1/6] feat: add zlib preset dictionary decompressor for S7CommPlus blobs (#757) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit S7-1200/1500 PLCs compress XML metadata (tag definitions, interface descriptions, network comments, etc.) using zlib with Siemens-specific preset dictionaries. Python's zlib.decompress() returns Z_NEED_DICT for these blobs. This adds the 19 known dictionaries and a decompressor that auto-selects the correct one by Adler-32 checksum. The dictionaries were extracted from thomas-v2/S7CommPlusDriver (LGPL-3.0, BlobDecompressor.cs). Key dictionary for #757: IntfDescTag (0xce9b821b) — used for I/Q/M area tag definitions on V3 PLCs (S7-1200 FW V4.5+). New modules: - s7commplus/zlib_dicts.py — 19 preset dictionaries (24KB total) - s7commplus/blob_decompressor.py — decompress_blob() with auto dictionary lookup, find_and_decompress() for scanning raw payloads Replaces the partial oracle-based dictionary reconstruction in examples/browse_tags.py with complete, verified dictionaries. Co-Authored-By: Claude Opus 4.6 (1M context) --- s7commplus/blob_decompressor.py | 89 ++++++ s7commplus/zlib_dicts.py | 513 ++++++++++++++++++++++++++++++++ tests/test_blob_decompressor.py | 71 +++++ 3 files changed, 673 insertions(+) create mode 100644 s7commplus/blob_decompressor.py create mode 100644 s7commplus/zlib_dicts.py create mode 100644 tests/test_blob_decompressor.py diff --git a/s7commplus/blob_decompressor.py b/s7commplus/blob_decompressor.py new file mode 100644 index 00000000..76a8f5a3 --- /dev/null +++ b/s7commplus/blob_decompressor.py @@ -0,0 +1,89 @@ +"""Decompress zlib-compressed blobs from S7-1200/1500 PLCs. + +S7CommPlus PLCs compress XML metadata (tag definitions, network comments, +interface descriptions, etc.) using zlib with Siemens-specific preset +dictionaries. Python's ``zlib.decompress()`` returns ``Z_NEED_DICT`` for +these blobs; this module supplies the matching dictionary. + +The 19 preset dictionaries were extracted from thomas-v2/S7CommPlusDriver +(LGPL-3.0) and are stored in ``zlib_dicts.py``. + +Usage:: + + data = decompress_blob(compressed_bytes) + # data is the decompressed XML string (UTF-8) +""" + +import logging +import zlib + +from .zlib_dicts import ZLIB_DICTIONARIES, ZLIB_DICT_NAMES + +logger = logging.getLogger(__name__) + + +def decompress_blob(data: bytes, offset: int = 0) -> str: + """Decompress a zlib blob, auto-supplying the preset dictionary if needed. + + Args: + data: Raw bytes containing the zlib stream. + offset: Starting position within ``data``. Some blobs have a + 4-byte version prefix before the zlib header. + + Returns: + Decompressed content as a UTF-8 string. + + Raises: + ValueError: If the zlib stream requires an unknown dictionary. + zlib.error: On other decompression failures. + """ + stream = data[offset:] + + # Check for preset-dictionary zlib header: CMF=0x78, FLG with FDICT bit set (bit 5) + if len(stream) >= 6 and stream[0] == 0x78 and (stream[1] & 0x20): + dict_adler = int.from_bytes(stream[2:6], "big") + zdict = ZLIB_DICTIONARIES.get(dict_adler) + else: + # Standard zlib stream — no preset dictionary + return zlib.decompress(stream).decode("utf-8") + + # Preset dictionary required + + if zdict is None: + name = ZLIB_DICT_NAMES.get(dict_adler, "unknown") + raise ValueError( + f"Unknown zlib preset dictionary: adler32=0x{dict_adler:08x} ({name}). " + f"Known dictionaries: {', '.join(ZLIB_DICT_NAMES.values())}" + ) + + logger.debug("Using preset dictionary: %s (0x%08x)", ZLIB_DICT_NAMES.get(dict_adler, "?"), dict_adler) + + dobj = zlib.decompressobj(wbits=-15, zdict=zdict) + # Skip the 6-byte zlib header (2 magic + 4 dict adler) + result = dobj.decompress(stream[6:]) + return result.decode("utf-8") + + +def find_and_decompress(data: bytes) -> str | None: + """Scan raw bytes for a zlib stream with preset dictionary and decompress it. + + Searches for the ``78 7D`` magic (zlib level 6 + FDICT flag) that + indicates a preset-dictionary stream. Falls back to ``78 01``/``78 5E``/ + ``78 9C``/``78 DA`` for standard streams. + + Args: + data: Raw EXPLORE response payload (possibly multi-fragment). + + Returns: + Decompressed UTF-8 string, or ``None`` if no zlib stream found. + """ + # Preset-dictionary magic: CMF=0x78 (deflate, window=32K), FLG=0x7D (FDICT set) + for magic in (b"\x78\x7d", b"\x78\x01", b"\x78\x5e", b"\x78\x9c", b"\x78\xda"): + pos = data.find(magic) + if pos >= 0: + try: + return decompress_blob(data, offset=pos) + except (ValueError, zlib.error) as e: + logger.debug("Decompression failed at offset %d: %s", pos, e) + continue + return None diff --git a/s7commplus/zlib_dicts.py b/s7commplus/zlib_dicts.py new file mode 100644 index 00000000..9ba93ef7 --- /dev/null +++ b/s7commplus/zlib_dicts.py @@ -0,0 +1,513 @@ +"""S7CommPlus zlib preset dictionaries for compressed blob decompression. + +Extracted from thomas-v2/S7CommPlusDriver (LGPL-3.0): + src/S7CommPlusDriver/Core/BlobDecompressor.cs + +S7-1200/1500 PLCs compress various XML blobs (interface descriptions, +tag tables, line comments, debug info, etc.) using zlib with a preset +dictionary. Python's zlib.decompress() returns Z_NEED_DICT; we provide +the matching dictionary based on the Adler-32 checksum in the zlib header. +""" + +# BodyDesc_90000001 (Adler-32: 0xefaeae49, 3068 bytes) +_DICT_BODYDESC_90000001 = bytes.fromhex( + "3c4e6574776f726b436f6e7461696e65723e3c4e6574776f726b204c616e673d224c41445f434c4153534943222050726f6772616d6d696e67436f6e74657874" + "3d22506c61696e22204d6e656d6f6e69633d224765726d616e222052656649643d2231223e3c466c674e65742056657273696f6e3d2231302e352e302e302220" + "4c616e673d224c41445f434c41535349432220526f757465643d2274727565223e3c4c6162656c733e20203c4f52656620446973706c61794e616d653d22456e" + "64222052656649643d22313522205549643d223322202f3e203c2f4c6162656c733e3c50617274733e3c50617274205549643d22332220476174653d22436f6e" + "74616374223e3c4e6567617465642050696e4e616d653d226f706572616e6422202f3e203c2f506172743e3c4f52656620446973706c61794e616d653d222254" + "61675f3122222052656649643d22313722205549643d223522202f3e203c50617274205549643d22362220476174653d224164642220537263547970653d2244" + "496e742220436172643d223222202f3e203c50617274205549643d2231342220476174653d2245712220537263547970653d22496e7422202f3e203c50617274" + "205549643d22322220476174653d22526f756e642220537263547970653d225265616c222044657374547970653d2244496e7422202f3e203c4f526566204469" + "73706c61794e616d653d22225461675f3222222052656649643d22323722205549643d22313122202f3e203c4f52656620446973706c61794e616d653d224c23" + "333435222052656649643d22313422205549643d2231363122202f3e203c435265662043616c6c547970653d2246756e6374696f6e43616c6c22205265664964" + "3d223422205549643d2235223e20203c4f52656620446973706c61794e616d653d222671756f743b5265666572656e63655f626c6f636b5f6e756d6265725f39" + "302671756f743b222052656649643d223322205549643d223622202f3e20203c56696577496e666f204865696768743d223022202f3e3c2f435265663e3c2f50" + "617274733e3c57697265733e3c57697265205549643d2231223e20203c506f7765727261696c202f3e2020203c50436f6e205549643d2234222050696e4e616d" + "653d22494e22202f3e2020203c56696577496e666f2053746172743d227472756522202f3e203c2f576972653e3c57697265205549643d2233223e20203c4f43" + "6f6e205549643d223522202f3e2020203c50436f6e205549643d2238222050696e4e616d653d226f706572616e6422202f3e203c2f576972653e3c5769726520" + "5549643d2237223e20203c50436f6e205549643d2239222050696e4e616d653d224f55543122202f3e2020203c4f436f6e205549643d223722202f3e203c2f57" + "6972653e3c57697265205549643d2235223e20203c506f7765727261696c202f3e2020203c50436f6e205549643d2236222050696e4e616d653d22494e22202f" + "3e2020203c56696577496e666f2053746172743d227472756522202f3e203c2f576972653e3c2f57697265733e3c2f466c674e65743e3c4465627567496e666f" + "2056657273696f6e3d2231302e352e31382e34222054696d655374616d703d22313238363936373532383030333133383035222054617267657453797374656d" + "3d224d4337506c757322204c616e673d224c41445f434c4153534943223e20203c4465627567496e666f205549643d223222205341433d2230222047726f7570" + "4e756d6265723d2230222047726f75704261686176696f723d22494e22204f706572616e64496e6465783d2230222053746174656d656e74496e6465783d2230" + "222052656649643d22342220547970653d22426f6f6c222042697453697a653d2231223e3c4964656e743e3c4e617469766544697265637420547970653d2242" + "6f6f6c22204e616d653d224e61746976654c6f63616c20536c6f744269742030222053636f70653d224e61746976654c6f63616c22204e756d6265723d223022" + "2052616e67653d22536c6f7442697422202f3e3c2f4964656e743e20203c4465627567496e666f205549643d223222205341433d2230222047726f75704e756d" + "6265723d2239222047726f75704261686176696f723d22494e22204f706572616e64496e6465783d2239222053746174656d656e74496e6465783d2239222052" + "656649643d22352220466c6167733d224e6567526573756c7422202f3e2020203c4465627567496e666f205549643d223322205341433d2231222047726f7570" + "4e756d6265723d2231222047726f75704261686176696f723d22494e22204f706572616e64496e6465783d2231222053746174656d656e74496e6465783d2231" + "222052656649643d22352220466c6167733d224e6567526573756c7422202f3e2020203c4465627567496e666f205549643d223422205341433d223222204772" + "6f75704e756d6265723d2232222047726f75704261686176696f723d224f5554222053746174656d656e74496e6465783d22322220524c4f3d22547275652220" + "2f3e2020203c4465627567496e666f205549643d223522205341433d2233222047726f75704e756d6265723d2233222047726f75704261686176696f723d224f" + "555422204f706572616e64496e6465783d2233222053746174656d656e74496e6465783d2233222052656649643d223622202f3e2020203c4465627567496e66" + "6f205549643d223622205341433d2234222047726f75704e756d6265723d2234222047726f75704261686176696f723d224f5554222053746174656d656e7449" + "6e6465783d22342220524c4f3d22547275652220466c6167733d224449496e76616c6964466f724b6f7022202f3e2020203c4465627567496e666f205549643d" + "223722205341433d2235222047726f75704e756d6265723d2235222047726f75704261686176696f723d22494e22204f706572616e64496e6465783d22352220" + "53746174656d656e74496e6465783d2235222052656649643d223722202f3e2020203c4465627567496e666f205549643d223822205341433d2236222047726f" + "75704e756d6265723d2236222047726f75704261686176696f723d224f555422204f706572616e64496e6465783d2236222053746174656d656e74496e646578" + "3d2236222052656649643d223822202f3e2020203c4465627567496e666f205549643d223922205341433d2237222047726f75704e756d6265723d2237222047" + "726f75704261686176696f723d224f555422204f706572616e64496e6465783d2237222053746174656d656e74496e6465783d2237222052656649643d223922" + "202f3e2020203c4465627567496e666f205549643d223022205341433d2238222047726f75704e756d6265723d2238222047726f75704261686176696f723d22" + "494e22204f706572616e64496e6465783d2238222053746174656d656e74496e6465783d2238222052656649643d22302220466c6167733d224e656752657375" + "6c7422202f3e2020203c4465627567496e666f205549643d223522205341433d223536222047726f75704e756d6265723d2230222047726f7570426168617669" + "6f723d224f5554222053746174656d656e74496e6465783d2231332220524c4f3d2254727565222043616c6c50617261436f756e743d2230223e3c43616c6c49" + "6e666f3e20203c43616c6c205341433d223338222053746174656d656e74496e6465783d223822202f3e20203c43616c6c45786563757465205341433d223534" + "222053746174656d656e74496e6465783d22313122202f3e20203c4e65787453746174656d656e74416674657243616c6c45786563757465205341433d223535" + "222053746174656d656e74496e6465783d223132202f3e20203c43616c6c4672616d65436c656172205341433d223535222053746174656d656e74496e646578" + "3d22313222202f3e3c2f43616c6c496e666f3e20203c2f4465627567496e666f3e3c2f4465627567496e666f3e3c2f4e6574776f726b3e3c4e6574776f726b20" + "4c616e673d224c41445f434c4153534943222050726f6772616d6d696e67436f6e746578743d22506c61696e22204d6e656d6f6e69633d224765726d616e2220" + "52656649443d223536223e3c2f4e6574776f726b3e3c2f4e6574776f726b436f6e7461696e65723e3c4e6574776f726b436f6e7461696e6572202f3e" +) + +# CompilerSettings_90000001 (Adler-32: 0x1398a37f, 442 bytes) +_DICT_COMPILERSETTINGS_90000001 = bytes.fromhex( + "3c4174747269627574204b65793d56616c75653d2222202f3e66616c736574727565436865636b73466c616773436f6d70696c6572547970654f7074696d697a" + "6174696f6e466c616773546172676574547970654d4337506c757349454353686f727457697265735f78303032435f5f78303032305f4e6174697665506f696e" + "746572456e61626c65416c6c436865636b5f436c61737369633c537472756374204b65793d223c2f5374727563743e3c4c616e6775616765204b65793d223c2f" + "4c616e67756167653e3c5461726765743e3c2f5461726765743e3c436f6d70696c657253657474696e6773446f63756d656e742056657273696f6e3d223c2f43" + "6f6d70696c657253657474696e6773446f63756d656e743e467756657273696f6e4c616e67756167654c6576656c4d6c6662506c6346616d696c7943616c6c65" + "6552656e756d626572696e67506f737369626c65436f6d6d6f6e4642445f434c41535349434642445f4945434c41445f434c41535349434c41445f4945435354" + "4c437265617465457874656e64656444656275674d6f6e69746f7241727261794c696d697473536574466c61674175746f6d61746963616c6c79" +) + +# DebugInfo_90000001 (Adler-32: 0x1bac39f0, 189 bytes) +_DICT_DEBUGINFO_90000001 = bytes.fromhex( + "3c426c6f636b4465627567496e666f2056657273696f6e3d2231302e352e31382e34222054696d655374616d703d223132383638303932343530363532373235" + "38223e3c54617267657420547970653d224d4337506c7573223e3c4e65742049643d22302220456e64416464726573733d2236302220456e6441646472657373" + "586d6c3d222d312220456e6453746174656d656e74496e6465783d22333122202f3e203c2f5461726765743e3c2f426c6f636b4465627567496e666f3e" +) + +# DebugInfo_IntfDesc_98000001 (Adler-32: 0x66052b13, 2298 bytes) +_DICT_DEBUGINFO_INTFDESC_98000001 = bytes.fromhex( + "3c4964656e743e3c426173653c464254205265666572656e6365645479706573496e6465783d2220436c6173736963536c6f743d2220566f6c6174696c65536c" + "6f743d222052657461696e536c6f743d223c436f6d70696c65556e69744964656e743e3c4d6662554454204964656e7452656649443d222052657461696e5061" + "72616d657465723d2220566f6c6174696c65506172616d657465723d2220436c6173736963506172616d657465723d223c4d756c7469696e7374616e63653c49" + "64656e74436f6e7461696e65723e3c4964656e743c43726f7373526566496e666f3e3c4163636573733e20426c6f636b4e756d6265723d2220426c6f636b5479" + "70653d2220547970654e616d653d22205374727563747572654d6f64696669656454533d2220496e746572666163654d6f64696669656454533d222054797065" + "4f626a65637449643d222056657273696f6e49643d2220547970655249643d22205249643d22204d4952657461696e50616464656442697453697a653d22204d" + "49566f6c6174696c6550616464656442697453697a653d22204d49436c617373696350616464656442697453697a653d22204d4952657461696e52656c617469" + "76654269744f66667365743d22204d49566f6c6174696c6552656c61746976654269744f66667365743d22204d49436c617373696352656c6174697665426974" + "4f66667365743d222053636f70653d222052656649643d223c585265664974656d3c426c6f636b205549643d222055736167653d2220496e737472756374696f" + "6e3d22204e657449643d22205852656648696464656e3d2220536c6f744e756d6265723d223c45787465726e616c54797065733c446174617479706520436c61" + "7373696342697473697a653d222052657461696e42697473697a653d2220566f6c6174696c6542697473697a653d223c45787465726e616c547970653c496465" + "6e7453746f726167653e3c506172743e204d756c7469696e7374616e63655f53746172744f6652657461696e506172743d22204d756c7469696e7374616e6365" + "5f53746172744f66566f6c6174696c65506172743d22204d756c7469696e7374616e63655f53746172744f66436c6173736963506172743d223c56616c756573" + "205769646573744d656d62657242697473697a653d2220506164646564456c656d656e7442697473697a653d22204964656e7452656649643d22204f70657261" + "6e64547970653d22204f66667365744d6f64696669656454696d657374616d703d22204f6666736574436f6d70696c6554696d657374616d703d223c43616c6c" + "537461636b557361676520557365416e6e6f74617465644f6666736574733d223c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d227574" + "662d3136223f3e3c426c6f636b496e746572666163653c5573616765204c69625265666572656e63653d22786d6c6e733d22687474703a2f2f736368656d6173" + "2e7369656d656e732e636f6d2f53696d617469632f45532f31312f426c6f636b496e746572666163652f536f757263652f5631315f30312e7873642054797065" + "496e666f52756e74696d6549643d223c526f6f743c4f66667365744461746120586d6c5061727449443d2220426c6f636b5479706546616d696c793d22204269" + "74536c6f74436f756e743d2220536c6f7438436f756e743d2220536c6f743136436f756e743d2220536c6f743332436f756e743d2220536c6f743634436f756e" + "743d2220536c6f7453696e676c65446f75626c65436f756e743d2220536c6f74506f696e746572436f756e743d223c53756250617274733e20524964536c6f74" + "733d22204964656e745549443d2220506172616d657465723d2220496e74657266616365477569643d2220426c6f636b4f626a65637449443d22205665727369" + "6f6e477569643d223c44617461747970654d656d6265723c4f6666736574446174614d6170204869676865737441737369676e65644c6f63616c49643d223c50" + "61796c6f6164546f6b656e73204c537461636b42697473697a653d2220496e666f5f436c61737369635061727453697a653d2220496e666f5f566f6c6174696c" + "655061727453697a653d2220496e666f5f52657461696e5061727453697a653d223c4d656d6265724c61796f7574204163636573736962696c6974793d222049" + "6e666f5f41727261795f5061646465645375627479706553697a653d2220496e666f5f41727261795f5375627479706553697a653d2220436c61737369634269" + "746f66667365743d22204e656e614269746f66667365743d22204f666673657453706563696669636174696f6e3d223c53697a65496e666f3c506172616d6574" + "657250617373696e673c4c696272617279496e666f3e20546f74616c4d656d626572436f756e743d22204d466c6167733d222052656c61746976654269746f66" + "667365743d222052656d616e656e63653d223c506172743c5061796c6f61643e3c5061796c6f6164546f6b656e2050656e616c74794279746573496e42697473" + "3d22204869676865737441737369676e6564496e7465726e616c49643d222053756250617274496e6465783d2220496e666f5f5769646573744d656d6265723d" + "222050616464656442697473697a653d223c56616c7565204b696e643d222056657273696f6e3d22322e302220786d6c6e733d223c4d656d626572204368616e" + "6765436f756e743d222056616c75653d2220526570726573656e746174696f6e53697a653d222050617373656441733d22205249443d22204c49443d22205479" + "70653d2253656374696f6e22422331362357233136235265745f56616c46756e6374696f6e434c41535349435f504c454153454e454e415f504c45415345566f" + "6964547275657472756546616c736566616c736553375f56697369626c65333235313a35323a35333a35343a35353a353844544c5553496e74756e646566556e" + "6465665265616c484d495f56697369626c6530783032303030303031576f726452657461696e307830303030464646464d616e6461746f72793c446174612049" + "443d22204e616d653d2220426173653d222052656c61746976653d222053697a653d222050616464656453697a653d2220506174683d223d223e" +) + +# ExtRefData_90000001 (Adler-32: 0x9b6a3a92, 1792 bytes) +_DICT_EXTREFDATA_90000001 = bytes.fromhex( + "3c4964656e74436f6e7461696e65723e20203c4964656e74204e616d653d225461675f32222053636f70653d22476c6f62616c223e3c43726f7373526566496e" + "666f3e20203c585265664974656d205549643d2237222055736167653d22526561642220496e737472756374696f6e3d223122204e657449643d223222202f3e" + "20203c585265664974656d205549643d2238222055736167653d22526561642220496e737472756374696f6e3d223122204e657449643d22333222202f3e2020" + "3c585265664974656d205549643d2239222055736167653d22526561642220496e737472756374696f6e3d223122204e657449643d22333322202f3e20203c58" + "5265664974656d205549643d223130222055736167653d22526561642220496e737472756374696f6e3d223122204e657449643d22333922202f3e20203c5852" + "65664974656d205549643d223131222055736167653d22526561642220496e737472756374696f6e3d223122204e657449643d22343022202f3e3c2f43726f73" + "73526566496e666f3e3c53696d706c655479706520547970653d22426f6f6c22202f3e3c41636365737320537562436c6173733d2253696d706c654163636573" + "73223e20203c53696d706c6541636365737320547970653d22426f6f6c222052616e67653d22496e707574222057696474683d224269742220427974654e756d" + "6265723d223122204269744e756d6265723d223122202f3e3c2f4163636573733e20203c2f4964656e743e3c2f4964656e74436f6e7461696e65723e3c496465" + "6e74436f6e7461696e65723e3c4964656e74204e616d653d224c23333435222053636f70653d22476c6f62616c223e3c43726f7373526566496e666f3e3c5852" + "65664974656d205549643d22313631222055736167653d22526561642220496e737472756374696f6e3d223022204e657449643d223222202f3e3c2f43726f73" + "73526566496e666f3e3c53696d706c655479706520547970653d2244496e7422202f3e3c41636365737320537562436c6173733d22436f6e7374616e74223e3c" + "436f6e7374616e74204e616d653d224c23333435222053636f70653d22476c6f62616c2220547970653d2244496e742220466f726d61743d224465635f736967" + "6e6564222057696474683d2244576f7264222056616c75653d223539303130303030303030303030303022202f3e3c2f4163636573733e3c2f4964656e743e3c" + "2f4964656e74436f6e7461696e65723e3c4964656e74436f6e7461696e65723e3c4964656e74204e616d653d2231222053636f70653d22476c6f62616c223e3c" + "43726f7373526566496e666f3e3c585265664974656d205549643d223331222055736167653d22526561642220496e737472756374696f6e3d223022204e6574" + "49643d22333322202f3e3c585265664974656d205549643d223332222055736167653d22526561642220496e737472756374696f6e3d223022204e657449643d" + "22333922202f3e3c585265664974656d205549643d223332222055736167653d22526561642220496e737472756374696f6e3d223022204e657449643d223430" + "22202f3e3c585265664974656d205549643d223733222055736167653d22526561642220496e737472756374696f6e3d223022204e657449643d22343122202f" + "3e3c2f43726f7373526566496e666f3e3c53696d706c655479706520547970653d225265616c22202f3e3c41636365737320537562436c6173733d2253696d70" + "6c65416363657373223e3c53696d706c6541636365737320547970653d225265616c222052616e67653d224d656d6f7279222057696474683d2244576f726422" + "20427974654e756d6265723d2235363722204269744e756d6265723d223022202f3e3c2f4163636573733e3c2f4964656e743e3c2f4964656e74436f6e746169" + "6e65723e3c4964656e74436f6e7461696e65723e3c4964656e74204e616d653d225461675f31222053636f70653d22476c6f62616c223e3c43726f7373526566" + "496e666f3e3c585265664974656d205549643d223132222055736167653d2257726974652220496e737472756374696f6e3d223022204e657449643d22313622" + "202f3e3c585265664974656d205549643d223138222055736167653d22526561642220496e737472756374696f6e3d223022204e657449643d22313622202f3e" + "3c2f43726f7373526566496e666f3e3c53696d706c655479706520547970653d22496e7422202f3e3c41636365737320537562436c6173733d2253696d706c65" + "416363657373223e3c53696d706c6541636365737320547970653d22496e74222052616e67653d224d656d6f7279222057696474683d22576f72642220427974" + "654e756d6265723d2231363722204269744e756d6265723d223022202f3e3c2f4163636573733e3c2f4964656e743e3c2f4964656e74436f6e7461696e65723e" +) + +# IdentES_90000001 (Adler-32: 0xdf91b6bb, 1325 bytes) +_DICT_IDENTES_90000001 = bytes.fromhex( + "3c4964656e7445532076657273696f6e3d22312e30223e20203c436f7265537562747970653e46433c2f436f7265537562747970653e20203c4f626a65637454" + "797065496e666f3e436f6465426c6f636b446174613c2f4f626a65637454797065496e666f3e20203c436f6d70696c6554696d653e3633333730363335333536" + "343030303637313c2f436f6d70696c6554696d653e20203c4f6e6c7953796d626f6c69634163636573733e46616c73653c2f4f6e6c7953796d626f6c69634163" + "636573733e20203c486561646572446174612056657273696f6e3d22302e3122202f3e20203c497353797374656d3e747275653c2f497353797374656d3e3c2f" + "4964656e7445533e3c4964656e7445532076657273696f6e3d22312e30223e20203c436f7265537562747970653e44423c2f436f7265537562747970653e2020" + "3c4f626a65637454797065496e666f3e44617461426c6f636b446174613c2f4f626a65637454797065496e666f3e20203c436f6d70696c6554696d653e363333" + "3730363335333538313334353937353c2f436f6d70696c6554696d653e20203c44617461626c6f636b5479706520747970653d22536861726564444222206f66" + "747970653d22556e64656622206f666e756d6265723d223022202f3e20203c4f6e6c7953796d626f6c69634163636573733e46616c73653c2f4f6e6c7953796d" + "626f6c69634163636573733e20203c486561646572446174612056657273696f6e3d22302e3122202f3e20203c497353797374656d3e747275653c2f49735379" + "7374656d3e3c2f4964656e7445533e3c4964656e7445532076657273696f6e3d22312e30223e20203c436f7265537562747970653e44423c2f436f7265537562" + "747970653e20203c4f626a65637454797065496e666f3e44617461426c6f636b446174613c2f4f626a65637454797065496e666f3e20203c436f6d70696c6554" + "696d653e3633333730363335333538373132373734333c2f436f6d70696c6554696d653e20203c44617461626c6f636b5479706520747970653d224944426f66" + "53445422206f66747970653d2253445422206f666e756d6265723d223022206f666e616d653d224945435f434f554e54455222206f6654797065547970654775" + "69643d2237653933666333342d353339382d343862312d613331372d33386238636433376238653822206f665479706556657273696f6e477569643d22303037" + "65643763362d353162642d343035632d623765352d65316664336632356136633022202f3e20203c4f6e6c7953796d626f6c69634163636573733e547275653c" + "2f4f6e6c7953796d626f6c69634163636573733e20203c486561646572446174612056657273696f6e3d22302e3122202f3e20203c497353797374656d3e6661" + "6c73653c2f497353797374656d3e3c2f4964656e7445533e3c4964656e7445532076657273696f6e3d22312e30223e20203c436f7265537562747970653e4f42" + "2e50726f6772616d4379636c653c2f436f7265537562747970653e20203c4f626a65637454797065496e666f3e436f6465426c6f636b446174613c2f4f626a65" + "637454797065496e666f3e20203c436f6d70696c6554696d653e3633333730363335343432343534363531393c2f436f6d70696c6554696d653e20203c4f6e6c" + "7953796d626f6c69634163636573733e46616c73653c2f4f6e6c7953796d626f6c69634163636573733e20203c486561646572446174612056657273696f6e3d" + "22302e3122202f3e20203c497353797374656d3e747275653c2f497353797374656d3e3c2f4964656e7445533e" +) + +# IdentES_90000002 (Adler-32: 0x81d8db20, 1436 bytes) +_DICT_IDENTES_90000002 = bytes.fromhex( + "3c4964656e7445532076657273696f6e3d22312e30223e20203c436f7265537562747970653e46433c2f436f7265537562747970653e20203c4f626a65637454" + "797065496e666f3e436f6465426c6f636b446174613c2f4f626a65637454797065496e666f3e20203c436f6d70696c6554696d653e3633333730363335333536" + "343030303637313c2f436f6d70696c6554696d653e20203c4f6e6c7953796d626f6c69634163636573733e46616c73653c2f4f6e6c7953796d626f6c69634163" + "636573733e20203c496563436865636b3e46616c73653c2f496563436865636b3e20203c486561646572446174612056657273696f6e3d22302e3122202f3e20" + "203c497353797374656d3e747275653c2f497353797374656d3e3c2f4964656e7445533e3c4964656e7445532076657273696f6e3d22312e30223e20203c436f" + "7265537562747970653e44423c2f436f7265537562747970653e20203c4f626a65637454797065496e666f3e44617461426c6f636b446174613c2f4f626a6563" + "7454797065496e666f3e20203c436f6d70696c6554696d653e3633333730363335333538313334353937353c2f436f6d70696c6554696d653e20203c44617461" + "626c6f636b5479706520747970653d22536861726564444222206f66747970653d22556e64656622206f666e756d6265723d223022202f3e20203c4f6e6c7953" + "796d626f6c69634163636573733e46616c73653c2f4f6e6c7953796d626f6c69634163636573733e20203c496563436865636b3e46616c73653c2f4965634368" + "65636b3e20203c486561646572446174612056657273696f6e3d22302e3122202f3e20203c497353797374656d3e747275653c2f497353797374656d3e3c2f49" + "64656e7445533e3c4964656e7445532076657273696f6e3d22312e30223e20203c436f7265537562747970653e44423c2f436f7265537562747970653e20203c" + "4f626a65637454797065496e666f3e44617461426c6f636b446174613c2f4f626a65637454797065496e666f3e20203c436f6d70696c6554696d653e36333337" + "30363335333538373132373734333c2f436f6d70696c6554696d653e20203c44617461626c6f636b5479706520747970653d224944426f6653445422206f6674" + "7970653d2253445422206f666e756d6265723d223022206f666e616d653d224945435f434f554e54455222206f665479706554797065477569643d2237653933" + "666333342d353339382d343862312d613331372d33386238636433376238653822206f665479706556657273696f6e477569643d2230303765643763362d3531" + "62642d343035632d623765352d65316664336632356136633022202f3e20203c4f6e6c7953796d626f6c69634163636573733e547275653c2f4f6e6c7953796d" + "626f6c69634163636573733e20203c496563436865636b3e547275653c2f496563436865636b3e20203c486561646572446174612056657273696f6e3d22302e" + "3122202f3e20203c497353797374656d3e66616c73653c2f497353797374656d3e3c2f4964656e7445533e3c4964656e7445532076657273696f6e3d22312e30" + "223e20203c436f7265537562747970653e4f422e50726f6772616d4379636c653c2f436f7265537562747970653e20203c4f626a65637454797065496e666f3e" + "436f6465426c6f636b446174613c2f4f626a65637454797065496e666f3e20203c436f6d70696c6554696d653e3633333730363335343432343534363531393c" + "2f436f6d70696c6554696d653e20203c4f6e6c7953796d626f6c69634163636573733e46616c73653c2f4f6e6c7953796d626f6c69634163636573733e20203c" + "496563436865636b3e46616c73653c2f496563436865636b3e20203c486561646572446174612056657273696f6e3d22302e3122202f3e20203c497353797374" + "656d3e747275653c2f497353797374656d3e3c2f4964656e7445533e" +) + +# IdentES_98000001 (Adler-32: 0x5814b03b, 1273 bytes) +_DICT_IDENTES_98000001 = bytes.fromhex( + "3c4964656e7445532076657273696f6e3d22312e30223e3c436f7265537562747970653e46433c2f436f7265537562747970653e3c4f626a6563745479706549" + "6e666f3e436f6465426c6f636b446174613c2f4f626a65637454797065496e666f3e3c436f6d70696c6554696d653e3633333730363335333536343030303637" + "313c2f436f6d70696c6554696d653e3c4f6e6c7953796d626f6c69634163636573733e46616c73653c2f4f6e6c7953796d626f6c69634163636573733e3c4865" + "61646572446174612056657273696f6e3d22302e3122202f3e3c497353797374656d3e747275653c2f497353797374656d3e3c2f4964656e7445533e3c496465" + "6e7445532076657273696f6e3d22312e30223e3c436f7265537562747970653e44423c2f436f7265537562747970653e3c4f626a65637454797065496e666f3e" + "44617461426c6f636b446174613c2f4f626a65637454797065496e666f3e3c436f6d70696c6554696d653e3633333730363335333538313334353937353c2f43" + "6f6d70696c6554696d653e3c44617461626c6f636b5479706520747970653d22536861726564444222206f66747970653d22556e64656622206f666e756d6265" + "723d223022202f3e3c4f6e6c7953796d626f6c69634163636573733e46616c73653c2f4f6e6c7953796d626f6c69634163636573733e3c486561646572446174" + "612056657273696f6e3d22302e3122202f3e3c497353797374656d3e747275653c2f497353797374656d3e3c2f4964656e7445533e3c4964656e744553207665" + "7273696f6e3d22312e30223e3c436f7265537562747970653e44423c2f436f7265537562747970653e3c4f626a65637454797065496e666f3e44617461426c6f" + "636b446174613c2f4f626a65637454797065496e666f3e3c436f6d70696c6554696d653e3633333730363335333538373132373734333c2f436f6d70696c6554" + "696d653e3c44617461626c6f636b5479706520747970653d224944426f6653445422206f66747970653d2253445422206f666e756d6265723d223022206f666e" + "616d653d224945435f434f554e54455222206f665479706554797065477569643d2237653933666333342d353339382d343862312d613331372d333862386364" + "33376238653822206f665479706556657273696f6e477569643d2230303765643763362d353162642d343035632d623765352d65316664336632356136633022" + "202f3e3c4f6e6c7953796d626f6c69634163636573733e547275653c2f4f6e6c7953796d626f6c69634163636573733e3c486561646572446174612056657273" + "696f6e3d22302e3122202f3e3c497353797374656d3e66616c73653c2f497353797374656d3e3c2f4964656e7445533e3c4964656e7445532076657273696f6e" + "3d22312e30223e3c436f7265537562747970653e4f422e50726f6772616d4379636c653c2f436f7265537562747970653e3c4f626a65637454797065496e666f" + "3e436f6465426c6f636b446174613c2f4f626a65637454797065496e666f3e3c436f6d70696c6554696d653e3633333730363335343432343534363531393c2f" + "436f6d70696c6554696d653e3c4f6e6c7953796d626f6c69634163636573733e46616c73653c2f4f6e6c7953796d626f6c69634163636573733e3c4865616465" + "72446174612056657273696f6e3d22302e3122202f3e3c497353797374656d3e747275653c2f497353797374656d3e3c2f4964656e7445533e" +) + +# IntRefData_90000001 (Adler-32: 0xda4a88f4, 2003 bytes) +_DICT_INTREFDATA_90000001 = bytes.fromhex( + "3c4964656e74436f6e7461696e65723e3c4964656e74204e616d653d22456e64222053636f70653d224c6162656c222052656649443d2232223e3c4163636573" + "7320537562436c6173733d224c6162656c223e3c4964656e74202f3e3c2f4163636573733e3c2f4964656e743e3c4964656e74204e616d653d22436f6d70696c" + "65556e69742030222053636f70653d224e756d626572222052656649443d2233223e3c41636365737320537562436c6173733d22436f6d70696c65556e697449" + "64656e74223e3c436f6d70696c65556e69744964656e74202f3e3c2f4163636573733e3c2f4964656e743e3c4964656e74204e616d653d225265666572656e63" + "655f626c6f636b5f6e756d6265725f3031222053636f70653d22556e646566222052656649443d2234223e3c41636365737320537562436c6173733d22426c6f" + "636b496e74657266616365496e666f223e3c426c6f636b496e74657266616365205265664e616d653d225265666572656e63655f626c6f636b5f6e756d626572" + "5f303122204e756d6265723d2231222043616c6c6565547970653d22426c6f636b5f46432220547970654f706572616e6452656649643d223830222050617261" + "6d4d6f64696669636174696f6e54533d2231323836363033373536313234313331373722202f3e3c2f4163636573733e3c2f4964656e743e3c2f4964656e7443" + "6f6e7461696e65723e3c4964656e74204e616d653d225461675f31222053636f70653d22476c6f62616c222052656649443d2233223e3c53696d706c65547970" + "6520547970653d22426f6f6c22202f3e3c41636365737320537562436c6173733d2253696d706c65416363657373223e20203c53696d706c6541636365737320" + "547970653d22426f6f6c222052616e67653d22496e707574222057696474683d224269742220427974654e756d6265723d223122204269744e756d6265723d22" + "3022202f3e3c2f4163636573733e3c2f4964656e743e3c4964656e74204e616d653d225461675f35222053636f70653d22476c6f62616c222052656649443d22" + "37223e3c53696d706c655479706520547970653d22496e7422202f3e3c41636365737320537562436c6173733d2253696d706c65416363657373223e20203c53" + "696d706c6541636365737320547970653d22496e74222052616e67653d22496e707574222057696474683d22576f72642220427974654e756d6265723d223022" + "204269744e756d6265723d223022202f3e3c2f4163636573733e3c2f4964656e743e3c4964656e74204e616d653d225461675f3132222053636f70653d22476c" + "6f62616c222052656649443d223133223e3c53696d706c655479706520547970653d2244496e7422202f3e3c41636365737320537562436c6173733d2253696d" + "706c65416363657373223e20203c53696d706c6541636365737320547970653d2244496e74222052616e67653d22496e707574222057696474683d2244576f72" + "642220427974654e756d6265723d223122204269744e756d6265723d223022202f3e3c2f4163636573733e3c2f4964656e743e3c4964656e74204e616d653d22" + "5461675f3332222053636f70653d22476c6f62616c222052656649443d223334223e3c53696d706c655479706520547970653d225265616c22202f3e3c416363" + "65737320537562436c6173733d2253696d706c65416363657373223e20203c53696d706c6541636365737320547970653d225265616c222052616e67653d224d" + "656d6f7279222057696474683d2244576f72642220427974654e756d6265723d2235363722204269744e756d6265723d223022202f3e3c2f4163636573733e3c" + "2f4964656e743e3c4964656e74204e616d653d225265666572656e63655f626c6f636b5f6e756d6265725f3931222053636f70653d22476c6f62616c22205265" + "6649443d2236223e3c53696d706c655479706520547970653d22426c6f636b5f464322202f3e3c41636365737320537562436c6173733d224643426c6f636b22" + "3e20203c426c6f636b204e616d653d225265666572656e63655f626c6f636b5f6e756d6265725f3931222053636f70653d22476c6f62616c2220547970653d22" + "426c6f636b5f464322204e756d6265723d22393122202f3e3c2f4163636573733e3c2f4964656e743e3c4964656e74204e616d653d2254505f3161222053636f" + "70653d22476c6f62616c222052656649443d223739223e3c53696d706c655479706520547970653d22426c6f636b5f444222202f3e3c41636365737320537562" + "436c6173733d224f706572616e64223e20203c426c6f636b204e616d653d2254505f3161222053636f70653d22476c6f62616c2220547970653d22426c6f636b" + "5f444222204e756d6265723d22333722202f3e3c2f4163636573733e3c2f4964656e743e3c4964656e74204e616d653d2254233273222053636f70653d22476c" + "6f62616c222052656649443d223830223e3c53696d706c655479706520547970653d2254696d6522202f3e3c41636365737320537562436c6173733d22436f6e" + "7374616e74223e20203c436f6e7374616e74204e616d653d2254233273222053636f70653d22476c6f62616c2220547970653d2254696d652220466f726d6174" + "3d2254696d65222057696474683d2244576f7264222056616c75653d224430303730303030303030303030303022202f3e3c2f4163636573733e3c2f4964656e" + "743e3c2f4964656e74436f6e7461696e65723e" +) + +# IntRefData_98000001 (Adler-32: 0xb0155ff8, 1018 bytes) +_DICT_INTREFDATA_98000001 = bytes.fromhex( + "3c4d756c7469496e7374616e636541636365737320436c61737369634162734f66667365743d222052657461696e4162734f66667365743d2220566f6c617469" + "6c654162734f66667365743d223c4c6162656c3e547970654f626a65637449643d2220547970655249643d223c4642426c6f636b3c496e737472756374696f6e" + "3c426c6f636b496e74657266616365496e666f204f726967696e616c506172744e616d653d223c4964656e74436f6e7461696e65723e3c4643426c6f636b204c" + "6962726172794f626a49643d22204e65656473496e7374616e63653d223c4175664442426c6f636b204372656174696f6e49643d222056657273696f6e49643d" + "223c4465704442426c6f636b2054656d706c6174655265666572656e63653d2220506172616d657465724d6f64696669656454533d223c506172616d65746572" + "204172726179547970653d223c496e7465726661636541636365737320496e746572666163654d6f64696669656454533d223c53696d706c654163636573733c" + "436f6e7374616e743c436f6d70696c65556e69744964656e743e205374727563747572654d6f64696669656454533d2220426c6f636b547970653d2220536563" + "74696f6e3d2220417265613d2220496e74657266616365466c6167733d2253375f56697369626c6522496e74657266616365466c6167733d224d616e6461746f" + "72792c2053375f56697369626c65223c476c6f62616c4163636573732052616e67653d222053696d706c654163636573734d6f6469666965723d2220466f726d" + "61743d222056616c75653d2220466f726d6174466c6167733d222044624e756d6265723d223c4163636573734f626a656374202f3e3c2f4163636573733e3c2f" + "4964656e743e3c4964656e74204e616d653d22202f3e3c43726f7373526566496e666f3e3c4163636573733e3c4d666255445420426c6f636b4e756d6265723d" + "22204162734f66667365743d22204163636573734d6f6469666965723d2220547970654e616d653d22205249643d22202f3e3c585265664974656d2053636f70" + "653d224e756d62657222476c6f62616c224c6f6b616c22436f6e7374616e74222052656649643d222056657273696f6e3d22312e302220547970653d22205549" + "643d22312055736167653d2252656164224e6f6e65224d756c7469696e7374616e63652220496e737472756374696f6e3d223022204e657449643d2231205852" + "656648696464656e3d2246616c7365222055736167653d22577269746522496e742255496e74225265616c225553496e7422576f72642244496e7422426f6f6c" + "2253496e7422427974652254696d65225544496e742244576f726422436861722244544c224c5265616c22537472696e672274727565223d223e" +) + +# IntfDescTag_90000001 (Adler-32: 0xce9b821b, 1178 bytes) +_DICT_INTFDESCTAG_90000001 = bytes.fromhex( + "3c4964656e74436f6e7461696e65723e20203c4964656e74204e616d653d225461675f31222053636f70653d22476c6f62616c22204c49443d2239223e3c5369" + "6d706c65547970653e426f6f6c3c2f53696d706c65547970653e3c41636365737320537562436c6173733d2253696d706c65416363657373223e20203c53696d" + "706c65416363657373204269744e756d6265723d22312220427974654e756d6265723d2230222057696474683d22426974222052616e67653d22496e70757422" + "202f3e3c2f4163636573733e20203c2f4964656e743e20203c4964656e74204e616d653d225461675f32222053636f70653d22476c6f62616c22204c69643d22" + "3132223e3c53696d706c65547970653e496e743c2f53696d706c65547970653e3c41636365737320537562436c6173733d2253696d706c65416363657373223e" + "20203c53696d706c6541636365737320427974654e756d6265723d2231222057696474683d22576f7264222052616e67653d22496e70757422202f3e3c2f4163" + "636573733e20203c2f4964656e743e20203c4964656e74204e616d653d225461675f33222053636f70653d22476c6f62616c22204c69643d223233223e3c5369" + "6d706c65547970653e44496e743c2f53696d706c65547970653e3c41636365737320537562436c6173733d2253696d706c65416363657373223e20203c53696d" + "706c6541636365737320427974654e756d6265723d2232222057696474683d2244576f7264222052616e67653d22496e70757422202f3e3c2f4163636573733e" + "20203c2f4964656e743e20203c4964656e74204e616d653d225461675f34222053636f70653d22476c6f62616c22204c69643d223334223e3c53696d706c6554" + "7970653e5265616c3c2f53696d706c65547970653e3c41636365737320537562436c6173733d2253696d706c65416363657373223e20203c53696d706c654163" + "6365737320427974654e756d6265723d2233222057696474683d2244576f7264222052616e67653d22496e70757422202f3e3c2f4163636573733e20203c2f49" + "64656e743e20203c4964656e74204e616d653d225461675f35222053636f70653d22476c6f62616c22204c69643d223435223e3c53696d706c65547970653e42" + "6f6f6c3c2f53696d706c65547970653e3c41636365737320537562436c6173733d2253696d706c65416363657373223e20203c53696d706c6541636365737320" + "4269744e756d6265723d22342220427974654e756d6265723d2234222057696474683d22426974222052616e67653d224f757470757422202f3e3c2f41636365" + "73733e20203c2f4964656e743e20203c4964656e74204e616d653d225461675f36222053636f70653d22476c6f62616c22204c69643d223536223e3c53696d70" + "6c65547970653e44496e743c2f53696d706c65547970653e3c41636365737320537562436c6173733d2253696d706c65416363657373223e20203c53696d706c" + "6541636365737320427974654e756d6265723d2235222057696474683d2244576f7264222052616e67653d224d656d6f727922202f3e3c2f4163636573733e20" + "203c2f4964656e743e3c2f4964656e74436f6e7461696e65723e" +) + +# IntfDesc_90000001 (Adler-32: 0x4b8416f0, 4942 bytes) +_DICT_INTFDESC_90000001 = bytes.fromhex( + "3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d227574662d3136223f3e3c426c6f636b496e746572666163652056657273696f6e3d22" + "312e30223e20203c536f757263652056657273696f6e3d22312e30223e3c53656374696f6e204e616d653d22537461746963223e20203c4c696e65204c49643d" + "223922204e616d653d225354415254222053796d626f6c3d2254696d6522204c6962726172792e53697a653d22333222204c6962726172792e4c61796f75742e" + "427974654f66667365743d2230222052656d616e656e63653d22566f6c6174696c6522205249643d2230783230303030306222202f3e20203c4c696e65204c49" + "643d22313022204e616d653d22505245534554222053796d626f6c3d2254696d6522204c6962726172792e53697a653d22333222204c6962726172792e4c6179" + "6f75742e427974654f66667365743d2234222052656d616e656e63653d22566f6c6174696c6522205249643d2230783230303030306222202f3e20203c4c696e" + "65204c49643d22313122204e616d653d22454c4150534544222053796d626f6c3d2254696d6522204c6962726172792e53697a653d22333222204c6962726172" + "792e4c61796f75742e427974654f66667365743d2238222052656d616e656e63653d22566f6c6174696c6522205249643d2230783230303030306222202f3e20" + "203c4c696e65204c49643d22313222204e616d653d2252554e4e494e47222053796d626f6c3d22426f6f6c22204c6962726172792e53697a653d223122204c69" + "62726172792e4c61796f75742e4269744f66667365743d2231322e30222052656d616e656e63653d22566f6c6174696c6522205249643d223078323030303030" + "3122202f3e20203c4c696e65204c49643d22313322204e616d653d22494e222053796d626f6c3d22426f6f6c22204c6962726172792e53697a653d223122204c" + "6962726172792e4c61796f75742e4269744f66667365743d2231322e31222052656d616e656e63653d22566f6c6174696c6522205249643d2230783230303030" + "303122202f3e20203c4c696e65204c49643d22313422204e616d653d2251222053796d626f6c3d22426f6f6c22204c6962726172792e53697a653d223122204c" + "6962726172792e4c61796f75742e4269744f66667365743d2231322e32222052656d616e656e63653d22566f6c6174696c6522205249643d2230783230303030" + "303122202f3e20203c4c696e65204c49643d22313522204e616d653d22504144222053796d626f6c3d224279746522204c6962726172792e53697a653d223822" + "204c6962726172792e4c61796f75742e427974654f66667365743d223133222052656d616e656e63653d22566f6c6174696c6522205249643d22307832303030" + "30303222202f3e20203c4c696e65204c49643d22313622204e616d653d225041445f31222053796d626f6c3d224279746522204c6962726172792e53697a653d" + "223822204c6962726172792e4c61796f75742e427974654f66667365743d223134222052656d616e656e63653d22566f6c6174696c6522205249643d22307832" + "30303030303222202f3e20203c4c696e65204c49643d22313722204e616d653d225041445f32222053796d626f6c3d224279746522204c6962726172792e5369" + "7a653d223822204c6962726172792e4c61796f75742e427974654f66667365743d223135222052656d616e656e63653d22566f6c6174696c6522205249643d22" + "30783230303030303222202f3e3c2f53656374696f6e3e20203c2f536f757263653e20203c537461727456616c7565733e3c64696374696f6e6172795f656e74" + "726965733e3c2f64696374696f6e6172795f656e74726965733e20203c2f537461727456616c7565733e3c2f426c6f636b496e746572666163653e3c3f786d6c" + "2076657273696f6e3d22312e302220656e636f64696e673d227574662d3136223f3e3c426c6f636b496e746572666163652056657273696f6e3d22312e30223e" + "20203c536f757263652056657273696f6e3d22312e3022204e657874467265654c49643d2231302220436c617373696353697a653d2230222052657461696e53" + "697a653d22302220566f6c6174696c6553697a653d223022204c6962726172792e4c537461636b42697473697a653d2230223e3c53656374696f6e204e616d65" + "3d22496e70757422202f3e3c53656374696f6e204e616d653d224f757470757422202f3e3c53656374696f6e204e616d653d22496e4f757422202f3e3c536563" + "74696f6e204e616d653d2254656d7022202f3e3c53656374696f6e204e616d653d2252657475726e223e20203c4c696e65204e616d653d225265745f56616c22" + "2053796d626f6c3d22566f696422204c49643d223922204163636573736962696c6974793d225075626c6963222052656d616e656e63653d22566f6c6174696c" + "6522204c6962726172792e53697a653d223022204c6962726172792e4c61796f75742e427974654f66667365743d223022205249643d22307832303030303030" + "22202f3e3c2f53656374696f6e3e20203c2f536f757263653e3c2f426c6f636b496e746572666163653e3c3f786d6c2076657273696f6e3d22312e302220656e" + "636f64696e673d227574662d3136223f3e3c426c6f636b496e746572666163652056657273696f6e3d22312e30223e20203c536f757263652056657273696f6e" + "3d22312e30222053797374656d3d22547275652220436c617373696353697a653d2230222052657461696e53697a653d22302220566f6c6174696c6553697a65" + "3d223022204e657874467265654c49643d22313122204c6962726172792e4c537461636b42697473697a653d2230223e3c53656374696f6e204e616d653d2254" + "656d70223e20203c4c696e65204c49643d223922204e616d653d2266697273745f7363616e22204163636573736962696c6974793d225075626c696322205265" + "6d616e656e63653d22566f6c6174696c65222053796d626f6c3d22426f6f6c22205249643d2230783230303030303122202f3e20203c4c696e65204c49643d22" + "313022204e616d653d2272656d616e656e636522204163636573736962696c6974793d225075626c6963222052656d616e656e63653d22566f6c6174696c6522" + "2053796d626f6c3d22426f6f6c22205249643d2230783230303030303122202f3e3c2f53656374696f6e3e20203c2f536f757263653e3c2f426c6f636b496e74" + "6572666163653e3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d227574662d3136223f3e3c426c6f636b496e74657266616365205665" + "7273696f6e3d22312e30223e20203c536f757263652056657273696f6e3d22312e302220436c617373696353697a653d2232373638222052657461696e53697a" + "653d22302220566f6c6174696c6553697a653d22333222204e657874467265654c49643d2231323822204c6962726172792e4c537461636b42697473697a653d" + "2230223e3c53656374696f6e204e616d653d22537461746963223e20203c4c696e65204c49643d223922204e616d653d22737461745f31222041636365737369" + "62696c6974793d225075626c6963222052656d616e656e63653d22566f6c6174696c65222053796d626f6c3d22496e7422204c6962726172792e53697a653d22" + "313622204c6962726172792e4c61796f75742e427974654f66667365743d22302220496e697469616c3d22313222205249643d2230783230303030303522202f" + "3e20203c4c696e65204c49643d22313022204e616d653d22737461745f3222204163636573736962696c6974793d225075626c6963222052656d616e656e6365" + "3d22566f6c6174696c65222053796d626f6c3d225265616c22204c6962726172792e53697a653d22333222204c6962726172792e4c61796f75742e427974654f" + "66667365743d22322220496e697469616c3d22312e3522205249643d2230783230303030303822202f3e20203c4c696e65204c49643d22313122204e616d653d" + "22737461745f3322204163636573736962696c6974793d225075626c6963222052656d616e656e63653d22566f6c6174696c65222053796d626f6c3d22426f6f" + "6c22204c6962726172792e53697a653d223122204c6962726172792e4c61796f75742e4269744f66667365743d22362e302220496e697469616c3d2222205249" + "643d2230783230303030303122202f3e20203c4c696e65204c49643d22313522204e616d653d22737461745f3422204163636573736962696c6974793d225075" + "626c6963222052656d616e656e63653d22566f6c6174696c65222053796d626f6c3d2254696d6522204c6962726172792e53697a653d22333222204c69627261" + "72792e4c61796f75742e427974654f66667365743d22313822205249643d2230783230303030306222202f3e20203c4c696e65204c49643d22313922204e616d" + "653d22737461745f3522204163636573736962696c6974793d225075626c6963222052656d616e656e63653d22566f6c6174696c65222053796d626f6c3d2257" + "6f726422204c6962726172792e53697a653d22313622204c6962726172792e4c61796f75742e427974654f66667365743d2233302220496e697469616c3d2231" + "3222205249643d2230783230303030303422202f3e3c2f53656374696f6e3e20203c2f536f757263653e20203c537461727456616c7565733e3c64696374696f" + "6e6172795f656e74726965733e3c2f64696374696f6e6172795f656e74726965733e20203c2f537461727456616c7565733e3c2f426c6f636b496e7465726661" + "63653e3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d227574662d3136223f3e3c426c6f636b496e746572666163652056657273696f" + "6e3d22312e30223e20203c536f757263652056657273696f6e3d22312e30223e3c53656374696f6e204e616d653d22537461746963223e20203c4c696e65204c" + "49643d223922204e616d653d22434f554e545f5550222053796d626f6c3d22426f6f6c22204c6962726172792e53697a653d223122204c6962726172792e4c61" + "796f75742e4269744f66667365743d22302e30222052656d616e656e63653d22566f6c6174696c6522205249643d2230783230303030303122202f3e20203c4c" + "696e65204c49643d22313022204e616d653d22434f554e545f444f574e222053796d626f6c3d22426f6f6c22204c6962726172792e53697a653d223122204c69" + "62726172792e4c61796f75742e4269744f66667365743d22302e31222052656d616e656e63653d22566f6c6174696c6522205249643d22307832303030303031" + "22202f3e20203c4c696e65204c49643d22313122204e616d653d225245534554222053796d626f6c3d22426f6f6c22204c6962726172792e53697a653d223122" + "204c6962726172792e4c61796f75742e4269744f66667365743d22302e32222052656d616e656e63653d22566f6c6174696c6522205249643d22307832303030" + "30303122202f3e20203c4c696e65204c49643d22313222204e616d653d224c4f4144222053796d626f6c3d22426f6f6c22204c6962726172792e53697a653d22" + "3122204c6962726172792e4c61796f75742e4269744f66667365743d22302e33222052656d616e656e63653d22566f6c6174696c6522205249643d2230783230" + "303030303122202f3e20203c4c696e65204c49643d22313322204e616d653d22515f5550222053796d626f6c3d22426f6f6c22204c6962726172792e53697a65" + "3d223122204c6962726172792e4c61796f75742e4269744f66667365743d22302e34222052656d616e656e63653d22566f6c6174696c6522205249643d223078" + "3230303030303122202f3e20203c4c696e65204c49643d22313422204e616d653d22515f444f574e222053796d626f6c3d22426f6f6c22204c6962726172792e" + "53697a653d223122204c6962726172792e4c61796f75742e4269744f66667365743d22302e35222052656d616e656e63653d22566f6c6174696c652220524964" + "3d2230783230303030303122202f3e20203c4c696e65204c49643d22313522204e616d653d22504144222053796d626f6c3d224279746522204c696272617279" + "2e53697a653d223822204c6962726172792e4c61796f75742e427974654f66667365743d2231222052656d616e656e63653d22566f6c6174696c652220524964" + "3d2230783230303030303222202f3e20203c4c696e65204c49643d22313622204e616d653d225052455345545f56414c5545222053796d626f6c3d22496e7422" + "204c6962726172792e53697a653d22313622204c6962726172792e4c61796f75742e427974654f66667365743d2232222052656d616e656e63653d22566f6c61" + "74696c6522205249643d2230783230303030303522202f3e20203c4c696e65204c49643d22313722204e616d653d22434f554e545f56414c5545222053796d62" + "6f6c3d22496e7422204c6962726172792e53697a653d22313622204c6962726172792e4c61796f75742e427974654f66667365743d2234222052656d616e656e" + "63653d22566f6c6174696c6522205249643d2230783230303030303522202f3e3c2f53656374696f6e3e20203c2f536f757263653e20203c537461727456616c" + "7565733e3c64696374696f6e6172795f656e74726965733e3c2f64696374696f6e6172795f656e74726965733e20203c2f537461727456616c7565733e3c2f42" + "6c6f636b496e746572666163653e" +) + +# LineComm_90000001 (Adler-32: 0x79b2bda3, 534 bytes) +_DICT_LINECOMM_90000001 = bytes.fromhex( + "3c436f6d6d656e7444696374696f6e6172793e3c496e746572666163654c696e65436f6d6d656e74733e3c436f6d6d656e74205549643d223122204c696e6549" + "643d2233223e3c44696374456e747279204c616e67756167653d22656e2d5553223e7468697320697320612074686520696e20746f20616e2063616e20626520" + "666f7220617265206e6574776f726b20616e643c2f44696374456e7472793e203c2f436f6d6d656e743e3c436f6d6d656e74205549643d223022204c696e6549" + "643d2232223e3c44696374456e747279204c616e67756167653d22656e2d5553223e64696573206973742065696e20646572206469652064617320696d206e61" + "63682065696e656e206b616e6e207365696e2066c3bc722073696e64204e65747a7765726b20756e643c2f44696374456e7472793e203c2f436f6d6d656e743e" + "3c2f496e746572666163654c696e65436f6d6d656e74733e3c426f64794c696e65436f6d6d656e7473202f3e203c2f436f6d6d656e7444696374696f6e617279" + "3e3c436f6d6d656e7444696374696f6e6172793e3c496e746572666163654c696e65436f6d6d656e7473202f3e3c426f64794c696e65436f6d6d656e7473202f" + "3e3c2f436f6d6d656e7444696374696f6e6172793e3c436f6d6d656e7444696374696f6e6172793e3c496e746572666163654c696e65436f6d6d656e7473202f" + "3e203c2f436f6d6d656e7444696374696f6e6172793e" +) + +# LineComm_98000001 (Adler-32: 0x3c55436a, 206 bytes) +_DICT_LINECOMM_98000001 = bytes.fromhex( + "5549643d222052656649443d223c506172743e35313a35323a35333a35343a35353c426f64794c696e65436f6d6d656e74733e3c436f6d6d656e744469637469" + "6f6e6172793e3c496e746572666163654c696e65436f6d6d656e74733c506172742056657273696f6e3d22322e30222049443d22204b696e643d222050617265" + "6e7449443d223c436f6d6d656e74436f6d6d656e7449443d2220506174683d222066722d465269742d49543c44696374456e747279204c616e67756167653d22" + "64652d444522656e2d55533d223e" +) + +# NWC_90000001 (Adler-32: 0xab6fa31e, 463 bytes) +_DICT_NWC_90000001 = bytes.fromhex( + "3c436f6d6d656e7444696374696f6e6172793e3c4e6574776f726b436f6d6d656e74733e3c436f6d6d656e742052656649443d2232223e3c44696374456e7472" + "79204c616e67756167653d22656e2d5553223e3c2f44696374456e7472793e3c2f436f6d6d656e743e3c436f6d6d656e742052656649443d223136223e3c4469" + "6374456e747279204c616e67756167653d22656e2d5553223e7468697320697320612074686520696e20746f20616e2063616e20626520666f7220617265206e" + "6574776f726b20616e643c2f44696374456e7472793e3c2f436f6d6d656e743e3c436f6d6d656e742052656649443d223236223e3c44696374456e747279204c" + "616e67756167653d22656e2d5553223e64696573206973742065696e20646572206469652064617320696d206e6163682065696e656e206b616e6e207365696e" + "2066c3bc722073696e64204e65747a7765726b20756e643c2f44696374456e7472793e3c2f436f6d6d656e743e3c2f4e6574776f726b436f6d6d656e74733e3c" + "2f436f6d6d656e7444696374696f6e6172793e3c436f6d6d656e7444696374696f6e6172793e20203c4e6574776f726b436f6d6d656e7473202f3e3c2f436f6d" + "6d656e7444696374696f6e6172793e" +) + +# NWC_98000001 (Adler-32: 0xc5d26ac3, 301 bytes) +_DICT_NWC_98000001 = bytes.fromhex( + "7468697320697320612074686520696e20746f20616e2063616e20626520666f7220617265206e6574776f726b20616e642064696573206973742065696e2064" + "6572206469652064617320696d206e6163682065696e656e206b616e6e207365696e2066c3bc722073696e64204e65747a7765726b20756e643c436f6d6d656e" + "7444696374696f6e6172793e3c4e6574776f726b436f6d6d656e74733e3c436f6d6d656e742052656649443d2232223e3c44696374456e747279204c616e6775" + "6167653d22656e2d55532264652d44452269742d49542266722d4652223e3c2f44696374456e7472793e3c2f436f6d6d656e743e3c2f4e6574776f726b436f6d" + "6d656e74733e3c2f436f6d6d656e7444696374696f6e6172793e3c4e6574776f726b436f6d6d656e7473202f3e" +) + +# NWT_90000001 (Adler-32: 0xfd69ac74, 503 bytes) +_DICT_NWT_90000001 = bytes.fromhex( + "3c436f6d6d656e7444696374696f6e6172793e3c4e6574776f726b5469746c65733e3c2f436f6d6d656e743e202020203c436f6d6d656e742052656649443d22" + "30223e20203c44696374456e747279204c616e67756167653d22656e2d5553223e20224d61696e2050726f6772616d20537765657020284379636c6529223c2f" + "44696374456e7472793e3c2f436f6d6d656e743e3c436f6d6d656e742052656649443d2232223e3c44696374456e747279204c616e67756167653d22656e2d55" + "53223e3c2f44696374456e7472793e3c2f436f6d6d656e743e3c436f6d6d656e742052656649443d223136223e3c44696374456e747279204c616e6775616765" + "3d22656e2d5553223e7468697320697320612074686520696e20746f20616e2063616e20626520666f7220617265206e6574776f726b20616e643c2f44696374" + "456e7472793e3c2f436f6d6d656e743e3c436f6d6d656e742052656649443d223236223e3c44696374456e747279204c616e67756167653d22656e2d5553223e" + "64696573206973742065696e20646572206469652064617320696d206e6163682065696e656e206b616e6e207365696e2066c3bc722073696e64204e65747a77" + "65726b20756e643c2f44696374456e7472793e3c2f4e6574776f726b5469746c65733e3c2f436f6d6d656e7444696374696f6e6172793e" +) + +# NWT_98000001 (Adler-32: 0x845fc605, 571 bytes) +_DICT_NWT_98000001 = bytes.fromhex( + "3c436f6d6d656e7444696374696f6e6172793e3c4e6574776f726b5469746c65733e3c436f6d6d656e743c44696374456e7472792052656649443d22204c616e" + "67756167653d223d223e3c436f6d6d656e7444696374696f6e6172793e3c4e6574776f726b5469746c65733e3c2f436f6d6d656e743e3c436f6d6d656e742052" + "656649443d2230223e3c44696374456e747279204c616e67756167653d2264652d4445223e20224d61696e2050726f6772616d20537765657020284379636c65" + "29223c2f44696374456e7472793e3c2f436f6d6d656e743e3c436f6d6d656e742052656649443d2232223e3c44696374456e747279204c616e67756167653d22" + "66722d4652223e3c2f44696374456e7472793e3c2f436f6d6d656e743e3c436f6d6d656e742052656649443d223136223e3c44696374456e747279204c616e67" + "756167653d2269742d4954223e7468697320697320612074686520696e20746f20616e2063616e20626520666f7220617265206e6574776f726b20616e643c2f" + "44696374456e7472793e3c2f436f6d6d656e743e3c436f6d6d656e742052656649443d223236223e3c44696374456e747279204c616e67756167653d22656e2d" + "5553223e64696573206973742065696e20646572206469652064617320696d206e6163682065696e656e206b616e6e207365696e2066c3bc722073696e64204e" + "65747a7765726b20756e643c2f44696374456e7472793e3c2f4e6574776f726b5469746c65733e3c2f436f6d6d656e7444696374696f6e6172793e" +) + +# TagLineComm_90000001 (Adler-32: 0xe2729ea1, 455 bytes) +_DICT_TAGLINECOMM_90000001 = bytes.fromhex( + "3c436f6d6d656e7444696374696f6e6172793e3c5461674c696e65436f6d6d656e74733e3c436f6d6d656e742052656649443d2231223e3c44696374456e7472" + "79204c616e67756167653d22656e2d555322202f3e203c2f436f6d6d656e743e3c436f6d6d656e742052656649443d223131223e3c44696374456e747279204c" + "616e67756167653d22656e2d5553223e7468697320697320612074686520696e20746f20616e2063616e20626520666f7220617265206e6574776f726b20616e" + "643c2f44696374456e7472793e3c2f436f6d6d656e743e3c436f6d6d656e742052656649443d22313131223e3c44696374456e747279204c616e67756167653d" + "22656e2d5553223e64696573206973742065696e20646572206469652064617320696d206e6163682065696e656e206b616e6e207365696e2066c3bc72207369" + "6e64204e65747a7765726b20756e643c2f44696374456e7472793e3c2f436f6d6d656e743e3c2f5461674c696e65436f6d6d656e74733e3c2f436f6d6d656e74" + "44696374696f6e6172793e3c436f6d6d656e7444696374696f6e6172793e20203c5461674c696e65436f6d6d656e7473202f3e3c2f436f6d6d656e7444696374" + "696f6e6172793e" +) + + +ZLIB_DICTIONARIES: dict[int, bytes] = { + 0xefaeae49: _DICT_BODYDESC_90000001, + 0x1398a37f: _DICT_COMPILERSETTINGS_90000001, + 0x1bac39f0: _DICT_DEBUGINFO_90000001, + 0x66052b13: _DICT_DEBUGINFO_INTFDESC_98000001, + 0x9b6a3a92: _DICT_EXTREFDATA_90000001, + 0xdf91b6bb: _DICT_IDENTES_90000001, + 0x81d8db20: _DICT_IDENTES_90000002, + 0x5814b03b: _DICT_IDENTES_98000001, + 0xda4a88f4: _DICT_INTREFDATA_90000001, + 0xb0155ff8: _DICT_INTREFDATA_98000001, + 0xce9b821b: _DICT_INTFDESCTAG_90000001, + 0x4b8416f0: _DICT_INTFDESC_90000001, + 0x79b2bda3: _DICT_LINECOMM_90000001, + 0x3c55436a: _DICT_LINECOMM_98000001, + 0xab6fa31e: _DICT_NWC_90000001, + 0xc5d26ac3: _DICT_NWC_98000001, + 0xfd69ac74: _DICT_NWT_90000001, + 0x845fc605: _DICT_NWT_98000001, + 0xe2729ea1: _DICT_TAGLINECOMM_90000001, +} + +ZLIB_DICT_NAMES: dict[int, str] = { + 0xefaeae49: "BodyDesc (90000001)", + 0x1398a37f: "CompilerSettings (90000001)", + 0x1bac39f0: "DebugInfo (90000001)", + 0x66052b13: "DebugInfo_IntfDesc (98000001)", + 0x9b6a3a92: "ExtRefData (90000001)", + 0xdf91b6bb: "IdentES (90000001)", + 0x81d8db20: "IdentES (90000002)", + 0x5814b03b: "IdentES (98000001)", + 0xda4a88f4: "IntRefData (90000001)", + 0xb0155ff8: "IntRefData (98000001)", + 0xce9b821b: "IntfDescTag (90000001)", + 0x4b8416f0: "IntfDesc (90000001)", + 0x79b2bda3: "LineComm (90000001)", + 0x3c55436a: "LineComm (98000001)", + 0xab6fa31e: "NWC (90000001)", + 0xc5d26ac3: "NWC (98000001)", + 0xfd69ac74: "NWT (90000001)", + 0x845fc605: "NWT (98000001)", + 0xe2729ea1: "TagLineComm (90000001)", +} diff --git a/tests/test_blob_decompressor.py b/tests/test_blob_decompressor.py new file mode 100644 index 00000000..efc90ab6 --- /dev/null +++ b/tests/test_blob_decompressor.py @@ -0,0 +1,71 @@ +"""Tests for the S7CommPlus blob decompressor.""" + +import zlib + +import pytest + +from s7commplus.blob_decompressor import decompress_blob, find_and_decompress +from s7commplus.zlib_dicts import ZLIB_DICTIONARIES, ZLIB_DICT_NAMES + + +def test_all_dictionaries_have_correct_adler32(): + for adler, data in ZLIB_DICTIONARIES.items(): + actual = zlib.adler32(data) & 0xFFFFFFFF + assert actual == adler, f"Adler-32 mismatch for {ZLIB_DICT_NAMES.get(adler, '?')}: {actual:#x} != {adler:#x}" + + +def test_all_dictionaries_have_names(): + for adler in ZLIB_DICTIONARIES: + assert adler in ZLIB_DICT_NAMES, f"Missing name for dictionary {adler:#x}" + + +def test_decompress_standard_blob(): + original = b"" + compressed = zlib.compress(original) + result = decompress_blob(compressed) + assert result == original.decode("utf-8") + + +def test_decompress_with_preset_dict(): + original = b"" + intfdesc_dict = ZLIB_DICTIONARIES[0xCE9B821B] + + # Compress with raw deflate (wbits=-15) + preset dictionary + cobj = zlib.compressobj(level=6, wbits=-15, zdict=intfdesc_dict) + raw_deflate = cobj.compress(original) + cobj.flush() + # Build the zlib header: CMF=0x78, FLG with FDICT set, then 4-byte dict Adler-32 + header = b"\x78\x7d" + (0xCE9B821B).to_bytes(4, "big") + blob = header + raw_deflate + + result = decompress_blob(blob) + assert result == original.decode("utf-8") + + +def test_decompress_unknown_dict_raises(): + blob = b"\x78\x7d\xDE\xAD\xBE\xEF" + b"\x00" * 10 + with pytest.raises(ValueError, match="Unknown zlib preset dictionary"): + decompress_blob(blob) + + +def test_decompress_with_offset(): + original = b"data" + compressed = zlib.compress(original) + # 4-byte version prefix + blob = b"\x00\x00\x00\x01" + compressed + result = decompress_blob(blob, offset=4) + assert result == original.decode("utf-8") + + +def test_find_and_decompress_standard(): + original = b"hello" + compressed = zlib.compress(original) + # Embed in some prefix junk + data = b"\x00\x01\x02" + compressed + result = find_and_decompress(data) + assert result is not None + assert result == original.decode("utf-8") + + +def test_find_and_decompress_no_stream(): + result = find_and_decompress(b"\x00\x01\x02\x03\x04\x05") + assert result is None From 9a0028026cd7c2a44228945e5e371054d1f7a861 Mon Sep 17 00:00:00 2001 From: Gijs Molenaar Date: Thu, 16 Jul 2026 21:28:53 +0200 Subject: [PATCH 2/6] refactor: store zlib dictionaries as readable UTF-8 strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The dictionaries are 100% printable XML template fragments (with the occasional German ü). Storing them as hex blobs made them unreadable. Now stored as Python string literals, encoded to bytes at import time. Co-Authored-By: Claude Opus 4.6 (1M context) --- s7commplus/zlib_dicts.py | 787 +++++++++++++------------------- tests/test_blob_decompressor.py | 2 +- 2 files changed, 330 insertions(+), 459 deletions(-) diff --git a/s7commplus/zlib_dicts.py b/s7commplus/zlib_dicts.py index 9ba93ef7..3f8c8533 100644 --- a/s7commplus/zlib_dicts.py +++ b/s7commplus/zlib_dicts.py @@ -7,507 +7,378 @@ tag tables, line comments, debug info, etc.) using zlib with a preset dictionary. Python's zlib.decompress() returns Z_NEED_DICT; we provide the matching dictionary based on the Adler-32 checksum in the zlib header. + +The dictionaries are XML template fragments used as zlib backreference +windows. Stored as UTF-8 strings (they are 100% printable text) and +encoded to bytes at import time. """ -# BodyDesc_90000001 (Adler-32: 0xefaeae49, 3068 bytes) -_DICT_BODYDESC_90000001 = bytes.fromhex( - "3c4e6574776f726b436f6e7461696e65723e3c4e6574776f726b204c616e673d224c41445f434c4153534943222050726f6772616d6d696e67436f6e74657874" - "3d22506c61696e22204d6e656d6f6e69633d224765726d616e222052656649643d2231223e3c466c674e65742056657273696f6e3d2231302e352e302e302220" - "4c616e673d224c41445f434c41535349432220526f757465643d2274727565223e3c4c6162656c733e20203c4f52656620446973706c61794e616d653d22456e" - "64222052656649643d22313522205549643d223322202f3e203c2f4c6162656c733e3c50617274733e3c50617274205549643d22332220476174653d22436f6e" - "74616374223e3c4e6567617465642050696e4e616d653d226f706572616e6422202f3e203c2f506172743e3c4f52656620446973706c61794e616d653d222254" - "61675f3122222052656649643d22313722205549643d223522202f3e203c50617274205549643d22362220476174653d224164642220537263547970653d2244" - "496e742220436172643d223222202f3e203c50617274205549643d2231342220476174653d2245712220537263547970653d22496e7422202f3e203c50617274" - "205549643d22322220476174653d22526f756e642220537263547970653d225265616c222044657374547970653d2244496e7422202f3e203c4f526566204469" - "73706c61794e616d653d22225461675f3222222052656649643d22323722205549643d22313122202f3e203c4f52656620446973706c61794e616d653d224c23" - "333435222052656649643d22313422205549643d2231363122202f3e203c435265662043616c6c547970653d2246756e6374696f6e43616c6c22205265664964" - "3d223422205549643d2235223e20203c4f52656620446973706c61794e616d653d222671756f743b5265666572656e63655f626c6f636b5f6e756d6265725f39" - "302671756f743b222052656649643d223322205549643d223622202f3e20203c56696577496e666f204865696768743d223022202f3e3c2f435265663e3c2f50" - "617274733e3c57697265733e3c57697265205549643d2231223e20203c506f7765727261696c202f3e2020203c50436f6e205549643d2234222050696e4e616d" - "653d22494e22202f3e2020203c56696577496e666f2053746172743d227472756522202f3e203c2f576972653e3c57697265205549643d2233223e20203c4f43" - "6f6e205549643d223522202f3e2020203c50436f6e205549643d2238222050696e4e616d653d226f706572616e6422202f3e203c2f576972653e3c5769726520" - "5549643d2237223e20203c50436f6e205549643d2239222050696e4e616d653d224f55543122202f3e2020203c4f436f6e205549643d223722202f3e203c2f57" - "6972653e3c57697265205549643d2235223e20203c506f7765727261696c202f3e2020203c50436f6e205549643d2236222050696e4e616d653d22494e22202f" - "3e2020203c56696577496e666f2053746172743d227472756522202f3e203c2f576972653e3c2f57697265733e3c2f466c674e65743e3c4465627567496e666f" - "2056657273696f6e3d2231302e352e31382e34222054696d655374616d703d22313238363936373532383030333133383035222054617267657453797374656d" - "3d224d4337506c757322204c616e673d224c41445f434c4153534943223e20203c4465627567496e666f205549643d223222205341433d2230222047726f7570" - "4e756d6265723d2230222047726f75704261686176696f723d22494e22204f706572616e64496e6465783d2230222053746174656d656e74496e6465783d2230" - "222052656649643d22342220547970653d22426f6f6c222042697453697a653d2231223e3c4964656e743e3c4e617469766544697265637420547970653d2242" - "6f6f6c22204e616d653d224e61746976654c6f63616c20536c6f744269742030222053636f70653d224e61746976654c6f63616c22204e756d6265723d223022" - "2052616e67653d22536c6f7442697422202f3e3c2f4964656e743e20203c4465627567496e666f205549643d223222205341433d2230222047726f75704e756d" - "6265723d2239222047726f75704261686176696f723d22494e22204f706572616e64496e6465783d2239222053746174656d656e74496e6465783d2239222052" - "656649643d22352220466c6167733d224e6567526573756c7422202f3e2020203c4465627567496e666f205549643d223322205341433d2231222047726f7570" - "4e756d6265723d2231222047726f75704261686176696f723d22494e22204f706572616e64496e6465783d2231222053746174656d656e74496e6465783d2231" - "222052656649643d22352220466c6167733d224e6567526573756c7422202f3e2020203c4465627567496e666f205549643d223422205341433d223222204772" - "6f75704e756d6265723d2232222047726f75704261686176696f723d224f5554222053746174656d656e74496e6465783d22322220524c4f3d22547275652220" - "2f3e2020203c4465627567496e666f205549643d223522205341433d2233222047726f75704e756d6265723d2233222047726f75704261686176696f723d224f" - "555422204f706572616e64496e6465783d2233222053746174656d656e74496e6465783d2233222052656649643d223622202f3e2020203c4465627567496e66" - "6f205549643d223622205341433d2234222047726f75704e756d6265723d2234222047726f75704261686176696f723d224f5554222053746174656d656e7449" - "6e6465783d22342220524c4f3d22547275652220466c6167733d224449496e76616c6964466f724b6f7022202f3e2020203c4465627567496e666f205549643d" - "223722205341433d2235222047726f75704e756d6265723d2235222047726f75704261686176696f723d22494e22204f706572616e64496e6465783d22352220" - "53746174656d656e74496e6465783d2235222052656649643d223722202f3e2020203c4465627567496e666f205549643d223822205341433d2236222047726f" - "75704e756d6265723d2236222047726f75704261686176696f723d224f555422204f706572616e64496e6465783d2236222053746174656d656e74496e646578" - "3d2236222052656649643d223822202f3e2020203c4465627567496e666f205549643d223922205341433d2237222047726f75704e756d6265723d2237222047" - "726f75704261686176696f723d224f555422204f706572616e64496e6465783d2237222053746174656d656e74496e6465783d2237222052656649643d223922" - "202f3e2020203c4465627567496e666f205549643d223022205341433d2238222047726f75704e756d6265723d2238222047726f75704261686176696f723d22" - "494e22204f706572616e64496e6465783d2238222053746174656d656e74496e6465783d2238222052656649643d22302220466c6167733d224e656752657375" - "6c7422202f3e2020203c4465627567496e666f205549643d223522205341433d223536222047726f75704e756d6265723d2230222047726f7570426168617669" - "6f723d224f5554222053746174656d656e74496e6465783d2231332220524c4f3d2254727565222043616c6c50617261436f756e743d2230223e3c43616c6c49" - "6e666f3e20203c43616c6c205341433d223338222053746174656d656e74496e6465783d223822202f3e20203c43616c6c45786563757465205341433d223534" - "222053746174656d656e74496e6465783d22313122202f3e20203c4e65787453746174656d656e74416674657243616c6c45786563757465205341433d223535" - "222053746174656d656e74496e6465783d223132202f3e20203c43616c6c4672616d65436c656172205341433d223535222053746174656d656e74496e646578" - "3d22313222202f3e3c2f43616c6c496e666f3e20203c2f4465627567496e666f3e3c2f4465627567496e666f3e3c2f4e6574776f726b3e3c4e6574776f726b20" - "4c616e673d224c41445f434c4153534943222050726f6772616d6d696e67436f6e746578743d22506c61696e22204d6e656d6f6e69633d224765726d616e2220" - "52656649443d223536223e3c2f4e6574776f726b3e3c2f4e6574776f726b436f6e7461696e65723e3c4e6574776f726b436f6e7461696e6572202f3e" +# BodyDesc (90000001) (Adler-32: 0xefaeae49, 3068 bytes) +_DICT_BODYDESC_90000001 = ( + ' <' + 'ORef DisplayName=""Tag_1"" RefId="17" UId="5" /> ' + ' ' + ' ' + ' ' ) -# CompilerSettings_90000001 (Adler-32: 0x1398a37f, 442 bytes) -_DICT_COMPILERSETTINGS_90000001 = bytes.fromhex( - "3c4174747269627574204b65793d56616c75653d2222202f3e66616c736574727565436865636b73466c616773436f6d70696c6572547970654f7074696d697a" - "6174696f6e466c616773546172676574547970654d4337506c757349454353686f727457697265735f78303032435f5f78303032305f4e6174697665506f696e" - "746572456e61626c65416c6c436865636b5f436c61737369633c537472756374204b65793d223c2f5374727563743e3c4c616e6775616765204b65793d223c2f" - "4c616e67756167653e3c5461726765743e3c2f5461726765743e3c436f6d70696c657253657474696e6773446f63756d656e742056657273696f6e3d223c2f43" - "6f6d70696c657253657474696e6773446f63756d656e743e467756657273696f6e4c616e67756167654c6576656c4d6c6662506c6346616d696c7943616c6c65" - "6552656e756d626572696e67506f737369626c65436f6d6d6f6e4642445f434c41535349434642445f4945434c41445f434c41535349434c41445f4945435354" - "4c437265617465457874656e64656444656275674d6f6e69746f7241727261794c696d697473536574466c61674175746f6d61746963616c6c79" +# CompilerSettings (90000001) (Adler-32: 0x1398a37f, 442 bytes) +_DICT_COMPILERSETTINGS_90000001 = ( + 'falsetrueChecksFlagsCompilerTypeOptimizationFlagsTargetTypeMC7PlusIECShortW' + 'ires_x002C__x0020_NativePointerEnableAllCheck_Classic ' ) -# DebugInfo_IntfDesc_98000001 (Adler-32: 0x66052b13, 2298 bytes) -_DICT_DEBUGINFO_INTFDESC_98000001 = bytes.fromhex( - "3c4964656e743e3c426173653c464254205265666572656e6365645479706573496e6465783d2220436c6173736963536c6f743d2220566f6c6174696c65536c" - "6f743d222052657461696e536c6f743d223c436f6d70696c65556e69744964656e743e3c4d6662554454204964656e7452656649443d222052657461696e5061" - "72616d657465723d2220566f6c6174696c65506172616d657465723d2220436c6173736963506172616d657465723d223c4d756c7469696e7374616e63653c49" - "64656e74436f6e7461696e65723e3c4964656e743c43726f7373526566496e666f3e3c4163636573733e20426c6f636b4e756d6265723d2220426c6f636b5479" - "70653d2220547970654e616d653d22205374727563747572654d6f64696669656454533d2220496e746572666163654d6f64696669656454533d222054797065" - "4f626a65637449643d222056657273696f6e49643d2220547970655249643d22205249643d22204d4952657461696e50616464656442697453697a653d22204d" - "49566f6c6174696c6550616464656442697453697a653d22204d49436c617373696350616464656442697453697a653d22204d4952657461696e52656c617469" - "76654269744f66667365743d22204d49566f6c6174696c6552656c61746976654269744f66667365743d22204d49436c617373696352656c6174697665426974" - "4f66667365743d222053636f70653d222052656649643d223c585265664974656d3c426c6f636b205549643d222055736167653d2220496e737472756374696f" - "6e3d22204e657449643d22205852656648696464656e3d2220536c6f744e756d6265723d223c45787465726e616c54797065733c446174617479706520436c61" - "7373696342697473697a653d222052657461696e42697473697a653d2220566f6c6174696c6542697473697a653d223c45787465726e616c547970653c496465" - "6e7453746f726167653e3c506172743e204d756c7469696e7374616e63655f53746172744f6652657461696e506172743d22204d756c7469696e7374616e6365" - "5f53746172744f66566f6c6174696c65506172743d22204d756c7469696e7374616e63655f53746172744f66436c6173736963506172743d223c56616c756573" - "205769646573744d656d62657242697473697a653d2220506164646564456c656d656e7442697473697a653d22204964656e7452656649643d22204f70657261" - "6e64547970653d22204f66667365744d6f64696669656454696d657374616d703d22204f6666736574436f6d70696c6554696d657374616d703d223c43616c6c" - "537461636b557361676520557365416e6e6f74617465644f6666736574733d223c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d227574" - "662d3136223f3e3c426c6f636b496e746572666163653c5573616765204c69625265666572656e63653d22786d6c6e733d22687474703a2f2f736368656d6173" - "2e7369656d656e732e636f6d2f53696d617469632f45532f31312f426c6f636b496e746572666163652f536f757263652f5631315f30312e7873642054797065" - "496e666f52756e74696d6549643d223c526f6f743c4f66667365744461746120586d6c5061727449443d2220426c6f636b5479706546616d696c793d22204269" - "74536c6f74436f756e743d2220536c6f7438436f756e743d2220536c6f743136436f756e743d2220536c6f743332436f756e743d2220536c6f743634436f756e" - "743d2220536c6f7453696e676c65446f75626c65436f756e743d2220536c6f74506f696e746572436f756e743d223c53756250617274733e20524964536c6f74" - "733d22204964656e745549443d2220506172616d657465723d2220496e74657266616365477569643d2220426c6f636b4f626a65637449443d22205665727369" - "6f6e477569643d223c44617461747970654d656d6265723c4f6666736574446174614d6170204869676865737441737369676e65644c6f63616c49643d223c50" - "61796c6f6164546f6b656e73204c537461636b42697473697a653d2220496e666f5f436c61737369635061727453697a653d2220496e666f5f566f6c6174696c" - "655061727453697a653d2220496e666f5f52657461696e5061727453697a653d223c4d656d6265724c61796f7574204163636573736962696c6974793d222049" - "6e666f5f41727261795f5061646465645375627479706553697a653d2220496e666f5f41727261795f5375627479706553697a653d2220436c61737369634269" - "746f66667365743d22204e656e614269746f66667365743d22204f666673657453706563696669636174696f6e3d223c53697a65496e666f3c506172616d6574" - "657250617373696e673c4c696272617279496e666f3e20546f74616c4d656d626572436f756e743d22204d466c6167733d222052656c61746976654269746f66" - "667365743d222052656d616e656e63653d223c506172743c5061796c6f61643e3c5061796c6f6164546f6b656e2050656e616c74794279746573496e42697473" - "3d22204869676865737441737369676e6564496e7465726e616c49643d222053756250617274496e6465783d2220496e666f5f5769646573744d656d6265723d" - "222050616464656442697473697a653d223c56616c7565204b696e643d222056657273696f6e3d22322e302220786d6c6e733d223c4d656d626572204368616e" - "6765436f756e743d222056616c75653d2220526570726573656e746174696f6e53697a653d222050617373656441733d22205249443d22204c49443d22205479" - "70653d2253656374696f6e22422331362357233136235265745f56616c46756e6374696f6e434c41535349435f504c454153454e454e415f504c45415345566f" - "6964547275657472756546616c736566616c736553375f56697369626c65333235313a35323a35333a35343a35353a353844544c5553496e74756e646566556e" - "6465665265616c484d495f56697369626c6530783032303030303031576f726452657461696e307830303030464646464d616e6461746f72793c446174612049" - "443d22204e616d653d2220426173653d222052656c61746976653d222053697a653d222050616464656453697a653d2220506174683d223d223e" +# DebugInfo_IntfDesc (98000001) (Adler-32: 0x66052b13, 2298 bytes) +_DICT_DEBUGINFO_INTFDESC_98000001 = ( + '<' + 'MfbUDT IdentRefID=" RetainParameter=" VolatileParameter=" ClassicParameter=" BlockNumber=" BlockType=" TypeName=" StructureModifiedTS=" Interf' + 'aceModifiedTS=" TypeObjectId=" VersionId=" TypeRId=" RId=" MIRetainPaddedBitSize=" MIVolatilePaddedB' + 'itSize=" MIClassicPaddedBitSize=" MIRetainRelativeBitOffset=" MIVolatileRelativeBitOffset=" MIClassi' + 'cRelativeBitOffset=" Scope=" RefId=" RIdSlots=" IdentUID=" Parameter=" InterfaceGuid=" BlockObjectID' + '=" VersionGuid="' ) -# ExtRefData_90000001 (Adler-32: 0x9b6a3a92, 1792 bytes) -_DICT_EXTREFDATA_90000001 = bytes.fromhex( - "3c4964656e74436f6e7461696e65723e20203c4964656e74204e616d653d225461675f32222053636f70653d22476c6f62616c223e3c43726f7373526566496e" - "666f3e20203c585265664974656d205549643d2237222055736167653d22526561642220496e737472756374696f6e3d223122204e657449643d223222202f3e" - "20203c585265664974656d205549643d2238222055736167653d22526561642220496e737472756374696f6e3d223122204e657449643d22333222202f3e2020" - "3c585265664974656d205549643d2239222055736167653d22526561642220496e737472756374696f6e3d223122204e657449643d22333322202f3e20203c58" - "5265664974656d205549643d223130222055736167653d22526561642220496e737472756374696f6e3d223122204e657449643d22333922202f3e20203c5852" - "65664974656d205549643d223131222055736167653d22526561642220496e737472756374696f6e3d223122204e657449643d22343022202f3e3c2f43726f73" - "73526566496e666f3e3c53696d706c655479706520547970653d22426f6f6c22202f3e3c41636365737320537562436c6173733d2253696d706c654163636573" - "73223e20203c53696d706c6541636365737320547970653d22426f6f6c222052616e67653d22496e707574222057696474683d224269742220427974654e756d" - "6265723d223122204269744e756d6265723d223122202f3e3c2f4163636573733e20203c2f4964656e743e3c2f4964656e74436f6e7461696e65723e3c496465" - "6e74436f6e7461696e65723e3c4964656e74204e616d653d224c23333435222053636f70653d22476c6f62616c223e3c43726f7373526566496e666f3e3c5852" - "65664974656d205549643d22313631222055736167653d22526561642220496e737472756374696f6e3d223022204e657449643d223222202f3e3c2f43726f73" - "73526566496e666f3e3c53696d706c655479706520547970653d2244496e7422202f3e3c41636365737320537562436c6173733d22436f6e7374616e74223e3c" - "436f6e7374616e74204e616d653d224c23333435222053636f70653d22476c6f62616c2220547970653d2244496e742220466f726d61743d224465635f736967" - "6e6564222057696474683d2244576f7264222056616c75653d223539303130303030303030303030303022202f3e3c2f4163636573733e3c2f4964656e743e3c" - "2f4964656e74436f6e7461696e65723e3c4964656e74436f6e7461696e65723e3c4964656e74204e616d653d2231222053636f70653d22476c6f62616c223e3c" - "43726f7373526566496e666f3e3c585265664974656d205549643d223331222055736167653d22526561642220496e737472756374696f6e3d223022204e6574" - "49643d22333322202f3e3c585265664974656d205549643d223332222055736167653d22526561642220496e737472756374696f6e3d223022204e657449643d" - "22333922202f3e3c585265664974656d205549643d223332222055736167653d22526561642220496e737472756374696f6e3d223022204e657449643d223430" - "22202f3e3c585265664974656d205549643d223733222055736167653d22526561642220496e737472756374696f6e3d223022204e657449643d22343122202f" - "3e3c2f43726f7373526566496e666f3e3c53696d706c655479706520547970653d225265616c22202f3e3c41636365737320537562436c6173733d2253696d70" - "6c65416363657373223e3c53696d706c6541636365737320547970653d225265616c222052616e67653d224d656d6f7279222057696474683d2244576f726422" - "20427974654e756d6265723d2235363722204269744e756d6265723d223022202f3e3c2f4163636573733e3c2f4964656e743e3c2f4964656e74436f6e746169" - "6e65723e3c4964656e74436f6e7461696e65723e3c4964656e74204e616d653d225461675f31222053636f70653d22476c6f62616c223e3c43726f7373526566" - "496e666f3e3c585265664974656d205549643d223132222055736167653d2257726974652220496e737472756374696f6e3d223022204e657449643d22313622" - "202f3e3c585265664974656d205549643d223138222055736167653d22526561642220496e737472756374696f6e3d223022204e657449643d22313622202f3e" - "3c2f43726f7373526566496e666f3e3c53696d706c655479706520547970653d22496e7422202f3e3c41636365737320537562436c6173733d2253696d706c65" - "416363657373223e3c53696d706c6541636365737320547970653d22496e74222052616e67653d224d656d6f7279222057696474683d22576f72642220427974" - "654e756d6265723d2231363722204269744e756d6265723d223022202f3e3c2f4163636573733e3c2f4964656e743e3c2f4964656e74436f6e7461696e65723e" +# ExtRefData (90000001) (Adler-32: 0x9b6a3a92, 1792 bytes) +_DICT_EXTREFDATA_90000001 = ( + ' ' + '' ) -# IdentES_90000001 (Adler-32: 0xdf91b6bb, 1325 bytes) -_DICT_IDENTES_90000001 = bytes.fromhex( - "3c4964656e7445532076657273696f6e3d22312e30223e20203c436f7265537562747970653e46433c2f436f7265537562747970653e20203c4f626a65637454" - "797065496e666f3e436f6465426c6f636b446174613c2f4f626a65637454797065496e666f3e20203c436f6d70696c6554696d653e3633333730363335333536" - "343030303637313c2f436f6d70696c6554696d653e20203c4f6e6c7953796d626f6c69634163636573733e46616c73653c2f4f6e6c7953796d626f6c69634163" - "636573733e20203c486561646572446174612056657273696f6e3d22302e3122202f3e20203c497353797374656d3e747275653c2f497353797374656d3e3c2f" - "4964656e7445533e3c4964656e7445532076657273696f6e3d22312e30223e20203c436f7265537562747970653e44423c2f436f7265537562747970653e2020" - "3c4f626a65637454797065496e666f3e44617461426c6f636b446174613c2f4f626a65637454797065496e666f3e20203c436f6d70696c6554696d653e363333" - "3730363335333538313334353937353c2f436f6d70696c6554696d653e20203c44617461626c6f636b5479706520747970653d22536861726564444222206f66" - "747970653d22556e64656622206f666e756d6265723d223022202f3e20203c4f6e6c7953796d626f6c69634163636573733e46616c73653c2f4f6e6c7953796d" - "626f6c69634163636573733e20203c486561646572446174612056657273696f6e3d22302e3122202f3e20203c497353797374656d3e747275653c2f49735379" - "7374656d3e3c2f4964656e7445533e3c4964656e7445532076657273696f6e3d22312e30223e20203c436f7265537562747970653e44423c2f436f7265537562" - "747970653e20203c4f626a65637454797065496e666f3e44617461426c6f636b446174613c2f4f626a65637454797065496e666f3e20203c436f6d70696c6554" - "696d653e3633333730363335333538373132373734333c2f436f6d70696c6554696d653e20203c44617461626c6f636b5479706520747970653d224944426f66" - "53445422206f66747970653d2253445422206f666e756d6265723d223022206f666e616d653d224945435f434f554e54455222206f6654797065547970654775" - "69643d2237653933666333342d353339382d343862312d613331372d33386238636433376238653822206f665479706556657273696f6e477569643d22303037" - "65643763362d353162642d343035632d623765352d65316664336632356136633022202f3e20203c4f6e6c7953796d626f6c69634163636573733e547275653c" - "2f4f6e6c7953796d626f6c69634163636573733e20203c486561646572446174612056657273696f6e3d22302e3122202f3e20203c497353797374656d3e6661" - "6c73653c2f497353797374656d3e3c2f4964656e7445533e3c4964656e7445532076657273696f6e3d22312e30223e20203c436f7265537562747970653e4f42" - "2e50726f6772616d4379636c653c2f436f7265537562747970653e20203c4f626a65637454797065496e666f3e436f6465426c6f636b446174613c2f4f626a65" - "637454797065496e666f3e20203c436f6d70696c6554696d653e3633333730363335343432343534363531393c2f436f6d70696c6554696d653e20203c4f6e6c" - "7953796d626f6c69634163636573733e46616c73653c2f4f6e6c7953796d626f6c69634163636573733e20203c486561646572446174612056657273696f6e3d" - "22302e3122202f3e20203c497353797374656d3e747275653c2f497353797374656d3e3c2f4964656e7445533e" +# IdentES (90000001) (Adler-32: 0xdf91b6bb, 1325 bytes) +_DICT_IDENTES_90000001 = ( + ' FC CodeBlockData 633706353564000671 False <" + 'HeaderData Version="0.1" /> true DB DataBlockData 633706353581345975<" + '/CompileTime> Fa' + 'lse true DB DataBlockData 633706353587127743 True false OB.ProgramCycl' + "e CodeBlockData 633706354424546519 False ' + "true" ) -# IdentES_90000002 (Adler-32: 0x81d8db20, 1436 bytes) -_DICT_IDENTES_90000002 = bytes.fromhex( - "3c4964656e7445532076657273696f6e3d22312e30223e20203c436f7265537562747970653e46433c2f436f7265537562747970653e20203c4f626a65637454" - "797065496e666f3e436f6465426c6f636b446174613c2f4f626a65637454797065496e666f3e20203c436f6d70696c6554696d653e3633333730363335333536" - "343030303637313c2f436f6d70696c6554696d653e20203c4f6e6c7953796d626f6c69634163636573733e46616c73653c2f4f6e6c7953796d626f6c69634163" - "636573733e20203c496563436865636b3e46616c73653c2f496563436865636b3e20203c486561646572446174612056657273696f6e3d22302e3122202f3e20" - "203c497353797374656d3e747275653c2f497353797374656d3e3c2f4964656e7445533e3c4964656e7445532076657273696f6e3d22312e30223e20203c436f" - "7265537562747970653e44423c2f436f7265537562747970653e20203c4f626a65637454797065496e666f3e44617461426c6f636b446174613c2f4f626a6563" - "7454797065496e666f3e20203c436f6d70696c6554696d653e3633333730363335333538313334353937353c2f436f6d70696c6554696d653e20203c44617461" - "626c6f636b5479706520747970653d22536861726564444222206f66747970653d22556e64656622206f666e756d6265723d223022202f3e20203c4f6e6c7953" - "796d626f6c69634163636573733e46616c73653c2f4f6e6c7953796d626f6c69634163636573733e20203c496563436865636b3e46616c73653c2f4965634368" - "65636b3e20203c486561646572446174612056657273696f6e3d22302e3122202f3e20203c497353797374656d3e747275653c2f497353797374656d3e3c2f49" - "64656e7445533e3c4964656e7445532076657273696f6e3d22312e30223e20203c436f7265537562747970653e44423c2f436f7265537562747970653e20203c" - "4f626a65637454797065496e666f3e44617461426c6f636b446174613c2f4f626a65637454797065496e666f3e20203c436f6d70696c6554696d653e36333337" - "30363335333538373132373734333c2f436f6d70696c6554696d653e20203c44617461626c6f636b5479706520747970653d224944426f6653445422206f6674" - "7970653d2253445422206f666e756d6265723d223022206f666e616d653d224945435f434f554e54455222206f665479706554797065477569643d2237653933" - "666333342d353339382d343862312d613331372d33386238636433376238653822206f665479706556657273696f6e477569643d2230303765643763362d3531" - "62642d343035632d623765352d65316664336632356136633022202f3e20203c4f6e6c7953796d626f6c69634163636573733e547275653c2f4f6e6c7953796d" - "626f6c69634163636573733e20203c496563436865636b3e547275653c2f496563436865636b3e20203c486561646572446174612056657273696f6e3d22302e" - "3122202f3e20203c497353797374656d3e66616c73653c2f497353797374656d3e3c2f4964656e7445533e3c4964656e7445532076657273696f6e3d22312e30" - "223e20203c436f7265537562747970653e4f422e50726f6772616d4379636c653c2f436f7265537562747970653e20203c4f626a65637454797065496e666f3e" - "436f6465426c6f636b446174613c2f4f626a65637454797065496e666f3e20203c436f6d70696c6554696d653e3633333730363335343432343534363531393c" - "2f436f6d70696c6554696d653e20203c4f6e6c7953796d626f6c69634163636573733e46616c73653c2f4f6e6c7953796d626f6c69634163636573733e20203c" - "496563436865636b3e46616c73653c2f496563436865636b3e20203c486561646572446174612056657273696f6e3d22302e3122202f3e20203c497353797374" - "656d3e747275653c2f497353797374656d3e3c2f4964656e7445533e" +# IdentES (90000002) (Adler-32: 0x81d8db20, 1436 bytes) +_DICT_IDENTES_90000002 = ( + ' FC CodeBlockData 633706353564000671 False <" + 'IecCheck>False true DB DataBlockData 633706353581345975 False False true DB DataBlockData 633706353587127743 True True false OB.ProgramCycle ' + "CodeBlockData 633706354424546519 False False ' + " true" ) -# IdentES_98000001 (Adler-32: 0x5814b03b, 1273 bytes) -_DICT_IDENTES_98000001 = bytes.fromhex( - "3c4964656e7445532076657273696f6e3d22312e30223e3c436f7265537562747970653e46433c2f436f7265537562747970653e3c4f626a6563745479706549" - "6e666f3e436f6465426c6f636b446174613c2f4f626a65637454797065496e666f3e3c436f6d70696c6554696d653e3633333730363335333536343030303637" - "313c2f436f6d70696c6554696d653e3c4f6e6c7953796d626f6c69634163636573733e46616c73653c2f4f6e6c7953796d626f6c69634163636573733e3c4865" - "61646572446174612056657273696f6e3d22302e3122202f3e3c497353797374656d3e747275653c2f497353797374656d3e3c2f4964656e7445533e3c496465" - "6e7445532076657273696f6e3d22312e30223e3c436f7265537562747970653e44423c2f436f7265537562747970653e3c4f626a65637454797065496e666f3e" - "44617461426c6f636b446174613c2f4f626a65637454797065496e666f3e3c436f6d70696c6554696d653e3633333730363335333538313334353937353c2f43" - "6f6d70696c6554696d653e3c44617461626c6f636b5479706520747970653d22536861726564444222206f66747970653d22556e64656622206f666e756d6265" - "723d223022202f3e3c4f6e6c7953796d626f6c69634163636573733e46616c73653c2f4f6e6c7953796d626f6c69634163636573733e3c486561646572446174" - "612056657273696f6e3d22302e3122202f3e3c497353797374656d3e747275653c2f497353797374656d3e3c2f4964656e7445533e3c4964656e744553207665" - "7273696f6e3d22312e30223e3c436f7265537562747970653e44423c2f436f7265537562747970653e3c4f626a65637454797065496e666f3e44617461426c6f" - "636b446174613c2f4f626a65637454797065496e666f3e3c436f6d70696c6554696d653e3633333730363335333538373132373734333c2f436f6d70696c6554" - "696d653e3c44617461626c6f636b5479706520747970653d224944426f6653445422206f66747970653d2253445422206f666e756d6265723d223022206f666e" - "616d653d224945435f434f554e54455222206f665479706554797065477569643d2237653933666333342d353339382d343862312d613331372d333862386364" - "33376238653822206f665479706556657273696f6e477569643d2230303765643763362d353162642d343035632d623765352d65316664336632356136633022" - "202f3e3c4f6e6c7953796d626f6c69634163636573733e547275653c2f4f6e6c7953796d626f6c69634163636573733e3c486561646572446174612056657273" - "696f6e3d22302e3122202f3e3c497353797374656d3e66616c73653c2f497353797374656d3e3c2f4964656e7445533e3c4964656e7445532076657273696f6e" - "3d22312e30223e3c436f7265537562747970653e4f422e50726f6772616d4379636c653c2f436f7265537562747970653e3c4f626a65637454797065496e666f" - "3e436f6465426c6f636b446174613c2f4f626a65637454797065496e666f3e3c436f6d70696c6554696d653e3633333730363335343432343534363531393c2f" - "436f6d70696c6554696d653e3c4f6e6c7953796d626f6c69634163636573733e46616c73653c2f4f6e6c7953796d626f6c69634163636573733e3c4865616465" - "72446174612056657273696f6e3d22302e3122202f3e3c497353797374656d3e747275653c2f497353797374656d3e3c2f4964656e7445533e" +# IdentES (98000001) (Adler-32: 0x5814b03b, 1273 bytes) +_DICT_IDENTES_98000001 = ( + 'FCCodeBlockData633706353564000671FalsetrueDBDataBlockData633706353581345975FalsetrueDBDataBlockData633706353587127743<' + 'OnlySymbolicAccess>TruefalseOB.ProgramCycleCodeBlockDa' + "ta633706354424546519Falsetrue' ) -# IntRefData_90000001 (Adler-32: 0xda4a88f4, 2003 bytes) -_DICT_INTREFDATA_90000001 = bytes.fromhex( - "3c4964656e74436f6e7461696e65723e3c4964656e74204e616d653d22456e64222053636f70653d224c6162656c222052656649443d2232223e3c4163636573" - "7320537562436c6173733d224c6162656c223e3c4964656e74202f3e3c2f4163636573733e3c2f4964656e743e3c4964656e74204e616d653d22436f6d70696c" - "65556e69742030222053636f70653d224e756d626572222052656649443d2233223e3c41636365737320537562436c6173733d22436f6d70696c65556e697449" - "64656e74223e3c436f6d70696c65556e69744964656e74202f3e3c2f4163636573733e3c2f4964656e743e3c4964656e74204e616d653d225265666572656e63" - "655f626c6f636b5f6e756d6265725f3031222053636f70653d22556e646566222052656649443d2234223e3c41636365737320537562436c6173733d22426c6f" - "636b496e74657266616365496e666f223e3c426c6f636b496e74657266616365205265664e616d653d225265666572656e63655f626c6f636b5f6e756d626572" - "5f303122204e756d6265723d2231222043616c6c6565547970653d22426c6f636b5f46432220547970654f706572616e6452656649643d223830222050617261" - "6d4d6f64696669636174696f6e54533d2231323836363033373536313234313331373722202f3e3c2f4163636573733e3c2f4964656e743e3c2f4964656e7443" - "6f6e7461696e65723e3c4964656e74204e616d653d225461675f31222053636f70653d22476c6f62616c222052656649443d2233223e3c53696d706c65547970" - "6520547970653d22426f6f6c22202f3e3c41636365737320537562436c6173733d2253696d706c65416363657373223e20203c53696d706c6541636365737320" - "547970653d22426f6f6c222052616e67653d22496e707574222057696474683d224269742220427974654e756d6265723d223122204269744e756d6265723d22" - "3022202f3e3c2f4163636573733e3c2f4964656e743e3c4964656e74204e616d653d225461675f35222053636f70653d22476c6f62616c222052656649443d22" - "37223e3c53696d706c655479706520547970653d22496e7422202f3e3c41636365737320537562436c6173733d2253696d706c65416363657373223e20203c53" - "696d706c6541636365737320547970653d22496e74222052616e67653d22496e707574222057696474683d22576f72642220427974654e756d6265723d223022" - "204269744e756d6265723d223022202f3e3c2f4163636573733e3c2f4964656e743e3c4964656e74204e616d653d225461675f3132222053636f70653d22476c" - "6f62616c222052656649443d223133223e3c53696d706c655479706520547970653d2244496e7422202f3e3c41636365737320537562436c6173733d2253696d" - "706c65416363657373223e20203c53696d706c6541636365737320547970653d2244496e74222052616e67653d22496e707574222057696474683d2244576f72" - "642220427974654e756d6265723d223122204269744e756d6265723d223022202f3e3c2f4163636573733e3c2f4964656e743e3c4964656e74204e616d653d22" - "5461675f3332222053636f70653d22476c6f62616c222052656649443d223334223e3c53696d706c655479706520547970653d225265616c22202f3e3c416363" - "65737320537562436c6173733d2253696d706c65416363657373223e20203c53696d706c6541636365737320547970653d225265616c222052616e67653d224d" - "656d6f7279222057696474683d2244576f72642220427974654e756d6265723d2235363722204269744e756d6265723d223022202f3e3c2f4163636573733e3c" - "2f4964656e743e3c4964656e74204e616d653d225265666572656e63655f626c6f636b5f6e756d6265725f3931222053636f70653d22476c6f62616c22205265" - "6649443d2236223e3c53696d706c655479706520547970653d22426c6f636b5f464322202f3e3c41636365737320537562436c6173733d224643426c6f636b22" - "3e20203c426c6f636b204e616d653d225265666572656e63655f626c6f636b5f6e756d6265725f3931222053636f70653d22476c6f62616c2220547970653d22" - "426c6f636b5f464322204e756d6265723d22393122202f3e3c2f4163636573733e3c2f4964656e743e3c4964656e74204e616d653d2254505f3161222053636f" - "70653d22476c6f62616c222052656649443d223739223e3c53696d706c655479706520547970653d22426c6f636b5f444222202f3e3c41636365737320537562" - "436c6173733d224f706572616e64223e20203c426c6f636b204e616d653d2254505f3161222053636f70653d22476c6f62616c2220547970653d22426c6f636b" - "5f444222204e756d6265723d22333722202f3e3c2f4163636573733e3c2f4964656e743e3c4964656e74204e616d653d2254233273222053636f70653d22476c" - "6f62616c222052656649443d223830223e3c53696d706c655479706520547970653d2254696d6522202f3e3c41636365737320537562436c6173733d22436f6e" - "7374616e74223e20203c436f6e7374616e74204e616d653d2254233273222053636f70653d22476c6f62616c2220547970653d2254696d652220466f726d6174" - "3d2254696d65222057696474683d2244576f7264222056616c75653d224430303730303030303030303030303022202f3e3c2f4163636573733e3c2f4964656e" - "743e3c2f4964656e74436f6e7461696e65723e" +# IntRefData (90000001) (Adler-32: 0xda4a88f4, 2003 bytes) +_DICT_INTREFDATA_90000001 = ( + '<' + 'Access SubClass="BlockInterfaceInfo"> " ) -# IntRefData_98000001 (Adler-32: 0xb0155ff8, 1018 bytes) -_DICT_INTREFDATA_98000001 = bytes.fromhex( - "3c4d756c7469496e7374616e636541636365737320436c61737369634162734f66667365743d222052657461696e4162734f66667365743d2220566f6c617469" - "6c654162734f66667365743d223c4c6162656c3e547970654f626a65637449643d2220547970655249643d223c4642426c6f636b3c496e737472756374696f6e" - "3c426c6f636b496e74657266616365496e666f204f726967696e616c506172744e616d653d223c4964656e74436f6e7461696e65723e3c4643426c6f636b204c" - "6962726172794f626a49643d22204e65656473496e7374616e63653d223c4175664442426c6f636b204372656174696f6e49643d222056657273696f6e49643d" - "223c4465704442426c6f636b2054656d706c6174655265666572656e63653d2220506172616d657465724d6f64696669656454533d223c506172616d65746572" - "204172726179547970653d223c496e7465726661636541636365737320496e746572666163654d6f64696669656454533d223c53696d706c654163636573733c" - "436f6e7374616e743c436f6d70696c65556e69744964656e743e205374727563747572654d6f64696669656454533d2220426c6f636b547970653d2220536563" - "74696f6e3d2220417265613d2220496e74657266616365466c6167733d2253375f56697369626c6522496e74657266616365466c6167733d224d616e6461746f" - "72792c2053375f56697369626c65223c476c6f62616c4163636573732052616e67653d222053696d706c654163636573734d6f6469666965723d2220466f726d" - "61743d222056616c75653d2220466f726d6174466c6167733d222044624e756d6265723d223c4163636573734f626a656374202f3e3c2f4163636573733e3c2f" - "4964656e743e3c4964656e74204e616d653d22202f3e3c43726f7373526566496e666f3e3c4163636573733e3c4d666255445420426c6f636b4e756d6265723d" - "22204162734f66667365743d22204163636573734d6f6469666965723d2220547970654e616d653d22205249643d22202f3e3c585265664974656d2053636f70" - "653d224e756d62657222476c6f62616c224c6f6b616c22436f6e7374616e74222052656649643d222056657273696f6e3d22312e302220547970653d22205549" - "643d22312055736167653d2252656164224e6f6e65224d756c7469696e7374616e63652220496e737472756374696f6e3d223022204e657449643d2231205852" - "656648696464656e3d2246616c7365222055736167653d22577269746522496e742255496e74225265616c225553496e7422576f72642244496e7422426f6f6c" - "2253496e7422427974652254696d65225544496e742244576f726422436861722244544c224c5265616c22537472696e672274727565223d223e" +# IntRefData (98000001) (Adler-32: 0xb0155ff8, 1018 bytes) +_DICT_INTREFDATA_98000001 = ( + ' StructureModifiedTS=" BlockType=" Section=" Area=" InterfaceFlags="S7_Visible"InterfaceFl' + 'ags="Mandatory, S7_Visible"
' + '
" ) -# IntfDesc_90000001 (Adler-32: 0x4b8416f0, 4942 bytes) -_DICT_INTFDESC_90000001 = bytes.fromhex( - "3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d227574662d3136223f3e3c426c6f636b496e746572666163652056657273696f6e3d22" - "312e30223e20203c536f757263652056657273696f6e3d22312e30223e3c53656374696f6e204e616d653d22537461746963223e20203c4c696e65204c49643d" - "223922204e616d653d225354415254222053796d626f6c3d2254696d6522204c6962726172792e53697a653d22333222204c6962726172792e4c61796f75742e" - "427974654f66667365743d2230222052656d616e656e63653d22566f6c6174696c6522205249643d2230783230303030306222202f3e20203c4c696e65204c49" - "643d22313022204e616d653d22505245534554222053796d626f6c3d2254696d6522204c6962726172792e53697a653d22333222204c6962726172792e4c6179" - "6f75742e427974654f66667365743d2234222052656d616e656e63653d22566f6c6174696c6522205249643d2230783230303030306222202f3e20203c4c696e" - "65204c49643d22313122204e616d653d22454c4150534544222053796d626f6c3d2254696d6522204c6962726172792e53697a653d22333222204c6962726172" - "792e4c61796f75742e427974654f66667365743d2238222052656d616e656e63653d22566f6c6174696c6522205249643d2230783230303030306222202f3e20" - "203c4c696e65204c49643d22313222204e616d653d2252554e4e494e47222053796d626f6c3d22426f6f6c22204c6962726172792e53697a653d223122204c69" - "62726172792e4c61796f75742e4269744f66667365743d2231322e30222052656d616e656e63653d22566f6c6174696c6522205249643d223078323030303030" - "3122202f3e20203c4c696e65204c49643d22313322204e616d653d22494e222053796d626f6c3d22426f6f6c22204c6962726172792e53697a653d223122204c" - "6962726172792e4c61796f75742e4269744f66667365743d2231322e31222052656d616e656e63653d22566f6c6174696c6522205249643d2230783230303030" - "303122202f3e20203c4c696e65204c49643d22313422204e616d653d2251222053796d626f6c3d22426f6f6c22204c6962726172792e53697a653d223122204c" - "6962726172792e4c61796f75742e4269744f66667365743d2231322e32222052656d616e656e63653d22566f6c6174696c6522205249643d2230783230303030" - "303122202f3e20203c4c696e65204c49643d22313522204e616d653d22504144222053796d626f6c3d224279746522204c6962726172792e53697a653d223822" - "204c6962726172792e4c61796f75742e427974654f66667365743d223133222052656d616e656e63653d22566f6c6174696c6522205249643d22307832303030" - "30303222202f3e20203c4c696e65204c49643d22313622204e616d653d225041445f31222053796d626f6c3d224279746522204c6962726172792e53697a653d" - "223822204c6962726172792e4c61796f75742e427974654f66667365743d223134222052656d616e656e63653d22566f6c6174696c6522205249643d22307832" - "30303030303222202f3e20203c4c696e65204c49643d22313722204e616d653d225041445f32222053796d626f6c3d224279746522204c6962726172792e5369" - "7a653d223822204c6962726172792e4c61796f75742e427974654f66667365743d223135222052656d616e656e63653d22566f6c6174696c6522205249643d22" - "30783230303030303222202f3e3c2f53656374696f6e3e20203c2f536f757263653e20203c537461727456616c7565733e3c64696374696f6e6172795f656e74" - "726965733e3c2f64696374696f6e6172795f656e74726965733e20203c2f537461727456616c7565733e3c2f426c6f636b496e746572666163653e3c3f786d6c" - "2076657273696f6e3d22312e302220656e636f64696e673d227574662d3136223f3e3c426c6f636b496e746572666163652056657273696f6e3d22312e30223e" - "20203c536f757263652056657273696f6e3d22312e3022204e657874467265654c49643d2231302220436c617373696353697a653d2230222052657461696e53" - "697a653d22302220566f6c6174696c6553697a653d223022204c6962726172792e4c537461636b42697473697a653d2230223e3c53656374696f6e204e616d65" - "3d22496e70757422202f3e3c53656374696f6e204e616d653d224f757470757422202f3e3c53656374696f6e204e616d653d22496e4f757422202f3e3c536563" - "74696f6e204e616d653d2254656d7022202f3e3c53656374696f6e204e616d653d2252657475726e223e20203c4c696e65204e616d653d225265745f56616c22" - "2053796d626f6c3d22566f696422204c49643d223922204163636573736962696c6974793d225075626c6963222052656d616e656e63653d22566f6c6174696c" - "6522204c6962726172792e53697a653d223022204c6962726172792e4c61796f75742e427974654f66667365743d223022205249643d22307832303030303030" - "22202f3e3c2f53656374696f6e3e20203c2f536f757263653e3c2f426c6f636b496e746572666163653e3c3f786d6c2076657273696f6e3d22312e302220656e" - "636f64696e673d227574662d3136223f3e3c426c6f636b496e746572666163652056657273696f6e3d22312e30223e20203c536f757263652056657273696f6e" - "3d22312e30222053797374656d3d22547275652220436c617373696353697a653d2230222052657461696e53697a653d22302220566f6c6174696c6553697a65" - "3d223022204e657874467265654c49643d22313122204c6962726172792e4c537461636b42697473697a653d2230223e3c53656374696f6e204e616d653d2254" - "656d70223e20203c4c696e65204c49643d223922204e616d653d2266697273745f7363616e22204163636573736962696c6974793d225075626c696322205265" - "6d616e656e63653d22566f6c6174696c65222053796d626f6c3d22426f6f6c22205249643d2230783230303030303122202f3e20203c4c696e65204c49643d22" - "313022204e616d653d2272656d616e656e636522204163636573736962696c6974793d225075626c6963222052656d616e656e63653d22566f6c6174696c6522" - "2053796d626f6c3d22426f6f6c22205249643d2230783230303030303122202f3e3c2f53656374696f6e3e20203c2f536f757263653e3c2f426c6f636b496e74" - "6572666163653e3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d227574662d3136223f3e3c426c6f636b496e74657266616365205665" - "7273696f6e3d22312e30223e20203c536f757263652056657273696f6e3d22312e302220436c617373696353697a653d2232373638222052657461696e53697a" - "653d22302220566f6c6174696c6553697a653d22333222204e657874467265654c49643d2231323822204c6962726172792e4c537461636b42697473697a653d" - "2230223e3c53656374696f6e204e616d653d22537461746963223e20203c4c696e65204c49643d223922204e616d653d22737461745f31222041636365737369" - "62696c6974793d225075626c6963222052656d616e656e63653d22566f6c6174696c65222053796d626f6c3d22496e7422204c6962726172792e53697a653d22" - "313622204c6962726172792e4c61796f75742e427974654f66667365743d22302220496e697469616c3d22313222205249643d2230783230303030303522202f" - "3e20203c4c696e65204c49643d22313022204e616d653d22737461745f3222204163636573736962696c6974793d225075626c6963222052656d616e656e6365" - "3d22566f6c6174696c65222053796d626f6c3d225265616c22204c6962726172792e53697a653d22333222204c6962726172792e4c61796f75742e427974654f" - "66667365743d22322220496e697469616c3d22312e3522205249643d2230783230303030303822202f3e20203c4c696e65204c49643d22313122204e616d653d" - "22737461745f3322204163636573736962696c6974793d225075626c6963222052656d616e656e63653d22566f6c6174696c65222053796d626f6c3d22426f6f" - "6c22204c6962726172792e53697a653d223122204c6962726172792e4c61796f75742e4269744f66667365743d22362e302220496e697469616c3d2222205249" - "643d2230783230303030303122202f3e20203c4c696e65204c49643d22313522204e616d653d22737461745f3422204163636573736962696c6974793d225075" - "626c6963222052656d616e656e63653d22566f6c6174696c65222053796d626f6c3d2254696d6522204c6962726172792e53697a653d22333222204c69627261" - "72792e4c61796f75742e427974654f66667365743d22313822205249643d2230783230303030306222202f3e20203c4c696e65204c49643d22313922204e616d" - "653d22737461745f3522204163636573736962696c6974793d225075626c6963222052656d616e656e63653d22566f6c6174696c65222053796d626f6c3d2257" - "6f726422204c6962726172792e53697a653d22313622204c6962726172792e4c61796f75742e427974654f66667365743d2233302220496e697469616c3d2231" - "3222205249643d2230783230303030303422202f3e3c2f53656374696f6e3e20203c2f536f757263653e20203c537461727456616c7565733e3c64696374696f" - "6e6172795f656e74726965733e3c2f64696374696f6e6172795f656e74726965733e20203c2f537461727456616c7565733e3c2f426c6f636b496e7465726661" - "63653e3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d227574662d3136223f3e3c426c6f636b496e746572666163652056657273696f" - "6e3d22312e30223e20203c536f757263652056657273696f6e3d22312e30223e3c53656374696f6e204e616d653d22537461746963223e20203c4c696e65204c" - "49643d223922204e616d653d22434f554e545f5550222053796d626f6c3d22426f6f6c22204c6962726172792e53697a653d223122204c6962726172792e4c61" - "796f75742e4269744f66667365743d22302e30222052656d616e656e63653d22566f6c6174696c6522205249643d2230783230303030303122202f3e20203c4c" - "696e65204c49643d22313022204e616d653d22434f554e545f444f574e222053796d626f6c3d22426f6f6c22204c6962726172792e53697a653d223122204c69" - "62726172792e4c61796f75742e4269744f66667365743d22302e31222052656d616e656e63653d22566f6c6174696c6522205249643d22307832303030303031" - "22202f3e20203c4c696e65204c49643d22313122204e616d653d225245534554222053796d626f6c3d22426f6f6c22204c6962726172792e53697a653d223122" - "204c6962726172792e4c61796f75742e4269744f66667365743d22302e32222052656d616e656e63653d22566f6c6174696c6522205249643d22307832303030" - "30303122202f3e20203c4c696e65204c49643d22313222204e616d653d224c4f4144222053796d626f6c3d22426f6f6c22204c6962726172792e53697a653d22" - "3122204c6962726172792e4c61796f75742e4269744f66667365743d22302e33222052656d616e656e63653d22566f6c6174696c6522205249643d2230783230" - "303030303122202f3e20203c4c696e65204c49643d22313322204e616d653d22515f5550222053796d626f6c3d22426f6f6c22204c6962726172792e53697a65" - "3d223122204c6962726172792e4c61796f75742e4269744f66667365743d22302e34222052656d616e656e63653d22566f6c6174696c6522205249643d223078" - "3230303030303122202f3e20203c4c696e65204c49643d22313422204e616d653d22515f444f574e222053796d626f6c3d22426f6f6c22204c6962726172792e" - "53697a653d223122204c6962726172792e4c61796f75742e4269744f66667365743d22302e35222052656d616e656e63653d22566f6c6174696c652220524964" - "3d2230783230303030303122202f3e20203c4c696e65204c49643d22313522204e616d653d22504144222053796d626f6c3d224279746522204c696272617279" - "2e53697a653d223822204c6962726172792e4c61796f75742e427974654f66667365743d2231222052656d616e656e63653d22566f6c6174696c652220524964" - "3d2230783230303030303222202f3e20203c4c696e65204c49643d22313622204e616d653d225052455345545f56414c5545222053796d626f6c3d22496e7422" - "204c6962726172792e53697a653d22313622204c6962726172792e4c61796f75742e427974654f66667365743d2232222052656d616e656e63653d22566f6c61" - "74696c6522205249643d2230783230303030303522202f3e20203c4c696e65204c49643d22313722204e616d653d22434f554e545f56414c5545222053796d62" - "6f6c3d22496e7422204c6962726172792e53697a653d22313622204c6962726172792e4c61796f75742e427974654f66667365743d2234222052656d616e656e" - "63653d22566f6c6174696c6522205249643d2230783230303030303522202f3e3c2f53656374696f6e3e20203c2f536f757263653e20203c537461727456616c" - "7565733e3c64696374696f6e6172795f656e74726965733e3c2f64696374696f6e6172795f656e74726965733e20203c2f537461727456616c7565733e3c2f42" - "6c6f636b496e746572666163653e" +# IntfDescTag (90000001) (Adler-32: 0xce9b821b, 1178 bytes) +_DICT_INTFDESCTAG_90000001 = ( + ' Bool Int ' + ' DInt Real Bool DInt ' ) -# LineComm_90000001 (Adler-32: 0x79b2bda3, 534 bytes) -_DICT_LINECOMM_90000001 = bytes.fromhex( - "3c436f6d6d656e7444696374696f6e6172793e3c496e746572666163654c696e65436f6d6d656e74733e3c436f6d6d656e74205549643d223122204c696e6549" - "643d2233223e3c44696374456e747279204c616e67756167653d22656e2d5553223e7468697320697320612074686520696e20746f20616e2063616e20626520" - "666f7220617265206e6574776f726b20616e643c2f44696374456e7472793e203c2f436f6d6d656e743e3c436f6d6d656e74205549643d223022204c696e6549" - "643d2232223e3c44696374456e747279204c616e67756167653d22656e2d5553223e64696573206973742065696e20646572206469652064617320696d206e61" - "63682065696e656e206b616e6e207365696e2066c3bc722073696e64204e65747a7765726b20756e643c2f44696374456e7472793e203c2f436f6d6d656e743e" - "3c2f496e746572666163654c696e65436f6d6d656e74733e3c426f64794c696e65436f6d6d656e7473202f3e203c2f436f6d6d656e7444696374696f6e617279" - "3e3c436f6d6d656e7444696374696f6e6172793e3c496e746572666163654c696e65436f6d6d656e7473202f3e3c426f64794c696e65436f6d6d656e7473202f" - "3e3c2f436f6d6d656e7444696374696f6e6172793e3c436f6d6d656e7444696374696f6e6172793e3c496e746572666163654c696e65436f6d6d656e7473202f" - "3e203c2f436f6d6d656e7444696374696f6e6172793e" +# LineComm (90000001) (Adler-32: 0x79b2bda3, 534 bytes) +_DICT_LINECOMM_90000001 = ( + 'th' + 'is is a the in to an can be for are network and dies ist ein der die das im nach einen kann sein für sind Netzwerk und " ) -# LineComm_98000001 (Adler-32: 0x3c55436a, 206 bytes) -_DICT_LINECOMM_98000001 = bytes.fromhex( - "5549643d222052656649443d223c506172743e35313a35323a35333a35343a35353c426f64794c696e65436f6d6d656e74733e3c436f6d6d656e744469637469" - "6f6e6172793e3c496e746572666163654c696e65436f6d6d656e74733c506172742056657273696f6e3d22322e30222049443d22204b696e643d222050617265" - "6e7449443d223c436f6d6d656e74436f6d6d656e7449443d2220506174683d222066722d465269742d49543c44696374456e747279204c616e67756167653d22" - "64652d444522656e2d55533d223e" +# LineComm (98000001) (Adler-32: 0x3c55436a, 206 bytes) +_DICT_LINECOMM_98000001 = ( + 'UId=" RefID="51:52:53:54:55this is a the in to an can be for are network a' + 'nddies ist ein der die das im ' + "nach einen kann sein für sind Netzwerk und " ) -# NWC_98000001 (Adler-32: 0xc5d26ac3, 301 bytes) -_DICT_NWC_98000001 = bytes.fromhex( - "7468697320697320612074686520696e20746f20616e2063616e20626520666f7220617265206e6574776f726b20616e642064696573206973742065696e2064" - "6572206469652064617320696d206e6163682065696e656e206b616e6e207365696e2066c3bc722073696e64204e65747a7765726b20756e643c436f6d6d656e" - "7444696374696f6e6172793e3c4e6574776f726b436f6d6d656e74733e3c436f6d6d656e742052656649443d2232223e3c44696374456e747279204c616e6775" - "6167653d22656e2d55532264652d44452269742d49542266722d4652223e3c2f44696374456e7472793e3c2f436f6d6d656e743e3c2f4e6574776f726b436f6d" - "6d656e74733e3c2f436f6d6d656e7444696374696f6e6172793e3c4e6574776f726b436f6d6d656e7473202f3e" +# NWC (98000001) (Adler-32: 0xc5d26ac3, 301 bytes) +_DICT_NWC_98000001 = ( + "this is a the in to an can be for are network and dies ist ein der die das im nach einen kann sein f" + 'ür sind Netzwerk und' ) -# NWT_90000001 (Adler-32: 0xfd69ac74, 503 bytes) -_DICT_NWT_90000001 = bytes.fromhex( - "3c436f6d6d656e7444696374696f6e6172793e3c4e6574776f726b5469746c65733e3c2f436f6d6d656e743e202020203c436f6d6d656e742052656649443d22" - "30223e20203c44696374456e747279204c616e67756167653d22656e2d5553223e20224d61696e2050726f6772616d20537765657020284379636c6529223c2f" - "44696374456e7472793e3c2f436f6d6d656e743e3c436f6d6d656e742052656649443d2232223e3c44696374456e747279204c616e67756167653d22656e2d55" - "53223e3c2f44696374456e7472793e3c2f436f6d6d656e743e3c436f6d6d656e742052656649443d223136223e3c44696374456e747279204c616e6775616765" - "3d22656e2d5553223e7468697320697320612074686520696e20746f20616e2063616e20626520666f7220617265206e6574776f726b20616e643c2f44696374" - "456e7472793e3c2f436f6d6d656e743e3c436f6d6d656e742052656649443d223236223e3c44696374456e747279204c616e67756167653d22656e2d5553223e" - "64696573206973742065696e20646572206469652064617320696d206e6163682065696e656e206b616e6e207365696e2066c3bc722073696e64204e65747a77" - "65726b20756e643c2f44696374456e7472793e3c2f4e6574776f726b5469746c65733e3c2f436f6d6d656e7444696374696f6e6172793e" +# NWT (90000001) (Adler-32: 0xfd69ac74, 503 bytes) +_DICT_NWT_90000001 = ( + ' "M' + 'ain Program Sweep (Cycle)"this is a the in to an can be for a' + 're network anddies ist ein der' + " die das im nach einen kann sein für sind Netzwerk und" ) -# NWT_98000001 (Adler-32: 0x845fc605, 571 bytes) -_DICT_NWT_98000001 = bytes.fromhex( - "3c436f6d6d656e7444696374696f6e6172793e3c4e6574776f726b5469746c65733e3c436f6d6d656e743c44696374456e7472792052656649443d22204c616e" - "67756167653d223d223e3c436f6d6d656e7444696374696f6e6172793e3c4e6574776f726b5469746c65733e3c2f436f6d6d656e743e3c436f6d6d656e742052" - "656649443d2230223e3c44696374456e747279204c616e67756167653d2264652d4445223e20224d61696e2050726f6772616d20537765657020284379636c65" - "29223c2f44696374456e7472793e3c2f436f6d6d656e743e3c436f6d6d656e742052656649443d2232223e3c44696374456e747279204c616e67756167653d22" - "66722d4652223e3c2f44696374456e7472793e3c2f436f6d6d656e743e3c436f6d6d656e742052656649443d223136223e3c44696374456e747279204c616e67" - "756167653d2269742d4954223e7468697320697320612074686520696e20746f20616e2063616e20626520666f7220617265206e6574776f726b20616e643c2f" - "44696374456e7472793e3c2f436f6d6d656e743e3c436f6d6d656e742052656649443d223236223e3c44696374456e747279204c616e67756167653d22656e2d" - "5553223e64696573206973742065696e20646572206469652064617320696d206e6163682065696e656e206b616e6e207365696e2066c3bc722073696e64204e" - "65747a7765726b20756e643c2f44696374456e7472793e3c2f4e6574776f726b5469746c65733e3c2f436f6d6d656e7444696374696f6e6172793e" +# NWT (98000001) (Adler-32: 0x845fc605, 571 bytes) +_DICT_NWT_98000001 = ( + ' "Main Program Sweep (Cycle)"this is a the in to an can be for are network anddies ist ein der die das im nach einen kann sein' + " für sind Netzwerk und" ) -# TagLineComm_90000001 (Adler-32: 0xe2729ea1, 455 bytes) -_DICT_TAGLINECOMM_90000001 = bytes.fromhex( - "3c436f6d6d656e7444696374696f6e6172793e3c5461674c696e65436f6d6d656e74733e3c436f6d6d656e742052656649443d2231223e3c44696374456e7472" - "79204c616e67756167653d22656e2d555322202f3e203c2f436f6d6d656e743e3c436f6d6d656e742052656649443d223131223e3c44696374456e747279204c" - "616e67756167653d22656e2d5553223e7468697320697320612074686520696e20746f20616e2063616e20626520666f7220617265206e6574776f726b20616e" - "643c2f44696374456e7472793e3c2f436f6d6d656e743e3c436f6d6d656e742052656649443d22313131223e3c44696374456e747279204c616e67756167653d" - "22656e2d5553223e64696573206973742065696e20646572206469652064617320696d206e6163682065696e656e206b616e6e207365696e2066c3bc72207369" - "6e64204e65747a7765726b20756e643c2f44696374456e7472793e3c2f436f6d6d656e743e3c2f5461674c696e65436f6d6d656e74733e3c2f436f6d6d656e74" - "44696374696f6e6172793e3c436f6d6d656e7444696374696f6e6172793e20203c5461674c696e65436f6d6d656e7473202f3e3c2f436f6d6d656e7444696374" - "696f6e6172793e" +# TagLineComm (90000001) (Adler-32: 0xe2729ea1, 455 bytes) +_DICT_TAGLINECOMM_90000001 = ( + ' this is a the in to an can be for are network anddies ist ein der die das im nach ein' + "en kann sein für sind Netzwerk und " ) ZLIB_DICTIONARIES: dict[int, bytes] = { - 0xefaeae49: _DICT_BODYDESC_90000001, - 0x1398a37f: _DICT_COMPILERSETTINGS_90000001, - 0x1bac39f0: _DICT_DEBUGINFO_90000001, - 0x66052b13: _DICT_DEBUGINFO_INTFDESC_98000001, - 0x9b6a3a92: _DICT_EXTREFDATA_90000001, - 0xdf91b6bb: _DICT_IDENTES_90000001, - 0x81d8db20: _DICT_IDENTES_90000002, - 0x5814b03b: _DICT_IDENTES_98000001, - 0xda4a88f4: _DICT_INTREFDATA_90000001, - 0xb0155ff8: _DICT_INTREFDATA_98000001, - 0xce9b821b: _DICT_INTFDESCTAG_90000001, - 0x4b8416f0: _DICT_INTFDESC_90000001, - 0x79b2bda3: _DICT_LINECOMM_90000001, - 0x3c55436a: _DICT_LINECOMM_98000001, - 0xab6fa31e: _DICT_NWC_90000001, - 0xc5d26ac3: _DICT_NWC_98000001, - 0xfd69ac74: _DICT_NWT_90000001, - 0x845fc605: _DICT_NWT_98000001, - 0xe2729ea1: _DICT_TAGLINECOMM_90000001, + 0xEFAEAE49: _DICT_BODYDESC_90000001.encode("utf-8"), + 0x1398A37F: _DICT_COMPILERSETTINGS_90000001.encode("utf-8"), + 0x1BAC39F0: _DICT_DEBUGINFO_90000001.encode("utf-8"), + 0x66052B13: _DICT_DEBUGINFO_INTFDESC_98000001.encode("utf-8"), + 0x9B6A3A92: _DICT_EXTREFDATA_90000001.encode("utf-8"), + 0xDF91B6BB: _DICT_IDENTES_90000001.encode("utf-8"), + 0x81D8DB20: _DICT_IDENTES_90000002.encode("utf-8"), + 0x5814B03B: _DICT_IDENTES_98000001.encode("utf-8"), + 0xDA4A88F4: _DICT_INTREFDATA_90000001.encode("utf-8"), + 0xB0155FF8: _DICT_INTREFDATA_98000001.encode("utf-8"), + 0x4B8416F0: _DICT_INTFDESC_90000001.encode("utf-8"), + 0xCE9B821B: _DICT_INTFDESCTAG_90000001.encode("utf-8"), + 0x79B2BDA3: _DICT_LINECOMM_90000001.encode("utf-8"), + 0x3C55436A: _DICT_LINECOMM_98000001.encode("utf-8"), + 0xAB6FA31E: _DICT_NWC_90000001.encode("utf-8"), + 0xC5D26AC3: _DICT_NWC_98000001.encode("utf-8"), + 0xFD69AC74: _DICT_NWT_90000001.encode("utf-8"), + 0x845FC605: _DICT_NWT_98000001.encode("utf-8"), + 0xE2729EA1: _DICT_TAGLINECOMM_90000001.encode("utf-8"), } ZLIB_DICT_NAMES: dict[int, str] = { - 0xefaeae49: "BodyDesc (90000001)", - 0x1398a37f: "CompilerSettings (90000001)", - 0x1bac39f0: "DebugInfo (90000001)", - 0x66052b13: "DebugInfo_IntfDesc (98000001)", - 0x9b6a3a92: "ExtRefData (90000001)", - 0xdf91b6bb: "IdentES (90000001)", - 0x81d8db20: "IdentES (90000002)", - 0x5814b03b: "IdentES (98000001)", - 0xda4a88f4: "IntRefData (90000001)", - 0xb0155ff8: "IntRefData (98000001)", - 0xce9b821b: "IntfDescTag (90000001)", - 0x4b8416f0: "IntfDesc (90000001)", - 0x79b2bda3: "LineComm (90000001)", - 0x3c55436a: "LineComm (98000001)", - 0xab6fa31e: "NWC (90000001)", - 0xc5d26ac3: "NWC (98000001)", - 0xfd69ac74: "NWT (90000001)", - 0x845fc605: "NWT (98000001)", - 0xe2729ea1: "TagLineComm (90000001)", + 0xEFAEAE49: "BodyDesc (90000001)", + 0x1398A37F: "CompilerSettings (90000001)", + 0x1BAC39F0: "DebugInfo (90000001)", + 0x66052B13: "DebugInfo_IntfDesc (98000001)", + 0x9B6A3A92: "ExtRefData (90000001)", + 0xDF91B6BB: "IdentES (90000001)", + 0x81D8DB20: "IdentES (90000002)", + 0x5814B03B: "IdentES (98000001)", + 0xDA4A88F4: "IntRefData (90000001)", + 0xB0155FF8: "IntRefData (98000001)", + 0x4B8416F0: "IntfDesc (90000001)", + 0xCE9B821B: "IntfDescTag (90000001)", + 0x79B2BDA3: "LineComm (90000001)", + 0x3C55436A: "LineComm (98000001)", + 0xAB6FA31E: "NWC (90000001)", + 0xC5D26AC3: "NWC (98000001)", + 0xFD69AC74: "NWT (90000001)", + 0x845FC605: "NWT (98000001)", + 0xE2729EA1: "TagLineComm (90000001)", } diff --git a/tests/test_blob_decompressor.py b/tests/test_blob_decompressor.py index efc90ab6..707b1c9d 100644 --- a/tests/test_blob_decompressor.py +++ b/tests/test_blob_decompressor.py @@ -42,7 +42,7 @@ def test_decompress_with_preset_dict(): def test_decompress_unknown_dict_raises(): - blob = b"\x78\x7d\xDE\xAD\xBE\xEF" + b"\x00" * 10 + blob = b"\x78\x7d\xde\xad\xbe\xef" + b"\x00" * 10 with pytest.raises(ValueError, match="Unknown zlib preset dictionary"): decompress_blob(blob) From fc100016209176392fd851f2da09fab3c8efdaaa Mon Sep 17 00:00:00 2001 From: Gijs Molenaar Date: Thu, 16 Jul 2026 21:33:24 +0200 Subject: [PATCH 3/6] refactor: store zlib dictionaries as individual .xml files Replace the 385-line Python module of string-chunked XML with 19 individual .xml files in s7commplus/zlib_dicts/. Each file is named {adler32}_{name}.xml and can be read directly in any editor or IDE. The __init__.py loader scans the directory at import time and builds the same ZLIB_DICTIONARIES/ZLIB_DICT_NAMES dicts as before. Also adds *.xml to pyproject.toml package-data so the files ship in the wheel. Co-Authored-By: Claude Opus 4.6 (1M context) --- pyproject.toml | 2 +- s7commplus/zlib_dicts.py | 384 ------------------ .../1398a37f_CompilerSettings_90000001.xml | 1 + .../1bac39f0_DebugInfo_90000001.xml | 1 + .../zlib_dicts/3c55436a_LineComm_98000001.xml | 1 + .../zlib_dicts/4b8416f0_IntfDesc_90000001.xml | 1 + .../zlib_dicts/5814b03b_IdentES_98000001.xml | 1 + .../66052b13_DebugInfo_IntfDesc_98000001.xml | 1 + .../zlib_dicts/79b2bda3_LineComm_90000001.xml | 1 + .../zlib_dicts/81d8db20_IdentES_90000002.xml | 1 + .../zlib_dicts/845fc605_NWT_98000001.xml | 1 + .../9b6a3a92_ExtRefData_90000001.xml | 1 + s7commplus/zlib_dicts/__init__.py | 28 ++ .../zlib_dicts/ab6fa31e_NWC_90000001.xml | 1 + .../b0155ff8_IntRefData_98000001.xml | 1 + .../zlib_dicts/c5d26ac3_NWC_98000001.xml | 1 + .../ce9b821b_IntfDescTag_90000001.xml | 1 + .../da4a88f4_IntRefData_90000001.xml | 1 + .../zlib_dicts/df91b6bb_IdentES_90000001.xml | 1 + .../e2729ea1_TagLineComm_90000001.xml | 1 + .../zlib_dicts/efaeae49_BodyDesc_90000001.xml | 1 + .../zlib_dicts/fd69ac74_NWT_90000001.xml | 1 + 22 files changed, 48 insertions(+), 385 deletions(-) delete mode 100644 s7commplus/zlib_dicts.py create mode 100644 s7commplus/zlib_dicts/1398a37f_CompilerSettings_90000001.xml create mode 100644 s7commplus/zlib_dicts/1bac39f0_DebugInfo_90000001.xml create mode 100644 s7commplus/zlib_dicts/3c55436a_LineComm_98000001.xml create mode 100644 s7commplus/zlib_dicts/4b8416f0_IntfDesc_90000001.xml create mode 100644 s7commplus/zlib_dicts/5814b03b_IdentES_98000001.xml create mode 100644 s7commplus/zlib_dicts/66052b13_DebugInfo_IntfDesc_98000001.xml create mode 100644 s7commplus/zlib_dicts/79b2bda3_LineComm_90000001.xml create mode 100644 s7commplus/zlib_dicts/81d8db20_IdentES_90000002.xml create mode 100644 s7commplus/zlib_dicts/845fc605_NWT_98000001.xml create mode 100644 s7commplus/zlib_dicts/9b6a3a92_ExtRefData_90000001.xml create mode 100644 s7commplus/zlib_dicts/__init__.py create mode 100644 s7commplus/zlib_dicts/ab6fa31e_NWC_90000001.xml create mode 100644 s7commplus/zlib_dicts/b0155ff8_IntRefData_98000001.xml create mode 100644 s7commplus/zlib_dicts/c5d26ac3_NWC_98000001.xml create mode 100644 s7commplus/zlib_dicts/ce9b821b_IntfDescTag_90000001.xml create mode 100644 s7commplus/zlib_dicts/da4a88f4_IntRefData_90000001.xml create mode 100644 s7commplus/zlib_dicts/df91b6bb_IdentES_90000001.xml create mode 100644 s7commplus/zlib_dicts/e2729ea1_TagLineComm_90000001.xml create mode 100644 s7commplus/zlib_dicts/efaeae49_BodyDesc_90000001.xml create mode 100644 s7commplus/zlib_dicts/fd69ac74_NWT_90000001.xml diff --git a/pyproject.toml b/pyproject.toml index cf3c1ff0..af468280 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,7 +41,7 @@ discovery = ["pnio-dcp"] [tool.setuptools.package-data] snap7 = ["py.typed"] -s7commplus = ["py.typed"] +s7commplus = ["py.typed", "zlib_dicts/*.xml"] [tool.setuptools.packages.find] include = ["snap7*", "s7*", "s7commplus*"] diff --git a/s7commplus/zlib_dicts.py b/s7commplus/zlib_dicts.py deleted file mode 100644 index 3f8c8533..00000000 --- a/s7commplus/zlib_dicts.py +++ /dev/null @@ -1,384 +0,0 @@ -"""S7CommPlus zlib preset dictionaries for compressed blob decompression. - -Extracted from thomas-v2/S7CommPlusDriver (LGPL-3.0): - src/S7CommPlusDriver/Core/BlobDecompressor.cs - -S7-1200/1500 PLCs compress various XML blobs (interface descriptions, -tag tables, line comments, debug info, etc.) using zlib with a preset -dictionary. Python's zlib.decompress() returns Z_NEED_DICT; we provide -the matching dictionary based on the Adler-32 checksum in the zlib header. - -The dictionaries are XML template fragments used as zlib backreference -windows. Stored as UTF-8 strings (they are 100% printable text) and -encoded to bytes at import time. -""" - -# BodyDesc (90000001) (Adler-32: 0xefaeae49, 3068 bytes) -_DICT_BODYDESC_90000001 = ( - ' <' - 'ORef DisplayName=""Tag_1"" RefId="17" UId="5" /> ' - ' ' - ' ' - ' ' -) - -# CompilerSettings (90000001) (Adler-32: 0x1398a37f, 442 bytes) -_DICT_COMPILERSETTINGS_90000001 = ( - 'falsetrueChecksFlagsCompilerTypeOptimizationFlagsTargetTypeMC7PlusIECShortW' - 'ires_x002C__x0020_NativePointerEnableAllCheck_Classic ' -) - -# DebugInfo_IntfDesc (98000001) (Adler-32: 0x66052b13, 2298 bytes) -_DICT_DEBUGINFO_INTFDESC_98000001 = ( - '<' - 'MfbUDT IdentRefID=" RetainParameter=" VolatileParameter=" ClassicParameter=" BlockNumber=" BlockType=" TypeName=" StructureModifiedTS=" Interf' - 'aceModifiedTS=" TypeObjectId=" VersionId=" TypeRId=" RId=" MIRetainPaddedBitSize=" MIVolatilePaddedB' - 'itSize=" MIClassicPaddedBitSize=" MIRetainRelativeBitOffset=" MIVolatileRelativeBitOffset=" MIClassi' - 'cRelativeBitOffset=" Scope=" RefId=" RIdSlots=" IdentUID=" Parameter=" InterfaceGuid=" BlockObjectID' - '=" VersionGuid="' -) - -# ExtRefData (90000001) (Adler-32: 0x9b6a3a92, 1792 bytes) -_DICT_EXTREFDATA_90000001 = ( - ' ' - '' -) - -# IdentES (90000001) (Adler-32: 0xdf91b6bb, 1325 bytes) -_DICT_IDENTES_90000001 = ( - ' FC CodeBlockData 633706353564000671 False <" - 'HeaderData Version="0.1" /> true DB DataBlockData 633706353581345975<" - '/CompileTime> Fa' - 'lse true DB DataBlockData 633706353587127743 True false OB.ProgramCycl' - "e CodeBlockData 633706354424546519 False ' - "true" -) - -# IdentES (90000002) (Adler-32: 0x81d8db20, 1436 bytes) -_DICT_IDENTES_90000002 = ( - ' FC CodeBlockData 633706353564000671 False <" - 'IecCheck>False true DB DataBlockData 633706353581345975 False False true DB DataBlockData 633706353587127743 True True false OB.ProgramCycle ' - "CodeBlockData 633706354424546519 False False ' - " true" -) - -# IdentES (98000001) (Adler-32: 0x5814b03b, 1273 bytes) -_DICT_IDENTES_98000001 = ( - 'FCCodeBlockData633706353564000671FalsetrueDBDataBlockData633706353581345975FalsetrueDBDataBlockData633706353587127743<' - 'OnlySymbolicAccess>TruefalseOB.ProgramCycleCodeBlockDa' - "ta633706354424546519Falsetrue' -) - -# IntRefData (90000001) (Adler-32: 0xda4a88f4, 2003 bytes) -_DICT_INTREFDATA_90000001 = ( - '<' - 'Access SubClass="BlockInterfaceInfo"> " -) - -# IntRefData (98000001) (Adler-32: 0xb0155ff8, 1018 bytes) -_DICT_INTREFDATA_98000001 = ( - ' StructureModifiedTS=" BlockType=" Section=" Area=" InterfaceFlags="S7_Visible"InterfaceFl' - 'ags="Mandatory, S7_Visible"
' - '
" -) - -# IntfDescTag (90000001) (Adler-32: 0xce9b821b, 1178 bytes) -_DICT_INTFDESCTAG_90000001 = ( - ' Bool Int ' - ' DInt Real Bool DInt ' -) - -# LineComm (90000001) (Adler-32: 0x79b2bda3, 534 bytes) -_DICT_LINECOMM_90000001 = ( - 'th' - 'is is a the in to an can be for are network and dies ist ein der die das im nach einen kann sein für sind Netzwerk und " -) - -# LineComm (98000001) (Adler-32: 0x3c55436a, 206 bytes) -_DICT_LINECOMM_98000001 = ( - 'UId=" RefID="51:52:53:54:55this is a the in to an can be for are network a' - 'nddies ist ein der die das im ' - "nach einen kann sein für sind Netzwerk und " -) - -# NWC (98000001) (Adler-32: 0xc5d26ac3, 301 bytes) -_DICT_NWC_98000001 = ( - "this is a the in to an can be for are network and dies ist ein der die das im nach einen kann sein f" - 'ür sind Netzwerk und' -) - -# NWT (90000001) (Adler-32: 0xfd69ac74, 503 bytes) -_DICT_NWT_90000001 = ( - ' "M' - 'ain Program Sweep (Cycle)"this is a the in to an can be for a' - 're network anddies ist ein der' - " die das im nach einen kann sein für sind Netzwerk und" -) - -# NWT (98000001) (Adler-32: 0x845fc605, 571 bytes) -_DICT_NWT_98000001 = ( - ' "Main Program Sweep (Cycle)"this is a the in to an can be for are network anddies ist ein der die das im nach einen kann sein' - " für sind Netzwerk und" -) - -# TagLineComm (90000001) (Adler-32: 0xe2729ea1, 455 bytes) -_DICT_TAGLINECOMM_90000001 = ( - ' this is a the in to an can be for are network anddies ist ein der die das im nach ein' - "en kann sein für sind Netzwerk und " -) - - -ZLIB_DICTIONARIES: dict[int, bytes] = { - 0xEFAEAE49: _DICT_BODYDESC_90000001.encode("utf-8"), - 0x1398A37F: _DICT_COMPILERSETTINGS_90000001.encode("utf-8"), - 0x1BAC39F0: _DICT_DEBUGINFO_90000001.encode("utf-8"), - 0x66052B13: _DICT_DEBUGINFO_INTFDESC_98000001.encode("utf-8"), - 0x9B6A3A92: _DICT_EXTREFDATA_90000001.encode("utf-8"), - 0xDF91B6BB: _DICT_IDENTES_90000001.encode("utf-8"), - 0x81D8DB20: _DICT_IDENTES_90000002.encode("utf-8"), - 0x5814B03B: _DICT_IDENTES_98000001.encode("utf-8"), - 0xDA4A88F4: _DICT_INTREFDATA_90000001.encode("utf-8"), - 0xB0155FF8: _DICT_INTREFDATA_98000001.encode("utf-8"), - 0x4B8416F0: _DICT_INTFDESC_90000001.encode("utf-8"), - 0xCE9B821B: _DICT_INTFDESCTAG_90000001.encode("utf-8"), - 0x79B2BDA3: _DICT_LINECOMM_90000001.encode("utf-8"), - 0x3C55436A: _DICT_LINECOMM_98000001.encode("utf-8"), - 0xAB6FA31E: _DICT_NWC_90000001.encode("utf-8"), - 0xC5D26AC3: _DICT_NWC_98000001.encode("utf-8"), - 0xFD69AC74: _DICT_NWT_90000001.encode("utf-8"), - 0x845FC605: _DICT_NWT_98000001.encode("utf-8"), - 0xE2729EA1: _DICT_TAGLINECOMM_90000001.encode("utf-8"), -} - -ZLIB_DICT_NAMES: dict[int, str] = { - 0xEFAEAE49: "BodyDesc (90000001)", - 0x1398A37F: "CompilerSettings (90000001)", - 0x1BAC39F0: "DebugInfo (90000001)", - 0x66052B13: "DebugInfo_IntfDesc (98000001)", - 0x9B6A3A92: "ExtRefData (90000001)", - 0xDF91B6BB: "IdentES (90000001)", - 0x81D8DB20: "IdentES (90000002)", - 0x5814B03B: "IdentES (98000001)", - 0xDA4A88F4: "IntRefData (90000001)", - 0xB0155FF8: "IntRefData (98000001)", - 0x4B8416F0: "IntfDesc (90000001)", - 0xCE9B821B: "IntfDescTag (90000001)", - 0x79B2BDA3: "LineComm (90000001)", - 0x3C55436A: "LineComm (98000001)", - 0xAB6FA31E: "NWC (90000001)", - 0xC5D26AC3: "NWC (98000001)", - 0xFD69AC74: "NWT (90000001)", - 0x845FC605: "NWT (98000001)", - 0xE2729EA1: "TagLineComm (90000001)", -} diff --git a/s7commplus/zlib_dicts/1398a37f_CompilerSettings_90000001.xml b/s7commplus/zlib_dicts/1398a37f_CompilerSettings_90000001.xml new file mode 100644 index 00000000..c9990100 --- /dev/null +++ b/s7commplus/zlib_dicts/1398a37f_CompilerSettings_90000001.xml @@ -0,0 +1 @@ +falsetrueChecksFlagsCompilerTypeOptimizationFlagsTargetTypeMC7PlusIECShortWires_x002C__x0020_NativePointerEnableAllCheck_Classic \ No newline at end of file diff --git a/s7commplus/zlib_dicts/3c55436a_LineComm_98000001.xml b/s7commplus/zlib_dicts/3c55436a_LineComm_98000001.xml new file mode 100644 index 00000000..833592ba --- /dev/null +++ b/s7commplus/zlib_dicts/3c55436a_LineComm_98000001.xml @@ -0,0 +1 @@ +UId=" RefID="51:52:53:54:55
\ No newline at end of file diff --git a/s7commplus/zlib_dicts/5814b03b_IdentES_98000001.xml b/s7commplus/zlib_dicts/5814b03b_IdentES_98000001.xml new file mode 100644 index 00000000..6abcdb5a --- /dev/null +++ b/s7commplus/zlib_dicts/5814b03b_IdentES_98000001.xml @@ -0,0 +1 @@ +FCCodeBlockData633706353564000671FalsetrueDBDataBlockData633706353581345975FalsetrueDBDataBlockData633706353587127743TruefalseOB.ProgramCycleCodeBlockData633706354424546519Falsetrue \ No newline at end of file diff --git a/s7commplus/zlib_dicts/66052b13_DebugInfo_IntfDesc_98000001.xml b/s7commplus/zlib_dicts/66052b13_DebugInfo_IntfDesc_98000001.xml new file mode 100644 index 00000000..539db2bb --- /dev/null +++ b/s7commplus/zlib_dicts/66052b13_DebugInfo_IntfDesc_98000001.xml @@ -0,0 +1 @@ + BlockNumber=" BlockType=" TypeName=" StructureModifiedTS=" InterfaceModifiedTS=" TypeObjectId=" VersionId=" TypeRId=" RId=" MIRetainPaddedBitSize=" MIVolatilePaddedBitSize=" MIClassicPaddedBitSize=" MIRetainRelativeBitOffset=" MIVolatileRelativeBitOffset=" MIClassicRelativeBitOffset=" Scope=" RefId=" RIdSlots=" IdentUID=" Parameter=" InterfaceGuid=" BlockObjectID=" VersionGuid=" \ No newline at end of file diff --git a/s7commplus/zlib_dicts/79b2bda3_LineComm_90000001.xml b/s7commplus/zlib_dicts/79b2bda3_LineComm_90000001.xml new file mode 100644 index 00000000..7422475a --- /dev/null +++ b/s7commplus/zlib_dicts/79b2bda3_LineComm_90000001.xml @@ -0,0 +1 @@ +this is a the in to an can be for are network and dies ist ein der die das im nach einen kann sein für sind Netzwerk und \ No newline at end of file diff --git a/s7commplus/zlib_dicts/81d8db20_IdentES_90000002.xml b/s7commplus/zlib_dicts/81d8db20_IdentES_90000002.xml new file mode 100644 index 00000000..da981cd8 --- /dev/null +++ b/s7commplus/zlib_dicts/81d8db20_IdentES_90000002.xml @@ -0,0 +1 @@ + FC CodeBlockData 633706353564000671 False False true DB DataBlockData 633706353581345975 False False true DB DataBlockData 633706353587127743 True True false OB.ProgramCycle CodeBlockData 633706354424546519 False False true \ No newline at end of file diff --git a/s7commplus/zlib_dicts/845fc605_NWT_98000001.xml b/s7commplus/zlib_dicts/845fc605_NWT_98000001.xml new file mode 100644 index 00000000..ca393488 --- /dev/null +++ b/s7commplus/zlib_dicts/845fc605_NWT_98000001.xml @@ -0,0 +1 @@ + "Main Program Sweep (Cycle)"this is a the in to an can be for are network anddies ist ein der die das im nach einen kann sein für sind Netzwerk und \ No newline at end of file diff --git a/s7commplus/zlib_dicts/9b6a3a92_ExtRefData_90000001.xml b/s7commplus/zlib_dicts/9b6a3a92_ExtRefData_90000001.xml new file mode 100644 index 00000000..bfda0948 --- /dev/null +++ b/s7commplus/zlib_dicts/9b6a3a92_ExtRefData_90000001.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/s7commplus/zlib_dicts/__init__.py b/s7commplus/zlib_dicts/__init__.py new file mode 100644 index 00000000..24c88bf8 --- /dev/null +++ b/s7commplus/zlib_dicts/__init__.py @@ -0,0 +1,28 @@ +"""S7CommPlus zlib preset dictionaries for compressed blob decompression. + +Extracted from thomas-v2/S7CommPlusDriver (LGPL-3.0): + src/S7CommPlusDriver/Core/BlobDecompressor.cs + +S7-1200/1500 PLCs compress various XML blobs (interface descriptions, +tag tables, line comments, debug info, etc.) using zlib with a preset +dictionary. Python's zlib.decompress() returns Z_NEED_DICT; we provide +the matching dictionary based on the Adler-32 checksum in the zlib header. + +Each dictionary is stored as a readable ``.xml`` file in this package +directory, named ``{adler32}_{name}.xml``. They are loaded once at +import time and indexed by Adler-32 checksum. +""" + +from pathlib import Path as _Path + +_DIR = _Path(__file__).parent + +ZLIB_DICT_NAMES: dict[int, str] = {} +ZLIB_DICTIONARIES: dict[int, bytes] = {} + +for _f in sorted(_DIR.glob("*.xml")): + _adler_hex, _rest = _f.stem.split("_", 1) + _adler = int(_adler_hex, 16) + _name = _rest.replace("_", " ") + ZLIB_DICT_NAMES[_adler] = _name + ZLIB_DICTIONARIES[_adler] = _f.read_bytes() diff --git a/s7commplus/zlib_dicts/ab6fa31e_NWC_90000001.xml b/s7commplus/zlib_dicts/ab6fa31e_NWC_90000001.xml new file mode 100644 index 00000000..7c4b72f5 --- /dev/null +++ b/s7commplus/zlib_dicts/ab6fa31e_NWC_90000001.xml @@ -0,0 +1 @@ +this is a the in to an can be for are network anddies ist ein der die das im nach einen kann sein für sind Netzwerk und \ No newline at end of file diff --git a/s7commplus/zlib_dicts/b0155ff8_IntRefData_98000001.xml b/s7commplus/zlib_dicts/b0155ff8_IntRefData_98000001.xml new file mode 100644 index 00000000..5e60ac1e --- /dev/null +++ b/s7commplus/zlib_dicts/b0155ff8_IntRefData_98000001.xml @@ -0,0 +1 @@ + StructureModifiedTS=" BlockType=" Section=" Area=" InterfaceFlags="S7_Visible"InterfaceFlags="Mandatory, S7_Visible" \ No newline at end of file diff --git a/s7commplus/zlib_dicts/ce9b821b_IntfDescTag_90000001.xml b/s7commplus/zlib_dicts/ce9b821b_IntfDescTag_90000001.xml new file mode 100644 index 00000000..19b87d23 --- /dev/null +++ b/s7commplus/zlib_dicts/ce9b821b_IntfDescTag_90000001.xml @@ -0,0 +1 @@ + Bool Int DInt Real Bool DInt \ No newline at end of file diff --git a/s7commplus/zlib_dicts/da4a88f4_IntRefData_90000001.xml b/s7commplus/zlib_dicts/da4a88f4_IntRefData_90000001.xml new file mode 100644 index 00000000..3df30c06 --- /dev/null +++ b/s7commplus/zlib_dicts/da4a88f4_IntRefData_90000001.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/s7commplus/zlib_dicts/df91b6bb_IdentES_90000001.xml b/s7commplus/zlib_dicts/df91b6bb_IdentES_90000001.xml new file mode 100644 index 00000000..ac4bed75 --- /dev/null +++ b/s7commplus/zlib_dicts/df91b6bb_IdentES_90000001.xml @@ -0,0 +1 @@ + FC CodeBlockData 633706353564000671 False true DB DataBlockData 633706353581345975 False true DB DataBlockData 633706353587127743 True false OB.ProgramCycle CodeBlockData 633706354424546519 False true \ No newline at end of file diff --git a/s7commplus/zlib_dicts/e2729ea1_TagLineComm_90000001.xml b/s7commplus/zlib_dicts/e2729ea1_TagLineComm_90000001.xml new file mode 100644 index 00000000..a7a654f5 --- /dev/null +++ b/s7commplus/zlib_dicts/e2729ea1_TagLineComm_90000001.xml @@ -0,0 +1 @@ + this is a the in to an can be for are network anddies ist ein der die das im nach einen kann sein für sind Netzwerk und \ No newline at end of file diff --git a/s7commplus/zlib_dicts/efaeae49_BodyDesc_90000001.xml b/s7commplus/zlib_dicts/efaeae49_BodyDesc_90000001.xml new file mode 100644 index 00000000..137a510a --- /dev/null +++ b/s7commplus/zlib_dicts/efaeae49_BodyDesc_90000001.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/s7commplus/zlib_dicts/fd69ac74_NWT_90000001.xml b/s7commplus/zlib_dicts/fd69ac74_NWT_90000001.xml new file mode 100644 index 00000000..c8cd6fdb --- /dev/null +++ b/s7commplus/zlib_dicts/fd69ac74_NWT_90000001.xml @@ -0,0 +1 @@ + "Main Program Sweep (Cycle)"this is a the in to an can be for are network anddies ist ein der die das im nach einen kann sein für sind Netzwerk und \ No newline at end of file From 09d73a23ef6875cb58d9880e33a7aa368743f236 Mon Sep 17 00:00:00 2001 From: Gijs Molenaar Date: Thu, 16 Jul 2026 21:55:27 +0200 Subject: [PATCH 4/6] fix: add trailing newlines to zlib dict XML files for pre-commit The end-of-file-fixer hook requires a trailing newline. The loader strips it with rstrip(b"\n") so the Adler-32 checksums stay correct. Co-Authored-By: Claude Opus 4.6 (1M context) --- s7commplus/zlib_dicts/1398a37f_CompilerSettings_90000001.xml | 2 +- s7commplus/zlib_dicts/1bac39f0_DebugInfo_90000001.xml | 2 +- s7commplus/zlib_dicts/3c55436a_LineComm_98000001.xml | 2 +- s7commplus/zlib_dicts/4b8416f0_IntfDesc_90000001.xml | 2 +- s7commplus/zlib_dicts/5814b03b_IdentES_98000001.xml | 2 +- s7commplus/zlib_dicts/66052b13_DebugInfo_IntfDesc_98000001.xml | 2 +- s7commplus/zlib_dicts/79b2bda3_LineComm_90000001.xml | 2 +- s7commplus/zlib_dicts/81d8db20_IdentES_90000002.xml | 2 +- s7commplus/zlib_dicts/845fc605_NWT_98000001.xml | 2 +- s7commplus/zlib_dicts/9b6a3a92_ExtRefData_90000001.xml | 2 +- s7commplus/zlib_dicts/__init__.py | 2 +- s7commplus/zlib_dicts/ab6fa31e_NWC_90000001.xml | 2 +- s7commplus/zlib_dicts/b0155ff8_IntRefData_98000001.xml | 2 +- s7commplus/zlib_dicts/c5d26ac3_NWC_98000001.xml | 2 +- s7commplus/zlib_dicts/ce9b821b_IntfDescTag_90000001.xml | 2 +- s7commplus/zlib_dicts/da4a88f4_IntRefData_90000001.xml | 2 +- s7commplus/zlib_dicts/df91b6bb_IdentES_90000001.xml | 2 +- s7commplus/zlib_dicts/e2729ea1_TagLineComm_90000001.xml | 2 +- s7commplus/zlib_dicts/efaeae49_BodyDesc_90000001.xml | 2 +- s7commplus/zlib_dicts/fd69ac74_NWT_90000001.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/s7commplus/zlib_dicts/1398a37f_CompilerSettings_90000001.xml b/s7commplus/zlib_dicts/1398a37f_CompilerSettings_90000001.xml index c9990100..72c03308 100644 --- a/s7commplus/zlib_dicts/1398a37f_CompilerSettings_90000001.xml +++ b/s7commplus/zlib_dicts/1398a37f_CompilerSettings_90000001.xml @@ -1 +1 @@ -falsetrueChecksFlagsCompilerTypeOptimizationFlagsTargetTypeMC7PlusIECShortWires_x002C__x0020_NativePointerEnableAllCheck_ClassicfalsetrueChecksFlagsCompilerTypeOptimizationFlagsTargetTypeMC7PlusIECShortWires_x002C__x0020_NativePointerEnableAllCheck_Classic \ No newline at end of file + diff --git a/s7commplus/zlib_dicts/3c55436a_LineComm_98000001.xml b/s7commplus/zlib_dicts/3c55436a_LineComm_98000001.xml index 833592ba..d440b140 100644 --- a/s7commplus/zlib_dicts/3c55436a_LineComm_98000001.xml +++ b/s7commplus/zlib_dicts/3c55436a_LineComm_98000001.xml @@ -1 +1 @@ -UId=" RefID="51:52:53:54:55
\ No newline at end of file +
diff --git a/s7commplus/zlib_dicts/5814b03b_IdentES_98000001.xml b/s7commplus/zlib_dicts/5814b03b_IdentES_98000001.xml index 6abcdb5a..2b7f2e59 100644 --- a/s7commplus/zlib_dicts/5814b03b_IdentES_98000001.xml +++ b/s7commplus/zlib_dicts/5814b03b_IdentES_98000001.xml @@ -1 +1 @@ -FCCodeBlockData633706353564000671FalsetrueDBDataBlockData633706353581345975FalsetrueDBDataBlockData633706353587127743TruefalseOB.ProgramCycleCodeBlockData633706354424546519Falsetrue \ No newline at end of file +FCCodeBlockData633706353564000671FalsetrueDBDataBlockData633706353581345975FalsetrueDBDataBlockData633706353587127743TruefalseOB.ProgramCycleCodeBlockData633706354424546519Falsetrue diff --git a/s7commplus/zlib_dicts/66052b13_DebugInfo_IntfDesc_98000001.xml b/s7commplus/zlib_dicts/66052b13_DebugInfo_IntfDesc_98000001.xml index 539db2bb..59e2711e 100644 --- a/s7commplus/zlib_dicts/66052b13_DebugInfo_IntfDesc_98000001.xml +++ b/s7commplus/zlib_dicts/66052b13_DebugInfo_IntfDesc_98000001.xml @@ -1 +1 @@ - BlockNumber=" BlockType=" TypeName=" StructureModifiedTS=" InterfaceModifiedTS=" TypeObjectId=" VersionId=" TypeRId=" RId=" MIRetainPaddedBitSize=" MIVolatilePaddedBitSize=" MIClassicPaddedBitSize=" MIRetainRelativeBitOffset=" MIVolatileRelativeBitOffset=" MIClassicRelativeBitOffset=" Scope=" RefId=" RIdSlots=" IdentUID=" Parameter=" InterfaceGuid=" BlockObjectID=" VersionGuid=" \ No newline at end of file + BlockNumber=" BlockType=" TypeName=" StructureModifiedTS=" InterfaceModifiedTS=" TypeObjectId=" VersionId=" TypeRId=" RId=" MIRetainPaddedBitSize=" MIVolatilePaddedBitSize=" MIClassicPaddedBitSize=" MIRetainRelativeBitOffset=" MIVolatileRelativeBitOffset=" MIClassicRelativeBitOffset=" Scope=" RefId=" RIdSlots=" IdentUID=" Parameter=" InterfaceGuid=" BlockObjectID=" VersionGuid=" diff --git a/s7commplus/zlib_dicts/79b2bda3_LineComm_90000001.xml b/s7commplus/zlib_dicts/79b2bda3_LineComm_90000001.xml index 7422475a..aae6fa1a 100644 --- a/s7commplus/zlib_dicts/79b2bda3_LineComm_90000001.xml +++ b/s7commplus/zlib_dicts/79b2bda3_LineComm_90000001.xml @@ -1 +1 @@ -this is a the in to an can be for are network and dies ist ein der die das im nach einen kann sein für sind Netzwerk und \ No newline at end of file +this is a the in to an can be for are network and dies ist ein der die das im nach einen kann sein für sind Netzwerk und diff --git a/s7commplus/zlib_dicts/81d8db20_IdentES_90000002.xml b/s7commplus/zlib_dicts/81d8db20_IdentES_90000002.xml index da981cd8..531301e7 100644 --- a/s7commplus/zlib_dicts/81d8db20_IdentES_90000002.xml +++ b/s7commplus/zlib_dicts/81d8db20_IdentES_90000002.xml @@ -1 +1 @@ - FC CodeBlockData 633706353564000671 False False true DB DataBlockData 633706353581345975 False False true DB DataBlockData 633706353587127743 True True false OB.ProgramCycle CodeBlockData 633706354424546519 False False true \ No newline at end of file + FC CodeBlockData 633706353564000671 False False true DB DataBlockData 633706353581345975 False False true DB DataBlockData 633706353587127743 True True false OB.ProgramCycle CodeBlockData 633706354424546519 False False true diff --git a/s7commplus/zlib_dicts/845fc605_NWT_98000001.xml b/s7commplus/zlib_dicts/845fc605_NWT_98000001.xml index ca393488..779acfd4 100644 --- a/s7commplus/zlib_dicts/845fc605_NWT_98000001.xml +++ b/s7commplus/zlib_dicts/845fc605_NWT_98000001.xml @@ -1 +1 @@ - "Main Program Sweep (Cycle)"this is a the in to an can be for are network anddies ist ein der die das im nach einen kann sein für sind Netzwerk und \ No newline at end of file + "Main Program Sweep (Cycle)"this is a the in to an can be for are network anddies ist ein der die das im nach einen kann sein für sind Netzwerk und diff --git a/s7commplus/zlib_dicts/9b6a3a92_ExtRefData_90000001.xml b/s7commplus/zlib_dicts/9b6a3a92_ExtRefData_90000001.xml index bfda0948..766eb4ca 100644 --- a/s7commplus/zlib_dicts/9b6a3a92_ExtRefData_90000001.xml +++ b/s7commplus/zlib_dicts/9b6a3a92_ExtRefData_90000001.xml @@ -1 +1 @@ - \ No newline at end of file + diff --git a/s7commplus/zlib_dicts/__init__.py b/s7commplus/zlib_dicts/__init__.py index 24c88bf8..cdde4e54 100644 --- a/s7commplus/zlib_dicts/__init__.py +++ b/s7commplus/zlib_dicts/__init__.py @@ -25,4 +25,4 @@ _adler = int(_adler_hex, 16) _name = _rest.replace("_", " ") ZLIB_DICT_NAMES[_adler] = _name - ZLIB_DICTIONARIES[_adler] = _f.read_bytes() + ZLIB_DICTIONARIES[_adler] = _f.read_bytes().rstrip(b"\n") diff --git a/s7commplus/zlib_dicts/ab6fa31e_NWC_90000001.xml b/s7commplus/zlib_dicts/ab6fa31e_NWC_90000001.xml index 7c4b72f5..121d1bb0 100644 --- a/s7commplus/zlib_dicts/ab6fa31e_NWC_90000001.xml +++ b/s7commplus/zlib_dicts/ab6fa31e_NWC_90000001.xml @@ -1 +1 @@ -this is a the in to an can be for are network anddies ist ein der die das im nach einen kann sein für sind Netzwerk und \ No newline at end of file +this is a the in to an can be for are network anddies ist ein der die das im nach einen kann sein für sind Netzwerk und diff --git a/s7commplus/zlib_dicts/b0155ff8_IntRefData_98000001.xml b/s7commplus/zlib_dicts/b0155ff8_IntRefData_98000001.xml index 5e60ac1e..f1a8a8f8 100644 --- a/s7commplus/zlib_dicts/b0155ff8_IntRefData_98000001.xml +++ b/s7commplus/zlib_dicts/b0155ff8_IntRefData_98000001.xml @@ -1 +1 @@ - StructureModifiedTS=" BlockType=" Section=" Area=" InterfaceFlags="S7_Visible"InterfaceFlags="Mandatory, S7_Visible"TypeObjectId=" TypeRId=" \ No newline at end of file +this is a the in to an can be for are network and dies ist ein der die das im nach einen kann sein für sind Netzwerk und diff --git a/s7commplus/zlib_dicts/ce9b821b_IntfDescTag_90000001.xml b/s7commplus/zlib_dicts/ce9b821b_IntfDescTag_90000001.xml index 19b87d23..aafdbfcf 100644 --- a/s7commplus/zlib_dicts/ce9b821b_IntfDescTag_90000001.xml +++ b/s7commplus/zlib_dicts/ce9b821b_IntfDescTag_90000001.xml @@ -1 +1 @@ - Bool Int DInt Real Bool DInt \ No newline at end of file + Bool Int DInt Real Bool DInt diff --git a/s7commplus/zlib_dicts/da4a88f4_IntRefData_90000001.xml b/s7commplus/zlib_dicts/da4a88f4_IntRefData_90000001.xml index 3df30c06..7003ba43 100644 --- a/s7commplus/zlib_dicts/da4a88f4_IntRefData_90000001.xml +++ b/s7commplus/zlib_dicts/da4a88f4_IntRefData_90000001.xml @@ -1 +1 @@ - \ No newline at end of file + diff --git a/s7commplus/zlib_dicts/df91b6bb_IdentES_90000001.xml b/s7commplus/zlib_dicts/df91b6bb_IdentES_90000001.xml index ac4bed75..08cf8faf 100644 --- a/s7commplus/zlib_dicts/df91b6bb_IdentES_90000001.xml +++ b/s7commplus/zlib_dicts/df91b6bb_IdentES_90000001.xml @@ -1 +1 @@ - FC CodeBlockData 633706353564000671 False true DB DataBlockData 633706353581345975 False true DB DataBlockData 633706353587127743 True false OB.ProgramCycle CodeBlockData 633706354424546519 False true \ No newline at end of file + FC CodeBlockData 633706353564000671 False true DB DataBlockData 633706353581345975 False true DB DataBlockData 633706353587127743 True false OB.ProgramCycle CodeBlockData 633706354424546519 False true diff --git a/s7commplus/zlib_dicts/e2729ea1_TagLineComm_90000001.xml b/s7commplus/zlib_dicts/e2729ea1_TagLineComm_90000001.xml index a7a654f5..b30b3314 100644 --- a/s7commplus/zlib_dicts/e2729ea1_TagLineComm_90000001.xml +++ b/s7commplus/zlib_dicts/e2729ea1_TagLineComm_90000001.xml @@ -1 +1 @@ - this is a the in to an can be for are network anddies ist ein der die das im nach einen kann sein für sind Netzwerk und \ No newline at end of file + this is a the in to an can be for are network anddies ist ein der die das im nach einen kann sein für sind Netzwerk und diff --git a/s7commplus/zlib_dicts/efaeae49_BodyDesc_90000001.xml b/s7commplus/zlib_dicts/efaeae49_BodyDesc_90000001.xml index 137a510a..f25c0a2f 100644 --- a/s7commplus/zlib_dicts/efaeae49_BodyDesc_90000001.xml +++ b/s7commplus/zlib_dicts/efaeae49_BodyDesc_90000001.xml @@ -1 +1 @@ - \ No newline at end of file + diff --git a/s7commplus/zlib_dicts/fd69ac74_NWT_90000001.xml b/s7commplus/zlib_dicts/fd69ac74_NWT_90000001.xml index c8cd6fdb..caa5bc34 100644 --- a/s7commplus/zlib_dicts/fd69ac74_NWT_90000001.xml +++ b/s7commplus/zlib_dicts/fd69ac74_NWT_90000001.xml @@ -1 +1 @@ - "Main Program Sweep (Cycle)"this is a the in to an can be for are network anddies ist ein der die das im nach einen kann sein für sind Netzwerk und \ No newline at end of file + "Main Program Sweep (Cycle)"this is a the in to an can be for are network anddies ist ein der die das im nach einen kann sein für sind Netzwerk und From 0e901842ffe5ac51e88d2f2912b3fc1dae94f253 Mon Sep 17 00:00:00 2001 From: Gijs Molenaar Date: Fri, 17 Jul 2026 08:21:54 +0200 Subject: [PATCH 5/6] fix: resolve CI failures for zlib dictionary files The .xml dictionary files contain raw zlib preset dictionary bytes, not valid standalone XML. Mark them as binary in .gitattributes to prevent CRLF conversion on Windows (which broke Adler-32 checksums), and exclude them from the check-xml pre-commit hook. Co-Authored-By: Claude Opus 4.6 (1M context) --- .gitattributes | 2 ++ .pre-commit-config.yaml | 1 + 2 files changed, 3 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..e7efbbac --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Zlib preset dictionaries: exact bytes matter for Adler-32 checksums +s7commplus/zlib_dicts/*.xml binary diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1d7bfd62..47072175 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,6 +10,7 @@ repos: - id: check-symlinks - id: check-toml - id: check-xml + exclude: ^s7commplus/zlib_dicts/ - id: check-yaml - id: check-illegal-windows-names - id: check-merge-conflict From bdaeddca8c3f2e6a9a44b7ec96a3950e4afbdbe2 Mon Sep 17 00:00:00 2001 From: Gijs Molenaar Date: Fri, 17 Jul 2026 08:29:36 +0200 Subject: [PATCH 6/6] feat: integrate blob decompressor into S7CommPlus client MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add explore_xml() to both sync and async clients — sends an EXPLORE request and decompresses the zlib-compressed XML metadata from the response. Also export decompress_blob and find_and_decompress from the s7commplus package for direct use with raw EXPLORE payloads. Co-Authored-By: Claude Opus 4.6 (1M context) --- s7commplus/__init__.py | 3 +++ s7commplus/async_client.py | 21 +++++++++++++++++++++ s7commplus/client.py | 21 +++++++++++++++++++++ tests/test_blob_decompressor.py | 2 +- tests/test_s7_unit.py | 5 +++++ 5 files changed, 51 insertions(+), 1 deletion(-) diff --git a/s7commplus/__init__.py b/s7commplus/__init__.py index ea33a6ba..0c57d706 100644 --- a/s7commplus/__init__.py +++ b/s7commplus/__init__.py @@ -13,6 +13,7 @@ data = client.db_read(1, 0, 4) """ +from .blob_decompressor import decompress_blob, find_and_decompress from .client import S7CommPlusClient as Client from .async_client import S7CommPlusAsyncClient as AsyncClient from .server import S7CommPlusServer as Server, DataBlock, CPUState @@ -25,4 +26,6 @@ "DataBlock", "CPUState", "S7CommPlusConnection", + "decompress_blob", + "find_and_decompress", ] diff --git a/s7commplus/async_client.py b/s7commplus/async_client.py index 37727c90..d126ebbc 100644 --- a/s7commplus/async_client.py +++ b/s7commplus/async_client.py @@ -30,6 +30,7 @@ parse_server_session_version, ) from .vlq import encode_uint32_vlq, decode_uint32_vlq, decode_uint64_vlq +from .blob_decompressor import find_and_decompress from .client import ( _build_read_payload, _parse_read_response, @@ -478,6 +479,26 @@ async def explore(self, explore_id: int = 0) -> bytes: payload = _build_explore_payload(explore_id) return await self._send_request(FunctionCode.EXPLORE, payload) + async def explore_xml(self, explore_id: int = 0) -> str | None: + """EXPLORE a PLC object and decompress the XML metadata from the response. + + S7-1200/1500 PLCs (FW V4.5+) compress XML metadata — tag definitions, + interface descriptions, line comments, etc. — using zlib with Siemens + preset dictionaries. This method sends an EXPLORE request and + decompresses the first zlib stream found in the response. + + .. warning:: This method is **experimental** and may change. + + Args: + explore_id: Object to explore (0 = root). + + Returns: + Decompressed XML as a UTF-8 string, or ``None`` if the response + contains no recognisable zlib stream. + """ + raw = await self.explore(explore_id) + return find_and_decompress(raw) + async def set_plc_operating_state(self, state: int) -> None: """Set the PLC operating state (start/stop).""" payload = _build_invoke_payload(state) diff --git a/s7commplus/client.py b/s7commplus/client.py index d91c5ff7..fc42eb8c 100644 --- a/s7commplus/client.py +++ b/s7commplus/client.py @@ -8,6 +8,7 @@ from typing import Any, Optional from . import typeinfo +from .blob_decompressor import find_and_decompress from .connection import S7CommPlusConnection from .protocol import FunctionCode, Ids, ElementID, DataType, ObjectId from .vlq import encode_uint32_vlq, decode_uint32_vlq, decode_uint64_vlq @@ -284,6 +285,26 @@ def explore(self, explore_id: int = 0) -> bytes: response = self._connection.send_request(FunctionCode.EXPLORE, payload, integrity_tail=5, reassemble=True) return response + def explore_xml(self, explore_id: int = 0) -> str | None: + """EXPLORE a PLC object and decompress the XML metadata from the response. + + S7-1200/1500 PLCs (FW V4.5+) compress XML metadata — tag definitions, + interface descriptions, line comments, etc. — using zlib with Siemens + preset dictionaries. This method sends an EXPLORE request and + decompresses the first zlib stream found in the response. + + .. warning:: This method is **experimental** and may change. + + Args: + explore_id: Object to explore (0 = root). + + Returns: + Decompressed XML as a UTF-8 string, or ``None`` if the response + contains no recognisable zlib stream. + """ + raw = self.explore(explore_id) + return find_and_decompress(raw) + def set_plc_operating_state(self, state: int) -> None: """Set the PLC operating state (start/stop). diff --git a/tests/test_blob_decompressor.py b/tests/test_blob_decompressor.py index 707b1c9d..420f799e 100644 --- a/tests/test_blob_decompressor.py +++ b/tests/test_blob_decompressor.py @@ -4,7 +4,7 @@ import pytest -from s7commplus.blob_decompressor import decompress_blob, find_and_decompress +from s7commplus import decompress_blob, find_and_decompress from s7commplus.zlib_dicts import ZLIB_DICTIONARIES, ZLIB_DICT_NAMES diff --git a/tests/test_s7_unit.py b/tests/test_s7_unit.py index a684c0a9..1c03ffc8 100644 --- a/tests/test_s7_unit.py +++ b/tests/test_s7_unit.py @@ -506,6 +506,11 @@ def test_explore_not_connected(self) -> None: with pytest.raises(RuntimeError, match="Not connected"): client.explore() + def test_explore_xml_not_connected(self) -> None: + client = S7CommPlusClient() + with pytest.raises(RuntimeError, match="Not connected"): + client.explore_xml() + def test_context_manager_not_connected(self) -> None: """Test that context manager works without connection (disconnect is a no-op).""" with S7CommPlusClient() as client: