€•ü©Œsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ$/translations/zh_CN/core-api/packing”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/zh_TW/core-api/packing”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/it_IT/core-api/packing”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/ja_JP/core-api/packing”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/ko_KR/core-api/packing”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/pt_BR/core-api/packing”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/sp_SP/core-api/packing”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ0Generic bitfield packing and unpacking functions”h]”hŒ0Generic bitfield packing and unpacking functions”…””}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³Œ>/var/lib/git/docbuild/linux/Documentation/core-api/packing.rst”h´Kubh¶)”}”(hhh]”(h»)”}”(hŒProblem statement”h]”hŒProblem statement”…””}”(hhÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhhËh²hh³hÊh´KubhŒ paragraph”“”)”}”(hXšWhen working with hardware, one has to choose between several approaches of interfacing with it. One can memory-map a pointer to a carefully crafted struct over the hardware device's memory region, and access its fields as struct members (potentially declared as bitfields). But writing code this way would make it less portable, due to potential endianness mismatches between the CPU and the hardware device. Additionally, one has to pay close attention when translating register definitions from the hardware documentation into bit field indices for the structs. Also, some hardware (typically networking equipment) tends to group its register fields in ways that violate any reasonable word boundaries (sometimes even 64 bit ones). This creates the inconvenience of having to define "high" and "low" portions of register fields within the struct. A more robust alternative to struct field definitions would be to extract the required fields by shifting the appropriate number of bits. But this would still not protect from endianness mismatches, except if all memory accesses were performed byte-by-byte. Also the code can easily get cluttered, and the high-level idea might get lost among the many bit shifts required. Many drivers take the bit-shifting approach and then attempt to reduce the clutter with tailored macros, but more often than not these macros take shortcuts that still prevent the code from being truly portable.”h]”hX¤When working with hardware, one has to choose between several approaches of interfacing with it. One can memory-map a pointer to a carefully crafted struct over the hardware device’s memory region, and access its fields as struct members (potentially declared as bitfields). But writing code this way would make it less portable, due to potential endianness mismatches between the CPU and the hardware device. Additionally, one has to pay close attention when translating register definitions from the hardware documentation into bit field indices for the structs. Also, some hardware (typically networking equipment) tends to group its register fields in ways that violate any reasonable word boundaries (sometimes even 64 bit ones). This creates the inconvenience of having to define “high†and “low†portions of register fields within the struct. A more robust alternative to struct field definitions would be to extract the required fields by shifting the appropriate number of bits. But this would still not protect from endianness mismatches, except if all memory accesses were performed byte-by-byte. Also the code can easily get cluttered, and the high-level idea might get lost among the many bit shifts required. Many drivers take the bit-shifting approach and then attempt to reduce the clutter with tailored macros, but more often than not these macros take shortcuts that still prevent the code from being truly portable.”…””}”(hhÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KhhËh²hubeh}”(h]”Œproblem-statement”ah ]”h"]”Œproblem statement”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kubh¶)”}”(hhh]”(h»)”}”(hŒ The solution”h]”hŒ The solution”…””}”(hh÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhhôh²hh³hÊh´KubhÝ)”}”(hŒ'This API deals with 2 basic operations:”h]”hŒ'This API deals with 2 basic operations:”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K hhôh²hubhŒ block_quote”“”)”}”(hŒ¸- Packing a CPU-usable number into a memory buffer (with hardware constraints/quirks) - Unpacking a memory buffer (which has hardware constraints/quirks) into a CPU-usable number. ”h]”hŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒSPacking a CPU-usable number into a memory buffer (with hardware constraints/quirks)”h]”hÝ)”}”(hŒSPacking a CPU-usable number into a memory buffer (with hardware constraints/quirks)”h]”hŒSPacking a CPU-usable number into a memory buffer (with hardware constraints/quirks)”…””}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K"hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubj)”}”(hŒ\Unpacking a memory buffer (which has hardware constraints/quirks) into a CPU-usable number. ”h]”hÝ)”}”(hŒ[Unpacking a memory buffer (which has hardware constraints/quirks) into a CPU-usable number.”h]”hŒ[Unpacking a memory buffer (which has hardware constraints/quirks) into a CPU-usable number.”…””}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K$hj8ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1jh³hÊh´K"hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÊh´K"hhôh²hubhÝ)”}”(hŒ—The API offers an abstraction over said hardware constraints and quirks, over CPU endianness and therefore between possible mismatches between the two.”h]”hŒ—The API offers an abstraction over said hardware constraints and quirks, over CPU endianness and therefore between possible mismatches between the two.”…””}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K'hhôh²hubhÝ)”}”(hŒÉThe basic unit of these API functions is the u64. From the CPU's perspective, bit 63 always means bit offset 7 of byte 7, albeit only logically. The question is: where do we lay this bit out in memory?”h]”hŒËThe basic unit of these API functions is the u64. From the CPU’s perspective, bit 63 always means bit offset 7 of byte 7, albeit only logically. The question is: where do we lay this bit out in memory?”…””}”(hjlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K+hhôh²hubhÝ)”}”(hŒÎThe following examples cover the memory layout of a packed u64 field. The byte offsets in the packed buffer are always implicitly 0, 1, ... 7. What the examples show is where the logical bytes and bits sit.”h]”hŒÎThe following examples cover the memory layout of a packed u64 field. The byte offsets in the packed buffer are always implicitly 0, 1, ... 7. What the examples show is where the logical bytes and bits sit.”…””}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K/hhôh²hubhŒenumerated_list”“”)”}”(hhh]”j)”}”(hŒ0Normally (no quirks), we would do it like this: ”h]”hÝ)”}”(hŒ/Normally (no quirks), we would do it like this:”h]”hŒ/Normally (no quirks), we would do it like this:”…””}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K3hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŠh²hh³hÊh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œarabic”Œprefix”hŒsuffix”Œ.”uh1jˆhhôh²hh³hÊh´K3ubhŒ literal_block”“”)”}”(hXU63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 7 6 5 4 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 3 2 1 0”h]”hXU63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 7 6 5 4 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 3 2 1 0”…””}”hj²sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1j°h³hÊh´K7hhôh²hubhÝ)”}”(hX2That is, the MSByte (7) of the CPU-usable u64 sits at memory offset 0, and the LSByte (0) of the u64 sits at memory offset 7. This corresponds to what most folks would regard to as "big endian", where bit i corresponds to the number 2^i. This is also referred to in the code comments as "logical" notation.”h]”hX:That is, the MSByte (7) of the CPU-usable u64 sits at memory offset 0, and the LSByte (0) of the u64 sits at memory offset 7. This corresponds to what most folks would regard to as “big endianâ€, where bit i corresponds to the number 2^i. This is also referred to in the code comments as “logical†notation.”…””}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K 64) pr_err("Field %d-%d too large for 64 bits!\n", startbit, endbit); else pr_err("Cannot store %llx inside bits %d-%d (would truncate)\n", *val, startbit, endbit); } dump_stack(); }”h]”hX^void my_packing(void *buf, u64 *val, int startbit, int endbit, size_t len, enum packing_op op) { int err; /* Adjust quirks accordingly */ err = packing(buf, val, startbit, endbit, len, op, QUIRK_LSW32_IS_FIRST); if (likely(!err)) return; if (err == -EINVAL) { pr_err("Start bit (%d) expected to be larger than end (%d)\n", startbit, endbit); } else if (err == -ERANGE) { if ((startbit - endbit + 1) > 64) pr_err("Field %d-%d too large for 64 bits!\n", startbit, endbit); else pr_err("Cannot store %llx inside bits %d-%d (would truncate)\n", *val, startbit, endbit); } dump_stack(); }”…””}”hjgsbah}”(h]”h ]”h"]”h$]”h&]”jÀjÁŒforce”‰Œlanguage”Œc”Œhighlight_args”}”uh1j°h³hÊh´Kõhj:h²hubeh}”(h]”Œpacking”ah ]”h"]”Œ packing()”ah$]”h&]”uh1hµhj h²hh³hÊh´Këubh¶)”}”(hhh]”(h»)”}”(hŒpack() and unpack()”h]”hŒpack() and unpack()”…””}”(hj…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj‚h²hh³hÊh´MubhÝ)”}”(hŒdThese are const-correct variants of packing(), and eliminate the last "enum packing_op op" argument.”h]”hŒhThese are const-correct variants of packing(), and eliminate the last “enum packing_op op†argument.”…””}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhj‚h²hubhÝ)”}”(hŒNCalling pack(...) is equivalent, and preferred, to calling packing(..., PACK).”h]”hŒNCalling pack(...) is equivalent, and preferred, to calling packing(..., PACK).”…””}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhj‚h²hubhÝ)”}”(hŒRCalling unpack(...) is equivalent, and preferred, to calling packing(..., UNPACK).”h]”hŒRCalling unpack(...) is equivalent, and preferred, to calling packing(..., UNPACK).”…””}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhj‚h²hubeh}”(h]”Œpack-and-unpack”ah ]”h"]”Œpack() and unpack()”ah$]”h&]”uh1hµhj h²hh³hÊh´Mubh¶)”}”(hhh]”(h»)”}”(hŒ!pack_fields() and unpack_fields()”h]”hŒ!pack_fields() and unpack_fields()”…””}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjÅh²hh³hÊh´MubhÝ)”}”(hX&The library exposes optimized functions for the scenario where there are many fields represented in a buffer, and it encourages consumer drivers to avoid repetitive calls to pack() and unpack() for each field, but instead use pack_fields() and unpack_fields(), which reduces the code footprint.”h]”hX&The library exposes optimized functions for the scenario where there are many fields represented in a buffer, and it encourages consumer drivers to avoid repetitive calls to pack() and unpack() for each field, but instead use pack_fields() and unpack_fields(), which reduces the code footprint.”…””}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MhjÅh²hubhÝ)”}”(hŒÏThese APIs use field definitions in arrays of ``struct packed_field_u8`` or ``struct packed_field_u16``, allowing consumer drivers to minimize the size of these arrays according to their custom requirements.”h]”(hŒ.These APIs use field definitions in arrays of ”…””}”(hjäh²hh³Nh´NubhŒliteral”“”)”}”(hŒ``struct packed_field_u8``”h]”hŒstruct packed_field_u8”…””}”(hjîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jìhjäubhŒ or ”…””}”(hjäh²hh³Nh´Nubjí)”}”(hŒ``struct packed_field_u16``”h]”hŒstruct packed_field_u16”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jìhjäubhŒh, allowing consumer drivers to minimize the size of these arrays according to their custom requirements.”…””}”(hjäh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M!hjÅh²hubhÝ)”}”(hŒ½The pack_fields() and unpack_fields() API functions are actually macros which automatically select the appropriate function at compile time, based on the type of the fields array passed in.”h]”hŒ½The pack_fields() and unpack_fields() API functions are actually macros which automatically select the appropriate function at compile time, based on the type of the fields array passed in.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M%hjÅh²hubhÝ)”}”(hX!An additional benefit over pack() and unpack() is that sanity checks on the field definitions are handled at compile time with ``BUILD_BUG_ON`` rather than only when the offending code is executed. These functions return void and wrapping them to handle unexpected errors is not necessary.”h]”(hŒAn additional benefit over pack() and unpack() is that sanity checks on the field definitions are handled at compile time with ”…””}”(hj&h²hh³Nh´Nubjí)”}”(hŒ``BUILD_BUG_ON``”h]”hŒ BUILD_BUG_ON”…””}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jìhj&ubhŒ’ rather than only when the offending code is executed. These functions return void and wrapping them to handle unexpected errors is not necessary.”…””}”(hj&h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M)hjÅh²hubhÝ)”}”(hŒÐIt is recommended, but not required, that you wrap your packed buffer into a structured type with a fixed size. This generally makes it easier for the compiler to enforce that the correct size buffer is used.”h]”hŒÐIt is recommended, but not required, that you wrap your packed buffer into a structured type with a fixed size. This generally makes it easier for the compiler to enforce that the correct size buffer is used.”…””}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M.hjÅh²hubhÝ)”}”(hŒ1Here is an example of how to use the fields APIs:”h]”hŒ1Here is an example of how to use the fields APIs:”…””}”(hjTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M2hjÅh²hubj±)”}”(hXç/* Ordering inside the unpacked structure is flexible and can be different * from the packed buffer. Here, it is optimized to reduce padding. */ struct data { u64 field3; u32 field4; u16 field1; u8 field2; }; #define SIZE 13 typedef struct __packed { u8 buf[SIZE]; } packed_buf_t; static const struct packed_field_u8 fields[] = { PACKED_FIELD(100, 90, struct data, field1), PACKED_FIELD(90, 87, struct data, field2), PACKED_FIELD(86, 30, struct data, field3), PACKED_FIELD(29, 0, struct data, field4), }; void unpack_your_data(const packed_buf_t *buf, struct data *unpacked) { BUILD_BUG_ON(sizeof(*buf) != SIZE; unpack_fields(buf, sizeof(*buf), unpacked, fields, QUIRK_LITTLE_ENDIAN); } void pack_your_data(const struct data *unpacked, packed_buf_t *buf) { BUILD_BUG_ON(sizeof(*buf) != SIZE; pack_fields(buf, sizeof(*buf), unpacked, fields, QUIRK_LITTLE_ENDIAN); }”h]”hXç/* Ordering inside the unpacked structure is flexible and can be different * from the packed buffer. Here, it is optimized to reduce padding. */ struct data { u64 field3; u32 field4; u16 field1; u8 field2; }; #define SIZE 13 typedef struct __packed { u8 buf[SIZE]; } packed_buf_t; static const struct packed_field_u8 fields[] = { PACKED_FIELD(100, 90, struct data, field1), PACKED_FIELD(90, 87, struct data, field2), PACKED_FIELD(86, 30, struct data, field3), PACKED_FIELD(29, 0, struct data, field4), }; void unpack_your_data(const packed_buf_t *buf, struct data *unpacked) { BUILD_BUG_ON(sizeof(*buf) != SIZE; unpack_fields(buf, sizeof(*buf), unpacked, fields, QUIRK_LITTLE_ENDIAN); } void pack_your_data(const struct data *unpacked, packed_buf_t *buf) { BUILD_BUG_ON(sizeof(*buf) != SIZE; pack_fields(buf, sizeof(*buf), unpacked, fields, QUIRK_LITTLE_ENDIAN); }”…””}”hjbsbah}”(h]”h ]”h"]”h$]”h&]”jÀjÁju‰jvjwjx}”uh1j°h³hÊh´M4hjÅh²hubeh}”(h]”Œpack-fields-and-unpack-fields”ah ]”h"]”Œ!pack_fields() and unpack_fields()”ah$]”h&]”uh1hµhj h²hh³hÊh´Mubeh}”(h]”Œ intended-use”ah ]”h"]”Œ intended use”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kâubeh}”(h]”Œ0generic-bitfield-packing-and-unpacking-functions”ah ]”h"]”Œ0generic bitfield packing and unpacking functions”ah$]”h&]”uh1hµhhh²hh³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÊuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hºNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j¬Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÊŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j†jƒhñhîjWjTj jj~j{jj|jÂj¿jvjsuŒ nametypes”}”(j†‰hñ‰jW‰j ‰j~‰j‰j‰jv‰uh}”(jƒh·hîhËjThôjjZj{j j|j:j¿j‚jsjÅuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”(hŒsystem_message”“”)”}”(hhh]”hÝ)”}”(hŒ:Enumerated list start value not ordinal-1: "2" (ordinal 2)”h]”hŒ>Enumerated list start value not ordinal-1: “2†(ordinal 2)”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜhjubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”ŒINFO”Œsource”hÊŒline”Kuh1jhhôh²hh³hÊh´KCubj)”}”(hhh]”hÝ)”}”(hŒ:Enumerated list start value not ordinal-1: "3" (ordinal 3)”h]”hŒ>Enumerated list start value not ordinal-1: “3†(ordinal 3)”…””}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜhj,ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”j)Œsource”hÊŒline”Kuh1jhhôh²hh³hÊh´KPubj)”}”(hhh]”hÝ)”}”(hŒ:Enumerated list start value not ordinal-1: "4" (ordinal 4)”h]”hŒ>Enumerated list start value not ordinal-1: “4†(ordinal 4)”…””}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜhjGubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”j)Œsource”hÊŒline”Kuh1jhhôh²hh³hÊh´K]ubj)”}”(hhh]”hÝ)”}”(hŒ:Enumerated list start value not ordinal-1: "5" (ordinal 5)”h]”hŒ>Enumerated list start value not ordinal-1: “5†(ordinal 5)”…””}”(hjeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜhjbubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”j)Œsource”hÊŒline”Kuh1jhhôh²hh³hÊh´Khubj)”}”(hhh]”hÝ)”}”(hŒ:Enumerated list start value not ordinal-1: "6" (ordinal 6)”h]”hŒ>Enumerated list start value not ordinal-1: “6†(ordinal 6)”…””}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜhj}ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”j)Œsource”hÊŒline”Kuh1jhhôh²hh³hÊh´Kvubj)”}”(hhh]”hÝ)”}”(hŒ:Enumerated list start value not ordinal-1: "7" (ordinal 7)”h]”hŒ>Enumerated list start value not ordinal-1: “7†(ordinal 7)”…””}”(hj›h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜhj˜ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”j)Œsource”hÊŒline”Kuh1jhhôh²hh³hÊh´Kubj)”}”(hhh]”hÝ)”}”(hŒ:Enumerated list start value not ordinal-1: "8" (ordinal 8)”h]”hŒ>Enumerated list start value not ordinal-1: “8†(ordinal 8)”…””}”(hj¶h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜhj³ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”j)Œsource”hÊŒline”Kuh1jhhôh²hh³hÊh´KŒubeŒtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.