€•*IŒ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/bpf/map_of_maps”Œ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/bpf/map_of_maps”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ#/translations/it_IT/bpf/map_of_maps”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ#/translations/ja_JP/bpf/map_of_maps”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ#/translations/ko_KR/bpf/map_of_maps”Œ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/bpf/map_of_maps”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)”}”(hŒ%SPDX-License-Identifier: GPL-2.0-only”h]”hŒ%SPDX-License-Identifier: GPL-2.0-only”…””}”hh£sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1h¡hhhžhhŸŒ=/var/lib/git/docbuild/linux/Documentation/bpf/map_of_maps.rst”h Kubh¢)”}”(hŒ Copyright (C) 2022 Red Hat, Inc.”h]”hŒ Copyright (C) 2022 Red Hat, Inc.”…””}”hh´sbah}”(h]”h ]”h"]”h$]”h&]”h±h²uh1h¡hhhžhhŸh³h KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ8BPF_MAP_TYPE_ARRAY_OF_MAPS and BPF_MAP_TYPE_HASH_OF_MAPS”h]”hŒ8BPF_MAP_TYPE_ARRAY_OF_MAPS and BPF_MAP_TYPE_HASH_OF_MAPS”…””}”(hhÉhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÇhhÄhžhhŸh³h KubhŒnote”“”)”}”(hŒk- ``BPF_MAP_TYPE_ARRAY_OF_MAPS`` and ``BPF_MAP_TYPE_HASH_OF_MAPS`` were introduced in kernel version 4.12”h]”hŒ bullet_list”“”)”}”(hhh]”hŒ list_item”“”)”}”(hŒg``BPF_MAP_TYPE_ARRAY_OF_MAPS`` and ``BPF_MAP_TYPE_HASH_OF_MAPS`` were introduced in kernel version 4.12”h]”hŒ paragraph”“”)”}”(hŒg``BPF_MAP_TYPE_ARRAY_OF_MAPS`` and ``BPF_MAP_TYPE_HASH_OF_MAPS`` were introduced in kernel version 4.12”h]”(hŒliteral”“”)”}”(hŒ``BPF_MAP_TYPE_ARRAY_OF_MAPS``”h]”hŒBPF_MAP_TYPE_ARRAY_OF_MAPS”…””}”(hhðhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîhhêubhŒ and ”…””}”(hhêhžhhŸNh Nubhï)”}”(hŒ``BPF_MAP_TYPE_HASH_OF_MAPS``”h]”hŒBPF_MAP_TYPE_HASH_OF_MAPS”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîhhêubhŒ' were introduced in kernel version 4.12”…””}”(hhêhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h K hhäubah}”(h]”h ]”h"]”h$]”h&]”uh1hâhhßubah}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1hÝhŸh³h K hhÙubah}”(h]”h ]”h"]”h$]”h&]”uh1h×hhÄhžhhŸNh Nubhé)”}”(hX ``BPF_MAP_TYPE_ARRAY_OF_MAPS`` and ``BPF_MAP_TYPE_HASH_OF_MAPS`` provide general purpose support for map in map storage. One level of nesting is supported, where an outer map contains instances of a single type of inner map, for example ``array_of_maps->sock_map``.”h]”(hï)”}”(hŒ``BPF_MAP_TYPE_ARRAY_OF_MAPS``”h]”hŒBPF_MAP_TYPE_ARRAY_OF_MAPS”…””}”(hj2hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîhj.ubhŒ and ”…””}”(hj.hžhhŸNh Nubhï)”}”(hŒ``BPF_MAP_TYPE_HASH_OF_MAPS``”h]”hŒBPF_MAP_TYPE_HASH_OF_MAPS”…””}”(hjDhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîhj.ubhŒ­ provide general purpose support for map in map storage. One level of nesting is supported, where an outer map contains instances of a single type of inner map, for example ”…””}”(hj.hžhhŸNh Nubhï)”}”(hŒ``array_of_maps->sock_map``”h]”hŒarray_of_maps->sock_map”…””}”(hjVhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîhj.ubhŒ.”…””}”(hj.hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h K hhÄhžhubhé)”}”(hŒöWhen creating an outer map, an inner map instance is used to initialize the metadata that the outer map holds about its inner maps. This inner map has a separate lifetime from the outer map and can be deleted after the outer map has been created.”h]”hŒöWhen creating an outer map, an inner map instance is used to initialize the metadata that the outer map holds about its inner maps. This inner map has a separate lifetime from the outer map and can be deleted after the outer map has been created.”…””}”(hjnhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h KhhÄhžhubhé)”}”(hŒ¤The outer map supports element lookup, update and delete from user space using the syscall API. A BPF program is only allowed to do element lookup in the outer map.”h]”hŒ¤The outer map supports element lookup, update and delete from user space using the syscall API. A BPF program is only allowed to do element lookup in the outer map.”…””}”(hj|hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h KhhÄhžhubhØ)”}”(hŒ¼- Multi-level nesting is not supported. - Any BPF map type can be used as an inner map, except for ``BPF_MAP_TYPE_PROG_ARRAY``. - A BPF program cannot update or delete outer map entries.”h]”hÞ)”}”(hhh]”(hã)”}”(hŒ%Multi-level nesting is not supported.”h]”hé)”}”(hj“h]”hŒ%Multi-level nesting is not supported.”…””}”(hj•hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h Khj‘ubah}”(h]”h ]”h"]”h$]”h&]”uh1hâhjŽubhã)”}”(hŒUAny BPF map type can be used as an inner map, except for ``BPF_MAP_TYPE_PROG_ARRAY``.”h]”hé)”}”(hŒUAny BPF map type can be used as an inner map, except for ``BPF_MAP_TYPE_PROG_ARRAY``.”h]”(hŒ9Any BPF map type can be used as an inner map, except for ”…””}”(hj¬hžhhŸNh Nubhï)”}”(hŒ``BPF_MAP_TYPE_PROG_ARRAY``”h]”hŒBPF_MAP_TYPE_PROG_ARRAY”…””}”(hj´hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîhj¬ubhŒ.”…””}”(hj¬hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h Khj¨ubah}”(h]”h ]”h"]”h$]”h&]”uh1hâhjŽubhã)”}”(hŒ8A BPF program cannot update or delete outer map entries.”h]”hé)”}”(hjÔh]”hŒ8A BPF program cannot update or delete outer map entries.”…””}”(hjÖhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h KhjÒubah}”(h]”h ]”h"]”h$]”h&]”uh1hâhjŽubeh}”(h]”h ]”h"]”h$]”h&]”j&j'uh1hÝhŸh³h KhjŠubah}”(h]”h ]”h"]”h$]”h&]”uh1h×hhÄhžhhŸNh Nubhé)”}”(hŒ¾For ``BPF_MAP_TYPE_ARRAY_OF_MAPS`` the key is an unsigned 32-bit integer index into the array. The array is a fixed size with ``max_entries`` elements that are zero initialized when created.”h]”(hŒFor ”…””}”(hjõhžhhŸNh Nubhï)”}”(hŒ``BPF_MAP_TYPE_ARRAY_OF_MAPS``”h]”hŒBPF_MAP_TYPE_ARRAY_OF_MAPS”…””}”(hjýhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîhjõubhŒ\ the key is an unsigned 32-bit integer index into the array. The array is a fixed size with ”…””}”(hjõhžhhŸNh Nubhï)”}”(hŒ``max_entries``”h]”hŒ max_entries”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîhjõubhŒ1 elements that are zero initialized when created.”…””}”(hjõhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h K hhÄhžhubhé)”}”(hXmFor ``BPF_MAP_TYPE_HASH_OF_MAPS`` the key type can be chosen when defining the map. The kernel is responsible for allocating and freeing key/value pairs, up to the max_entries limit that you specify. Hash maps use pre-allocation of hash table elements by default. The ``BPF_F_NO_PREALLOC`` flag can be used to disable pre-allocation when it is too memory expensive.”h]”(hŒFor ”…””}”(hj'hžhhŸNh Nubhï)”}”(hŒ``BPF_MAP_TYPE_HASH_OF_MAPS``”h]”hŒBPF_MAP_TYPE_HASH_OF_MAPS”…””}”(hj/hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîhj'ubhŒë the key type can be chosen when defining the map. The kernel is responsible for allocating and freeing key/value pairs, up to the max_entries limit that you specify. Hash maps use pre-allocation of hash table elements by default. The ”…””}”(hj'hžhhŸNh Nubhï)”}”(hŒ``BPF_F_NO_PREALLOC``”h]”hŒBPF_F_NO_PREALLOC”…””}”(hjAhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîhj'ubhŒL flag can be used to disable pre-allocation when it is too memory expensive.”…””}”(hj'hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h K$hhÄhžhubhÃ)”}”(hhh]”(hÈ)”}”(hŒUsage”h]”hŒUsage”…””}”(hj\hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÇhjYhžhhŸh³h K+ubhÃ)”}”(hhh]”(hÈ)”}”(hŒKernel BPF Helper”h]”hŒKernel BPF Helper”…””}”(hjmhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÇhjjhžhhŸh³h K.ubhÃ)”}”(hhh]”(hÈ)”}”(hŒbpf_map_lookup_elem()”h]”hŒbpf_map_lookup_elem()”…””}”(hj~hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÇhj{hžhhŸh³h K1ubhŒ literal_block”“”)”}”(hŒ?void *bpf_map_lookup_elem(struct bpf_map *map, const void *key)”h]”hŒ?void *bpf_map_lookup_elem(struct bpf_map *map, const void *key)”…””}”hjŽsbah}”(h]”h ]”h"]”h$]”h&]”h±h²Œforce”‰Œlanguage”Œc”Œhighlight_args”}”uh1jŒhŸh³h K3hj{hžhubhé)”}”(hŒšInner maps can be retrieved using the ``bpf_map_lookup_elem()`` helper. This helper returns a pointer to the inner map, or ``NULL`` if no entry was found.”h]”(hŒ&Inner maps can be retrieved using the ”…””}”(hj¡hžhhŸNh Nubhï)”}”(hŒ``bpf_map_lookup_elem()``”h]”hŒbpf_map_lookup_elem()”…””}”(hj©hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîhj¡ubhŒ< helper. This helper returns a pointer to the inner map, or ”…””}”(hj¡hžhhŸNh Nubhï)”}”(hŒ``NULL``”h]”hŒNULL”…””}”(hj»hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîhj¡ubhŒ if no entry was found.”…””}”(hj¡hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h K7hj{hžhubeh}”(h]”Œbpf-map-lookup-elem”ah ]”h"]”Œbpf_map_lookup_elem()”ah$]”h&]”uh1hÂhjjhžhhŸh³h K1ubeh}”(h]”Œkernel-bpf-helper”ah ]”h"]”Œkernel bpf helper”ah$]”h&]”uh1hÂhjYhžhhŸh³h K.ubeh}”(h]”Œusage”ah ]”h"]”Œusage”ah$]”h&]”uh1hÂhhÄhžhhŸh³h K+ubhÃ)”}”(hhh]”(hÈ)”}”(hŒExamples”h]”hŒExamples”…””}”(hjîhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÇhjëhžhhŸh³h K;ubhÃ)”}”(hhh]”(hÈ)”}”(hŒKernel BPF Example”h]”hŒKernel BPF Example”…””}”(hjÿhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÇhjühžhhŸh³h K>ubhé)”}”(hŒ«This snippet shows how to create and initialise an array of devmaps in a BPF program. Note that the outer array can only be modified from user space using the syscall API.”h]”hŒ«This snippet shows how to create and initialise an array of devmaps in a BPF program. Note that the outer array can only be modified from user space using the syscall API.”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h K@hjühžhubj)”}”(hXÒstruct inner_map { __uint(type, BPF_MAP_TYPE_DEVMAP); __uint(max_entries, 10); __type(key, __u32); __type(value, __u32); } inner_map1 SEC(".maps"), inner_map2 SEC(".maps"); struct { __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS); __uint(max_entries, 2); __type(key, __u32); __array(values, struct inner_map); } outer_map SEC(".maps") = { .values = { &inner_map1, &inner_map2 } };”h]”hXÒstruct inner_map { __uint(type, BPF_MAP_TYPE_DEVMAP); __uint(max_entries, 10); __type(key, __u32); __type(value, __u32); } inner_map1 SEC(".maps"), inner_map2 SEC(".maps"); struct { __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS); __uint(max_entries, 2); __type(key, __u32); __array(values, struct inner_map); } outer_map SEC(".maps") = { .values = { &inner_map1, &inner_map2 } };”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”h±h²jœ‰jjžjŸ}”uh1jŒhŸh³h KDhjühžhubhé)”}”(hŒ…See ``progs/test_btf_map_in_map.c`` in ``tools/testing/selftests/bpf`` for more examples of declarative initialisation of outer maps.”h]”(hŒSee ”…””}”(hj*hžhhŸNh Nubhï)”}”(hŒ``progs/test_btf_map_in_map.c``”h]”hŒprogs/test_btf_map_in_map.c”…””}”(hj2hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîhj*ubhŒ in ”…””}”(hj*hžhhŸNh Nubhï)”}”(hŒ``tools/testing/selftests/bpf``”h]”hŒtools/testing/selftests/bpf”…””}”(hjDhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîhj*ubhŒ? for more examples of declarative initialisation of outer maps.”…””}”(hj*hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h KWhjühžhubeh}”(h]”Œkernel-bpf-example”ah ]”h"]”Œkernel bpf example”ah$]”h&]”uh1hÂhjëhžhhŸh³h K>ubhÃ)”}”(hhh]”(hÈ)”}”(hŒ User Space”h]”hŒ User Space”…””}”(hjghžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÇhjdhžhhŸh³h K[ubhé)”}”(hŒ:This snippet shows how to create an array based outer map:”h]”hŒ:This snippet shows how to create an array based outer map:”…””}”(hjuhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h K]hjdhžhubj)”}”(hXint create_outer_array(int inner_fd) { LIBBPF_OPTS(bpf_map_create_opts, opts, .inner_map_fd = inner_fd); int fd; fd = bpf_map_create(BPF_MAP_TYPE_ARRAY_OF_MAPS, "example_array", /* name */ sizeof(__u32), /* key size */ sizeof(__u32), /* value size */ 256, /* max entries */ &opts); /* create opts */ return fd; }”h]”hXint create_outer_array(int inner_fd) { LIBBPF_OPTS(bpf_map_create_opts, opts, .inner_map_fd = inner_fd); int fd; fd = bpf_map_create(BPF_MAP_TYPE_ARRAY_OF_MAPS, "example_array", /* name */ sizeof(__u32), /* key size */ sizeof(__u32), /* value size */ 256, /* max entries */ &opts); /* create opts */ return fd; }”…””}”hjƒsbah}”(h]”h ]”h"]”h$]”h&]”h±h²jœ‰jjžjŸ}”uh1jŒhŸh³h K_hjdhžhubhé)”}”(hŒ;This snippet shows how to add an inner map to an outer map:”h]”hŒ;This snippet shows how to add an inner map to an outer map:”…””}”(hj’hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h Kohjdhžhubj)”}”(hX?int add_devmap(int outer_fd, int index, const char *name) { int fd; fd = bpf_map_create(BPF_MAP_TYPE_DEVMAP, name, sizeof(__u32), sizeof(__u32), 256, NULL); if (fd < 0) return fd; return bpf_map_update_elem(outer_fd, &index, &fd, BPF_ANY); }”h]”hX?int add_devmap(int outer_fd, int index, const char *name) { int fd; fd = bpf_map_create(BPF_MAP_TYPE_DEVMAP, name, sizeof(__u32), sizeof(__u32), 256, NULL); if (fd < 0) return fd; return bpf_map_update_elem(outer_fd, &index, &fd, BPF_ANY); }”…””}”hj sbah}”(h]”h ]”h"]”h$]”h&]”h±h²jœ‰jjžjŸ}”uh1jŒhŸh³h Kqhjdhžhubeh}”(h]”Œ user-space”ah ]”h"]”Œ user space”ah$]”h&]”uh1hÂhjëhžhhŸh³h K[ubeh}”(h]”Œexamples”ah ]”h"]”Œexamples”ah$]”h&]”uh1hÂhhÄhžhhŸh³h K;ubhÃ)”}”(hhh]”(hÈ)”}”(hŒ References”h]”hŒ References”…””}”(hjÂhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÇhj¿hžhhŸh³h KubhÞ)”}”(hhh]”(hã)”}”(hŒDhttps://lore.kernel.org/netdev/20170322170035.923581-3-kafai@fb.com/”h]”hé)”}”(hjÕh]”hŒ reference”“”)”}”(hjÕh]”hŒDhttps://lore.kernel.org/netdev/20170322170035.923581-3-kafai@fb.com/”…””}”(hjÜhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jÕuh1jÚhj×ubah}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h KhjÓubah}”(h]”h ]”h"]”h$]”h&]”uh1hâhjÐhžhhŸh³h Nubhã)”}”(hŒDhttps://lore.kernel.org/netdev/20170322170035.923581-4-kafai@fb.com/”h]”hé)”}”(hjøh]”jÛ)”}”(hjøh]”hŒDhttps://lore.kernel.org/netdev/20170322170035.923581-4-kafai@fb.com/”…””}”(hjýhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jøuh1jÚhjúubah}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h K‚hjöubah}”(h]”h ]”h"]”h$]”h&]”uh1hâhjÐhžhhŸh³h Nubeh}”(h]”h ]”h"]”h$]”h&]”j&j'uh1hÝhŸh³h Khj¿hžhubeh}”(h]”Œ references”ah ]”h"]”Œ references”ah$]”h&]”uh1hÂhhÄhžhhŸh³h Kubeh}”(h]”Œ8bpf-map-type-array-of-maps-and-bpf-map-type-hash-of-maps”ah ]”h"]”Œ8bpf_map_type_array_of_maps and bpf_map_type_hash_of_maps”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”jPŒ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'jèjåjàjÝjØjÕj¼j¹jaj^j´j±j"juŒ nametypes”}”(j*‰jè‰jà‰j؉j¼‰ja‰j´‰j"‰uh}”(j'hÄjåjYjÝjjjÕj{j¹jëj^jüj±jdjj¿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”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nhžhub.