diff --git a/.gitkeep b/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/404.html b/404.html new file mode 100644 index 000000000..e78878fbe --- /dev/null +++ b/404.html @@ -0,0 +1,28 @@ + + + + + +Page Not Found | Vac Research + + + + + + + + + + + + +
+
Skip to main content

Page Not Found

We could not find what you were looking for.
Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+ + + + \ No newline at end of file diff --git a/_og/00cc4eca8797f812cd8356b7c6a6a3f950598d59.png b/_og/00cc4eca8797f812cd8356b7c6a6a3f950598d59.png new file mode 100644 index 000000000..b71f42351 Binary files /dev/null and b/_og/00cc4eca8797f812cd8356b7c6a6a3f950598d59.png differ diff --git a/_og/06e53a08bc25fb0d7db1fa891d83dbae7fbdc908.png b/_og/06e53a08bc25fb0d7db1fa891d83dbae7fbdc908.png new file mode 100644 index 000000000..07563f7a6 Binary files /dev/null and b/_og/06e53a08bc25fb0d7db1fa891d83dbae7fbdc908.png differ diff --git a/_og/085f555be8718292000c5433ccfd37ec8d3a0228.png b/_og/085f555be8718292000c5433ccfd37ec8d3a0228.png new file mode 100644 index 000000000..314cf91ab Binary files /dev/null and b/_og/085f555be8718292000c5433ccfd37ec8d3a0228.png differ diff --git a/_og/0cfaae1c6c49c9af4349cde79c86bc53f394a27a.png b/_og/0cfaae1c6c49c9af4349cde79c86bc53f394a27a.png new file mode 100644 index 000000000..8a905487e Binary files /dev/null and b/_og/0cfaae1c6c49c9af4349cde79c86bc53f394a27a.png differ diff --git a/_og/146849b08b6f48a21e7891db4ba81663317a351c.png b/_og/146849b08b6f48a21e7891db4ba81663317a351c.png new file mode 100644 index 000000000..49fcc485e Binary files /dev/null and b/_og/146849b08b6f48a21e7891db4ba81663317a351c.png differ diff --git a/_og/1a59552d12e931d18433108f3f265dbfff895730.png b/_og/1a59552d12e931d18433108f3f265dbfff895730.png new file mode 100644 index 000000000..a556a27d6 Binary files /dev/null and b/_og/1a59552d12e931d18433108f3f265dbfff895730.png differ diff --git a/_og/20378475ee1692e4124b0301f090a12887720c3e.png b/_og/20378475ee1692e4124b0301f090a12887720c3e.png new file mode 100644 index 000000000..a1272a6b8 Binary files /dev/null and b/_og/20378475ee1692e4124b0301f090a12887720c3e.png differ diff --git a/_og/218ac8e3e600c51b89b88a125ad948ebe37687f5.png b/_og/218ac8e3e600c51b89b88a125ad948ebe37687f5.png new file mode 100644 index 000000000..7bba35a45 Binary files /dev/null and b/_og/218ac8e3e600c51b89b88a125ad948ebe37687f5.png differ diff --git a/_og/22723e8c84d7afe6554a89def8278fd8e1b0126e.png b/_og/22723e8c84d7afe6554a89def8278fd8e1b0126e.png new file mode 100644 index 000000000..0bba8e054 Binary files /dev/null and b/_og/22723e8c84d7afe6554a89def8278fd8e1b0126e.png differ diff --git a/_og/2583d8c15ac0937b60f7baf0c32b207203023974.png b/_og/2583d8c15ac0937b60f7baf0c32b207203023974.png new file mode 100644 index 000000000..ba66c569c Binary files /dev/null and b/_og/2583d8c15ac0937b60f7baf0c32b207203023974.png differ diff --git a/_og/297e0d62455c4a2259d6d3888d2418c16b7c95ac.png b/_og/297e0d62455c4a2259d6d3888d2418c16b7c95ac.png new file mode 100644 index 000000000..c17ead781 Binary files /dev/null and b/_og/297e0d62455c4a2259d6d3888d2418c16b7c95ac.png differ diff --git a/_og/2aca72e4f6dbd013c35e71772e9e5a889d8fb5a9.png b/_og/2aca72e4f6dbd013c35e71772e9e5a889d8fb5a9.png new file mode 100644 index 000000000..7d1f68677 Binary files /dev/null and b/_og/2aca72e4f6dbd013c35e71772e9e5a889d8fb5a9.png differ diff --git a/_og/2ada12cb4d9823d0dd66881faa7632039d6a30ce.png b/_og/2ada12cb4d9823d0dd66881faa7632039d6a30ce.png new file mode 100644 index 000000000..a139059f8 Binary files /dev/null and b/_og/2ada12cb4d9823d0dd66881faa7632039d6a30ce.png differ diff --git a/_og/30d68d28277fb09da7daea03ec0598e878480a85.png b/_og/30d68d28277fb09da7daea03ec0598e878480a85.png new file mode 100644 index 000000000..63a151b69 Binary files /dev/null and b/_og/30d68d28277fb09da7daea03ec0598e878480a85.png differ diff --git a/_og/3274829e49086d13e1cfc22c522bc4f12ae502d4.png b/_og/3274829e49086d13e1cfc22c522bc4f12ae502d4.png new file mode 100644 index 000000000..d699bda27 Binary files /dev/null and b/_og/3274829e49086d13e1cfc22c522bc4f12ae502d4.png differ diff --git a/_og/331c853f6ce2a346cc7dce618a123c69435efe54.png b/_og/331c853f6ce2a346cc7dce618a123c69435efe54.png new file mode 100644 index 000000000..21a189131 Binary files /dev/null and b/_og/331c853f6ce2a346cc7dce618a123c69435efe54.png differ diff --git a/_og/3d76f91787ac833a36d982552c58ec75f7f82909.png b/_og/3d76f91787ac833a36d982552c58ec75f7f82909.png new file mode 100644 index 000000000..5c8e19a15 Binary files /dev/null and b/_og/3d76f91787ac833a36d982552c58ec75f7f82909.png differ diff --git a/_og/40e907f08c1d75049a706943db057f353db864d3.png b/_og/40e907f08c1d75049a706943db057f353db864d3.png new file mode 100644 index 000000000..65e35a980 Binary files /dev/null and b/_og/40e907f08c1d75049a706943db057f353db864d3.png differ diff --git a/_og/42e718078cc727d79714cfa4be597706f53584d2.png b/_og/42e718078cc727d79714cfa4be597706f53584d2.png new file mode 100644 index 000000000..9735a1017 Binary files /dev/null and b/_og/42e718078cc727d79714cfa4be597706f53584d2.png differ diff --git a/_og/434d20a616c8a3a5c61e17fe6d87898771a588b5.png b/_og/434d20a616c8a3a5c61e17fe6d87898771a588b5.png new file mode 100644 index 000000000..c4fc9bc0e Binary files /dev/null and b/_og/434d20a616c8a3a5c61e17fe6d87898771a588b5.png differ diff --git a/_og/46f5f0da40623a6244c21765bcf6a22954b0349b.png b/_og/46f5f0da40623a6244c21765bcf6a22954b0349b.png new file mode 100644 index 000000000..ecb1419ea Binary files /dev/null and b/_og/46f5f0da40623a6244c21765bcf6a22954b0349b.png differ diff --git a/_og/48c5c8812e9905d2a9a9591edc96856c3ba1f1e9.png b/_og/48c5c8812e9905d2a9a9591edc96856c3ba1f1e9.png new file mode 100644 index 000000000..8d94eb24a Binary files /dev/null and b/_og/48c5c8812e9905d2a9a9591edc96856c3ba1f1e9.png differ diff --git a/_og/4ddc90523d8a741ccc195fdb455fc6071079bb8e.png b/_og/4ddc90523d8a741ccc195fdb455fc6071079bb8e.png new file mode 100644 index 000000000..02b86afd1 Binary files /dev/null and b/_og/4ddc90523d8a741ccc195fdb455fc6071079bb8e.png differ diff --git a/_og/53328206aa80662f3eeb21c8e7335ac85e23806c.png b/_og/53328206aa80662f3eeb21c8e7335ac85e23806c.png new file mode 100644 index 000000000..7c9b0b0ce Binary files /dev/null and b/_og/53328206aa80662f3eeb21c8e7335ac85e23806c.png differ diff --git a/_og/550859642ff23b98914be34cb1ed8ec0810bf5d6.png b/_og/550859642ff23b98914be34cb1ed8ec0810bf5d6.png new file mode 100644 index 000000000..5de91637f Binary files /dev/null and b/_og/550859642ff23b98914be34cb1ed8ec0810bf5d6.png differ diff --git a/_og/554c536e64c2bb28f1aad6b09ba77afdb1f11ad8.png b/_og/554c536e64c2bb28f1aad6b09ba77afdb1f11ad8.png new file mode 100644 index 000000000..edc8a46bf Binary files /dev/null and b/_og/554c536e64c2bb28f1aad6b09ba77afdb1f11ad8.png differ diff --git a/_og/56b88e740d69863c377148f55cfc46ce99b87374.png b/_og/56b88e740d69863c377148f55cfc46ce99b87374.png new file mode 100644 index 000000000..03c34248c Binary files /dev/null and b/_og/56b88e740d69863c377148f55cfc46ce99b87374.png differ diff --git a/_og/5cad8c7ce4e3a5854baf187441828f7334e38e93.png b/_og/5cad8c7ce4e3a5854baf187441828f7334e38e93.png new file mode 100644 index 000000000..4fa68ecff Binary files /dev/null and b/_og/5cad8c7ce4e3a5854baf187441828f7334e38e93.png differ diff --git a/_og/5e7cff41edbdbc7622ffd20ba5146ccf7f3ad207.png b/_og/5e7cff41edbdbc7622ffd20ba5146ccf7f3ad207.png new file mode 100644 index 000000000..865499092 Binary files /dev/null and b/_og/5e7cff41edbdbc7622ffd20ba5146ccf7f3ad207.png differ diff --git a/_og/5ec3346d5754337baf800fd526a59166da6adadb.png b/_og/5ec3346d5754337baf800fd526a59166da6adadb.png new file mode 100644 index 000000000..6c9d130a3 Binary files /dev/null and b/_og/5ec3346d5754337baf800fd526a59166da6adadb.png differ diff --git a/_og/62c47d5ff974fb8a119feb8b2b5d26448661fe29.png b/_og/62c47d5ff974fb8a119feb8b2b5d26448661fe29.png new file mode 100644 index 000000000..679e4ee32 Binary files /dev/null and b/_og/62c47d5ff974fb8a119feb8b2b5d26448661fe29.png differ diff --git a/_og/67e86f6b19c24df322757c298b3c8224e0d71596.png b/_og/67e86f6b19c24df322757c298b3c8224e0d71596.png new file mode 100644 index 000000000..87a0540db Binary files /dev/null and b/_og/67e86f6b19c24df322757c298b3c8224e0d71596.png differ diff --git a/_og/6a6b2163bc75f70be2e232059d46fb85d5c624f1.png b/_og/6a6b2163bc75f70be2e232059d46fb85d5c624f1.png new file mode 100644 index 000000000..5860ba9fe Binary files /dev/null and b/_og/6a6b2163bc75f70be2e232059d46fb85d5c624f1.png differ diff --git a/_og/6a8c96c8fc51908772e26135c8f08c96773bedf6.png b/_og/6a8c96c8fc51908772e26135c8f08c96773bedf6.png new file mode 100644 index 000000000..5ff55c3a2 Binary files /dev/null and b/_og/6a8c96c8fc51908772e26135c8f08c96773bedf6.png differ diff --git a/_og/6b0924a0774a756ece285f9162ca92834847bcae.png b/_og/6b0924a0774a756ece285f9162ca92834847bcae.png new file mode 100644 index 000000000..c14b26339 Binary files /dev/null and b/_og/6b0924a0774a756ece285f9162ca92834847bcae.png differ diff --git a/_og/6d33920f4c680c80b4c5fcbd26a5c71ee1f91fe9.png b/_og/6d33920f4c680c80b4c5fcbd26a5c71ee1f91fe9.png new file mode 100644 index 000000000..4b303c6c0 Binary files /dev/null and b/_og/6d33920f4c680c80b4c5fcbd26a5c71ee1f91fe9.png differ diff --git a/_og/715873ad56e29900c7e94d8275eecae340249dd7.png b/_og/715873ad56e29900c7e94d8275eecae340249dd7.png new file mode 100644 index 000000000..05565dc78 Binary files /dev/null and b/_og/715873ad56e29900c7e94d8275eecae340249dd7.png differ diff --git a/_og/7226c48ee030f4113c99659fad19b59eb89d51aa.png b/_og/7226c48ee030f4113c99659fad19b59eb89d51aa.png new file mode 100644 index 000000000..58b03dab3 Binary files /dev/null and b/_og/7226c48ee030f4113c99659fad19b59eb89d51aa.png differ diff --git a/_og/7512342b22befcf40ccd2fc43975099d6882ea31.png b/_og/7512342b22befcf40ccd2fc43975099d6882ea31.png new file mode 100644 index 000000000..514cf6607 Binary files /dev/null and b/_og/7512342b22befcf40ccd2fc43975099d6882ea31.png differ diff --git a/_og/7537d98bae0bd0fb9910c9beddd7591152eb34f7.png b/_og/7537d98bae0bd0fb9910c9beddd7591152eb34f7.png new file mode 100644 index 000000000..555798b51 Binary files /dev/null and b/_og/7537d98bae0bd0fb9910c9beddd7591152eb34f7.png differ diff --git a/_og/76d589c0a80b6687dca35b01b271da8ed4a79adb.png b/_og/76d589c0a80b6687dca35b01b271da8ed4a79adb.png new file mode 100644 index 000000000..d761b682c Binary files /dev/null and b/_og/76d589c0a80b6687dca35b01b271da8ed4a79adb.png differ diff --git a/_og/798efa537a841d65929c06d86356ac87aa7ce38c.png b/_og/798efa537a841d65929c06d86356ac87aa7ce38c.png new file mode 100644 index 000000000..f584e7e6b Binary files /dev/null and b/_og/798efa537a841d65929c06d86356ac87aa7ce38c.png differ diff --git a/_og/7c6ad51813ce244149f93043aef887b64ef1a58a.png b/_og/7c6ad51813ce244149f93043aef887b64ef1a58a.png new file mode 100644 index 000000000..96e0cc08e Binary files /dev/null and b/_og/7c6ad51813ce244149f93043aef887b64ef1a58a.png differ diff --git a/_og/811153c9e63aebc5decb91c543274e82a22e8029.png b/_og/811153c9e63aebc5decb91c543274e82a22e8029.png new file mode 100644 index 000000000..62644a640 Binary files /dev/null and b/_og/811153c9e63aebc5decb91c543274e82a22e8029.png differ diff --git a/_og/81440f87d85af9928342ac156ce68128d74574b5.png b/_og/81440f87d85af9928342ac156ce68128d74574b5.png new file mode 100644 index 000000000..102782da8 Binary files /dev/null and b/_og/81440f87d85af9928342ac156ce68128d74574b5.png differ diff --git a/_og/86fc32e546a9dd50f10c4d3ed28e72b1929361ab.png b/_og/86fc32e546a9dd50f10c4d3ed28e72b1929361ab.png new file mode 100644 index 000000000..b540764e7 Binary files /dev/null and b/_og/86fc32e546a9dd50f10c4d3ed28e72b1929361ab.png differ diff --git a/_og/8e24caf9f8c441f6bec8e88cda94a227b885e194.png b/_og/8e24caf9f8c441f6bec8e88cda94a227b885e194.png new file mode 100644 index 000000000..0693f5dbe Binary files /dev/null and b/_og/8e24caf9f8c441f6bec8e88cda94a227b885e194.png differ diff --git a/_og/8f01bae043fd695bb53cc1e24f645187f72d4c66.png b/_og/8f01bae043fd695bb53cc1e24f645187f72d4c66.png new file mode 100644 index 000000000..2f8afcd99 Binary files /dev/null and b/_og/8f01bae043fd695bb53cc1e24f645187f72d4c66.png differ diff --git a/_og/90739f42616e1d4948f564dfacf238c9db6be27e.png b/_og/90739f42616e1d4948f564dfacf238c9db6be27e.png new file mode 100644 index 000000000..9f44c4df2 Binary files /dev/null and b/_og/90739f42616e1d4948f564dfacf238c9db6be27e.png differ diff --git a/_og/91dd4d6dae5aa135727fb3b2a386ccdfc6588b04.png b/_og/91dd4d6dae5aa135727fb3b2a386ccdfc6588b04.png new file mode 100644 index 000000000..0a7055b09 Binary files /dev/null and b/_og/91dd4d6dae5aa135727fb3b2a386ccdfc6588b04.png differ diff --git a/_og/94e4e27879964843dccf9d1b459bb75b3fa91a3e.png b/_og/94e4e27879964843dccf9d1b459bb75b3fa91a3e.png new file mode 100644 index 000000000..76069c81a Binary files /dev/null and b/_og/94e4e27879964843dccf9d1b459bb75b3fa91a3e.png differ diff --git a/_og/99faf979051d1d2716e0864f371a1f1d16755fb5.png b/_og/99faf979051d1d2716e0864f371a1f1d16755fb5.png new file mode 100644 index 000000000..0eb3d55e5 Binary files /dev/null and b/_og/99faf979051d1d2716e0864f371a1f1d16755fb5.png differ diff --git a/_og/9b2458a41c11b87219f872f795ed19bbe8d67392.png b/_og/9b2458a41c11b87219f872f795ed19bbe8d67392.png new file mode 100644 index 000000000..484642c31 Binary files /dev/null and b/_og/9b2458a41c11b87219f872f795ed19bbe8d67392.png differ diff --git a/_og/9ca686a136556ccb560f7aa09da63d9efae975c4.png b/_og/9ca686a136556ccb560f7aa09da63d9efae975c4.png new file mode 100644 index 000000000..313dafc03 Binary files /dev/null and b/_og/9ca686a136556ccb560f7aa09da63d9efae975c4.png differ diff --git a/_og/a4a3ddddf1f28c9ce5b25e324d760c82570f0f44.png b/_og/a4a3ddddf1f28c9ce5b25e324d760c82570f0f44.png new file mode 100644 index 000000000..0f97c2117 Binary files /dev/null and b/_og/a4a3ddddf1f28c9ce5b25e324d760c82570f0f44.png differ diff --git a/_og/a871973635f0a705ebb08380876bfce1cb883dd4.png b/_og/a871973635f0a705ebb08380876bfce1cb883dd4.png new file mode 100644 index 000000000..d75ac03ce Binary files /dev/null and b/_og/a871973635f0a705ebb08380876bfce1cb883dd4.png differ diff --git a/_og/a9cef5ac854eb839977e644b1ba041c2bd34a017.png b/_og/a9cef5ac854eb839977e644b1ba041c2bd34a017.png new file mode 100644 index 000000000..491d77898 Binary files /dev/null and b/_og/a9cef5ac854eb839977e644b1ba041c2bd34a017.png differ diff --git a/_og/ac7bf8d88c8d76034afce0a63a2551ef5a5df9ae.png b/_og/ac7bf8d88c8d76034afce0a63a2551ef5a5df9ae.png new file mode 100644 index 000000000..26e39dddd Binary files /dev/null and b/_og/ac7bf8d88c8d76034afce0a63a2551ef5a5df9ae.png differ diff --git a/_og/aecd23b5a34445a1fddf2b508b1a1d0d50203533.png b/_og/aecd23b5a34445a1fddf2b508b1a1d0d50203533.png new file mode 100644 index 000000000..897d5bf71 Binary files /dev/null and b/_og/aecd23b5a34445a1fddf2b508b1a1d0d50203533.png differ diff --git a/_og/aefbdbc78162a9c2ff8f03056fb0826041812c2a.png b/_og/aefbdbc78162a9c2ff8f03056fb0826041812c2a.png new file mode 100644 index 000000000..cb89cb54c Binary files /dev/null and b/_og/aefbdbc78162a9c2ff8f03056fb0826041812c2a.png differ diff --git a/_og/b614aba988db461b07ac57a9594af8c310ca2f7b.png b/_og/b614aba988db461b07ac57a9594af8c310ca2f7b.png new file mode 100644 index 000000000..def62ddb1 Binary files /dev/null and b/_og/b614aba988db461b07ac57a9594af8c310ca2f7b.png differ diff --git a/_og/b6a55ab4cb1a21f7e63cd5e4e426882330996586.png b/_og/b6a55ab4cb1a21f7e63cd5e4e426882330996586.png new file mode 100644 index 000000000..aacd68db9 Binary files /dev/null and b/_og/b6a55ab4cb1a21f7e63cd5e4e426882330996586.png differ diff --git a/_og/b86d4a3f68a75ea79fd30f49d945c17a70b7da4f.png b/_og/b86d4a3f68a75ea79fd30f49d945c17a70b7da4f.png new file mode 100644 index 000000000..7bfe1f0b0 Binary files /dev/null and b/_og/b86d4a3f68a75ea79fd30f49d945c17a70b7da4f.png differ diff --git a/_og/bdf976aa65c032954103df8cee1d94d5ae0439a1.png b/_og/bdf976aa65c032954103df8cee1d94d5ae0439a1.png new file mode 100644 index 000000000..6ab8a74fc Binary files /dev/null and b/_og/bdf976aa65c032954103df8cee1d94d5ae0439a1.png differ diff --git a/_og/bdfc40c2e2c4dcd17f6c7d610729166e190f4b7e.png b/_og/bdfc40c2e2c4dcd17f6c7d610729166e190f4b7e.png new file mode 100644 index 000000000..69758c5ba Binary files /dev/null and b/_og/bdfc40c2e2c4dcd17f6c7d610729166e190f4b7e.png differ diff --git a/_og/c041efb8b5a1fe10cb145ea5a07b6a6fc208a018.png b/_og/c041efb8b5a1fe10cb145ea5a07b6a6fc208a018.png new file mode 100644 index 000000000..0581781f7 Binary files /dev/null and b/_og/c041efb8b5a1fe10cb145ea5a07b6a6fc208a018.png differ diff --git a/_og/c1a777461de643f8968ec1da4ebb2c21844ea998.png b/_og/c1a777461de643f8968ec1da4ebb2c21844ea998.png new file mode 100644 index 000000000..60a0c90d9 Binary files /dev/null and b/_og/c1a777461de643f8968ec1da4ebb2c21844ea998.png differ diff --git a/_og/c29fc42a8e6cef11b33838e51e555bfeca4359f1.png b/_og/c29fc42a8e6cef11b33838e51e555bfeca4359f1.png new file mode 100644 index 000000000..2f58ac86e Binary files /dev/null and b/_og/c29fc42a8e6cef11b33838e51e555bfeca4359f1.png differ diff --git a/_og/c6b5ad6beba8173c875319f497b7c65ff00e5f20.png b/_og/c6b5ad6beba8173c875319f497b7c65ff00e5f20.png new file mode 100644 index 000000000..dcb080da3 Binary files /dev/null and b/_og/c6b5ad6beba8173c875319f497b7c65ff00e5f20.png differ diff --git a/_og/c7c41125eb8e40700f2f1a5188058d86fe21613d.png b/_og/c7c41125eb8e40700f2f1a5188058d86fe21613d.png new file mode 100644 index 000000000..2a49d09dc Binary files /dev/null and b/_og/c7c41125eb8e40700f2f1a5188058d86fe21613d.png differ diff --git a/_og/cbd485f69fb6f0082d5fda2fce5fa627c63f17a8.png b/_og/cbd485f69fb6f0082d5fda2fce5fa627c63f17a8.png new file mode 100644 index 000000000..c21e4d7f6 Binary files /dev/null and b/_og/cbd485f69fb6f0082d5fda2fce5fa627c63f17a8.png differ diff --git a/_og/cef4b484e58a9aa480fc98ef8c741ebb909fdd77.png b/_og/cef4b484e58a9aa480fc98ef8c741ebb909fdd77.png new file mode 100644 index 000000000..2d52d8e57 Binary files /dev/null and b/_og/cef4b484e58a9aa480fc98ef8c741ebb909fdd77.png differ diff --git a/_og/cf2dfc037f7802cd0346bcedb59cd89a99eafbc2.png b/_og/cf2dfc037f7802cd0346bcedb59cd89a99eafbc2.png new file mode 100644 index 000000000..ae7b5698e Binary files /dev/null and b/_og/cf2dfc037f7802cd0346bcedb59cd89a99eafbc2.png differ diff --git a/_og/cf3a2016218f9e125fe52d714d2daa7a2e776de5.png b/_og/cf3a2016218f9e125fe52d714d2daa7a2e776de5.png new file mode 100644 index 000000000..72d5375cf Binary files /dev/null and b/_og/cf3a2016218f9e125fe52d714d2daa7a2e776de5.png differ diff --git a/_og/d0576c942d3702f2cb829c9b5d2ea7edb56f5dcd.png b/_og/d0576c942d3702f2cb829c9b5d2ea7edb56f5dcd.png new file mode 100644 index 000000000..1a6878456 Binary files /dev/null and b/_og/d0576c942d3702f2cb829c9b5d2ea7edb56f5dcd.png differ diff --git a/_og/dd8326d9594fe43cf21cc4fcaf212033e9ad5514.png b/_og/dd8326d9594fe43cf21cc4fcaf212033e9ad5514.png new file mode 100644 index 000000000..8e510f889 Binary files /dev/null and b/_og/dd8326d9594fe43cf21cc4fcaf212033e9ad5514.png differ diff --git a/_og/e0159c078487b732c6592f9b5dfe8e3b2911783f.png b/_og/e0159c078487b732c6592f9b5dfe8e3b2911783f.png new file mode 100644 index 000000000..a7dae5bf8 Binary files /dev/null and b/_og/e0159c078487b732c6592f9b5dfe8e3b2911783f.png differ diff --git a/_og/e5ad7f0287111d40a7a4362cc1d58c55f1bab2b9.png b/_og/e5ad7f0287111d40a7a4362cc1d58c55f1bab2b9.png new file mode 100644 index 000000000..6f46a46b0 Binary files /dev/null and b/_og/e5ad7f0287111d40a7a4362cc1d58c55f1bab2b9.png differ diff --git a/_og/e5e60ba34bd3108e8a6a269e18a8da32881b4a4d.png b/_og/e5e60ba34bd3108e8a6a269e18a8da32881b4a4d.png new file mode 100644 index 000000000..77af3557d Binary files /dev/null and b/_og/e5e60ba34bd3108e8a6a269e18a8da32881b4a4d.png differ diff --git a/_og/e7bab32753259058ce7c9174a0a4f39b25ab9752.png b/_og/e7bab32753259058ce7c9174a0a4f39b25ab9752.png new file mode 100644 index 000000000..c5c13867d Binary files /dev/null and b/_og/e7bab32753259058ce7c9174a0a4f39b25ab9752.png differ diff --git a/_og/e816e7c23abc601cd18dd56b2aeb491f46b80f20.png b/_og/e816e7c23abc601cd18dd56b2aeb491f46b80f20.png new file mode 100644 index 000000000..a25c318ab Binary files /dev/null and b/_og/e816e7c23abc601cd18dd56b2aeb491f46b80f20.png differ diff --git a/_og/ed475274bf4ed65539014cc1b4e1033c48758d76.png b/_og/ed475274bf4ed65539014cc1b4e1033c48758d76.png new file mode 100644 index 000000000..55b74c522 Binary files /dev/null and b/_og/ed475274bf4ed65539014cc1b4e1033c48758d76.png differ diff --git a/_og/ee381bb59aac0197bcf322a03d6ccb7b874ca72b.png b/_og/ee381bb59aac0197bcf322a03d6ccb7b874ca72b.png new file mode 100644 index 000000000..d960ce406 Binary files /dev/null and b/_og/ee381bb59aac0197bcf322a03d6ccb7b874ca72b.png differ diff --git a/_og/f1f3b9cb3023c92463b570cd3fdf3110a82c3714.png b/_og/f1f3b9cb3023c92463b570cd3fdf3110a82c3714.png new file mode 100644 index 000000000..20fcc8ac2 Binary files /dev/null and b/_og/f1f3b9cb3023c92463b570cd3fdf3110a82c3714.png differ diff --git a/_og/f2d191fdc08785ab47c519504e9bf8e0ad83f086.png b/_og/f2d191fdc08785ab47c519504e9bf8e0ad83f086.png new file mode 100644 index 000000000..68844d963 Binary files /dev/null and b/_og/f2d191fdc08785ab47c519504e9bf8e0ad83f086.png differ diff --git a/_og/f710a96dcf7cb1aff19342eca8095864ed9c46ca.png b/_og/f710a96dcf7cb1aff19342eca8095864ed9c46ca.png new file mode 100644 index 000000000..2e88cb914 Binary files /dev/null and b/_og/f710a96dcf7cb1aff19342eca8095864ed9c46ca.png differ diff --git a/_og/f739754af8b18cf3c0bf8777555830e4fd84e73d.png b/_og/f739754af8b18cf3c0bf8777555830e4fd84e73d.png new file mode 100644 index 000000000..f7543a28e Binary files /dev/null and b/_og/f739754af8b18cf3c0bf8777555830e4fd84e73d.png differ diff --git a/_og/fa9d91c85de053cb3b2d48299084dbb56d8aa711.png b/_og/fa9d91c85de053cb3b2d48299084dbb56d8aa711.png new file mode 100644 index 000000000..cc2e7bd70 Binary files /dev/null and b/_og/fa9d91c85de053cb3b2d48299084dbb56d8aa711.png differ diff --git a/_og/fe061d493716ba1d7a5f86775337c4fa1dc64d11.png b/_og/fe061d493716ba1d7a5f86775337c4fa1dc64d11.png new file mode 100644 index 000000000..aafcfcbda Binary files /dev/null and b/_og/fe061d493716ba1d7a5f86775337c4fa1dc64d11.png differ diff --git a/_og/ff1054ee0389b786e3a371bfe361d8c1357db3f8.png b/_og/ff1054ee0389b786e3a371bfe361d8c1357db3f8.png new file mode 100644 index 000000000..bea3d9a6c Binary files /dev/null and b/_og/ff1054ee0389b786e3a371bfe361d8c1357db3f8.png differ diff --git a/assets/css/styles.7f69a75a.css b/assets/css/styles.7f69a75a.css new file mode 100644 index 000000000..1b3995e2d --- /dev/null +++ b/assets/css/styles.7f69a75a.css @@ -0,0 +1 @@ +.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}[data-theme=dark],html[data-theme=dark]{--ifm-color-scheme:dark}:root,[data-theme=light]{--ifm-color-scheme:light}code,pre code{--lsd-typography-generic-font-family:monospace}.katex .mathit,.katex .textit,.text--italic{font-style:italic}.katex .vlist-t,table{border-collapse:collapse;table-layout:fixed}.button,.dropdown__link,.footer__item,.katex .base,.text--truncate{white-space:nowrap}.toggleButton_dl49,html{-webkit-tap-highlight-color:transparent}*,.buttonGroup_Qu4e button,.dropdownNavbarItem_o23I,.events .theme-doc-breadcrumbs .breadcrumbs__item--active,.katex .angl,.katex .fbox,.katex .fcolorbox,.root_xZfc,.toggle_K23S{box-sizing:border-box}.clean-list,.containsTaskList_mC6p,.dropdown__menu,.menu__list,.root_N57j ul li{list-style:none}:root{--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-radius:0.4rem;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-weight-light:300;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-color:var(--ifm-font-color-base);--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-color:var(--ifm-color-white);--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-sidebar-width:83vw;--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active)}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);text-rendering:optimizelegibility}body{background-color:rgb(var(--lsd-surface-primary));height:auto!important;counter-reset:a b}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.blog-archive-page .main-wrapper main>section,.margin-top--none{margin-top:0!important}.margin-bottom--none,.markdown>:last-child{margin-bottom:0!important}.main-wrapper>.container,.margin-vert--none{margin-bottom:0!important;margin-top:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit;color:rgb(var(--lsd-text-primary))}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);overflow:auto;padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}.sub1,h1{font-size:var(--ifm-h1-font-size)}.sub2,h2{font-size:var(--ifm-h2-font-size)}.sub3,h3{font-size:var(--ifm-h3-font-size)}.sub4,h4{font-size:var(--ifm-h4-font-size)}.sub5,h5{font-size:var(--ifm-h5-font-size)}.sub6,h6,small{font-size:var(--ifm-h6-font-size)}.container_lyt7,.container_lyt7>svg,img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading));letter-spacing:-1.5px}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary,[data-theme=dark] .root_JWD1>div>div{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.katex .accent>.vlist-t,.katex .mfrac>span>span,.katex .mover,.katex .mtable .col-align-c>.vlist-t,.katex .munder,.katex .op-limits>.vlist-t,.katex .x-arrow,.text--center{text-align:center}.katex .msupsub,.katex .mtable .col-align-l>.vlist-t,.katex .svg-align,.text--left{text-align:left}.text--justify{text-align:justify}.katex .mtable .col-align-r>.vlist-t,.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.alert__heading,.text--uppercase,table td strong,table th{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--truncate{overflow:hidden;text-overflow:ellipsis}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.admonitionHeading_JPfy,.events .theme-doc-breadcrumbs .breadcrumbs__link{text-transform:capitalize}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.icon_sZn2.fill_fkan,.icon_sZn2.fill_fkan *,.katex svg{fill:currentColor}.icon_sZn2.stroke_j3wH,.icon_sZn2.stroke_j3wH *,.katex svg{stroke:currentColor}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.breadcrumbs__item,.close:hover,.table-of-contents__link--active code{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.admonitionIcon_BGV6,.root_JWD1>span svg{vertical-align:middle}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navWrapper_ybYI,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%);display:none}.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after,.menu__list-item-collapsible>a[aria-expanded=false]>svg{transform:rotate(90deg)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_hrrU article>:first-child,.docItemContainer_hrrU header+*,.footer__item{margin-top:0}.admonitionContent_iozl>:last-child,.footer__items{margin-bottom:0}.main-wrapper>main,.table-of-contents,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;top:0;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;visibility:hidden}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.icon_S7Kx,.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.blog-wrapper>.container>.row>aside>nav>ul li,.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.cursor-pointer,.pills__item,.tabs__item{cursor:pointer}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);position:fixed;transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;position:fixed;right:0;transition-property:opacity,visibility}.footer,.row{position:relative}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);position:relative;text-align:left;top:-.5rem}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover{text-decoration:none}.pagination-nav{grid-gap:var(--ifm-spacing-horizontal);display:grid;gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.footer>div,.grid{grid-template-columns:repeat(24,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.blog-wrapper>.container>.row>aside>nav>div:first-child,.blog-wrapper>.container>.row>aside>nav>ul li a{border-left:1px solid #0000;font-size:var(--lsd-subtitle2-fontSize)!important;font-weight:var(--lsd-subtitle2-fontWeight)!important;line-height:var(--lsd-subtitle2-lineHeight)!important}.dropdown__link:hover,.footer__item a{text-decoration:underline}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar__left-items>.navbar__item:first-of-type,.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}:root{--docusaurus-progress-bar-color:var(--ifm-color-primary);--content-padding:16px;--container-max-width:1072px;--pagination-nav-margin-top:96px;--ifm-navbar-link-color:rgb(var(--lsd-text-primary));--ifm-navbar-background-color:rgb(var(--lsd-surface-primary));--ifm-dropdown-link-color:rgb(var(--lsd-text-primary));--ifm-dropdown-hover-background-color:rgb(var(--lsd-surface-secondary));--ifm-background-color:rgb(var(--lsd-surface-primary));--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-primary:rgb(var(--lsd-theme-primary));--ifm-color-secondary:rgb(var(--lsd-theme-secondary));--prism-background-color:rgb(var(--lsd-theme-primary));--ifm-color-gray-0:rgb(var(--lsd-surface-primary));--ifm-color-gray-100:#f8f8fa;--ifm-color-gray-200:#f7f7f8;--ifm-color-gray-300:#eeeef0;--ifm-color-gray-400:#c0c0c2;--ifm-color-gray-500:#828285;--ifm-color-gray-600:#474747;--ifm-color-gray-700:#373738;--ifm-color-gray-800:#1a1a1a;--ifm-color-gray-900:#151515;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-font-color-base-inverse:var(--ifm-color-black);--docusaurus-highlighted-code-line-bg:#ffffff26;--ifm-card-background-color:var(--ifm-color-gray-100)!important;--ifm-alert-foreground-color:var(--ifm-color-gray-700);--ifm-button-background-color:rgb(var(--lsd-surface-primary));--ifm-global-border-width:1px;--ifm-global-radius:0.6rem;--ifm-hover-overlay:#0000000d;--ifm-font-family-base:var(--lsd-typography-generic-font-family);--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--lgs-font-family-secondary:Georgia,"Times New Roman",serif;--ifm-font-size-base:100%;--ifm-line-height-base:1.625;--ifm-font-size-secondary:100%;--ifm-line-height-secondary:1.5;--ifm-font-weight-light:400;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:400;--ifm-font-weight-bold:600;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-h1-font-size:var(--lsd-h1-fontSize);--ifm-h2-font-size:var(--lsd-h2-fontSize);--ifm-h3-font-size:var(--lsd-h3-fontSize);--ifm-h4-font-size:var(--lsd-h4-fontSize);--ifm-h5-font-size:var(--lsd-h5-fontSize);--ifm-h6-font-size:var(--lsd-h6-fontSize);--ifm-global-spacing:24px;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:0.75rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:24px;--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-code-background:rgb(var(--lsd-text-primary))!important;--ifm-pre-padding:1.125rem;--ifm-link-decoration:none;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-border-left-width:3px;--ifm-blockquote-shadow:none;--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-button-padding-vertical:0.4rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-border-radius:var(--ifm-global-radius);--ifm-card-horizontal-spacing:var(--ifm-spacing-horizontal);--ifm-card-vertical-spacing:var(--ifm-spacing-vertical);--ifm-footer-link-horizontal-spacing:0;--ifm-footer-padding-horizontal:var(--content-padding);--ifm-footer-padding-vertical:24px;--ifm-footer-background-color:#0000;--ifm-menu-link-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-menu-link-padding-vertical:0.25rem;--ifm-menu-color:rgb(var(--lsd-text-primary),0.6);--ifm-menu-color-background-active:#0000;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-height:64px;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-padding-horizontal:var(--content-padding);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)/3);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:100vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pills-spacing:0.125rem;--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--ifm-alert-background-color:#0000;--ifm-color-secondary-contrast-background:#0000;--ifm-color-success-contrast-background:#0000;--ifm-color-info-contrast-background:#0000;--ifm-color-warning-contrast-background:#0000;--ifm-color-danger-contrast-background:#0000;--ifm-alert-border-radius:none;--note:#d4d5d8;--tip:#6ace4b;--caution:#ddaa39;--danger:#e46967;--info:#68b1d0;--ifm-color-secondary-dark:var(--note);--ifm-color-secondary-light:var(--note);--ifm-color-success-dark:var(--tip);--ifm-color-success-light:var(--tip);--ifm-color-info-dark:var(--info);--ifm-color-info-light:var(--info);--ifm-color-warning-dark:var(--caution);--ifm-color-warning-light:var(--caution);--ifm-color-danger-dark:var(--danger);--ifm-color-danger-light:var(--danger);--ifm-footer-link-color:rgb(var(--lsd-text-primary));--ifm-color-content-secondary:rgb(var(--lsd-text-primary));--ifm-hero-background-color:#f8f8fa;--ifm-hero-text-color:var(--ifm-color-black);--desktop-footer-gap:200px;--mobile-footer-gap:144px;--doc-grid-gap:16px;--ifm-table-background:#0000!important;--ifm-table-stripe-background:#0000!important;--ifm-pre-border-radius:0!important;--ifm-code-font-size:100%!important;background-color:#0000!important;--doc-sidebar-width:16.66vw!important;--doc-sidebar-max-width:320px;--ifm-navbar-item-padding-vertical:8px;--ifm-navbar-item-padding-horizontal:12px;--docusaurus-announcement-bar-height:auto;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg,.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner,.katex svg{position:absolute}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;right:0;transform:rotate(3deg) translateY(-4px);width:100px}main{min-height:calc(100vh - var(--ifm-navbar-height) - var(--content-padding))}svg *{fill:rgb(var(--lsd-text-primary))}.grid{display:grid;gap:16px}.table-of-contents__link--active,.table-of-contents__link:hover{color:rgb(var(--lsd-text-primary))!important}h1{font-size:var(--lsd-h1-fontSize);font-weight:var(--lsd-h1-fontWeight);line-height:var(--lsd-h1-lineHeight)}h1,h2,h3,h4{font-family:var(--lsd-typography-generic-font-family)}h2{font-size:var(--lsd-h2-fontSize);font-weight:var(--lsd-h2-fontWeight);line-height:var(--lsd-h2-lineHeight)}h3{font-size:var(--lsd-h3-fontSize);font-weight:var(--lsd-h3-fontWeight);line-height:var(--lsd-h3-lineHeight)}h4{font-size:var(--lsd-h4-fontSize);font-weight:var(--lsd-h4-fontWeight);line-height:var(--lsd-h4-lineHeight)}code{background:#ffffff26;border-radius:0;color:rgb(var(--lsd-text-primary));background:rgba(var(--lsd-theme-primary),.1)}pre code{font-family:var(--lsd-typography-generic-font-family)!important;font-size:var(--lsd-body1-fontSize)!important;font-weight:var(--lsd-body1-fontWeight)!important;line-height:var(--lsd-body1-lineHeight)!important}.theme-doc-footer-edit-meta-row div[class*=lastUpdated_] b,table td strong,table th{font-weight:400!important}.mdx-page body{overflow-x:hidden!important}.mdx-page h2{margin-top:unset!important}.alert,.card,.theme-code-block{box-shadow:none!important}.menu__list-item-collapsible>a,.navbar{box-shadow:none}.sans{font-family:var(--lgs-font-family-secondary);line-height:var(--ifm-line-height-secondary)}.blog-wrapper--index [itemprop=blogPost] .markdown,.external-link,.footer__bottom,.footer__copyright,.menu__list-item .menu__link,.theme-doc-footer-edit-meta-row div[class*=lastUpdated_],table{font-size:var(--lsd-body2-fontSize)!important;font-weight:var(--lsd-body2-fontWeight)!important;line-height:var(--lsd-body2-lineHeight)!important;font-family:var(--lsd-typography-generic-font-family)!important}.markdown a,.markdown a:hover,article a,article a:hover{text-decoration:underline;text-decoration-color:inherit;text-decoration-color:rgba(var(--lsd-text-primary),.6);text-underline-offset:.3rem}.card{padding:var(--ifm-spacing-vertical) var(--ifm-spacing-horizontal);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.table-of-contents__left-border{border:none!important}.menu__link{align-items:center;display:flex;justify-content:space-between}.menu__link span{color:rgba(var(--lsd-text-primary),.6)}.theme-edit-this-page{align-items:center;display:flex;gap:12px}.menuExternalLink_NmtK,.navbar__inner,.navbar__item{align-items:center}.dropdown__link:hover{color:rgb(var(--lsd-text-secondary))}.blog-wrapper>.container>.row>aside>nav>ul li a:hover,.breadcrumbs__item--active,.footerLogoLink_BH7S:hover,.hash-link:focus,.theme-code-block:hover .buttonGroup_Qu4e button,:hover>.hash-link{opacity:1}.breadcrumbs__item:not(:last-child):after{background:none;content:"/";opacity:1}.breadcrumbs__link{background:#0000!important;padding:0}.navbar{height:var(--ifm-navbar-height)}.navbar__logo,a[class^=sidebarLogo_] img{height:40px}a[class^=sidebarLogo_]{margin-left:-16px!important;margin:0}.header-github-link:hover{opacity:.6}.header-github-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat;content:"";display:flex;height:16px;width:16px}html[data-theme=dark] .header-github-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23fff' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat}.dropdown__link--active{color:rgb(var(--lsd-text-secondary))!important;background-color:#0000}.row{margin:0}.theme-doc-version-banner *,.theme-doc-version-banner:hover *{color:#fff;text-decoration-color:#fff!important}.blog-wrapper main>section article ul li .lsd-tag>span,.blog-wrapper main>section article ul li .lsd-tag>span>span,.menu__link--active span,.theme-doc-version-badge{color:rgb(var(--lsd-text-primary))}.navbar__left-items>a:not(:last-child){margin-right:1.25rem}.navbar__left-items>a:not(:last-child)[href^="/"]{margin-right:1.75rem}.menu__link--sublist-caret:after{background:none;content:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTQgOS41My45NC45NEw4IDcuNDE3bDMuMDYgMy4wNTMuOTQtLjk0LTQtNC00IDRaIiBmaWxsPSIjZmZmIi8+PC9zdmc+);filter:unset;height:unset;min-width:unset;width:unset}.menu__list-item--collapsed>.menu__link--sublist-caret:after{transform:rotate(0)!important}.menu__link--active{border-radius:0}.dropdown__menu,.pagination-nav__link{border:1px solid rgb(var(--lsd-border-primary))}.table-of-contents a{padding-left:16px}.table-of-contents__link--active{border-left:1px solid rgb(var(--lsd-border-primary));padding-left:16px}.navbar__item{display:inline-flex;padding:0}.navbar__link--active{border-bottom:1px solid rgb(var(--lsd-border-primary))}.dropdown__menu{background:rgb(var(--lsd-surface-primary));border-radius:0;margin-right:-1px;margin-top:6px;padding:0;transition-duration:0ms}.dropdown__link{background-color:#0000;border-radius:0;margin:0;padding:5px 11px;text-decoration:none}.dropdown__link *{text-decoration:inherit!important}.dropdown__link:hover{background-color:#0000}.blog-wrapper .breadcrumbs__item,.blog-wrapper--index h2[itemprop=headline]>a,.events .breadcrumbs__item,.events .breadcrumbs__link{text-decoration:none}.margin-left-8{margin-left:8px}.pagination-nav{margin-top:var(--pagination-nav-margin-top)!important}.overflow-hidden,.pagination-nav a{overflow:hidden}.theme-admonition,table{overflow:auto}.pagination-nav span{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;text-overflow:ellipsis;width:70%;word-break:break-word}.pagination-nav__link{align-items:center;border-radius:0;display:flex;gap:18px;padding:10px 14px}.theme-doc-version-badge,table td,table th,table thead>tr{border:1px solid rgb(var(--lsd-border-primary))}.pagination-nav__link--next{grid-column:2/3;text-align:right;justify-content:flex-end}.events .pagination-nav,.events aside,.footer__item a svg,.menu__caret,.news .theme-doc-sidebar-container,.news header h1,.pagination-nav__label:after,.pagination-nav__label:before,.theme-doc-footer-edit-meta-row div[class*=lastUpdated_] small{display:none}.no-breadcrumbs .theme-doc-breadcrumbs,.theme-back-to-top-button{display:none!important}.footer__link-item,.katex .base,.katex .clap>.fix,.katex .llap>.fix,.katex .mspace,.katex .mtable .arraycolsep,.katex .rlap>.fix,.katex .strut,.katex .vlist>span>span,.tag_NdBD{display:inline-block}.lsd-collapse__content{padding:24px}.theme-doc-version-badge{background:#0000;margin-bottom:16px;padding:4px 8px}.navbar__right-items{align-items:center;display:flex}table{margin-bottom:var(--ifm-spacing-vertical);display:table;width:100%}table th{text-align:left}table td{color:var(--ifm-table-cell-color)}.theme-doc-footer{margin-bottom:96px}.theme-doc-footer-edit-meta-row div[class*=lastUpdated_]{font-style:normal;opacity:.7}.news .news-title span,.theme-code-block:hover .buttonGroup__atx button{opacity:.4}.navbar-sidebar__item{padding-block:0;padding-inline:var(--content-padding)}.navbar-sidebar__back{align-items:center;display:flex;gap:16px;margin:24px 0!important;padding:0;width:100%!important}.theme-doc-sidebar-menu .menu__link{padding-left:var(--content-padding);padding-right:0}.menu__list-item-collapsible>a[aria-expanded=true]>svg{transform:rotate(180deg)}main[itemtype*=Blog]{margin-left:0}main[itemtype*=Blog] .theme-doc-breadcrumbs{margin-bottom:40px}main[itemtype*=Blog] .blog-divider{background:rgb(var(--lsd-theme-primary));margin-block:40px}.events .theme-doc-markdown>h1{margin-bottom:16px!important}.events .theme-doc-breadcrumbs,.katex .katex-html>.newline,.katex .overlay{display:block}.full-width>div .main-wrapper main{grid-column:1/17!important}.news .news-title{display:flex;font-family:var(--lsd-typography-generic-font-family);font-size:var(--lsd-h1-fontSize);font-weight:var(--lsd-h1-fontWeight);gap:16px;line-height:var(--lsd-h1-lineHeight);margin-bottom:0!important}.footer__links>div:first-of-type,.footer__links>div:nth-of-type(3){margin-bottom:8px}.footer__links>div:nth-of-type(2){margin-bottom:34px}.container{padding-inline:var(--content-padding)}.main-wrapper>main,.main-wrapper>main>.row,.main-wrapper>main>.row>.col{--ifm-spacing-horizontal:var(--content-padding);flex-basis:100%!important;flex:unset;margin:0;max-width:unset;width:100%!important}.footer{margin-bottom:18px;width:100%!important}.footer>div{display:grid;gap:1rem;max-width:unset;padding:24px 0 0}.footer__bottom{grid-column:1/12;grid-row:1/1;text-align:unset}#__docusaurus-base-url-issue-banner-container,.blog-archive-page .main-wrapper header .container p,.blog-wrapper main>section article ul li a:after,.blog-wrapper main>section article ul li a:before,.docItemContainer_hrrU .tocMobile_imaF:not(:first-of-type),.docSidebarContainer_b6E3,.footer__bottom>div:first-of-type,.groups_p1lF .divider_eGUz:last-child,.modal_kLVz .closeButton_Rr0e,.sidebarLogo_Ydl9,.themedImage_kfRS,.toc_pP_5,.wrapper_SWrM .fullscreenButton_Bocn,[data-hidden-doc-sidebar=true] .theme-doc-sidebar-container,[data-theme=dark] .lightToggleIcon_K4TL,[data-theme=light] .darkToggleIcon_lKkA,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.footer__title{font-family:var(--lsd-typography-generic-font-family)!important;font-size:var(--lsd-label1-fontSize)!important;font-weight:var(--lsd-label1-fontWeight)!important;font-weight:var(--ifm-font-weight-normal);line-height:var(--lsd-label1-lineHeight)!important;margin-bottom:4px}.blog-wrapper main>section article ul li .lsd-tag>span,.blog-wrapper main>section article ul li .lsd-tag>span>span,.footer__item,.footer__item a{font-family:var(--lsd-typography-generic-font-family)!important;font-size:var(--lsd-label1-fontSize)!important;font-weight:var(--lsd-label1-fontWeight)!important;line-height:var(--lsd-label1-lineHeight)!important}.footer>div:first-child>.footer__links,.footer>div:nth-child(2)>.footer__links{display:grid;grid-column:13/25;grid-row:1/1;margin-bottom:0}.footer>div:nth-child(2)>.footer__links{gap:2rem 1rem;grid-template-columns:repeat(2,1fr)}.footer__col{grid-template-columns:span 1}.blog-wrapper main>section article ul li a,.codeBlockStandalone_BRZX,.codeBlockStandalone_MEMb,.col.footer__col,.modal_kLVz>div>div:first-child,.noResults_mD2O,.root_N57j ul,.root_ONDG.empty_a7qb{padding:0}.footer__items{display:flex;flex-direction:row;flex-wrap:wrap;gap:.5rem}.footer__item{display:inline-flex}.footer__item:not(:last-child):after{content:"•";display:inline-block;margin-left:8px;text-decoration:none}.footer__logo{max-width:var(--ifm-footer-logo-max-width);margin:0!important}.navbar__inner{flex-direction:row}.hero--primary{--ifm-hero-background-color:rgb(var(--lsd-surface-primary));--ifm-hero-text-color:rgb(var(--lsd-text-primary))}.docusaurus-mermaid-container{margin-block:40px}.hidden-scrollbar{-ms-overflow-style:none;scrollbar-width:none}.hidden-scrollbar::-webkit-scrollbar{display:none;width:0}[class^=mdx-]{--lsd-h1-fontWeight:100;--lsd-h2-fontWeight:300;--lsd-h3-fontWeight:300;--lsd-h4-fontWeight:300;--lsd-h5-fontWeight:300;--lsd-h6-fontWeight:300;--lsd-subtitle1-fontWeight:300}.blog-wrapper h1[itemprop=headline]{font-family:var(--lsd-typography-generic-font-family)!important;font-size:var(--lsd-h1-fontSize)!important;font-weight:var(--lsd-h1-fontWeight)!important;line-height:var(--lsd-h1-lineHeight)!important}.blog-wrapper>.container{display:flex;margin:0;max-width:unset;padding-inline:0;width:100%}.blog-wrapper>.container>.row,.katex .hbox{width:100%}.blog-wrapper main>header h1{font-family:var(--lsd-typography-generic-font-family)!important;font-size:var(--lsd-h3-fontSize)!important;font-weight:var(--lsd-h3-fontWeight)!important;line-height:var(--lsd-h3-lineHeight)!important;margin-bottom:.5rem}.blog-wrapper>.container>.row>aside{max-width:unset}.blog-wrapper>.container>.row>aside>nav{padding-top:16px;top:var(--ifm-navbar-height)}.blog-wrapper>.container>.row>aside>nav>div:first-child{font-family:var(--lsd-typography-generic-font-family)!important;margin-bottom:0!important;padding:4px 0 4px 15px}.blog-wrapper>.container>.row>aside>nav>ul li a{box-sizing:border-box;display:block;font-family:var(--lsd-typography-generic-font-family)!important;opacity:.6;padding:4px 0 4px 2rem}.blog-wrapper--index>.container>.row>aside>nav>div:first-child,.blog-wrapper>.container>.row>aside>nav>ul li a[class*=sidebarItemLinkActive_]{border-color:rgb(var(--lsd-border-primary))}.blog-wrapper--index h2[itemprop=headline]{font-family:var(--lsd-typography-generic-font-family)!important;font-size:var(--lsd-h4-fontSize)!important;font-weight:var(--lsd-h4-fontWeight)!important;line-height:var(--lsd-h4-lineHeight)!important}.blog-wrapper>.container>.row>main{margin-top:16px;max-width:unset}.blog-archive-page .main-wrapper header .container h1,.blog-wrapper article header h2,.blog-wrapper main>section article h2{font-family:var(--lsd-typography-generic-font-family)!important;font-size:var(--lsd-h3-fontSize)!important;font-weight:var(--lsd-h3-fontWeight)!important;line-height:var(--lsd-h3-lineHeight)!important}.blog-wrapper article footer{align-items:center;display:flex;flex-direction:row;justify-content:space-between;margin-top:24px!important}.blog-wrapper main article{border-bottom:1px solid rgb(var(--lsd-border-primary));margin-bottom:34px!important;padding-bottom:34px}.blog-wrapper main article:last-of-type{border-bottom:none!important}.blog-archive-page .main-wrapper{padding:2rem var(--content-padding)}.blog-archive-page .main-wrapper header{border-bottom:1px solid var(--ifm-hero-text-color);margin:0;padding:0 0 1rem}.blog-archive-page .main-wrapper header .container{margin:0;padding:0!important}.blog-archive-page .main-wrapper main>section .container{margin:0;max-width:unset;padding:0}.blog-archive-page .main-wrapper main>section .container>.row{margin-top:64px}.blog-archive-page .main-wrapper main>section .container>.row>.col{margin:0!important;max-width:unset;padding:0}.blog-archive-page .main-wrapper main>section .container>.row>.col h3{font-family:var(--lsd-typography-generic-font-family)!important;font-size:var(--lsd-h5-fontSize)!important;font-weight:var(--lsd-h5-fontWeight)!important;line-height:var(--lsd-h5-lineHeight)!important}.blog-archive-page .main-wrapper main>section .container>.row>.col a{font-family:var(--lsd-typography-generic-font-family)!important;font-size:var(--lsd-body1-fontSize)!important;font-weight:var(--lsd-body1-fontWeight)!important;line-height:var(--lsd-body1-lineHeight)!important}.blog-archive-page .main-wrapper main>section .container>.row>.col ul{margin:1rem 0 0;padding:0 0 0 1.5rem}.blog-wrapper main>section article{border-bottom:none;padding:0}.blog-wrapper main>section article ul{margin-top:1rem}.blog-wrapper main>section article ul li{margin:0 .5rem 0 0!important;padding:0!important}.blog-wrapper main>section article ul li .lsd-tag{height:28px;padding:3px 11px}@font-face{font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(/assets/fonts/KaTeX_AMS-Regular-73ea273a72f4aca30ca528cf9117470a.woff2) format("woff2"),url(/assets/fonts/KaTeX_AMS-Regular-d562e886c52f12660a41eea8d05af757.woff) format("woff"),url(/assets/fonts/KaTeX_AMS-Regular-853be92419a6c3766b9afe7a7c3e32fa.ttf) format("truetype")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(data:font/woff2;base64,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) format("woff2"),url(data:font/woff;base64,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) format("woff"),url(/assets/fonts/KaTeX_Caligraphic-Bold-7489a2fbfb9bfe70442031a27fb57a21.ttf) format("truetype")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(data:font/woff2;base64,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) format("woff2"),url(data:font/woff;base64,d09GRgABAAAAAB3oAA4AAAAAMDgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAUBAAAAFEAAABgRT1pkWNtYXAAABRYAAAANAAAAEQAiwEsY3Z0IAAAG9gAAAAaAAAALApXAH1mcGdtAAAUjAAABrsAAA4MYi77e2dhc3AAAB3gAAAACAAAAAgAAAAQZ2x5ZgAAAUQAABGQAAAZbto6EhxoZWFkAAATNAAAADYAAAA2Y3ZDa2hoZWEAABPkAAAAHwAAACQHxQMiaG10eAAAE2wAAAB2AAAAfE2XAudsb2NhAAAS9AAAAEAAAABAWUtfkm1heHAAABLUAAAAHwAAACAAyQ6cbmFtZQAAG/QAAAGjAAAEsGWnhAJwb3N0AAAdmAAAAEgAAABoOcqzP3ByZXAAABtIAAAAjQAAAKdkQq2ceNpdWAVYG8vazsjOums82bhDFClQWiiUuty6357THpf+x6+7u7u7u7u7u7u7S/lnExK4fWYrazCvfO98syEYaoZCoU9AO4RCbCjU0lt6oaVnmk8732xC+7+/boI30mcSq59DLfiN0Hxob4h7687FWRc2K712t9V0HafV7HXp6LWa3U6716UXWdtyHZcePXpiE7Y/Mn4h3x+dTGFwns/RE/pfBdot+noiKQsIlmwe53Y++0adYyHkWq6BZEZWGEP0VQ1gqRS1DctXMK8QCB78YDmjnuhlurCMibjlXqwjA0n4YCXWNe0Y1K771g99yGJOS2mPfdFzd89MiCzRFHruKoR4xJ9qmBABs23ct/O37R+bsR/2CNG3AMahEAglV38FnwE/GLotRN48nQTNCvADcIPR6bQpDp8l6yOA01t7oNvptem1/gv0tBWQYBHWovf6jNlW/x3Wdfr/XeOmz5xL2Rz+/HzGJ2BcTirVIrcrmmDtTa7Vaun6WF5x84pcVzkOCHVvLAogMKKqkSTnWB4JUFMhf/q+XPiciyDv1vfKcm9B9F5y1oztbCoQT7qsUt68u1VkjFp1M+ODQ6Ju86oK45FImVWUEkOUXV7m5FN7c0dV1WVZ6Bw7/8F3sSrGSKD8GhYzDhGUyEUOCRcMsFvQBSGX7FYJYxyYTKaXb5VRU+H0rFKul+ckTW1HIogyKq3+HNqU0UnKqE0oo7lmgL6PPWBqyNWAniErfbrblIrgmm316emCH6pW85nLWxo79cLJzsMXCQ+dnZAtyLGwxooYip7ChKON2s5uY/+elZbceLUoRLfuy008bGrLM850F1gA0CzWysvhMIc57FRLuuKaduHO6686fvMuK0Edb4RC8DJ8dagT2k4dv3kiIlHHm4HGVF4600BUZyglHWsg5mDXbHe6mbFMhiLoH0yezr7/HNsauifHCwBA5w3XxRPO2Rvb9+ZTj37kq5JHdmFWs8IidzqMEASbt8sAA7EGT2lP+T9ZzexWcneeeVqcAd/mCMAELl5kgZmcvcsvPfriBZcBEBNRMTls/QEgAF2cKUNqhnD68AGonv70R3zU2P00z1YjVIsEdXebarFItZjhAUWWH5i1OTIoZT+41GkH1PfruTkCOxKiNZRwoOD396Ryj9qOTOawyXrimK6x3IFjKblSnPPURDUf25tVds3s6wpNS9Naz9u1eM6u3gquLS40q73dLCjJSjSnhEVWUJXaghcbi0eQJCgJBOTkYd+rT+3WEiLnLBxcmshVzy8EVWqs/gDNUJUOUBwTclClg2lTJFOw22xRhVwruNSl9ZRhB/O3WsH1gfMy61YbQGgGrwwjbRa2M0AupjRG298CkUpnW/rrXBltCmtA0C+eA5yZkOA99/AACeK4KeG3oKWyu5Ah9p4UFpN5kWEMX+UxtnMHGlAg2+DVvoilZBEDALhIpKSKkAEYpHafzANIMK/rUZG8YS5RY8FmjuXFNMJiVmCIf/Cd7xLLUUgRV1cfCQ/DD4QOUcSTdqCcNZztUI5gZIKgDfC0KJjB/Q5hNwBdi6K+hQk7ZG2oN2GfsLyU96d8LDITnhIp1xdviRR2bNKoFFlOnF7iXD2bNhhmeb9hLFUn5fgr7qiNldlingE9O5VVZSUOwZkd491dGMzuvcrN7+Uzek4UTj9z561xFsVFJhCWSRiFg1WCcFuG1d61tdbtr09IgA17mIsetxOCqBrjIiINP/PMwxS7vvoFlKFqXwhcqwVq08mulV8/KIbm7WtMT4NjSIkCbWtI1HrudLo9WpeZUYZ3emsc5AOauv2CBtV6d8pluVSGFyENi6cdH1dYXo3dcSdrb+XEqmnyE5WCCCDIcRkiRnO26N6yYJGikEP6TTey0axF5LqhWdk8W8/KGMYsM+HhLNySKVQUPoF4Vk/O7fMVWZ+/5SDwVt4rqREgIu/Jz33Med6WUJYxxSgDFd4qt6FWEW5+EsLAO36mx2phqXfq/i4EgMFQiAo8ANqjQ2D1RzS9HrRWF5utIGsDWAP0g5INjpHnaez2BqNHCSWZ4ao2XPKa9InWwCjs6CYLVq7DAEBGSOQMJO5rWYWXfQixcjRl7jA90/MdK5FHm+WCgzY5AseI8ayJvQvTp2BrT+7pQsNg5+ZU143H1USZWwQUAyeJcSQxnD8tMQAAzIpymIVedeLhRzcdL2EKUsCeKkaxyPI7ih4GhJV9AoHZmbntUvFQjaceaaw+Ei1T5Nsocg8EHulPfSD4+nJNjzWNh36wN9RRrzdCSR/rX4JL1o238ZDrOKbSacZTHGfVK3dOm3Znj6l6iaQF4a6ZXGIuBpXSwc3Cwop7IssAxk7ELYazyi+Fr4Q8RthIymNPPXS/rDfXaS/xqJ7PpppWGEEZCpyzacEuHyHtl39jjgfEPSoR+pM1P7V0VQj2E/s7NLFzodN0PTq6rABIsY0q/soWpLCh/2Do5cESGsDuZ3k/4tYTY603o4kxygYnkBuIAtSIFK2MJQDXsVgBCq1KVpaxFdUG7QZ4rigATSKo+uIxW3ZTZ3KiVJ7mSco0sHn/vTJqN4p7GZCqvHdHNRlPJ+D7oZKcuHDxBQ/ZDfUEz4DYg591v3P7WF4ZNha38bwqq0C8ZsyypezS+RcbTCaluyrHT+wC2s7JT04iDmYK7YcmdJiMRRJU8xTl5vGUm51U87lsPxcGOTayqktzwe2bfIh41I9Spkbp1x/DNdC2BpyCv+NeTGmUInFdd1gS6R0/0VBkjovmwgrUrt2kugkvc7RbUwWtaajJbM6uV9OVwxeghGcs6lC9oamQZWLcNrl809ItC+WGyAPPg7LjGp4ApbFDMsKMqyLAaxFeSWYP73v9kfnaIR60FF2KepLuUIyx1c/hW+CHQ9dTjPca+LovozuU0hxhY6FtBRdH5yOwHcoLNTdLNtZAX/hCcGVjUQQUuM6w4QXPMwmDGb+tqDYDd5v3/IGGNyMxMlsjWCCcE1Fs2cnFGSGiyggCLg0Z4vAv350+xmLCcWwpopVlOTvZKebSiIv0CExwLMOYBYnLLM6HiWDA92OExOS73zSen9xlPxjEswC7hrq5dvmfD10yZKxJsiGKJgGqXExE2SjznPfyhESEDx3IHsaIlRd2jb2gN/GMpz56rseDuMqx1QQtagIY9yNvfFNKMGkq/pTuYr6M7P7aWQ5RDl0/oORKsAFtA2bd4HRoiX6IrOeCbRXawS8YUNZ30nCnM5OaMCSOArfzCmun94Ux5oqmipjxxW6bsZK5esNtH4IakrkYb3SzUcwYRUoyAGyBJqVUrxfreQ4y6almI9z0PaMmDaAo537+/RSneCyyX/fWpxzl99z90Jc8xGvzQFAqCR4ZCs/3HvClL8oAQAigGiPGytnr77zbBij5qpc/oeZRH02t/grxtFYWKAd8wAFobtyEDAJxQ6H07wz9NOzFr1wfuvDwkWOe/4ZbFhYna3PbgNRYfnTUxkRHfHz/jRI41Nw20Z0+79rbd9qeXknyYjJtccnW3ust+MG7z+9YueGtpbATv9+xFH9x3/0P6gwQGUI3Oi+7yKceM5+LxO+7srBw9AZJr6xYYhwKFNfkCQMOOsCPw+/SvN8V9EMy2NijB8tW02m2Rm36aM2j9wZY6B4rM1oQAuyGOQs7eXo6OEZ9OkxU8pUEvGMmD/mOF5593h4Hw2gxfPC2mJmdeWQcRo6URKFms6J8kw8wgmjYvW/s1gE3XRpnla3zcbs9iwiGQswAZGE6lx5LT4i/+/slTYsAQAiTBiZQ2XwMADBs4ynWW1fvi0yq3XGKdYsfaDdI9XWBev3d9hVN3lBflh1mxZUp2N9rrm1f1iwPX3z++Ildix5Xy8/VxlzFAlLsQe1q6uzh3gv2JZJbO2eAfL+j8wsyWj6zxbVZhvMLCtKun9LcfKVx9YlxXzZUKybkDrfbhdaRWAm84Ow9uxZPxjN7ajlbBDIvJQpa7Z7bbl6+t8Jk5p+YEq5/86aqS5CX1h2F9yWGH98lIE7IpQiWBMXiEQCSaIWPdA8GulMfL8JXhS5SLhriRt0DdP+7N1uPyWH/MwQ+GH5nFvaaGzzh2/+7pBpm5wpL6Hftb+4/ePhirobk2XTFaUGkR0u6lzCSmpSqGYnFk9G4iPNJPZ0M65YGo3kXm2j+qAT9ztNcCBNnHGawpIp3RpgrzdI7bilqODYpq8uzflh2MRPefNbNqJpaxKKc3u4SwLfie3dHdaSIYQMAwK1McWbdyQBF/es/emKwtqIIyIIcN3LQgDXaF34odJCydrAwrP5hLQ/Q50cbvnUOR44asKdCYvcJHbwxGKM9PPjl3DGGEeN5A2JF2eYfCzO5aG97ZhJJzWjkugfePmdXKy2HUSMMIsDsXPXAggyNa5fdcQFCPpa7ZwnDD9TGZccU41iCgqx6mmRu1+VyJhzxE/U5WZluh/Xt+6PZmWoFiTzjiEjU3LC3ZX84abCb276RqxHT4IqZ+jyBFLe/+h40Dz8b6lHcJgDrnVMfuY3WMPYhzMIARb9bGtXIsJjgz8YiuqZNx9wL526J5MyOKKtc1oJTkxjy8N43yKqF2Jolc2o0eWtP/DV8tc8rlukTBsDL8yd35A0sMsr+Ze5XP+KgDDFTNBlWThJGy+arW9gg0VZ/v/oT+Eb46v4q1Wb6zu60hxW7cfM9bFZpha8Z3Vr/4jbYkreDq1dG+1ovGNa3Tm3qRNXMjCpksq6//OY5R45joW7xmCWc1ppxMOaEhKoxJy3DCTcQueW6xUlN0blsQTTn6iovqo4VhwuSl0m1M9uKex81lfYrbWfsF/ctZ/czWhgibCULd//lwKLKYkZRknniOUuvBJh90mKFii3M1dPlLU+4ppGwNFG2gjwPr34aPomin6DoSzBA317PsNawRoOabQ/b1AHEkUzDb2fhseh05agAAYia1z3BwrWU4ahYqnex88Sd5086BEiQV6eSJV3V4F2aXzxwec8FXnb002/eLEqJCvTsJg/xQluMPfh1R47sFWCYKJXXzXz6cE1g+jP9KBboTA/TmW7635n2ZtGA6NFXPTrcDey3NyRzYL61DCYsRKNVtdOuQ4piPH62EjEAJLxIbjg6jyBgapaEGGdRBSjRuxTFyahkq4RoUhuGP3CjpxKAuEkDIfysHzu8QjhZlxNTRRXeZaQu7b31/H0goMLxT3z2TRwiHKPFCbvjh38ysL/rRadlLZ5r1nhIvIOG9pLLl5+sCgqz/LOvrxBy+ZuX/xwFrmqET991auLUwbFArXYohAqUg2uCr6RcUFeD6Y9AU33c5gBNX7LWKG/634iHq5YzMinNkTocLmrB04MPNevmHTSsGbDgF00gnZtKmI7A8gACUHuSBMPqdDwcNbX08iPDnMDIBYZLZkUOiOnmiq0mLRLslAF7vxs5GEMcYsUxNxwrRbIzj61xnBCDIoRXF6CEUamp6cXY/QSbkNjJKJZTWNJK6WjCc2LTB1UGHL/LmOCSkOVzVo7VVnYIhJ8tHthuYzlLFRX0aDqaL0UijUNR8ODerAhg/5vyLfBTlK1lylZlY2W7jm4Re8hTfy3euHRv7M66o1a1Q58d7mAOGFZr4WDzEITFRzfEcU1WTImwqXCViz3xup1PKGLOMfzxqIfU7SKp7NMINo57JYGPwRVZtDqLt13+hbzM1577BF8b10nYzhNoZbYlUtf/+vrdFwgg0nzRrTgLBAB+C13Vzm+t/nqbxQA+WFNyoRBcXfNAKegoWwMD9zL9NaHX6v+/X5KjrnGQWwOTuPR//a+j1qBTW+vRKKyNG7fulbuZwCMtJfLSR3tjDTHL3ZW6ylPCpa27YrmMwMYTUVPn/QfMApOtLS7YdlUx7ePnI0pDglldgEJZ9+5/K5PZdOFgy04LpBEhkgKN1Nxxwe9dfbGRiNiC5D72oR4gnKvi9HVJDQiim7RNG4psTmosMUDkAbCBEb7hQgxAhyAtCgBDGATcu89hIHCoWjLTLOShNFHcY0JBFKT/B7cQyZN42mNgZGBgkGcoY2BiAAIwKcHQCySl+HhAAgAX5wF0AAAAABIAEgASABIAiwE0AYsB+gJeAtcDVQPqBGcE0wVhBdMGdQb3B18H1QhbCPYJcgnICkcKnAseC7UMIAy3DLcAAQAAAAEAAL2P45NfDzz1AA8D6AAAAAAAAAAAAAAAAAAAAAD/4v9xBHEDFQAAAAgAAgAAAAAAAHjaDYonAoEBFMd/3tNsyd6SPZIz2LrmAt9NdFknuYIkaYqVZft7+7940QbwDMAwmiEjS7ISwq9KVMLGD/ZnVHVARPL/i6xpyMv0LTnvhpR2/3dN0ZMdUW3h6Njyc9s8BXH+D1kQ1xNx2dOVFVk5UuYFLhwcF7gAAHjaY2BkYGAW/V/IEMWy8f+jfw9YCoEiqEAeAKZdBu0AeNpjYGLawDiBgZWBgamLaQ8DA0MPhGZ8wGDIyMSABBoYGN4LMLx5C+MHpLmmMDgwKDAsYFb4b8EQxSzK0K/AwNAfxwySZVoNJBQYGAH/OA9wAAAAeNpjYGBgAmJmIBYBkoxgmoXBAEhzACFIToEhimHB//9gliOI9f/x/8P/64BqoQAA6/MLsXjarFbXettMDh2quVeVFKaAmcjrNYeK090Lx7Q23fX7yK2kJed+9yrPwH0ZUOl3+2gLkJJ7+ZtVMIMywDnA0EKhAMW+7wUAb36I0e03WNr9q4/PTJwOwo8Q7/uYq0c/+0W/aLXkgWlZKAIUWm50hCF06DpoKITwo4M5JS1pOZhX0P6cr1SFq7GsIQzdJFfRblLPa8zpvU+Aw5IWOmpjYetTJ5fL0TFoHd6xWNsZrRruHaCldDtlo0w2iWLLPww6NYM9HSwozNtY1T7nw5rWXQcT2oD/28LC1F8708aI9loeljzfwnw92PmbT85m7ANubZFqjbxxjldzQQBJ5k0VTZOquwOcZfssedKpPhAbcQQ4uOWHpAG2DfLqBa9ehGYYBIFJbOGwbqHY8VG8YWeL9uYbvMere2+iH+OixR4/iuIgCNpRgIYdBF0EAbQJj3QDB4sKqIJCPSJMfXrLxz7pYr90qQMUEjpYSukmJqCd9B24wEaGa2bl8zf5eS0szlhk1BBDTLmS2WKdGNr2wy0z2gl8GVgB4NquTzaTeOmV4mCfwgFtd0Qua3M/baUrAYV0I8wdfESjRQmwb8bBAQVc7SjBKogD4BNwLQzYJdxIqx1UnYFRoT13xjoanCF1epCGs1MMW5KeoIfgxTKCdpdsYXJDEExcOyKMWiujjSzFyCXh+JCiBEVdFDSqUkCfR4ZF3qMsprSCGRriMZXkch62ow0HxxW5AuCYfs0H0II6hOO826HdeNqvCUWrlBQgDlqUGSd0CHEIOEG0OTip3uz5SaG9ETzEkUP5ycGyerPtv9nNlKZF+nKqr6hETOp9P5mcpBZGLk7YAUPK1d1kjL/G6QuNmgRCsuUnTB/hdeMYOO34jCUprLc2MzuF0CfVBISkSfU3SXu6WZe0MBGiLIkvjWKlYxhG2q2qEonIeXs+TkoXPByVLo5IYsqF8PvNm4aYEGXhui4zUCGbESWVfhv/a5sPiK4aYazaDt5QicHyJvHN8pZK8ixvq6TA0lRJkeUdlZRY3lVJH8t7KulneV8lAyxtJXv8YykkpiU00PgH3xYH1Qlj7cj478zonDBOHRn/kxlBCRyzL8VJoL5mUBnnSXwW4QOq6wHhYykJH8uHhI9lnfCxnCJ8LP9E+FhOEz6WfyZ8LGcIH8uGgqV0YB8pSnszBM0laG4pSWzwzM4qfGTjI7qPjxVAEy7ppozmJD/Yr/QwGf2TXouT0ZLHE4ePZ5KiUfX82SBF+TSj50qfZwqep5U/V6Lr453PiYZNtVysF7Uvgv82VuRc8syoMtYXxAc0L6kfhY7mHHypGjeWHJy7zhUN3SL3eWqRqNWhAU0Ukm/LqzhuyqaMwD8gPtCQbmfOMKoVYnhBUVl4g9wKdXqnbsmwcHFI24dxQwIsxXTm4mk3aGTnYUm6PW/AkJ8pa9v+5wIUwfxcmCreDlxXAg5qiGUaITdDLOmz1zUEoif7r1TQYVtiUUdtMhd0ZNI65Cfd2ZhIAnlPyU3qsaQMm4STRJolhIuSSM4iyRKSxGI9os9ZJzqRi6hzEXn67j5Jj3MFDi71uADSFqe6XMglomm5ZyLMqX1TNjkpd3GlZ0vBZEyj2PMbsCQtkzQ9JR161Aos1Wn36uRvl6yJF017t1uSR371RCW6166Qf+Cchdxr8ZqS0GAWN/GG9rfMncCHpaCRzBoV28H1U9Ydc+uU1b0w9qoIrXDBvirhhsJFO6baeMYI1KWu1NAGzlKEx5DT+ZzKmI9wWLoZdB5QCUvQkHPd8zdVMliouxTyW0a6+UdNMWOKCN2SpEfViXmxgm6dTZWIBbvHyl9ot2hbssuLnDtNwSuioJpd+47gG15u4Au65a8v0b+h44xKGV/S+q3CeRLvmEWP6IbNWEY9tt4rHmj8f891kRY7FARQ+NYTdAlMmRFWgLu7Nm6Nuzbuvpi2DVKnKmT233wn7gPKoagQQqdiWCFgJCpIAKMKAWM0XYpxGjBBAyZpwFRUDCG0qaZVYkpFRfFpMyoxzdIJmqMzzdOZFuhMi6yzQ7GkELDMOsGKQsAqTbdijQakacA6DdhgfaFdtakS0xbrM22rxLRDJ2iXzrRHZ9qnMx3oMa5PTuChjXLNyiNni/KYg26jVh2dRHmJm1PozZk1EjfnOnNDstQLRj5HBvocl9DzK11OHFxDD26gB7faNibLu2Pk+T30/AF6/qhzxsET9OAZevCibVOyvFdGnr9Bz9+h5x86Zxx8Qg++oAffUaHSvmxzJVWFf3/+duhPkz4GU601ubJ07m/1cOb3ZV37A0STAUQAeNo1ybENwjAQheF3iQEDKAUtLRIoU0TRdVQgCqdOBmAEGiQ3MIsPN44nYCvAWFz1vf9wCHidjBA9OkejhkZ/EczaJwh1gl8pWmSti590G8sGhOXX8zYie0QJsGzJHo1rrEl7YNmnHTRyAHcb2aUU9RWkGtuf/490vlJU1YHeN6fuUoD9ZJiC+QOZiyrSAAAAeNpjwAZSgNCVwZXp4P9XTKIMDDAaAFF8BtkAAHjaYmBg4GQoYmBmYGThBLIXATGEzcigBORB2EwMfAxHIGwgGcRwCcpmYTBiVIGyWRmcGMOgbDYkcV6mIsYZUDYfgwkLoFWySI4gimGo1nOK3oWZmZk5u9QwM98+bxRmLH/Qd8uyy+6Q1lRUSW2yppVUSjUF6lZUPdyjGsZmNGA0wg60rriq5hZ4ncFM4ylwx9WPZ8d4UF8qozf+qDyNbw9O2KorsMKKoZgnfg98Dr7WDZph5axXAZWISMM9VRxPnS9h/JvkLajmu4I/7nyDrn6W/bXewEvFX0Rc8qq4T9RCzhENsudANSwBp85ddHThvjMNs6bZY+r54Vz6fzCZjs68mrZBOhxWDf0Md4u3e6ZF8vzfBF9mzN6zwi84zzP3KwQz7boCd7bqfjY4Y3juJww6RCGP9+up+p/Ezv2qvlA5AyVATc+uo2aGNegerOp95jo45loCVxd39I72uY/IBPeF8v4LBabwwZ8x+KKyl3kDhdVgp/1vRTjxPetP2BlXdGJc0yxazAorgYewKmrMkHcNPMhG67HjQzoifv83MbfN8rvYAHjabMEFAYRAAACwvbd4dwMOt3QEhwJslsA4COYcsLC0cnVz9/D08vbx9fMXiSWCVCZXKFVqjVanXyx300rzMg0MHA0AXdgI8AABAAH//wAP) format("woff"),url(/assets/fonts/KaTeX_Caligraphic-Regular-7e873d3833eb108a0758be45cd29e907.ttf) format("truetype")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(/assets/fonts/KaTeX_Fraktur-Bold-931d67ea207ab37ee693ff155ff4d7a6.woff2) format("woff2"),url(/assets/fonts/KaTeX_Fraktur-Bold-354501bac435c3264834b80301089bad.woff) format("woff"),url(/assets/fonts/KaTeX_Fraktur-Bold-4c761b3711973ab04edf7ea6f1fbacdc.ttf) format("truetype")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(/assets/fonts/KaTeX_Fraktur-Regular-172d3529b26f8cedef6b5ddef7546e02.woff2) format("woff2"),url(/assets/fonts/KaTeX_Fraktur-Regular-6fdf0ac577be0ba82a4c9a89b8eef91b.woff) format("woff"),url(/assets/fonts/KaTeX_Fraktur-Regular-ed305b5434865e06ffde7da0d28101af.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(/assets/fonts/KaTeX_Main-Bold-39890742bc957b368704509bb2f4163c.woff2) format("woff2"),url(/assets/fonts/KaTeX_Main-Bold-0c3b8929d377c0e9b2f3a9c872e3337b.woff) format("woff"),url(/assets/fonts/KaTeX_Main-Bold-8169508bf58f8bd92ad8a768ede68a18.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(/assets/fonts/KaTeX_Main-BoldItalic-20f389c4120be058d80a3cd6a2f5a9b9.woff2) format("woff2"),url(/assets/fonts/KaTeX_Main-BoldItalic-428978dc7837d46de0916f266f5a43df.woff) format("woff"),url(/assets/fonts/KaTeX_Main-BoldItalic-828abcb200061cffbaae1f0498f821a8.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(/assets/fonts/KaTeX_Main-Italic-fe2176f79edaa716e6212cca53949439.woff2) format("woff2"),url(/assets/fonts/KaTeX_Main-Italic-fd947498bc16392e76c23adf58513fb3.woff) format("woff"),url(/assets/fonts/KaTeX_Main-Italic-fa675e5e4bec9eb250b6a8cac09b189b.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(/assets/fonts/KaTeX_Main-Regular-f650f111a3b890d116f1ba740b7e3de3.woff2) format("woff2"),url(/assets/fonts/KaTeX_Main-Regular-4f35fbcc9ee8614c2bcc8c28314db234.woff) format("woff"),url(/assets/fonts/KaTeX_Main-Regular-9eba1d77abcf2aa6e94e823d52be546b.ttf) format("truetype")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(/assets/fonts/KaTeX_Math-BoldItalic-dcbcbd93bac0470b462db6f9708a658c.woff2) format("woff2"),url(/assets/fonts/KaTeX_Math-BoldItalic-3f07ed67f06c720120cedd0bad5f60e2.woff) format("woff"),url(/assets/fonts/KaTeX_Math-BoldItalic-bf2d440b3a42ea78a998ccd32eb09d88.ttf) format("truetype")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(/assets/fonts/KaTeX_Math-Italic-6d3d25f4820d0da8f01fa3d2c7cbb8c2.woff2) format("woff2"),url(/assets/fonts/KaTeX_Math-Italic-96759856b4e70f3a83385d07e0d33b03.woff) format("woff"),url(/assets/fonts/KaTeX_Math-Italic-8a5f936332e8028c7278a3a25db00925.ttf) format("truetype")}@font-face{font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(data:font/woff2;base64,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) format("woff2"),url(/assets/fonts/KaTeX_Script-Regular-073b3402d036714b43709614d1da717a.woff) format("woff"),url(/assets/fonts/KaTeX_Script-Regular-fc9ba5249878cd8f8d885c1f42b0f43d.ttf) format("truetype")}@font-face{font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(data:font/woff2;base64,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) format("woff2"),url(data:font/woff;base64,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) format("woff"),url(/assets/fonts/KaTeX_Size1-Regular-6de7d4b539221a49e9e241b734653ecf.ttf) format("truetype")}@font-face{font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(data:font/woff2;base64,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) format("woff2"),url(data:font/woff;base64,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) format("woff"),url(/assets/fonts/KaTeX_Size2-Regular-57f5c1837853986ea1dbadbb8f4f6074.ttf) format("truetype")}@font-face{font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(data:font/woff2;base64,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) format("woff2"),url(data:font/woff;base64,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) format("woff"),url(data:font/ttf;base64,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AKIAAwABBAkAAgAOALgAAwABBAkAAwBGAMYAAwABBAkABAAmAQwAAwABBAkABQBCATIAAwABBAkABgAmAQwAAwABBAkADQJmAXQAAwABBAkADgA0A9oAQwBvAHAAeQByAGkAZwBoAHQAIAAoAGMAKQAgADIAMAAwADkALQAyADAAMQAwACAARABlAHMAaQBnAG4AIABTAGMAaQBlAG4AYwBlACwAIABJAG4AYwAuAAoAQwBvAHAAeQByAGkAZwBoAHQAIAAoAGMAKQAgADIAMAAxADQALQAyADAAMQA4ACAASwBoAGEAbgAgAEEAYwBhAGQAZQBtAHkASwBhAFQAZQBYAF8AUwBpAHoAZQAzAFIAZQBnAHUAbABhAHIARgBvAG4AdABGAG8AcgBnAGUAIAAyAC4AMAAgADoAIABLAGEAVABlAFgAXwBTAGkAegBlADMALQBSAGUAZwB1AGwAYQByAEsAYQBUAGUAWABfAFMAaQB6AGUAMwAtAFIAZQBnAHUAbABhAHIAVgBlAHIAcwBpAG8AbgAgADEALgAxADsAIAB0AHQAZgBhAHUAdABvAGgAaQBuAHQAIAAoAHYAMQAuADgALgAzACkAQwBvAHAAeQByAGkAZwBoAHQAIAAoAGMAKQAgADIAMAAwADkALQAyADAAMQAwACwAIABEAGUAcwBpAGcAbgAgAFMAYwBpAGUAbgBjAGUALAAgAEkAbgBjAC4AIAAoADwAdwB3AHcALgBtAGEAdABoAGoAYQB4AC4AbwByAGcAPgApAAoAQwBvAHAAeQByAGkAZwBoAHQAIAAoAGMAKQAgADIAMAAxADQALQAyADAAMQA4ACAASwBoAGEAbgAgAEEAYwBhAGQAZQBtAHkAIAAoADwAdwB3AHcALgBrAGgAYQBuAGEAYwBhAGQAZQBtAHkALgBvAHIAZwA+ACkALAAKAHcAaQB0AGgAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAgAEsAYQBUAGUAWABfAFMAaQB6AGUAMwAuAAoACgBUAGgAaQBzACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAGwAaQBjAGUAbgBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUALAAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAuAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABhAHYAYQBpAGwAYQBiAGwAZQAgAHcAaQB0AGgAIABhACAARgBBAFEAIABhAHQAOgAKAGgAdAB0AHAAOgAvAC8AcwBjAHIAaQBwAHQAcwAuAHMAaQBsAC4AbwByAGcALwBPAEYATABoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwAAgAAAAAAAP+DADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAQACAAMACwAMABIAPgA/AEAAXgBgAQIA2ADZAQMBBAClAQUBBgEHAQgBCQEKB3VuaTAwQTAHdW5pMDMwMgl0aWxkZWNvbWIHdW5pMjMwOAd1bmkyMzA5B3VuaTIzMEEHdW5pMjMwQgd1bmkyN0U4B3VuaTI3RTkAAQAB//8ADw==) format("truetype")}@font-face{font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(data:font/woff2;base64,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) format("woff2"),url(data:font/woff;base64,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) format("woff"),url(/assets/fonts/KaTeX_Size4-Regular-4ad7c7e8bb8d10a34bb7c4bb567cef92.ttf) format("truetype")}@font-face{font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(/assets/fonts/KaTeX_Typewriter-Regular-c295e7f71970f03c0549228b1c18120a.woff2) format("woff2"),url(/assets/fonts/KaTeX_Typewriter-Regular-4c6b94fd1d07f8beff7cf3364d4d4555.woff) format("woff"),url(/assets/fonts/KaTeX_Typewriter-Regular-c5c02d763c89380dcb4ed359e15d0897.ttf) format("truetype")}.katex{font:1.21em/1.2 KaTeX_Main,Times New Roman,serif;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.13.24"}.katex .katex-mathml{clip:rect(1px,1px,1px,1px);border:0;height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .base,.katex .vlist,.katex .vlist>span{position:relative}.katex .base{width:min-content}.katex .textbf{font-weight:700}.katex .textrm{font-family:KaTeX_Main}.katex .mathtt,.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table}.katex .vlist-r{display:table-row}.katex .vlist,.katex .vlist-s{display:table-cell;vertical-align:bottom}.katex .vlist>span{display:block;height:0}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{font-size:1px;min-width:2px;width:2px}.katex .vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{max-width:0;width:0}.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.codeBlockContent_ugSV,.katex .accent .accent-body,.katex .delimcenter,.katex .hide-tail,.katex .op-symbol,.katex .rule,.katex .stretchy,.wrapper_SWrM{position:relative}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .fontsize-ensurer.reset-size10.size10,.katex .fontsize-ensurer.reset-size11.size11,.katex .fontsize-ensurer.reset-size2.size2,.katex .fontsize-ensurer.reset-size3.size3,.katex .fontsize-ensurer.reset-size4.size4,.katex .fontsize-ensurer.reset-size5.size5,.katex .fontsize-ensurer.reset-size6.size6,.katex .fontsize-ensurer.reset-size7.size7,.katex .fontsize-ensurer.reset-size8.size8,.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size1.size1,.katex .sizing.reset-size10.size10,.katex .sizing.reset-size11.size11,.katex .sizing.reset-size2.size2,.katex .sizing.reset-size3.size3,.katex .sizing.reset-size4.size4,.katex .sizing.reset-size5.size5,.katex .sizing.reset-size6.size6,.katex .sizing.reset-size7.size7,.katex .sizing.reset-size8.size8,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .fontsize-ensurer.reset-size6.size7,.katex .fontsize-ensurer.reset-size7.size8,.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size1.size2,.katex .sizing.reset-size6.size7,.katex .sizing.reset-size7.size8,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size1.size4,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size1.size5,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size1.size6,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size1.size7,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size1.size8,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .fontsize-ensurer.reset-size7.size6,.katex .fontsize-ensurer.reset-size8.size7,.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size2.size1,.katex .sizing.reset-size7.size6,.katex .sizing.reset-size8.size7,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size2.size4,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size2.size5,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size4.size1,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size4.size2,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size5.size1,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size5.size2,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size6.size1,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size8,.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size6.size8,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size7.size1,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size8.size1,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size6,.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size8.size6,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .delimsizing.mult .delim-size1>span,.katex .delimsizing.size1,.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .delimsizing.size2,.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.mult .delim-size4>span,.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .accent .accent-body:not(.accent-full){width:0}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex svg{fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:block;height:inherit;width:100%}.katex svg path{stroke:none}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .stretchy{display:block;overflow:hidden;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;width:100%}.katex .brace-center,.katex .brace-left,.katex .brace-right,.katex .halfarrow-left,.katex .halfarrow-right{position:absolute;overflow:hidden}.katex .halfarrow-left{left:0;width:50.2%}.katex .halfarrow-right{right:0;width:50.2%}.katex .brace-left{left:0;width:25.1%}.katex .brace-center{left:25%;width:50%}.katex .brace-right{right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:"(" counter(a) ")";counter-increment:a}.katex .mml-eqn-num:before{content:"(" counter(b) ")";counter-increment:b}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.nav_cMpg,.root_QACb{margin:0 auto;max-width:var(--container-max-width)}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}.hidden{opacity:0;visibility:hidden;display:none}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}[data-theme=dark] .themedImage--dark_OvIx,[data-theme=light] .themedImage--light_BL8e,html:not([data-theme]) .themedImage--light_BL8e{display:initial}.icon_S7Kx.s_AZDZ svg{width:10px}.icon_S7Kx.m_thRi svg{width:20px}.icon_S7Kx.l_WHPt svg{width:40px}[data-theme=dark] .icon_S7Kx.fill_hNhN,[data-theme=dark] .icon_S7Kx.fill_hNhN *{fill:var(--ifm-color-white)}[data-theme=dark] .icon_S7Kx.stroke_N8dm svg,[data-theme=dark] .icon_S7Kx.stroke_N8dm svg *{stroke:var(--ifm-color-white)}[data-theme=light] .icon_S7Kx.fill_hNhN,[data-theme=light] .icon_S7Kx.fill_hNhN *{fill:var(--ifm-color-black)}[data-theme=light] .icon_S7Kx.stroke_N8dm svg,[data-theme=light] .icon_S7Kx.stroke_N8dm svg *{stroke:var(--ifm-color-black)}.backdrop_Ifvc{background:rgb(var(--lsd-surface-primary));z-index:201}.backdrop_Ifvc,.navWrapper_ybYI{height:100%;left:0;opacity:0;position:fixed;top:0;visibility:hidden;width:100%}.navWrapper_ybYI{background:#0000;z-index:203}.navWrapper_ybYI>*{pointer-events:auto}.nav_cMpg{align-items:center;background:rgb(var(--lsd-surface-primary));display:flex;flex-direction:row;height:var(--ifm-navbar-height);justify-content:space-between;padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.visible_ynAX{opacity:1!important;visibility:visible!important}.wrapper_SWrM:not(.active_qZD5) .fullscreenButton_Bocn{background:rgb(var(--lsd-surface-primary));bottom:8px;position:absolute;right:8px;transition:.3s}.root_QACb{padding:0;width:100%}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit;text-decoration:underline}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.iconExternalLink_nPIU{margin-left:.3rem}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.firstRow_ar1q{border-top:1px solid rgb(var(--lsd-text-primary));margin-bottom:96px!important}.firstRow_ar1q,.secondRow__ww3{display:flex;flex-direction:row}.secondRow__ww3{border-top:1px solid rgb(var(--lsd-border-primary));padding-bottom:16px!important}.backToTop_wDfN{bottom:16px;position:absolute}.l-modal,.l-modal__backdrop{position:fixed;top:0;left:0}.backToTop_wDfN,.footerLink_sh7M{width:-moz-fit-content;width:fit-content}.footerLink_sh7M{height:-moz-fit-content;height:fit-content;text-decoration:underline}.toggle_K23S{border:1px solid rgb(var(--lsd-border-primary));height:32px;width:32px}.toggle_K23S svg{height:14px;width:14px}.toggleButton_dl49{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.dropdownNavbarItem_o23I,.l-modal__content{border:1px solid rgb(var(--lsd-border-primary))}.toggleButton_dl49:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_AAS_{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}.l-modal{height:100vh;opacity:0;transition:.3s;visibility:hidden;width:100%;z-index:9999}.l-modal__container{display:grid;gap:1rem;grid-template-columns:repeat(24,1fr);margin:0 auto;max-width:1376px;overflow:auto}.l-modal--open{opacity:1;visibility:visible}.l-modal__content{background:rgb(var(--lsd-surface-primary));grid-column:8/19;height:-moz-fit-content;height:fit-content;margin:64px 0;max-height:80vh;padding:7px;z-index:9998}.groups_p1lF,.root_ONDG{max-height:60vh;overflow-y:auto}.l-modal__backdrop{background-color:rgba(var(--lsd-surface-primary),.6);height:100%;width:100%;z-index:9997}.modal_kLVz .header_QwCa{align-items:center;display:flex;flex-direction:row;gap:.5rem}.root_EFVO{padding:32px;text-align:center}.root_ONDG{padding:24px}.title_uwS_{font-size:.75rem!important}.item_RHYF{align-items:center;display:flex;flex-direction:row;margin-top:1rem}.item_RHYF .itemTitle_jtAv{flex-grow:1;overflow:hidden;padding-left:1rem;text-overflow:ellipsis;white-space:nowrap}.linkContent__x3v,.root_JWD1{align-items:center;display:flex}.item_RHYF .itemTitle_jtAv mark,.root_JWD1 mark{background:none;color:inherit}.root_xZfc{padding:8px 8px 0;position:relative;width:100%}.collapse_LWBd button,.textField_af43{width:100%!important}.textField_af43 button svg{height:auto;max-height:100%!important;width:14px}.root_N57j>div:first-child{color:#828285;padding:0 24px}.root_N57j>div:first-child,.root_N57j>div:first-child *{font-size:.75rem}.root_N57j ul li{margin-top:1rem}.root_JWD1{padding:0 24px}.root_JWD1>div{margin-left:1rem}.root_Ooa0{text-decoration:none!important}.root_Ooa0.level1_fpUf{display:block;padding-left:32px}.icon_sZn2{height:auto;width:16px}[data-theme=light] .icon_sZn2{color:#000}[data-theme=dark] .icon_sZn2{color:#fff}.root_ltHz{padding:24px 0}.groups_p1lF{display:flex;flex-direction:column;gap:16px}[data-theme=dark] .divider_eGUz>div{opacity:.1}[data-theme=dark] .topBar_Dtew button{background-color:var(--ifm-button-color)}.linkContent__x3v{gap:6px;text-decoration:none}.linkContent__x3v:hover{text-decoration:underline;text-decoration-color:rgba(var(--lsd-text-primary),.6);text-underline-offset:.3rem}.externalLinkIcon_Qfue{width:8px}.externalLinkIcon_Qfue svg{height:auto;width:100%}.dropdownNavbarItem_o23I{height:28px;padding:6px 12px}.navbarHideable_OoEf{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_zoxl{transform:translate3d(0,calc(-100% - 2px),0)}.rightSection_CLeF{align-items:center;display:flex;justify-content:flex-end;white-space:nowrap}.iconButtonGroup_ktNv button:not(:last-child){border-right:1px solid!important;margin-right:-1px!important}body,html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;height:100%}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.breadcrumbsContainer_RLvU{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:24px}.codeBlockContainer_Ckt0{background:var(--prism-background-color);border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw)}.codeBlockContainer_Ckt0,.codeBlockContainer_EB2s{color:var(--prism-color);margin-bottom:var(--ifm-leading)}.codeBlockContainer_EB2s{background:#0000;border-radius:0}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_TWhw,.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V,.codeBlockTitle_sjMo+.codeBlockContent_ugSV .codeBlock_TWhw{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_LDrR,.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.buttonGroup_Qu4e button,.buttonGroup__atx button{color:var(--prism-color);line-height:0;transition:opacity var(--ifm-transition-fast) ease-in-out}.codeBlockLinesWithNumbering_bsRF,.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup_Qu4e,.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;background:var(--prism-background-color);border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;opacity:0;padding:.4rem}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:c;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(c);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_YovB{opacity:1!important}.copyButtonIcons_an20{align-items:center;display:flex;justify-content:center;position:relative}.copyButtonIcon_ZL7v,.copyButtonSuccessIcon_P2h8{fill:currentColor;height:14px;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:14px}.copyButtonSuccessIcon_P2h8{color:#00d600;opacity:0}.copyButtonCopied_YovB .copyButtonIcon_ZL7v{opacity:0}.copyButtonCopied_YovB .copyButtonSuccessIcon_P2h8{opacity:1;transition-delay:75ms}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.codeBlockTitle_sjMo{background:var(--prism-background-color);border-bottom:1px solid var(--ifm-color-primary);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.buttonGroup_Qu4e button{align-items:center;background:var(--prism-background-color);border:1px solid rgb(var(--lsd-border-primary));display:flex;height:28px;justify-content:center;opacity:0;width:28px}.buttonGroup_Qu4e button:focus-visible,.buttonGroup_Qu4e button:hover{opacity:1!important}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.img_ev3q{height:auto}.admonition_ntHH{border:1px solid var(--ifm-alert-border-color);display:flex;gap:18px;margin-bottom:24px;padding:18px}.admonitionHeading_JPfy{font-size:1.25rem!important;font-weight:400;line-height:1.5rem!important;margin-bottom:.3rem}.admonitionHeading_JPfy code{text-transform:none}.admonitionIcon_BGV6{display:inline-block}.admonitionIcon_BGV6 svg{display:inline-block;height:16px;width:16px}.admonitionIcon_BGV6 svg *{stroke:none!important;fill:var(--ifm-alert-border-color)}.admonitionContent_iozl{display:block;margin-top:12px}.root_UH70,.tagWithCount_gIvh{align-items:center;display:flex}.tag_dtsN{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_dtsN:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_SGIC{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_gIvh{border-left:0;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_gIvh:after,.tagWithCount_gIvh:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_gIvh:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_gIvh:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_gIvh span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.root_UH70{flex-direction:row}.tags_LT8x{display:inline;margin:0 0 0 1rem!important;padding:0!important}.tag_NdBD:not(:first-child){margin-left:.5rem}.tag_NdBD a{margin:0!important;padding:0!important}.lastUpdated_vwxv{font-size:smaller;font-style:italic;margin-top:.2rem}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.tocCollapsibleButton_dxRj{align-items:center;border:1px solid rgb(var(--lsd-border-primary));display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButtonExpanded_TSyC:after,.tocCollapsibleExpanded_zTjk{transform:none}.tocCollapsible_ROek{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_Qsjj>ul{border-left:none;border:1px solid rgb(var(--lsd-border-primary))!important;border-top:none!important;font-size:15px;padding:.2rem 0}.tocCollapsibleContent_Qsjj ul li{margin:.4rem .8rem}.tocCollapsibleContent_Qsjj a{display:block;-webkit-text-decoration:var(--ifm-link-text-decoration);text-decoration:var(--ifm-link-text-decoration)}.badge_AsjZ{background:#0000}.docItemGrid_SzoZ{display:grid;gap:16px;grid-template-columns:repeat(14,1fr)}.gap1_XuuQ{grid-column:span 1}.tocMobile_imaF{margin-bottom:2rem;margin-top:-.5rem}.tocMobile_imaF>div{display:block!important;margin:0}.docItemContainer_hrrU h1{margin-bottom:40px!important}.docItemContainer_hrrU h2,.docItemContainer_hrrU h3{margin-top:32px!important}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}.chevron_How5{left:0;position:absolute}.docMainContainer_gTbr,.docPage__5DB{display:flex;width:100%}.docPage__5DB{flex:1 0}.docsWrapper_BCFX{display:flex;flex:1 0 auto}.root_jG9K{align-items:center;display:flex;flex-direction:column;padding:1rem!important;width:100%}.root_jG9K>div{max-width:796px!important;width:100%}.root_jG9K>div>div{align-items:flex-start;display:flex;flex-direction:column;gap:1rem;padding:0!important}.root_jG9K a{margin-top:2.5rem}@media (min-width:768px){.blog-archive-page .main-wrapper main>section .container>.row{display:grid;gap:64px 24px;grid-template-columns:repeat(24,1fr)}.blog-archive-page .main-wrapper main>section .container>.row>.col{grid-column:span 12;margin:0!important;max-width:unset;padding:0 8.3333333333% 0 0}}@media (min-width:997px){.full-width>div .main-wrapper main>div>div{grid-template-columns:unset!important}.main-wrapper .container{padding-bottom:96px}.main-wrapper>div{display:grid;gap:1rem;grid-template-columns:repeat(16,45px);margin:auto;width:-moz-fit-content;width:fit-content}.main-wrapper>div aside{border:none;grid-column:1/5;padding-left:var(--content-padding);width:auto}.main-wrapper>div main{grid-column:6/16;margin-top:48px;max-width:none}.navbar__left{flex-basis:8.3333333333%;flex:0 1 auto}.navbar__left-items{flex:1 0;margin:auto}nav.menu{margin-top:48px;padding-top:16px}.container{padding-inline:0!important}.navbar .lsd-icon-button--medium{height:28px!important;width:28px!important}.blog-wrapper>.container>.row{display:grid;gap:16px;grid-template-columns:repeat(24,1fr)}.blog-wrapper>.container>.row>aside{grid-column:1/5}.blog-wrapper>.container>.row>main{grid-column:6/20}.blog-wrapper:not(.blog-wrapper--index)>.container>.row>div:last-child{grid-column:21/25;max-width:unset}.wrapper_SWrM:not(.active_qZD5) .fullscreenButton_Bocn{background:rgb(var(--lsd-surface-primary));bottom:8px;display:flex;opacity:0;position:absolute;right:8px;transition:.3s;visibility:hidden}.wrapper_SWrM:not(.active_qZD5):hover .fullscreenButton_Bocn{opacity:1;visibility:visible}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.searchBox_ZlJk{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_vwxv{text-align:right}.tocMobile_ITEo{display:none}.docItemGrid_SzoZ{display:grid;gap:var(--doc-grid-gap);grid-template-columns:repeat(11,1fr)}.docItemCol_F52z{grid-column:span 11}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_NjKY{flex-grow:1;padding-top:16px}@supports (scrollbar-gutter:stable){.menu_NjKY{scrollbar-gutter:stable}}.menuWithAnnouncementBar_U5pk{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_UEyd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height)}.sidebarWithHideableNavbar__00c{padding-top:0!important}.sidebarHidden_F1ZE{opacity:0;visibility:hidden}.sidebarLogo_Ydl9{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_Ydl9 img{height:2rem;margin-right:.5rem}.expandButton_m80_{align-items:center;background-color:var(--docusaurus-collapse-button-bg);display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}.expandButton_m80_:focus,.expandButton_m80_:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.expandButtonIcon_BlDH{transform:rotate(0)}[dir=rtl] .expandButtonIcon_BlDH{transform:rotate(180deg)}.docSidebarContainer_b6E3{border-right:1px solid var(--ifm-toc-border-color);-webkit-clip-path:inset(0);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_b3ry{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_Xe31{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_gTbr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_Uz_u{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_czyv{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}}@media (min-width:997px)and (max-width:1199px){.main-wrapper .container>div>div,.navbar{padding-inline:0!important}.main-wrapper,.navbar{width:960px!important}.events .main-wrapper>div aside{grid-column:1/1}.events .main-wrapper>div main,.navbar__inner{grid-column:1/17}.plugin-id-root-pages main{grid-column:4/14!important}.main-wrapper .container{padding-bottom:96px}.main-wrapper>div{width:960px}.navbar{display:grid;gap:1rem;grid-template-columns:repeat(16,45px);margin:auto}.navbar__left-items{display:flex;justify-content:center}.main-wrapper{margin:0 auto!important}}@media (min-width:1200px){.main-wrapper>div main>.container,.main-wrapper>main>.row>.col,.navbar{padding-inline:0!important}.plugin-id-root-pages main{grid-column:4/16!important}.footer{padding:0!important}.main-wrapper>div{display:grid;gap:1rem;grid-template-columns:repeat(16,1fr);margin-inline:unset;width:unset}.main-wrapper>div aside{border:none;grid-column:1/4;width:auto}.main-wrapper>div main{grid-column:5/17;max-width:none}.theme-doc-toc-desktop{top:calc(var(--ifm-navbar-height))!important}.navbar__inner{display:grid;gap:16px;grid-template-columns:repeat(24,1fr);padding:0}.navbar__left{align-items:center;display:flex;flex-direction:row;grid-column:1/6}.navbar__left-items{grid-column:6/20}.navbar__right-items{flex-direction:row;gap:16px;grid-column:20/25;justify-content:flex-end}.blog-archive-page .main-wrapper main>section .container>.row{display:grid;gap:64px 24px;grid-template-columns:repeat(24,1fr)}.blog-archive-page .main-wrapper main>section .container>.row>.col{grid-column:span 8;margin:0!important;max-width:unset;padding:0 12.5% 0 0}.docItemGrid_SzoZ{display:grid;gap:var(--doc-grid-gap);grid-template-columns:repeat(12,1fr)}.docItemCol_F52z{grid-column:span 10}.tocMobile_imaF{display:none}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:1199px){.main-wrapper main>.container{padding-bottom:calc(var(--desktop-footer-gap) - var(--ifm-footer-padding-vertical) - var(--doc-grid-gap))!important}.header-github-link:before{margin-right:16px}.toc_pP_5{display:none}}@media (max-width:997px);@media (max-width:996px){.navbar-sidebar__close,.navbar__toggle{border:1px solid rgb(var(--lsd-border-primary))}.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0;padding-bottom:0!important;--ifm-footer-padding-horizontal:var(--content-padding)}.desktop,.footer__link-separator,.navbar__item,.navbar__left-items{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item,.main-wrapper>div,.tocMobile_imaF{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid,.root_xZfc{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}:root{--ifm-background-color:rgb(var(--lsd-surface-primary))}.navbar__color-mode-toggle{display:none!important}.main-wrapper main>.container{padding-bottom:calc(var(--mobile-footer-gap) - var(--ifm-footer-padding-vertical) - var(--doc-grid-gap))!important}.grid{grid-template-columns:repeat(2,1fr)}.footer-grid,.l-modal__container{grid-template-columns:1fr}.navbar__toggle{align-items:center;box-sizing:border-box;display:flex;height:32px;justify-content:center;margin:0;width:32px}.navbar__toggle svg{height:14px;width:14px}.theme-admonition{display:block!important}.navbar-sidebar:not(.navbar-sidebar--show-secondary) .menu{padding-inline:0}.navbar-sidebar:not(.navbar-sidebar--show-secondary) .menu__list{display:flex;flex-direction:column;gap:8px;padding:var(--content-padding)}.navbar-sidebar:not(.navbar-sidebar--show-secondary) .menu__link{border-left:none;padding-left:0}.navbar-sidebar:not(.navbar-sidebar--show-secondary) .menu__link>div{font-family:var(--lsd-typography-generic-font-family)!important;font-size:var(--lsd-subtitle2-fontSize)!important;font-weight:var(--lsd-subtitle2-fontWeight)!important;line-height:var(--lsd-subtitle2-lineHeight)!important;text-decoration:none}.navbar-sidebar:not(.navbar-sidebar--show-secondary) .footer{margin-top:3rem;padding:0!important}.navbar-sidebar:not(.navbar-sidebar--show-secondary) .footer>div{display:flex!important;flex-direction:column!important;gap:32px!important}.colorModeToggle_GSaI,.dropdownNavbarItem_o23I,.l-modal__backdrop,.navbar-sidebar:not(.navbar-sidebar--show-secondary) .footer>button,.tableOfContents_bqdL{display:none}.navbar-sidebar:not(.navbar-sidebar--show-secondary) .footer .container.container-fluid{margin-bottom:16px!important;padding-inline:var(--content-padding)}.navbar-sidebar:not(.navbar-sidebar--show-secondary) .footer .container.container-fluid>.footer__links{gap:0!important}.navbar-sidebar:not(.navbar-sidebar--show-secondary) .footer>div[class*=secondRow]{margin:var(--content-padding)}.navbar-sidebar:not(.navbar-sidebar--show-secondary) .footer .footer__links{gap:16px!important}.navbar-sidebar__brand{height:60px;padding-block:0}.navbar-sidebar__brand>button{height:32px;width:32px}.navbar-sidebar__brand>button:first-of-type{margin-left:auto;margin-right:0!important}.navbar-sidebar__brand>button:not(:last-of-type){border-right:none}.navbar-sidebar__close{align-items:center;display:flex;justify-content:center;margin-left:unset}.blog-divider{margin-block:32px!important}.blog-wrapper main{padding-inline:var(--content-padding)}.blog-wrapper article footer{align-items:flex-start;flex-direction:column}.blog-wrapper article footer .read-more-link{margin-top:24px}.blog-wrapper article footer .read-more-link,.blog-wrapper article footer .read-more-link button{flex-basis:100%;width:100%}.blog-wrapper h1[itemprop=headline]{font-family:var(--lsd-typography-generic-font-family)!important;font-size:var(--lsd-h2-fontSize)!important;font-weight:var(--lsd-h2-fontWeight)!important;line-height:var(--lsd-h2-lineHeight)!important}.wrapper_SWrM>div{overflow:visible!important}.nav_cMpg{height:56px}.backToTop_wDfN{bottom:16px;left:16px;margin-top:76px!important;position:relative}.l-modal{overflow:hidden;width:100vw}.l-modal__container{display:grid;height:100vh;max-width:unset;min-height:-webkit-fill-available;width:100%}.root_ONDG,.root_ltHz{height:100%;overflow:auto}.l-modal__content{border:none;grid-column:1/2;grid-row:1/2;height:100%;margin:0;max-height:100vh;overflow:hidden}.modal_kLVz .header_QwCa{padding:12px 16px}.modal_kLVz .closeButton_Rr0e{display:block;height:2rem;width:2rem}.root_EFVO{padding:40px 24px}.root_ONDG{max-height:100%;padding:24px 24px 64px}.groups_p1lF{max-height:unset;overflow:auto}.root_ltHz{padding:24px 0 64px}.searchBox_ZlJk{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}.docItemGrid_SzoZ{display:grid;grid-template-columns:repeat(2,1fr);padding-left:0}.docItemCol_F52z{grid-column:span 2}}@media (max-width:767px){.blog-archive-page .main-wrapper main>section .container>.row{margin-top:0}.blog-archive-page .main-wrapper main>section .container>.row .col{margin-top:40px!important}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media (max-width:575px){:root{--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-button-size-multiplier:1.25;--ifm-button-padding-horizontal:calc(var(--ifm-button-size-multiplier)*var(--ifm-spacing-horizontal));--ifm-button-padding-vertical:calc(var(--ifm-button-size-multiplier)*var(--ifm-spacing-vertical));--ifm-alert-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-alert-padding-vertical:calc(var(--ifm-spacing-vertical)*2)}.markdown>h2{--ifm-h2-font-size:1.75rem}.markdown h4{--ifm-h4-font-size:1.25rem!important}.footer>div{display:flex!important;flex-direction:column;gap:40px!important;margin-inline:16px;padding-inline:0!important;width:auto}.footer__links{display:flex!important;flex-direction:column!important}.footer__links>div:first-of-type,.footer__links>div:nth-of-type(3){margin-bottom:4px!important}.footer__links>div:nth-of-type(2){margin-bottom:34px!important}.col.footer__col{margin-bottom:0!important}.navbar__left{display:flex}.bottom-cta-sections .mdx-grid__content{gap:98px!important}.bottom-cta-sections .mdx-grid__content:last-of-type>div:last-of-type>.mdx-input-cta-section__container{margin-bottom:120px}.events .main-wrapper main>.container{padding-bottom:0!important}.footer{--ifm-footer-padding-horizontal:0}.firstRow_ar1q{margin-bottom:64px!important;padding-inline:var(--content-padding)!important}.secondRow__ww3{margin-inline:var(--content-padding)!important}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_LDrR,.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/fonts/KaTeX_AMS-Regular-73ea273a72f4aca30ca528cf9117470a.woff2 b/assets/fonts/KaTeX_AMS-Regular-73ea273a72f4aca30ca528cf9117470a.woff2 new file mode 100644 index 000000000..0acaaff03 Binary files /dev/null and b/assets/fonts/KaTeX_AMS-Regular-73ea273a72f4aca30ca528cf9117470a.woff2 differ diff --git a/assets/fonts/KaTeX_AMS-Regular-853be92419a6c3766b9afe7a7c3e32fa.ttf b/assets/fonts/KaTeX_AMS-Regular-853be92419a6c3766b9afe7a7c3e32fa.ttf new file mode 100644 index 000000000..c6f9a5e7c Binary files /dev/null and b/assets/fonts/KaTeX_AMS-Regular-853be92419a6c3766b9afe7a7c3e32fa.ttf differ diff --git a/assets/fonts/KaTeX_AMS-Regular-d562e886c52f12660a41eea8d05af757.woff b/assets/fonts/KaTeX_AMS-Regular-d562e886c52f12660a41eea8d05af757.woff new file mode 100644 index 000000000..b804d7b33 Binary files /dev/null and b/assets/fonts/KaTeX_AMS-Regular-d562e886c52f12660a41eea8d05af757.woff differ diff --git a/assets/fonts/KaTeX_Caligraphic-Bold-7489a2fbfb9bfe70442031a27fb57a21.ttf b/assets/fonts/KaTeX_Caligraphic-Bold-7489a2fbfb9bfe70442031a27fb57a21.ttf new file mode 100644 index 000000000..9ff4a5e04 Binary files /dev/null and b/assets/fonts/KaTeX_Caligraphic-Bold-7489a2fbfb9bfe70442031a27fb57a21.ttf differ diff --git a/assets/fonts/KaTeX_Caligraphic-Regular-7e873d3833eb108a0758be45cd29e907.ttf b/assets/fonts/KaTeX_Caligraphic-Regular-7e873d3833eb108a0758be45cd29e907.ttf new file mode 100644 index 000000000..f522294ff Binary files /dev/null and b/assets/fonts/KaTeX_Caligraphic-Regular-7e873d3833eb108a0758be45cd29e907.ttf differ diff --git a/assets/fonts/KaTeX_Fraktur-Bold-354501bac435c3264834b80301089bad.woff b/assets/fonts/KaTeX_Fraktur-Bold-354501bac435c3264834b80301089bad.woff new file mode 100644 index 000000000..e7730f662 Binary files /dev/null and b/assets/fonts/KaTeX_Fraktur-Bold-354501bac435c3264834b80301089bad.woff differ diff --git a/assets/fonts/KaTeX_Fraktur-Bold-4c761b3711973ab04edf7ea6f1fbacdc.ttf b/assets/fonts/KaTeX_Fraktur-Bold-4c761b3711973ab04edf7ea6f1fbacdc.ttf new file mode 100644 index 000000000..4e98259c3 Binary files /dev/null and b/assets/fonts/KaTeX_Fraktur-Bold-4c761b3711973ab04edf7ea6f1fbacdc.ttf differ diff --git a/assets/fonts/KaTeX_Fraktur-Bold-931d67ea207ab37ee693ff155ff4d7a6.woff2 b/assets/fonts/KaTeX_Fraktur-Bold-931d67ea207ab37ee693ff155ff4d7a6.woff2 new file mode 100644 index 000000000..395f28bea Binary files /dev/null and b/assets/fonts/KaTeX_Fraktur-Bold-931d67ea207ab37ee693ff155ff4d7a6.woff2 differ diff --git a/assets/fonts/KaTeX_Fraktur-Regular-172d3529b26f8cedef6b5ddef7546e02.woff2 b/assets/fonts/KaTeX_Fraktur-Regular-172d3529b26f8cedef6b5ddef7546e02.woff2 new file mode 100644 index 000000000..735f6948d Binary files /dev/null and b/assets/fonts/KaTeX_Fraktur-Regular-172d3529b26f8cedef6b5ddef7546e02.woff2 differ diff --git a/assets/fonts/KaTeX_Fraktur-Regular-6fdf0ac577be0ba82a4c9a89b8eef91b.woff b/assets/fonts/KaTeX_Fraktur-Regular-6fdf0ac577be0ba82a4c9a89b8eef91b.woff new file mode 100644 index 000000000..acab069f9 Binary files /dev/null and b/assets/fonts/KaTeX_Fraktur-Regular-6fdf0ac577be0ba82a4c9a89b8eef91b.woff differ diff --git a/assets/fonts/KaTeX_Fraktur-Regular-ed305b5434865e06ffde7da0d28101af.ttf b/assets/fonts/KaTeX_Fraktur-Regular-ed305b5434865e06ffde7da0d28101af.ttf new file mode 100644 index 000000000..b8461b275 Binary files /dev/null and b/assets/fonts/KaTeX_Fraktur-Regular-ed305b5434865e06ffde7da0d28101af.ttf differ diff --git a/assets/fonts/KaTeX_Main-Bold-0c3b8929d377c0e9b2f3a9c872e3337b.woff b/assets/fonts/KaTeX_Main-Bold-0c3b8929d377c0e9b2f3a9c872e3337b.woff new file mode 100644 index 000000000..f38136ac1 Binary files /dev/null and b/assets/fonts/KaTeX_Main-Bold-0c3b8929d377c0e9b2f3a9c872e3337b.woff differ diff --git a/assets/fonts/KaTeX_Main-Bold-39890742bc957b368704509bb2f4163c.woff2 b/assets/fonts/KaTeX_Main-Bold-39890742bc957b368704509bb2f4163c.woff2 new file mode 100644 index 000000000..ab2ad21da Binary files /dev/null and b/assets/fonts/KaTeX_Main-Bold-39890742bc957b368704509bb2f4163c.woff2 differ diff --git a/assets/fonts/KaTeX_Main-Bold-8169508bf58f8bd92ad8a768ede68a18.ttf b/assets/fonts/KaTeX_Main-Bold-8169508bf58f8bd92ad8a768ede68a18.ttf new file mode 100644 index 000000000..4060e627d Binary files /dev/null and b/assets/fonts/KaTeX_Main-Bold-8169508bf58f8bd92ad8a768ede68a18.ttf differ diff --git a/assets/fonts/KaTeX_Main-BoldItalic-20f389c4120be058d80a3cd6a2f5a9b9.woff2 b/assets/fonts/KaTeX_Main-BoldItalic-20f389c4120be058d80a3cd6a2f5a9b9.woff2 new file mode 100644 index 000000000..5931794de Binary files /dev/null and b/assets/fonts/KaTeX_Main-BoldItalic-20f389c4120be058d80a3cd6a2f5a9b9.woff2 differ diff --git a/assets/fonts/KaTeX_Main-BoldItalic-428978dc7837d46de0916f266f5a43df.woff b/assets/fonts/KaTeX_Main-BoldItalic-428978dc7837d46de0916f266f5a43df.woff new file mode 100644 index 000000000..67807b0bd Binary files /dev/null and b/assets/fonts/KaTeX_Main-BoldItalic-428978dc7837d46de0916f266f5a43df.woff differ diff --git a/assets/fonts/KaTeX_Main-BoldItalic-828abcb200061cffbaae1f0498f821a8.ttf b/assets/fonts/KaTeX_Main-BoldItalic-828abcb200061cffbaae1f0498f821a8.ttf new file mode 100644 index 000000000..dc007977e Binary files /dev/null and b/assets/fonts/KaTeX_Main-BoldItalic-828abcb200061cffbaae1f0498f821a8.ttf differ diff --git a/assets/fonts/KaTeX_Main-Italic-fa675e5e4bec9eb250b6a8cac09b189b.ttf b/assets/fonts/KaTeX_Main-Italic-fa675e5e4bec9eb250b6a8cac09b189b.ttf new file mode 100644 index 000000000..0e9b0f354 Binary files /dev/null and b/assets/fonts/KaTeX_Main-Italic-fa675e5e4bec9eb250b6a8cac09b189b.ttf differ diff --git a/assets/fonts/KaTeX_Main-Italic-fd947498bc16392e76c23adf58513fb3.woff b/assets/fonts/KaTeX_Main-Italic-fd947498bc16392e76c23adf58513fb3.woff new file mode 100644 index 000000000..6f43b594b Binary files /dev/null and b/assets/fonts/KaTeX_Main-Italic-fd947498bc16392e76c23adf58513fb3.woff differ diff --git a/assets/fonts/KaTeX_Main-Italic-fe2176f79edaa716e6212cca53949439.woff2 b/assets/fonts/KaTeX_Main-Italic-fe2176f79edaa716e6212cca53949439.woff2 new file mode 100644 index 000000000..b50920e13 Binary files /dev/null and b/assets/fonts/KaTeX_Main-Italic-fe2176f79edaa716e6212cca53949439.woff2 differ diff --git a/assets/fonts/KaTeX_Main-Regular-4f35fbcc9ee8614c2bcc8c28314db234.woff b/assets/fonts/KaTeX_Main-Regular-4f35fbcc9ee8614c2bcc8c28314db234.woff new file mode 100644 index 000000000..21f581296 Binary files /dev/null and b/assets/fonts/KaTeX_Main-Regular-4f35fbcc9ee8614c2bcc8c28314db234.woff differ diff --git a/assets/fonts/KaTeX_Main-Regular-9eba1d77abcf2aa6e94e823d52be546b.ttf b/assets/fonts/KaTeX_Main-Regular-9eba1d77abcf2aa6e94e823d52be546b.ttf new file mode 100644 index 000000000..dd45e1ed2 Binary files /dev/null and b/assets/fonts/KaTeX_Main-Regular-9eba1d77abcf2aa6e94e823d52be546b.ttf differ diff --git a/assets/fonts/KaTeX_Main-Regular-f650f111a3b890d116f1ba740b7e3de3.woff2 b/assets/fonts/KaTeX_Main-Regular-f650f111a3b890d116f1ba740b7e3de3.woff2 new file mode 100644 index 000000000..eb24a7ba2 Binary files /dev/null and b/assets/fonts/KaTeX_Main-Regular-f650f111a3b890d116f1ba740b7e3de3.woff2 differ diff --git a/assets/fonts/KaTeX_Math-BoldItalic-3f07ed67f06c720120cedd0bad5f60e2.woff b/assets/fonts/KaTeX_Math-BoldItalic-3f07ed67f06c720120cedd0bad5f60e2.woff new file mode 100644 index 000000000..0ae390d74 Binary files /dev/null and b/assets/fonts/KaTeX_Math-BoldItalic-3f07ed67f06c720120cedd0bad5f60e2.woff differ diff --git a/assets/fonts/KaTeX_Math-BoldItalic-bf2d440b3a42ea78a998ccd32eb09d88.ttf b/assets/fonts/KaTeX_Math-BoldItalic-bf2d440b3a42ea78a998ccd32eb09d88.ttf new file mode 100644 index 000000000..728ce7a1e Binary files /dev/null and b/assets/fonts/KaTeX_Math-BoldItalic-bf2d440b3a42ea78a998ccd32eb09d88.ttf differ diff --git a/assets/fonts/KaTeX_Math-BoldItalic-dcbcbd93bac0470b462db6f9708a658c.woff2 b/assets/fonts/KaTeX_Math-BoldItalic-dcbcbd93bac0470b462db6f9708a658c.woff2 new file mode 100644 index 000000000..29657023a Binary files /dev/null and b/assets/fonts/KaTeX_Math-BoldItalic-dcbcbd93bac0470b462db6f9708a658c.woff2 differ diff --git a/assets/fonts/KaTeX_Math-Italic-6d3d25f4820d0da8f01fa3d2c7cbb8c2.woff2 b/assets/fonts/KaTeX_Math-Italic-6d3d25f4820d0da8f01fa3d2c7cbb8c2.woff2 new file mode 100644 index 000000000..215c143fd Binary files /dev/null and b/assets/fonts/KaTeX_Math-Italic-6d3d25f4820d0da8f01fa3d2c7cbb8c2.woff2 differ diff --git a/assets/fonts/KaTeX_Math-Italic-8a5f936332e8028c7278a3a25db00925.ttf b/assets/fonts/KaTeX_Math-Italic-8a5f936332e8028c7278a3a25db00925.ttf new file mode 100644 index 000000000..70d559b4e Binary files /dev/null and b/assets/fonts/KaTeX_Math-Italic-8a5f936332e8028c7278a3a25db00925.ttf differ diff --git a/assets/fonts/KaTeX_Math-Italic-96759856b4e70f3a83385d07e0d33b03.woff b/assets/fonts/KaTeX_Math-Italic-96759856b4e70f3a83385d07e0d33b03.woff new file mode 100644 index 000000000..eb5159d4c Binary files /dev/null and b/assets/fonts/KaTeX_Math-Italic-96759856b4e70f3a83385d07e0d33b03.woff differ diff --git a/assets/fonts/KaTeX_SansSerif-Bold-5b49f4993ae22d7975b413caed1a4c01.ttf b/assets/fonts/KaTeX_SansSerif-Bold-5b49f4993ae22d7975b413caed1a4c01.ttf new file mode 100644 index 000000000..2f65a8a3a Binary files /dev/null and b/assets/fonts/KaTeX_SansSerif-Bold-5b49f4993ae22d7975b413caed1a4c01.ttf differ diff --git a/assets/fonts/KaTeX_SansSerif-Bold-95591a929f0d32aa282a90ba5acf81f0.woff2 b/assets/fonts/KaTeX_SansSerif-Bold-95591a929f0d32aa282a90ba5acf81f0.woff2 new file mode 100644 index 000000000..cfaa3bda5 Binary files /dev/null and b/assets/fonts/KaTeX_SansSerif-Bold-95591a929f0d32aa282a90ba5acf81f0.woff2 differ diff --git a/assets/fonts/KaTeX_SansSerif-Bold-b9cd458ac6d5889ff9c388cf91b8ad51.woff b/assets/fonts/KaTeX_SansSerif-Bold-b9cd458ac6d5889ff9c388cf91b8ad51.woff new file mode 100644 index 000000000..8d47c02d9 Binary files /dev/null and b/assets/fonts/KaTeX_SansSerif-Bold-b9cd458ac6d5889ff9c388cf91b8ad51.woff differ diff --git a/assets/fonts/KaTeX_SansSerif-Italic-7d393d382f3e7fb1c637280a90a3434b.woff2 b/assets/fonts/KaTeX_SansSerif-Italic-7d393d382f3e7fb1c637280a90a3434b.woff2 new file mode 100644 index 000000000..349c06dc6 Binary files /dev/null and b/assets/fonts/KaTeX_SansSerif-Italic-7d393d382f3e7fb1c637280a90a3434b.woff2 differ diff --git a/assets/fonts/KaTeX_SansSerif-Italic-8d593cfaa96238d5e2f8af9e11cc5a68.woff b/assets/fonts/KaTeX_SansSerif-Italic-8d593cfaa96238d5e2f8af9e11cc5a68.woff new file mode 100644 index 000000000..7e02df963 Binary files /dev/null and b/assets/fonts/KaTeX_SansSerif-Italic-8d593cfaa96238d5e2f8af9e11cc5a68.woff differ diff --git a/assets/fonts/KaTeX_SansSerif-Italic-b257a18c016f37ee45430f59757a0db9.ttf b/assets/fonts/KaTeX_SansSerif-Italic-b257a18c016f37ee45430f59757a0db9.ttf new file mode 100644 index 000000000..d5850df98 Binary files /dev/null and b/assets/fonts/KaTeX_SansSerif-Italic-b257a18c016f37ee45430f59757a0db9.ttf differ diff --git a/assets/fonts/KaTeX_SansSerif-Regular-02271ec5cb9f5b4588ac53d7efbe6de8.woff b/assets/fonts/KaTeX_SansSerif-Regular-02271ec5cb9f5b4588ac53d7efbe6de8.woff new file mode 100644 index 000000000..31b84829b Binary files /dev/null and b/assets/fonts/KaTeX_SansSerif-Regular-02271ec5cb9f5b4588ac53d7efbe6de8.woff differ diff --git a/assets/fonts/KaTeX_SansSerif-Regular-2f7bc363fc5424ebda5903f74c404a99.ttf b/assets/fonts/KaTeX_SansSerif-Regular-2f7bc363fc5424ebda5903f74c404a99.ttf new file mode 100644 index 000000000..537279f6b Binary files /dev/null and b/assets/fonts/KaTeX_SansSerif-Regular-2f7bc363fc5424ebda5903f74c404a99.ttf differ diff --git a/assets/fonts/KaTeX_SansSerif-Regular-cd5e231e0cc53b2cb2c029b09b917782.woff2 b/assets/fonts/KaTeX_SansSerif-Regular-cd5e231e0cc53b2cb2c029b09b917782.woff2 new file mode 100644 index 000000000..a90eea85f Binary files /dev/null and b/assets/fonts/KaTeX_SansSerif-Regular-cd5e231e0cc53b2cb2c029b09b917782.woff2 differ diff --git a/assets/fonts/KaTeX_Script-Regular-073b3402d036714b43709614d1da717a.woff b/assets/fonts/KaTeX_Script-Regular-073b3402d036714b43709614d1da717a.woff new file mode 100644 index 000000000..0e7da821e Binary files /dev/null and b/assets/fonts/KaTeX_Script-Regular-073b3402d036714b43709614d1da717a.woff differ diff --git a/assets/fonts/KaTeX_Script-Regular-fc9ba5249878cd8f8d885c1f42b0f43d.ttf b/assets/fonts/KaTeX_Script-Regular-fc9ba5249878cd8f8d885c1f42b0f43d.ttf new file mode 100644 index 000000000..fd679bf37 Binary files /dev/null and b/assets/fonts/KaTeX_Script-Regular-fc9ba5249878cd8f8d885c1f42b0f43d.ttf differ diff --git a/assets/fonts/KaTeX_Size1-Regular-6de7d4b539221a49e9e241b734653ecf.ttf b/assets/fonts/KaTeX_Size1-Regular-6de7d4b539221a49e9e241b734653ecf.ttf new file mode 100644 index 000000000..871fd7d19 Binary files /dev/null and b/assets/fonts/KaTeX_Size1-Regular-6de7d4b539221a49e9e241b734653ecf.ttf differ diff --git a/assets/fonts/KaTeX_Size2-Regular-57f5c1837853986ea1dbadbb8f4f6074.ttf b/assets/fonts/KaTeX_Size2-Regular-57f5c1837853986ea1dbadbb8f4f6074.ttf new file mode 100644 index 000000000..7a212caf9 Binary files /dev/null and b/assets/fonts/KaTeX_Size2-Regular-57f5c1837853986ea1dbadbb8f4f6074.ttf differ diff --git a/assets/fonts/KaTeX_Size4-Regular-4ad7c7e8bb8d10a34bb7c4bb567cef92.ttf b/assets/fonts/KaTeX_Size4-Regular-4ad7c7e8bb8d10a34bb7c4bb567cef92.ttf new file mode 100644 index 000000000..74f08921f Binary files /dev/null and b/assets/fonts/KaTeX_Size4-Regular-4ad7c7e8bb8d10a34bb7c4bb567cef92.ttf differ diff --git a/assets/fonts/KaTeX_Typewriter-Regular-4c6b94fd1d07f8beff7cf3364d4d4555.woff b/assets/fonts/KaTeX_Typewriter-Regular-4c6b94fd1d07f8beff7cf3364d4d4555.woff new file mode 100644 index 000000000..2432419f2 Binary files /dev/null and b/assets/fonts/KaTeX_Typewriter-Regular-4c6b94fd1d07f8beff7cf3364d4d4555.woff differ diff --git a/assets/fonts/KaTeX_Typewriter-Regular-c295e7f71970f03c0549228b1c18120a.woff2 b/assets/fonts/KaTeX_Typewriter-Regular-c295e7f71970f03c0549228b1c18120a.woff2 new file mode 100644 index 000000000..771f1af70 Binary files /dev/null and b/assets/fonts/KaTeX_Typewriter-Regular-c295e7f71970f03c0549228b1c18120a.woff2 differ diff --git a/assets/fonts/KaTeX_Typewriter-Regular-c5c02d763c89380dcb4ed359e15d0897.ttf b/assets/fonts/KaTeX_Typewriter-Regular-c5c02d763c89380dcb4ed359e15d0897.ttf new file mode 100644 index 000000000..c83252c57 Binary files /dev/null and b/assets/fonts/KaTeX_Typewriter-Regular-c5c02d763c89380dcb4ed359e15d0897.ttf differ diff --git a/assets/images/adaptive_node_continuum2-fb1a9d2c65649ae9b8b1352f309c32f3.png b/assets/images/adaptive_node_continuum2-fb1a9d2c65649ae9b8b1352f309c32f3.png new file mode 100644 index 000000000..48d941db5 Binary files /dev/null and b/assets/images/adaptive_node_continuum2-fb1a9d2c65649ae9b8b1352f309c32f3.png differ diff --git a/assets/images/adaptive_node_cross_section2-0aa6c82d65f7a1ad1359e4e40a00933b.png b/assets/images/adaptive_node_cross_section2-0aa6c82d65f7a1ad1359e4e40a00933b.png new file mode 100644 index 000000000..6e0f45198 Binary files /dev/null and b/assets/images/adaptive_node_cross_section2-0aa6c82d65f7a1ad1359e4e40a00933b.png differ diff --git a/assets/images/adaptive_node_network_topology_protocols2-e9e6de46299f9428bba26e06190569d0.png b/assets/images/adaptive_node_network_topology_protocols2-e9e6de46299f9428bba26e06190569d0.png new file mode 100644 index 000000000..e68ad9f06 Binary files /dev/null and b/assets/images/adaptive_node_network_topology_protocols2-e9e6de46299f9428bba26e06190569d0.png differ diff --git a/assets/images/adaptive_node_network_topology_protocols_legend-0f05eac8aa35d4d80fdeec0ec5038542.png b/assets/images/adaptive_node_network_topology_protocols_legend-0f05eac8aa35d4d80fdeec0ec5038542.png new file mode 100644 index 000000000..1fe2ac4b4 Binary files /dev/null and b/assets/images/adaptive_node_network_topology_protocols_legend-0f05eac8aa35d4d80fdeec0ec5038542.png differ diff --git a/assets/images/adaptive_node_protocol_selection2-72ef48dea918ce65e5244570f65153c4.png b/assets/images/adaptive_node_protocol_selection2-72ef48dea918ce65e5244570f65153c4.png new file mode 100644 index 000000000..55d274ff5 Binary files /dev/null and b/assets/images/adaptive_node_protocol_selection2-72ef48dea918ce65e5244570f65153c4.png differ diff --git a/assets/images/batch-8bb753ee771b1f96610ba432fa7fcec3.png b/assets/images/batch-8bb753ee771b1f96610ba432fa7fcec3.png new file mode 100644 index 000000000..aa3449be1 Binary files /dev/null and b/assets/images/batch-8bb753ee771b1f96610ba432fa7fcec3.png differ diff --git a/assets/images/eth-secpm_add-7a67a0d211cabceae702f2fe6a6bf778.png b/assets/images/eth-secpm_add-7a67a0d211cabceae702f2fe6a6bf778.png new file mode 100644 index 000000000..5eb59e5ef Binary files /dev/null and b/assets/images/eth-secpm_add-7a67a0d211cabceae702f2fe6a6bf778.png differ diff --git a/assets/images/eth-secpm_creation-e9f4d0d596ddd6c261508db853dd9b52.png b/assets/images/eth-secpm_creation-e9f4d0d596ddd6c261508db853dd9b52.png new file mode 100644 index 000000000..669d00203 Binary files /dev/null and b/assets/images/eth-secpm_creation-e9f4d0d596ddd6c261508db853dd9b52.png differ diff --git a/assets/images/eth-secpm_credential-ba3397173859f28e7269577e6258d18d.png b/assets/images/eth-secpm_credential-ba3397173859f28e7269577e6258d18d.png new file mode 100644 index 000000000..42476e0ea Binary files /dev/null and b/assets/images/eth-secpm_credential-ba3397173859f28e7269577e6258d18d.png differ diff --git a/assets/images/eth-secpm_fetching-565512a6395769350b2c5b1274b3f69c.png b/assets/images/eth-secpm_fetching-565512a6395769350b2c5b1274b3f69c.png new file mode 100644 index 000000000..b850b4a3d Binary files /dev/null and b/assets/images/eth-secpm_fetching-565512a6395769350b2c5b1274b3f69c.png differ diff --git a/assets/images/eth-secpm_onchain-register-2-ba304aeb2ae734c0a7016e87c3fc1ad8.png b/assets/images/eth-secpm_onchain-register-2-ba304aeb2ae734c0a7016e87c3fc1ad8.png new file mode 100644 index 000000000..a93c403f0 Binary files /dev/null and b/assets/images/eth-secpm_onchain-register-2-ba304aeb2ae734c0a7016e87c3fc1ad8.png differ diff --git a/assets/images/eth-secpm_onchain-update-091a5510c2f7948003bfc0bf49298f0a.png b/assets/images/eth-secpm_onchain-update-091a5510c2f7948003bfc0bf49298f0a.png new file mode 100644 index 000000000..fac47a5fa Binary files /dev/null and b/assets/images/eth-secpm_onchain-update-091a5510c2f7948003bfc0bf49298f0a.png differ diff --git a/assets/images/eth-secpm_remove-05ff9ff9fe9a3c5b675343752e708dd4.png b/assets/images/eth-secpm_remove-05ff9ff9fe9a3c5b675343752e708dd4.png new file mode 100644 index 000000000..1190c0879 Binary files /dev/null and b/assets/images/eth-secpm_remove-05ff9ff9fe9a3c5b675343752e708dd4.png differ diff --git a/assets/images/eth-secpm_update-5a67b9c8b3debf48af8380a9e4172540.png b/assets/images/eth-secpm_update-5a67b9c8b3debf48af8380a9e4172540.png new file mode 100644 index 000000000..520ff0b64 Binary files /dev/null and b/assets/images/eth-secpm_update-5a67b9c8b3debf48af8380a9e4172540.png differ diff --git a/assets/images/interactive-b04b5377d67c337013e72abbbd40ec69.png b/assets/images/interactive-b04b5377d67c337013e72abbbd40ec69.png new file mode 100644 index 000000000..84e245010 Binary files /dev/null and b/assets/images/interactive-b04b5377d67c337013e72abbbd40ec69.png differ diff --git a/assets/images/lifecycle-ebc51fab60ef30a4d7d045ac3deb0f64.png b/assets/images/lifecycle-ebc51fab60ef30a4d7d045ac3deb0f64.png new file mode 100644 index 000000000..9ee938045 Binary files /dev/null and b/assets/images/lifecycle-ebc51fab60ef30a4d7d045ac3deb0f64.png differ diff --git a/assets/images/notification-03a7ab32603bbca7741c8513211468dd.png b/assets/images/notification-03a7ab32603bbca7741c8513211468dd.png new file mode 100644 index 000000000..e7d945a88 Binary files /dev/null and b/assets/images/notification-03a7ab32603bbca7741c8513211468dd.png differ diff --git a/assets/images/overview-ee0a87b0c5a5083885a7896cadf11d88.png b/assets/images/overview-ee0a87b0c5a5083885a7896cadf11d88.png new file mode 100644 index 000000000..bcf37474b Binary files /dev/null and b/assets/images/overview-ee0a87b0c5a5083885a7896cadf11d88.png differ diff --git a/assets/images/protocol-cd6199a6e06644bdd274578c9e204369.svg b/assets/images/protocol-cd6199a6e06644bdd274578c9e204369.svg new file mode 100644 index 000000000..dda2157af --- /dev/null +++ b/assets/images/protocol-cd6199a6e06644bdd274578c9e204369.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/registration-cc6fec7743be6c531d9b93203960114f.png b/assets/images/registration-cc6fec7743be6c531d9b93203960114f.png new file mode 100644 index 000000000..e3eca23c3 Binary files /dev/null and b/assets/images/registration-cc6fec7743be6c531d9b93203960114f.png differ diff --git a/assets/images/remote-log-5781aa7290ab5e4b5dbf652f5792ef2e.png b/assets/images/remote-log-5781aa7290ab5e4b5dbf652f5792ef2e.png new file mode 100644 index 000000000..892660242 Binary files /dev/null and b/assets/images/remote-log-5781aa7290ab5e4b5dbf652f5792ef2e.png differ diff --git a/assets/images/rln-message-verification-ea3125bbb52d4fff31cb9bfae38668d1.png b/assets/images/rln-message-verification-ea3125bbb52d4fff31cb9bfae38668d1.png new file mode 100644 index 000000000..2360abc82 Binary files /dev/null and b/assets/images/rln-message-verification-ea3125bbb52d4fff31cb9bfae38668d1.png differ diff --git a/assets/images/rln-relay-af494cc4acf699838cd97378b416b105.png b/assets/images/rln-relay-af494cc4acf699838cd97378b416b105.png new file mode 100644 index 000000000..c5b3bef1e Binary files /dev/null and b/assets/images/rln-relay-af494cc4acf699838cd97378b416b105.png differ diff --git a/assets/js/005ab9a5.3c1cca2c.js b/assets/js/005ab9a5.3c1cca2c.js new file mode 100644 index 000000000..2cb07541c --- /dev/null +++ b/assets/js/005ab9a5.3c1cca2c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklogos_docs_template=self.webpackChunklogos_docs_template||[]).push([[8887],{22451:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>c,default:()=>l,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var n=r(87462),a=(r(67294),r(3905));const o={},c="Deprecated RFCs",i={unversionedId:"deprecated/README",id:"deprecated/README",title:"Deprecated RFCs",description:"Deprecated specifications are no longer used in Waku products.",source:"@site/waku/deprecated/README.md",sourceDirName:"deprecated",slug:"/deprecated/",permalink:"/waku/deprecated/",draft:!1,tags:[],version:"current",frontMatter:{},sidebar:"defaultSidebar",previous:{title:"Waku RFCs",permalink:"/waku/"},next:{title:"5/WAKU0",permalink:"/waku/deprecated/5/waku0"}},p={},s=[],u={toc:s};function l(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"deprecated-rfcs"},"Deprecated RFCs"),(0,a.kt)("p",null,"Deprecated specifications are no longer used in Waku products.\nThis subdirectory is for achrive purpose and\nshould not be used in production ready implementations.\nVisit ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/waku-org/specs"},"Waku RFCs"),"\nfor new Waku specifications under discussion."))}l.isMDXComponent=!0},3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),s=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},u=function(e){var t=s(e.components);return n.createElement(p.Provider,{value:t},e.children)},l={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=s(r),f=a,m=d["".concat(p,".").concat(f)]||d[f]||l[f]||o;return r?n.createElement(m,c(c({ref:t},u),{},{components:r})):n.createElement(m,c({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,c=new Array(o);c[0]=d;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:a,c[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>c,frontMatter:()=>r,metadata:()=>s,toc:()=>p});var a=n(87462),i=(n(67294),n(3905));const r={title:"5/WAKU0",name:"Waku v0",status:"deprecated",editor:"Oskar Thor\xe9n <oskarth@titanproxy.com>",contributors:["Adam Babik <adam@status.im>","Andrea Maria Piana <andreap@status.im>","Dean Eigenmann <dean@status.im>","Kim De Mey <kimdemey@status.im>"]},o=void 0,s={unversionedId:"deprecated/5/waku0",id:"deprecated/5/waku0",title:"5/WAKU0",description:"- Status: deprecated",source:"@site/waku/deprecated/5/waku0.md",sourceDirName:"deprecated/5",slug:"/deprecated/5/waku0",permalink:"/waku/deprecated/5/waku0",draft:!1,tags:[],version:"current",frontMatter:{title:"5/WAKU0",name:"Waku v0",status:"deprecated",editor:"Oskar Thor\xe9n <oskarth@titanproxy.com>",contributors:["Adam Babik <adam@status.im>","Andrea Maria Piana <andreap@status.im>","Dean Eigenmann <dean@status.im>","Kim De Mey <kimdemey@status.im>"]},sidebar:"defaultSidebar",previous:{title:"Deprecated RFCs",permalink:"/waku/deprecated/"},next:{title:"16/WAKU2-RPC",permalink:"/waku/deprecated/16/rpc"}},l={},p=[{value:"Motivation",id:"motivation",level:2},{value:"Definitions",id:"definitions",level:2},{value:"Underlying Transports and Prerequisites",id:"underlying-transports-and-prerequisites",level:2},{value:"Use of DevP2P",id:"use-of-devp2p",level:3},{value:"Gossip based routing",id:"gossip-based-routing",level:3},{value:"Wire Specification",id:"wire-specification",level:2},{value:"Use of RLPx transport protocol",id:"use-of-rlpx-transport-protocol",level:3},{value:"ABNF specification",id:"abnf-specification",level:3},{value:"Packet Codes",id:"packet-codes",level:3},{value:"Packet usage",id:"packet-usage",level:3},{value:"Status",id:"status",level:4},{value:"Messages",id:"messages",level:4},{value:"Status Update",id:"status-update",level:4},{value:"PoW Requirement update",id:"pow-requirement-update",level:5},{value:"Bloom filter update",id:"bloom-filter-update",level:5},{value:"Topic Interest update",id:"topic-interest-update",level:5},{value:"Rate Limits update",id:"rate-limits-update",level:5},{value:"Message Confirmations update",id:"message-confirmations-update",level:5},{value:"P2P Request",id:"p2p-request",level:4},{value:"P2P Message",id:"p2p-message",level:4},{value:"Payload Encryption",id:"payload-encryption",level:3},{value:"Packet code Rationale",id:"packet-code-rationale",level:3},{value:"Additional capabilities",id:"additional-capabilities",level:2},{value:"Light node",id:"light-node",level:3},{value:"Accounting for resources (experimental)",id:"accounting-for-resources-experimental",level:3},{value:"Upgradability and Compatibility",id:"upgradability-and-compatibility",level:2},{value:"General principles and policy",id:"general-principles-and-policy",level:3},{value:"Backwards Compatibility",id:"backwards-compatibility",level:3},{value:"Waku-Whisper bridging",id:"waku-whisper-bridging",level:3},{value:"Forward Compatibility",id:"forward-compatibility",level:3},{value:"Appendix A: Security considerations",id:"appendix-a-security-considerations",level:2},{value:"Scalability and UX",id:"scalability-and-ux",level:3},{value:"Privacy",id:"privacy",level:3},{value:"Spam resistance",id:"spam-resistance",level:3},{value:"Censorship resistance",id:"censorship-resistance",level:3},{value:"Appendix B: Implementation Notes",id:"appendix-b-implementation-notes",level:2},{value:"Implementation Matrix",id:"implementation-matrix",level:3},{value:"Recommendations for clients",id:"recommendations-for-clients",level:3},{value:"Node discovery",id:"node-discovery",level:3},{value:"Changelog",id:"changelog",level:2},{value:"Version 0.6",id:"version-06",level:3},{value:"Version 0.5",id:"version-05",level:3},{value:"Version 0.4",id:"version-04",level:3},{value:"Version 0.3",id:"version-03",level:3},{value:"Version 0.2",id:"version-02",level:3},{value:"Version 0.1",id:"version-01",level:3},{value:"Differences between shh/6 and waku/0",id:"differences-between-shh6-and-waku0",level:3},{value:"Copyright",id:"copyright",level:2},{value:"Footnotes",id:"footnotes",level:2}],d={toc:p};function c(e){let{components:t,...n}=e;return(0,i.kt)("wrapper",(0,a.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Status: deprecated"),(0,i.kt)("li",{parentName:"ul"},"Editor: Oskar Thor\xe9n ","<",(0,i.kt)("a",{parentName:"li",href:"mailto:oskarth@titanproxy.com"},"oskarth@titanproxy.com"),">"),(0,i.kt)("li",{parentName:"ul"},"Contributors:",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Adam Babik ","<",(0,i.kt)("a",{parentName:"li",href:"mailto:adam@status.im"},"adam@status.im"),">"),(0,i.kt)("li",{parentName:"ul"},"Andrea Maria Piana ","<",(0,i.kt)("a",{parentName:"li",href:"mailto:andreap@status.im"},"andreap@status.im"),">"),(0,i.kt)("li",{parentName:"ul"},"Dean Eigenmann ","<",(0,i.kt)("a",{parentName:"li",href:"mailto:dean@status.im"},"dean@status.im"),">"),(0,i.kt)("li",{parentName:"ul"},"Kim De Mey ","<",(0,i.kt)("a",{parentName:"li",href:"mailto:kimdemey@status.im"},"kimdemey@status.im"),">")))),(0,i.kt)("p",null,"This specification describes the format of Waku messages within the \xd0\u039eVp2p Wire Protocol.\nThis spec substitutes ",(0,i.kt)("a",{parentName:"p",href:"https://eips.ethereum.org/EIPS/eip-627"},"EIP-627"),".\nWaku is a fork of the original Whisper protocol that enables better usability\nfor resource restricted devices,\nsuch as mostly-offline bandwidth-constrained smartphones.\nIt does this through (a) light node support,\n(b) historic messages (with a mailserver)\n(c) expressing topic interest for better bandwidth usage and\n(d) basic rate limiting."),(0,i.kt)("h2",{id:"motivation"},"Motivation"),(0,i.kt)("p",null,"Waku was created to incrementally improve in areas that Whisper is lacking in,\nwith special attention to resource restricted devices.\nWe specify the standard for Waku messages\nin order to ensure forward compatibility of different Waku clients,\nbackwards compatibility with Whisper clients,\nas well as to allow multiple implementations of Waku and its capabilities.\nWe also modify the language to be more unambiguous, concise and consistent."),(0,i.kt)("h2",{id:"definitions"},"Definitions"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Term"),(0,i.kt)("th",{parentName:"tr",align:null},"Definition"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"Light node")),(0,i.kt)("td",{parentName:"tr",align:null},"A Waku node that does not forward any messages.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"Envelope")),(0,i.kt)("td",{parentName:"tr",align:null},"Messages sent and received by Waku nodes.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"Node")),(0,i.kt)("td",{parentName:"tr",align:null},"Some process that is able to communicate for Waku.")))),(0,i.kt)("h2",{id:"underlying-transports-and-prerequisites"},"Underlying Transports and Prerequisites"),(0,i.kt)("h3",{id:"use-of-devp2p"},"Use of DevP2P"),(0,i.kt)("p",null,"For nodes to communicate, they MUST implement devp2p and run RLPx.\nThey MUST have some way of connecting to other nodes.\nNode discovery is largely out of scope for this spec,\nbut see the appendix for some suggestions on how to do this."),(0,i.kt)("h3",{id:"gossip-based-routing"},"Gossip based routing"),(0,i.kt)("p",null,"In Whisper, messages are gossiped between peers.\nWhisper is a form of rumor-mongering protocol\nthat works by flooding to its connected peers based on some factors.\nMessages are eligible for retransmission until their TTL expires.\nA node SHOULD relay messages to all connected nodes\nif an envelope matches their PoW and bloom filter settings.\nIf a node works in light mode, it MAY choose not to forward envelopes.\nA node MUST NOT send expired envelopes,\nunless the envelopes are sent as a ",(0,i.kt)("a",{parentName:"p",href:"./mailserver"},"mailserver")," response.\nA node SHOULD NOT send a message to a peer that it has already sent before."),(0,i.kt)("h2",{id:"wire-specification"},"Wire Specification"),(0,i.kt)("h3",{id:"use-of-rlpx-transport-protocol"},"Use of RLPx transport protocol"),(0,i.kt)("p",null,"All Waku messages are sent as devp2p RLPx transport protocol,\nversion 5",(0,i.kt)("sup",{parentName:"p",id:"fnref-1"},(0,i.kt)("a",{parentName:"sup",href:"#fn-1",className:"footnote-ref"},"1"))," packets.\nThese packets MUST be RLP-encoded arrays of data containing two objects:\npacket code followed by another object (whose type depends on the packet code).\nSee ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/ethereum/wiki/wiki/RLP"},"informal RLP spec")," and\nthe ",(0,i.kt)("a",{parentName:"p",href:"https://ethereum.github.io/yellowpaper/paper.pdf"},"Ethereum Yellow Paper, appendix B"),"\nfor more details on RLP."),(0,i.kt)("p",null,"Waku is a RLPx subprotocol called ",(0,i.kt)("inlineCode",{parentName:"p"},"waku")," with version ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),".\nThe version number corresponds to the major version in the header spec.\nMinor versions should not break compatibility of ",(0,i.kt)("inlineCode",{parentName:"p"},"waku"),",\nthis would result in a new major.\n(Some exceptions to this apply in the Draft stage\nof where client implementation is rapidly change)."),(0,i.kt)("h3",{id:"abnf-specification"},"ABNF specification"),(0,i.kt)("p",null,"Using ",(0,i.kt)("a",{parentName:"p",href:"https://tools.ietf.org/html/rfc5234"},"Augmented Backus-Naur form (ABNF)"),"\nwe have the following format:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-abnf"},'; Packet codes 0 - 127 are reserved for Waku protocol\npacket-code = 1*3DIGIT\n\n; rate limits\nlimit-ip = 1*DIGIT\nlimit-peerid = 1*DIGIT\nlimit-topic = 1*DIGIT\n\nrate-limits = "[" limit-ip limit-peerid limit-topic "]"\n\npow-requirement-key = 48\nbloom-filter-key = 49\nlight-node-key = 50\nconfirmations-enabled-key = 51\nrate-limits-key = 52\ntopic-interest-key = 53\n\nstatus-options = "["\n [ pow-requirement-key pow-requirement ]\n [ bloom-filter-key bloom-filter ]\n [ light-node-key light-node ]\n [ confirmations-enabled-key confirmations-enabled ]\n [ rate-limits-key rate-limits ]\n [ topic-interest-key topic-interest ]\n"]"\n\nstatus = "[" version status-options "]"\n\nstatus-update = status-options\n\n; version is "an integer (as specified in RLP)"\nversion = DIGIT\n\nconfirmations-enabled = BIT\n\nlight-node = BIT\n\n; pow is "a single floating point value of PoW.\n; This value is the IEEE 754 binary representation\n; of a 64-bit floating point number.\n; Values of qNAN, sNAN, INF and -INF are not allowed.\n; Negative values are also not allowed."\npow = 1*DIGIT "." 1*DIGIT\npow-requirement = pow\n\n; bloom filter is "a byte array"\nbloom-filter = *OCTET\n\nwaku-envelope = "[" expiry ttl topic data nonce "]"\n\n; List of topics interested in\ntopic-interest = "[" *10000topic "]"\n\n; 4 bytes (UNIX time in seconds)\nexpiry = 4OCTET\n\n; 4 bytes (time-to-live in seconds)\nttl = 4OCTET\n\n; 4 bytes of arbitrary data\ntopic = 4OCTET\n\n; byte array of arbitrary size\n; (contains encrypted message)\ndata = OCTET\n\n; 8 bytes of arbitrary data\n; (used for PoW calculation)\nnonce = 8OCTET\n\nmessages = 1*waku-envelope\n\n; mail server / client specific\np2p-request = waku-envelope\np2p-message = 1*waku-envelope\n\n; packet-format needs to be paired with its\n; corresponding packet-format\npacket-format = "[" packet-code packet-format "]"\n\nrequired-packet = 0 status /\n1 messages /\n22 status-update /\n\noptional-packet = 126 p2p-request / 127 p2p-message\n\npacket = "[" required-packet [ optional-packet ] "]"\n')),(0,i.kt)("p",null,"All primitive types are RLP encoded. Note that, per RLP specification,\nintegers are encoded starting from ",(0,i.kt)("inlineCode",{parentName:"p"},"0x00"),"."),(0,i.kt)("h3",{id:"packet-codes"},"Packet Codes"),(0,i.kt)("p",null,"The message codes reserved for Waku protocol: 0 - 127."),(0,i.kt)("p",null,"Messages with unknown codes MUST be ignored without generating any error,\nfor forward compatibility of future versions."),(0,i.kt)("p",null,"The Waku sub-protocol MUST support the following packet codes:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Name"),(0,i.kt)("th",{parentName:"tr",align:null},"Int Value"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"Status"),(0,i.kt)("td",{parentName:"tr",align:null},"0")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"Messages"),(0,i.kt)("td",{parentName:"tr",align:null},"1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"Status Update"),(0,i.kt)("td",{parentName:"tr",align:null},"22")))),(0,i.kt)("p",null,"The following message codes are optional, but they are reserved for specific purpose."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Name"),(0,i.kt)("th",{parentName:"tr",align:null},"Int Value"),(0,i.kt)("th",{parentName:"tr",align:null},"Comment"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"Batch Ack"),(0,i.kt)("td",{parentName:"tr",align:null},"11"),(0,i.kt)("td",{parentName:"tr",align:null})),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"Message Response"),(0,i.kt)("td",{parentName:"tr",align:null},"12"),(0,i.kt)("td",{parentName:"tr",align:null})),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"P2P Request"),(0,i.kt)("td",{parentName:"tr",align:null},"126"),(0,i.kt)("td",{parentName:"tr",align:null})),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"P2P Message"),(0,i.kt)("td",{parentName:"tr",align:null},"127"),(0,i.kt)("td",{parentName:"tr",align:null})))),(0,i.kt)("h3",{id:"packet-usage"},"Packet usage"),(0,i.kt)("h4",{id:"status"},"Status"),(0,i.kt)("p",null,"The Status message serves as a Waku handshake and peers MUST exchange this\nmessage upon connection. It MUST be sent after the RLPx handshake and prior to\nany other Waku messages."),(0,i.kt)("p",null,"A Waku node MUST await the Status message from a peer\nbefore engaging in other Waku protocol activity with that peer.\nWhen a node does not receive the Status message from a peer,\nbefore a configurable timeout, it SHOULD disconnect from that peer."),(0,i.kt)("p",null,"Upon retrieval of the Status message, the node SHOULD validate the message\nreceived and validated the Status message. Note that its peer might not be in\nthe same state."),(0,i.kt)("p",null,"When a node is receiving other Waku messages from a peer before a Status\nmessage is received,\nthe node MUST ignore these messages and SHOULD disconnect from that peer.\nStatus messages received after the handshake is completed MUST also be ignored."),(0,i.kt)("p",null,"The status message MUST contain an association list containing various options.\nAll options within this association list are OPTIONAL,\nordering of the key-value pairs is not guaranteed and\ntherefore MUST NOT be relied on.\nUnknown keys in the association list SHOULD be ignored."),(0,i.kt)("h4",{id:"messages"},"Messages"),(0,i.kt)("p",null,"This packet is used for sending the standard Waku envelopes."),(0,i.kt)("h4",{id:"status-update"},"Status Update"),(0,i.kt)("p",null,"The Status Update message is used to communicate an update\nof the settings of the node.\nThe format is the same as the Status message, all fields are optional.\nIf none of the options are specified the message MUST be ignored and\nconsidered a noop.\nFields that are omitted are considered unchanged,\nfields that haven't changed SHOULD not be transmitted."),(0,i.kt)("h5",{id:"pow-requirement-update"},"PoW Requirement update"),(0,i.kt)("p",null,"When PoW is updated, peers MUST NOT deliver the sender envelopes\nwith PoW lower than specified in this message."),(0,i.kt)("p",null,"PoW is defined as average number of iterations,\nrequired to find the current BestBit\n(the number of leading zero bits in the hash), divided by message size and TTL:"),(0,i.kt)("p",null,">"," PoW = (2*",(0,i.kt)("em",{parentName:"p"},"BestBit) / (size ")," TTL)"),(0,i.kt)("p",null,"PoW calculation:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"}," fn short_rlp(envelope) = rlp of envelope, excluding env_nonce field.\n fn pow_hash(envelope, env_nonce) = sha3(short_rlp(envelope) ++ env_nonce)\n fn pow(pow_hash, size, ttl) = 2**leading_zeros(pow_hash) / (size * ttl)\n")),(0,i.kt)("p",null,"where size is the size of the RLP-encoded envelope,\nexcluding ",(0,i.kt)("inlineCode",{parentName:"p"},"env_nonce")," field (size of ",(0,i.kt)("inlineCode",{parentName:"p"},"short_rlp(envelope)"),")."),(0,i.kt)("h5",{id:"bloom-filter-update"},"Bloom filter update"),(0,i.kt)("p",null,"The bloom filter is used to identify a number of topics\nto a peer without compromising (too much)\nprivacy over precisely what topics are of interest.\nPrecise control over the information content (and thus efficiency of the filter)\nmay be maintained through the addition of bits."),(0,i.kt)("p",null,"Blooms are formed by the bitwise OR operation on a number of bloomed topics.\nThe bloom function takes the topic and projects them onto a 512-bit slice.\nAt most, three bits are marked for each bloomed topic."),(0,i.kt)("p",null,"The projection function is defined as a mapping from a 4-byte slice S\nto a 512-bit slice D; for ease of explanation, S will dereference to bytes,\nwhereas D will dereference to bits."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-python"}," LET D[*] = 0\n FOREACH i IN { 0, 1, 2 } DO\n LET n = S[i]\n IF S[3] & (2 ** i) THEN n += 256\n D[n] = 1\n END FOR\n")),(0,i.kt)("p",null,"A full bloom filter (all the bits set to 1)\nmeans that the node is to be considered a ",(0,i.kt)("inlineCode",{parentName:"p"},"Full Node")," and it will accept any topic."),(0,i.kt)("p",null,"If both Topic Interest and bloom filter are specified,\nTopic Interest always takes precedence and bloom filter MUST be ignored."),(0,i.kt)("p",null,"If only bloom filter is specified, the current Topic Interest MUST be discarded and\nonly the updated bloom filter MUST be used when forwarding or posting envelopes."),(0,i.kt)("p",null,"A bloom filter with all bits set to 0 signals\nthat the node is not currently interested in receiving any envelope."),(0,i.kt)("h5",{id:"topic-interest-update"},"Topic Interest update"),(0,i.kt)("p",null,"This packet is used by Waku nodes for sharing their interest\nin messages with specific topics.\nIt does this in a more bandwidth considerate way,\nat the expense of some metadata protection.\nPeers MUST only send envelopes with specified topics."),(0,i.kt)("p",null,"It is currently bounded to a maximum of 10000 topics.\nIf you are interested in more topics than that,\nthis is currently underspecified and likely requires updating it.\nThe constant is subject to change."),(0,i.kt)("p",null,"If only Topic Interest is specified,\nthe current bloom filter MUST be discarded and\nonly the updated Topic Interest MUST be used when forwarding or posting envelopes."),(0,i.kt)("p",null,"An empty array signals that the node\nis not currently interested in receiving any envelope."),(0,i.kt)("h5",{id:"rate-limits-update"},"Rate Limits update"),(0,i.kt)("p",null,"This packet is used for informing other nodes of their self defined rate limits."),(0,i.kt)("p",null,"In order to provide basic Denial-of-Service attack protection,\neach node SHOULD define its own rate limits.\nThe rate limits SHOULD be applied on IPs, peer IDs, and envelope topics."),(0,i.kt)("p",null,"Each node MAY decide to whitelist, i.e. do not rate limit, selected IPs or peer IDs."),(0,i.kt)("p",null,"If a peer exceeds node's rate limits, the connection between them MAY be dropped."),(0,i.kt)("p",null,"Each node SHOULD broadcast its rate limits to its peers using the rate limits packet.\nThe rate limits MAY also be sent as an optional parameter in the handshake."),(0,i.kt)("p",null,"Each node SHOULD respect rate limits advertised by its peers.\nThe number of packets SHOULD be throttled in order not to exceed peer's rate limits.\nIf the limit gets exceeded, the connection MAY be dropped by the peer."),(0,i.kt)("h5",{id:"message-confirmations-update"},"Message Confirmations update"),(0,i.kt)("p",null,"Message confirmations tell a node that a message originating\nfrom it has been received by its peers,\nallowing a node to know whether a message has or has not been received."),(0,i.kt)("p",null,"A node MAY send a message confirmation for any batch of messages\nreceived with a packet Messages Code."),(0,i.kt)("p",null,"A message confirmation is sent using Batch Acknowledge packet or\nMessage Response packet.\nThe Batch Acknowledge packet is followed by a keccak256 hash\nof the envelopes batch data."),(0,i.kt)("p",null,"The current ",(0,i.kt)("inlineCode",{parentName:"p"},"version")," of the message response is ",(0,i.kt)("inlineCode",{parentName:"p"},"1"),"."),(0,i.kt)("p",null,"Using ",(0,i.kt)("a",{parentName:"p",href:"https://tools.ietf.org/html/rfc5234"},"Augmented Backus-Naur form (ABNF)"),"\nwe have the following format:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-abnf"},'; a version of the Message Response\nversion = 1*DIGIT\n\n; keccak256 hash of the envelopes batch data (raw bytes) for which the confirmation is sent\nhash = *OCTET\n\nhasherror = *OCTET\n\n; error code\ncode = 1*DIGIT\n\n; a descriptive error message\ndescription = *ALPHA\n\nerror = "[" hasherror code description "]"\nerrors = *error\n\nresponse = "[" hash errors "]"\n\nconfirmation = "[" version response "]"\n')),(0,i.kt)("p",null,"The supported codes:\n",(0,i.kt)("inlineCode",{parentName:"p"},"1"),": means time sync error which happens when an envelope is too old or\ncreated in the future (the root cause is no time sync between nodes)."),(0,i.kt)("p",null,"The drawback of sending message confirmations\nis that it increases the noise in the network because for each sent message,\na corresponding confirmation is broadcast by one or more peers."),(0,i.kt)("h4",{id:"p2p-request"},"P2P Request"),(0,i.kt)("p",null,"This packet is used for sending Dapp-level peer-to-peer requests,\ne.g. Waku Mail Client requesting old messages from the ",(0,i.kt)("a",{parentName:"p",href:"./mailserver"},"Waku Mail Server"),"."),(0,i.kt)("h4",{id:"p2p-message"},"P2P Message"),(0,i.kt)("p",null,"This packet is used for sending the peer-to-peer messages,\nwhich are not supposed to be forwarded any further.\nE.g. it might be used by the Waku Mail Server for delivery of old\n(expired) messages, which is otherwise not allowed."),(0,i.kt)("h3",{id:"payload-encryption"},"Payload Encryption"),(0,i.kt)("p",null,"Asymmetric encryption uses the standard Elliptic Curve Integrated Encryption Scheme\nwith SECP-256k1 public key."),(0,i.kt)("p",null,"Symmetric encryption uses AES GCM algorithm with random 96-bit nonce."),(0,i.kt)("h3",{id:"packet-code-rationale"},"Packet code Rationale"),(0,i.kt)("p",null,"Packet codes ",(0,i.kt)("inlineCode",{parentName:"p"},"0x00")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"0x01")," are already used in all Waku / Whisper versions.\nPacket code ",(0,i.kt)("inlineCode",{parentName:"p"},"0x02")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"0x03")," were previously used in Whisper but\nare deprecated as of Waku v0.4"),(0,i.kt)("p",null,"Packet code ",(0,i.kt)("inlineCode",{parentName:"p"},"0x22")," is used to dynamically change the settings of a node."),(0,i.kt)("p",null,"Packet codes ",(0,i.kt)("inlineCode",{parentName:"p"},"0x7E")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"0x7F")," may be used to implement Waku Mail Server and Client.\nWithout P2P messages it would be impossible to deliver the old messages,\nsince they will be recognized as expired,\nand the peer will be disconnected for violating the Whisper protocol.\nThey might be useful for other purposes\nwhen it is not possible to spend time on PoW,\ne.g. if a stock exchange will want to provide live feed about the latest trades."),(0,i.kt)("h2",{id:"additional-capabilities"},"Additional capabilities"),(0,i.kt)("p",null,"Waku supports multiple capabilities.\nThese include light node, rate limiting and bridging of traffic.\nHere we list these capabilities, how they are identified,\nwhat properties they have and what invariants they must maintain."),(0,i.kt)("p",null,"Additionally there is the capability of a mailserver\nwhich is documented in its on ",(0,i.kt)("a",{parentName:"p",href:"mailserver"},"specification"),"."),(0,i.kt)("h3",{id:"light-node"},"Light node"),(0,i.kt)("p",null,"The rationale for light nodes is to allow for interaction with waku\non resource restricted devices as bandwidth can often be an issue."),(0,i.kt)("p",null,"Light nodes MUST NOT forward any incoming messages,\nthey MUST only send their own messages.\nWhen light nodes happen to connect to each other,\nthey SHOULD disconnect.\nAs this would result in messages being dropped between the two."),(0,i.kt)("p",null,"Light nodes are identified by the ",(0,i.kt)("inlineCode",{parentName:"p"},"light_node")," value in the status message."),(0,i.kt)("h3",{id:"accounting-for-resources-experimental"},"Accounting for resources (experimental)"),(0,i.kt)("p",null,"Nodes MAY implement accounting, keeping track of resource usage.\nIt is heavily inspired by\nSwarm's ",(0,i.kt)("a",{parentName:"p",href:"https://www.bokconsulting.com.au/wp-content/uploads/2016/09/tron-fischer-sw3.pdf"},"SWAP protocol"),",\nand works by doing pairwise accounting for resources."),(0,i.kt)("p",null,"Each node keeps track of resource usage with all other nodes.\nWhenever an envelope is received from a node that is expected\n(fits bloom filter or topic interest, is legal, etc) this is tracked."),(0,i.kt)("p",null,"Every epoch (say, every minute or every time an event happens)\nstatistics SHOULD be aggregated and saved by the client:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"peer"),(0,i.kt)("th",{parentName:"tr",align:null},"sent"),(0,i.kt)("th",{parentName:"tr",align:null},"received"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"peer1"),(0,i.kt)("td",{parentName:"tr",align:null},"0"),(0,i.kt)("td",{parentName:"tr",align:null},"123")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"peer2"),(0,i.kt)("td",{parentName:"tr",align:null},"10"),(0,i.kt)("td",{parentName:"tr",align:null},"40")))),(0,i.kt)("p",null,"In later versions this will be amended by nodes communication thresholds,\nsettlements and disconnect logic."),(0,i.kt)("h2",{id:"upgradability-and-compatibility"},"Upgradability and Compatibility"),(0,i.kt)("h3",{id:"general-principles-and-policy"},"General principles and policy"),(0,i.kt)("p",null,"These are policies that guide how we make decisions when it comes to upgradability,\ncompatibility, and extensibility:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Waku aims to be compatible with previous and future versions.")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"In cases where we want to break this compatibility, we do so gracefully and\nas a single decision point.")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"To achieve this,\nwe employ the following two general strategies:"))),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"a) Accretion (including protocol negotiation) over changing data"),(0,i.kt)("li",{parentName:"ul"},"b) When we want to change things, we give it a new name\n(for example, a version number).")),(0,i.kt)("p",null,"Examples:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"We enable bridging between ",(0,i.kt)("inlineCode",{parentName:"li"},"shh/6")," and\n",(0,i.kt)("inlineCode",{parentName:"li"},"waku/0")," until such a time as when we are ready to gracefully drop support\nfor ",(0,i.kt)("inlineCode",{parentName:"li"},"shh/6")," (1, 2, 3)."),(0,i.kt)("li",{parentName:"ul"},"When we add parameter fields, we (currently) do so by accreting them in a list,\nso old clients can ignore new fields (dynamic list)\nand new clients can use new capabilities (1, 3)."),(0,i.kt)("li",{parentName:"ul"},"To better support (2) and (3) in the future,\nwe will likely release a new version that gives better support for open,\ngrowable maps (association lists or native map type) (3)"),(0,i.kt)("li",{parentName:"ul"},"When we we want to provide a new set of messages that have different requirements,\nwe do so under a new protocol version and employ protocol versioning.\nThis is a form of accretion at a level above -\nit ensures a client can support both protocols at once and\ndrop support for legacy versions gracefully. (1,2,3)")),(0,i.kt)("h3",{id:"backwards-compatibility"},"Backwards Compatibility"),(0,i.kt)("p",null,"Waku is a different subprotocol from Whisper so it isn't directly compatible.\nHowever, the data format is the same,\nso compatibility can be achieved by the use of a bridging mode as described below.\nAny client which does not implement certain packet codes\nshould gracefully ignore the packets with those codes.\nThis will ensure the forward compatibility."),(0,i.kt)("h3",{id:"waku-whisper-bridging"},"Waku-Whisper bridging"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"waku/0")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"shh/6")," are different DevP2P subprotocols,\nhowever they share the same data format making their envelopes compatible.\nThis means we can bridge the protocols naively, this works as follows."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Roles:")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Waku client A, only Waku capability"),(0,i.kt)("li",{parentName:"ul"},"Whisper client B, only Whisper capability"),(0,i.kt)("li",{parentName:"ul"},"WakuWhisper bridge C, both Waku and Whisper capability")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Flow:")),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"A posts message; B posts message."),(0,i.kt)("li",{parentName:"ol"},"C picks up message from A and B and relays them both to Waku and Whisper."),(0,i.kt)("li",{parentName:"ol"},"A receives message on Waku; B on Whisper.")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Note"),": This flow means if another bridge C1 is active,\nwe might get duplicate relaying for a message between C1 and C2.\nI.e. Whisper(","<",">","Waku","<",">","Whisper)","<",">","Waku, A-C1-C2-B.\nTheoretically this bridging chain can get as long as TTL permits."),(0,i.kt)("h3",{id:"forward-compatibility"},"Forward Compatibility"),(0,i.kt)("p",null,"It is desirable to have a strategy for maintaining forward compatibility\nbetween ",(0,i.kt)("inlineCode",{parentName:"p"},"waku/0")," and future version of waku.\nHere we outline some concerns and strategy for this."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Connecting to nodes with multiple versions:"),"\nThe way this SHOULD be accomplished in the future\nis by negotiating the versions of subprotocols,\nwithin the ",(0,i.kt)("inlineCode",{parentName:"p"},"hello")," message nodes transmit their capabilities along with a version.\nAs suggested in ",(0,i.kt)("a",{parentName:"p",href:"https://eips.ethereum.org/EIPS/eip-8"},"EIP-8"),",\nif a node connects that has a higher version number for a specific capability,\nthe node with a lower number SHOULD assume backwards compatibility.\nThe node with the higher version\nwill decide if compatibility can be assured between versions,\nif this is not the case it MUST disconnect.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Adding new packet codes:"),"\nNew packet codes can be added easily due to the available packet codes.\nUnknown packet codes SHOULD be ignored.\nUpgrades that add new packet codes SHOULD implement some fallback mechanism\nif no response was received for nodes that do not yet understand this packet.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Adding new options in ",(0,i.kt)("inlineCode",{parentName:"strong"},"status-options"),":"),"\nNew options can be added to the ",(0,i.kt)("inlineCode",{parentName:"p"},"status-options")," association list\nin the ",(0,i.kt)("inlineCode",{parentName:"p"},"status")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"status-update")," packet as options are OPTIONAL and\nunknown option keys SHOULD be ignored.\nA node SHOULD NOT disconnect from a peer\nwhen receiving ",(0,i.kt)("inlineCode",{parentName:"p"},"status-options")," with unknown option keys."))),(0,i.kt)("h2",{id:"appendix-a-security-considerations"},"Appendix A: Security considerations"),(0,i.kt)("p",null,"There are several security considerations to take into account when running Waku.\nChief among them are: scalability, DDoS-resistance and privacy.\nThese also vary depending on what capabilities are used.\nThe security considerations for extra capabilities such as ",(0,i.kt)("a",{parentName:"p",href:"./mailserver##security-considerations"},"mailservers"),"\ncan be found in their respective specifications."),(0,i.kt)("h3",{id:"scalability-and-ux"},"Scalability and UX"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Bandwidth usage:")),(0,i.kt)("p",null,"In version 0 of Waku, bandwidth usage is likely to be an issue.\nFor more investigation into this,\nsee the theoretical scaling model described ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/vacp2p/research/tree/dcc71f4779be832d3b5ece9c4e11f1f7ec24aac2/whisper_scalability"},"here"),"."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Gossip-based routing:")),(0,i.kt)("p",null,"Use of gossip-based routing doesn't necessarily scale.\nIt means each node can see a message multiple times,\nand having too many light nodes can cause propagation probability that is too low.\nSee ",(0,i.kt)("a",{parentName:"p",href:"https://our.status.im/whisper-pss-comparison/"},"Whisper vs PSS"),"\nfor more and a possible Kademlia based alternative."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Lack of incentives:")),(0,i.kt)("p",null,"Waku currently lacks incentives to run nodes,\nwhich means node operators are more likely to create centralized choke points."),(0,i.kt)("h3",{id:"privacy"},"Privacy"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Light node privacy:")),(0,i.kt)("p",null,"The main privacy concern with light nodes\nis that directly connected peers will know that a message originates from them\n(as it are the only ones it sends).\nThis means nodes can make assumptions about what messages (topics)\ntheir peers are interested in."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Bloom filter privacy:")),(0,i.kt)("p",null,"By having a bloom filter where only the topics you are interested in are set,\nyou reveal which messages you are interested in.\nThis is a fundamental tradeoff between bandwidth usage and privacy,\nthough the tradeoff space is likely suboptimal in terms of the\n",(0,i.kt)("a",{parentName:"p",href:"https://eprint.iacr.org/2017/954.pdf"},"Anonymity")," ",(0,i.kt)("a",{parentName:"p",href:"https://petsymposium.org/2019/files/hotpets/slides/coordination-helps-anonymity-slides.pdf"},"trilemma"),"."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Privacy guarantees not rigorous:")),(0,i.kt)("p",null,"Privacy for Whisper / Waku haven't been studied rigorously for various threat models\nlike global passive adversary, local active attacker, etc.\nThis is unlike e.g. Tor and mixnets."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Topic hygiene:")),(0,i.kt)("p",null,"Similar to bloom filter privacy,\nif you use a very specific topic you reveal more information.\nSee scalability model linked above."),(0,i.kt)("h3",{id:"spam-resistance"},"Spam resistance"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"PoW bad for heterogeneous devices:")),(0,i.kt)("p",null,"Proof of work is a poor spam prevention mechanism.\nA mobile device can only have a very low PoW\nin order not to use too much CPU / burn up its phone battery.\nThis means someone can spin up a powerful node and overwhelm the network."),(0,i.kt)("h3",{id:"censorship-resistance"},"Censorship resistance"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Devp2p TCP port blockable:")),(0,i.kt)("p",null,"By default Devp2p runs on port ",(0,i.kt)("inlineCode",{parentName:"p"},"30303"),",\nwhich is not commonly used for any other service.\nThis means it is easy to censor, e.g. airport WiFi.\nThis can be mitigated somewhat by running on e.g. port ",(0,i.kt)("inlineCode",{parentName:"p"},"80")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"443"),",\nbut there are still outstanding issues.\nSee libp2p and Tor's Pluggable Transport for how this can be improved."),(0,i.kt)("h2",{id:"appendix-b-implementation-notes"},"Appendix B: Implementation Notes"),(0,i.kt)("h3",{id:"implementation-matrix"},"Implementation Matrix"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Client"),(0,i.kt)("th",{parentName:"tr",align:null},"Spec supported"),(0,i.kt)("th",{parentName:"tr",align:null},"Details"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"Status-go")),(0,i.kt)("td",{parentName:"tr",align:null},"0.5"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/status-im/status-go/blob/develop/WAKU.md"},"details"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("strong",{parentName:"td"},"Nimbus")),(0,i.kt)("td",{parentName:"tr",align:null},"0.4"),(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("a",{parentName:"td",href:"https://github.com/status-im/nimbus/tree/8747fe1ecd36fe778bb92b97634db84d364fede8/waku"},"details"))))),(0,i.kt)("h3",{id:"recommendations-for-clients"},"Recommendations for clients"),(0,i.kt)("p",null,"Notes useful for implementing Waku mode."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Avoid duplicate envelopes:")),(0,i.kt)("p",null,"To avoid duplicate envelopes, only connect to one Waku node.\nBenign duplicate envelopes is an intrinsic property of Whisper\nwhich often leads to a N factor increase in traffic,\nwhere N is the number of peers you are connected to."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Topic specific recommendations -")),(0,i.kt)("p",null,"Consider partition topics based on some usage,\nto avoid too much traffic on a single topic."),(0,i.kt)("h3",{id:"node-discovery"},"Node discovery"),(0,i.kt)("p",null,"Resource restricted devices SHOULD use\n",(0,i.kt)("a",{parentName:"p",href:"https://eips.ethereum.org/EIPS/eip-1459"},"EIP-1459")," to discover nodes."),(0,i.kt)("p",null,"Known static nodes MAY also be used."),(0,i.kt)("h2",{id:"changelog"},"Changelog"),(0,i.kt)("h3",{id:"version-06"},"Version 0.6"),(0,i.kt)("p",null,"Released ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/vacp2p/specs/commit/9e650995f24179844857520c68fa3e8f6018b125"},"April 21,2020")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Mark spec as Deprecated mode in terms of its lifecycle.")),(0,i.kt)("h3",{id:"version-05"},"Version 0.5"),(0,i.kt)("p",null,"Released ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/vacp2p/specs/commit/7b9dc562bc50c6bb844ac575cb221ec9cda2530a"},"March 17,2020")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Clarify the preferred way of handling unknown keys\nin the ",(0,i.kt)("inlineCode",{parentName:"li"},"status-options")," association list."),(0,i.kt)("li",{parentName:"ul"},"Correct spec/implementation mismatch:\nChange RLP keys to be the their int values in order to reflect production behavior")),(0,i.kt)("h3",{id:"version-04"},"Version 0.4"),(0,i.kt)("p",null,"Released ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/vacp2p/specs/commit/17bd066e317bbe33af07146b721d73f24de47e88"},"February 21, 2020"),"."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Simplify implementation matrix with latest state"),(0,i.kt)("li",{parentName:"ul"},"Introduces a new required packet code Status Code (",(0,i.kt)("inlineCode",{parentName:"li"},"0x22"),")\nfor communicating option changes"),(0,i.kt)("li",{parentName:"ul"},"Deprecates the following packet codes:\nPoW Requirement (",(0,i.kt)("inlineCode",{parentName:"li"},"0x02"),"), Bloom Filter (",(0,i.kt)("inlineCode",{parentName:"li"},"0x03"),"), Rate limits (",(0,i.kt)("inlineCode",{parentName:"li"},"0x20"),"),\nTopic interest (",(0,i.kt)("inlineCode",{parentName:"li"},"0x21"),") - all superseded by the new Status Code (",(0,i.kt)("inlineCode",{parentName:"li"},"0x22"),")"),(0,i.kt)("li",{parentName:"ul"},"Increased ",(0,i.kt)("inlineCode",{parentName:"li"},"topic-interest")," capacity from 1000 to 10000")),(0,i.kt)("h3",{id:"version-03"},"Version 0.3"),(0,i.kt)("p",null,"Released ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/vacp2p/specs/commit/73138d6ba954ab4c315e1b8d210ac7631b6d1428"},"February 13, 2020"),"."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Recommend DNS based node discovery over other Discovery methods."),(0,i.kt)("li",{parentName:"ul"},"Mark spec as Draft mode in terms of its lifecycle."),(0,i.kt)("li",{parentName:"ul"},"Simplify Changelog and misc formatting."),(0,i.kt)("li",{parentName:"ul"},"Handshake/Status message not compatible with shh/6 nodes;\nspecifying options as association list."),(0,i.kt)("li",{parentName:"ul"},"Include topic-interest in Status handshake."),(0,i.kt)("li",{parentName:"ul"},"Upgradability policy."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"topic-interest")," packet code.")),(0,i.kt)("h3",{id:"version-02"},"Version 0.2"),(0,i.kt)("p",null,"Released ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/vacp2p/specs/blob/waku-0.2.0/waku.md"},"December 10, 2019"),"."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"General style improvements."),(0,i.kt)("li",{parentName:"ul"},"Fix ABNF grammar."),(0,i.kt)("li",{parentName:"ul"},"Mailserver requesting/receiving."),(0,i.kt)("li",{parentName:"ul"},"New packet codes: topic-interest (experimental), rate limits (experimental)."),(0,i.kt)("li",{parentName:"ul"},"More details on handshake modifications."),(0,i.kt)("li",{parentName:"ul"},"Accounting for resources mode (experimental)"),(0,i.kt)("li",{parentName:"ul"},"Appendix with security considerations: scalability and UX, privacy, and spam resistance."),(0,i.kt)("li",{parentName:"ul"},"Appendix with implementation notes and\nimplementation matrix across various clients with breakdown per capability."),(0,i.kt)("li",{parentName:"ul"},"More details on handshake and parameters."),(0,i.kt)("li",{parentName:"ul"},"Describe rate limits in more detail."),(0,i.kt)("li",{parentName:"ul"},"More details on mailserver and mail client API."),(0,i.kt)("li",{parentName:"ul"},"Accounting for resources mode (very experimental)."),(0,i.kt)("li",{parentName:"ul"},"Clarify differences with Whisper.")),(0,i.kt)("h3",{id:"version-01"},"Version 0.1"),(0,i.kt)("p",null,"Initial version. Released ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/vacp2p/specs/blob/b59b9247f2ac1bf45c75bd3227a2e5dd87b6d7b0/waku.md"},"November 21, 2019"),"."),(0,i.kt)("h3",{id:"differences-between-shh6-and-waku0"},"Differences between shh/6 and waku/0"),(0,i.kt)("p",null,"Summary of main differences between this spec and Whisper v6, as described in ",(0,i.kt)("a",{parentName:"p",href:"https://eips.ethereum.org/EIPS/eip-627"},"EIP-627"),":"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"RLPx subprotocol is changed from ",(0,i.kt)("inlineCode",{parentName:"li"},"shh/6")," to ",(0,i.kt)("inlineCode",{parentName:"li"},"waku/0"),"."),(0,i.kt)("li",{parentName:"ul"},"Light node capability is added."),(0,i.kt)("li",{parentName:"ul"},"Optional rate limiting is added."),(0,i.kt)("li",{parentName:"ul"},"Status packet has following additional parameters: light-node,\nconfirmations-enabled and rate-limits"),(0,i.kt)("li",{parentName:"ul"},"Mail Server and Mail Client functionality is now part of the specification."),(0,i.kt)("li",{parentName:"ul"},"P2P Message packet contains a list of envelopes instead of a single envelope.")),(0,i.kt)("h2",{id:"copyright"},"Copyright"),(0,i.kt)("p",null,"Copyright and related rights waived via ",(0,i.kt)("a",{parentName:"p",href:"https://creativecommons.org/publicdomain/zero/1.0/"},"CC0"),"."),(0,i.kt)("h2",{id:"footnotes"},"Footnotes"),(0,i.kt)("div",{className:"footnotes"},(0,i.kt)("hr",{parentName:"div"}),(0,i.kt)("ol",{parentName:"div"},(0,i.kt)("li",{parentName:"ol",id:"fn-1"},"Felix Lange et al. ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/ethereum/devp2p/blob/master/rlpx.md"},"The RLPx Transport Protocol"),". Ethereum.",(0,i.kt)("a",{parentName:"li",href:"#fnref-1",className:"footnote-backref"},"\u21a9")))))}c.isMDXComponent=!0},3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>u});var a=n(67294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},d=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,r=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),m=p(n),u=i,h=m["".concat(l,".").concat(u)]||m[u]||c[u]||r;return n?a.createElement(h,o(o({ref:t},d),{},{components:n})):a.createElement(h,o({ref:t},d))}));function u(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=n.length,o=new Array(r);o[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:i,o[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>r,toc:()=>p});var i=n(87462),a=(n(67294),n(3905));const o={title:"PUSH-NOTIFICATION-SERVER",name:"Push notification server",status:"deprecated",description:"Status provides a set of Push notification services that can be used to achieve this functionality.",editor:"Filip Dimitrijevic <filip@status.im>",contributors:["Andrea Maria Piana <andreap@status.im>"]},s=void 0,r={unversionedId:"deprecated/push-notification-server",id:"deprecated/push-notification-server",title:"PUSH-NOTIFICATION-SERVER",description:"Status provides a set of Push notification services that can be used to achieve this functionality.",source:"@site/status/deprecated/push-notification-server.md",sourceDirName:"deprecated",slug:"/deprecated/push-notification-server",permalink:"/status/deprecated/push-notification-server",draft:!1,tags:[],version:"current",frontMatter:{title:"PUSH-NOTIFICATION-SERVER",name:"Push notification server",status:"deprecated",description:"Status provides a set of Push notification services that can be used to achieve this functionality.",editor:"Filip Dimitrijevic <filip@status.im>",contributors:["Andrea Maria Piana <andreap@status.im>"]},sidebar:"defaultSidebar",previous:{title:"PAYLOADS",permalink:"/status/deprecated/payloads"},next:{title:"SECURE-TRANSPORT",permalink:"/status/deprecated/secure-transport"}},l={},p=[{value:"Reason",id:"reason",level:2},{value:"Requirements",id:"requirements",level:2},{value:"Components",id:"components",level:2},{value:"Gorush instance",id:"gorush-instance",level:3},{value:"Push notification server",id:"push-notification-server",level:3},{value:"Registering client",id:"registering-client",level:3},{value:"Sending client",id:"sending-client",level:3},{value:"Registering with the push notification service",id:"registering-with-the-push-notification-service",level:2},{value:"Query topic",id:"query-topic",level:3},{value:"Server grant",id:"server-grant",level:3},{value:"Re-registering with the push notification server",id:"re-registering-with-the-push-notification-server",level:2},{value:"Changing options",id:"changing-options",level:2},{value:"Unregistering from push notifications",id:"unregistering-from-push-notifications",level:2},{value:"Advertising a push notification server",id:"advertising-a-push-notification-server",level:2},{value:"Discovering a push notification server",id:"discovering-a-push-notification-server",level:2},{value:"Querying the push notification server",id:"querying-the-push-notification-server",level:2},{value:"Sending a push notification",id:"sending-a-push-notification",level:2},{value:"Flow",id:"flow",level:2},{value:"Registration process",id:"registration-process",level:3},{value:"Sending a notification",id:"sending-a-notification",level:3},{value:"Receiving a push notification",id:"receiving-a-push-notification",level:3},{value:"Protobuf description",id:"protobuf-description",level:2},{value:"PushNotificationRegistration",id:"pushnotificationregistration",level:3},{value:"Data disclosed",id:"data-disclosed",level:4},{value:"PushNotificationRegistrationResponse",id:"pushnotificationregistrationresponse",level:3},{value:"ContactCodeAdvertisement",id:"contactcodeadvertisement",level:3},{value:"PushNotificationQuery",id:"pushnotificationquery",level:3},{value:"PushNotificationQueryInfo",id:"pushnotificationqueryinfo",level:3},{value:"PushNotificationQueryResponse",id:"pushnotificationqueryresponse",level:3},{value:"PushNotification",id:"pushnotification",level:3},{value:"PushNotificationRequest",id:"pushnotificationrequest",level:3},{value:"PushNotificationResponse",id:"pushnotificationresponse",level:3},{value:"PushNotificationReport",id:"pushnotificationreport",level:3},{value:"Anonymous mode of operations",id:"anonymous-mode-of-operations",level:2},{value:"Security considerations",id:"security-considerations",level:2},{value:"FAQ",id:"faq",level:2},{value:"Why having ACL done at the server side and not the client?",id:"why-having-acl-done-at-the-server-side-and-not-the-client",level:3},{value:"Why using an access token?",id:"why-using-an-access-token",level:3},{value:"Why advertise with the bundle?",id:"why-advertise-with-the-bundle",level:3},{value:"What's the bandwidth impact for this?",id:"whats-the--bandwidth-impact-for-this",level:3},{value:"What's the information disclosed?",id:"whats-the-information-disclosed",level:3},{value:"What prevents a user from generating a random key and getting an access token and spamming?",id:"what-prevents-a-user-from-generating-a-random-key-and-getting-an-access-token-and-spamming",level:3},{value:"Why not 0-knowledge proofs/quantum computing",id:"why-not-0-knowledge-proofsquantum-computing",level:3},{value:"How to handle backward/forward compatibility",id:"how-to-handle-backwardforward-compatibility",level:3},{value:"Why ack_key?",id:"why-ack_key",level:3},{value:"Can I run my own node?",id:"can-i-run-my-own-node",level:3},{value:"Can I register with multiple nodes for redundancy",id:"can-i-register-with-multiple-nodes-for-redundancy",level:3},{value:"What does my node disclose?",id:"what-does-my-node-disclose",level:3},{value:"Does this have high-reliability requirements?",id:"does-this-have-high-reliability-requirements",level:3},{value:"Can someone else (i.e not status) run this?",id:"can-someone-else-ie-not-status-run-this",level:3},{value:"Changelog",id:"changelog",level:2},{value:"Version 0.1",id:"version-01",level:3},{value:"Copyright",id:"copyright",level:2},{value:"References",id:"references",level:2}],d={toc:p};function u(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,i.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Status: deprecated"),(0,a.kt)("li",{parentName:"ul"},"Editor: Filip Dimitrijevic ","<",(0,a.kt)("a",{parentName:"li",href:"mailto:filip@status.im"},"filip@status.im"),">"),(0,a.kt)("li",{parentName:"ul"},"Contributors:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"Andrea Maria Piana ","<",(0,a.kt)("a",{parentName:"li",href:"mailto:andreap@status.im"},"andreap@status.im"),">")))),(0,a.kt)("h2",{id:"reason"},"Reason"),(0,a.kt)("p",null,"Push notifications for iOS devices and some Android devices can only be implemented by relying on ",(0,a.kt)("a",{parentName:"p",href:"https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1"},"APN service")," for iOS or ",(0,a.kt)("a",{parentName:"p",href:"https://firebase.google.com/"},"Firebase"),"."),(0,a.kt)("p",null,"This is useful for Android devices that do not support foreground services\nor that often kill the foreground service."),(0,a.kt)("p",null,"iOS only allows certain kind of applications to keep a connection open when in the\nbackground, VoIP for example, which current status client does not qualify for."),(0,a.kt)("p",null,"Applications on iOS can also request execution time when they are in the ",(0,a.kt)("a",{parentName:"p",href:"https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_background/updating_your_app_with_background_app_refresh"},"background"),"\nbut it has a limited set of use cases, for example it won't schedule any time\nif the application was force quit,\nand generally is not responsive enough to implement a push notification system."),(0,a.kt)("p",null,"Therefore Status provides a set of Push notification services\nthat can be used to achieve this functionality."),(0,a.kt)("p",null,"Because this can't be safely implemented in a privacy preserving manner,\nclients MUST be given an option to opt-in to receiving and sending push notifications.\nThey are disabled by default."),(0,a.kt)("h2",{id:"requirements"},"Requirements"),(0,a.kt)("p",null,"The party releasing the app MUST possess a certificate for the Apple Push Notification service\nand its has to run a ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/appleboy/gorush"},"gorush")," publicly accessible server for sending the actual notification.\nThe party releasing the app, Status in this case, needs to run its own ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/appleboy/gorush"},"gorush")),(0,a.kt)("h2",{id:"components"},"Components"),(0,a.kt)("h3",{id:"gorush-instance"},"Gorush instance"),(0,a.kt)("p",null,"A ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/appleboy/gorush"},"gorush")," instance MUST be publicly available,\nthis will be used only by push notification servers."),(0,a.kt)("h3",{id:"push-notification-server"},"Push notification server"),(0,a.kt)("p",null,"A push notification server used by clients to register for receiving and sending push notifications."),(0,a.kt)("h3",{id:"registering-client"},"Registering client"),(0,a.kt)("p",null,"A Status client that wants to receive push notifications"),(0,a.kt)("h3",{id:"sending-client"},"Sending client"),(0,a.kt)("p",null,"A Status client that wants to send push notifications"),(0,a.kt)("h2",{id:"registering-with-the-push-notification-service"},"Registering with the push notification service"),(0,a.kt)("p",null,"A client MAY register with one or more Push Notification services of their choice."),(0,a.kt)("p",null,"A ",(0,a.kt)("inlineCode",{parentName:"p"},"PNR message")," (Push Notification Registration) MUST be sent to the ",(0,a.kt)("a",{parentName:"p",href:"status/deprecated/waku-usage/#partitioned-topic"},"partitioned topic"),"\nfor the public key of the node, encrypted with this key."),(0,a.kt)("p",null,"The message MUST be wrapped in a ",(0,a.kt)("a",{parentName:"p",href:"status/deprecated/payload/#payload-wrapper"},(0,a.kt)("inlineCode",{parentName:"a"},"ApplicationMetadataMessage"))," with type set to ",(0,a.kt)("inlineCode",{parentName:"p"},"PUSH_NOTIFICATION_REGISTRATION"),"."),(0,a.kt)("p",null,"The marshaled protobuf payload MUST also be encrypted with AES-GCM\nusing the Diffie\u2013Hellman key generated from the client and server identity."),(0,a.kt)("p",null,"This is done in order to ensure that the extracted key from the signature will be\nconsidered invalid if it can't decrypt the payload."),(0,a.kt)("p",null,"The content of the message MUST contain the following ",(0,a.kt)("a",{parentName:"p",href:"https://developers.google.com/protocol-buffers/"},"protobuf record"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-protobuf"},"message PushNotificationRegistration {\n enum TokenType {\n UNKNOWN_TOKEN_TYPE = 0;\n APN_TOKEN = 1;\n FIREBASE_TOKEN = 2;\n }\n TokenType token_type = 1;\n string device_token = 2;\n string installation_id = 3;\n string access_token = 4;\n bool enabled = 5;\n uint64 version = 6;\n repeated bytes allowed_key_list = 7;\n repeated bytes blocked_chat_list = 8;\n bool unregister = 9;\n bytes grant = 10;\n bool allow_from_contacts_only = 11;\n string apn_topic = 12;\n bool block_mentions = 13;\n repeated bytes allowed_mentions_chat_list = 14;\n}\n")),(0,a.kt)("p",null,"A push notification server will handle the message according to the following rules:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"it MUST extract the public key of the sender from the signature and verify that\nthe payload can be decrypted successfully."),(0,a.kt)("li",{parentName:"ul"},"it MUST verify that ",(0,a.kt)("inlineCode",{parentName:"li"},"token_type")," is supported"),(0,a.kt)("li",{parentName:"ul"},"it MUST verify that ",(0,a.kt)("inlineCode",{parentName:"li"},"device_token")," is non empty"),(0,a.kt)("li",{parentName:"ul"},"it MUST verify that ",(0,a.kt)("inlineCode",{parentName:"li"},"installation_id")," is non empty"),(0,a.kt)("li",{parentName:"ul"},"it MUST verify that ",(0,a.kt)("inlineCode",{parentName:"li"},"version")," is non-zero and greater than the currently stored version for the public key and installation id of the sender, if any"),(0,a.kt)("li",{parentName:"ul"},"it MUST verify that ",(0,a.kt)("inlineCode",{parentName:"li"},"grant")," is non empty and according to the ",(0,a.kt)("a",{parentName:"li",href:"#server-grant"},"specs")),(0,a.kt)("li",{parentName:"ul"},"it MUST verify that ",(0,a.kt)("inlineCode",{parentName:"li"},"access_token")," is a valid ",(0,a.kt)("a",{parentName:"li",href:"https://tools.ietf.org/html/rfc4122"},(0,a.kt)("inlineCode",{parentName:"a"},"uuid"))),(0,a.kt)("li",{parentName:"ul"},"it MUST verify that ",(0,a.kt)("inlineCode",{parentName:"li"},"apn_topic")," is set if ",(0,a.kt)("inlineCode",{parentName:"li"},"token_type")," is ",(0,a.kt)("inlineCode",{parentName:"li"},"APN_TOKEN"))),(0,a.kt)("p",null,"If the message can't be decrypted, the message MUST be discarded."),(0,a.kt)("p",null,"If ",(0,a.kt)("inlineCode",{parentName:"p"},"token_type")," is not supported, a response MUST be sent with ",(0,a.kt)("inlineCode",{parentName:"p"},"error")," set to\n",(0,a.kt)("inlineCode",{parentName:"p"},"UNSUPPORTED_TOKEN_TYPE"),"."),(0,a.kt)("p",null,"If ",(0,a.kt)("inlineCode",{parentName:"p"},"token"),",",(0,a.kt)("inlineCode",{parentName:"p"},"installation_id"),",",(0,a.kt)("inlineCode",{parentName:"p"},"device_tokens"),",",(0,a.kt)("inlineCode",{parentName:"p"},"version")," are empty, a response MUST\nbe sent with ",(0,a.kt)("inlineCode",{parentName:"p"},"error")," set to ",(0,a.kt)("inlineCode",{parentName:"p"},"MALFORMED_MESSAGE"),"."),(0,a.kt)("p",null,"If the ",(0,a.kt)("inlineCode",{parentName:"p"},"version")," is equal or less than the currently stored version, a response MUST\nbe sent with ",(0,a.kt)("inlineCode",{parentName:"p"},"error")," set to ",(0,a.kt)("inlineCode",{parentName:"p"},"VERSION_MISMATCH"),"."),(0,a.kt)("p",null,"If any other error occurs the ",(0,a.kt)("inlineCode",{parentName:"p"},"error")," should be set to ",(0,a.kt)("inlineCode",{parentName:"p"},"INTERNAL_ERROR"),"."),(0,a.kt)("p",null,"If the response is successful ",(0,a.kt)("inlineCode",{parentName:"p"},"success")," MUST be set to ",(0,a.kt)("inlineCode",{parentName:"p"},"true")," otherwise a response MUST be sent with ",(0,a.kt)("inlineCode",{parentName:"p"},"success")," set to ",(0,a.kt)("inlineCode",{parentName:"p"},"false"),"."),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"request_id")," should be set to the ",(0,a.kt)("inlineCode",{parentName:"p"},"SHAKE-256")," of the encrypted payload."),(0,a.kt)("p",null,"The response MUST be sent on the ",(0,a.kt)("a",{parentName:"p",href:"status/deprecated/waku-usage##partitioned-topic"},"partitioned topic")," of the sender\nand MUST not be encrypted using the ",(0,a.kt)("a",{parentName:"p",href:"status/deprecated/secure-transport"},"secure transport")," to facilitate the usage of ephemeral keys."),(0,a.kt)("p",null,"The payload of the response is:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-protobuf"},"message PushNotificationRegistrationResponse {\n bool success = 1;\n ErrorType error = 2;\n bytes request_id = 3;\n\n enum ErrorType {\n UNKNOWN_ERROR_TYPE = 0;\n MALFORMED_MESSAGE = 1;\n VERSION_MISMATCH = 2;\n UNSUPPORTED_TOKEN_TYPE = 3;\n INTERNAL_ERROR = 4;\n }\n}\n")),(0,a.kt)("p",null,"The message MUST be wrapped in a ",(0,a.kt)("a",{parentName:"p",href:"status/deprecated/payloads##payload-wrapper"},(0,a.kt)("inlineCode",{parentName:"a"},"ApplicationMetadataMessage"))," with type set to ",(0,a.kt)("inlineCode",{parentName:"p"},"PUSH_NOTIFICATION_REGISTRATION_RESPONSE"),"."),(0,a.kt)("p",null,"A client SHOULD listen for a response sent on the ",(0,a.kt)("a",{parentName:"p",href:"status/deprecated/waku-usage/#partitioned-topic"},"partitioned topic"),"\nthat the key used to register."),(0,a.kt)("p",null,"If ",(0,a.kt)("inlineCode",{parentName:"p"},"success")," is ",(0,a.kt)("inlineCode",{parentName:"p"},"true")," the client has registered successfully."),(0,a.kt)("p",null,"If ",(0,a.kt)("inlineCode",{parentName:"p"},"success")," is ",(0,a.kt)("inlineCode",{parentName:"p"},"false"),":"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"If ",(0,a.kt)("inlineCode",{parentName:"li"},"MALFORMED_MESSAGE")," is returned, the request SHOULD NOT be retried without ensuring that it is correctly formed."),(0,a.kt)("li",{parentName:"ul"},"If ",(0,a.kt)("inlineCode",{parentName:"li"},"INTERNAL_ERROR")," is returned, the request MAY be retried, but the client MUST backoff exponentially")),(0,a.kt)("p",null,"A client MAY register with multiple Push Notification Servers in order to increase availability."),(0,a.kt)("p",null,"A client SHOULD make sure that all the notification services they registered with have the same information about their tokens."),(0,a.kt)("p",null,"If no response is returned the request SHOULD be considered failed and MAY be retried with the same server or a different one, but clients MUST exponentially backoff after each trial."),(0,a.kt)("p",null,"If the request is successful the token SHOULD be ",(0,a.kt)("a",{parentName:"p",href:"#advertising-a-push-notification-server"},"advertised")," as described below"),(0,a.kt)("h3",{id:"query-topic"},"Query topic"),(0,a.kt)("p",null,"On successful registration the server MUST be listening to the topic derived from:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-protobuf"}," 0XHexEncode(Shake256(CompressedClientPublicKey))\n")),(0,a.kt)("p",null,"Using the topic derivation algorithm described ",(0,a.kt)("a",{parentName:"p",href:"status/deprecated/waku-usage/#public-chats"},"here"),"\nand listen for client queries."),(0,a.kt)("h3",{id:"server-grant"},"Server grant"),(0,a.kt)("p",null,"A push notification server needs to demonstrate to a client that it was authorized\nby the client to send them push notifications. This is done by building\na grant which is specific to a given client-server pair.\nThe grant is built as follow:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-protobuf"}," Signature(Keccak256(CompressedPublicKeyOfClient . CompressedPublicKeyOfServer . AccessToken), PrivateKeyOfClient)\n")),(0,a.kt)("p",null,"When receiving a grant the server MUST be validate that the signature matches the registering client."),(0,a.kt)("h2",{id:"re-registering-with-the-push-notification-server"},"Re-registering with the push notification server"),(0,a.kt)("p",null,"A client SHOULD re-register with the node if the APN or FIREBASE token changes."),(0,a.kt)("p",null,"When re-registering a client SHOULD ensure that it has the most up-to-date\n",(0,a.kt)("inlineCode",{parentName:"p"},"PushNotificationRegistration")," and increment ",(0,a.kt)("inlineCode",{parentName:"p"},"version")," if necessary."),(0,a.kt)("p",null,"Once re-registered, a client SHOULD advertise the changes."),(0,a.kt)("h2",{id:"changing-options"},"Changing options"),(0,a.kt)("p",null,"This is handled in exactly the same way as re-registering above."),(0,a.kt)("h2",{id:"unregistering-from-push-notifications"},"Unregistering from push notifications"),(0,a.kt)("p",null,"To unregister a client MUST send a ",(0,a.kt)("inlineCode",{parentName:"p"},"PushNotificationRegistration")," request as described\nabove with ",(0,a.kt)("inlineCode",{parentName:"p"},"unregister")," set to ",(0,a.kt)("inlineCode",{parentName:"p"},"true"),", or removing\ntheir device information."),(0,a.kt)("p",null,"The server MUST remove all data about this user if ",(0,a.kt)("inlineCode",{parentName:"p"},"unregistering")," is ",(0,a.kt)("inlineCode",{parentName:"p"},"true"),",\napart from the ",(0,a.kt)("inlineCode",{parentName:"p"},"hash")," of the public key and the ",(0,a.kt)("inlineCode",{parentName:"p"},"version")," of the last options,\nin order to make sure that old messages are not processed."),(0,a.kt)("p",null,"A client MAY unregister from a server on explicit logout if multiple chat keys\nare used on a single device."),(0,a.kt)("h2",{id:"advertising-a-push-notification-server"},"Advertising a push notification server"),(0,a.kt)("p",null,"Each user registered with one or more push notification servers SHOULD\nadvertise periodically the push notification services that they have registered with for each device they own."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-protobuf"},"message PushNotificationQueryInfo {\n string access_token = 1;\n string installation_id = 2;\n bytes public_key = 3;\n repeated bytes allowed_user_list = 4;\n bytes grant = 5;\n uint64 version = 6;\n bytes server_public_key = 7;\n}\n\nmessage ContactCodeAdvertisement {\n repeated PushNotificationQueryInfo push_notification_info = 1;\n}\n")),(0,a.kt)("p",null,"The message MUST be wrapped in a ",(0,a.kt)("a",{parentName:"p",href:"status/deprecated/payloads/#payload-wrapper"},(0,a.kt)("inlineCode",{parentName:"a"},"ApplicationMetadataMessage"))," with type set to ",(0,a.kt)("inlineCode",{parentName:"p"},"PUSH_NOTIFICATION_QUERY_INFO"),"."),(0,a.kt)("p",null,"If no filtering is done based on public keys,\nthe access token SHOULD be included in the advertisement.\nOtherwise it SHOULD be left empty."),(0,a.kt)("p",null,"This SHOULD be advertised on the ",(0,a.kt)("a",{parentName:"p",href:"/status/deprecated/waku-usage##contact-code-topic"},"contact code topic"),"\nand SHOULD be coupled with normal contact-code advertisement."),(0,a.kt)("p",null,"Every time a user register or re-register with a push notification service, their\ncontact-code SHOULD be re-advertised."),(0,a.kt)("p",null,"Multiple servers MAY be advertised for the same ",(0,a.kt)("inlineCode",{parentName:"p"},"installation_id")," for redundancy reasons."),(0,a.kt)("h2",{id:"discovering-a-push-notification-server"},"Discovering a push notification server"),(0,a.kt)("p",null,"To discover a push notification service for a given user, their ",(0,a.kt)("a",{parentName:"p",href:"status/deprecated/waku-usage/#contact-code-topic"},"contact code topic"),"\nSHOULD be listened to.\nA mailserver can be queried for the specific topic to retrieve the most up-to-date\ncontact code."),(0,a.kt)("h2",{id:"querying-the-push-notification-server"},"Querying the push notification server"),(0,a.kt)("p",null,"If a token is not present in the latest advertisement for a user, the server\nSHOULD be queried directly."),(0,a.kt)("p",null,"To query a server a message:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-protobuf"},"message PushNotificationQuery {\n repeated bytes public_keys = 1;\n}\n")),(0,a.kt)("p",null,"The message MUST be wrapped in a ",(0,a.kt)("a",{parentName:"p",href:"status/deprecated/payloads/#payload-wrapper"},(0,a.kt)("inlineCode",{parentName:"a"},"ApplicationMetadataMessage"))," with type set to ",(0,a.kt)("inlineCode",{parentName:"p"},"PUSH_NOTIFICATION_QUERY"),"."),(0,a.kt)("p",null,"MUST be sent to the server on the topic derived from the hashed public key of the\nkey we are querying, as ",(0,a.kt)("a",{parentName:"p",href:"#query-topic"},"described above"),"."),(0,a.kt)("p",null,"An ephemeral key SHOULD be used and SHOULD NOT be encrypted using the ",(0,a.kt)("a",{parentName:"p",href:"status/deprecated/secure-transport"},"secure transport"),"."),(0,a.kt)("p",null,"If the server has information about the client a response MUST be sent:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-protobuf"},"message PushNotificationQueryInfo {\n string access_token = 1;\n string installation_id = 2;\n bytes public_key = 3;\n repeated bytes allowed_user_list = 4;\n bytes grant = 5;\n uint64 version = 6;\n bytes server_public_key = 7;\n}\n\nmessage PushNotificationQueryResponse {\n repeated PushNotificationQueryInfo info = 1;\n bytes message_id = 2;\n bool success = 3;\n}\n")),(0,a.kt)("p",null,"A ",(0,a.kt)("inlineCode",{parentName:"p"},"PushNotificationQueryResponse")," message MUST be wrapped in a ",(0,a.kt)("a",{parentName:"p",href:"status/deprecated/payloads##payload-wrapper"},(0,a.kt)("inlineCode",{parentName:"a"},"ApplicationMetadataMessage"))," with type set to ",(0,a.kt)("inlineCode",{parentName:"p"},"PUSH_NOTIFICATION_QUERY_RESPONSE"),"."),(0,a.kt)("p",null,"Otherwise a response MUST NOT be sent."),(0,a.kt)("p",null,"If ",(0,a.kt)("inlineCode",{parentName:"p"},"allowed_key_list")," is not set ",(0,a.kt)("inlineCode",{parentName:"p"},"access_token")," MUST be set and ",(0,a.kt)("inlineCode",{parentName:"p"},"allowed_key_list")," MUST NOT\nbe set."),(0,a.kt)("p",null,"If ",(0,a.kt)("inlineCode",{parentName:"p"},"allowed_key_list")," is set ",(0,a.kt)("inlineCode",{parentName:"p"},"allowed_key_list")," MUST be set and ",(0,a.kt)("inlineCode",{parentName:"p"},"access_token")," MUST NOT be set."),(0,a.kt)("p",null,"If ",(0,a.kt)("inlineCode",{parentName:"p"},"access_token")," is returned, the ",(0,a.kt)("inlineCode",{parentName:"p"},"access_token")," SHOULD be used to send push notifications."),(0,a.kt)("p",null,"If ",(0,a.kt)("inlineCode",{parentName:"p"},"allowed_key_list")," are returned, the client SHOULD decrypt each\ntoken by generating an ",(0,a.kt)("inlineCode",{parentName:"p"},"AES-GCM")," symmetric key from the Diffie\u2013Hellman between the\ntarget client and itself\nIf AES decryption succeeds it will return a valid ",(0,a.kt)("a",{parentName:"p",href:"https://tools.ietf.org/html/rfc4122"},(0,a.kt)("inlineCode",{parentName:"a"},"uuid"))," which is what is used for access_token.\nThe token SHOULD be used to send push notifications."),(0,a.kt)("p",null,"The response MUST be sent on the ",(0,a.kt)("a",{parentName:"p",href:"status/deprecated/waku-usage/#partitioned-topic"},"partitioned topic")," of the sender\nand MUST not be encrypted using the ",(0,a.kt)("a",{parentName:"p",href:"status/deprecated/secure-transport"},"secure transport")," to facilitate\nthe usage of ephemeral keys."),(0,a.kt)("p",null,"On receiving a response a client MUST verify ",(0,a.kt)("inlineCode",{parentName:"p"},"grant")," to ensure that the server\nhas been authorized to send push notification to a given client."),(0,a.kt)("h2",{id:"sending-a-push-notification"},"Sending a push notification"),(0,a.kt)("p",null,"When sending a push notification, only the ",(0,a.kt)("inlineCode",{parentName:"p"},"installation_id")," for the devices targeted\nby the message SHOULD be used."),(0,a.kt)("p",null,"If a message is for all the user devices, all the ",(0,a.kt)("inlineCode",{parentName:"p"},"installation_id")," known to the client MAY be used."),(0,a.kt)("p",null,"The number of devices MAY be capped in order to reduce resource consumption."),(0,a.kt)("p",null,"At least 3 devices SHOULD be targeted, ordered by last activity."),(0,a.kt)("p",null,"For any device that a token is available, or that a token is successfully queried,\na push notification message SHOULD be sent to the corresponding push notification server."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-protobuf"},"message PushNotification {\n string access_token = 1;\n string chat_id = 2;\n bytes public_key = 3;\n string installation_id = 4;\n bytes message = 5;\n PushNotificationType type = 6;\n enum PushNotificationType {\n UNKNOWN_PUSH_NOTIFICATION_TYPE = 0;\n MESSAGE = 1;\n MENTION = 2;\n }\n bytes author = 7;\n}\n\nmessage PushNotificationRequest {\n repeated PushNotification requests = 1;\n bytes message_id = 2;\n}\n")),(0,a.kt)("p",null,"A ",(0,a.kt)("inlineCode",{parentName:"p"},"PushNotificationRequest")," message MUST be wrapped in a ",(0,a.kt)("a",{parentName:"p",href:"/status/deprecated/payloads##payload-wrapper"},(0,a.kt)("inlineCode",{parentName:"a"},"ApplicationMetadataMessage"))," with type set to ",(0,a.kt)("inlineCode",{parentName:"p"},"PUSH_NOTIFICATION_REQUEST"),"."),(0,a.kt)("p",null,"Where ",(0,a.kt)("inlineCode",{parentName:"p"},"message")," is the encrypted payload of the message and ",(0,a.kt)("inlineCode",{parentName:"p"},"chat_id")," is the\n",(0,a.kt)("inlineCode",{parentName:"p"},"SHAKE-256")," of the ",(0,a.kt)("inlineCode",{parentName:"p"},"chat_id"),".\n",(0,a.kt)("inlineCode",{parentName:"p"},"message_id")," is the id of the message\n",(0,a.kt)("inlineCode",{parentName:"p"},"author")," is the ",(0,a.kt)("inlineCode",{parentName:"p"},"SHAKE-256")," of the public key of the sender."),(0,a.kt)("p",null,"If multiple server are available for a given push notification, only one notification\nMUST be sent."),(0,a.kt)("p",null,"If no response is received\na client SHOULD wait at least 3 seconds, after which the request MAY be retried against a different server"),(0,a.kt)("p",null,"This message SHOULD be sent using an ephemeral key."),(0,a.kt)("p",null,"On receiving the message, the push notification server MUST validate the access token.\nIf the access token is valid, a notification MUST be sent to the gorush instance with the\nfollowing data:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-protobuf"},'{\n "notifications": [\n {\n "tokens": ["token_a", "token_b"],\n "platform": 1,\n "message": "You have a new message",\n "data": {\n "chat_id": chat_id,\n "message": message,\n "installation_ids": [installation_id_1, installation_id_2]\n }\n }\n ]\n}\n')),(0,a.kt)("p",null,"Where platform is ",(0,a.kt)("inlineCode",{parentName:"p"},"1")," for IOS and ",(0,a.kt)("inlineCode",{parentName:"p"},"2")," for Firebase, according to the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/appleboy/gorush"},"gorush documentation")),(0,a.kt)("p",null,"A server MUST return a response message:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-protobuf"},"message PushNotificationReport {\n bool success = 1;\n ErrorType error = 2;\n enum ErrorType {\n UNKNOWN_ERROR_TYPE = 0;\n WRONG_TOKEN = 1;\n INTERNAL_ERROR = 2;\n NOT_REGISTERED = 3;\n }\n bytes public_key = 3;\n string installation_id = 4;\n}\n\nmessage PushNotificationResponse {\n bytes message_id = 1;\n repeated PushNotificationReport reports = 2;\n}\n")),(0,a.kt)("p",null,"A ",(0,a.kt)("inlineCode",{parentName:"p"},"PushNotificationResponse")," message MUST be wrapped in a ",(0,a.kt)("a",{parentName:"p",href:"/status/deprecated/payloads##payload-wrapper"},(0,a.kt)("inlineCode",{parentName:"a"},"ApplicationMetadataMessage"))," with type set to ",(0,a.kt)("inlineCode",{parentName:"p"},"PUSH_NOTIFICATION_RESPONSE"),"."),(0,a.kt)("p",null,"Where ",(0,a.kt)("inlineCode",{parentName:"p"},"message_id")," is the ",(0,a.kt)("inlineCode",{parentName:"p"},"message_id")," sent by the client."),(0,a.kt)("p",null,"The response MUST be sent on the ",(0,a.kt)("a",{parentName:"p",href:"/status/deprecated/waku-usage##partitioned-topic"},"partitioned topic")," of the sender\nand MUST not be encrypted using the ",(0,a.kt)("a",{parentName:"p",href:"/status/deprecated/secure-transport"},"secure transport")," to facilitate\nthe usage of ephemeral keys."),(0,a.kt)("p",null,"If the request is accepted ",(0,a.kt)("inlineCode",{parentName:"p"},"success")," MUST be set to ",(0,a.kt)("inlineCode",{parentName:"p"},"true"),".\nOtherwise ",(0,a.kt)("inlineCode",{parentName:"p"},"success")," MUST be set to ",(0,a.kt)("inlineCode",{parentName:"p"},"false"),"."),(0,a.kt)("p",null,"If ",(0,a.kt)("inlineCode",{parentName:"p"},"error")," is ",(0,a.kt)("inlineCode",{parentName:"p"},"BAD_TOKEN")," the client MAY query again the server for the token and\nretry the request."),(0,a.kt)("p",null,"If ",(0,a.kt)("inlineCode",{parentName:"p"},"error")," is ",(0,a.kt)("inlineCode",{parentName:"p"},"INTERNAL_ERROR")," the client MAY retry the request."),(0,a.kt)("h2",{id:"flow"},"Flow"),(0,a.kt)("h3",{id:"registration-process"},"Registration process"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"A client will generate a notification token through ",(0,a.kt)("inlineCode",{parentName:"li"},"APN")," or ",(0,a.kt)("inlineCode",{parentName:"li"},"Firebase"),"."),(0,a.kt)("li",{parentName:"ul"},"The client will ",(0,a.kt)("a",{parentName:"li",href:"#registering-with-the-push-notification-service"},"register")," with one or more push notification server of their choosing."),(0,a.kt)("li",{parentName:"ul"},"The server should process the response and respond according to the success of the operation"),(0,a.kt)("li",{parentName:"ul"},"If the request is not successful it might be retried, and adjusted according to the response. A different server can be also used."),(0,a.kt)("li",{parentName:"ul"},"Once the request is successful the client should ",(0,a.kt)("a",{parentName:"li",href:"#advertising-a-push-notification-server"},"advertise")," the new coordinates")),(0,a.kt)("h3",{id:"sending-a-notification"},"Sending a notification"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"A client should prepare a message and extract the targeted installation-ids"),(0,a.kt)("li",{parentName:"ul"},"It should retrieve the most up to date information for a given user, either by\nquerying a push notification server, a mailserver if not listening already to the given topic, or checking\nthe database locally"),(0,a.kt)("li",{parentName:"ul"},"It should then ",(0,a.kt)("a",{parentName:"li",href:"#sending-a-push-notification"},"send")," a push notification according\nto the rules described"),(0,a.kt)("li",{parentName:"ul"},"The server should then send a request to the gorush server including all the required\ninformation")),(0,a.kt)("h3",{id:"receiving-a-push-notification"},"Receiving a push notification"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"On receiving the notification, a client can open the right account by checking the\n",(0,a.kt)("inlineCode",{parentName:"li"},"installation_id")," included. The ",(0,a.kt)("inlineCode",{parentName:"li"},"chat_id")," MAY be used to open the chat if present."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"message")," can be decrypted and presented to the user. Otherwise messages can be pulled from the mailserver if the ",(0,a.kt)("inlineCode",{parentName:"li"},"message_id")," is no already present.")),(0,a.kt)("h2",{id:"protobuf-description"},"Protobuf description"),(0,a.kt)("h3",{id:"pushnotificationregistration"},"PushNotificationRegistration"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"token_type"),": the type of token. Currently supported is ",(0,a.kt)("inlineCode",{parentName:"p"},"APN_TOKEN")," for Apple Push\n",(0,a.kt)("inlineCode",{parentName:"p"},"device_token"),": the actual push notification token sent by ",(0,a.kt)("inlineCode",{parentName:"p"},"Firebase")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"APN"),"\nand ",(0,a.kt)("inlineCode",{parentName:"p"},"FIREBASE_TOKEN")," for firebase.\n",(0,a.kt)("inlineCode",{parentName:"p"},"installation_id"),": the ",(0,a.kt)("a",{parentName:"p",href:"/status/deprecated/account"},(0,a.kt)("inlineCode",{parentName:"a"},"installation_id"))," of the device\n",(0,a.kt)("inlineCode",{parentName:"p"},"access_token"),": the access token that will be given to clients to send push notifications\n",(0,a.kt)("inlineCode",{parentName:"p"},"enabled"),": whether the device wants to be sent push notifications\n",(0,a.kt)("inlineCode",{parentName:"p"},"version"),": a monotonically increasing number identifying the current ",(0,a.kt)("inlineCode",{parentName:"p"},"PushNotificationRegistration"),". Any time anything is changed in the record it MUST be increased by the client, otherwise the request will not be accepted.\n",(0,a.kt)("inlineCode",{parentName:"p"},"allowed_key_list"),": a list of ",(0,a.kt)("inlineCode",{parentName:"p"},"access_token")," encrypted with the AES key generated\nby Diffie\u2013Hellman between the publisher and the allowed\ncontact.\n",(0,a.kt)("inlineCode",{parentName:"p"},"blocked_chat_list"),": a list of ",(0,a.kt)("inlineCode",{parentName:"p"},"SHA2-256")," hashes of chat ids.\nAny chat id in this list will not trigger a notification.\n",(0,a.kt)("inlineCode",{parentName:"p"},"unregister"),": whether the account should be unregistered\n",(0,a.kt)("inlineCode",{parentName:"p"},"grant"),": the grant for this specific server\n",(0,a.kt)("inlineCode",{parentName:"p"},"allow_from_contacts_only"),": whether the client only wants push notifications from contacts\n",(0,a.kt)("inlineCode",{parentName:"p"},"apn_topic"),": the APN topic for the push notification\n",(0,a.kt)("inlineCode",{parentName:"p"},"block_mentions"),": whether the client does not want to be notified on mentions\n",(0,a.kt)("inlineCode",{parentName:"p"},"allowed_mentions_chat_list"),": a list of ",(0,a.kt)("inlineCode",{parentName:"p"},"SHA2-256")," hashes of chat ids where we want to receive mentions"),(0,a.kt)("h4",{id:"data-disclosed"},"Data disclosed"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Type of device owned by a given user"),(0,a.kt)("li",{parentName:"ul"},"The ",(0,a.kt)("inlineCode",{parentName:"li"},"FIREBASE")," or ",(0,a.kt)("inlineCode",{parentName:"li"},"APN")," push notification token"),(0,a.kt)("li",{parentName:"ul"},"Hash of the chat_id a user is not interested in for notifications"),(0,a.kt)("li",{parentName:"ul"},"The times a push notification record has been modified by the user"),(0,a.kt)("li",{parentName:"ul"},"The number of contacts a client has, in case ",(0,a.kt)("inlineCode",{parentName:"li"},"allowed_key_list")," is set")),(0,a.kt)("h3",{id:"pushnotificationregistrationresponse"},"PushNotificationRegistrationResponse"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"success"),": whether the registration was successful\n",(0,a.kt)("inlineCode",{parentName:"p"},"error"),": the error type, if any\n",(0,a.kt)("inlineCode",{parentName:"p"},"request_id"),": the ",(0,a.kt)("inlineCode",{parentName:"p"},"SHAKE-256")," hash of the ",(0,a.kt)("inlineCode",{parentName:"p"},"signature")," of the request\n",(0,a.kt)("inlineCode",{parentName:"p"},"preferences"),": the server stored preferences in case of an error"),(0,a.kt)("h3",{id:"contactcodeadvertisement"},"ContactCodeAdvertisement"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"push_notification_info"),": the information for each device advertised"),(0,a.kt)("p",null,"Data disclosed"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The chat key of the sender")),(0,a.kt)("h3",{id:"pushnotificationquery"},"PushNotificationQuery"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"public_keys"),": the ",(0,a.kt)("inlineCode",{parentName:"p"},"SHAKE-256")," of the public keys the client is interested in"),(0,a.kt)("p",null,"Data disclosed"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The hash of the public keys the client is interested in")),(0,a.kt)("h3",{id:"pushnotificationqueryinfo"},"PushNotificationQueryInfo"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"access_token"),": the access token used to send a push notification\n",(0,a.kt)("inlineCode",{parentName:"p"},"installation_id"),": the ",(0,a.kt)("inlineCode",{parentName:"p"},"installation_id")," of the device associated with the ",(0,a.kt)("inlineCode",{parentName:"p"},"access_token"),"\n",(0,a.kt)("inlineCode",{parentName:"p"},"public_key"),": the ",(0,a.kt)("inlineCode",{parentName:"p"},"SHAKE-256")," of the public key associated with this ",(0,a.kt)("inlineCode",{parentName:"p"},"access_token")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"installation_id"),"\n",(0,a.kt)("inlineCode",{parentName:"p"},"allowed_key_list"),": a list of encrypted access tokens to be returned\nto the client in case there's any filtering on public keys in place.\n",(0,a.kt)("inlineCode",{parentName:"p"},"grant"),": the grant used to register with this server.\n",(0,a.kt)("inlineCode",{parentName:"p"},"version"),": the version of the registration on the server.\n",(0,a.kt)("inlineCode",{parentName:"p"},"server_public_key"),": the compressed public key of the server."),(0,a.kt)("h3",{id:"pushnotificationqueryresponse"},"PushNotificationQueryResponse"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"info"),": a list of ",(0,a.kt)("inlineCode",{parentName:"p"},"PushNotificationQueryInfo"),".\n",(0,a.kt)("inlineCode",{parentName:"p"},"message_id"),": the message id of the ",(0,a.kt)("inlineCode",{parentName:"p"},"PushNotificationQueryInfo")," the server is replying to.\n",(0,a.kt)("inlineCode",{parentName:"p"},"success"),": whether the query was successful."),(0,a.kt)("h3",{id:"pushnotification"},"PushNotification"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"access_token"),": the access token used to send a push notification.\n",(0,a.kt)("inlineCode",{parentName:"p"},"chat_id"),": the ",(0,a.kt)("inlineCode",{parentName:"p"},"SHAKE-256")," of the ",(0,a.kt)("inlineCode",{parentName:"p"},"chat_id"),".\n",(0,a.kt)("inlineCode",{parentName:"p"},"public_key"),": the ",(0,a.kt)("inlineCode",{parentName:"p"},"SHAKE-256")," of the compressed public key of the receiving client.\n",(0,a.kt)("inlineCode",{parentName:"p"},"installation_id"),": the installation id of the receiving client.\n",(0,a.kt)("inlineCode",{parentName:"p"},"message"),": the encrypted message that is being notified on.\n",(0,a.kt)("inlineCode",{parentName:"p"},"type"),": the type of the push notification, either ",(0,a.kt)("inlineCode",{parentName:"p"},"MESSAGE")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"MENTION"),"\n",(0,a.kt)("inlineCode",{parentName:"p"},"author"),": the ",(0,a.kt)("inlineCode",{parentName:"p"},"SHAKE-256")," of the public key of the sender"),(0,a.kt)("p",null,"Data disclosed"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The ",(0,a.kt)("inlineCode",{parentName:"li"},"SHAKE-256")," of the ",(0,a.kt)("inlineCode",{parentName:"li"},"chat_id")," the notification is to be sent for"),(0,a.kt)("li",{parentName:"ul"},"The cypher text of the message"),(0,a.kt)("li",{parentName:"ul"},"The ",(0,a.kt)("inlineCode",{parentName:"li"},"SHAKE-256")," of the public key of the sender"),(0,a.kt)("li",{parentName:"ul"},"The type of notification")),(0,a.kt)("h3",{id:"pushnotificationrequest"},"PushNotificationRequest"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"requests"),": a list of ",(0,a.kt)("inlineCode",{parentName:"p"},"PushNotification"),"\n",(0,a.kt)("inlineCode",{parentName:"p"},"message_id"),": the ",(0,a.kt)("a",{parentName:"p",href:"/status/deprecated/payloads"},"status message id")),(0,a.kt)("p",null,"Data disclosed"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The status message id for which the notification is for")),(0,a.kt)("h3",{id:"pushnotificationresponse"},"PushNotificationResponse"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"message_id"),": the ",(0,a.kt)("inlineCode",{parentName:"p"},"message_id")," being notified on.\n",(0,a.kt)("inlineCode",{parentName:"p"},"reports"),": a list of ",(0,a.kt)("inlineCode",{parentName:"p"},"PushNotificationReport")),(0,a.kt)("h3",{id:"pushnotificationreport"},"PushNotificationReport"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"success"),": whether the push notification was successful.\n",(0,a.kt)("inlineCode",{parentName:"p"},"error"),": the type of the error in case of failure.\n",(0,a.kt)("inlineCode",{parentName:"p"},"public_key"),": the public key of the user being notified.\n",(0,a.kt)("inlineCode",{parentName:"p"},"installation_id"),": the installation id of the user being notified."),(0,a.kt)("h2",{id:"anonymous-mode-of-operations"},"Anonymous mode of operations"),(0,a.kt)("p",null,"An anonymous mode of operations MAY be provided by the client, where the\nresponsibility of propagating information about the user is left to the client,\nin order to preserve privacy."),(0,a.kt)("p",null,"A client in anonymous mode can register with the server using a key different\nfrom their chat key.\nThis will hide their real chat key."),(0,a.kt)("p",null,"This public key is effectively a secret and SHOULD only be disclosed to clients that you the user wants to be notified by."),(0,a.kt)("p",null,"A client MAY advertise the access token on the contact-code topic of the key generated.\nA client MAY share their public key through ",(0,a.kt)("a",{parentName:"p",href:"/status/deprecated/payloads##contact-update"},"contact updates")),(0,a.kt)("p",null,"A client receiving a push notification public key SHOULD listen to the contact code\ntopic of the push notification public key for updates."),(0,a.kt)("p",null,"The method described above effectively does not share the identity of the sender\nnor the receiver to the server, but MAY result in missing push notifications as\nthe propagation of the secret is left to the client."),(0,a.kt)("p",null,"This can be mitigated by ",(0,a.kt)("a",{parentName:"p",href:"/status/deprecated/payloads"},"device syncing"),", but not completely\naddressed."),(0,a.kt)("h2",{id:"security-considerations"},"Security considerations"),(0,a.kt)("p",null,"If no anonymous mode is used, when registering with a push notification service a client discloses:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The chat key"),(0,a.kt)("li",{parentName:"ul"},"The devices that will receive notifications")),(0,a.kt)("p",null,"A client MAY disclose:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The hash of the chat_ids they want to filter out")),(0,a.kt)("p",null,"When running in anonymous mode, the client's chat key is not disclosed."),(0,a.kt)("p",null,"When querying a push notification server a client will disclose:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"That it is interested in sending push notification to another client,\nbut the querying client's chat key is not disclosed")),(0,a.kt)("p",null,"When sending a push notification a client discloses:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The ",(0,a.kt)("inlineCode",{parentName:"li"},"SHAKE-256")," of the chat id")),(0,a.kt)("p",null,"[//]",": This section can be removed, for now leaving it here in order to help with the\nreview process. Point can be integrated, suggestion welcome."),(0,a.kt)("h2",{id:"faq"},"FAQ"),(0,a.kt)("h3",{id:"why-having-acl-done-at-the-server-side-and-not-the-client"},"Why having ACL done at the server side and not the client?"),(0,a.kt)("p",null,"We looked into silent notification for\n",(0,a.kt)("a",{parentName:"p",href:"https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/pushing_background_updates_to_your_app"},"IOS")," (android has no equivalent)\nbut can't be used as it's expected to receive maximum 2/3 per hour, so not our use case. There\nare also issue when the user force quit the app."),(0,a.kt)("h3",{id:"why-using-an-access-token"},"Why using an access token?"),(0,a.kt)("p",null,"The access token is used to decouple the requesting information from the user from\nactually sending the push notification."),(0,a.kt)("p",null,"Some ACL is necessary otherwise it would be too easy to spam users (it's still fairly\ntrivial, but with this method you could allow only contacts to send you push notifications)."),(0,a.kt)("p",null,"Therefore your identity must be revealed to the server either when sending or querying."),(0,a.kt)("p",null,"By using an access token we increase deniability, as the server would know\nwho requested the token but not necessarily who sent a push notification.\nCorrelation between the two can be trivial in some cases."),(0,a.kt)("p",null,"This also allows a mode of use as we had before, where the server does not propagate\ninfo at all, and it's left to the user to propagate the token, through contact requests\nfor example."),(0,a.kt)("h3",{id:"why-advertise-with-the-bundle"},"Why advertise with the bundle?"),(0,a.kt)("p",null,"Advertising with the bundle allows us to piggy-back on an already implemented behavior\nand save some bandwidth in cases where is not filtering by public keys"),(0,a.kt)("h3",{id:"whats-the--bandwidth-impact-for-this"},"What's the bandwidth impact for this?"),(0,a.kt)("p",null,"Generally speaking, for each 1-to-1 message and group chat message you will sending\n1 and ",(0,a.kt)("inlineCode",{parentName:"p"},"number of participants")," push notifications. This can be optimized if\nmultiple users are using the same push notification server. Queries have also\na bandwidth impact but they are made only when actually needed"),(0,a.kt)("h3",{id:"whats-the-information-disclosed"},"What's the information disclosed?"),(0,a.kt)("p",null,"The data disclosed with each message sent by the client is above, but for a summary:"),(0,a.kt)("p",null,"When you register with a push notification service you may disclose:"),(0,a.kt)("p",null,"1) Your chat key\n2) Which devices you have\n3) The hash of the chat_ids you want to filter out\n4) The hash of the public keys you are interested/not interested in"),(0,a.kt)("p",null,"When you query a notification service you may disclose:"),(0,a.kt)("p",null,"1) Your chat key\n2) The fact that you are interested in sending push notification to a given user"),(0,a.kt)("p",null,"Effectively this is fairly revealing if the user has a whitelist implemented.\nTherefore sending notification should be optional."),(0,a.kt)("h3",{id:"what-prevents-a-user-from-generating-a-random-key-and-getting-an-access-token-and-spamming"},"What prevents a user from generating a random key and getting an access token and spamming?"),(0,a.kt)("p",null,"Nothing really, that's the same as the status app as a whole. the only mechanism that prevents\nthis is using a white-list as described above,\nbut that implies disclosing your true identity to the push notification server."),(0,a.kt)("h3",{id:"why-not-0-knowledge-proofsquantum-computing"},"Why not 0-knowledge proofs/quantum computing"),(0,a.kt)("p",null,"We start simple, we can iterate"),(0,a.kt)("h3",{id:"how-to-handle-backwardforward-compatibility"},"How to handle backward/forward compatibility"),(0,a.kt)("p",null,"Most of the request have a target, so protocol negotiation can happen. We cannot negotiated\nthe advertisement as that's effectively a broadcast, but those info should not change and we can\nalways accrete the message."),(0,a.kt)("h3",{id:"why-ack_key"},"Why ack_key?"),(0,a.kt)("p",null,"That's necessary to avoid duplicated push notifications and allow for the retry\nin case the notification is not successful."),(0,a.kt)("p",null,"Deduplication of the push notification is done on the client side, to reduce a bit\nof centralization and also in order not to have to modify gorush."),(0,a.kt)("h3",{id:"can-i-run-my-own-node"},"Can I run my own node?"),(0,a.kt)("p",null,"Sure, the methods allow that"),(0,a.kt)("h3",{id:"can-i-register-with-multiple-nodes-for-redundancy"},"Can I register with multiple nodes for redundancy"),(0,a.kt)("p",null,"Yep"),(0,a.kt)("h3",{id:"what-does-my-node-disclose"},"What does my node disclose?"),(0,a.kt)("p",null,"Your node will disclose the IP address is running from, as it makes an HTTP post to\ngorush. A waku adapter could be used, but please not now."),(0,a.kt)("h3",{id:"does-this-have-high-reliability-requirements"},"Does this have high-reliability requirements?"),(0,a.kt)("p",null,"The gorush server yes, no way around it."),(0,a.kt)("p",null,"The rest, kind of, at least one node having your token needs to be up for you to receive notifications.\nBut you can register with multiple servers (desktop, status, etc) if that's a concern."),(0,a.kt)("h3",{id:"can-someone-else-ie-not-status-run-this"},"Can someone else (i.e not status) run this?"),(0,a.kt)("p",null,"Push notification servers can be run by anyone. Gorush can be run by anyone I take,\nbut we are in charge of the certificate, so they would not be able to notify status-clients."),(0,a.kt)("h2",{id:"changelog"},"Changelog"),(0,a.kt)("h3",{id:"version-01"},"Version 0.1"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://github.com/status-im/specs/commit/"},"Released")),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Initial version")),(0,a.kt)("h2",{id:"copyright"},"Copyright"),(0,a.kt)("p",null,"Copyright and related rights waived via ",(0,a.kt)("a",{parentName:"p",href:"https://creativecommons.org/publicdomain/zero/1.0/"},"CC0"),"."),(0,a.kt)("h2",{id:"references"},"References"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1"},"APN Service")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_background/updating_your_app_with_background_app_refresh"},"Background Execution on iOS")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://firebase.google.com/"},"Firebase")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/appleboy/gorush"},"Gorush")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://tools.ietf.org/html/rfc4122"},"UUID Specification")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/status/deprecated/secure-transport"},"Secure Transport")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/pushing_background_updates_to_your_app"},"Silent Notifications on iOS")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/status/deprecated/waku-usage"},"Waku Usage")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/ensdomains/ens"},"ENS Contract")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/status/deprecated/payloads"},"Payloads"))))}u.isMDXComponent=!0},3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>h});var i=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=i.createContext({}),p=function(e){var t=i.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=p(e.components);return i.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,d=r(e,["components","mdxType","originalType","parentName"]),c=p(n),h=a,k=c["".concat(l,".").concat(h)]||c[h]||u[h]||o;return n?i.createElement(k,s(s({ref:t},d),{},{components:n})):i.createElement(k,s({ref:t},d))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=c;var r={};for(var l in t)hasOwnProperty.call(t,l)&&(r[l]=t[l]);r.originalType=e,r.mdxType="string"==typeof e?e:a,s[1]=r;for(var p=2;p{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>d,toc:()=>p});var n=a(87462),r=(a(67294),a(3905));const i={title:"GROUP-CHAT",name:"Group Chat",status:"deprecated",description:"This document describes the group chat protocol used by the Status application.",editor:"Filip Dimitrijevic <filip@status.im>",contributors:["Andrea Piana <andreap@status.im>"]},l=void 0,d={unversionedId:"deprecated/group-chat",id:"deprecated/group-chat",title:"GROUP-CHAT",description:"This document describes the group chat protocol used by the Status application.",source:"@site/status/deprecated/group-chat.md",sourceDirName:"deprecated",slug:"/deprecated/group-chat",permalink:"/status/deprecated/group-chat",draft:!1,tags:[],version:"current",frontMatter:{title:"GROUP-CHAT",name:"Group Chat",status:"deprecated",description:"This document describes the group chat protocol used by the Status application.",editor:"Filip Dimitrijevic <filip@status.im>",contributors:["Andrea Piana <andreap@status.im>"]},sidebar:"defaultSidebar",previous:{title:"ETHEREUM-USAGE",permalink:"/status/deprecated/ethereum-usage"},next:{title:"Keycard Usage for Wallet and Chat Keys",permalink:"/status/deprecated/keycard-usage-for-wallet-and-chat-keys"}},o={},p=[{value:"Abstract",id:"abstract",level:2},{value:"Membership updates",id:"membership-updates",level:2},{value:"Payload",id:"payload",level:3},{value:"Chat ID",id:"chat-id",level:3},{value:"Signature",id:"signature",level:3},{value:"Group membership event",id:"group-membership-event",level:3},{value:"CHAT_CREATED",id:"chat_created",level:4},{value:"NAME_CHANGED",id:"name_changed",level:4},{value:"MEMBERS_ADDED",id:"members_added",level:4},{value:"MEMBER_JOINED",id:"member_joined",level:4},{value:"ADMINS_ADDED",id:"admins_added",level:4},{value:"MEMBER_REMOVED",id:"member_removed",level:4},{value:"ADMIN_REMOVED",id:"admin_removed",level:4},{value:"Copyright",id:"copyright",level:2},{value:"References",id:"references",level:2}],s={toc:p};function m(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Status: deprecated"),(0,r.kt)("li",{parentName:"ul"},"Editor: Filip Dimitrijevic ","<",(0,r.kt)("a",{parentName:"li",href:"mailto:filip@status.im"},"filip@status.im"),">"),(0,r.kt)("li",{parentName:"ul"},"Contributors:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Andrea Piana ","<",(0,r.kt)("a",{parentName:"li",href:"mailto:andreap@status.im"},"andreap@status.im"),">")))),(0,r.kt)("h2",{id:"abstract"},"Abstract"),(0,r.kt)("p",null,"This document describes the group chat protocol used by the Status application.\nThe node uses pairwise encryption among members so a message is exchanged",(0,r.kt)("br",{parentName:"p"}),"\n","between each participant, similarly to a one-to-one message."),(0,r.kt)("h2",{id:"membership-updates"},"Membership updates"),(0,r.kt)("p",null,"The node uses membership updates messages to propagate group chat membership changes.\nThe protobuf format is described in the ",(0,r.kt)("a",{parentName:"p",href:"/status/deprecated/payloads"},"PAYLOADS"),".\nBelow describes each specific field."),(0,r.kt)("p",null,"The protobuf messages are:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-protobuf"},"// MembershipUpdateMessage is a message used to propagate information\n// about group membership changes.\nmessage MembershipUpdateMessage {\n // The chat id of the private group chat\n string chat_id = 1;\n // A list of events for this group chat, first 65 bytes are the signature, then is a \n // protobuf encoded MembershipUpdateEvent\n repeated bytes events = 2;\n // An optional chat message\n ChatMessage message = 3;\n}\n\nmessage MembershipUpdateEvent {\n // Lamport timestamp of the event as described in [Status Payload Specs](status-payload-specs##clock-vs-timestamp-and-message-ordering)\n uint64 clock = 1;\n // List of public keys of the targets of the action\n repeated string members = 2;\n // Name of the chat for the CHAT_CREATED/NAME_CHANGED event types\n string name = 3;\n // The type of the event\n EventType type = 4;\n\n enum EventType {\n UNKNOWN = 0;\n CHAT_CREATED = 1; // See [CHAT_CREATED](#chat-created)\n NAME_CHANGED = 2; // See [NAME_CHANGED](#name-changed)\n MEMBERS_ADDED = 3; // See [MEMBERS_ADDED](#members-added)\n MEMBER_JOINED = 4; // See [MEMBER_JOINED](#member-joined)\n MEMBER_REMOVED = 5; // See [MEMBER_REMOVED](#member-removed)\n ADMINS_ADDED = 6; // See [ADMINS_ADDED](#admins-added)\n ADMIN_REMOVED = 7; // See [ADMIN_REMOVED](#admin-removed)\n }\n}\n")),(0,r.kt)("h3",{id:"payload"},"Payload"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"MembershipUpdateMessage"),":"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Field"),(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1"),(0,r.kt)("td",{parentName:"tr",align:null},"chat-id"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"string")),(0,r.kt)("td",{parentName:"tr",align:null},"The chat id of the chat where the change is to take place")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2"),(0,r.kt)("td",{parentName:"tr",align:null},"events"),(0,r.kt)("td",{parentName:"tr",align:null},"See details"),(0,r.kt)("td",{parentName:"tr",align:null},"A list of events that describe the membership changes, in their encoded protobuf form")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"3"),(0,r.kt)("td",{parentName:"tr",align:null},"message"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"ChatMessage")),(0,r.kt)("td",{parentName:"tr",align:null},"An optional message, described in ",(0,r.kt)("a",{parentName:"td",href:"/status/deprecated/payloads#message"},"Message"))))),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"MembershipUpdateEvent"),":"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Field"),(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"1"),(0,r.kt)("td",{parentName:"tr",align:null},"clock"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"uint64")),(0,r.kt)("td",{parentName:"tr",align:null},"The clock value of the event")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"2"),(0,r.kt)("td",{parentName:"tr",align:null},"members"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"[]string")),(0,r.kt)("td",{parentName:"tr",align:null},"An optional list of hex encoded (prefixed with ",(0,r.kt)("inlineCode",{parentName:"td"},"0x"),") public keys, the targets of the action")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"3"),(0,r.kt)("td",{parentName:"tr",align:null},"name"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"name")),(0,r.kt)("td",{parentName:"tr",align:null},"An optional name, for those events that make use of it")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"4"),(0,r.kt)("td",{parentName:"tr",align:null},"type"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"EventType")),(0,r.kt)("td",{parentName:"tr",align:null},"The type of event sent, described below")))),(0,r.kt)("h3",{id:"chat-id"},"Chat ID"),(0,r.kt)("p",null,"Each membership update MUST be sent with a corresponding ",(0,r.kt)("inlineCode",{parentName:"p"},"chatId"),".\nThe format of this chat ID MUST be a string of ",(0,r.kt)("a",{parentName:"p",href:"https://tools.ietf.org/html/rfc4122"},"UUID"),",\nconcatenated with the hex-encoded public key of the creator of the chat, joined by ",(0,r.kt)("inlineCode",{parentName:"p"},"-"),".\nThis chatId MUST be validated by all clients, and MUST be discarded if it does not follow these rules."),(0,r.kt)("h3",{id:"signature"},"Signature"),(0,r.kt)("p",null,"The node calculates the signature for each event by encoding each ",(0,r.kt)("inlineCode",{parentName:"p"},"MembershipUpdateEvent")," in its protobuf representation\nand prepending the bytes of the chatID, lastly the node signs the ",(0,r.kt)("inlineCode",{parentName:"p"},"Keccak256")," of the bytes\nusing the private key by the author and added to the ",(0,r.kt)("inlineCode",{parentName:"p"},"events")," field of MembershipUpdateMessage."),(0,r.kt)("h3",{id:"group-membership-event"},"Group membership event"),(0,r.kt)("p",null,"Any ",(0,r.kt)("inlineCode",{parentName:"p"},"group membership")," event received MUST be verified by calculating the signature as per the method described above.\nThe author MUST be extracted from it, if the verification fails the event MUST be discarded."),(0,r.kt)("h4",{id:"chat_created"},"CHAT_CREATED"),(0,r.kt)("p",null,"Chat ",(0,r.kt)("inlineCode",{parentName:"p"},"created event")," is the first event that needs to be sent.\nAny event with a clock value lower than this MUST be discarded.\nUpon receiving this event a client MUST validate the ",(0,r.kt)("inlineCode",{parentName:"p"},"chatId"),"\nprovided with the updates and create a chat with identified by ",(0,r.kt)("inlineCode",{parentName:"p"},"chatId")," and named ",(0,r.kt)("inlineCode",{parentName:"p"},"name"),"."),(0,r.kt)("h4",{id:"name_changed"},"NAME_CHANGED"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"admins")," use a ",(0,r.kt)("inlineCode",{parentName:"p"},"name changed")," event to change the name of the group chat.\nUpon receiving this event a client MUST validate the ",(0,r.kt)("inlineCode",{parentName:"p"},"chatId")," provided with the updates\nand MUST ensure the author of the event is an admin of the chat, otherwise the event MUST be ignored.\nIf the event is valid the chat name SHOULD be changed to ",(0,r.kt)("inlineCode",{parentName:"p"},"name"),"."),(0,r.kt)("h4",{id:"members_added"},"MEMBERS_ADDED"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"admins")," use a ",(0,r.kt)("inlineCode",{parentName:"p"},"members added")," event to add members to the chat.\nUpon receiving this event a client MUST validate the ",(0,r.kt)("inlineCode",{parentName:"p"},"chatId"),"\nprovided with the updates and MUST ensure the author of the event is an admin of the chat, otherwise the event MUST be ignored.\nIf the event is valid a client MUST update the list of members of the chat who have not joined, adding the ",(0,r.kt)("inlineCode",{parentName:"p"},"members")," received.\n",(0,r.kt)("inlineCode",{parentName:"p"},"members")," is an array of hex encoded public keys."),(0,r.kt)("h4",{id:"member_joined"},"MEMBER_JOINED"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"members")," use a ",(0,r.kt)("inlineCode",{parentName:"p"},"members joined")," event to signal that they want to start receiving messages from this chat.\nUpon receiving this event a client MUST validate the ",(0,r.kt)("inlineCode",{parentName:"p"},"chatId")," provided with the updates.\nIf the event is valid a client MUST update the list of members of the chat who joined, adding the signer.\nAny ",(0,r.kt)("inlineCode",{parentName:"p"},"message")," sent to the group chat should now include the newly joined member."),(0,r.kt)("h4",{id:"admins_added"},"ADMINS_ADDED"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"admins")," use an ",(0,r.kt)("inlineCode",{parentName:"p"},"admins added")," event to add make other admins in the chat.\nUpon receiving this event a client MUST validate the ",(0,r.kt)("inlineCode",{parentName:"p"},"chatId")," provided with the updates,\nMUST ensure the author of the event is an admin of the chat\nand MUST ensure all ",(0,r.kt)("inlineCode",{parentName:"p"},"members")," are already ",(0,r.kt)("inlineCode",{parentName:"p"},"members")," of the chat, otherwise the event MUST be ignored.\nIf the event is valid a client MUST update the list of admins of the chat, adding the ",(0,r.kt)("inlineCode",{parentName:"p"},"members")," received.\n",(0,r.kt)("inlineCode",{parentName:"p"},"members")," is an array of hex encoded public keys."),(0,r.kt)("h4",{id:"member_removed"},"MEMBER_REMOVED"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"members")," and/or ",(0,r.kt)("inlineCode",{parentName:"p"},"admins")," use a ",(0,r.kt)("inlineCode",{parentName:"p"},"member-removed")," event to leave or kick members of the chat.\nUpon receiving this event a client MUST validate the ",(0,r.kt)("inlineCode",{parentName:"p"},"chatId")," provided with the updates, MUST ensure that:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"If the author of the event is an admin, target can only be themselves or a non-admin member."),(0,r.kt)("li",{parentName:"ul"},"If the author of the event is not an admin, the target of the event can only be themselves.")),(0,r.kt)("p",null,"If the event is valid a client MUST remove the member from the list of ",(0,r.kt)("inlineCode",{parentName:"p"},"members"),"/",(0,r.kt)("inlineCode",{parentName:"p"},"admins")," of the chat,\nand no further message should be sent to them."),(0,r.kt)("h4",{id:"admin_removed"},"ADMIN_REMOVED"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"Admins")," use an ",(0,r.kt)("inlineCode",{parentName:"p"},"admin-removed")," event to drop admin privileges.\nUpon receiving this event a client MUST validate the ",(0,r.kt)("inlineCode",{parentName:"p"},"chatId")," provided with the updates,\nMUST ensure that the author of the event is also the target of the event."),(0,r.kt)("p",null,"If the event is valid a client MUST remove the member from the list of ",(0,r.kt)("inlineCode",{parentName:"p"},"admins")," of the chat."),(0,r.kt)("h2",{id:"copyright"},"Copyright"),(0,r.kt)("p",null,"Copyright and related rights waived via ",(0,r.kt)("a",{parentName:"p",href:"https://creativecommons.org/publicdomain/zero/1.0/"},"CC0"),"."),(0,r.kt)("h2",{id:"references"},"References"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/status/deprecated/payloads"},"PAYLOADS")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://tools.ietf.org/html/rfc4122"},"UUID"))))}m.isMDXComponent=!0},3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>c});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=n.createContext({}),p=function(e){var t=n.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},s=function(e){var t=p(e.components);return n.createElement(o.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,o=e.parentName,s=d(e,["components","mdxType","originalType","parentName"]),h=p(a),c=r,u=h["".concat(o,".").concat(c)]||h[c]||m[c]||i;return a?n.createElement(u,l(l({ref:t},s),{},{components:a})):n.createElement(u,l({ref:t},s))}));function c(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,l=new Array(i);l[0]=h;var d={};for(var o in t)hasOwnProperty.call(t,o)&&(d[o]=t[o]);d.originalType=e,d.mdxType="string"==typeof e?e:r,l[1]=d;for(var p=2;p{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>p,frontMatter:()=>l,metadata:()=>u,toc:()=>s});var n=a(87462),r=(a(67294),a(3905));const l={title:"STATUS-URL-SCHEME",name:"Status URL Scheme",status:"raw",category:"Standards Track",editor:"Felicio Mununga <felicio@status.im>",contributors:null},i=void 0,u={unversionedId:"raw/url-scheme",id:"raw/url-scheme",title:"STATUS-URL-SCHEME",description:"- Status: raw",source:"@site/status/raw/url-scheme.md",sourceDirName:"raw",slug:"/raw/url-scheme",permalink:"/status/raw/url-scheme",draft:!1,tags:[],version:"current",frontMatter:{title:"STATUS-URL-SCHEME",name:"Status URL Scheme",status:"raw",category:"Standards Track",editor:"Felicio Mununga <felicio@status.im>",contributors:null},sidebar:"defaultSidebar",previous:{title:"STATUS-URL-DATA",permalink:"/status/raw/url-data"},next:{title:"24/STATUS-CURATION",permalink:"/status/24/curation"}},o={},s=[{value:"Abstract",id:"abstract",level:2},{value:"Background / Rationale / Motivation",id:"background--rationale--motivation",level:2},{value:"Requirements",id:"requirements",level:3},{value:"Related scope",id:"related-scope",level:4},{value:"Features",id:"features",level:5},{value:"Wire Format Specification / Syntax",id:"wire-format-specification--syntax",level:2},{value:"Schemes",id:"schemes",level:3},{value:"Paths",id:"paths",level:3},{value:"Discussions",id:"discussions",level:2},{value:"Copyright",id:"copyright",level:2},{value:"References",id:"references",level:2}],c={toc:s};function p(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Status: raw"),(0,r.kt)("li",{parentName:"ul"},"Category: Standards Track"),(0,r.kt)("li",{parentName:"ul"},"Editor: Felicio Mununga ","<",(0,r.kt)("a",{parentName:"li",href:"mailto:felicio@status.im"},"felicio@status.im"),">")),(0,r.kt)("h2",{id:"abstract"},"Abstract"),(0,r.kt)("p",null,"This document describes URL scheme for previewing and\ndeep linking content as well as for triggering actions."),(0,r.kt)("h2",{id:"background--rationale--motivation"},"Background / Rationale / Motivation"),(0,r.kt)("h3",{id:"requirements"},"Requirements"),(0,r.kt)("h4",{id:"related-scope"},"Related scope"),(0,r.kt)("h5",{id:"features"},"Features"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Onboarding website"),(0,r.kt)("li",{parentName:"ul"},"Link preview"),(0,r.kt)("li",{parentName:"ul"},"Link sharing"),(0,r.kt)("li",{parentName:"ul"},"Deep linking"),(0,r.kt)("li",{parentName:"ul"},"Routing and navigation"),(0,r.kt)("li",{parentName:"ul"},"Payment requests"),(0,r.kt)("li",{parentName:"ul"},"Chat creation")),(0,r.kt)("h2",{id:"wire-format-specification--syntax"},"Wire Format Specification / Syntax"),(0,r.kt)("h3",{id:"schemes"},"Schemes"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Internal ",(0,r.kt)("inlineCode",{parentName:"li"},"status-app://")),(0,r.kt)("li",{parentName:"ul"},"External ",(0,r.kt)("inlineCode",{parentName:"li"},"https://")," (i.e. univers/deep links)")),(0,r.kt)("h3",{id:"paths"},"Paths"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Url"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"User profile"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/u/#")),(0,r.kt)("td",{parentName:"tr",align:null},"Preview/Open user profile")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/u#")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/u#")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Community"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/c/#")),(0,r.kt)("td",{parentName:"tr",align:null},"Preview/Open community")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/c#")),(0,r.kt)("td",{parentName:"tr",align:null})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Community channel"),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/cc/#")),(0,r.kt)("td",{parentName:"tr",align:null},"Preview/Open community channel")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null}),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"/cc/#")),(0,r.kt)("td",{parentName:"tr",align:null})))),(0,r.kt)("h2",{id:"discussions"},"Discussions"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"See ","<",(0,r.kt)("a",{parentName:"li",href:"https://github.com/status-im/specs/pull/159"},"https://github.com/status-im/specs/pull/159"),">"),(0,r.kt)("li",{parentName:"ul"},"See ","<",(0,r.kt)("a",{parentName:"li",href:"https://github.com/status-im/status-web/issues/327"},"https://github.com/status-im/status-web/issues/327"),">")),(0,r.kt)("h2",{id:"copyright"},"Copyright"),(0,r.kt)("p",null,"Copyright and related rights waived via ",(0,r.kt)("a",{parentName:"p",href:"https://creativecommons.org/publicdomain/zero/1.0/"},"CC0"),"."),(0,r.kt)("h2",{id:"references"},"References"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"./url-data"},"STATUS-URL-DATA"))))}p.isMDXComponent=!0},3905:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>d});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=n.createContext({}),s=function(e){var t=n.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=s(e.components);return n.createElement(o.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,o=e.parentName,c=u(e,["components","mdxType","originalType","parentName"]),m=s(a),d=r,k=m["".concat(o,".").concat(d)]||m[d]||p[d]||l;return a?n.createElement(k,i(i({ref:t},c),{},{components:a})):n.createElement(k,i({ref:t},c))}));function d(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=m;var u={};for(var o in t)hasOwnProperty.call(t,o)&&(u[o]=t[o]);u.originalType=e,u.mdxType="string"==typeof e?e:r,i[1]=u;for(var s=2;s{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var n=a(87462),i=(a(67294),a(3905));const o={title:"55/STATUS-1TO1-CHAT",name:"Status 1-to-1 Chat",status:"draft",category:"Standards Track",description:"A chat protocol to send public and private messages to a single recipient by the Status app.",editor:"Aaryamann Challani <p1ge0nh8er@proton.me>",contributors:["Andrea Piana <andreap@status.im>","Pedro Pombeiro <pedro@status.im>","Corey Petty <corey@status.im>","Oskar Thor\xe9n <oskarth@titanproxy.com>","Dean Eigenmann <dean@status.im>"]},r=void 0,s={unversionedId:"55/1to1-chat",id:"55/1to1-chat",title:"55/STATUS-1TO1-CHAT",description:"A chat protocol to send public and private messages to a single recipient by the Status app.",source:"@site/status/55/1to1-chat.md",sourceDirName:"55",slug:"/55/1to1-chat",permalink:"/status/55/1to1-chat",draft:!1,tags:[],version:"current",frontMatter:{title:"55/STATUS-1TO1-CHAT",name:"Status 1-to-1 Chat",status:"draft",category:"Standards Track",description:"A chat protocol to send public and private messages to a single recipient by the Status app.",editor:"Aaryamann Challani <p1ge0nh8er@proton.me>",contributors:["Andrea Piana <andreap@status.im>","Pedro Pombeiro <pedro@status.im>","Corey Petty <corey@status.im>","Oskar Thor\xe9n <oskarth@titanproxy.com>","Dean Eigenmann <dean@status.im>"]},sidebar:"defaultSidebar",previous:{title:"28/STATUS-FEATURING",permalink:"/status/28/featuring"},next:{title:"56/STATUS-COMMUNITIES",permalink:"/status/56/communities"}},l={},p=[{value:"Abstract",id:"abstract",level:2},{value:"Terminology",id:"terminology",level:2},{value:"Background",id:"background",level:2},{value:"Specification",id:"specification",level:2},{value:"Overview",id:"overview",level:3},{value:"Chat Flow",id:"chat-flow",level:2},{value:"Negotiation of a 1:1 chat",id:"negotiation-of-a-11-chat",level:3},{value:"Post Negotiation",id:"post-negotiation",level:3},{value:"Session management",id:"session-management",level:3},{value:"Negotiation of a 1:1 chat amongst multiple participants (group chat)",id:"negotiation-of-a-11-chat-amongst-multiple-participants-group-chat",level:2},{value:"Flow",id:"flow",level:3},{value:"Membership Update Flow",id:"membership-update-flow",level:4},{value:"Chat Created",id:"chat-created",level:5},{value:"Name Changed",id:"name-changed",level:5},{value:"Members Added",id:"members-added",level:5},{value:"Member Joined",id:"member-joined",level:5},{value:"Member Removed",id:"member-removed",level:5},{value:"Admins Added",id:"admins-added",level:5},{value:"Admin Removed",id:"admin-removed",level:5},{value:"Color Changed",id:"color-changed",level:5},{value:"Image Changed",id:"image-changed",level:5},{value:"Security Considerations",id:"security-considerations",level:2},{value:"Copyright",id:"copyright",level:2},{value:"References",id:"references",level:2}],d={toc:p};function h(e){let{components:t,...a}=e;return(0,i.kt)("wrapper",(0,n.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Status: draft"),(0,i.kt)("li",{parentName:"ul"},"Category: Standards Track"),(0,i.kt)("li",{parentName:"ul"},"Editor: Aaryamann Challani ","<",(0,i.kt)("a",{parentName:"li",href:"mailto:p1ge0nh8er@proton.me"},"p1ge0nh8er@proton.me"),">"),(0,i.kt)("li",{parentName:"ul"},"Contributors:",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Andrea Piana ","<",(0,i.kt)("a",{parentName:"li",href:"mailto:andreap@status.im"},"andreap@status.im"),">"),(0,i.kt)("li",{parentName:"ul"},"Pedro Pombeiro ","<",(0,i.kt)("a",{parentName:"li",href:"mailto:pedro@status.im"},"pedro@status.im"),">"),(0,i.kt)("li",{parentName:"ul"},"Corey Petty ","<",(0,i.kt)("a",{parentName:"li",href:"mailto:corey@status.im"},"corey@status.im"),">"),(0,i.kt)("li",{parentName:"ul"},"Oskar Thor\xe9n ","<",(0,i.kt)("a",{parentName:"li",href:"mailto:oskarth@titanproxy.com"},"oskarth@titanproxy.com"),">"),(0,i.kt)("li",{parentName:"ul"},"Dean Eigenmann ","<",(0,i.kt)("a",{parentName:"li",href:"mailto:dean@status.im"},"dean@status.im"),">")))),(0,i.kt)("h2",{id:"abstract"},"Abstract"),(0,i.kt)("p",null,"This specification describes how the Status 1-to-1 chat protocol is implemented\non top of the Waku v2 protocol.\nThis protocol can be used to send messages to a single recipient."),(0,i.kt)("h2",{id:"terminology"},"Terminology"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Participant"),": A participant is a user that is able to send and receive messages."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"1-to-1 chat"),": A chat between two participants."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Public chat"),": A chat where any participant can join and read messages."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Private chat"),": A chat where only invited participants can join and read messages."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Group chat"),": A chat where multiple select participants can join and read messages."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Group admin"),": A participant that is able to\nadd/remove participants from a group chat.")),(0,i.kt)("h2",{id:"background"},"Background"),(0,i.kt)("p",null,"This document describes how 2 peers communicate with each other\nto send messages in a 1-to-1 chat, with privacy and authenticity guarantees."),(0,i.kt)("h2",{id:"specification"},"Specification"),(0,i.kt)("h3",{id:"overview"},"Overview"),(0,i.kt)("p",null,"This protocol MAY use any key-exchange mechanism previously discussed -"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"../../waku/standards/application/53/x3dh"},"53/WAKU2-X3DH")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/waku-org/specs/blob/master/standards/application/noise.md"},"WAKU2-NOISE"))),(0,i.kt)("p",null,"This protocol can provide end-to-end encryption\nto give peers a strong degree of privacy and security.\nPublic chat messages are publicly readable by anyone since\nthere's no permission model for who is participating in a public chat."),(0,i.kt)("h2",{id:"chat-flow"},"Chat Flow"),(0,i.kt)("h3",{id:"negotiation-of-a-11-chat"},"Negotiation of a 1:1 chat"),(0,i.kt)("p",null,"There are two phases in the initial negotiation of a 1:1 chat:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("strong",{parentName:"li"},"Identity verification"),"\n(e.g., face-to-face contact exchange through QR code, Identicon matching).\nA QR code serves two purposes simultaneously -\nidentity verification and initial key material retrieval;"),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("strong",{parentName:"li"},"Asynchronous initial key exchange"))),(0,i.kt)("p",null,"For more information on account generation and trust establishment, see ",(0,i.kt)("a",{parentName:"p",href:"../65/account-address"},"65/ACCOUNT-ADDRESS")),(0,i.kt)("h3",{id:"post-negotiation"},"Post Negotiation"),(0,i.kt)("p",null,"After the peers have shared their public key material,\na 1:1 chat can be established using the methods described in the\nkey-exchange protocols mentioned above."),(0,i.kt)("h3",{id:"session-management"},"Session management"),(0,i.kt)("p",null,"The 1:1 chat is made robust by having sessions between peers.\nIt is handled by the key-exchange protocol used. For example,"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("a",{parentName:"p",href:"../../waku/standards/application/53/x3dh"},"53/WAKU2-X3DH"),",\nthe session management is described in ",(0,i.kt)("a",{parentName:"p",href:"../../waku/standards/application/54/x3dh-sessions"},"54/WAKU2-X3DH-SESSIONS"))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("a",{parentName:"p",href:"https://github.com/waku-org/specs/blob/master/standards/application/noise.md"},"WAKU2-NOISE"),",\nthe session management is described in ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/waku-org/specs/blob/master/standards/application/noise-sessions.md"},"WAKU2-NOISE-SESSIONS")))),(0,i.kt)("h2",{id:"negotiation-of-a-11-chat-amongst-multiple-participants-group-chat"},"Negotiation of a 1:1 chat amongst multiple participants (group chat)"),(0,i.kt)("p",null,"A small, private group chat can be constructed by having multiple participants\nnegotiate a 1:1 chat amongst each other.\nEach participant MUST\nmaintain a session with all other participants in the group chat.\nThis allows for a group chat to be created with a small number of participants."),(0,i.kt)("p",null,"However, this method does not scale as the number of participants increases,\nfor the following reasons -"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"The number of messages sent over the network increases with the number of participants."),(0,i.kt)("li",{parentName:"ol"},"Handling the X3DH key exchange for each participant is computationally expensive.")),(0,i.kt)("p",null,"The above issues are addressed in ",(0,i.kt)("a",{parentName:"p",href:"../56/communities"},"56/STATUS-COMMUNITIES"),",\nwith other trade-offs."),(0,i.kt)("h3",{id:"flow"},"Flow"),(0,i.kt)("p",null,"The following flow describes how a group chat is created and maintained."),(0,i.kt)("h4",{id:"membership-update-flow"},"Membership Update Flow"),(0,i.kt)("p",null,"Membership updates have the following wire format:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-protobuf"},'message MembershipUpdateMessage {\n // The chat id of the private group chat\n // derived in the following way:\n // chat_id = hex(chat_creator_public_key) + "-" + random_uuid\n // This chat_id MUST be validated by all participants\n string chat_id = 1;\n // A list of events for this group chat, first 65 bytes are the signature, \n then is a \n // protobuf encoded MembershipUpdateEvent\n repeated bytes events = 2;\n oneof chat_entity {\n // An optional chat message\n ChatMessage message = 3;\n // An optional reaction to a message\n EmojiReaction emoji_reaction = 4; \n }\n}\n')),(0,i.kt)("p",null,"Note that in ",(0,i.kt)("inlineCode",{parentName:"p"},"events"),", the first element is the signature, and\nall other elements after are encoded ",(0,i.kt)("inlineCode",{parentName:"p"},"MembershipUpdateEvent"),"'s."),(0,i.kt)("p",null,"where ",(0,i.kt)("inlineCode",{parentName:"p"},"MembershipUpdateEvent")," is defined as follows:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-protobuf"},"message MembershipUpdateEvent {\n // Lamport timestamp of the event\n uint64 clock = 1;\n // Optional list of public keys of the targets of the action\n repeated string members = 2;\n // Name of the chat for the CHAT_CREATED/NAME_CHANGED event types\n string name = 3;\n // The type of the event\n EventType type = 4;\n // Color of the chat for the CHAT_CREATED/COLOR_CHANGED event types\n string color = 5;\n // Chat image\n bytes image = 6;\n\n enum EventType {\n UNKNOWN = 0;\n CHAT_CREATED = 1; // See [CHAT_CREATED](#chat-created)\n NAME_CHANGED = 2; // See [NAME_CHANGED](#name-changed)\n MEMBERS_ADDED = 3; // See [MEMBERS_ADDED](#members-added)\n MEMBER_JOINED = 4; // See [MEMBER_JOINED](#member-joined)\n MEMBER_REMOVED = 5; // See [MEMBER_REMOVED](#member-removed)\n ADMINS_ADDED = 6; // See [ADMINS_ADDED](#admins-added)\n ADMIN_REMOVED = 7; // See [ADMIN_REMOVED](#admin-removed)\n COLOR_CHANGED = 8; // See [COLOR_CHANGED](#color-changed)\n IMAGE_CHANGED = 9; // See [IMAGE_CHANGED](#image-changed)\n }\n}\n")),(0,i.kt)("p",null,"Note that the definitions for ",(0,i.kt)("inlineCode",{parentName:"p"},"ChatMessage")," and\n",(0,i.kt)("inlineCode",{parentName:"p"},"EmojiReaction")," can be found in\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/status-im/status-go/blob/5fd9e93e9c298ed087e6716d857a3951dbfb3c1e/protocol/protobuf/chat_message.proto#L1"},"chat_message.proto"),"\nand ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/status-im/status-go/blob/5fd9e93e9c298ed087e6716d857a3951dbfb3c1e/protocol/protobuf/emoji_reaction.proto"},"emoji_reaction.proto"),"."),(0,i.kt)("h5",{id:"chat-created"},"Chat Created"),(0,i.kt)("p",null,"When creating a group chat, this is the first event that MUST be sent.\nAny event with a clock value lower than this MUST be discarded.\nUpon receiving this event a client MUST validate the ",(0,i.kt)("inlineCode",{parentName:"p"},"chat_id"),"\nprovided with the update and\ncreate a chat with identified by ",(0,i.kt)("inlineCode",{parentName:"p"},"chat_id"),"."),(0,i.kt)("p",null,"By default, the creator of the group chat is the only group admin."),(0,i.kt)("h5",{id:"name-changed"},"Name Changed"),(0,i.kt)("p",null,"To change the name of the group chat, group admins MUST use a ",(0,i.kt)("inlineCode",{parentName:"p"},"NAME_CHANGED")," event.\nUpon receiving this event,\na client MUST validate the ",(0,i.kt)("inlineCode",{parentName:"p"},"chat_id")," provided with the updates and\nMUST ensure the author of the event is an admin of the chat,\notherwise the event MUST be ignored.\nIf the event is valid the chat name SHOULD be changed according to the provided message."),(0,i.kt)("h5",{id:"members-added"},"Members Added"),(0,i.kt)("p",null,"To add members to the chat, group admins MUST use a ",(0,i.kt)("inlineCode",{parentName:"p"},"MEMBERS_ADDED")," event.\nUpon receiving this event,\na participant MUST validate the ",(0,i.kt)("inlineCode",{parentName:"p"},"chat_id")," provided with the updates and\nMUST ensure the author of the event is an admin of the chat,\notherwise the event MUST be ignored.\nIf the event is valid,\na participant MUST update the list of members of the chat who have not joined,\nadding the members received."),(0,i.kt)("h5",{id:"member-joined"},"Member Joined"),(0,i.kt)("p",null,"To signal the intent to start receiving messages from a given chat,\nnew participants MUST use a ",(0,i.kt)("inlineCode",{parentName:"p"},"MEMBER_JOINED")," event.\nUpon receiving this event,\na participant MUST validate the ",(0,i.kt)("inlineCode",{parentName:"p"},"chat_id")," provided with the updates.\nIf the event is valid a participant,\na participant MUST add the new participant to the list of participants stored locally.\nAny message sent to the group chat MUST now include the new participant."),(0,i.kt)("h5",{id:"member-removed"},"Member Removed"),(0,i.kt)("p",null,"There are two ways in which a member MAY be removed from a group chat:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"A member MAY leave the chat by sending a ",(0,i.kt)("inlineCode",{parentName:"li"},"MEMBER_REMOVED")," event,\nwith the ",(0,i.kt)("inlineCode",{parentName:"li"},"members")," field containing their own public key."),(0,i.kt)("li",{parentName:"ul"},"An admin MAY remove a member by sending a ",(0,i.kt)("inlineCode",{parentName:"li"},"MEMBER_REMOVED")," event,\nwith the ",(0,i.kt)("inlineCode",{parentName:"li"},"members")," field containing the public key of the member to be removed.")),(0,i.kt)("p",null,"Each participant MUST validate the ",(0,i.kt)("inlineCode",{parentName:"p"},"chat_id")," provided with the updates and\nMUST ensure the author of the event is an admin of the chat,\notherwise the event MUST be ignored.\nIf the event is valid, a participant MUST update the local list of members accordingly."),(0,i.kt)("h5",{id:"admins-added"},"Admins Added"),(0,i.kt)("p",null,"To promote participants to group admin, group admins MUST use an ",(0,i.kt)("inlineCode",{parentName:"p"},"ADMINS_ADDED")," event.\nUpon receiving this event,\na participant MUST validate the ",(0,i.kt)("inlineCode",{parentName:"p"},"chat_id")," provided with the updates,\nMUST ensure the author of the event is an admin of the chat,\notherwise the event MUST be ignored.\nIf the event is valid,\na participant MUST update the list of admins of the chat accordingly."),(0,i.kt)("h5",{id:"admin-removed"},"Admin Removed"),(0,i.kt)("p",null,"Group admins MUST NOT be able to remove other group admins.\nAn admin MAY remove themselves by sending an ",(0,i.kt)("inlineCode",{parentName:"p"},"ADMIN_REMOVED")," event,\nwith the ",(0,i.kt)("inlineCode",{parentName:"p"},"members")," field containing their own public key.\nEach participant MUST validate the ",(0,i.kt)("inlineCode",{parentName:"p"},"chat_id")," provided with the updates and\nMUST ensure the author of the event is an admin of the chat,\notherwise the event MUST be ignored.\nIf the event is valid, a participant MUST update the list of admins of the chat accordingly."),(0,i.kt)("h5",{id:"color-changed"},"Color Changed"),(0,i.kt)("p",null,"To change the text color of the group chat name,\ngroup admins MUST use a ",(0,i.kt)("inlineCode",{parentName:"p"},"COLOR_CHANGED")," event."),(0,i.kt)("h5",{id:"image-changed"},"Image Changed"),(0,i.kt)("p",null,"To change the display image of the group chat,\ngroup admins MUST use an ",(0,i.kt)("inlineCode",{parentName:"p"},"IMAGE_CHANGED")," event."),(0,i.kt)("h2",{id:"security-considerations"},"Security Considerations"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Inherits the security considerations of the key-exchange mechanism used,\ne.g., ",(0,i.kt)("a",{parentName:"li",href:"../../waku/standards/application/53/x3dh"},"53/WAKU2-X3DH")," or ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/waku-org/specs/blob/master/standards/application/noise.md"},"WAKU2-NOISE"))),(0,i.kt)("h2",{id:"copyright"},"Copyright"),(0,i.kt)("p",null,"Copyright and related rights waived via ",(0,i.kt)("a",{parentName:"p",href:"https://creativecommons.org/publicdomain/zero/1.0/"},"CC0"),"."),(0,i.kt)("h2",{id:"references"},"References"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"../../waku/standards/application/53/x3dh"},"53/WAKU2-X3DH")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/waku-org/specs/blob/master/standards/application/noise.md"},"WAKU2-NOISE")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"../65/account-address"},"65/STATUS-ACCOUNT")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"../../waku/standards/application/54/x3dh-sessions"},"54/WAKU2-X3DH-SESSIONS")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/waku-org/specs/blob/master/standards/application/noise-sessions.md"},"WAKU2-NOISE-SESSIONS")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"../56/communities"},"56/STATUS-COMMUNITIES")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/status-im/status-go/blob/5fd9e93e9c298ed087e6716d857a3951dbfb3c1e/protocol/protobuf/chat_message.proto#L1"},"chat_message.proto")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/status-im/status-go/blob/5fd9e93e9c298ed087e6716d857a3951dbfb3c1e/protocol/protobuf/emoji_reaction.proto"},"emoji_reaction.proto"))))}h.isMDXComponent=!0},3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>m});var n=a(67294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function r(e){for(var t=1;t=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var l=n.createContext({}),p=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},d=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},h={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,i=e.mdxType,o=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),c=p(a),m=i,u=c["".concat(l,".").concat(m)]||c[m]||h[m]||o;return a?n.createElement(u,r(r({ref:t},d),{},{components:a})):n.createElement(u,r({ref:t},d))}));function m(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=a.length,r=new Array(o);r[0]=c;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:i,r[1]=s;for(var p=2;p{"use strict";e.N=void 0;var n=/^([^\w]*)(javascript|data|vbscript)/im,i=/&#(\w+)(^\w|;)?/g,r=/&(newline|tab);/gi,a=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,s=/^.+(:|:)/gim,o=[".","/"];e.N=function(t){var e,l=(e=t||"",e.replace(i,(function(t,e){return String.fromCharCode(e)}))).replace(r,"").replace(a,"").trim();if(!l)return"about:blank";if(function(t){return o.indexOf(t[0])>-1}(l))return l;var c=l.match(s);if(!c)return l;var h=c[0];return n.test(h)?"about:blank":l}},11679:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.useMDXEnhancementElements=e.MDXEnhancementContext=void 0;const i=n(70655).__importStar(n(67294));e.MDXEnhancementContext=i.default.createContext({items:[]});e.useMDXEnhancementElements=(t,n,r)=>{const a=(0,i.useContext)(e.MDXEnhancementContext);return a?(0,i.useMemo)((()=>a.items.filter((e=>e.component===t&&e.position===n)).map((t=>t.render(r)))),[t,n,r]):[]}},60578:(t,e,n)=>{"use strict";const i=n(70655),r=n(31665),a=n(93945),s=i.__importDefault(n(11614)),o=i.__importDefault(n(86010)),l=i.__importDefault(n(67294)),c=i.__importDefault(n(21375));const h={note:{infimaClassName:"secondary",iconComponent:function(){return l.default.createElement("svg",{width:"16",height:"16",viewBox:"0 0 16 16",xmlns:"http://www.w3.org/2000/svg"},l.default.createElement("path",{d:"M8.00004 11.3333C8.18893 11.3333 8.34737 11.2693 8.47537 11.1413C8.60337 11.0133 8.66715 10.8551 8.66671 10.6667C8.66671 10.4778 8.60271 10.3193 8.47471 10.1913C8.34671 10.0633 8.18849 9.99957 8.00004 10C7.81115 10 7.65271 10.064 7.52471 10.192C7.39671 10.32 7.33293 10.4782 7.33337 10.6667C7.33337 10.8556 7.39737 11.014 7.52537 11.142C7.65337 11.27 7.8116 11.3338 8.00004 11.3333ZM7.33337 8.66668H8.66671V4.66668H7.33337V8.66668ZM8.00004 14.6667C7.07782 14.6667 6.21115 14.4916 5.40004 14.1413C4.58893 13.7911 3.88337 13.3162 3.28337 12.7167C2.68337 12.1167 2.20849 11.4111 1.85871 10.6C1.50893 9.7889 1.33382 8.92223 1.33337 8.00001C1.33337 7.07779 1.50849 6.21112 1.85871 5.40001C2.20893 4.5889 2.68382 3.88334 3.28337 3.28334C3.88337 2.68334 4.58893 2.20845 5.40004 1.85868C6.21115 1.5089 7.07782 1.33379 8.00004 1.33334C8.92226 1.33334 9.78893 1.50845 10.6 1.85868C11.4112 2.2089 12.1167 2.68379 12.7167 3.28334C13.3167 3.88334 13.7918 4.5889 14.142 5.40001C14.4923 6.21112 14.6672 7.07779 14.6667 8.00001C14.6667 8.92223 14.4916 9.7889 14.1414 10.6C13.7912 11.4111 13.3163 12.1167 12.7167 12.7167C12.1167 13.3167 11.4112 13.7918 10.6 14.142C9.78893 14.4922 8.92226 14.6671 8.00004 14.6667ZM8.00004 13.3333C9.48893 13.3333 10.75 12.8167 11.7834 11.7833C12.8167 10.75 13.3334 9.4889 13.3334 8.00001C13.3334 6.51112 12.8167 5.25001 11.7834 4.21668C10.75 3.18334 9.48893 2.66668 8.00004 2.66668C6.51115 2.66668 5.25004 3.18334 4.21671 4.21668C3.18337 5.25001 2.66671 6.51112 2.66671 8.00001C2.66671 9.4889 3.18337 10.75 4.21671 11.7833C5.25004 12.8167 6.51115 13.3333 8.00004 13.3333Z",fill:"currentColor"}))},label:l.default.createElement(s.default,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)"},"note")},tip:{infimaClassName:"success",iconComponent:function(){return l.default.createElement("svg",{width:"16",height:"16",viewBox:"0 0 16 16",xmlns:"http://www.w3.org/2000/svg"},l.default.createElement("path",{d:"M8 14.6666C7.63333 14.6666 7.31933 14.536 7.058 14.2746C6.79667 14.0133 6.66622 13.6995 6.66667 13.3333H9.33333C9.33333 13.7 9.20267 14.014 8.94133 14.2753C8.68 14.5366 8.36622 14.6671 8 14.6666ZM5.33333 12.6666V11.3333H10.6667V12.6666H5.33333ZM5.5 10.6666C4.73333 10.2111 4.12489 9.59998 3.67467 8.83331C3.22445 8.06665 2.99956 7.23331 3 6.33331C3 4.94442 3.48622 3.76376 4.45867 2.79131C5.43111 1.81887 6.61156 1.33287 8 1.33331C9.38889 1.33331 10.5696 1.81954 11.542 2.79198C12.5144 3.76442 13.0004 4.94487 13 6.33331C13 7.23331 12.7751 8.06665 12.3253 8.83331C11.8756 9.59998 11.2671 10.2111 10.5 10.6666H5.5ZM5.9 9.33331H10.1C10.6 8.97776 10.9862 8.53887 11.2587 8.01665C11.5311 7.49442 11.6671 6.93331 11.6667 6.33331C11.6667 5.31109 11.3111 4.44442 10.6 3.73331C9.88889 3.0222 9.02222 2.66665 8 2.66665C6.97778 2.66665 6.11111 3.0222 5.4 3.73331C4.68889 4.44442 4.33333 5.31109 4.33333 6.33331C4.33333 6.93331 4.46956 7.49442 4.742 8.01665C5.01444 8.53887 5.40045 8.97776 5.9 9.33331Z",fill:"currentColor"}))},label:l.default.createElement(s.default,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)"},"tip")},danger:{infimaClassName:"danger",iconComponent:function(){return l.default.createElement("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg"},l.default.createElement("path",{d:"M5.5 14L2 10.5V5.5L5.5 2H10.5L14 5.5V10.5L10.5 14H5.5ZM6.1 10.8333L8 8.93333L9.9 10.8333L10.8333 9.9L8.93333 8L10.8333 6.1L9.9 5.16667L8 7.06667L6.1 5.16667L5.16667 6.1L7.06667 8L5.16667 9.9L6.1 10.8333ZM6.06667 12.6667H9.93333L12.6667 9.93333V6.06667L9.93333 3.33333H6.06667L3.33333 6.06667V9.93333L6.06667 12.6667Z",fill:"currentColor"}))},label:l.default.createElement(s.default,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)"},"danger")},info:{infimaClassName:"info",iconComponent:function(){return l.default.createElement("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg"},l.default.createElement("path",{d:"M7.33334 11.3333H8.66668V7.33331H7.33334V11.3333ZM8.00001 5.99998C8.1889 5.99998 8.34734 5.93598 8.47534 5.80798C8.60334 5.67998 8.66712 5.52176 8.66668 5.33331C8.66668 5.14442 8.60268 4.98598 8.47468 4.85798C8.34668 4.72998 8.18845 4.6662 8.00001 4.66665C7.81112 4.66665 7.65268 4.73065 7.52468 4.85865C7.39668 4.98665 7.3329 5.14487 7.33334 5.33331C7.33334 5.5222 7.39734 5.68065 7.52534 5.80865C7.65334 5.93665 7.81157 6.00042 8.00001 5.99998ZM8.00001 14.6666C7.07779 14.6666 6.21112 14.4915 5.40001 14.1413C4.5889 13.7911 3.88334 13.3162 3.28334 12.7166C2.68334 12.1166 2.20845 11.4111 1.85868 10.6C1.5089 9.78887 1.33379 8.9222 1.33334 7.99998C1.33334 7.07776 1.50845 6.21109 1.85868 5.39998C2.2089 4.58887 2.68379 3.88331 3.28334 3.28331C3.88334 2.68331 4.5889 2.20842 5.40001 1.85865C6.21112 1.50887 7.07779 1.33376 8.00001 1.33331C8.92223 1.33331 9.7889 1.50842 10.6 1.85865C11.4111 2.20887 12.1167 2.68376 12.7167 3.28331C13.3167 3.88331 13.7918 4.58887 14.142 5.39998C14.4922 6.21109 14.6671 7.07776 14.6667 7.99998C14.6667 8.9222 14.4916 9.78887 14.1413 10.6C13.7911 11.4111 13.3162 12.1166 12.7167 12.7166C12.1167 13.3166 11.4111 13.7918 10.6 14.142C9.7889 14.4922 8.92223 14.6671 8.00001 14.6666ZM8.00001 13.3333C9.4889 13.3333 10.75 12.8166 11.7833 11.7833C12.8167 10.75 13.3333 9.48887 13.3333 7.99998C13.3333 6.51109 12.8167 5.24998 11.7833 4.21665C10.75 3.18331 9.4889 2.66665 8.00001 2.66665C6.51112 2.66665 5.25001 3.18331 4.21668 4.21665C3.18334 5.24998 2.66668 6.51109 2.66668 7.99998C2.66668 9.48887 3.18334 10.75 4.21668 11.7833C5.25001 12.8166 6.51112 13.3333 8.00001 13.3333Z",fill:"currentColor"}))},label:l.default.createElement(s.default,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)"},"info")},caution:{infimaClassName:"warning",iconComponent:function(){return l.default.createElement("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg"},l.default.createElement("path",{d:"M8.00001 14.6833C7.82224 14.6833 7.65268 14.65 7.49135 14.5833C7.33001 14.5167 7.1829 14.4222 7.05001 14.3L1.70001 8.94999C1.57779 8.81666 1.48335 8.66932 1.41668 8.50799C1.35001 8.34666 1.31668 8.17732 1.31668 7.99999C1.31668 7.82221 1.35001 7.64999 1.41668 7.48332C1.48335 7.31666 1.57779 7.17221 1.70001 7.04999L7.05001 1.69999C7.18335 1.56666 7.33068 1.46932 7.49201 1.40799C7.65335 1.34666 7.82268 1.31621 8.00001 1.31666C8.17779 1.31666 8.35001 1.34732 8.51668 1.40866C8.68335 1.46999 8.82779 1.5671 8.95001 1.69999L14.3 7.04999C14.4333 7.17221 14.5307 7.31666 14.592 7.48332C14.6533 7.64999 14.6838 7.82221 14.6833 7.99999C14.6833 8.17777 14.6529 8.34732 14.592 8.50866C14.5311 8.66999 14.4338 8.8171 14.3 8.94999L8.95001 14.3C8.82779 14.4222 8.68335 14.5167 8.51668 14.5833C8.35001 14.65 8.17779 14.6833 8.00001 14.6833ZM8.00001 13.35L13.35 7.99999L8.00001 2.64999L2.65001 7.99999L8.00001 13.35ZM7.33335 8.66666H8.66668V4.66666H7.33335V8.66666ZM8.00001 10.6667C8.1889 10.6667 8.34735 10.6027 8.47535 10.4747C8.60335 10.3467 8.66713 10.1884 8.66668 9.99999C8.66668 9.8111 8.60268 9.65266 8.47468 9.52466C8.34668 9.39666 8.18846 9.33288 8.00001 9.33332C7.81113 9.33332 7.65268 9.39732 7.52468 9.52532C7.39668 9.65332 7.3329 9.81154 7.33335 9.99999C7.33335 10.1889 7.39735 10.3473 7.52535 10.4753C7.65335 10.6033 7.81157 10.6671 8.00001 10.6667Z",fill:"currentColor"}))},label:l.default.createElement(s.default,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)"},"caution")}},u={secondary:"note",important:"info",success:"tip",warning:"danger"};function d(t){const{mdxAdmonitionTitle:e,rest:n}=function(t){const e=l.default.Children.toArray(t),n=e.find((t=>{var e;return l.default.isValidElement(t)&&"mdxAdmonitionTitle"===(null==(e=t.props)?void 0:e.mdxType)})),i=l.default.createElement(l.default.Fragment,null,e.filter((t=>t!==n)));return{mdxAdmonitionTitle:n,rest:i}}(t.children);return{...t,title:t.title??e,children:n}}e.Z=function(t){const{children:e,type:n,title:i,icon:s}=d(t),p=function(t){const e=u[t]??t;return h[e]||(console.warn(`No admonition config found for admonition type "${e}". Using Info as fallback.`),h.info)}(n),f=i??p.label,{iconComponent:g}=p,y=s??l.default.createElement(g,null);return l.default.createElement("div",{className:(0,o.default)(a.ThemeClassNames.common.admonition,a.ThemeClassNames.common.admonitionType(t.type),`alert--${p.infimaClassName}`,c.default.admonition)},l.default.createElement("span",{className:c.default.admonitionIcon},y),l.default.createElement("div",null,l.default.createElement(r.Typography,{variant:"body1",className:c.default.admonitionHeading},f),l.default.createElement(r.Typography,{variant:"body1",className:c.default.admonitionContent},e)))}},79896:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});const i=n(70655),r=i.__importDefault(n(12882)),a=i.__importDefault(n(86010)),s=i.__importDefault(n(67294)),o=i.__importDefault(n(71475));e.default=function(t){return s.default.createElement(s.default.Fragment,null,s.default.createElement(r.default,{...t,className:(0,a.default)(t.className,o.default.codeBlockContainer)}))}},75962:(t,e,n)=>{"use strict";const i=n(70655),r=i.__importDefault(n(67294)),a=i.__importDefault(n(86010)),s=n(93945),o=n(18279),l=i.__importStar(n(23746)),c=i.__importDefault(n(38943)),h=i.__importDefault(n(15094)),u=i.__importDefault(n(6938)),d=i.__importDefault(n(79896)),p=i.__importDefault(n(98866)),f=n(31665);e.Z=function(t){let{children:e,className:n="",metastring:i,title:g,showLineNumbers:y,language:m}=t;const{prism:{defaultLanguage:b,magicComments:_}}=(0,s.useThemeConfig)(),x=m??(0,o.parseLanguage)(n)??b,v=(0,s.usePrismTheme)(),k=(0,o.useCodeWordWrap)(),C=(0,o.parseCodeBlockTitle)(i)||g,{lineClassNames:w,code:T}=(0,o.parseLines)(e,{metastring:i,language:x,magicComments:_}),E=y??(0,o.containsLineNumbers)(i);return r.default.createElement(d.default,{as:"div",className:(0,a.default)(n,x&&!n.includes(`language-${x}`)&&`language-${x}`)},C&&r.default.createElement("div",{className:p.default.codeBlockTitle},r.default.createElement(f.Typography,{variant:"subtitle1"},C)),r.default.createElement("div",{className:p.default.codeBlockContent},r.default.createElement(l.default,{...l.defaultProps,theme:v,code:T,language:x??"text"},(t=>{let{className:e,tokens:n,getLineProps:i,getTokenProps:s}=t;return r.default.createElement("pre",{tabIndex:0,ref:k.codeBlockRef,className:(0,a.default)(e,p.default.codeBlock,"thin-scrollbar")},r.default.createElement("code",{className:(0,a.default)(p.default.codeBlockLines,E&&p.default.codeBlockLinesWithNumbering)},n.map(((t,e)=>r.default.createElement(c.default,{key:e,line:t,getLineProps:i,getTokenProps:s,classNames:w[e],showLineNumbers:E})))))})),r.default.createElement("div",{className:p.default.buttonGroup},(k.isEnabled||k.isCodeScrollable)&&r.default.createElement(u.default,{className:p.default.codeButton,onClick:()=>k.toggle(),isEnabled:k.isEnabled}),r.default.createElement(h.default,{className:p.default.codeButton,code:T}))))}},15094:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});const i=n(70655),r=i.__importStar(n(67294)),a=i.__importDefault(n(86010)),s=i.__importDefault(n(32111)),o=n(11614),l=i.__importDefault(n(79939)),c=i.__importDefault(n(57519)),h=n(6980);e.default=function(t){let{code:e,className:n}=t;const[i,u]=(0,r.useState)(!1),d=(0,r.useRef)(void 0),p=(0,r.useCallback)((()=>{(0,s.default)(e),u(!0),d.current=window.setTimeout((()=>{u(!1)}),1e3)}),[e]);return(0,r.useEffect)((()=>()=>window.clearTimeout(d.current)),[]),r.default.createElement("button",{type:"button","aria-label":i?(0,o.translate)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,o.translate)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,o.translate)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,a.default)("clean-btn",n,c.default.copyButton,i&&c.default.copyButtonCopied),onClick:p},r.default.createElement("span",{className:c.default.copyButtonIcons,"aria-hidden":"true"},i?r.default.createElement(l.default,{className:c.default.copyButtonSuccessIcon}):r.default.createElement(h.IconCopy,{className:c.default.copyButtonIcon})))}},86687:(t,e,n)=>{"use strict";const i=n(70655),r=i.__importDefault(n(25926)),a=i.__importDefault(n(67294));e.Z=function(t){return a.default.createElement(a.default.Fragment,null,a.default.createElement(r.default,{...t}))}},78375:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BreadcrumbsBase=void 0;const i=n(70655),r=n(31665),a=i.__importDefault(n(88746)),s=n(4452),o=n(93945),l=n(18279),c=n(11614),h=i.__importDefault(n(86010)),u=i.__importDefault(n(67294)),d=i.__importDefault(n(37921));function p(t){let{children:e,href:n,isLast:i}=t;const s="breadcrumbs__link";return i?u.default.createElement(r.Typography,{variant:"body3",component:"span",className:s,itemProp:"name"},e):n?u.default.createElement(a.default,{className:s,href:n,itemProp:"item"},u.default.createElement(r.Typography,{variant:"body3",component:"span",itemProp:"name"},e)):u.default.createElement(r.Typography,{variant:"body3",component:"span",className:s},e)}function f(t){let{children:e,active:n,index:i,addMicrodata:r}=t;return u.default.createElement("li",{...r&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,h.default)("breadcrumbs__item",{"breadcrumbs__item--active":n})},e,u.default.createElement("meta",{itemProp:"position",content:String(i+1)}))}e.BreadcrumbsBase=t=>{let{homePage:e,homePageLink:n,breadcrumbs:i}=t;if(!i)return null;const s=["events"];return u.default.createElement("nav",{className:(0,h.default)(o.ThemeClassNames.docs.docBreadcrumbs,d.default.breadcrumbsContainer),"aria-label":(0,c.translate)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},u.default.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},!!e&&u.default.createElement(a.default,{to:n,className:(0,h.default)("breadcrumbs__item")},u.default.createElement(r.Typography,{variant:"body3",component:"span"},e)),i.map(((t,e)=>{const n=e===i.length-1,r=s.includes(t.label);return u.default.createElement(f,{key:e,active:n,index:e,addMicrodata:!!t.href},r?u.default.createElement(a.default,{to:`/${t.label}`},u.default.createElement(p,{href:t.href,isLast:n},t.label)):u.default.createElement(p,{href:t.href,isLast:n},t.label))}))))},e.default=function(){const t=(0,l.useSidebarBreadcrumbs)(),n=(0,l.useHomePageRoute)(),i=(0,s.useActivePlugin)();if(!t)return null;const r=null==i?void 0:i.pluginData.path;return u.default.createElement(e.BreadcrumbsBase,{homePage:n&&(0,c.translate)({id:"theme.docs.breadcrumbs.homePageLabel",message:"Home"}),breadcrumbs:t,homePageLink:r})}},81768:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});const i=n(70655),r=i.__importDefault(n(67294)),a=i.__importDefault(n(86010)),s=n(93945),o=n(18279),l=i.__importDefault(n(16927)),c=i.__importDefault(n(99276));e.default=function(t){let{children:e}=t;const n=function(){const{metadata:t,frontMatter:e,contentTitle:n}=(0,o.useDoc)();return e.hide_title||void 0!==n?null:t.title}();return r.default.createElement("div",{className:(0,a.default)(s.ThemeClassNames.docs.docMarkdown,"markdown")},n&&r.default.createElement("header",null,r.default.createElement(c.default,{as:"h1"},n)),r.default.createElement(l.default,null,e))}},72103:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.useDocTOC=void 0;const i=n(70655),r=n(93945),a=n(18279),s=i.__importDefault(n(78375)),o=i.__importDefault(n(81768)),l=i.__importDefault(n(70331)),c=i.__importDefault(n(4316)),h=i.__importDefault(n(9545)),u=i.__importDefault(n(37721)),d=i.__importDefault(n(74054)),p=i.__importDefault(n(18554)),f=i.__importDefault(n(86010)),g=i.__importDefault(n(67294)),y=n(89164),m=n(11679),b=i.__importDefault(n(22221));function _(){const{frontMatter:t,toc:e}=(0,a.useDoc)(),n=(0,r.useWindowSize)(),i=(0,y.useMedia)("(min-width: 1200px)"),s=t.hide_table_of_contents,o=!s&&e.length>0;return{hidden:s,mobile:o?g.default.createElement("div",{className:b.default.tocMobile},g.default.createElement(u.default,null)):void 0,desktop:o&&(i||"ssr"===n)?g.default.createElement(h.default,null):void 0}}e.useDocTOC=_,e.default=function(t){let{children:e}=t;const n=_();return g.default.createElement("div",{className:(0,f.default)("row",b.default.docItemGrid)},g.default.createElement("div",{className:(0,f.default)(b.default.docItemCol)},g.default.createElement(p.default,null),g.default.createElement("div",{className:b.default.docItemContainer},g.default.createElement("article",null,g.default.createElement(s.default,null),g.default.createElement(d.default,null),g.default.createElement(m.MDXEnhancementContext.Provider,{value:{items:[{component:"heading",position:"after",render:t=>"h1"===t.as&&n.mobile}]}},g.default.createElement(o.default,null,e)),g.default.createElement(l.default,null)),g.default.createElement(c.default,null))),g.default.createElement("div",{className:b.default.gap1}),n.desktop&&g.default.createElement("div",{className:(0,f.default)(b.default.toc)},n.desktop))}},59047:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});const i=n(70655),r=i.__importDefault(n(67294)),a=n(93945),s=n(18279),o=i.__importDefault(n(80900)),l=i.__importDefault(n(72103));e.default=function(t){const e=`docs-doc-id-${t.content.metadata.unversionedId}`,n=t.content;return r.default.createElement(s.DocProvider,{content:t.content},r.default.createElement(a.HtmlClassNameProvider,{className:e},r.default.createElement(o.default,null),r.default.createElement(l.default,null,r.default.createElement(n,null))))}},74054:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});const i=n(70655),r=i.__importDefault(n(67294)),a=i.__importDefault(n(86010)),s=i.__importDefault(n(11614)),o=n(93945),l=n(18279),c=i.__importDefault(n(22420)),h=n(31665);e.default=function(t){let{className:e}=t;const n=(0,l.useDocsVersion)();return n.badge?r.default.createElement("span",{className:(0,a.default)(e,o.ThemeClassNames.docs.docVersionBadge,"badge badge--secondary",c.default.badge)},r.default.createElement(h.Typography,{variant:"body3"},r.default.createElement(s.default,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label}},"Version: {versionLabel}"))):null}},45039:(t,e,n)=>{"use strict";const i=n(70655),r=i.__importDefault(n(67294)),a=i.__importDefault(n(11614)),s=n(93945),o=n(6980),l=n(31665);e.Z=function(t){let{editUrl:e}=t;return r.default.createElement("a",{href:e,target:"_blank",rel:"noreferrer noopener",className:s.ThemeClassNames.common.editThisPage},r.default.createElement(o.IconEdit,null),r.default.createElement(l.Typography,{variant:"body2"},r.default.createElement(a.default,{id:"theme.common.editThisPage",description:"The link label to edit the current page"},"Edit this page")))}},29956:(t,e,n)=>{"use strict";const i=n(70655),r=i.__importStar(n(67294)),a=i.__importDefault(n(90151)),s=n(31665);e.Z=function(t){const e=r.default.Children.toArray(t.children),[n,i]=(0,r.useState)(!0),o=e.find((t=>{var e;return r.default.isValidElement(t)&&"summary"===(null==(e=t.props)?void 0:e.mdxType)})),l=r.default.createElement(r.default.Fragment,null,e.filter((t=>t!==o)));return r.default.createElement(s.Collapse,{...t,open:n,onChange:t=>i(t),label:o,className:a.default.collapse},l)}},99276:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});const i=n(70655),r=i.__importDefault(n(58513)),a=i.__importDefault(n(67294)),s=n(11679);e.default=function(t){const e=(0,s.useMDXEnhancementElements)("heading","after",t);return a.default.createElement(a.default.Fragment,null,a.default.createElement(r.default,{...t}),e)}},28205:(t,e,n)=>{"use strict";const i=n(70655),r=i.__importDefault(n(69385)),a=i.__importDefault(n(67294)),s=n(91866);e.Z=function(t){return a.default.createElement(s.LightBoxWrapper,null,a.default.createElement(r.default,{...t}))}},86570:(t,e,n)=>{"use strict";const i=n(70655),r=i.__importDefault(n(92021)),a=i.__importDefault(n(67294)),s=n(91866);e.Z=function(t){return a.default.createElement(s.LightBoxWrapper,null,a.default.createElement(r.default,{...t}))}},79255:(t,e,n)=>{"use strict";const i=n(70655),r=n(31665),a=i.__importDefault(n(88746)),s=n(6980),o=i.__importDefault(n(86010)),l=i.__importDefault(n(67294));e.Z=function(t){const{permalink:e,title:n,subLabel:i,isNext:c}=t;return l.default.createElement(a.default,{className:(0,o.default)("pagination-nav__link",c?"pagination-nav__link--next":"pagination-nav__link--prev"),to:e},c?null:l.default.createElement(s.IconArrowLeft,null),l.default.createElement(r.Typography,{variant:"body2",className:"pagination-nav__label"},n),c?l.default.createElement(s.IconArrowRight,null):null)}},20079:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});const i=n(70655),r=n(31665),a=i.__importDefault(n(11614)),s=i.__importDefault(n(86010)),o=i.__importDefault(n(67294)),l=i.__importDefault(n(47834));e.default=function(t){let{collapsed:e,...n}=t;return o.default.createElement("button",{type:"button",...n,className:(0,s.default)("clean-btn",l.default.tocCollapsibleButton,!e&&l.default.tocCollapsibleButtonExpanded,n.className)},o.default.createElement("div",null),o.default.createElement(r.Typography,{variant:"body2"},o.default.createElement(a.default,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component"},"On this page")),e?o.default.createElement(r.ChevronDownIcon,null):o.default.createElement(r.ChevronUpIcon,null))}},80466:(t,e,n)=>{"use strict";const i=n(70655),r=i.__importDefault(n(67294)),a=i.__importDefault(n(86010)),s=n(93945),o=i.__importDefault(n(1014)),l=i.__importDefault(n(20079)),c=i.__importDefault(n(2530));e.Z=function(t){let{toc:e,className:n,minHeadingLevel:i,maxHeadingLevel:h}=t;const{collapsed:u,toggleCollapsed:d}=(0,s.useCollapsible)({initialState:!0});return r.default.createElement("div",{className:(0,a.default)(c.default.tocCollapsible,!u&&c.default.tocCollapsibleExpanded,n)},r.default.createElement(l.default,{collapsed:u,onClick:d}),r.default.createElement(s.Collapsible,{lazy:!0,className:c.default.tocCollapsibleContent,collapsed:u},r.default.createElement(o.default,{toc:e,minHeadingLevel:i,maxHeadingLevel:h})))}},1842:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});const i=n(70655),r=i.__importDefault(n(67294)),a=i.__importDefault(n(86010)),s=i.__importDefault(n(88746)),o=i.__importDefault(n(65507)),l=n(31665);e.default=function(t){let{permalink:e,label:n,count:i}=t;return r.default.createElement(s.default,{href:e,className:(0,a.default)(i?o.default.tagWithCount:o.default.tagRegular)},r.default.createElement(l.Tag,{disabled:!1,size:"small"},n,i&&r.default.createElement("span",null,i)))}},18189:(t,e,n)=>{"use strict";const i=n(70655),r=i.__importDefault(n(67294)),a=i.__importDefault(n(86010)),s=i.__importDefault(n(11614)),o=i.__importDefault(n(1842)),l=i.__importDefault(n(53867)),c=n(31665);e.Z=function(t){let{tags:e}=t;return r.default.createElement("div",{className:l.default.root},r.default.createElement(c.Typography,{variant:"body2",component:"div"},r.default.createElement(s.default,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list"},"Tags:")),r.default.createElement("ul",{className:(0,a.default)(l.default.tags,"padding--none","margin-left--sm")},e.map((t=>{let{label:e,permalink:n}=t;return r.default.createElement("li",{key:n,className:l.default.tag},r.default.createElement(o.default,{label:e,permalink:n}))}))))}},12882:(t,e,n)=>{"use strict";n.r(e),n.d(e,{default:()=>h});var i=n(87462),r=n(67294),a=n(86010),s=n(99401),o=n(18015),l=n(96066);const c="codeBlockContainer_Ckt0";function h(t){let{as:e,...n}=t;const h=(0,s.p)(),u=(0,l.QC)(h);return r.createElement(e,(0,i.Z)({},n,{style:u,className:(0,a.default)(n.className,c,o.k.common.codeBlock)}))}},38943:(t,e,n)=>{"use strict";n.r(e),n.d(e,{default:()=>c});var i=n(87462),r=n(67294),a=n(86010);const s="codeLine_lJS_",o="codeLineNumber_Tfdd",l="codeLineContent_feaV";function c(t){let{line:e,classNames:n,showLineNumbers:c,getLineProps:h,getTokenProps:u}=t;1===e.length&&"\n"===e[0].content&&(e[0].content="");const d=h({line:e,className:(0,a.default)(n,c&&s)}),p=e.map(((t,e)=>r.createElement("span",(0,i.Z)({key:e},u({token:t,key:e})))));return r.createElement("span",d,c?r.createElement(r.Fragment,null,r.createElement("span",{className:o}),r.createElement("span",{className:l},p)):p,r.createElement("br",null))}},6938:(t,e,n)=>{"use strict";n.r(e),n.d(e,{default:()=>h});var i=n(67294),r=n(86010),a=n(11614),s=n(87462);function o(t){return i.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24"},t),i.createElement("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"}))}const l="wordWrapButtonIcon_Bwma",c="wordWrapButtonEnabled_EoeP";function h(t){let{className:e,onClick:n,isEnabled:s}=t;const h=(0,a.translate)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return i.createElement("button",{type:"button",onClick:n,className:(0,r.default)("clean-btn",e,s&&c),"aria-label":h,title:h},i.createElement(o,{className:l,"aria-hidden":"true"}))}},25926:(t,e,n)=>{"use strict";n.r(e),n.d(e,{default:()=>d});var i=n(87462),r=n(67294),a=n(5730),s=n(86010),o=n(79896);const l="codeBlockStandalone_MEMb",c="codeBlockLines_e6Vv";function h(t){let{children:e,className:n}=t;return r.createElement(o.default,{as:"pre",tabIndex:0,className:(0,s.default)(l,"thin-scrollbar",n)},r.createElement("code",{className:c},e))}var u=n(75962);function d(t){let{children:e,...n}=t;const s=(0,a.default)(),o=function(t){return r.Children.toArray(t).some((t=>(0,r.isValidElement)(t)))?t:Array.isArray(t)?t.join(""):t}(e),l="string"==typeof o?u.Z:h;return r.createElement(l,(0,i.Z)({key:String(s)},n),o)}},70331:(t,e,n)=>{"use strict";n.r(e),n.d(e,{default:()=>y});var i=n(67294),r=n(86010),a=n(18015),s=n(2791),o=n(11614);function l(t){let{lastUpdatedAt:e,formattedLastUpdatedAt:n}=t;return i.createElement(o.default,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:i.createElement("b",null,i.createElement("time",{dateTime:new Date(1e3*e).toISOString()},n))}}," on {date}")}function c(t){let{lastUpdatedBy:e}=t;return i.createElement(o.default,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:i.createElement("b",null,e)}}," by {user}")}function h(t){let{lastUpdatedAt:e,formattedLastUpdatedAt:n,lastUpdatedBy:r}=t;return i.createElement("span",{className:a.k.common.lastUpdated},i.createElement(o.default,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:e&&n?i.createElement(l,{lastUpdatedAt:e,formattedLastUpdatedAt:n}):"",byUser:r?i.createElement(c,{lastUpdatedBy:r}):""}},"Last updated{atDate}{byUser}"),!1)}var u=n(45039),d=n(18189);const p="lastUpdated_vwxv";function f(t){return i.createElement("div",{className:(0,r.default)(a.k.docs.docFooterTagsRow,"row margin-bottom--sm")},i.createElement("div",{className:"col"},i.createElement(d.Z,t)))}function g(t){let{editUrl:e,lastUpdatedAt:n,lastUpdatedBy:s,formattedLastUpdatedAt:o}=t;return i.createElement("div",{className:(0,r.default)(a.k.docs.docFooterEditMetaRow,"row")},i.createElement("div",{className:"col"},e&&i.createElement(u.Z,{editUrl:e})),i.createElement("div",{className:(0,r.default)("col",p)},(n||s)&&i.createElement(h,{lastUpdatedAt:n,formattedLastUpdatedAt:o,lastUpdatedBy:s})))}function y(){const{metadata:t}=(0,s.k)(),{editUrl:e,lastUpdatedAt:n,formattedLastUpdatedAt:o,lastUpdatedBy:l,tags:c}=t,h=c.length>0,u=!!(e||n||l);return h||u?i.createElement("footer",{className:(0,r.default)(a.k.docs.docFooter,"docusaurus-mt-lg")},h&&i.createElement(f,{tags:c}),u&&i.createElement(g,{editUrl:e,lastUpdatedAt:n,lastUpdatedBy:l,formattedLastUpdatedAt:o})):null}},80900:(t,e,n)=>{"use strict";n.r(e),n.d(e,{default:()=>s});var i=n(67294),r=n(44873),a=n(2791);function s(){const{metadata:t,frontMatter:e,assets:n}=(0,a.k)();return i.createElement(r.d,{title:t.title,description:t.description,keywords:e.keywords,image:n.image??e.image})}},4316:(t,e,n)=>{"use strict";n.r(e),n.d(e,{default:()=>c});var i=n(67294),r=n(2791),a=n(87462),s=n(11614),o=n(79255);function l(t){const{previous:e,next:n}=t;return i.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,s.translate)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"})},e&&i.createElement(o.Z,(0,a.Z)({},e,{subLabel:i.createElement(s.default,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),n&&i.createElement(o.Z,(0,a.Z)({},n,{subLabel:i.createElement(s.default,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}function c(){const{metadata:t}=(0,r.k)();return i.createElement(l,{previous:t.previous,next:t.next})}},9545:(t,e,n)=>{"use strict";n.r(e),n.d(e,{default:()=>u});var i=n(67294),r=n(18015),a=n(2791),s=n(87462),o=n(86010),l=n(1014);const c="tableOfContents_bqdL";function h(t){let{className:e,...n}=t;return i.createElement("div",{className:(0,o.default)(c,"thin-scrollbar",e)},i.createElement(l.default,(0,s.Z)({},n,{linkClassName:"table-of-contents__link toc-highlight",linkActiveClassName:"table-of-contents__link--active"})))}function u(){const{toc:t,frontMatter:e}=(0,a.k)();return i.createElement(h,{toc:t,minHeadingLevel:e.toc_min_heading_level,maxHeadingLevel:e.toc_max_heading_level,className:r.k.docs.docTocDesktop})}},37721:(t,e,n)=>{"use strict";n.r(e),n.d(e,{default:()=>c});var i=n(67294),r=n(86010),a=n(18015),s=n(2791),o=n(80466);const l="tocMobile_ITEo";function c(){const{toc:t,frontMatter:e}=(0,s.k)();return i.createElement(o.Z,{toc:t,minHeadingLevel:e.toc_min_heading_level,maxHeadingLevel:e.toc_max_heading_level,className:(0,r.default)(a.k.docs.docTocMobile,l)})}},18554:(t,e,n)=>{"use strict";n.r(e),n.d(e,{default:()=>y});var i=n(67294),r=n(86010),a=n(6832),s=n(88746),o=n(11614),l=n(4452),c=n(18015),h=n(4049),u=n(6141);const d={unreleased:function(t){let{siteTitle:e,versionMetadata:n}=t;return i.createElement(o.default,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:e,versionLabel:i.createElement("b",null,n.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(t){let{siteTitle:e,versionMetadata:n}=t;return i.createElement(o.default,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:e,versionLabel:i.createElement("b",null,n.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function p(t){const e=d[t.versionMetadata.banner];return i.createElement(e,t)}function f(t){let{versionLabel:e,to:n,onClick:r}=t;return i.createElement(o.default,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:e,latestVersionLink:i.createElement("b",null,i.createElement(s.default,{to:n,onClick:r},i.createElement(o.default,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label"},"latest version")))}},"For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).")}function g(t){let{className:e,versionMetadata:n}=t;const{siteConfig:{title:s}}=(0,a.default)(),{pluginId:o}=(0,l.useActivePlugin)({failfast:!0}),{savePreferredVersionName:u}=(0,h.J)(o),{latestDocSuggestion:d,latestVersionSuggestion:g}=(0,l.useDocVersionSuggestions)(o),y=d??(m=g).docs.find((t=>t.id===m.mainDocId));var m;return i.createElement("div",{className:(0,r.default)(e,c.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},i.createElement("div",null,i.createElement(p,{siteTitle:s,versionMetadata:n})),i.createElement("div",{className:"margin-top--md"},i.createElement(f,{versionLabel:g.label,to:y.path,onClick:()=>u(g.name)})))}function y(t){let{className:e}=t;const n=(0,u.E)();return n.banner?i.createElement(g,{className:e,versionMetadata:n}):null}},79939:(t,e,n)=>{"use strict";n.r(e),n.d(e,{default:()=>a});var i=n(87462),r=n(67294);function a(t){return r.createElement("svg",(0,i.Z)({viewBox:"0 0 24 24"},t),r.createElement("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"}))}},58513:(t,e,n)=>{"use strict";n.r(e),n.d(e,{default:()=>d});var i=n(67294),r=n(87462),a=n(86010),s=n(11614),o=n(96793),l=n(88746);const c="anchorWithStickyNavbar_LWe7",h="anchorWithHideOnScrollNavbar_WYt5";function u(t){let{as:e,id:n,...u}=t;const{navbar:{hideOnScroll:d}}=(0,o.L)();if("h1"===e||!n)return i.createElement(e,(0,r.Z)({},u,{id:void 0}));const p=(0,s.translate)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return i.createElement(e,(0,r.Z)({},u,{className:(0,a.default)("anchor",d?h:c,u.className),id:n}),u.children,i.createElement(l.default,{className:"hash-link",to:`#${n}`,"aria-label":p,title:p},"\u200b"))}function d(t){return i.createElement(u,t)}},69385:(t,e,n)=>{"use strict";n.r(e),n.d(e,{default:()=>o});var i=n(87462),r=n(67294),a=n(86010);const s="img_ev3q";function o(t){return r.createElement("img",(0,i.Z)({loading:"lazy"},t,{className:(e=t.className,(0,a.default)(e,s))}));var e}},16927:(t,e,n)=>{"use strict";n.r(e),n.d(e,{default:()=>m});var i=n(67294),r=n(3905),a=n(87462),s=n(32411);var o=n(86687);var l=n(88746);var c=n(29956),h=n(99276),u=n(86010);const d="containsTaskList_mC6p";var p=n(28205),f=n(60578),g=n(86570);const y={head:function(t){const e=i.Children.map(t.children,(t=>i.isValidElement(t)?function(t){var e;if(null!=(e=t.props)&&e.mdxType&&t.props.originalType){const{mdxType:e,originalType:n,...r}=t.props;return i.createElement(t.props.originalType,r)}return t}(t):t));return i.createElement(s.Z,t,e)},code:function(t){const e=["a","abbr","b","br","button","cite","code","del","dfn","em","i","img","input","ins","kbd","label","object","output","q","ruby","s","small","span","strong","sub","sup","time","u","var","wbr"];return i.Children.toArray(t.children).every((t=>{var n;return"string"==typeof t&&!t.includes("\n")||(0,i.isValidElement)(t)&&e.includes(null==(n=t.props)?void 0:n.mdxType)}))?i.createElement("code",t):i.createElement(o.Z,t)},a:function(t){return i.createElement(l.default,t)},pre:function(t){var e;return i.createElement(o.Z,(0,i.isValidElement)(t.children)&&"code"===(null==(e=t.children.props)?void 0:e.originalType)?t.children.props:{...t})},details:c.Z,ul:function(t){return i.createElement("ul",(0,a.Z)({},t,{className:(e=t.className,(0,u.default)(e,(null==e?void 0:e.includes("contains-task-list"))&&d))}));var e},img:p.Z,h1:t=>i.createElement(h.default,(0,a.Z)({as:"h1"},t)),h2:t=>i.createElement(h.default,(0,a.Z)({as:"h2"},t)),h3:t=>i.createElement(h.default,(0,a.Z)({as:"h3"},t)),h4:t=>i.createElement(h.default,(0,a.Z)({as:"h4"},t)),h5:t=>i.createElement(h.default,(0,a.Z)({as:"h5"},t)),h6:t=>i.createElement(h.default,(0,a.Z)({as:"h6"},t)),admonition:f.Z,mermaid:g.Z};function m(t){let{children:e}=t;return i.createElement(r.Zo,{components:y},e)}},1014:(t,e,n)=>{"use strict";n.r(e),n.d(e,{default:()=>h});var i=n(87462),r=n(67294),a=n(96793),s=n(94462),o=n(78586);function l(t){let{toc:e,className:n,linkClassName:i,isChild:a}=t;return e.length?r.createElement("ul",{className:a?void 0:n},e.map((t=>r.createElement("li",{key:t.id},r.createElement("a",{href:`#${t.id}`,className:i??void 0,dangerouslySetInnerHTML:{__html:t.value}}),r.createElement(l,{isChild:!0,toc:t.children,className:n,linkClassName:i}))))):null}const c=r.memo(l);function h(t){let{toc:e,className:n="table-of-contents table-of-contents__left-border",linkClassName:l="table-of-contents__link",linkActiveClassName:h,minHeadingLevel:u,maxHeadingLevel:d,...p}=t;const f=(0,a.L)(),g=u??f.tableOfContents.minHeadingLevel,y=d??f.tableOfContents.maxHeadingLevel,m=(0,s.b)({toc:e,minHeadingLevel:g,maxHeadingLevel:y}),b=(0,r.useMemo)((()=>{if(l&&h)return{linkClassName:l,linkActiveClassName:h,minHeadingLevel:g,maxHeadingLevel:y}}),[l,h,g,y]);return(0,o.S)(b),r.createElement(c,(0,i.Z)({toc:m,className:n,linkClassName:l},p))}},92021:(t,e,n)=>{"use strict";n.r(e),n.d(e,{default:()=>d});var i=n(67294),r=n(5730);function a(t){let{children:e,fallback:n}=t;return(0,r.default)()?i.createElement(i.Fragment,null,null==e?void 0:e()):n??null}var s=n(96793),o=n(70524),l=n(43412);function c(){const{colorMode:t}=(0,o.I)(),e=(0,s.L)().mermaid,n=e.theme[t],{options:r}=e;return(0,i.useMemo)((()=>({startOnLoad:!1,...r,theme:n})),[n,r])}const h="container_lyt7";function u(t){let{value:e}=t;const n=function(t,e){const n=c(),r=e??n;return(0,i.useMemo)((()=>{l.o.mermaidAPI.initialize(r);const e=`mermaid-svg-${Math.round(1e7*Math.random())}`;return l.o.render(e,t)}),[t,r])}(e);return i.createElement("div",{className:`docusaurus-mermaid-container ${h}`,dangerouslySetInnerHTML:{__html:n}})}function d(t){return i.createElement(a,null,(()=>i.createElement(u,t)))}},3905:(t,e,n)=>{"use strict";n.d(e,{Zo:()=>h,kt:()=>p});var i=n(67294);function r(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function a(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,i)}return n}function s(t){for(var e=1;e=0||(r[n]=t[n]);return r}(t,e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(r[n]=t[n])}return r}var l=i.createContext({}),c=function(t){var e=i.useContext(l),n=e;return t&&(n="function"==typeof t?t(e):s(s({},e),t)),n},h=function(t){var e=c(t.components);return i.createElement(l.Provider,{value:e},t.children)},u={inlineCode:"code",wrapper:function(t){var e=t.children;return i.createElement(i.Fragment,{},e)}},d=i.forwardRef((function(t,e){var n=t.components,r=t.mdxType,a=t.originalType,l=t.parentName,h=o(t,["components","mdxType","originalType","parentName"]),d=c(n),p=r,f=d["".concat(l,".").concat(p)]||d[p]||u[p]||a;return n?i.createElement(f,s(s({ref:e},h),{},{components:n})):i.createElement(f,s({ref:e},h))}));function p(t,e){var n=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var a=n.length,s=new Array(a);s[0]=d;var o={};for(var l in e)hasOwnProperty.call(e,l)&&(o[l]=e[l]);o.originalType=t,o.mdxType="string"==typeof t?t:r,s[1]=o;for(var c=2;c=e?t:""+Array(e+1-i.length).join(n)+t},b={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),i=Math.floor(n/60),r=n%60;return(e<=0?"+":"-")+m(i,2,"0")+":"+m(r,2,"0")},m:function t(e,n){if(e.date()1)return t(s[0])}else{var o=e.name;x[o]=e,r=o}return!i&&r&&(_=r),r||!i&&_},C=function(t,e){if(v(t))return t.clone();var n="object"==typeof e?e:{};return n.date=t,n.args=arguments,new T(n)},w=b;w.l=k,w.i=v,w.w=function(t,e){return C(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var T=function(){function y(t){this.$L=k(t.locale,null,!0),this.parse(t)}var m=y.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(w.u(e))return new Date;if(e instanceof Date)return new Date(e);if("string"==typeof e&&!/Z$/i.test(e)){var i=e.match(f);if(i){var r=i[2]-1||0,a=(i[7]||"0").substring(0,3);return n?new Date(Date.UTC(i[1],r,i[3]||1,i[4]||0,i[5]||0,i[6]||0,a)):new Date(i[1],r,i[3]||1,i[4]||0,i[5]||0,i[6]||0,a)}}return new Date(e)}(t),this.$x=t.x||{},this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return w},m.isValid=function(){return!(this.$d.toString()===p)},m.isSame=function(t,e){var n=C(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return C(t)68?1900:2e3)},o=function(t){return function(e){this[t]=+e}},l=[/[+-]\d\d:?(\d\d)?|Z/,function(t){(this.zone||(this.zone={})).offset=function(t){if(!t)return 0;if("Z"===t)return 0;var e=t.match(/([+-]|\d\d)/g),n=60*e[1]+(+e[2]||0);return 0===n?0:"+"===e[0]?-n:n}(t)}],c=function(t){var e=a[t];return e&&(e.indexOf?e:e.s.concat(e.f))},h=function(t,e){var n,i=a.meridiem;if(i){for(var r=1;r<=24;r+=1)if(t.indexOf(i(r,0,e))>-1){n=r>12;break}}else n=t===(e?"pm":"PM");return n},u={A:[r,function(t){this.afternoon=h(t,!1)}],a:[r,function(t){this.afternoon=h(t,!0)}],S:[/\d/,function(t){this.milliseconds=100*+t}],SS:[n,function(t){this.milliseconds=10*+t}],SSS:[/\d{3}/,function(t){this.milliseconds=+t}],s:[i,o("seconds")],ss:[i,o("seconds")],m:[i,o("minutes")],mm:[i,o("minutes")],H:[i,o("hours")],h:[i,o("hours")],HH:[i,o("hours")],hh:[i,o("hours")],D:[i,o("day")],DD:[n,o("day")],Do:[r,function(t){var e=a.ordinal,n=t.match(/\d+/);if(this.day=n[0],e)for(var i=1;i<=31;i+=1)e(i).replace(/\[|\]/g,"")===t&&(this.day=i)}],M:[i,o("month")],MM:[n,o("month")],MMM:[r,function(t){var e=c("months"),n=(c("monthsShort")||e.map((function(t){return t.slice(0,3)}))).indexOf(t)+1;if(n<1)throw new Error;this.month=n%12||n}],MMMM:[r,function(t){var e=c("months").indexOf(t)+1;if(e<1)throw new Error;this.month=e%12||e}],Y:[/[+-]?\d+/,o("year")],YY:[n,function(t){this.year=s(t)}],YYYY:[/\d{4}/,o("year")],Z:l,ZZ:l};function d(n){var i,r;i=n,r=a&&a.formats;for(var s=(n=i.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(e,n,i){var a=i&&i.toUpperCase();return n||r[i]||t[i]||r[a].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,(function(t,e,n){return e||n.slice(1)}))}))).match(e),o=s.length,l=0;l-1)return new Date(("X"===e?1e3:1)*t);var i=d(e)(t),r=i.year,a=i.month,s=i.day,o=i.hours,l=i.minutes,c=i.seconds,h=i.milliseconds,u=i.zone,p=new Date,f=s||(r||a?1:p.getDate()),g=r||p.getFullYear(),y=0;r&&!a||(y=a>0?a-1:p.getMonth());var m=o||0,b=l||0,_=c||0,x=h||0;return u?new Date(Date.UTC(g,y,f,m,b,_,x+60*u.offset*1e3)):n?new Date(Date.UTC(g,y,f,m,b,_,x)):new Date(g,y,f,m,b,_,x)}catch(t){return new Date("")}}(e,o,i),this.init(),u&&!0!==u&&(this.$L=this.locale(u).$L),h&&e!=this.format(o)&&(this.$d=new Date("")),a={}}else if(o instanceof Array)for(var p=o.length,f=1;f<=p;f+=1){s[1]=o[f-1];var g=n.apply(this,s);if(g.isValid()){this.$d=g.$d,this.$L=g.$L,this.init();break}f===p&&(this.$d=new Date(""))}else r.call(this,t)}}}()},59542:function(t){t.exports=function(){"use strict";var t="day";return function(e,n,i){var r=function(e){return e.add(4-e.isoWeekday(),t)},a=n.prototype;a.isoWeekYear=function(){return r(this).year()},a.isoWeek=function(e){if(!this.$utils().u(e))return this.add(7*(e-this.isoWeek()),t);var n,a,s,o=r(this),l=(n=this.isoWeekYear(),s=4-(a=(this.$u?i.utc:i)().year(n).startOf("year")).isoWeekday(),a.isoWeekday()>4&&(s+=7),a.add(s,t));return o.diff(l,"week")+1},a.isoWeekday=function(t){return this.$utils().u(t)?this.day()||7:this.day(this.day()%7?t:t-7)};var s=a.startOf;a.startOf=function(t,e){var n=this.$utils(),i=!!n.u(e)||e;return"isoweek"===n.p(t)?i?this.date(this.date()-(this.isoWeekday()-1)).startOf("day"):this.date(this.date()-1-(this.isoWeekday()-1)+7).endOf("day"):s.bind(this)(t,e)}}}()},27856:function(t){t.exports=function(){"use strict";function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(t,n){return e=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},e(t,n)}function n(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}function i(t,r,a){return i=n()?Reflect.construct:function(t,n,i){var r=[null];r.push.apply(r,n);var a=new(Function.bind.apply(t,r));return i&&e(a,i.prototype),a},i.apply(null,arguments)}function r(t){return a(t)||s(t)||o(t)||c()}function a(t){if(Array.isArray(t))return l(t)}function s(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}function o(t,e){if(t){if("string"==typeof t)return l(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?l(t,e):void 0}}function l(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n1?n-1:0),r=1;r/gm),X=y(/\${[\w\W]*}/gm),Q=y(/^data-[\-\w.\u00B7-\uFFFF]/),K=y(/^aria-[\-\w]+$/),J=y(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),tt=y(/^(?:\w+script|data):/i),et=y(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),nt=y(/^html$/i),it=function(){return"undefined"==typeof window?null:window},rt=function(e,n){if("object"!==t(e)||"function"!=typeof e.createPolicy)return null;var i=null,r="data-tt-policy-suffix";n.currentScript&&n.currentScript.hasAttribute(r)&&(i=n.currentScript.getAttribute(r));var a="dompurify"+(i?"#"+i:"");try{return e.createPolicy(a,{createHTML:function(t){return t},createScriptURL:function(t){return t}})}catch(s){return console.warn("TrustedTypes policy "+a+" could not be created."),null}};function at(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:it(),n=function(t){return at(t)};if(n.version="2.4.3",n.removed=[],!e||!e.document||9!==e.document.nodeType)return n.isSupported=!1,n;var i=e.document,a=e.document,s=e.DocumentFragment,o=e.HTMLTemplateElement,l=e.Node,c=e.Element,h=e.NodeFilter,u=e.NamedNodeMap,d=void 0===u?e.NamedNodeMap||e.MozNamedAttrMap:u,p=e.HTMLFormElement,f=e.DOMParser,y=e.trustedTypes,m=c.prototype,b=F(m,"cloneNode"),_=F(m,"nextSibling"),x=F(m,"childNodes"),N=F(m,"parentNode");if("function"==typeof o){var O=a.createElement("template");O.content&&O.content.ownerDocument&&(a=O.content.ownerDocument)}var st=rt(y,i),ot=st?st.createHTML(""):"",lt=a,ct=lt.implementation,ht=lt.createNodeIterator,ut=lt.createDocumentFragment,dt=lt.getElementsByTagName,pt=i.importNode,ft={};try{ft=I(a).documentMode?a.documentMode:{}}catch(Ne){}var gt={};n.isSupported="function"==typeof N&&ct&&void 0!==ct.createHTMLDocument&&9!==ft;var yt,mt,bt=V,_t=G,xt=X,vt=Q,kt=K,Ct=tt,wt=et,Tt=J,Et=null,St=M({},[].concat(r($),r(R),r(Z),r(j),r(z))),At=null,Lt=M({},[].concat(r(U),r(W),r(H),r(q))),Bt=Object.seal(Object.create(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Dt=null,Nt=null,Ot=!0,Mt=!0,It=!1,Ft=!1,$t=!1,Rt=!1,Zt=!1,Pt=!1,jt=!1,Yt=!1,zt=!0,Ut=!1,Wt="user-content-",Ht=!0,qt=!1,Vt={},Gt=null,Xt=M({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),Qt=null,Kt=M({},["audio","video","img","source","image","track"]),Jt=null,te=M({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),ee="http://www.w3.org/1998/Math/MathML",ne="http://www.w3.org/2000/svg",ie="http://www.w3.org/1999/xhtml",re=ie,ae=!1,se=null,oe=M({},[ee,ne,ie],T),le=["application/xhtml+xml","text/html"],ce="text/html",he=null,ue=a.createElement("form"),de=function(t){return t instanceof RegExp||t instanceof Function},pe=function(e){he&&he===e||(e&&"object"===t(e)||(e={}),e=I(e),yt=yt=-1===le.indexOf(e.PARSER_MEDIA_TYPE)?ce:e.PARSER_MEDIA_TYPE,mt="application/xhtml+xml"===yt?T:w,Et="ALLOWED_TAGS"in e?M({},e.ALLOWED_TAGS,mt):St,At="ALLOWED_ATTR"in e?M({},e.ALLOWED_ATTR,mt):Lt,se="ALLOWED_NAMESPACES"in e?M({},e.ALLOWED_NAMESPACES,T):oe,Jt="ADD_URI_SAFE_ATTR"in e?M(I(te),e.ADD_URI_SAFE_ATTR,mt):te,Qt="ADD_DATA_URI_TAGS"in e?M(I(Kt),e.ADD_DATA_URI_TAGS,mt):Kt,Gt="FORBID_CONTENTS"in e?M({},e.FORBID_CONTENTS,mt):Xt,Dt="FORBID_TAGS"in e?M({},e.FORBID_TAGS,mt):{},Nt="FORBID_ATTR"in e?M({},e.FORBID_ATTR,mt):{},Vt="USE_PROFILES"in e&&e.USE_PROFILES,Ot=!1!==e.ALLOW_ARIA_ATTR,Mt=!1!==e.ALLOW_DATA_ATTR,It=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Ft=e.SAFE_FOR_TEMPLATES||!1,$t=e.WHOLE_DOCUMENT||!1,Pt=e.RETURN_DOM||!1,jt=e.RETURN_DOM_FRAGMENT||!1,Yt=e.RETURN_TRUSTED_TYPE||!1,Zt=e.FORCE_BODY||!1,zt=!1!==e.SANITIZE_DOM,Ut=e.SANITIZE_NAMED_PROPS||!1,Ht=!1!==e.KEEP_CONTENT,qt=e.IN_PLACE||!1,Tt=e.ALLOWED_URI_REGEXP||Tt,re=e.NAMESPACE||ie,e.CUSTOM_ELEMENT_HANDLING&&de(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Bt.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&de(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Bt.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(Bt.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Ft&&(Mt=!1),jt&&(Pt=!0),Vt&&(Et=M({},r(z)),At=[],!0===Vt.html&&(M(Et,$),M(At,U)),!0===Vt.svg&&(M(Et,R),M(At,W),M(At,q)),!0===Vt.svgFilters&&(M(Et,Z),M(At,W),M(At,q)),!0===Vt.mathMl&&(M(Et,j),M(At,H),M(At,q))),e.ADD_TAGS&&(Et===St&&(Et=I(Et)),M(Et,e.ADD_TAGS,mt)),e.ADD_ATTR&&(At===Lt&&(At=I(At)),M(At,e.ADD_ATTR,mt)),e.ADD_URI_SAFE_ATTR&&M(Jt,e.ADD_URI_SAFE_ATTR,mt),e.FORBID_CONTENTS&&(Gt===Xt&&(Gt=I(Gt)),M(Gt,e.FORBID_CONTENTS,mt)),Ht&&(Et["#text"]=!0),$t&&M(Et,["html","head","body"]),Et.table&&(M(Et,["tbody"]),delete Dt.tbody),g&&g(e),he=e)},fe=M({},["mi","mo","mn","ms","mtext"]),ge=M({},["foreignobject","desc","title","annotation-xml"]),ye=M({},["title","style","font","a","script"]),me=M({},R);M(me,Z),M(me,P);var be=M({},j);M(be,Y);var _e=function(t){var e=N(t);e&&e.tagName||(e={namespaceURI:re,tagName:"template"});var n=w(t.tagName),i=w(e.tagName);return!!se[t.namespaceURI]&&(t.namespaceURI===ne?e.namespaceURI===ie?"svg"===n:e.namespaceURI===ee?"svg"===n&&("annotation-xml"===i||fe[i]):Boolean(me[n]):t.namespaceURI===ee?e.namespaceURI===ie?"math"===n:e.namespaceURI===ne?"math"===n&&ge[i]:Boolean(be[n]):t.namespaceURI===ie?!(e.namespaceURI===ne&&!ge[i])&&!(e.namespaceURI===ee&&!fe[i])&&!be[n]&&(ye[n]||!me[n]):!("application/xhtml+xml"!==yt||!se[t.namespaceURI]))},xe=function(t){C(n.removed,{element:t});try{t.parentNode.removeChild(t)}catch(Ne){try{t.outerHTML=ot}catch(Ne){t.remove()}}},ve=function(t,e){try{C(n.removed,{attribute:e.getAttributeNode(t),from:e})}catch(Ne){C(n.removed,{attribute:null,from:e})}if(e.removeAttribute(t),"is"===t&&!At[t])if(Pt||jt)try{xe(e)}catch(Ne){}else try{e.setAttribute(t,"")}catch(Ne){}},ke=function(t){var e,n;if(Zt)t=""+t;else{var i=E(t,/^[\r\n\t ]+/);n=i&&i[0]}"application/xhtml+xml"===yt&&re===ie&&(t=''+t+"");var r=st?st.createHTML(t):t;if(re===ie)try{e=(new f).parseFromString(r,yt)}catch(Ne){}if(!e||!e.documentElement){e=ct.createDocument(re,"template",null);try{e.documentElement.innerHTML=ae?ot:r}catch(Ne){}}var s=e.body||e.documentElement;return t&&n&&s.insertBefore(a.createTextNode(n),s.childNodes[0]||null),re===ie?dt.call(e,$t?"html":"body")[0]:$t?e.documentElement:s},Ce=function(t){return ht.call(t.ownerDocument||t,t,h.SHOW_ELEMENT|h.SHOW_COMMENT|h.SHOW_TEXT,null,!1)},we=function(t){return t instanceof p&&("string"!=typeof t.nodeName||"string"!=typeof t.textContent||"function"!=typeof t.removeChild||!(t.attributes instanceof d)||"function"!=typeof t.removeAttribute||"function"!=typeof t.setAttribute||"string"!=typeof t.namespaceURI||"function"!=typeof t.insertBefore||"function"!=typeof t.hasChildNodes)},Te=function(e){return"object"===t(l)?e instanceof l:e&&"object"===t(e)&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},Ee=function(t,e,i){gt[t]&&v(gt[t],(function(t){t.call(n,e,i,he)}))},Se=function(t){var e;if(Ee("beforeSanitizeElements",t,null),we(t))return xe(t),!0;if(B(/[\u0080-\uFFFF]/,t.nodeName))return xe(t),!0;var i=mt(t.nodeName);if(Ee("uponSanitizeElement",t,{tagName:i,allowedTags:Et}),t.hasChildNodes()&&!Te(t.firstElementChild)&&(!Te(t.content)||!Te(t.content.firstElementChild))&&B(/<[/\w]/g,t.innerHTML)&&B(/<[/\w]/g,t.textContent))return xe(t),!0;if("select"===i&&B(/