commit 9a9ad3e5ee1f9e548cd5055bfa604d6dd1b2ec42 Author: Raphael Date: Fri Jul 26 10:35:34 2024 +0200 First commit diff --git a/-gitignore b/-gitignore new file mode 100644 index 0000000..fcab18b --- /dev/null +++ b/-gitignore @@ -0,0 +1,10 @@ +*.aux +*.fdb_latexmk +*.fls +*.idx +*.log +*.ilg +*.ind +*.out +*.synctex.gz +*.toc \ No newline at end of file diff --git a/5G-Dashboard.png b/5G-Dashboard.png new file mode 100644 index 0000000..bdf907b Binary files /dev/null and b/5G-Dashboard.png differ diff --git a/LICRcyr2utf8.xdy b/LICRcyr2utf8.xdy new file mode 100644 index 0000000..a9ca1c8 --- /dev/null +++ b/LICRcyr2utf8.xdy @@ -0,0 +1,101 @@ +;; -*- coding: utf-8; mode: Lisp; -*- +;; style file for xindy +;; filename: LICRcyr2utf8.xdy +;; description: style file for xindy which maps back LaTeX Internal +;; Character Representation of Cyrillic to utf-8 +;; usage: for use with pdflatex produced .idx files. +;; Contributed by the Sphinx team, July 2018. +(merge-rule "\IeC {\'\CYRG }" "Ѓ" :string) +(merge-rule "\IeC {\'\CYRK }" "Ќ" :string) +(merge-rule "\IeC {\'\cyrg }" "ѓ" :string) +(merge-rule "\IeC {\'\cyrk }" "ќ" :string) +(merge-rule "\IeC {\CYRA }" "А" :string) +(merge-rule "\IeC {\CYRB }" "Б" :string) +(merge-rule "\IeC {\CYRC }" "Ц" :string) +(merge-rule "\IeC {\CYRCH }" "Ч" :string) +(merge-rule "\IeC {\CYRD }" "Д" :string) +(merge-rule "\IeC {\CYRDJE }" "Ђ" :string) +(merge-rule "\IeC {\CYRDZE }" "Ѕ" :string) +(merge-rule "\IeC {\CYRDZHE }" "Џ" :string) +(merge-rule "\IeC {\CYRE }" "Е" :string) +(merge-rule "\IeC {\CYREREV }" "Э" :string) +(merge-rule "\IeC {\CYRERY }" "Ы" :string) +(merge-rule "\IeC {\CYRF }" "Ф" :string) +(merge-rule "\IeC {\CYRG }" "Г" :string) +(merge-rule "\IeC {\CYRGUP }" "Ґ" :string) +(merge-rule "\IeC {\CYRH }" "Х" :string) +(merge-rule "\IeC {\CYRHRDSN }" "Ъ" :string) +(merge-rule "\IeC {\CYRI }" "И" :string) +(merge-rule "\IeC {\CYRIE }" "Є" :string) +(merge-rule "\IeC {\CYRII }" "І" :string) +(merge-rule "\IeC {\CYRISHRT }" "Й" :string) +(merge-rule "\IeC {\CYRJE }" "Ј" :string) +(merge-rule "\IeC {\CYRK }" "К" :string) +(merge-rule "\IeC {\CYRL }" "Л" :string) +(merge-rule "\IeC {\CYRLJE }" "Љ" :string) +(merge-rule "\IeC {\CYRM }" "М" :string) +(merge-rule "\IeC {\CYRN }" "Н" :string) +(merge-rule "\IeC {\CYRNJE }" "Њ" :string) +(merge-rule "\IeC {\CYRO }" "О" :string) +(merge-rule "\IeC {\CYRP }" "П" :string) +(merge-rule "\IeC {\CYRR }" "Р" :string) +(merge-rule "\IeC {\CYRS }" "С" :string) +(merge-rule "\IeC {\CYRSFTSN }" "Ь" :string) +(merge-rule "\IeC {\CYRSH }" "Ш" :string) +(merge-rule "\IeC {\CYRSHCH }" "Щ" :string) +(merge-rule "\IeC {\CYRT }" "Т" :string) +(merge-rule "\IeC {\CYRTSHE }" "Ћ" :string) +(merge-rule "\IeC {\CYRU }" "У" :string) +(merge-rule "\IeC {\CYRUSHRT }" "Ў" :string) +(merge-rule "\IeC {\CYRV }" "В" :string) +(merge-rule "\IeC {\CYRYA }" "Я" :string) +(merge-rule "\IeC {\CYRYI }" "Ї" :string) +(merge-rule "\IeC {\CYRYO }" "Ё" :string) +(merge-rule "\IeC {\CYRYU }" "Ю" :string) +(merge-rule "\IeC {\CYRZ }" "З" :string) +(merge-rule "\IeC {\CYRZH }" "Ж" :string) +(merge-rule "\IeC {\cyra }" "а" :string) +(merge-rule "\IeC {\cyrb }" "б" :string) +(merge-rule "\IeC {\cyrc }" "ц" :string) +(merge-rule "\IeC {\cyrch }" "ч" :string) +(merge-rule "\IeC {\cyrd }" "д" :string) +(merge-rule "\IeC {\cyrdje }" "ђ" :string) +(merge-rule "\IeC {\cyrdze }" "ѕ" :string) +(merge-rule "\IeC {\cyrdzhe }" "џ" :string) +(merge-rule "\IeC {\cyre }" "е" :string) +(merge-rule "\IeC {\cyrerev }" "э" :string) +(merge-rule "\IeC {\cyrery }" "ы" :string) +(merge-rule "\IeC {\cyrf }" "ф" :string) +(merge-rule "\IeC {\cyrg }" "г" :string) +(merge-rule "\IeC {\cyrgup }" "ґ" :string) +(merge-rule "\IeC {\cyrh }" "х" :string) +(merge-rule "\IeC {\cyrhrdsn }" "ъ" :string) +(merge-rule "\IeC {\cyri }" "и" :string) +(merge-rule "\IeC {\cyrie }" "є" :string) +(merge-rule "\IeC {\cyrii }" "і" :string) +(merge-rule "\IeC {\cyrishrt }" "й" :string) +(merge-rule "\IeC {\cyrje }" "ј" :string) +(merge-rule "\IeC {\cyrk }" "к" :string) +(merge-rule "\IeC {\cyrl }" "л" :string) +(merge-rule "\IeC {\cyrlje }" "љ" :string) +(merge-rule "\IeC {\cyrm }" "м" :string) +(merge-rule "\IeC {\cyrn }" "н" :string) +(merge-rule "\IeC {\cyrnje }" "њ" :string) +(merge-rule "\IeC {\cyro }" "о" :string) +(merge-rule "\IeC {\cyrp }" "п" :string) +(merge-rule "\IeC {\cyrr }" "р" :string) +(merge-rule "\IeC {\cyrs }" "с" :string) +(merge-rule "\IeC {\cyrsftsn }" "ь" :string) +(merge-rule "\IeC {\cyrsh }" "ш" :string) +(merge-rule "\IeC {\cyrshch }" "щ" :string) +(merge-rule "\IeC {\cyrt }" "т" :string) +(merge-rule "\IeC {\cyrtshe }" "ћ" :string) +(merge-rule "\IeC {\cyru }" "у" :string) +(merge-rule "\IeC {\cyrushrt }" "ў" :string) +(merge-rule "\IeC {\cyrv }" "в" :string) +(merge-rule "\IeC {\cyrya }" "я" :string) +(merge-rule "\IeC {\cyryi }" "ї" :string) +(merge-rule "\IeC {\cyryo }" "ё" :string) +(merge-rule "\IeC {\cyryu }" "ю" :string) +(merge-rule "\IeC {\cyrz }" "з" :string) +(merge-rule "\IeC {\cyrzh }" "ж" :string) diff --git a/LICRlatin2utf8.xdy b/LICRlatin2utf8.xdy new file mode 100644 index 0000000..1d76825 --- /dev/null +++ b/LICRlatin2utf8.xdy @@ -0,0 +1,239 @@ +;; style file for xindy +;; filename: LICRlatin2utf8.xdy +;; description: style file for xindy which maps back LaTeX Internal +;; Character Representation of letters (as arising in .idx index +;; file) to UTF-8 encoding for correct sorting by xindy. +;; usage: for use with the pdflatex engine, +;; *not* for use with xelatex or lualatex. +;; +;; This is based upon xindy's distributed file tex/inputenc/utf8.xdy. +;; The modifications include: +;; +;; - Updates for compatibility with current LaTeX macro encoding. +;; +;; - Systematic usage of the \IeC {...} mark-up, because mark-up in +;; tex/inputenc/utf8.xdy was using it on seemingly random basis, and +;; Sphinx coercing of xindy usability for both Latin and Cyrillic scripts +;; with pdflatex requires its systematic presence here. +;; +;; - Support for some extra letters: Ÿ, Ŋ, ŋ, Œ, œ, IJ, ij, ȷ and ẞ. +;; +;; Indeed Sphinx needs to support for pdflatex engine all Unicode letters +;; available in TeX T1 font encoding. The above letters are found in +;; that encoding but not in the Latin1, 2, 3 charsets which are those +;; covered by original tex/inputenc/utf8.xdy. +;; +;; - There is a problem that ȷ is not supported out-of-the box by LaTeX +;; with inputenc, one must add explicitly +;; \DeclareUnicodeCharacter{0237}{\j} +;; to preamble of LaTeX document. However this character is not supported +;; by the TeX "times" font used by default by Sphinx for pdflatex engine. +;; +;; **Update**: since LaTeX 2018/12/01, the \j as well as \SS, \k{} and +;; \.{} need no extra user declaration anymore. +;; +;; - ẞ needs \DeclareUnicodeCharacter{1E9E}{\SS} (but ß needs no extra set-up). +;; +;; - U+02DB (˛) and U+02D9 (˙) are also not supported by inputenc +;; out of the box and require +;; \DeclareUnicodeCharacter{02DB}{\k{}} +;; \DeclareUnicodeCharacter{02D9}{\.{}} +;; to be added to preamble. +;; +;; - U+0127 ħ and U+0126 Ħ are absent from TeX T1+TS1 font encodings. +;; +;; - Characters Ŋ and ŋ are not supported by TeX font "times" used by +;; default by Sphinx for pdflatex engine but they are supported by +;; some TeX fonts, in particular by the default LaTeX font for T1 +;; encoding. +;; +;; - " and ~ must be escaped as ~" and resp. ~~ in xindy merge rules. +;; +;; Contributed by the Sphinx team, July 2018. +;; +;; See sphinx.xdy for superior figures, as they are escaped by LaTeX writer. +(merge-rule "\IeC {\textonesuperior }" "¹" :string) +(merge-rule "\IeC {\texttwosuperior }" "²" :string) +(merge-rule "\IeC {\textthreesuperior }" "³" :string) +(merge-rule "\IeC {\'a}" "á" :string) +(merge-rule "\IeC {\'A}" "Á" :string) +(merge-rule "\IeC {\`a}" "à" :string) +(merge-rule "\IeC {\`A}" "À" :string) +(merge-rule "\IeC {\^a}" "â" :string) +(merge-rule "\IeC {\^A}" "Â" :string) +(merge-rule "\IeC {\~"a}" "ä" :string) +(merge-rule "\IeC {\~"A}" "Ä" :string) +(merge-rule "\IeC {\~~a}" "ã" :string) +(merge-rule "\IeC {\~~A}" "Ã" :string) +(merge-rule "\IeC {\c c}" "ç" :string) +(merge-rule "\IeC {\c C}" "Ç" :string) +(merge-rule "\IeC {\'c}" "ć" :string) +(merge-rule "\IeC {\'C}" "Ć" :string) +(merge-rule "\IeC {\^c}" "ĉ" :string) +(merge-rule "\IeC {\^C}" "Ĉ" :string) +(merge-rule "\IeC {\.c}" "ċ" :string) +(merge-rule "\IeC {\.C}" "Ċ" :string) +(merge-rule "\IeC {\c s}" "ş" :string) +(merge-rule "\IeC {\c S}" "Ş" :string) +(merge-rule "\IeC {\c t}" "ţ" :string) +(merge-rule "\IeC {\c T}" "Ţ" :string) +(merge-rule "\IeC {\-}" "­" :string); soft hyphen +(merge-rule "\IeC {\textdiv }" "÷" :string) +(merge-rule "\IeC {\'e}" "é" :string) +(merge-rule "\IeC {\'E}" "É" :string) +(merge-rule "\IeC {\`e}" "è" :string) +(merge-rule "\IeC {\`E}" "È" :string) +(merge-rule "\IeC {\^e}" "ê" :string) +(merge-rule "\IeC {\^E}" "Ê" :string) +(merge-rule "\IeC {\~"e}" "ë" :string) +(merge-rule "\IeC {\~"E}" "Ë" :string) +(merge-rule "\IeC {\^g}" "ĝ" :string) +(merge-rule "\IeC {\^G}" "Ĝ" :string) +(merge-rule "\IeC {\.g}" "ġ" :string) +(merge-rule "\IeC {\.G}" "Ġ" :string) +(merge-rule "\IeC {\^h}" "ĥ" :string) +(merge-rule "\IeC {\^H}" "Ĥ" :string) +(merge-rule "\IeC {\H o}" "ő" :string) +(merge-rule "\IeC {\H O}" "Ő" :string) +(merge-rule "\IeC {\textacutedbl }" "˝" :string) +(merge-rule "\IeC {\H u}" "ű" :string) +(merge-rule "\IeC {\H U}" "Ű" :string) +(merge-rule "\IeC {\ae }" "æ" :string) +(merge-rule "\IeC {\AE }" "Æ" :string) +(merge-rule "\IeC {\textcopyright }" "©" :string) +(merge-rule "\IeC {\c \ }" "¸" :string) +(merge-rule "\IeC {\dh }" "ð" :string) +(merge-rule "\IeC {\DH }" "Ð" :string) +(merge-rule "\IeC {\dj }" "đ" :string) +(merge-rule "\IeC {\DJ }" "Đ" :string) +(merge-rule "\IeC {\guillemotleft }" "«" :string) +(merge-rule "\IeC {\guillemotright }" "»" :string) +(merge-rule "\IeC {\'\i }" "í" :string) +(merge-rule "\IeC {\`\i }" "ì" :string) +(merge-rule "\IeC {\^\i }" "î" :string) +(merge-rule "\IeC {\~"\i }" "ï" :string) +(merge-rule "\IeC {\i }" "ı" :string) +(merge-rule "\IeC {\^\j }" "ĵ" :string) +(merge-rule "\IeC {\k {}}" "˛" :string) +(merge-rule "\IeC {\l }" "ł" :string) +(merge-rule "\IeC {\L }" "Ł" :string) +(merge-rule "\IeC {\nobreakspace }" " " :string) +(merge-rule "\IeC {\o }" "ø" :string) +(merge-rule "\IeC {\O }" "Ø" :string) +(merge-rule "\IeC {\textsterling }" "£" :string) +(merge-rule "\IeC {\textparagraph }" "¶" :string) +(merge-rule "\IeC {\ss }" "ß" :string) +(merge-rule "\IeC {\textsection }" "§" :string) +(merge-rule "\IeC {\textbrokenbar }" "¦" :string) +(merge-rule "\IeC {\textcent }" "¢" :string) +(merge-rule "\IeC {\textcurrency }" "¤" :string) +(merge-rule "\IeC {\textdegree }" "°" :string) +(merge-rule "\IeC {\textexclamdown }" "¡" :string) +(merge-rule "\IeC {\texthbar }" "ħ" :string) +(merge-rule "\IeC {\textHbar }" "Ħ" :string) +(merge-rule "\IeC {\textonehalf }" "½" :string) +(merge-rule "\IeC {\textonequarter }" "¼" :string) +(merge-rule "\IeC {\textordfeminine }" "ª" :string) +(merge-rule "\IeC {\textordmasculine }" "º" :string) +(merge-rule "\IeC {\textperiodcentered }" "·" :string) +(merge-rule "\IeC {\textquestiondown }" "¿" :string) +(merge-rule "\IeC {\textregistered }" "®" :string) +(merge-rule "\IeC {\textthreequarters }" "¾" :string) +(merge-rule "\IeC {\textyen }" "¥" :string) +(merge-rule "\IeC {\th }" "þ" :string) +(merge-rule "\IeC {\TH }" "Þ" :string) +(merge-rule "\IeC {\'I}" "Í" :string) +(merge-rule "\IeC {\`I}" "Ì" :string) +(merge-rule "\IeC {\^I}" "Î" :string) +(merge-rule "\IeC {\~"I}" "Ï" :string) +(merge-rule "\IeC {\.I}" "İ" :string) +(merge-rule "\IeC {\^J}" "Ĵ" :string) +(merge-rule "\IeC {\k a}" "ą" :string) +(merge-rule "\IeC {\k A}" "Ą" :string) +(merge-rule "\IeC {\k e}" "ę" :string) +(merge-rule "\IeC {\k E}" "Ę" :string) +(merge-rule "\IeC {\'l}" "ĺ" :string) +(merge-rule "\IeC {\'L}" "Ĺ" :string) +(merge-rule "\IeC {\textlnot }" "¬" :string) +(merge-rule "\IeC {\textmu }" "µ" :string) +(merge-rule "\IeC {\'n}" "ń" :string) +(merge-rule "\IeC {\'N}" "Ń" :string) +(merge-rule "\IeC {\~~n}" "ñ" :string) +(merge-rule "\IeC {\~~N}" "Ñ" :string) +(merge-rule "\IeC {\'o}" "ó" :string) +(merge-rule "\IeC {\'O}" "Ó" :string) +(merge-rule "\IeC {\`o}" "ò" :string) +(merge-rule "\IeC {\`O}" "Ò" :string) +(merge-rule "\IeC {\^o}" "ô" :string) +(merge-rule "\IeC {\^O}" "Ô" :string) +(merge-rule "\IeC {\~"o}" "ö" :string) +(merge-rule "\IeC {\~"O}" "Ö" :string) +(merge-rule "\IeC {\~~o}" "õ" :string) +(merge-rule "\IeC {\~~O}" "Õ" :string) +(merge-rule "\IeC {\textpm }" "±" :string) +(merge-rule "\IeC {\r a}" "å" :string) +(merge-rule "\IeC {\r A}" "Å" :string) +(merge-rule "\IeC {\'r}" "ŕ" :string) +(merge-rule "\IeC {\'R}" "Ŕ" :string) +(merge-rule "\IeC {\r u}" "ů" :string) +(merge-rule "\IeC {\r U}" "Ů" :string) +(merge-rule "\IeC {\'s}" "ś" :string) +(merge-rule "\IeC {\'S}" "Ś" :string) +(merge-rule "\IeC {\^s}" "ŝ" :string) +(merge-rule "\IeC {\^S}" "Ŝ" :string) +(merge-rule "\IeC {\textasciidieresis }" "¨" :string) +(merge-rule "\IeC {\textasciimacron }" "¯" :string) +(merge-rule "\IeC {\.{}}" "˙" :string) +(merge-rule "\IeC {\textasciiacute }" "´" :string) +(merge-rule "\IeC {\texttimes }" "×" :string) +(merge-rule "\IeC {\u a}" "ă" :string) +(merge-rule "\IeC {\u A}" "Ă" :string) +(merge-rule "\IeC {\u g}" "ğ" :string) +(merge-rule "\IeC {\u G}" "Ğ" :string) +(merge-rule "\IeC {\textasciibreve }" "˘" :string) +(merge-rule "\IeC {\'u}" "ú" :string) +(merge-rule "\IeC {\'U}" "Ú" :string) +(merge-rule "\IeC {\`u}" "ù" :string) +(merge-rule "\IeC {\`U}" "Ù" :string) +(merge-rule "\IeC {\^u}" "û" :string) +(merge-rule "\IeC {\^U}" "Û" :string) +(merge-rule "\IeC {\~"u}" "ü" :string) +(merge-rule "\IeC {\~"U}" "Ü" :string) +(merge-rule "\IeC {\u u}" "ŭ" :string) +(merge-rule "\IeC {\u U}" "Ŭ" :string) +(merge-rule "\IeC {\v c}" "č" :string) +(merge-rule "\IeC {\v C}" "Č" :string) +(merge-rule "\IeC {\v d}" "ď" :string) +(merge-rule "\IeC {\v D}" "Ď" :string) +(merge-rule "\IeC {\v e}" "ě" :string) +(merge-rule "\IeC {\v E}" "Ě" :string) +(merge-rule "\IeC {\v l}" "ľ" :string) +(merge-rule "\IeC {\v L}" "Ľ" :string) +(merge-rule "\IeC {\v n}" "ň" :string) +(merge-rule "\IeC {\v N}" "Ň" :string) +(merge-rule "\IeC {\v r}" "ř" :string) +(merge-rule "\IeC {\v R}" "Ř" :string) +(merge-rule "\IeC {\v s}" "š" :string) +(merge-rule "\IeC {\v S}" "Š" :string) +(merge-rule "\IeC {\textasciicaron }" "ˇ" :string) +(merge-rule "\IeC {\v t}" "ť" :string) +(merge-rule "\IeC {\v T}" "Ť" :string) +(merge-rule "\IeC {\v z}" "ž" :string) +(merge-rule "\IeC {\v Z}" "Ž" :string) +(merge-rule "\IeC {\'y}" "ý" :string) +(merge-rule "\IeC {\'Y}" "Ý" :string) +(merge-rule "\IeC {\~"y}" "ÿ" :string) +(merge-rule "\IeC {\'z}" "ź" :string) +(merge-rule "\IeC {\'Z}" "Ź" :string) +(merge-rule "\IeC {\.z}" "ż" :string) +(merge-rule "\IeC {\.Z}" "Ż" :string) +;; letters not in Latin1, 2, 3 but available in TeX T1 font encoding +(merge-rule "\IeC {\~"Y}" "Ÿ" :string) +(merge-rule "\IeC {\NG }" "Ŋ" :string) +(merge-rule "\IeC {\ng }" "ŋ" :string) +(merge-rule "\IeC {\OE }" "Œ" :string) +(merge-rule "\IeC {\oe }" "œ" :string) +(merge-rule "\IeC {\IJ }" "IJ" :string) +(merge-rule "\IeC {\ij }" "ij" :string) +(merge-rule "\IeC {\j }" "ȷ" :string) +(merge-rule "\IeC {\SS }" "ẞ" :string) diff --git a/LatinRules.xdy b/LatinRules.xdy new file mode 100644 index 0000000..99f14a2 --- /dev/null +++ b/LatinRules.xdy @@ -0,0 +1,607 @@ +;; style file for xindy +;; filename: LatinRules.xdy +;; +;; It is based upon xindy's files lang/general/utf8.xdy and +;; lang/general/utf8-lang.xdy which implement +;; "a general sorting order for Western European languages" +;; +;; The aim for Sphinx is to be able to index in a Cyrillic document +;; also terms using the Latin alphabets, inclusive of letters +;; with diacritics. To this effect the xindy rules from lang/general +;; got manually re-coded to avoid collisions with the encoding +;; done by xindy for sorting words in Cyrillic languages, which was +;; observed not to use bytes with octal encoding 0o266 or higher. +;; +;; So here we use only 0o266 or higher bytes. +;; (Ŋ, ŋ, IJ, and ij are absent from +;; lang/general/utf8.xdy and not included here) +;; Contributed by the Sphinx team, 2018. + +(define-letter-group "A" :prefixes ("")) +(define-letter-group "B" :after "A" :prefixes ("")) +(define-letter-group "C" :after "B" :prefixes ("")) +(define-letter-group "D" :after "C" :prefixes ("")) +(define-letter-group "E" :after "D" :prefixes ("")) +(define-letter-group "F" :after "E" :prefixes ("")) +(define-letter-group "G" :after "F" :prefixes ("")) +(define-letter-group "H" :after "G" :prefixes ("")) +(define-letter-group "I" :after "H" :prefixes ("")) +(define-letter-group "J" :after "I" :prefixes ("")) +(define-letter-group "K" :after "J" :prefixes ("")) +(define-letter-group "L" :after "K" :prefixes ("")) +(define-letter-group "M" :after "L" :prefixes ("")) +(define-letter-group "N" :after "M" :prefixes ("")) +(define-letter-group "O" :after "N" :prefixes ("")) +(define-letter-group "P" :after "O" :prefixes ("")) +(define-letter-group "Q" :after "P" :prefixes ("")) +(define-letter-group "R" :after "Q" :prefixes ("")) +(define-letter-group "S" :after "R" :prefixes ("")) +(define-letter-group "T" :after "S" :prefixes ("")) +(define-letter-group "U" :after "T" :prefixes ("")) +(define-letter-group "V" :after "U" :prefixes ("")) +(define-letter-group "W" :after "V" :prefixes ("")) +(define-letter-group "X" :after "W" :prefixes ("")) +(define-letter-group "Y" :after "X" :prefixes ("")) +(define-letter-group "Z" :after "Y" :prefixes ("")) + +(define-rule-set "sphinx-xy-alphabetize" + + :rules (("À" "" :string) + ("Ă" "" :string) + ("â" "" :string) + ("Ä" "" :string) + ("à" "" :string) + ("Å" "" :string) + ("Ã" "" :string) + ("Á" "" :string) + ("á" "" :string) + ("ã" "" :string) + ("Â" "" :string) + ("ă" "" :string) + ("å" "" :string) + ("ą" "" :string) + ("ä" "" :string) + ("Ą" "" :string) + ("æ" "" :string) + ("Æ" "" :string) + ("ć" "" :string) + ("ĉ" "" :string) + ("ç" "" :string) + ("Č" "" :string) + ("č" "" :string) + ("Ĉ" "" :string) + ("Ç" "" :string) + ("Ć" "" :string) + ("ď" "" :string) + ("Đ" "" :string) + ("Ď" "" :string) + ("đ" "" :string) + ("ê" "" :string) + ("Ę" "" :string) + ("Ě" "" :string) + ("ë" "" :string) + ("ě" "" :string) + ("é" "" :string) + ("È" "" :string) + ("Ë" "" :string) + ("É" "" :string) + ("è" "" :string) + ("Ê" "" :string) + ("ę" "" :string) + ("ĝ" "" :string) + ("ğ" "" :string) + ("Ğ" "" :string) + ("Ĝ" "" :string) + ("ĥ" "" :string) + ("Ĥ" "" :string) + ("Ï" "" :string) + ("Í" "" :string) + ("ï" "" :string) + ("Î" "" :string) + ("î" "" :string) + ("ı" "" :string) + ("İ" "" :string) + ("í" "" :string) + ("Ì" "" :string) + ("ì" "" :string) + ("Ĵ" "" :string) + ("ĵ" "" :string) + ("ł" "" :string) + ("Ł" "" :string) + ("ľ" "" :string) + ("Ľ" "" :string) + ("ń" "" :string) + ("Ń" "" :string) + ("ñ" "" :string) + ("ň" "" :string) + ("Ñ" "" :string) + ("Ň" "" :string) + ("Õ" "" :string) + ("Ő" "" :string) + ("ó" "" :string) + ("ö" "" :string) + ("ô" "" :string) + ("ő" "" :string) + ("Ø" "" :string) + ("Ö" "" :string) + ("õ" "" :string) + ("Ô" "" :string) + ("ø" "" :string) + ("Ó" "" :string) + ("Ò" "" :string) + ("ò" "" :string) + ("œ" "ĺ" :string) + ("Œ" "ĺ" :string) + ("Ř" "" :string) + ("ř" "" :string) + ("Ŕ" "" :string) + ("ŕ" "" :string) + ("ŝ" "" :string) + ("Ś" "" :string) + ("ș" "" :string) + ("ş" "" :string) + ("Ŝ" "" :string) + ("ś" "" :string) + ("Ș" "" :string) + ("š" "" :string) + ("Ş" "" :string) + ("Š" "" :string) + ("ß" "" :string) + ("Ț" "" :string) + ("Ť" "" :string) + ("ț" "" :string) + ("ť" "" :string) + ("û" "" :string) + ("ŭ" "" :string) + ("ů" "" :string) + ("ű" "" :string) + ("ù" "" :string) + ("Ŭ" "" :string) + ("Ù" "" :string) + ("Ű" "" :string) + ("Ü" "" :string) + ("Ů" "" :string) + ("ú" "" :string) + ("Ú" "" :string) + ("Û" "" :string) + ("ü" "" :string) + ("ÿ" "" :string) + ("Ý" "" :string) + ("Ÿ" "" :string) + ("ý" "" :string) + ("Ż" "" :string) + ("Ž" "" :string) + ("Ź" "" :string) + ("ž" "" :string) + ("ż" "" :string) + ("ź" "" :string) + ("a" "" :string) + ("A" "" :string) + ("b" "" :string) + ("B" "" :string) + ("c" "" :string) + ("C" "" :string) + ("d" "" :string) + ("D" "" :string) + ("e" "" :string) + ("E" "" :string) + ("F" "" :string) + ("f" "" :string) + ("G" "" :string) + ("g" "" :string) + ("H" "" :string) + ("h" "" :string) + ("i" "" :string) + ("I" "" :string) + ("J" "" :string) + ("j" "" :string) + ("K" "" :string) + ("k" "" :string) + ("L" "" :string) + ("l" "" :string) + ("M" "" :string) + ("m" "" :string) + ("n" "" :string) + ("N" "" :string) + ("O" "" :string) + ("o" "" :string) + ("p" "" :string) + ("P" "" :string) + ("Q" "" :string) + ("q" "" :string) + ("r" "" :string) + ("R" "" :string) + ("S" "" :string) + ("s" "" :string) + ("t" "" :string) + ("T" "" :string) + ("u" "" :string) + ("U" "" :string) + ("v" "" :string) + ("V" "" :string) + ("W" "" :string) + ("w" "" :string) + ("x" "" :string) + ("X" "" :string) + ("Y" "" :string) + ("y" "" :string) + ("z" "" :string) + ("Z" "" :string) + )) + +(define-rule-set "sphinx-xy-resolve-diacritics" + + :rules (("Ĥ" "" :string) + ("ó" "" :string) + ("ľ" "" :string) + ("Ř" "" :string) + ("ĝ" "" :string) + ("ď" "" :string) + ("Ě" "" :string) + ("ĥ" "" :string) + ("Č" "" :string) + ("Ĵ" "" :string) + ("ě" "" :string) + ("ž" "" :string) + ("Ď" "" :string) + ("ř" "" :string) + ("Ž" "" :string) + ("ı" "" :string) + ("Ť" "" :string) + ("á" "" :string) + ("č" "" :string) + ("Á" "" :string) + ("ň" "" :string) + ("Š" "" :string) + ("Ň" "" :string) + ("ĵ" "" :string) + ("ť" "" :string) + ("Ó" "" :string) + ("ý" "" :string) + ("Ĝ" "" :string) + ("Ú" "" :string) + ("Ľ" "" :string) + ("š" "" :string) + ("Ý" "" :string) + ("ú" "" :string) + ("Ś" "" :string) + ("ć" "" :string) + ("Ł" "" :string) + ("ł" "" :string) + ("ń" "" :string) + ("À" "" :string) + ("Ź" "" :string) + ("à" "" :string) + ("Ń" "" :string) + ("Đ" "" :string) + ("ÿ" "" :string) + ("ś" "" :string) + ("Ğ" "" :string) + ("ğ" "" :string) + ("Ù" "" :string) + ("İ" "" :string) + ("đ" "" :string) + ("ù" "" :string) + ("Ț" "" :string) + ("é" "" :string) + ("ŕ" "" :string) + ("Ć" "" :string) + ("ț" "" :string) + ("ò" "" :string) + ("ź" "" :string) + ("Ò" "" :string) + ("Ÿ" "" :string) + ("Ŕ" "" :string) + ("É" "" :string) + ("ĉ" "" :string) + ("ô" "" :string) + ("Í" "" :string) + ("ŝ" "" :string) + ("Ż" "" :string) + ("Ă" "" :string) + ("Ŝ" "" :string) + ("ñ" "" :string) + ("ŭ" "" :string) + ("í" "" :string) + ("È" "" :string) + ("Ô" "" :string) + ("Ŭ" "" :string) + ("ż" "" :string) + ("Ñ" "" :string) + ("è" "" :string) + ("Ĉ" "" :string) + ("ă" "" :string) + ("â" "" :string) + ("û" "" :string) + ("ê" "" :string) + ("Õ" "" :string) + ("õ" "" :string) + ("ș" "" :string) + ("ç" "" :string) + ("Â" "" :string) + ("Ê" "" :string) + ("Û" "" :string) + ("Ç" "" :string) + ("ì" "" :string) + ("Ì" "" :string) + ("Ș" "" :string) + ("ö" "" :string) + ("Ö" "" :string) + ("ş" "" :string) + ("ů" "" :string) + ("ë" "" :string) + ("ã" "" :string) + ("î" "" :string) + ("Î" "" :string) + ("Ã" "" :string) + ("Ş" "" :string) + ("Ů" "" :string) + ("Ë" "" :string) + ("ï" "" :string) + ("Ő" "" :string) + ("Ï" "" :string) + ("Ę" "" :string) + ("ő" "" :string) + ("Ü" "" :string) + ("Å" "" :string) + ("ü" "" :string) + ("ę" "" :string) + ("å" "" :string) + ("Ä" "" :string) + ("ű" "" :string) + ("Ø" "" :string) + ("ø" "" :string) + ("Ű" "" :string) + ("ä" "" :string) + ("Ą" "" :string) + ("ą" "" :string) + ("œ" "" :string) + ("ß" "" :string) + ("Æ" "" :string) + ("Œ" "" :string) + ("æ" "" :string) + ("e" "" :string) + ("t" "" :string) + ("L" "" :string) + ("Y" "" :string) + ("J" "" :string) + ("a" "" :string) + ("p" "" :string) + ("u" "" :string) + ("j" "" :string) + ("b" "" :string) + ("G" "" :string) + ("U" "" :string) + ("F" "" :string) + ("H" "" :string) + ("i" "" :string) + ("z" "" :string) + ("c" "" :string) + ("l" "" :string) + ("A" "" :string) + ("Q" "" :string) + ("w" "" :string) + ("D" "" :string) + ("R" "" :string) + ("d" "" :string) + ("s" "" :string) + ("r" "" :string) + ("k" "" :string) + ("v" "" :string) + ("m" "" :string) + ("P" "" :string) + ("y" "" :string) + ("K" "" :string) + ("q" "" :string) + ("S" "" :string) + ("I" "" :string) + ("C" "" :string) + ("M" "" :string) + ("Z" "" :string) + ("T" "" :string) + ("W" "" :string) + ("B" "" :string) + ("h" "" :string) + ("x" "" :string) + ("X" "" :string) + ("f" "" :string) + ("E" "" :string) + ("V" "" :string) + ("N" "" :string) + ("O" "" :string) + ("o" "" :string) + ("g" "" :string) + ("n" "" :string) + )) + +(define-rule-set "sphinx-xy-resolve-case" + + :rules (("Ú" "8" :string) + ("Ÿ" "8" :string) + ("Ç" "8" :string) + ("Ĉ" "8" :string) + ("Ŕ" "8" :string) + ("Ľ" "8" :string) + ("Ů" "8" :string) + ("Ý" "8" :string) + ("É" "8" :string) + ("Ë" "8" :string) + ("Ș" "8" :string) + ("Ì" "8" :string) + ("Ê" "8" :string) + ("Ň" "8" :string) + ("Ą" "8" :string) + ("Š" "8" :string) + ("Û" "8" :string) + ("Ş" "8" :string) + ("Ć" "8" :string) + ("Ò" "8" :string) + ("Ĝ" "8" :string) + ("Ñ" "8" :string) + ("Ó" "8" :string) + ("Î" "8" :string) + ("Á" "8" :string) + ("Ã" "8" :string) + ("Ț" "8" :string) + ("Å" "8" :string) + ("Ğ" "8" :string) + ("Ü" "8" :string) + ("È" "8" :string) + ("Ô" "8" :string) + ("İ" "8" :string) + ("Ű" "8" :string) + ("Ù" "8" :string) + ("Ŭ" "8" :string) + ("Â" "8" :string) + ("Ť" "8" :string) + ("Ń" "8" :string) + ("Ď" "8" :string) + ("Ź" "8" :string) + ("Ž" "8" :string) + ("Đ" "8" :string) + ("Ŝ" "8" :string) + ("Č" "8" :string) + ("Ĵ" "8" :string) + ("Ö" "8" :string) + ("Ø" "8" :string) + ("Ż" "8" :string) + ("Ł" "8" :string) + ("Ă" "8" :string) + ("Ě" "8" :string) + ("Ő" "8" :string) + ("Õ" "8" :string) + ("Ę" "8" :string) + ("Ï" "8" :string) + ("À" "8" :string) + ("Ĥ" "8" :string) + ("Ä" "8" :string) + ("Ś" "8" :string) + ("Ř" "8" :string) + ("Í" "8" :string) + ("Œ" "89" :string) + ("Æ" "89" :string) + ("ì" "9" :string) + ("è" "9" :string) + ("ą" "9" :string) + ("š" "9" :string) + ("ú" "9" :string) + ("å" "9" :string) + ("ă" "9" :string) + ("ę" "9" :string) + ("ü" "9" :string) + ("ź" "9" :string) + ("ò" "9" :string) + ("ť" "9" :string) + ("ț" "9" :string) + ("ĵ" "9" :string) + ("ŕ" "9" :string) + ("ż" "9" :string) + ("ä" "9" :string) + ("ý" "9" :string) + ("ù" "9" :string) + ("á" "9" :string) + ("é" "9" :string) + ("č" "9" :string) + ("ň" "9" :string) + ("ś" "9" :string) + ("ø" "9" :string) + ("í" "9" :string) + ("đ" "9" :string) + ("ı" "9" :string) + ("ğ" "9" :string) + ("î" "9" :string) + ("ã" "9" :string) + ("à" "9" :string) + ("ř" "9" :string) + ("ő" "9" :string) + ("ů" "9" :string) + ("ș" "9" :string) + ("ÿ" "9" :string) + ("ë" "9" :string) + ("ŭ" "9" :string) + ("ç" "9" :string) + ("ű" "9" :string) + ("ñ" "9" :string) + ("õ" "9" :string) + ("ě" "9" :string) + ("ş" "9" :string) + ("ž" "9" :string) + ("ĝ" "9" :string) + ("ŝ" "9" :string) + ("ń" "9" :string) + ("û" "9" :string) + ("ł" "9" :string) + ("ď" "9" :string) + ("ĥ" "9" :string) + ("ê" "9" :string) + ("ô" "9" :string) + ("ĉ" "9" :string) + ("â" "9" :string) + ("ć" "9" :string) + ("ï" "9" :string) + ("ö" "9" :string) + ("ľ" "9" :string) + ("ó" "9" :string) + ("æ" "99" :string) + ("ß" "99" :string) + ("œ" "99" :string) + ("N" "8" :string) + ("V" "8" :string) + ("O" "8" :string) + ("X" "8" :string) + ("E" "8" :string) + ("P" "8" :string) + ("K" "8" :string) + ("T" "8" :string) + ("Z" "8" :string) + ("M" "8" :string) + ("C" "8" :string) + ("I" "8" :string) + ("S" "8" :string) + ("B" "8" :string) + ("W" "8" :string) + ("D" "8" :string) + ("R" "8" :string) + ("H" "8" :string) + ("F" "8" :string) + ("Q" "8" :string) + ("A" "8" :string) + ("G" "8" :string) + ("U" "8" :string) + ("J" "8" :string) + ("Y" "8" :string) + ("L" "8" :string) + ("o" "9" :string) + ("n" "9" :string) + ("g" "9" :string) + ("x" "9" :string) + ("f" "9" :string) + ("y" "9" :string) + ("q" "9" :string) + ("h" "9" :string) + ("w" "9" :string) + ("s" "9" :string) + ("d" "9" :string) + ("v" "9" :string) + ("k" "9" :string) + ("r" "9" :string) + ("m" "9" :string) + ("z" "9" :string) + ("c" "9" :string) + ("i" "9" :string) + ("l" "9" :string) + ("b" "9" :string) + ("j" "9" :string) + ("a" "9" :string) + ("p" "9" :string) + ("u" "9" :string) + ("t" "9" :string) + ("e" "9" :string) + )) + +(use-rule-set :run 0 + :rule-set ("sphinx-xy-alphabetize")) +(use-rule-set :run 1 + :rule-set ("sphinx-xy-resolve-diacritics")) +(use-rule-set :run 2 + :rule-set ("sphinx-xy-resolve-case")) diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e4653f2 --- /dev/null +++ b/Makefile @@ -0,0 +1,64 @@ +# Makefile for Sphinx LaTeX output + +ALLDOCS = $(basename $(wildcard *.tex)) +ALLPDF = $(addsuffix .pdf,$(ALLDOCS)) +ALLDVI = $(addsuffix .dvi,$(ALLDOCS)) +ALLXDV = +ALLPS = $(addsuffix .ps,$(ALLDOCS)) + +# Prefix for archive names +ARCHIVEPREFIX = +# Additional LaTeX options (passed via variables in latexmkrc/latexmkjarc file) +export LATEXOPTS ?= +# Additional latexmk options +LATEXMKOPTS ?= +# format: pdf or dvi (used only by archive targets) +FMT = pdf + +LATEX = latexmk -dvi +PDFLATEX = latexmk -pdf -dvi- -ps- + + +%.dvi: %.tex FORCE_MAKE + $(LATEX) $(LATEXMKOPTS) '$<' + +%.ps: %.dvi + dvips '$<' + +%.pdf: %.tex FORCE_MAKE + $(PDFLATEX) $(LATEXMKOPTS) '$<' + +all: $(ALLPDF) + +all-dvi: $(ALLDVI) + +all-ps: $(ALLPS) + +all-pdf: $(ALLPDF) + +zip: all-$(FMT) + mkdir $(ARCHIVEPREFIX)docs-$(FMT) + cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT) + zip -q -r -9 $(ARCHIVEPREFIX)docs-$(FMT).zip $(ARCHIVEPREFIX)docs-$(FMT) + rm -r $(ARCHIVEPREFIX)docs-$(FMT) + +tar: all-$(FMT) + mkdir $(ARCHIVEPREFIX)docs-$(FMT) + cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT) + tar cf $(ARCHIVEPREFIX)docs-$(FMT).tar $(ARCHIVEPREFIX)docs-$(FMT) + rm -r $(ARCHIVEPREFIX)docs-$(FMT) + +gz: tar + gzip -9 < $(ARCHIVEPREFIX)docs-$(FMT).tar > $(ARCHIVEPREFIX)docs-$(FMT).tar.gz + +bz2: tar + bzip2 -9 -k $(ARCHIVEPREFIX)docs-$(FMT).tar + +xz: tar + xz -9 -k $(ARCHIVEPREFIX)docs-$(FMT).tar + +clean: + rm -f *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla *.ps *.tar *.tar.gz *.tar.bz2 *.tar.xz $(ALLPDF) $(ALLDVI) $(ALLXDV) *.fls *.fdb_latexmk + +.PHONY: all all-pdf all-dvi all-ps clean zip tar gz bz2 xz +.PHONY: FORCE_MAKE \ No newline at end of file diff --git a/ROC-Dashboard.png b/ROC-Dashboard.png new file mode 100644 index 0000000..51a21f3 Binary files /dev/null and b/ROC-Dashboard.png differ diff --git a/Sercomm.png b/Sercomm.png new file mode 100644 index 0000000..aa7cfa4 Binary files /dev/null and b/Sercomm.png differ diff --git a/Slide1.png b/Slide1.png new file mode 100644 index 0000000..2eff0af Binary files /dev/null and b/Slide1.png differ diff --git a/Slide10.png b/Slide10.png new file mode 100644 index 0000000..45d3406 Binary files /dev/null and b/Slide10.png differ diff --git a/Slide101.png b/Slide101.png new file mode 100644 index 0000000..0a3ac9f Binary files /dev/null and b/Slide101.png differ diff --git a/Slide11.png b/Slide11.png new file mode 100644 index 0000000..0ca30c8 Binary files /dev/null and b/Slide11.png differ diff --git a/Slide110.png b/Slide110.png new file mode 100644 index 0000000..8f833be Binary files /dev/null and b/Slide110.png differ diff --git a/Slide111.png b/Slide111.png new file mode 100644 index 0000000..89bfd2a Binary files /dev/null and b/Slide111.png differ diff --git a/Slide112.png b/Slide112.png new file mode 100644 index 0000000..d2cddcd Binary files /dev/null and b/Slide112.png differ diff --git a/Slide12.png b/Slide12.png new file mode 100644 index 0000000..c37b676 Binary files /dev/null and b/Slide12.png differ diff --git a/Slide121.png b/Slide121.png new file mode 100644 index 0000000..588264b Binary files /dev/null and b/Slide121.png differ diff --git a/Slide13.png b/Slide13.png new file mode 100644 index 0000000..541f605 Binary files /dev/null and b/Slide13.png differ diff --git a/Slide14.png b/Slide14.png new file mode 100644 index 0000000..97045a1 Binary files /dev/null and b/Slide14.png differ diff --git a/Slide141.png b/Slide141.png new file mode 100644 index 0000000..eae4402 Binary files /dev/null and b/Slide141.png differ diff --git a/Slide15.png b/Slide15.png new file mode 100644 index 0000000..d81d1f9 Binary files /dev/null and b/Slide15.png differ diff --git a/Slide16.png b/Slide16.png new file mode 100644 index 0000000..b387508 Binary files /dev/null and b/Slide16.png differ diff --git a/Slide17.png b/Slide17.png new file mode 100644 index 0000000..30dc9a0 Binary files /dev/null and b/Slide17.png differ diff --git a/Slide18.png b/Slide18.png new file mode 100644 index 0000000..8e41127 Binary files /dev/null and b/Slide18.png differ diff --git a/Slide19.png b/Slide19.png new file mode 100644 index 0000000..bcec024 Binary files /dev/null and b/Slide19.png differ diff --git a/Slide2.png b/Slide2.png new file mode 100644 index 0000000..18db8e6 Binary files /dev/null and b/Slide2.png differ diff --git a/Slide20.png b/Slide20.png new file mode 100644 index 0000000..9138d01 Binary files /dev/null and b/Slide20.png differ diff --git a/Slide21.png b/Slide21.png new file mode 100644 index 0000000..e8fedfa Binary files /dev/null and b/Slide21.png differ diff --git a/Slide211.png b/Slide211.png new file mode 100644 index 0000000..4653c23 Binary files /dev/null and b/Slide211.png differ diff --git a/Slide22.png b/Slide22.png new file mode 100644 index 0000000..8752c1f Binary files /dev/null and b/Slide22.png differ diff --git a/Slide23.png b/Slide23.png new file mode 100644 index 0000000..b3357fc Binary files /dev/null and b/Slide23.png differ diff --git a/Slide24.png b/Slide24.png new file mode 100644 index 0000000..dc4d36a Binary files /dev/null and b/Slide24.png differ diff --git a/Slide26.png b/Slide26.png new file mode 100644 index 0000000..0a7cfbb Binary files /dev/null and b/Slide26.png differ diff --git a/Slide27.png b/Slide27.png new file mode 100644 index 0000000..ed36452 Binary files /dev/null and b/Slide27.png differ diff --git a/Slide3.png b/Slide3.png new file mode 100644 index 0000000..bd7f316 Binary files /dev/null and b/Slide3.png differ diff --git a/Slide31.png b/Slide31.png new file mode 100644 index 0000000..28f9f76 Binary files /dev/null and b/Slide31.png differ diff --git a/Slide32.png b/Slide32.png new file mode 100644 index 0000000..ff79156 Binary files /dev/null and b/Slide32.png differ diff --git a/Slide4.png b/Slide4.png new file mode 100644 index 0000000..ae3194a Binary files /dev/null and b/Slide4.png differ diff --git a/Slide41.png b/Slide41.png new file mode 100644 index 0000000..3441aca Binary files /dev/null and b/Slide41.png differ diff --git a/Slide42.png b/Slide42.png new file mode 100644 index 0000000..db8bb53 Binary files /dev/null and b/Slide42.png differ diff --git a/Slide5.png b/Slide5.png new file mode 100644 index 0000000..152b050 Binary files /dev/null and b/Slide5.png differ diff --git a/Slide51.png b/Slide51.png new file mode 100644 index 0000000..e712e87 Binary files /dev/null and b/Slide51.png differ diff --git a/Slide52.png b/Slide52.png new file mode 100644 index 0000000..132ec0a Binary files /dev/null and b/Slide52.png differ diff --git a/Slide6.png b/Slide6.png new file mode 100644 index 0000000..9779588 Binary files /dev/null and b/Slide6.png differ diff --git a/Slide61.png b/Slide61.png new file mode 100644 index 0000000..051114d Binary files /dev/null and b/Slide61.png differ diff --git a/Slide62.png b/Slide62.png new file mode 100644 index 0000000..4b79150 Binary files /dev/null and b/Slide62.png differ diff --git a/Slide7.png b/Slide7.png new file mode 100644 index 0000000..9e1dc24 Binary files /dev/null and b/Slide7.png differ diff --git a/Slide71.png b/Slide71.png new file mode 100644 index 0000000..306a358 Binary files /dev/null and b/Slide71.png differ diff --git a/Slide72.png b/Slide72.png new file mode 100644 index 0000000..48e7d6f Binary files /dev/null and b/Slide72.png differ diff --git a/Slide8.png b/Slide8.png new file mode 100644 index 0000000..1c916a8 Binary files /dev/null and b/Slide8.png differ diff --git a/Slide81.png b/Slide81.png new file mode 100644 index 0000000..dd7de6a Binary files /dev/null and b/Slide81.png differ diff --git a/Slide82.png b/Slide82.png new file mode 100644 index 0000000..94e8003 Binary files /dev/null and b/Slide82.png differ diff --git a/Slide9.png b/Slide9.png new file mode 100644 index 0000000..742294c Binary files /dev/null and b/Slide9.png differ diff --git a/Slide91.png b/Slide91.png new file mode 100644 index 0000000..51e69f4 Binary files /dev/null and b/Slide91.png differ diff --git a/Slide92.png b/Slide92.png new file mode 100644 index 0000000..2030237 Binary files /dev/null and b/Slide92.png differ diff --git a/book.aux b/book.aux new file mode 100644 index 0000000..cf9aafb --- /dev/null +++ b/book.aux @@ -0,0 +1,325 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\babel@aux[2]{} +\@nameuse{bbl@beforestart} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\babel@aux{english}{} +\newlabel{index::doc}{{}{1}{}{section*.2}{}} +\newlabel{foreword:foreword}{{}{1}{Foreword}{chapter*.3}{}} +\newlabel{foreword::doc}{{}{1}{Foreword}{chapter*.3}{}} +\newlabel{preface:preface}{{}{3}{Preface}{chapter*.4}{}} +\newlabel{preface::doc}{{}{3}{Preface}{chapter*.4}{}} +\newlabel{preface:acknowledgements}{{}{4}{}{chapter*.4}{}} +\@writefile{toc}{\contentsline {chapter}{\numberline {1}Chapter 1: Introduction}{5}{chapter.1}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{intro:chapter-1-introduction}{{1}{5}{Chapter 1: Introduction}{chapter.1}{}} +\newlabel{intro::doc}{{1}{5}{Chapter 1: Introduction}{chapter.1}{}} +\newlabel{intro:reading-vision}{{1}{5}{Chapter 1: Introduction}{section*.5}{}} +\newlabel{intro:reading-industry4-0}{{1}{6}{Chapter 1: Introduction}{section*.6}{}} +\@writefile{toc}{\contentsline {section}{\numberline {1.1}1.1 Standardization Landscape}{6}{section.1.1}\protected@file@percent } +\newlabel{intro:standardization-landscape}{{1.1}{6}{1.1 Standardization Landscape}{section.1.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {1.2}1.2 Access Networks}{7}{section.1.2}\protected@file@percent } +\newlabel{intro:access-networks}{{1.2}{7}{1.2 Access Networks}{section.1.2}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {1.1}{\ignorespaces A global mobile network built by first aggregating traffic from hundreds of wireless base stations, and then interconnecting those aggregation points over the Internet.}}{8}{figure.1.1}\protected@file@percent } +\newlabel{intro:id3}{{1.1}{8}{A global mobile network built by first aggregating traffic from hundreds of wireless base stations, and then interconnecting those aggregation points over the Internet}{figure.1.1}{}} +\newlabel{intro:fig-global}{{1.1}{8}{A global mobile network built by first aggregating traffic from hundreds of wireless base stations, and then interconnecting those aggregation points over the Internet}{figure.1.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {1.3}1.3 Managed Cloud Service}{8}{section.1.3}\protected@file@percent } +\newlabel{intro:managed-cloud-service}{{1.3}{8}{1.3 Managed Cloud Service}{section.1.3}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {1.2}{\ignorespaces Enterprise\sphinxhyphen {}based deployment of 5G connectivity, running as a managed cloud service.}}{10}{figure.1.2}\protected@file@percent } +\newlabel{intro:id4}{{1.2}{10}{Enterprise\sphinxhyphen {}based deployment of 5G connectivity, running as a managed cloud service}{figure.1.2}{}} +\newlabel{intro:fig-enterprise}{{1.2}{10}{Enterprise\sphinxhyphen {}based deployment of 5G connectivity, running as a managed cloud service}{figure.1.2}{}} +\newlabel{intro:reading-cord}{{1.3}{10}{1.3 Managed Cloud Service}{section*.7}{}} +\newlabel{intro:reading-devops}{{1.3}{11}{1.3 Managed Cloud Service}{section*.8}{}} +\@writefile{toc}{\contentsline {section}{\numberline {1.4}1.4 Beyond 5G}{11}{section.1.4}\protected@file@percent } +\newlabel{intro:beyond-5g}{{1.4}{11}{1.4 Beyond 5G}{section.1.4}{}} +\@writefile{toc}{\contentsline {chapter}{\numberline {2}Chapter 2: Architecture}{13}{chapter.2}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{arch:chapter-2-architecture}{{2}{13}{Chapter 2: Architecture}{chapter.2}{}} +\newlabel{arch::doc}{{2}{13}{Chapter 2: Architecture}{chapter.2}{}} +\newlabel{arch:reading-terminology}{{2}{13}{Chapter 2: Architecture}{section*.9}{}} +\@writefile{toc}{\contentsline {section}{\numberline {2.1}2.1 Overview}{13}{section.2.1}\protected@file@percent } +\newlabel{arch:overview}{{2.1}{13}{2.1 Overview}{section.2.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.1}{\ignorespaces Mobile cellular networks consist of a Radio Access Network (RAN) and a Mobile Core.}}{14}{figure.2.1}\protected@file@percent } +\newlabel{arch:id3}{{2.1}{14}{Mobile cellular networks consist of a Radio Access Network (RAN) and a Mobile Core}{figure.2.1}{}} +\newlabel{arch:fig-cellular}{{2.1}{14}{Mobile cellular networks consist of a Radio Access Network (RAN) and a Mobile Core}{figure.2.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.2}{\ignorespaces Mobile Core divided into a Control Plane and a User Plane, an architectural feature known as CUPS: Control and User Plane Separation.}}{15}{figure.2.2}\protected@file@percent } +\newlabel{arch:id4}{{2.2}{15}{Mobile Core divided into a Control Plane and a User Plane, an architectural feature known as CUPS: Control and User Plane Separation}{figure.2.2}{}} +\newlabel{arch:fig-cups}{{2.2}{15}{Mobile Core divided into a Control Plane and a User Plane, an architectural feature known as CUPS: Control and User Plane Separation}{figure.2.2}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.3}{\ignorespaces Different usage domains (e.g., IoT and Video Streaming) instantiate distinct \sphinxstyleemphasis {network slices} to connect a set of devices with one or more applications.}}{16}{figure.2.3}\protected@file@percent } +\newlabel{arch:id5}{{2.3}{16}{Different usage domains (e.g., IoT and Video Streaming) instantiate distinct \sphinxstyleemphasis {network slices} to connect a set of devices with one or more applications}{figure.2.3}{}} +\newlabel{arch:fig-slice}{{2.3}{16}{Different usage domains (e.g., IoT and Video Streaming) instantiate distinct \sphinxstyleemphasis {network slices} to connect a set of devices with one or more applications}{figure.2.3}{}} +\@writefile{toc}{\contentsline {section}{\numberline {2.2}2.2 Radio Transmission}{16}{section.2.2}\protected@file@percent } +\newlabel{arch:radio-transmission}{{2.2}{16}{2.2 Radio Transmission}{section.2.2}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.4}{\ignorespaces Abstractly, measures of signal quality (CQI) and declarations of intended data delivery quality (5QI) are passed up and down the RAN stack.}}{16}{figure.2.4}\protected@file@percent } +\newlabel{arch:id6}{{2.4}{16}{Abstractly, measures of signal quality (CQI) and declarations of intended data delivery quality (5QI) are passed up and down the RAN stack}{figure.2.4}{}} +\newlabel{arch:fig-quality}{{2.4}{16}{Abstractly, measures of signal quality (CQI) and declarations of intended data delivery quality (5QI) are passed up and down the RAN stack}{figure.2.4}{}} +\@writefile{toc}{\contentsline {section}{\numberline {2.3}2.3 Radio Access Network}{17}{section.2.3}\protected@file@percent } +\newlabel{arch:radio-access-network}{{2.3}{17}{2.3 Radio Access Network}{section.2.3}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.5}{\ignorespaces UE detects (and connects to) base station.}}{18}{figure.2.5}\protected@file@percent } +\newlabel{arch:id7}{{2.5}{18}{UE detects (and connects to) base station}{figure.2.5}{}} +\newlabel{arch:fig-active-ue}{{2.5}{18}{UE detects (and connects to) base station}{figure.2.5}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.6}{\ignorespaces Base Station establishes control plane connectivity between each UE and the Mobile Core.}}{18}{figure.2.6}\protected@file@percent } +\newlabel{arch:id8}{{2.6}{18}{Base Station establishes control plane connectivity between each UE and the Mobile Core}{figure.2.6}{}} +\newlabel{arch:fig-control-plane}{{2.6}{18}{Base Station establishes control plane connectivity between each UE and the Mobile Core}{figure.2.6}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.7}{\ignorespaces Base station establishes one or more tunnels between each UE and the Mobile Core’s User Plane (known in 3GPP terms as PDU session).}}{19}{figure.2.7}\protected@file@percent } +\newlabel{arch:id9}{{2.7}{19}{Base station establishes one or more tunnels between each UE and the Mobile Core’s User Plane (known in 3GPP terms as PDU session)}{figure.2.7}{}} +\newlabel{arch:fig-user-plane}{{2.7}{19}{Base station establishes one or more tunnels between each UE and the Mobile Core’s User Plane (known in 3GPP terms as PDU session)}{figure.2.7}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.8}{\ignorespaces Base Station to Mobile Core (and Base Station to Base Station) control plane tunneled over SCTP/IP and user plane tunneled over GTP/UDP/IP.}}{19}{figure.2.8}\protected@file@percent } +\newlabel{arch:id10}{{2.8}{19}{Base Station to Mobile Core (and Base Station to Base Station) control plane tunneled over SCTP/IP and user plane tunneled over GTP/UDP/IP}{figure.2.8}{}} +\newlabel{arch:fig-tunnels}{{2.8}{19}{Base Station to Mobile Core (and Base Station to Base Station) control plane tunneled over SCTP/IP and user plane tunneled over GTP/UDP/IP}{figure.2.8}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.9}{\ignorespaces Base Stations cooperate to implement UE hand over.}}{20}{figure.2.9}\protected@file@percent } +\newlabel{arch:id11}{{2.9}{20}{Base Stations cooperate to implement UE hand over}{figure.2.9}{}} +\newlabel{arch:fig-handover}{{2.9}{20}{Base Stations cooperate to implement UE hand over}{figure.2.9}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.10}{\ignorespaces Base Stations cooperate to implement multipath transmission (link aggregation) to UEs.}}{20}{figure.2.10}\protected@file@percent } +\newlabel{arch:id12}{{2.10}{20}{Base Stations cooperate to implement multipath transmission (link aggregation) to UEs}{figure.2.10}{}} +\newlabel{arch:fig-link-aggregation}{{2.10}{20}{Base Stations cooperate to implement multipath transmission (link aggregation) to UEs}{figure.2.10}{}} +\@writefile{toc}{\contentsline {section}{\numberline {2.4}2.4 Mobile Core}{20}{section.2.4}\protected@file@percent } +\newlabel{arch:mobile-core}{{2.4}{20}{2.4 Mobile Core}{section.2.4}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.11}{\ignorespaces Sequence of steps to establish secure Control and User Plane channels.}}{21}{figure.2.11}\protected@file@percent } +\newlabel{arch:id13}{{2.11}{21}{Sequence of steps to establish secure Control and User Plane channels}{figure.2.11}{}} +\newlabel{arch:fig-secure}{{2.11}{21}{Sequence of steps to establish secure Control and User Plane channels}{figure.2.11}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.12}{\ignorespaces Sequence of per\sphinxhyphen {}hop tunnels involved in an end\sphinxhyphen {}to\sphinxhyphen {}end User Plane channel.}}{22}{figure.2.12}\protected@file@percent } +\newlabel{arch:id14}{{2.12}{22}{Sequence of per\sphinxhyphen {}hop tunnels involved in an end\sphinxhyphen {}to\sphinxhyphen {}end User Plane channel}{figure.2.12}{}} +\newlabel{arch:fig-per-hop}{{2.12}{22}{Sequence of per\sphinxhyphen {}hop tunnels involved in an end\sphinxhyphen {}to\sphinxhyphen {}end User Plane channel}{figure.2.12}{}} +\@writefile{toc}{\contentsline {section}{\numberline {2.5}2.5 Managed Cloud Service}{23}{section.2.5}\protected@file@percent } +\newlabel{arch:managed-cloud-service}{{2.5}{23}{2.5 Managed Cloud Service}{section.2.5}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.13}{\ignorespaces High\sphinxhyphen {}level summary of the role operationalization plays in a network deployment.}}{23}{figure.2.13}\protected@file@percent } +\newlabel{arch:id15}{{2.13}{23}{High\sphinxhyphen {}level summary of the role operationalization plays in a network deployment}{figure.2.13}{}} +\newlabel{arch:fig-intent}{{2.13}{23}{High\sphinxhyphen {}level summary of the role operationalization plays in a network deployment}{figure.2.13}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2.14}{\ignorespaces Overview of Aether as a hybrid cloud, with edge apps and the 5G data plane (called \sphinxstyleemphasis {local breakout}) running on\sphinxhyphen {}prem and various management and control\sphinxhyphen {}related workloads running in a central cloud.}}{24}{figure.2.14}\protected@file@percent } +\newlabel{arch:id16}{{2.14}{24}{Overview of Aether as a hybrid cloud, with edge apps and the 5G data plane (called \sphinxstyleemphasis {local breakout}) running on\sphinxhyphen {}prem and various management and control\sphinxhyphen {}related workloads running in a central cloud}{figure.2.14}{}} +\newlabel{arch:fig-hybrid}{{2.14}{24}{Overview of Aether as a hybrid cloud, with edge apps and the 5G data plane (called \sphinxstyleemphasis {local breakout}) running on\sphinxhyphen {}prem and various management and control\sphinxhyphen {}related workloads running in a central cloud}{figure.2.14}{}} +\@writefile{toc}{\contentsline {chapter}{\numberline {3}Chapter 3: Radio Transmission}{25}{chapter.3}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{radio:chapter-3-radio-transmission}{{3}{25}{Chapter 3: Radio Transmission}{chapter.3}{}} +\newlabel{radio::doc}{{3}{25}{Chapter 3: Radio Transmission}{chapter.3}{}} +\@writefile{toc}{\contentsline {section}{\numberline {3.1}3.1 Coding and Modulation}{25}{section.3.1}\protected@file@percent } +\newlabel{radio:coding-and-modulation}{{3.1}{25}{3.1 Coding and Modulation}{section.3.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {3.1}{\ignorespaces The role of coding and modulation in mobile communication.}}{25}{figure.3.1}\protected@file@percent } +\newlabel{radio:id5}{{3.1}{25}{The role of coding and modulation in mobile communication}{figure.3.1}{}} +\newlabel{radio:fig-modulation}{{3.1}{25}{The role of coding and modulation in mobile communication}{figure.3.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {3.2}{\ignorespaces Signals propagate along multiple paths from transmitter to receiver.}}{26}{figure.3.2}\protected@file@percent } +\newlabel{radio:id6}{{3.2}{26}{Signals propagate along multiple paths from transmitter to receiver}{figure.3.2}{}} +\newlabel{radio:fig-multipath}{{3.2}{26}{Signals propagate along multiple paths from transmitter to receiver}{figure.3.2}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {3.3}{\ignorespaces Received data spread over time due to multipath variation.}}{27}{figure.3.3}\protected@file@percent } +\newlabel{radio:id7}{{3.3}{27}{Received data spread over time due to multipath variation}{figure.3.3}{}} +\newlabel{radio:fig-coherence}{{3.3}{27}{Received data spread over time due to multipath variation}{figure.3.3}{}} +\@writefile{toc}{\contentsline {section}{\numberline {3.2}3.2 Scheduler}{27}{section.3.2}\protected@file@percent } +\newlabel{radio:scheduler}{{3.2}{27}{3.2 Scheduler}{section.3.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.1}3.2.1 Multiplexing in 4G}{28}{subsection.3.2.1}\protected@file@percent } +\newlabel{radio:multiplexing-in-4g}{{3.2.1}{28}{3.2.1 Multiplexing in 4G}{subsection.3.2.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {3.4}{\ignorespaces Spectrum abstractly represented by a 2\sphinxhyphen {}D grid of schedulable Resource Elements.}}{28}{figure.3.4}\protected@file@percent } +\newlabel{radio:id8}{{3.4}{28}{Spectrum abstractly represented by a 2\sphinxhyphen {}D grid of schedulable Resource Elements}{figure.3.4}{}} +\newlabel{radio:fig-sched-grid}{{3.4}{28}{Spectrum abstractly represented by a 2\sphinxhyphen {}D grid of schedulable Resource Elements}{figure.3.4}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.2}3.2.2 Multiplexing in 5G}{29}{subsection.3.2.2}\protected@file@percent } +\newlabel{radio:multiplexing-in-5g}{{3.2.2}{29}{3.2.2 Multiplexing in 5G}{subsection.3.2.2}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {3.5}{\ignorespaces Scheduler allocates Resource Blocks to user data streams based on CQI feedback from receivers and the 5QI parameters associated with each class of service.}}{30}{figure.3.5}\protected@file@percent } +\newlabel{radio:id9}{{3.5}{30}{Scheduler allocates Resource Blocks to user data streams based on CQI feedback from receivers and the 5QI parameters associated with each class of service}{figure.3.5}{}} +\newlabel{radio:fig-scheduler}{{3.5}{30}{Scheduler allocates Resource Blocks to user data streams based on CQI feedback from receivers and the 5QI parameters associated with each class of service}{figure.3.5}{}} +\@writefile{toc}{\contentsline {section}{\numberline {3.3}3.3 Virtualized Scheduler (Slicing)}{31}{section.3.3}\protected@file@percent } +\newlabel{radio:virtualized-scheduler-slicing}{{3.3}{31}{3.3 Virtualized Scheduler (Slicing)}{section.3.3}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {3.6}{\ignorespaces Wireless Hypervisor mapping virtual resource blocks to physical resource blocks.}}{31}{figure.3.6}\protected@file@percent } +\newlabel{radio:id10}{{3.6}{31}{Wireless Hypervisor mapping virtual resource blocks to physical resource blocks}{figure.3.6}{}} +\newlabel{radio:fig-hypervisor}{{3.6}{31}{Wireless Hypervisor mapping virtual resource blocks to physical resource blocks}{figure.3.6}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {3.7}{\ignorespaces Multiple schedulers running on top of wireless hypervisor.}}{32}{figure.3.7}\protected@file@percent } +\newlabel{radio:id11}{{3.7}{32}{Multiple schedulers running on top of wireless hypervisor}{figure.3.7}{}} +\newlabel{radio:fig-multi-sched}{{3.7}{32}{Multiple schedulers running on top of wireless hypervisor}{figure.3.7}{}} +\@writefile{toc}{\contentsline {section}{\numberline {3.4}3.4 New Use Cases}{32}{section.3.4}\protected@file@percent } +\newlabel{radio:new-use-cases}{{3.4}{32}{3.4 New Use Cases}{section.3.4}{}} +\@writefile{toc}{\contentsline {chapter}{\numberline {4}Chapter 4: Radio Access Network}{35}{chapter.4}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{ran:chapter-4-radio-access-network}{{4}{35}{Chapter 4: Radio Access Network}{chapter.4}{}} +\newlabel{ran::doc}{{4}{35}{Chapter 4: Radio Access Network}{chapter.4}{}} +\@writefile{toc}{\contentsline {section}{\numberline {4.1}4.1 Packet Processing Pipeline}{35}{section.4.1}\protected@file@percent } +\newlabel{ran:packet-processing-pipeline}{{4.1}{35}{4.1 Packet Processing Pipeline}{section.4.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {4.1}{\ignorespaces RAN processing pipeline, including both user and control plane components.}}{35}{figure.4.1}\protected@file@percent } +\newlabel{ran:id5}{{4.1}{35}{RAN processing pipeline, including both user and control plane components}{figure.4.1}{}} +\newlabel{ran:fig-pipeline}{{4.1}{35}{RAN processing pipeline, including both user and control plane components}{figure.4.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {4.2}4.2 Split RAN}{36}{section.4.2}\protected@file@percent } +\newlabel{ran:split-ran}{{4.2}{36}{4.2 Split RAN}{section.4.2}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {4.2}{\ignorespaces Split RAN processing pipeline distributed across a Central Unit (CU), Distributed Unit (DU), and Radio Unit (RU).}}{37}{figure.4.2}\protected@file@percent } +\newlabel{ran:id6}{{4.2}{37}{Split RAN processing pipeline distributed across a Central Unit (CU), Distributed Unit (DU), and Radio Unit (RU)}{figure.4.2}{}} +\newlabel{ran:fig-split-ran}{{4.2}{37}{Split RAN processing pipeline distributed across a Central Unit (CU), Distributed Unit (DU), and Radio Unit (RU)}{figure.4.2}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {4.3}{\ignorespaces Split RAN hierarchy, with one CU serving multiple DUs, each of which serves multiple RUs.}}{37}{figure.4.3}\protected@file@percent } +\newlabel{ran:id7}{{4.3}{37}{Split RAN hierarchy, with one CU serving multiple DUs, each of which serves multiple RUs}{figure.4.3}{}} +\newlabel{ran:fig-ran-hierarchy}{{4.3}{37}{Split RAN hierarchy, with one CU serving multiple DUs, each of which serves multiple RUs}{figure.4.3}{}} +\newlabel{ran:reading-backhaul}{{4.2}{37}{4.2 Split RAN}{section*.10}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {4.4}{\ignorespaces Alternative depiction of the Split RAN components, showing the 3GPP\sphinxhyphen {}specified inter\sphinxhyphen {}unit interfaces.}}{38}{figure.4.4}\protected@file@percent } +\newlabel{ran:id8}{{4.4}{38}{Alternative depiction of the Split RAN components, showing the 3GPP\sphinxhyphen {}specified inter\sphinxhyphen {}unit interfaces}{figure.4.4}{}} +\newlabel{ran:fig-split-alt}{{4.4}{38}{Alternative depiction of the Split RAN components, showing the 3GPP\sphinxhyphen {}specified inter\sphinxhyphen {}unit interfaces}{figure.4.4}{}} +\newlabel{ran:reading-du-impl}{{4.2}{39}{4.2 Split RAN}{section*.11}{}} +\@writefile{toc}{\contentsline {section}{\numberline {4.3}4.3 Software\sphinxhyphen {}Defined RAN}{39}{section.4.3}\protected@file@percent } +\newlabel{ran:software-defined-ran}{{4.3}{39}{4.3 Software\sphinxhyphen {}Defined RAN}{section.4.3}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {4.5}{\ignorespaces RRC disaggregated into a Mobile Core facing control plane component (a proxy) and a Near\sphinxhyphen {}Real\sphinxhyphen {}Time Controller.}}{39}{figure.4.5}\protected@file@percent } +\newlabel{ran:id9}{{4.5}{39}{RRC disaggregated into a Mobile Core facing control plane component (a proxy) and a Near\sphinxhyphen {}Real\sphinxhyphen {}Time Controller}{figure.4.5}{}} +\newlabel{ran:fig-rrc-split}{{4.5}{39}{RRC disaggregated into a Mobile Core facing control plane component (a proxy) and a Near\sphinxhyphen {}Real\sphinxhyphen {}Time Controller}{figure.4.5}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {4.6}{\ignorespaces Example set of control applications (xApps) running on top of Near\sphinxhyphen {}Real\sphinxhyphen {}Time RAN Controller (RIC), controlling a distributed set of Split RAN elements (CU, DU, RU).}}{40}{figure.4.6}\protected@file@percent } +\newlabel{ran:id10}{{4.6}{40}{Example set of control applications (xApps) running on top of Near\sphinxhyphen {}Real\sphinxhyphen {}Time RAN Controller (RIC), controlling a distributed set of Split RAN elements (CU, DU, RU)}{figure.4.6}{}} +\newlabel{ran:fig-ran-controller}{{4.6}{40}{Example set of control applications (xApps) running on top of Near\sphinxhyphen {}Real\sphinxhyphen {}Time RAN Controller (RIC), controlling a distributed set of Split RAN elements (CU, DU, RU)}{figure.4.6}{}} +\newlabel{ran:reading-b4}{{4.3}{41}{4.3 Software\sphinxhyphen {}Defined RAN}{section*.12}{}} +\@writefile{toc}{\contentsline {section}{\numberline {4.4}4.4 Near Real\sphinxhyphen {}Time RIC}{42}{section.4.4}\protected@file@percent } +\newlabel{ran:near-real-time-ric}{{4.4}{42}{4.4 Near Real\sphinxhyphen {}Time RIC}{section.4.4}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {4.7}{\ignorespaces O\sphinxhyphen {}RAN compliant RAN Intelligent Controller (RIC) built by adapting and extending ONOS.}}{42}{figure.4.7}\protected@file@percent } +\newlabel{ran:id11}{{4.7}{42}{O\sphinxhyphen {}RAN compliant RAN Intelligent Controller (RIC) built by adapting and extending ONOS}{figure.4.7}{}} +\newlabel{ran:fig-ric}{{4.7}{42}{O\sphinxhyphen {}RAN compliant RAN Intelligent Controller (RIC) built by adapting and extending ONOS}{figure.4.7}{}} +\newlabel{ran:reading-onos}{{4.4}{43}{4.4 Near Real\sphinxhyphen {}Time RIC}{section*.13}{}} +\@writefile{toc}{\contentsline {section}{\numberline {4.5}4.5 Control Loops}{44}{section.4.5}\protected@file@percent } +\newlabel{ran:control-loops}{{4.5}{44}{4.5 Control Loops}{section.4.5}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {4.8}{\ignorespaces First tier of RAN disaggregation: Split RAN.}}{44}{figure.4.8}\protected@file@percent } +\newlabel{ran:id12}{{4.8}{44}{First tier of RAN disaggregation: Split RAN}{figure.4.8}{}} +\newlabel{ran:fig-disagg1}{{4.8}{44}{First tier of RAN disaggregation: Split RAN}{figure.4.8}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {4.9}{\ignorespaces Second tier of RAN disaggregation: CUPS.}}{44}{figure.4.9}\protected@file@percent } +\newlabel{ran:id13}{{4.9}{44}{Second tier of RAN disaggregation: CUPS}{figure.4.9}{}} +\newlabel{ran:fig-disagg2}{{4.9}{44}{Second tier of RAN disaggregation: CUPS}{figure.4.9}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {4.10}{\ignorespaces Third tier of RAN disaggregation: SDN.}}{45}{figure.4.10}\protected@file@percent } +\newlabel{ran:id14}{{4.10}{45}{Third tier of RAN disaggregation: SDN}{figure.4.10}{}} +\newlabel{ran:fig-ctl-loops}{{4.10}{45}{Third tier of RAN disaggregation: SDN}{figure.4.10}{}} +\@writefile{toc}{\contentsline {chapter}{\numberline {5}Chapter 5: Mobile Core}{47}{chapter.5}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{core:chapter-5-mobile-core}{{5}{47}{Chapter 5: Mobile Core}{chapter.5}{}} +\newlabel{core::doc}{{5}{47}{Chapter 5: Mobile Core}{chapter.5}{}} +\@writefile{toc}{\contentsline {section}{\numberline {5.1}5.1 Identity Management}{47}{section.5.1}\protected@file@percent } +\newlabel{core:identity-management}{{5.1}{47}{5.1 Identity Management}{section.5.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {5.2}5.2 Functional Components}{49}{section.5.2}\protected@file@percent } +\newlabel{core:functional-components}{{5.2}{49}{5.2 Functional Components}{section.5.2}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {5.1}{\ignorespaces 5G Mobile Core (5GC), represented as a collection of microservices, where 3GPP defines the interfaces connecting the Mobile Core CP and UP to the RAN (denoted N2 and N3, respectively).}}{49}{figure.5.1}\protected@file@percent } +\newlabel{core:id3}{{5.1}{49}{5G Mobile Core (5GC), represented as a collection of microservices, where 3GPP defines the interfaces connecting the Mobile Core CP and UP to the RAN (denoted N2 and N3, respectively)}{figure.5.1}{}} +\newlabel{core:fig-5g-core}{{5.1}{49}{5G Mobile Core (5GC), represented as a collection of microservices, where 3GPP defines the interfaces connecting the Mobile Core CP and UP to the RAN (denoted N2 and N3, respectively)}{figure.5.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {5.3}5.3 Control Plane}{51}{section.5.3}\protected@file@percent } +\newlabel{core:control-plane}{{5.3}{51}{5.3 Control Plane}{section.5.3}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {5.3.1}5.3.1 SD\sphinxhyphen {}Core}{51}{subsection.5.3.1}\protected@file@percent } +\newlabel{core:sd-core}{{5.3.1}{51}{5.3.1 SD\sphinxhyphen {}Core}{subsection.5.3.1}{}} +\newlabel{core:reading-sd-core}{{5.3.1}{51}{5.3.1 SD\sphinxhyphen {}Core}{section*.14}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {5.2}{\ignorespaces SD\sphinxhyphen {}Core implementation of the Mobile Core Control Plane, including support for Standalone (SA) deployment of both 4G and 5G.}}{51}{figure.5.2}\protected@file@percent } +\newlabel{core:id4}{{5.2}{51}{SD\sphinxhyphen {}Core implementation of the Mobile Core Control Plane, including support for Standalone (SA) deployment of both 4G and 5G}{figure.5.2}{}} +\newlabel{core:fig-sd-core}{{5.2}{51}{SD\sphinxhyphen {}Core implementation of the Mobile Core Control Plane, including support for Standalone (SA) deployment of both 4G and 5G}{figure.5.2}{}} +\newlabel{core:reading-migration}{{5.3.1}{52}{5.3.1 SD\sphinxhyphen {}Core}{section*.15}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {5.3.2}5.3.2 Magma}{52}{subsection.5.3.2}\protected@file@percent } +\newlabel{core:magma}{{5.3.2}{52}{5.3.2 Magma}{subsection.5.3.2}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {5.3}{\ignorespaces Overall architecture of the Magma Mobile Core, including support for 4G and 5G, and Wi\sphinxhyphen {}Fi. There is one central Orchestrator and typically many Access Gateways (AGWs).}}{53}{figure.5.3}\protected@file@percent } +\newlabel{core:id5}{{5.3}{53}{Overall architecture of the Magma Mobile Core, including support for 4G and 5G, and Wi\sphinxhyphen {}Fi. There is one central Orchestrator and typically many Access Gateways (AGWs)}{figure.5.3}{}} +\newlabel{core:fig-magma-arch}{{5.3}{53}{Overall architecture of the Magma Mobile Core, including support for 4G and 5G, and Wi\sphinxhyphen {}Fi. There is one central Orchestrator and typically many Access Gateways (AGWs)}{figure.5.3}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {5.4}{\ignorespaces A sample Magma deployment in rural Peru, showing (a) point\sphinxhyphen {}to\sphinxhyphen {}point wireless backhaul, (b) LTE radio and antenna, (c) ruggedized embedded PC serving as AGW, and (d) solar power and battery backup for site.}}{54}{figure.5.4}\protected@file@percent } +\newlabel{core:id6}{{5.4}{54}{A sample Magma deployment in rural Peru, showing (a) point\sphinxhyphen {}to\sphinxhyphen {}point wireless backhaul, (b) LTE radio and antenna, (c) ruggedized embedded PC serving as AGW, and (d) solar power and battery backup for site}{figure.5.4}{}} +\newlabel{core:fig-magma-peru}{{5.4}{54}{A sample Magma deployment in rural Peru, showing (a) point\sphinxhyphen {}to\sphinxhyphen {}point wireless backhaul, (b) LTE radio and antenna, (c) ruggedized embedded PC serving as AGW, and (d) solar power and battery backup for site}{figure.5.4}{}} +\newlabel{core:reading-magma}{{5.3.2}{55}{5.3.2 Magma}{section*.16}{}} +\@writefile{toc}{\contentsline {section}{\numberline {5.4}5.4 User Plane}{56}{section.5.4}\protected@file@percent } +\newlabel{core:user-plane}{{5.4}{56}{5.4 User Plane}{section.5.4}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {5.4.1}5.4.1 Microservice Implementation}{57}{subsection.5.4.1}\protected@file@percent } +\newlabel{core:microservice-implementation}{{5.4.1}{57}{5.4.1 Microservice Implementation}{subsection.5.4.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {5.4.2}5.4.2 P4 Implementation}{57}{subsection.5.4.2}\protected@file@percent } +\newlabel{core:p4-implementation}{{5.4.2}{57}{5.4.2 P4 Implementation}{subsection.5.4.2}{}} +\newlabel{core:reading-p4-upf}{{5.4.2}{57}{5.4.2 P4 Implementation}{section*.17}{}} +\newlabel{core:reading-p4-qos}{{5.4.2}{58}{5.4.2 P4 Implementation}{section*.18}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {5.5}{\ignorespaces A model P4\sphinxhyphen {}based implementation of the UPF is used to generate the interface that is then used by the SMF running in the Mobile Core control plane to control the physical implementation of the UPF running on a combination of hardware switches and servers.}}{59}{figure.5.5}\protected@file@percent } +\newlabel{core:id7}{{5.5}{59}{A model P4\sphinxhyphen {}based implementation of the UPF is used to generate the interface that is then used by the SMF running in the Mobile Core control plane to control the physical implementation of the UPF running on a combination of hardware switches and servers}{figure.5.5}{}} +\newlabel{core:fig-p4-upf}{{5.5}{59}{A model P4\sphinxhyphen {}based implementation of the UPF is used to generate the interface that is then used by the SMF running in the Mobile Core control plane to control the physical implementation of the UPF running on a combination of hardware switches and servers}{figure.5.5}{}} +\@writefile{toc}{\contentsline {chapter}{\numberline {6}Chapter 6: Managed Cloud Service}{61}{chapter.6}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{cloud:chapter-6-managed-cloud-service}{{6}{61}{Chapter 6: Managed Cloud Service}{chapter.6}{}} +\newlabel{cloud::doc}{{6}{61}{Chapter 6: Managed Cloud Service}{chapter.6}{}} +\newlabel{cloud:reading-ops}{{6}{61}{Chapter 6: Managed Cloud Service}{section*.19}{}} +\@writefile{toc}{\contentsline {section}{\numberline {6.1}6.1 Building Blocks}{61}{section.6.1}\protected@file@percent } +\newlabel{cloud:building-blocks}{{6.1}{61}{6.1 Building Blocks}{section.6.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {6.1}{\ignorespaces Example building block components used to construct an edge cloud, including commodity servers and switches, interconnected by a leaf\sphinxhyphen {}spine switching fabric.}}{62}{figure.6.1}\protected@file@percent } +\newlabel{cloud:id1}{{6.1}{62}{Example building block components used to construct an edge cloud, including commodity servers and switches, interconnected by a leaf\sphinxhyphen {}spine switching fabric}{figure.6.1}{}} +\newlabel{cloud:fig-hw}{{6.1}{62}{Example building block components used to construct an edge cloud, including commodity servers and switches, interconnected by a leaf\sphinxhyphen {}spine switching fabric}{figure.6.1}{}} +\newlabel{cloud:reading-docker}{{6.1}{62}{6.1 Building Blocks}{section*.20}{}} +\newlabel{cloud:reading-k8s}{{6.1}{62}{6.1 Building Blocks}{section*.21}{}} +\newlabel{cloud:reading-helm}{{6.1}{63}{6.1 Building Blocks}{section*.22}{}} +\newlabel{cloud:reading-fleet}{{6.1}{63}{6.1 Building Blocks}{section*.23}{}} +\newlabel{cloud:reading-terraform}{{6.1}{63}{6.1 Building Blocks}{section*.24}{}} +\@writefile{toc}{\contentsline {section}{\numberline {6.2}6.2 Example Deployment}{64}{section.6.2}\protected@file@percent } +\newlabel{cloud:example-deployment}{{6.2}{64}{6.2 Example Deployment}{section.6.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.2.1}6.2.1 Edge Cloud}{64}{subsection.6.2.1}\protected@file@percent } +\newlabel{cloud:edge-cloud}{{6.2.1}{64}{6.2.1 Edge Cloud}{subsection.6.2.1}{}} +\newlabel{cloud:reading-sdn}{{6.2.1}{64}{6.2.1 Edge Cloud}{section*.25}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {6.2}{\ignorespaces Aether Connected Edge (ACE) = The cloud platform (Kubernetes and SD\sphinxhyphen {}Fabric) plus the 5G connectivity service (RAN and User Plane of Mobile Core). Dotted lines (e.g., between SD\sphinxhyphen {}RAN and the individual base stations, and between the Network OS and the individual switches) represent control relationships (e.g., SD\sphinxhyphen {}RAN controls the small cells and SD\sphinxhyphen {}Fabric controls the switches).}}{64}{figure.6.2}\protected@file@percent } +\newlabel{cloud:id2}{{6.2}{64}{Aether Connected Edge (ACE) = The cloud platform (Kubernetes and SD\sphinxhyphen {}Fabric) plus the 5G connectivity service (RAN and User Plane of Mobile Core). Dotted lines (e.g., between SD\sphinxhyphen {}RAN and the individual base stations, and between the Network OS and the individual switches) represent control relationships (e.g., SD\sphinxhyphen {}RAN controls the small cells and SD\sphinxhyphen {}Fabric controls the switches)}{figure.6.2}{}} +\newlabel{cloud:fig-ace}{{6.2}{64}{Aether Connected Edge (ACE) = The cloud platform (Kubernetes and SD\sphinxhyphen {}Fabric) plus the 5G connectivity service (RAN and User Plane of Mobile Core). Dotted lines (e.g., between SD\sphinxhyphen {}RAN and the individual base stations, and between the Network OS and the individual switches) represent control relationships (e.g., SD\sphinxhyphen {}RAN controls the small cells and SD\sphinxhyphen {}Fabric controls the switches)}{figure.6.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.2.2}6.2.2 Hybrid Cloud}{65}{subsection.6.2.2}\protected@file@percent } +\newlabel{cloud:hybrid-cloud}{{6.2.2}{65}{6.2.2 Hybrid Cloud}{subsection.6.2.2}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {6.3}{\ignorespaces Aether runs in a hybrid cloud configuration, with Control Plane of Mobile Core and the Aether Management Platform (AMP) running in the Central Cloud.}}{65}{figure.6.3}\protected@file@percent } +\newlabel{cloud:id3}{{6.3}{65}{Aether runs in a hybrid cloud configuration, with Control Plane of Mobile Core and the Aether Management Platform (AMP) running in the Central Cloud}{figure.6.3}{}} +\newlabel{cloud:fig-aether}{{6.3}{65}{Aether runs in a hybrid cloud configuration, with Control Plane of Mobile Core and the Aether Management Platform (AMP) running in the Central Cloud}{figure.6.3}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.2.3}6.2.3 Stakeholders}{66}{subsection.6.2.3}\protected@file@percent } +\newlabel{cloud:stakeholders}{{6.2.3}{66}{6.2.3 Stakeholders}{subsection.6.2.3}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.2.4}6.2.4 Alternative Configurations}{66}{subsection.6.2.4}\protected@file@percent } +\newlabel{cloud:alternative-configurations}{{6.2.4}{66}{6.2.4 Alternative Configurations}{subsection.6.2.4}{}} +\@writefile{toc}{\contentsline {section}{\numberline {6.3}6.3 Cloud Management Platform}{67}{section.6.3}\protected@file@percent } +\newlabel{cloud:cloud-management-platform}{{6.3}{67}{6.3 Cloud Management Platform}{section.6.3}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {6.4}{\ignorespaces The four subsystems that comprise AMP: Resource Provisioning, Lifecycle Management, Service Orchestrator, and Monitoring \& Telemetry.}}{68}{figure.6.4}\protected@file@percent } +\newlabel{cloud:id4}{{6.4}{68}{The four subsystems that comprise AMP: Resource Provisioning, Lifecycle Management, Service Orchestrator, and Monitoring \& Telemetry}{figure.6.4}{}} +\newlabel{cloud:fig-amp}{{6.4}{68}{The four subsystems that comprise AMP: Resource Provisioning, Lifecycle Management, Service Orchestrator, and Monitoring \& Telemetry}{figure.6.4}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {6.5}{\ignorespaces Alternative representation of the management platform, highlighting the offline and online aspects of cloud management.}}{69}{figure.6.5}\protected@file@percent } +\newlabel{cloud:id5}{{6.5}{69}{Alternative representation of the management platform, highlighting the offline and online aspects of cloud management}{figure.6.5}{}} +\newlabel{cloud:fig-2d}{{6.5}{69}{Alternative representation of the management platform, highlighting the offline and online aspects of cloud management}{figure.6.5}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.3.1}6.3.1 Resource Provisioning}{69}{subsection.6.3.1}\protected@file@percent } +\newlabel{cloud:resource-provisioning}{{6.3.1}{69}{6.3.1 Resource Provisioning}{subsection.6.3.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {6.6}{\ignorespaces Resource Provisioning in a hybrid cloud that includes both physical and virtual resources.}}{70}{figure.6.6}\protected@file@percent } +\newlabel{cloud:id6}{{6.6}{70}{Resource Provisioning in a hybrid cloud that includes both physical and virtual resources}{figure.6.6}{}} +\newlabel{cloud:fig-infra}{{6.6}{70}{Resource Provisioning in a hybrid cloud that includes both physical and virtual resources}{figure.6.6}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.3.2}6.3.2 Lifecycle Management}{70}{subsection.6.3.2}\protected@file@percent } +\newlabel{cloud:lifecycle-management}{{6.3.2}{70}{6.3.2 Lifecycle Management}{subsection.6.3.2}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {6.7}{\ignorespaces Overview of the CI/CD pipeline.}}{70}{figure.6.7}\protected@file@percent } +\newlabel{cloud:id7}{{6.7}{70}{Overview of the CI/CD pipeline}{figure.6.7}{}} +\newlabel{cloud:fig-cicd}{{6.7}{70}{Overview of the CI/CD pipeline}{figure.6.7}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.3.3}6.3.3 Service Orchestration}{71}{subsection.6.3.3}\protected@file@percent } +\newlabel{cloud:service-orchestration}{{6.3.3}{71}{6.3.3 Service Orchestration}{subsection.6.3.3}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {6.8}{\ignorespaces Example use case that requires ongoing runtime control.}}{72}{figure.6.8}\protected@file@percent } +\newlabel{cloud:id8}{{6.8}{72}{Example use case that requires ongoing runtime control}{figure.6.8}{}} +\newlabel{cloud:fig-control}{{6.8}{72}{Example use case that requires ongoing runtime control}{figure.6.8}{}} +\newlabel{cloud:reading-yang}{{6.3.3}{72}{6.3.3 Service Orchestration}{section*.26}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.3.4}6.3.4 Monitoring and Telemetry}{73}{subsection.6.3.4}\protected@file@percent } +\newlabel{cloud:monitoring-and-telemetry}{{6.3.4}{73}{6.3.4 Monitoring and Telemetry}{subsection.6.3.4}{}} +\newlabel{cloud:reading-monitor}{{6.3.4}{73}{6.3.4 Monitoring and Telemetry}{section*.27}{}} +\newlabel{cloud:reading-logging}{{6.3.4}{73}{6.3.4 Monitoring and Telemetry}{section*.28}{}} +\newlabel{cloud:reading-tracing}{{6.3.4}{73}{6.3.4 Monitoring and Telemetry}{section*.29}{}} +\@writefile{toc}{\contentsline {section}{\numberline {6.4}6.4 Connectivity API}{74}{section.6.4}\protected@file@percent } +\newlabel{cloud:connectivity-api}{{6.4}{74}{6.4 Connectivity API}{section.6.4}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.4.1}6.4.1 Enterprises}{74}{subsection.6.4.1}\protected@file@percent } +\newlabel{cloud:enterprises}{{6.4.1}{74}{6.4.1 Enterprises}{subsection.6.4.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.4.2}6.4.2 Slices}{75}{subsection.6.4.2}\protected@file@percent } +\newlabel{cloud:slices}{{6.4.2}{75}{6.4.2 Slices}{subsection.6.4.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.4.3}6.4.3 QoS Profiles}{76}{subsection.6.4.3}\protected@file@percent } +\newlabel{cloud:qos-profiles}{{6.4.3}{76}{6.4.3 QoS Profiles}{subsection.6.4.3}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.4.4}6.4.4 Other Models}{77}{subsection.6.4.4}\protected@file@percent } +\newlabel{cloud:other-models}{{6.4.4}{77}{6.4.4 Other Models}{subsection.6.4.4}{}} +\@writefile{toc}{\contentsline {chapter}{\numberline {7}About The Book}{79}{chapter.7}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{README:about-the-book}{{7}{79}{About The Book}{chapter.7}{}} +\newlabel{README::doc}{{7}{79}{About The Book}{chapter.7}{}} +\@writefile{toc}{\contentsline {section}{\numberline {7.1}Read the Book}{80}{section.7.1}\protected@file@percent } +\newlabel{README:read-the-book}{{7.1}{80}{Read the Book}{section.7.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {7.2}Build the Book}{80}{section.7.2}\protected@file@percent } +\newlabel{README:build-the-book}{{7.2}{80}{Build the Book}{section.7.2}{}} +\@writefile{toc}{\contentsline {section}{\numberline {7.3}Contribute to the Book}{80}{section.7.3}\protected@file@percent } +\newlabel{README:contribute-to-the-book}{{7.3}{80}{Contribute to the Book}{section.7.3}{}} +\@writefile{toc}{\contentsline {chapter}{\numberline {8}About The Authors}{81}{chapter.8}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{authors:about-the-authors}{{8}{81}{About The Authors}{chapter.8}{}} +\newlabel{authors::doc}{{8}{81}{About The Authors}{chapter.8}{}} +\gdef \@abspage@last{85} diff --git a/book.fdb_latexmk b/book.fdb_latexmk new file mode 100644 index 0000000..159658b --- /dev/null +++ b/book.fdb_latexmk @@ -0,0 +1,243 @@ +# Fdb version 3 +["makeindex book.idx"] 1721982828 "book.idx" "book.ind" "book" 1721982840 + "book.idx" 1721982835 0 d41d8cd98f00b204e9800998ecf8427e "pdflatex" + (generated) + "book.ilg" + "book.ind" +["pdflatex"] 1721982834 "/home/sens/Documents/Private 5G_ A Systems Approach/book.tex" "book.pdf" "book" 1721982840 + "/etc/texmf/web2c/texmf.cnf" 1710341186 475 c0e671620eb5563b2130f56340a5fde8 "" + "/home/sens/Documents/Private 5G_ A Systems Approach/book.tex" 1721982822 261623 8f71e227ecf9dda9e5e3429861ba6bed "" + "/usr/share/texlive/texmf-dist/fonts/map/fontname/texfonts.map" 1577235249 3524 cb3e574dea2d1052e39280babc910dc8 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/jknappen/ec/ecrm1095.tfm" 1136768653 3584 929cdff2b7a8c11bd4d49fd68cb0ae70 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm" 1246382020 1004 54797486969f23fa377b128694d548df "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex8.tfm" 1246382020 988 bdf658c3bfc2d96d3c8b02cfc1c94c20 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex9.tfm" 1246382020 996 a18840b13b499c08ac2de96a99eda4bc "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm" 1246382020 916 f87d7c45f9c908e672703b83b72241a3 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam5.tfm" 1246382020 924 9904cf1d39e9767e7a3622f2a125a565 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam7.tfm" 1246382020 928 2dc8d444221b7a635bb58038579b861a "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm" 1246382020 908 2921f8a10601f252058503cc6570e581 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm5.tfm" 1246382020 940 75ac932a52f80982a9f8ea75d03a34cf "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm7.tfm" 1246382020 940 228d6584342e91276bf566bcf9716b83 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cbfonts/grmn1095.tfm" 1213382506 2880 271b145c9f94b98a62257ecce1173ef8 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmex10.tfm" 1136768653 992 662f679a0b3d2d53c1b94050fdaa3f50 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmmi10.tfm" 1136768653 1528 abec98dbc43e172678c11b3b9031252a "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmmi12.tfm" 1136768653 1524 4414a8315f39513458b80dfc63bff03a "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmmi6.tfm" 1136768653 1512 f21f83efb36853c0b70002322c1ab3ad "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmmi8.tfm" 1136768653 1520 eccf95517727cb11801f4f1aee3a21b4 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmmi9.tfm" 1136768653 1524 d89e2d087a9828407a196f428428ef4a "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr10.tfm" 1136768653 1296 45809c5a464d5f32c8f98ba97c1bb47f "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr12.tfm" 1136768653 1288 655e228510b4c2a1abe905c368440826 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr17.tfm" 1136768653 1292 296a67155bdbfc32aa9c636f21e91433 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr6.tfm" 1136768653 1300 b62933e007d01cfd073f79b963c01526 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr8.tfm" 1136768653 1292 21c1c5bfeaebccffdb478fd231a0997d "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr9.tfm" 1136768653 1292 6b21b9c2c7bebb38aa2273f7ca0fb3af "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm" 1136768653 1124 6c73e740cf17375f03eec0ee63599741 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmsy6.tfm" 1136768653 1116 933a60c408fc0a863a92debe84b2d294 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmsy8.tfm" 1136768653 1120 8b7d695260f3cff42e636090a8002094 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmsy9.tfm" 1136768653 1116 25a7bf822c58caf309a702ef79f4afbb "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/txfonts/t1xtt.tfm" 1136768653 1384 8943063000d26272532f74ca134dfecd "" + "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb" 1248133631 36299 5f9df58c2139e7edcf37c8fca4bd384d "" + "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi8.pfb" 1248133631 35469 70d41d2b9ea31d5d813066df7c99281c "" + "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb" 1248133631 35752 024fb6c41858982481f6968b5fc26508 "" + "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb" 1248133631 32569 5e5ddc8df908dea60932f3c484a54c0d "" + "/usr/share/texlive/texmf-dist/fonts/type1/public/cbfonts/grmn1095.pfb" 1213382506 83085 ea64199df2f595815c19ff6c52e02e8e "" + "/usr/share/texlive/texmf-dist/fonts/type1/public/txfonts/t1xtt.pfb" 1136849748 26301 f08b3c26ea42c3177a262c2ac37d6a91 "" + "/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii" 1461363279 71627 94eb9990bed73c364d7f53f960cc8c5b "" + "/usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty" 1575674566 24708 5584a51a7101caf7e6bbf1fc27d8f7b1 "" + "/usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf" 1496785618 7008 9ff5fdcc865b01beca2b0fe4a46231d4 "" + "/usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty" 1643231327 147419 2058c0f5e6893b19c8f3ce95d177646c "" + "/usr/share/texlive/texmf-dist/tex/generic/babel/txtbabel.def" 1643231327 5233 d5e383ed66bf272b71b1a90b596e21c6 "" + "/usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty" 1576625341 40635 c40361e206be584d448876bba8a64a3b "" + "/usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty" 1576016050 33961 6b5c75130e435b2bfdb9f480a09a39f9 "" + "/usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty" 1576625273 7734 b98cbb34c81f667027c1e3ebdbfce34b "" + "/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty" 1576625223 8371 9d55b8bd010bc717624922fb3477d92e "" + "/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty" 1583617216 6501 4011d89d9621e0b0901138815ba5ff29 "" + "/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty" 1572645307 1057 525c2192b5febbd8c1f662c9468335bb "" + "/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty" 1575499628 8356 7bbb2c2373aa810be568c29e333da8ed "" + "/usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty" 1576625065 31769 002a487f55041f8e805cfbf6385ffd97 "" + "/usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty" 1576878844 5412 d5a2436094cd7be85769db90f29250a6 "" + "/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty" 1576624944 13807 952b0226d4efca026f0e19dd266dcc22 "" + "/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty" 1600895880 17859 4409f8f50cd365c68e684407e5350b1b "" + "/usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty" 1576015897 19007 15924f7228aca6c6d184b115f4baa231 "" + "/usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty" 1593379760 20089 80423eac55aa175305d35b49e04fe23b "" + "/usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty" 1576624663 7008 f92eaa0a3872ed622bbf538217cd2ab7 "" + "/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty" 1359763108 5949 3f3fd50a8cc94c3d4cbf4fc66cd3df1c "" + "/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty" 1359763108 13829 94730e64147574077f8ecfea9bb69af4 "" + "/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd" 1359763108 961 6518c6525a34feb5e8250ffa91731cff "" + "/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd" 1359763108 961 d02606146ba5601b5645f987c92e6193 "" + "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty" 1622667781 2222 da905dc1db75412efd2d8f67739f0596 "" + "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty" 1622667781 4173 bc0410bcccdff806d6132d3c1ef35481 "" + "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty" 1636758526 87648 07fbb6e9169e00cb2a2f40b31b2dbf3c "" + "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty" 1636758526 4128 8eea906621b6639f7ba476a472036bbe "" + "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty" 1636758526 2444 926f379cc60fcf0c6e3fee2223b4370d "" + "/usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty" 1576191570 19336 ce7ae9438967282886b3b036cfad1e4d "" + "/usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty" 1576625391 3935 57aa3c3e203a5c2effb4d2bd2efbc323 "" + "/usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty" 1622581934 3137 2366459cfce784001c7405ed16a872fb "" + "/usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty" 1636758526 3034 3bfb87122e6fa8758225c0dd3cbaceba "" + "/usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty" 1636758526 2462 754d6b31b2ab5a09bb72c348ace2ec75 "" + "/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty" 1622581934 4946 461cc78f6f26901410d9f1d725079cc6 "" + "/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty" 1622581934 5049 969aec05d5f39c43f8005910498fcf90 "" + "/usr/share/texlive/texmf-dist/tex/latex/base/makeidx.sty" 1636758526 1939 e44505a18ba4edebb8b70993e32c6350 "" + "/usr/share/texlive/texmf-dist/tex/latex/base/report.cls" 1636758526 23203 8fbc410e29d3fd675970d5f9698c9c11 "" + "/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo" 1636758526 8464 74db94825c407b51399ca17d9bd38a3d "" + "/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty" 1622581934 2894 55431114fc0e491ecee275edafd6c881 "" + "/usr/share/texlive/texmf-dist/tex/latex/capt-of/capt-of.sty" 1264379041 1311 063f8536a047a2d9cb1803321f793f37 "" + "/usr/share/texlive/texmf-dist/tex/latex/cbfonts-fd/lgrcmr.fd" 1501364450 2679 d425462515e71491c8b283467c8a268c "" + "/usr/share/texlive/texmf-dist/tex/latex/cmap/cmap.sty" 1612650595 3574 ddc11a0ae1c579d351ed20d2319ad422 "" + "/usr/share/texlive/texmf-dist/tex/latex/cmap/lgr.cmap" 1215522782 3744 a1cad9520fc27da4fce0135afa2f6445 "" + "/usr/share/texlive/texmf-dist/tex/latex/cmap/ot1.cmap" 1177721415 1207 4e0d96772f0d338847cbfb4eca683c81 "" + "/usr/share/texlive/texmf-dist/tex/latex/cmap/t1.cmap" 1215522782 1938 beaa4a8467aa0074076e0e19f2992e29 "" + "/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty" 1579991033 13886 d1306dcf79a944f6988e688c1785f9ce "" + "/usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty" 1612734021 17086 7ed8cbc4d361ec87392817e0dd4f65ec "" + "/usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty" 1640123156 44023 c6f2f55a2bb9630fba10bfd488a5addd "" + "/usr/share/texlive/texmf-dist/tex/latex/float/float.sty" 1137110151 6749 16d2656a1984957e674b149555f1ea1d "" + "/usr/share/texlive/texmf-dist/tex/latex/fncychap/fncychap.sty" 1292029257 19488 fdd52eb173b3197d748e1ec25acb042f "" + "/usr/share/texlive/texmf-dist/tex/latex/framed/framed.sty" 1338588508 22449 7ec15c16d0d66790f28e90343c5434a3 "" + "/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty" 1578002852 41601 9cf6c5257b1bc7af01a58859749dd37a "" + "/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg" 1459978653 1213 620bba36b25224fa9b7e1ccb4ecb76fd "" + "/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg" 1465944070 1224 978390e9c2234eab29404bc21b268d1e "" + "/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def" 1601931164 19103 48d29b6e2a64cb717117ef65f107b404 "" + "/usr/share/texlive/texmf-dist/tex/latex/graphics/color.sty" 1639603921 7197 eb6c1ebf41667a05cb50c23c19d5e8bc "" + "/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty" 1622581934 18399 7e40f80366dffb22c0e7b70517db5cb4 "" + "/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty" 1636758526 7996 a8fb260d598dcaf305a7ae7b9c3e3229 "" + "/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty" 1622581934 2671 4de6781a30211fe0ea4c672e4a2a8166 "" + "/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty" 1636758526 4009 187ea2dc3194cd5a76cd99a8d7a6c4d0 "" + "/usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/greek-fontenc.def" 1604525725 19298 d12818183d763921d8699ccb69bc98aa "" + "/usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/lgrenc.def" 1604525725 40808 6d39ed380201bea38426587b88f31f37 "" + "/usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/puenc-greek.def" 1604525725 23889 d174b5a24a93bd94dfe17b21da226177 "" + "/usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/textalpha.sty" 1604525725 21811 ccadbc18c2bbe28c5cb1169926c544cd "" + "/usr/share/texlive/texmf-dist/tex/latex/greek-inputenc/lgrenc.dfu" 1562878851 34178 3a496b86f1e3408e75f433fb56b41726 "" + "/usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty" 1580250785 17914 4c28a13fc3d975e6e81c9bea1d697276 "" + "/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def" 1623096352 49890 0bb76a5b745d92e86aed6f3f93e334f0 "" + "/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref-langpatches.def" 1623096352 1777 940b1aa83773bc035eb882e8d6842769 "" + "/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty" 1623096352 230915 97a8817f13de4e61bbc3592cb2caa995 "" + "/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty" 1612734870 13242 133e617c5eebffdd05e421624022b267 "" + "/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def" 1623096352 14132 c9404e8e78123ef0d1007c34d1d6da51 "" + "/usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc-greekbasic.def" 1623096352 6697 b76ef2f73f5cabc6d490a1a25c060b8d "" + "/usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def" 1623096352 117004 86586f287ddfad919a0a4bd68934277a "" + "/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty" 1602274869 22521 d2fceb764a442a2001d257ef11db7618 "" + "/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def" 1642022539 29921 f0f4f870357ebfb8fe58ed9ed4ee9b92 "" + "/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg" 1279039959 678 4792914a8f45be57bb98413425e4c7af "" + "/usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty" 1575499565 5766 13a9e8766c47f30327caf893ece86ac8 "" + "/usr/share/texlive/texmf-dist/tex/latex/mmap/oml.cmap" 1215649417 1866 c1c12138091b4a8edd4a24a940e6f792 "" + "/usr/share/texlive/texmf-dist/tex/latex/mmap/oms.cmap" 1215649417 2370 3b1f71b14b974f07cef532db09ae9ee0 "" + "/usr/share/texlive/texmf-dist/tex/latex/mmap/omx.cmap" 1215649417 3001 252c8ca42b06a22cb1a11c0e47790c6e "" + "/usr/share/texlive/texmf-dist/tex/latex/needspace/needspace.sty" 1364856750 852 0e34dbb72efc69fa07602405ad95585e "" + "/usr/share/texlive/texmf-dist/tex/latex/oberdiek/hypcap.sty" 1575152444 3822 b53c749cd81352b4679a35b0dafefb95 "" + "/usr/share/texlive/texmf-dist/tex/latex/parskip/parskip-2001-04-09.sty" 1536789184 2757 ea00cb4f4e9abc702916f74d3812ef67 "" + "/usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty" 1615762720 4288 94714aa7f535440f33181fec52a31963 "" + "/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty" 1576624809 9878 9e94e8fa600d95f9c7731bb21dfb67a4 "" + "/usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty" 1575674187 9715 b051d5b493d9fe5f4bc251462d039e5f "" + "/usr/share/texlive/texmf-dist/tex/latex/substitutefont/substitutefont.sty" 1383613339 2760 7f04e02850764194948e876fe97f163a "" + "/usr/share/texlive/texmf-dist/tex/latex/tabulary/tabulary.sty" 1403566480 13791 8c83287d79183c3bf58fd70871e8a70b "" + "/usr/share/texlive/texmf-dist/tex/latex/titlesec/titlesec.sty" 1625518490 48833 3b7b4cfab1a3d15596bfd3772a77ab65 "" + "/usr/share/texlive/texmf-dist/tex/latex/tools/array.sty" 1636758526 12694 6c23725d50ab9d1e2d3ce482c58ffcf3 "" + "/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty" 1636758526 12892 3ffe092fc7f5d1cb9866f1bcb071d0d6 "" + "/usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty" 1636758526 32262 2bb622a0aa56c4a7a5cbdfe9d122c15a "" + "/usr/share/texlive/texmf-dist/tex/latex/txfonts/t1txtt.fd" 1137111002 1324 7b6c95370a64cd8c7620cbefefb53dba "" + "/usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty" 1334873510 1048 517e01cde97c1c0baf72e69d43aa5a2e "" + "/usr/share/texlive/texmf-dist/tex/latex/url/url.sty" 1388531844 12796 8edb7d69a20b857904dd0ea757c14ec9 "" + "/usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty" 1238697683 10894 d359a13923460b2a73d4312d613554c8 "" + "/usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty" 1137111090 26220 3701aebf80ccdef248c0c20dd062fea9 "" + "/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty" 1635798903 56029 3f7889dab51d620aa43177c391b7b190 "" + "/usr/share/texlive/texmf-dist/web2c/texmf.cnf" 1644012257 39432 7155514e09a3d69036fac785183a21c2 "" + "/usr/share/texmf/fonts/enc/dvips/tex-gyre/q-ec.enc" 1529098226 2457 aaabbccba4df2a7f7371410ee4e075a3 "" + "/usr/share/texmf/fonts/enc/dvips/tex-gyre/q-ts1.enc" 1529098226 3124 3813fd4c981d99822890a2861b0d274c "" + "/usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qhvb.tfm" 1480098718 11796 b7bc3db132e822d2872ea50ba8fa7cc0 "" + "/usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qhvbi.tfm" 1480098718 12396 e65c2800bb94ee6ae6e4fdf18f68fa2e "" + "/usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qhvr.tfm" 1480098718 12084 374c5b7e91efcc10472ab8e61f66d36b "" + "/usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qtmb.tfm" 1480098718 11484 431d8013ae6931f9326b9a0f492d2a5e "" + "/usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qtmr.tfm" 1480098718 11504 0b76b46eb90907e684139293e03c466a "" + "/usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qtmri.tfm" 1480098718 11356 da1519f442d8a49b81c86cbaf25ef79f "" + "/usr/share/texmf/fonts/tfm/public/tex-gyre/ts1-qtmr.tfm" 1480098718 1600 20cdf11dab97d5d39e847571f9314407 "" + "/usr/share/texmf/fonts/type1/public/tex-gyre/qhvb.pfb" 1480098745 112164 176018dd42fcc60204173fa10e357da5 "" + "/usr/share/texmf/fonts/type1/public/tex-gyre/qhvbi.pfb" 1480098745 104926 77ce2f0433ac7fd33dbe9968d127e4fb "" + "/usr/share/texmf/fonts/type1/public/tex-gyre/qtmb.pfb" 1480098745 131776 4be3e220f990dc716f91bb7965c09237 "" + "/usr/share/texmf/fonts/type1/public/tex-gyre/qtmr.pfb" 1480098745 133302 8dca243a80ecf4cfe00077d4bd995bd7 "" + "/usr/share/texmf/fonts/type1/public/tex-gyre/qtmri.pfb" 1480098745 129669 aaf12ebd0b807d452087fc34bde5bd7d "" + "/usr/share/texmf/tex/latex/tex-gyre/t1qhv.fd" 1480098840 2378 01e898189bf06467f2f6fe33decbff09 "" + "/usr/share/texmf/tex/latex/tex-gyre/t1qtm.fd" 1480098840 1638 7cc855d1dc7c12c1858f209a4ef88c4a "" + "/usr/share/texmf/tex/latex/tex-gyre/tgheros.sty" 1480098840 2130 2b41e80713f78d339e74c19d96fe70a1 "" + "/usr/share/texmf/tex/latex/tex-gyre/tgtermes.sty" 1480098840 2211 af9b7d12507105a58a3e8e926996b827 "" + "/usr/share/texmf/tex/latex/tex-gyre/ts1qtm.fd" 1480098840 1160 de7b1cf70edab73c9f1704df2a9fdbbd "" + "/usr/share/texmf/web2c/texmf.cnf" 1644012257 39432 7155514e09a3d69036fac785183a21c2 "" + "/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map" 1710341211 4379155 98693266ff65f58d9f98aff394de12d2 "" + "/var/lib/texmf/web2c/pdftex/pdflatex.fmt" 1710481103 2801139 e5d47e52a989f35357bec941ce971d6b "" + "Slide1.png" 1721975082 151928 8af950a4e8423a027d591a03a1494a6d "" + "Slide10.png" 1721975082 103341 c88a3a34b0f38b5a2bf403eec5f8bc2c "" + "Slide101.png" 1721975082 36343 3e18995ab83729926324081078baa36b "" + "Slide11.png" 1721975082 106840 2328366752ab27796d15708dc2840662 "" + "Slide110.png" 1721975082 66872 f260f070d5105d7e8310099856d74727 "" + "Slide111.png" 1721975082 154416 4769c98ca1967dc5b68ed6fea99cb6f7 "" + "Slide112.png" 1721975082 176711 0bea0a29ff1a778ef06ed6fd4a105b74 "" + "Slide12.png" 1721975082 67043 e8a8b811f359efd74cf17d6340d82d89 "" + "Slide121.png" 1721975082 78801 5b5ab7a782de35e292703d4641aa9c41 "" + "Slide13.png" 1721975082 41001 4f9d886c876fefbd39cb69d4616b8285 "" + "Slide14.png" 1721975082 207087 41ea0d2296e0dd5dd6726e07a0274bbd "" + "Slide141.png" 1721975082 22880 6ef716af30b526ba437a3c570fe80581 "" + "Slide15.png" 1721975082 70182 4c50370a1560747558f2e2df7d3dfd1f "" + "Slide16.png" 1721975082 67731 f861f0b6339ee80251ae71ae728edb25 "" + "Slide17.png" 1721975082 81490 040fdb28aa97172dbad89d863b562ae2 "" + "Slide18.png" 1721975082 65262 3bb20a8389f432f1c8757c1b842b23a4 "" + "Slide19.png" 1721975082 60169 6c4db59cea802449d61e1a7af6f875cc "" + "Slide2.png" 1721975082 177959 bf284ca1151f6e0bcc8ee11714c82e7b "" + "Slide20.png" 1721975082 59232 b13f7c614292c2064bbe9b414f84182a "" + "Slide21.png" 1721975082 59267 789e8560514c73ff39591f0fc4f59092 "" + "Slide211.png" 1721975082 87252 21502541faa88360d9b1043f10aa65de "" + "Slide22.png" 1721975082 119824 ac1878d5fa7e6940c640fa7c087d0329 "" + "Slide23.png" 1721975082 110767 273282c917885ac6c93f6f6676189480 "" + "Slide24.png" 1721975082 73615 7a1ab6789ead4d48558b087a0e9f44dc "" + "Slide3.png" 1721975082 93041 5b6195e07bb4259e0326d4f6c2d483e6 "" + "Slide31.png" 1721975082 214449 b31d7b10131b7dce6267935203a8793a "" + "Slide32.png" 1721975082 55161 eea15af037ec5f3497ef126c57023a9a "" + "Slide4.png" 1721975082 159742 9d3de4b25ccf7ddc008af42c42b75bae "" + "Slide41.png" 1721975082 93482 06f1d067ae741209589b8440589c63e7 "" + "Slide42.png" 1721975082 54738 ae7d69f3c570c09579787cf41a8af568 "" + "Slide5.png" 1721975082 82452 9ea6269420ae7a3952a36a0689678237 "" + "Slide51.png" 1721975082 112111 acd928ec2e851f2f313d3bf9c4ee503f "" + "Slide52.png" 1721975082 91245 91e6aa250afffa9fb73a555689539492 "" + "Slide6.png" 1721975082 62628 03723d5b0d34d9dcb84fa508eda0384e "" + "Slide61.png" 1721975082 109430 8ff14d19aadb8404b9648996a15d72b9 "" + "Slide62.png" 1721975082 159961 d6db5b2bd3754182da29b829c185b875 "" + "Slide7.png" 1721975082 63902 6f54f447a23954bb5cc91259f67482a1 "" + "Slide71.png" 1721975082 185593 d14575841dc11a0deded6fa9f94b9a52 "" + "Slide72.png" 1721975082 22463 0a82b7a8eba01afdeb89a1c296df469f "" + "Slide8.png" 1721975082 70763 fd1b35a08a179b31dbcbb232d9bbeeff "" + "Slide81.png" 1721975082 143394 799e033e788d764146f7e10fd6a21725 "" + "Slide82.png" 1721975082 24984 51cfdcc2b1bcc8172fffe93db8578a08 "" + "Slide9.png" 1721975082 78791 3aed82e582114260f8cc750f7b62f5c4 "" + "Slide91.png" 1721975082 99829 4f68d847d96d0e616e9862b67cd9315b "" + "Slide92.png" 1721975082 85793 e7fbb2b518cb55a1fbe4b8c2360bab25 "" + "book.aux" 1721982839 42918 332574784bfcb20e6a0cc84e78b33345 "pdflatex" + "book.ind" 1721982828 0 d41d8cd98f00b204e9800998ecf8427e "makeindex book.idx" + "book.out" 1721982839 9306 48c87abc398957a4e85279b800bbbeb5 "pdflatex" + "book.tex" 1721982822 261623 8f71e227ecf9dda9e5e3429861ba6bed "" + "book.toc" 1721982839 4750 179cc1ba130c41fc36c88cbd1f61e1d3 "pdflatex" + "peru_deploy_labelled.jpg" 1721975082 121520 7f543f3d06df051df82c0620c7b2df3a "" + "sphinx.sty" 1721975082 13262 0226aaccc1147ed884a3946fce78a6d2 "" + "sphinxhighlight.sty" 1721975082 6742 ef996596562a9a2908d62b245f9fe7bd "" + "sphinxlatexadmonitions.sty" 1721975082 6238 2d867d769abf3f72abc17ef52adff78b "" + "sphinxlatexcontainers.sty" 1721975082 901 d3a3a1b7b2547f47ade2499350b5c420 "" + "sphinxlatexgraphics.sty" 1721975082 4840 a9578332b6f3b35e198751fb632c9b79 "" + "sphinxlatexindbibtoc.sty" 1721975082 2066 b93f8504d02f6337fde3074b179de55e "" + "sphinxlatexlists.sty" 1721975082 3540 28bde24363589dd8238e1c3089e5b1b5 "" + "sphinxlatexliterals.sty" 1721975082 35719 daaa4295be807130a5df36ead18b83fa "" + "sphinxlatexnumfig.sty" 1721975082 4532 3633caf84afa1a98e1a060b7868202bb "" + "sphinxlatexobjects.sty" 1721975082 7539 5bd439fe3b377102e234413cf4aac14a "" + "sphinxlatexshadowbox.sty" 1721975082 3885 01355157c5580b34ec18031ea7a5e0e0 "" + "sphinxlatexstyleheadings.sty" 1721975082 3253 144b82f37e9d225d888cce45c19b8ed4 "" + "sphinxlatexstylepage.sty" 1721975082 3064 abce6c3018a84afee0afb08a431944ea "" + "sphinxlatexstyletext.sty" 1721975082 6177 c18841ce3fafc366cd3b145f8faa4c37 "" + "sphinxlatextables.sty" 1721975082 21848 2827eb0b11b99b185a8b77317d3e131c "" + "sphinxmanual.cls" 1721975082 4241 7b0d7a37df7b5715fb0dbd585c52ecdb "" + "sphinxmessages.sty" 1721975082 745 3614f78cc7317eca1d58bd35beda5875 "" + "sphinxoptionsgeometry.sty" 1721975082 2061 47bb34b8ed8a78823eb0c886abfb9f4d "" + "sphinxoptionshyperref.sty" 1721975082 1094 79beb8b8a3f10784f8cce804e0f9d3aa "" + "sphinxpackagefootnote.sty" 1721975082 13248 e2c77871396275ccf592403f8130f6f2 "" + (generated) + "book.aux" + "book.idx" + "book.log" + "book.out" + "book.pdf" + "book.toc" diff --git a/book.fls b/book.fls new file mode 100644 index 0000000..41d4e8f --- /dev/null +++ b/book.fls @@ -0,0 +1,1597 @@ +PWD /home/sens/Documents/Private 5G_ A Systems Approach +INPUT /etc/texmf/web2c/texmf.cnf +INPUT /usr/share/texmf/web2c/texmf.cnf +INPUT /usr/share/texlive/texmf-dist/web2c/texmf.cnf +INPUT /var/lib/texmf/web2c/pdftex/pdflatex.fmt +INPUT /home/sens/Documents/Private 5G_ A Systems Approach/book.tex +OUTPUT book.log +INPUT ./sphinxmanual.cls +INPUT ./sphinxmanual.cls +INPUT sphinxmanual.cls +INPUT ./sphinxmanual.cls +INPUT ./sphinxmanual.cls +INPUT ./sphinxmanual.cls +INPUT ./sphinxmanual.cls +INPUT ./sphinxmanual.cls +INPUT sphinxmanual.cls +INPUT ./sphinxmanual.cls +INPUT sphinxmanual.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/size11.clo +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/size11.clo +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/size11.clo +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/size11.clo +INPUT /usr/share/texlive/texmf-dist/fonts/map/fontname/texfonts.map +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr10.tfm +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/cmap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/cmap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/cmap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/cmap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/cmap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/cmap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/cmap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/cmap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/cmap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/cmap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/cmap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/lgrenc.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/lgrenc.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/lgrenc.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/lgrenc.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-inputenc/lgrenc.dfu +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-inputenc/lgrenc.dfu +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-inputenc/lgrenc.dfu +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-inputenc/lgrenc.dfu +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/greek-fontenc.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/greek-fontenc.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/greek-fontenc.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/greek-fontenc.def +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/jknappen/ec/ecrm1095.tfm +INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/t1.cmap +INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/t1.cmap +OUTPUT book.pdf +INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/t1.cmap +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/txtbabel.def +INPUT /usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf +INPUT /usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf +INPUT /usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf +INPUT /usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf +INPUT /usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf +INPUT /usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf +INPUT /usr/share/texlive/texmf-dist/tex/latex/substitutefont/substitutefont.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/substitutefont/substitutefont.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/substitutefont/substitutefont.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/substitutefont/substitutefont.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/substitutefont/substitutefont.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/substitutefont/substitutefont.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/substitutefont/substitutefont.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/substitutefont/substitutefont.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/substitutefont/substitutefont.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/substitutefont/substitutefont.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/substitutefont/substitutefont.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgtermes.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgtermes.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgtermes.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgtermes.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgtermes.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgtermes.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgtermes.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgtermes.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgtermes.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgtermes.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgtermes.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgheros.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgheros.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgheros.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgheros.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgheros.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgheros.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgheros.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgheros.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgheros.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgheros.sty +INPUT /usr/share/texmf/tex/latex/tex-gyre/tgheros.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/textalpha.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/textalpha.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/textalpha.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/textalpha.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/textalpha.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/textalpha.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/textalpha.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/textalpha.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/textalpha.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/textalpha.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/textalpha.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fncychap/fncychap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fncychap/fncychap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fncychap/fncychap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fncychap/fncychap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fncychap/fncychap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fncychap/fncychap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fncychap/fncychap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fncychap/fncychap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fncychap/fncychap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fncychap/fncychap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fncychap/fncychap.sty +INPUT ./sphinx.sty +INPUT ./sphinx.sty +INPUT sphinx.sty +INPUT ./sphinx.sty +INPUT ./sphinx.sty +INPUT ./sphinx.sty +INPUT ./sphinx.sty +INPUT ./sphinx.sty +INPUT sphinx.sty +INPUT ./sphinx.sty +INPUT sphinx.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT ./sphinxoptionshyperref.sty +INPUT sphinxoptionshyperref.sty +INPUT ./sphinxoptionshyperref.sty +INPUT sphinxoptionshyperref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT ./sphinxoptionsgeometry.sty +INPUT sphinxoptionsgeometry.sty +INPUT ./sphinxoptionsgeometry.sty +INPUT sphinxoptionsgeometry.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/float/float.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/capt-of/capt-of.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/capt-of/capt-of.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/capt-of/capt-of.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/capt-of/capt-of.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/capt-of/capt-of.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/capt-of/capt-of.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/capt-of/capt-of.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/capt-of/capt-of.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/capt-of/capt-of.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/capt-of/capt-of.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/capt-of/capt-of.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +INPUT ./sphinxlatexgraphics.sty +INPUT sphinxlatexgraphics.sty +INPUT ./sphinxlatexgraphics.sty +INPUT sphinxlatexgraphics.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT ./sphinxlatexadmonitions.sty +INPUT sphinxlatexadmonitions.sty +INPUT ./sphinxlatexadmonitions.sty +INPUT sphinxlatexadmonitions.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/framed/framed.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/framed/framed.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/framed/framed.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/framed/framed.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/framed/framed.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/framed/framed.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/framed/framed.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/framed/framed.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/framed/framed.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/framed/framed.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/framed/framed.sty +INPUT ./sphinxlatexliterals.sty +INPUT sphinxlatexliterals.sty +INPUT ./sphinxlatexliterals.sty +INPUT sphinxlatexliterals.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/framed/framed.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/needspace/needspace.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/needspace/needspace.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/needspace/needspace.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/needspace/needspace.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/needspace/needspace.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/needspace/needspace.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/needspace/needspace.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/needspace/needspace.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/needspace/needspace.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/needspace/needspace.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/needspace/needspace.sty +INPUT ./sphinxlatexshadowbox.sty +INPUT sphinxlatexshadowbox.sty +INPUT ./sphinxlatexshadowbox.sty +INPUT sphinxlatexshadowbox.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/framed/framed.sty +INPUT ./sphinxlatexcontainers.sty +INPUT sphinxlatexcontainers.sty +INPUT ./sphinxlatexcontainers.sty +INPUT sphinxlatexcontainers.sty +INPUT ./sphinxhighlight.sty +INPUT ./sphinxhighlight.sty +INPUT sphinxhighlight.sty +INPUT ./sphinxhighlight.sty +INPUT ./sphinxhighlight.sty +INPUT ./sphinxhighlight.sty +INPUT ./sphinxhighlight.sty +INPUT ./sphinxhighlight.sty +INPUT sphinxhighlight.sty +INPUT ./sphinxhighlight.sty +INPUT sphinxhighlight.sty +INPUT ./sphinxlatextables.sty +INPUT sphinxlatextables.sty +INPUT ./sphinxlatextables.sty +INPUT sphinxlatextables.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tabulary/tabulary.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tabulary/tabulary.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tabulary/tabulary.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tabulary/tabulary.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tabulary/tabulary.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tabulary/tabulary.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tabulary/tabulary.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tabulary/tabulary.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tabulary/tabulary.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tabulary/tabulary.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tabulary/tabulary.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty +INPUT ./sphinxlatexnumfig.sty +INPUT sphinxlatexnumfig.sty +INPUT ./sphinxlatexnumfig.sty +INPUT sphinxlatexnumfig.sty +INPUT ./sphinxlatexlists.sty +INPUT sphinxlatexlists.sty +INPUT ./sphinxlatexlists.sty +INPUT sphinxlatexlists.sty +INPUT ./sphinxpackagefootnote.sty +INPUT ./sphinxpackagefootnote.sty +INPUT sphinxpackagefootnote.sty +INPUT ./sphinxpackagefootnote.sty +INPUT ./sphinxpackagefootnote.sty +INPUT ./sphinxpackagefootnote.sty +INPUT ./sphinxpackagefootnote.sty +INPUT ./sphinxpackagefootnote.sty +INPUT sphinxpackagefootnote.sty +INPUT ./sphinxpackagefootnote.sty +INPUT sphinxpackagefootnote.sty +INPUT ./sphinxlatexindbibtoc.sty +INPUT sphinxlatexindbibtoc.sty +INPUT ./sphinxlatexindbibtoc.sty +INPUT sphinxlatexindbibtoc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/makeidx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/makeidx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/makeidx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/makeidx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/makeidx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/makeidx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/makeidx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/makeidx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/makeidx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/makeidx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/makeidx.sty +INPUT ./sphinxlatexstylepage.sty +INPUT sphinxlatexstylepage.sty +INPUT ./sphinxlatexstylepage.sty +INPUT sphinxlatexstylepage.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/parskip/parskip-2001-04-09.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/parskip/parskip-2001-04-09.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/parskip/parskip-2001-04-09.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty +INPUT ./sphinxlatexstyleheadings.sty +INPUT sphinxlatexstyleheadings.sty +INPUT ./sphinxlatexstyleheadings.sty +INPUT sphinxlatexstyleheadings.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/titlesec/titlesec.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/titlesec/titlesec.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/titlesec/titlesec.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/titlesec/titlesec.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/titlesec/titlesec.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/titlesec/titlesec.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/titlesec/titlesec.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/titlesec/titlesec.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/titlesec/titlesec.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/titlesec/titlesec.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/titlesec/titlesec.sty +INPUT ./sphinxlatexstyletext.sty +INPUT sphinxlatexstyletext.sty +INPUT ./sphinxlatexstyletext.sty +INPUT sphinxlatexstyletext.sty +INPUT ./sphinxlatexobjects.sty +INPUT sphinxlatexobjects.sty +INPUT ./sphinxlatexobjects.sty +INPUT sphinxlatexobjects.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref-langpatches.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref-langpatches.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref-langpatches.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref-langpatches.def +INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc-greekbasic.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc-greekbasic.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc-greekbasic.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc-greekbasic.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/hypcap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/hypcap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/hypcap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/hypcap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/hypcap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/hypcap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/hypcap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/hypcap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/hypcap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/hypcap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/oberdiek/hypcap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +INPUT ./sphinxmessages.sty +INPUT ./sphinxmessages.sty +INPUT sphinxmessages.sty +INPUT ./sphinxmessages.sty +INPUT ./sphinxmessages.sty +INPUT ./sphinxmessages.sty +INPUT ./sphinxmessages.sty +INPUT ./sphinxmessages.sty +INPUT sphinxmessages.sty +INPUT ./sphinxmessages.sty +INPUT sphinxmessages.sty +OUTPUT book.idx +INPUT /usr/share/texmf/tex/latex/tex-gyre/t1qtm.fd +INPUT /usr/share/texmf/tex/latex/tex-gyre/t1qtm.fd +INPUT /usr/share/texmf/tex/latex/tex-gyre/t1qtm.fd +INPUT /usr/share/texmf/tex/latex/tex-gyre/t1qtm.fd +INPUT /usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qtmr.tfm +INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT ./book.aux +INPUT book.aux +INPUT book.aux +OUTPUT book.aux +INPUT /usr/share/texlive/texmf-dist/tex/latex/cbfonts-fd/lgrcmr.fd +INPUT /usr/share/texlive/texmf-dist/tex/latex/cbfonts-fd/lgrcmr.fd +INPUT /usr/share/texlive/texmf-dist/tex/latex/cbfonts-fd/lgrcmr.fd +INPUT /usr/share/texlive/texmf-dist/tex/latex/cbfonts-fd/lgrcmr.fd +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/puenc-greek.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/puenc-greek.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/puenc-greek.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/puenc-greek.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/greek-fontenc.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/greek-fontenc.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/greek-fontenc.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/greek-fontenc.def +INPUT /usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +INPUT /usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +INPUT /usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +INPUT /usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +INPUT /usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +INPUT /usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +INPUT /usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/color.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT ./book.out +INPUT book.out +INPUT ./book.out +INPUT book.out +INPUT ./book.out +INPUT book.out +INPUT ./book.out +INPUT book.out +INPUT ./book.out +INPUT ./book.out +OUTPUT book.out +INPUT /usr/share/texmf/tex/latex/tex-gyre/t1qhv.fd +INPUT /usr/share/texmf/tex/latex/tex-gyre/t1qhv.fd +INPUT /usr/share/texmf/tex/latex/tex-gyre/t1qhv.fd +INPUT /usr/share/texmf/tex/latex/tex-gyre/t1qhv.fd +INPUT /usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qhvr.tfm +INPUT /usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qhvb.tfm +INPUT /usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qhvb.tfm +INPUT /usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qhvbi.tfm +INPUT /usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qhvbi.tfm +INPUT /usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qhvb.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr17.tfm +INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/ot1.cmap +INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/ot1.cmap +INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/ot1.cmap +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr12.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmmi12.tfm +INPUT /usr/share/texlive/texmf-dist/tex/latex/mmap/oml.cmap +INPUT /usr/share/texlive/texmf-dist/tex/latex/mmap/oml.cmap +INPUT /usr/share/texlive/texmf-dist/tex/latex/mmap/oml.cmap +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmmi12.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm +INPUT /usr/share/texlive/texmf-dist/tex/latex/mmap/oms.cmap +INPUT /usr/share/texlive/texmf-dist/tex/latex/mmap/oms.cmap +INPUT /usr/share/texlive/texmf-dist/tex/latex/mmap/oms.cmap +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmex10.tfm +INPUT /usr/share/texlive/texmf-dist/tex/latex/mmap/omx.cmap +INPUT /usr/share/texlive/texmf-dist/tex/latex/mmap/omx.cmap +INPUT /usr/share/texlive/texmf-dist/tex/latex/mmap/omx.cmap +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmex10.tfm +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm +INPUT /usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qhvb.tfm +INPUT /var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map +INPUT /usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qtmr.tfm +INPUT /usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qhvr.tfm +INPUT /usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qhvb.tfm +INPUT ./book.toc +INPUT book.toc +INPUT book.toc +INPUT /usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qtmb.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr8.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr6.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmmi10.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmmi8.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmmi6.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmsy8.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmsy6.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmex10.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex8.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam7.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm7.tfm +OUTPUT book.toc +INPUT /usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qtmri.tfm +INPUT /usr/share/texmf/tex/latex/tex-gyre/ts1qtm.fd +INPUT /usr/share/texmf/tex/latex/tex-gyre/ts1qtm.fd +INPUT /usr/share/texmf/tex/latex/tex-gyre/ts1qtm.fd +INPUT /usr/share/texmf/tex/latex/tex-gyre/ts1qtm.fd +INPUT /usr/share/texmf/fonts/tfm/public/tex-gyre/ts1-qtmr.tfm +INPUT ./Slide1.png +INPUT ./Slide1.png +INPUT Slide1.png +INPUT ./Slide1.png +INPUT ./Slide1.png +INPUT /usr/share/texlive/texmf-dist/tex/latex/txfonts/t1txtt.fd +INPUT /usr/share/texlive/texmf-dist/tex/latex/txfonts/t1txtt.fd +INPUT /usr/share/texlive/texmf-dist/tex/latex/txfonts/t1txtt.fd +INPUT /usr/share/texlive/texmf-dist/tex/latex/txfonts/t1txtt.fd +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/txfonts/t1xtt.tfm +INPUT ./Slide1.png +INPUT ./Slide1.png +INPUT Slide1.png +INPUT ./Slide1.png +INPUT /usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qtmr.tfm +INPUT /usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qtmr.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr9.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmmi9.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmsy9.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex9.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam5.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm5.tfm +INPUT /usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qtmr.tfm +INPUT ./Slide14.png +INPUT ./Slide14.png +INPUT Slide14.png +INPUT ./Slide14.png +INPUT ./Slide14.png +INPUT ./Slide14.png +INPUT ./Slide14.png +INPUT Slide14.png +INPUT ./Slide14.png +INPUT ./Slide2.png +INPUT ./Slide2.png +INPUT Slide2.png +INPUT ./Slide2.png +INPUT ./Slide2.png +INPUT ./Slide2.png +INPUT ./Slide2.png +INPUT Slide2.png +INPUT ./Slide2.png +INPUT ./Slide3.png +INPUT ./Slide3.png +INPUT Slide3.png +INPUT ./Slide3.png +INPUT ./Slide3.png +INPUT ./Slide3.png +INPUT ./Slide3.png +INPUT Slide3.png +INPUT ./Slide3.png +INPUT ./Slide4.png +INPUT ./Slide4.png +INPUT Slide4.png +INPUT ./Slide4.png +INPUT ./Slide4.png +INPUT ./Slide4.png +INPUT ./Slide4.png +INPUT Slide4.png +INPUT ./Slide4.png +INPUT ./Slide5.png +INPUT ./Slide5.png +INPUT Slide5.png +INPUT ./Slide5.png +INPUT ./Slide5.png +INPUT ./Slide5.png +INPUT ./Slide5.png +INPUT Slide5.png +INPUT ./Slide5.png +INPUT ./Slide6.png +INPUT ./Slide6.png +INPUT Slide6.png +INPUT ./Slide6.png +INPUT ./Slide6.png +INPUT ./Slide6.png +INPUT ./Slide6.png +INPUT Slide6.png +INPUT ./Slide6.png +INPUT ./Slide7.png +INPUT ./Slide7.png +INPUT Slide7.png +INPUT ./Slide7.png +INPUT ./Slide7.png +INPUT ./Slide7.png +INPUT ./Slide7.png +INPUT Slide7.png +INPUT ./Slide7.png +INPUT ./Slide8.png +INPUT ./Slide8.png +INPUT Slide8.png +INPUT ./Slide8.png +INPUT ./Slide8.png +INPUT ./Slide8.png +INPUT ./Slide8.png +INPUT Slide8.png +INPUT ./Slide8.png +INPUT ./Slide9.png +INPUT ./Slide9.png +INPUT Slide9.png +INPUT ./Slide9.png +INPUT ./Slide9.png +INPUT ./Slide9.png +INPUT ./Slide9.png +INPUT Slide9.png +INPUT ./Slide9.png +INPUT ./Slide10.png +INPUT ./Slide10.png +INPUT Slide10.png +INPUT ./Slide10.png +INPUT ./Slide10.png +INPUT ./Slide10.png +INPUT ./Slide10.png +INPUT Slide10.png +INPUT ./Slide10.png +INPUT ./Slide11.png +INPUT ./Slide11.png +INPUT Slide11.png +INPUT ./Slide11.png +INPUT ./Slide11.png +INPUT ./Slide11.png +INPUT ./Slide11.png +INPUT Slide11.png +INPUT ./Slide11.png +INPUT ./Slide12.png +INPUT ./Slide12.png +INPUT Slide12.png +INPUT ./Slide12.png +INPUT ./Slide12.png +INPUT ./Slide12.png +INPUT ./Slide12.png +INPUT Slide12.png +INPUT ./Slide12.png +INPUT ./Slide13.png +INPUT ./Slide13.png +INPUT Slide13.png +INPUT ./Slide13.png +INPUT ./Slide13.png +INPUT ./Slide13.png +INPUT ./Slide13.png +INPUT Slide13.png +INPUT ./Slide13.png +INPUT ./Slide21.png +INPUT ./Slide21.png +INPUT Slide21.png +INPUT ./Slide21.png +INPUT ./Slide21.png +INPUT ./Slide21.png +INPUT ./Slide21.png +INPUT Slide21.png +INPUT ./Slide21.png +INPUT ./Slide31.png +INPUT ./Slide31.png +INPUT Slide31.png +INPUT ./Slide31.png +INPUT ./Slide31.png +INPUT ./Slide31.png +INPUT ./Slide31.png +INPUT Slide31.png +INPUT ./Slide31.png +INPUT ./Slide141.png +INPUT ./Slide141.png +INPUT Slide141.png +INPUT ./Slide141.png +INPUT ./Slide141.png +INPUT ./Slide141.png +INPUT ./Slide141.png +INPUT Slide141.png +INPUT ./Slide141.png +INPUT ./Slide15.png +INPUT ./Slide15.png +INPUT Slide15.png +INPUT ./Slide15.png +INPUT ./Slide15.png +INPUT ./Slide15.png +INPUT ./Slide15.png +INPUT Slide15.png +INPUT ./Slide15.png +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cbfonts/grmn1095.tfm +INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/lgr.cmap +INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/lgr.cmap +INPUT /usr/share/texlive/texmf-dist/tex/latex/cmap/lgr.cmap +INPUT ./Slide16.png +INPUT ./Slide16.png +INPUT Slide16.png +INPUT ./Slide16.png +INPUT ./Slide16.png +INPUT ./Slide16.png +INPUT ./Slide16.png +INPUT Slide16.png +INPUT ./Slide16.png +INPUT /usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qtmr.tfm +INPUT /usr/share/texmf/fonts/tfm/public/tex-gyre/ec-qhvr.tfm +INPUT ./Slide17.png +INPUT ./Slide17.png +INPUT Slide17.png +INPUT ./Slide17.png +INPUT ./Slide17.png +INPUT ./Slide17.png +INPUT ./Slide17.png +INPUT Slide17.png +INPUT ./Slide17.png +INPUT ./Slide18.png +INPUT ./Slide18.png +INPUT Slide18.png +INPUT ./Slide18.png +INPUT ./Slide18.png +INPUT ./Slide18.png +INPUT ./Slide18.png +INPUT Slide18.png +INPUT ./Slide18.png +INPUT ./Slide19.png +INPUT ./Slide19.png +INPUT Slide19.png +INPUT ./Slide19.png +INPUT ./Slide19.png +INPUT ./Slide19.png +INPUT ./Slide19.png +INPUT Slide19.png +INPUT ./Slide19.png +INPUT ./Slide20.png +INPUT ./Slide20.png +INPUT Slide20.png +INPUT ./Slide20.png +INPUT ./Slide20.png +INPUT ./Slide20.png +INPUT ./Slide20.png +INPUT Slide20.png +INPUT ./Slide20.png +INPUT ./Slide110.png +INPUT ./Slide110.png +INPUT Slide110.png +INPUT ./Slide110.png +INPUT ./Slide110.png +INPUT ./Slide110.png +INPUT ./Slide110.png +INPUT Slide110.png +INPUT ./Slide110.png +INPUT ./Slide24.png +INPUT ./Slide24.png +INPUT Slide24.png +INPUT ./Slide24.png +INPUT ./Slide24.png +INPUT ./Slide24.png +INPUT ./Slide24.png +INPUT Slide24.png +INPUT ./Slide24.png +INPUT ./Slide32.png +INPUT ./Slide32.png +INPUT Slide32.png +INPUT ./Slide32.png +INPUT ./Slide32.png +INPUT ./Slide32.png +INPUT ./Slide32.png +INPUT Slide32.png +INPUT ./Slide32.png +INPUT ./Slide101.png +INPUT ./Slide101.png +INPUT Slide101.png +INPUT ./Slide101.png +INPUT ./Slide101.png +INPUT ./Slide101.png +INPUT ./Slide101.png +INPUT Slide101.png +INPUT ./Slide101.png +INPUT ./Slide42.png +INPUT ./Slide42.png +INPUT Slide42.png +INPUT ./Slide42.png +INPUT ./Slide42.png +INPUT ./Slide42.png +INPUT ./Slide42.png +INPUT Slide42.png +INPUT ./Slide42.png +INPUT ./Slide52.png +INPUT ./Slide52.png +INPUT Slide52.png +INPUT ./Slide52.png +INPUT ./Slide52.png +INPUT ./Slide52.png +INPUT ./Slide52.png +INPUT Slide52.png +INPUT ./Slide52.png +INPUT ./Slide62.png +INPUT ./Slide62.png +INPUT Slide62.png +INPUT ./Slide62.png +INPUT ./Slide62.png +INPUT ./Slide62.png +INPUT ./Slide62.png +INPUT Slide62.png +INPUT ./Slide62.png +INPUT ./Slide72.png +INPUT ./Slide72.png +INPUT Slide72.png +INPUT ./Slide72.png +INPUT ./Slide72.png +INPUT ./Slide72.png +INPUT ./Slide72.png +INPUT Slide72.png +INPUT ./Slide72.png +INPUT ./Slide82.png +INPUT ./Slide82.png +INPUT Slide82.png +INPUT ./Slide82.png +INPUT ./Slide82.png +INPUT ./Slide82.png +INPUT ./Slide82.png +INPUT Slide82.png +INPUT ./Slide82.png +INPUT ./Slide92.png +INPUT ./Slide92.png +INPUT Slide92.png +INPUT ./Slide92.png +INPUT ./Slide92.png +INPUT ./Slide92.png +INPUT ./Slide92.png +INPUT Slide92.png +INPUT ./Slide92.png +INPUT ./Slide211.png +INPUT ./Slide211.png +INPUT Slide211.png +INPUT ./Slide211.png +INPUT ./Slide211.png +INPUT ./Slide211.png +INPUT ./Slide211.png +INPUT Slide211.png +INPUT ./Slide211.png +INPUT ./Slide22.png +INPUT ./Slide22.png +INPUT Slide22.png +INPUT ./Slide22.png +INPUT ./Slide22.png +INPUT ./Slide22.png +INPUT ./Slide22.png +INPUT Slide22.png +INPUT ./Slide22.png +INPUT ./Slide112.png +INPUT ./Slide112.png +INPUT Slide112.png +INPUT ./Slide112.png +INPUT ./Slide112.png +INPUT ./Slide112.png +INPUT ./Slide112.png +INPUT Slide112.png +INPUT ./Slide112.png +INPUT ./peru_deploy_labelled.jpg +INPUT ./peru_deploy_labelled.jpg +INPUT peru_deploy_labelled.jpg +INPUT ./peru_deploy_labelled.jpg +INPUT ./peru_deploy_labelled.jpg +INPUT ./peru_deploy_labelled.jpg +INPUT ./peru_deploy_labelled.jpg +INPUT peru_deploy_labelled.jpg +INPUT ./peru_deploy_labelled.jpg +INPUT ./Slide23.png +INPUT ./Slide23.png +INPUT Slide23.png +INPUT ./Slide23.png +INPUT ./Slide23.png +INPUT ./Slide23.png +INPUT ./Slide23.png +INPUT Slide23.png +INPUT ./Slide23.png +INPUT ./Slide41.png +INPUT ./Slide41.png +INPUT Slide41.png +INPUT ./Slide41.png +INPUT ./Slide41.png +INPUT ./Slide41.png +INPUT ./Slide41.png +INPUT Slide41.png +INPUT ./Slide41.png +INPUT ./Slide51.png +INPUT ./Slide51.png +INPUT Slide51.png +INPUT ./Slide51.png +INPUT ./Slide51.png +INPUT ./Slide51.png +INPUT ./Slide51.png +INPUT Slide51.png +INPUT ./Slide51.png +INPUT ./Slide61.png +INPUT ./Slide61.png +INPUT Slide61.png +INPUT ./Slide61.png +INPUT ./Slide61.png +INPUT ./Slide61.png +INPUT ./Slide61.png +INPUT Slide61.png +INPUT ./Slide61.png +INPUT ./Slide71.png +INPUT ./Slide71.png +INPUT Slide71.png +INPUT ./Slide71.png +INPUT ./Slide71.png +INPUT ./Slide71.png +INPUT ./Slide71.png +INPUT Slide71.png +INPUT ./Slide71.png +INPUT ./Slide111.png +INPUT ./Slide111.png +INPUT Slide111.png +INPUT ./Slide111.png +INPUT ./Slide111.png +INPUT ./Slide111.png +INPUT ./Slide111.png +INPUT Slide111.png +INPUT ./Slide111.png +INPUT ./Slide121.png +INPUT ./Slide121.png +INPUT Slide121.png +INPUT ./Slide121.png +INPUT ./Slide121.png +INPUT ./Slide121.png +INPUT ./Slide121.png +INPUT Slide121.png +INPUT ./Slide121.png +INPUT ./Slide81.png +INPUT ./Slide81.png +INPUT Slide81.png +INPUT ./Slide81.png +INPUT ./Slide81.png +INPUT ./Slide81.png +INPUT ./Slide81.png +INPUT Slide81.png +INPUT ./Slide81.png +INPUT ./Slide91.png +INPUT ./Slide91.png +INPUT Slide91.png +INPUT ./Slide91.png +INPUT ./Slide91.png +INPUT ./Slide91.png +INPUT ./Slide91.png +INPUT Slide91.png +INPUT ./Slide91.png +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/txfonts/t1xtt.tfm +INPUT ./book.ind +INPUT book.ind +INPUT ./book.ind +INPUT book.ind +INPUT book.aux +INPUT ./book.out +INPUT ./book.out +INPUT /usr/share/texmf/fonts/enc/dvips/tex-gyre/q-ts1.enc +INPUT /usr/share/texmf/fonts/enc/dvips/tex-gyre/q-ec.enc +INPUT /usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb +INPUT /usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi8.pfb +INPUT /usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb +INPUT /usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb +INPUT /usr/share/texlive/texmf-dist/fonts/type1/public/cbfonts/grmn1095.pfb +INPUT /usr/share/texmf/fonts/type1/public/tex-gyre/qhvb.pfb +INPUT /usr/share/texmf/fonts/type1/public/tex-gyre/qhvbi.pfb +INPUT /usr/share/texmf/fonts/type1/public/tex-gyre/qtmb.pfb +INPUT /usr/share/texmf/fonts/type1/public/tex-gyre/qtmr.pfb +INPUT /usr/share/texmf/fonts/type1/public/tex-gyre/qtmri.pfb +INPUT /usr/share/texlive/texmf-dist/fonts/type1/public/txfonts/t1xtt.pfb diff --git a/book.idx b/book.idx new file mode 100644 index 0000000..e69de29 diff --git a/book.ilg b/book.ilg new file mode 100644 index 0000000..78bd4b6 --- /dev/null +++ b/book.ilg @@ -0,0 +1,5 @@ +This is makeindex, version 2.15 [TeX Live 2022/dev] (kpathsea + Thai support). +Scanning style file ./python.ist.......done (7 attributes redefined, 0 ignored). +Scanning input file book.idx...done (0 entries accepted, 0 rejected). +Nothing written in book.ind. +Transcript written in book.ilg. diff --git a/book.ind b/book.ind new file mode 100644 index 0000000..e69de29 diff --git a/book.log b/book.log new file mode 100644 index 0000000..c70ac97 --- /dev/null +++ b/book.log @@ -0,0 +1,1944 @@ +This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2022/dev/Debian) (preloaded format=pdflatex 2024.3.15) 26 JUL 2024 10:33 +entering extended mode + restricted \write18 enabled. + file:line:error style messages enabled. + %&-line parsing enabled. +**"/home/sens/Documents/Private 5G_ A Systems Approach/book.tex" +(/home/sens/Documents/Private 5G_ A Systems Approach/book.tex +LaTeX2e <2021-11-15> patch level 1 +L3 programming layer <2022-01-21> (./sphinxmanual.cls +Document Class: sphinxmanual 2019/12/01 v2.3.0 Document class (Sphinx manual) +(/usr/share/texlive/texmf-dist/tex/latex/base/report.cls +Document Class: report 2021/10/04 v1.4n Standard LaTeX document class +(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2021/10/04 v1.4n Standard LaTeX file (size option) +) +\c@part=\count185 +\c@chapter=\count186 +\c@section=\count187 +\c@subsection=\count188 +\c@subsubsection=\count189 +\c@paragraph=\count190 +\c@subparagraph=\count191 +\c@figure=\count192 +\c@table=\count193 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +LaTeX Info: Redefining \and on input line 35. +) (/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2021/02/14 v1.3d Input encoding file +\inpenc@prehook=\toks16 +\inpenc@posthook=\toks17 +) + defining Unicode char U+00A0 (decimal 160) + defining Unicode char U+2500 (decimal 9472) + defining Unicode char U+2502 (decimal 9474) + defining Unicode char U+2514 (decimal 9492) + defining Unicode char U+251C (decimal 9500) + defining Unicode char U+2572 (decimal 9586) + (/usr/share/texlive/texmf-dist/tex/latex/cmap/cmap.sty +Package: cmap 2021/02/06 v1.0j CMap support: searchable PDF +) (/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty +Package: fontenc 2021/04/29 v2.0v Standard LaTeX package + (/usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/lgrenc.def +File: lgrenc.def 2020/10/13 2.0 LGR Greek font encoding definitions +Now handling font encoding LGR ... +... processing UTF-8 mapping file for font encoding LGR + (/usr/share/texlive/texmf-dist/tex/latex/greek-inputenc/lgrenc.dfu +File: lgrenc.dfu 2019/07/11 1.7 UTF-8 support for Greek + defining Unicode char U+00A8 (decimal 168) + defining Unicode char U+00AB (decimal 171) + defining Unicode char U+00AF (decimal 175) + defining Unicode char U+00B4 (decimal 180) + defining Unicode char U+00B7 (decimal 183) + defining Unicode char U+00BB (decimal 187) + defining Unicode char U+0259 (decimal 601) + defining Unicode char U+02D8 (decimal 728) + defining Unicode char U+0374 (decimal 884) + defining Unicode char U+0375 (decimal 885) + defining Unicode char U+037A (decimal 890) + defining Unicode char U+037E (decimal 894) + defining Unicode char U+0384 (decimal 900) + defining Unicode char U+0385 (decimal 901) + defining Unicode char U+0386 (decimal 902) + defining Unicode char U+0387 (decimal 903) + defining Unicode char U+0388 (decimal 904) + defining Unicode char U+0389 (decimal 905) + defining Unicode char U+038A (decimal 906) + defining Unicode char U+038C (decimal 908) + defining Unicode char U+038E (decimal 910) + defining Unicode char U+038F (decimal 911) + defining Unicode char U+0390 (decimal 912) + defining Unicode char U+0391 (decimal 913) + defining Unicode char U+0392 (decimal 914) + defining Unicode char U+0393 (decimal 915) + defining Unicode char U+0394 (decimal 916) + defining Unicode char U+0395 (decimal 917) + defining Unicode char U+0396 (decimal 918) + defining Unicode char U+0397 (decimal 919) + defining Unicode char U+0398 (decimal 920) + defining Unicode char U+0399 (decimal 921) + defining Unicode char U+039A (decimal 922) + defining Unicode char U+039B (decimal 923) + defining Unicode char U+039C (decimal 924) + defining Unicode char U+039D (decimal 925) + defining Unicode char U+039E (decimal 926) + defining Unicode char U+039F (decimal 927) + defining Unicode char U+03A0 (decimal 928) + defining Unicode char U+03A1 (decimal 929) + defining Unicode char U+03A3 (decimal 931) + defining Unicode char U+03A4 (decimal 932) + defining Unicode char U+03A5 (decimal 933) + defining Unicode char U+03A6 (decimal 934) + defining Unicode char U+03A7 (decimal 935) + defining Unicode char U+03A8 (decimal 936) + defining Unicode char U+03A9 (decimal 937) + defining Unicode char U+03AA (decimal 938) + defining Unicode char U+03AB (decimal 939) + defining Unicode char U+03AC (decimal 940) + defining Unicode char U+03AD (decimal 941) + defining Unicode char U+03AE (decimal 942) + defining Unicode char U+03AF (decimal 943) + defining Unicode char U+03B0 (decimal 944) + defining Unicode char U+03B1 (decimal 945) + defining Unicode char U+03B2 (decimal 946) + defining Unicode char U+03B3 (decimal 947) + defining Unicode char U+03B4 (decimal 948) + defining Unicode char U+03B5 (decimal 949) + defining Unicode char U+03B6 (decimal 950) + defining Unicode char U+03B7 (decimal 951) + defining Unicode char U+03B8 (decimal 952) + defining Unicode char U+03B9 (decimal 953) + defining Unicode char U+03BA (decimal 954) + defining Unicode char U+03BB (decimal 955) + defining Unicode char U+03BC (decimal 956) + defining Unicode char U+03BD (decimal 957) + defining Unicode char U+03BE (decimal 958) + defining Unicode char U+03BF (decimal 959) + defining Unicode char U+03C0 (decimal 960) + defining Unicode char U+03C1 (decimal 961) + defining Unicode char U+03C2 (decimal 962) + defining Unicode char U+03C3 (decimal 963) + defining Unicode char U+03C4 (decimal 964) + defining Unicode char U+03C5 (decimal 965) + defining Unicode char U+03C6 (decimal 966) + defining Unicode char U+03C7 (decimal 967) + defining Unicode char U+03C8 (decimal 968) + defining Unicode char U+03C9 (decimal 969) + defining Unicode char U+03CA (decimal 970) + defining Unicode char U+03CB (decimal 971) + defining Unicode char U+03CC (decimal 972) + defining Unicode char U+03CD (decimal 973) + defining Unicode char U+03CE (decimal 974) + defining Unicode char U+03D0 (decimal 976) + defining Unicode char U+03D1 (decimal 977) + defining Unicode char U+03D5 (decimal 981) + defining Unicode char U+03D6 (decimal 982) + defining Unicode char U+03D8 (decimal 984) + defining Unicode char U+03D9 (decimal 985) + defining Unicode char U+03DA (decimal 986) + defining Unicode char U+03DB (decimal 987) + defining Unicode char U+03DC (decimal 988) + defining Unicode char U+03DD (decimal 989) + defining Unicode char U+03DF (decimal 991) + defining Unicode char U+03E0 (decimal 992) + defining Unicode char U+03E1 (decimal 993) + defining Unicode char U+03F0 (decimal 1008) + defining Unicode char U+03F1 (decimal 1009) + defining Unicode char U+03F4 (decimal 1012) + defining Unicode char U+03F5 (decimal 1013) + defining Unicode char U+1F00 (decimal 7936) + defining Unicode char U+1F01 (decimal 7937) + defining Unicode char U+1F02 (decimal 7938) + defining Unicode char U+1F03 (decimal 7939) + defining Unicode char U+1F04 (decimal 7940) + defining Unicode char U+1F05 (decimal 7941) + defining Unicode char U+1F06 (decimal 7942) + defining Unicode char U+1F07 (decimal 7943) + defining Unicode char U+1F08 (decimal 7944) + defining Unicode char U+1F09 (decimal 7945) + defining Unicode char U+1F0A (decimal 7946) + defining Unicode char U+1F0B (decimal 7947) + defining Unicode char U+1F0C (decimal 7948) + defining Unicode char U+1F0D (decimal 7949) + defining Unicode char U+1F0E (decimal 7950) + defining Unicode char U+1F0F (decimal 7951) + defining Unicode char U+1F10 (decimal 7952) + defining Unicode char U+1F11 (decimal 7953) + defining Unicode char U+1F12 (decimal 7954) + defining Unicode char U+1F13 (decimal 7955) + defining Unicode char U+1F14 (decimal 7956) + defining Unicode char U+1F15 (decimal 7957) + defining Unicode char U+1F18 (decimal 7960) + defining Unicode char U+1F19 (decimal 7961) + defining Unicode char U+1F1A (decimal 7962) + defining Unicode char U+1F1B (decimal 7963) + defining Unicode char U+1F1C (decimal 7964) + defining Unicode char U+1F1D (decimal 7965) + defining Unicode char U+1F20 (decimal 7968) + defining Unicode char U+1F21 (decimal 7969) + defining Unicode char U+1F22 (decimal 7970) + defining Unicode char U+1F23 (decimal 7971) + defining Unicode char U+1F24 (decimal 7972) + defining Unicode char U+1F25 (decimal 7973) + defining Unicode char U+1F26 (decimal 7974) + defining Unicode char U+1F27 (decimal 7975) + defining Unicode char U+1F28 (decimal 7976) + defining Unicode char U+1F29 (decimal 7977) + defining Unicode char U+1F2A (decimal 7978) + defining Unicode char U+1F2B (decimal 7979) + defining Unicode char U+1F2C (decimal 7980) + defining Unicode char U+1F2D (decimal 7981) + defining Unicode char U+1F2E (decimal 7982) + defining Unicode char U+1F2F (decimal 7983) + defining Unicode char U+1F30 (decimal 7984) + defining Unicode char U+1F31 (decimal 7985) + defining Unicode char U+1F32 (decimal 7986) + defining Unicode char U+1F33 (decimal 7987) + defining Unicode char U+1F34 (decimal 7988) + defining Unicode char U+1F35 (decimal 7989) + defining Unicode char U+1F36 (decimal 7990) + defining Unicode char U+1F37 (decimal 7991) + defining Unicode char U+1F38 (decimal 7992) + defining Unicode char U+1F39 (decimal 7993) + defining Unicode char U+1F3A (decimal 7994) + defining Unicode char U+1F3B (decimal 7995) + defining Unicode char U+1F3C (decimal 7996) + defining Unicode char U+1F3D (decimal 7997) + defining Unicode char U+1F3E (decimal 7998) + defining Unicode char U+1F3F (decimal 7999) + defining Unicode char U+1F40 (decimal 8000) + defining Unicode char U+1F41 (decimal 8001) + defining Unicode char U+1F42 (decimal 8002) + defining Unicode char U+1F43 (decimal 8003) + defining Unicode char U+1F44 (decimal 8004) + defining Unicode char U+1F45 (decimal 8005) + defining Unicode char U+1F48 (decimal 8008) + defining Unicode char U+1F49 (decimal 8009) + defining Unicode char U+1F4A (decimal 8010) + defining Unicode char U+1F4B (decimal 8011) + defining Unicode char U+1F4C (decimal 8012) + defining Unicode char U+1F4D (decimal 8013) + defining Unicode char U+1F50 (decimal 8016) + defining Unicode char U+1F51 (decimal 8017) + defining Unicode char U+1F52 (decimal 8018) + defining Unicode char U+1F53 (decimal 8019) + defining Unicode char U+1F54 (decimal 8020) + defining Unicode char U+1F55 (decimal 8021) + defining Unicode char U+1F56 (decimal 8022) + defining Unicode char U+1F57 (decimal 8023) + defining Unicode char U+1F59 (decimal 8025) + defining Unicode char U+1F5B (decimal 8027) + defining Unicode char U+1F5D (decimal 8029) + defining Unicode char U+1F5F (decimal 8031) + defining Unicode char U+1F60 (decimal 8032) + defining Unicode char U+1F61 (decimal 8033) + defining Unicode char U+1F62 (decimal 8034) + defining Unicode char U+1F63 (decimal 8035) + defining Unicode char U+1F64 (decimal 8036) + defining Unicode char U+1F65 (decimal 8037) + defining Unicode char U+1F66 (decimal 8038) + defining Unicode char U+1F67 (decimal 8039) + defining Unicode char U+1F68 (decimal 8040) + defining Unicode char U+1F69 (decimal 8041) + defining Unicode char U+1F6A (decimal 8042) + defining Unicode char U+1F6B (decimal 8043) + defining Unicode char U+1F6C (decimal 8044) + defining Unicode char U+1F6D (decimal 8045) + defining Unicode char U+1F6E (decimal 8046) + defining Unicode char U+1F6F (decimal 8047) + defining Unicode char U+1F70 (decimal 8048) + defining Unicode char U+1F71 (decimal 8049) + defining Unicode char U+1F72 (decimal 8050) + defining Unicode char U+1F73 (decimal 8051) + defining Unicode char U+1F74 (decimal 8052) + defining Unicode char U+1F75 (decimal 8053) + defining Unicode char U+1F76 (decimal 8054) + defining Unicode char U+1F77 (decimal 8055) + defining Unicode char U+1F78 (decimal 8056) + defining Unicode char U+1F79 (decimal 8057) + defining Unicode char U+1F7A (decimal 8058) + defining Unicode char U+1F7B (decimal 8059) + defining Unicode char U+1F7C (decimal 8060) + defining Unicode char U+1F7D (decimal 8061) + defining Unicode char U+1F80 (decimal 8064) + defining Unicode char U+1F81 (decimal 8065) + defining Unicode char U+1F82 (decimal 8066) + defining Unicode char U+1F83 (decimal 8067) + defining Unicode char U+1F84 (decimal 8068) + defining Unicode char U+1F85 (decimal 8069) + defining Unicode char U+1F86 (decimal 8070) + defining Unicode char U+1F87 (decimal 8071) + defining Unicode char U+1F88 (decimal 8072) + defining Unicode char U+1F89 (decimal 8073) + defining Unicode char U+1F8A (decimal 8074) + defining Unicode char U+1F8B (decimal 8075) + defining Unicode char U+1F8C (decimal 8076) + defining Unicode char U+1F8D (decimal 8077) + defining Unicode char U+1F8E (decimal 8078) + defining Unicode char U+1F8F (decimal 8079) + defining Unicode char U+1F90 (decimal 8080) + defining Unicode char U+1F91 (decimal 8081) + defining Unicode char U+1F92 (decimal 8082) + defining Unicode char U+1F93 (decimal 8083) + defining Unicode char U+1F94 (decimal 8084) + defining Unicode char U+1F95 (decimal 8085) + defining Unicode char U+1F96 (decimal 8086) + defining Unicode char U+1F97 (decimal 8087) + defining Unicode char U+1F98 (decimal 8088) + defining Unicode char U+1F99 (decimal 8089) + defining Unicode char U+1F9A (decimal 8090) + defining Unicode char U+1F9B (decimal 8091) + defining Unicode char U+1F9C (decimal 8092) + defining Unicode char U+1F9D (decimal 8093) + defining Unicode char U+1F9E (decimal 8094) + defining Unicode char U+1F9F (decimal 8095) + defining Unicode char U+1FA0 (decimal 8096) + defining Unicode char U+1FA1 (decimal 8097) + defining Unicode char U+1FA2 (decimal 8098) + defining Unicode char U+1FA3 (decimal 8099) + defining Unicode char U+1FA4 (decimal 8100) + defining Unicode char U+1FA5 (decimal 8101) + defining Unicode char U+1FA6 (decimal 8102) + defining Unicode char U+1FA7 (decimal 8103) + defining Unicode char U+1FA8 (decimal 8104) + defining Unicode char U+1FA9 (decimal 8105) + defining Unicode char U+1FAA (decimal 8106) + defining Unicode char U+1FAB (decimal 8107) + defining Unicode char U+1FAC (decimal 8108) + defining Unicode char U+1FAD (decimal 8109) + defining Unicode char U+1FAE (decimal 8110) + defining Unicode char U+1FAF (decimal 8111) + defining Unicode char U+1FB0 (decimal 8112) + defining Unicode char U+1FB1 (decimal 8113) + defining Unicode char U+1FB2 (decimal 8114) + defining Unicode char U+1FB3 (decimal 8115) + defining Unicode char U+1FB4 (decimal 8116) + defining Unicode char U+1FB6 (decimal 8118) + defining Unicode char U+1FB7 (decimal 8119) + defining Unicode char U+1FB8 (decimal 8120) + defining Unicode char U+1FB9 (decimal 8121) + defining Unicode char U+1FBA (decimal 8122) + defining Unicode char U+1FBB (decimal 8123) + defining Unicode char U+1FBC (decimal 8124) + defining Unicode char U+1FBD (decimal 8125) + defining Unicode char U+1FBE (decimal 8126) + defining Unicode char U+1FBF (decimal 8127) + defining Unicode char U+1FC0 (decimal 8128) + defining Unicode char U+1FC1 (decimal 8129) + defining Unicode char U+1FC2 (decimal 8130) + defining Unicode char U+1FC3 (decimal 8131) + defining Unicode char U+1FC4 (decimal 8132) + defining Unicode char U+1FC6 (decimal 8134) + defining Unicode char U+1FC7 (decimal 8135) + defining Unicode char U+1FC8 (decimal 8136) + defining Unicode char U+1FC9 (decimal 8137) + defining Unicode char U+1FCA (decimal 8138) + defining Unicode char U+1FCB (decimal 8139) + defining Unicode char U+1FCC (decimal 8140) + defining Unicode char U+1FCD (decimal 8141) + defining Unicode char U+1FCE (decimal 8142) + defining Unicode char U+1FCF (decimal 8143) + defining Unicode char U+1FD0 (decimal 8144) + defining Unicode char U+1FD1 (decimal 8145) + defining Unicode char U+1FD2 (decimal 8146) + defining Unicode char U+1FD3 (decimal 8147) + defining Unicode char U+1FD6 (decimal 8150) + defining Unicode char U+1FD7 (decimal 8151) + defining Unicode char U+1FD8 (decimal 8152) + defining Unicode char U+1FD9 (decimal 8153) + defining Unicode char U+1FDA (decimal 8154) + defining Unicode char U+1FDB (decimal 8155) + defining Unicode char U+1FDD (decimal 8157) + defining Unicode char U+1FDE (decimal 8158) + defining Unicode char U+1FDF (decimal 8159) + defining Unicode char U+1FE0 (decimal 8160) + defining Unicode char U+1FE1 (decimal 8161) + defining Unicode char U+1FE2 (decimal 8162) + defining Unicode char U+1FE3 (decimal 8163) + defining Unicode char U+1FE4 (decimal 8164) + defining Unicode char U+1FE5 (decimal 8165) + defining Unicode char U+1FE6 (decimal 8166) + defining Unicode char U+1FE7 (decimal 8167) + defining Unicode char U+1FE8 (decimal 8168) + defining Unicode char U+1FE9 (decimal 8169) + defining Unicode char U+1FEA (decimal 8170) + defining Unicode char U+1FEB (decimal 8171) + defining Unicode char U+1FEC (decimal 8172) + defining Unicode char U+1FED (decimal 8173) + defining Unicode char U+1FEE (decimal 8174) + defining Unicode char U+1FEF (decimal 8175) + defining Unicode char U+1FF2 (decimal 8178) + defining Unicode char U+1FF3 (decimal 8179) + defining Unicode char U+1FF4 (decimal 8180) + defining Unicode char U+1FF6 (decimal 8182) + defining Unicode char U+1FF7 (decimal 8183) + defining Unicode char U+1FF8 (decimal 8184) + defining Unicode char U+1FF9 (decimal 8185) + defining Unicode char U+1FFA (decimal 8186) + defining Unicode char U+1FFB (decimal 8187) + defining Unicode char U+1FFC (decimal 8188) + defining Unicode char U+1FFD (decimal 8189) + defining Unicode char U+1FFE (decimal 8190) + defining Unicode char U+2013 (decimal 8211) + defining Unicode char U+2014 (decimal 8212) + defining Unicode char U+2018 (decimal 8216) + defining Unicode char U+2019 (decimal 8217) + defining Unicode char U+201A (decimal 8218) + defining Unicode char U+2030 (decimal 8240) + defining Unicode char U+2039 (decimal 8249) + defining Unicode char U+203A (decimal 8250) + defining Unicode char U+20AC (decimal 8364) + defining Unicode char U+2126 (decimal 8486) + defining Unicode char U+10144 (decimal 65860) + defining Unicode char U+10145 (decimal 65861) + defining Unicode char U+10146 (decimal 65862) + defining Unicode char U+10147 (decimal 65863) +) (/usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/greek-fontenc.def +File: greek-fontenc.def 2020/10/30 2.0 Common Greek font encoding definitions +))<>) (/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2021/10/15 v2.17l AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2021/08/26 v2.01 AMS text + (/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks18 +\ex@=\dimen139 +)) (/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen140 +) (/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2021/08/26 v2.02 operator names +) +\inf@bad=\count194 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count195 +\leftroot@=\count196 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count197 +\DOTSCASE@=\count198 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box50 +\strutbox@=\box51 +\big@size=\dimen141 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count199 +\c@MaxMatrixCols=\count266 +\dotsspace@=\muskip16 +\c@parentequation=\count267 +\dspbrk@lvl=\count268 +\tag@help=\toks19 +\row@=\count269 +\column@=\count270 +\maxfields@=\count271 +\andhelp@=\toks20 +\eqnshift@=\dimen142 +\alignsep@=\dimen143 +\tagshift@=\dimen144 +\tagwidth@=\dimen145 +\totwidth@=\dimen146 +\lineht@=\dimen147 +\@envbody=\toks21 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks22 +LaTeX Info: Redefining \[ on input line 2938. +LaTeX Info: Redefining \] on input line 2939. +) (/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + (/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) (/usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty +Package: babel 2022/01/26 3.70 The Babel package +\babel@savecnt=\count272 +\U@D=\dimen148 +\l@unhyphenated=\language87 + (/usr/share/texlive/texmf-dist/tex/generic/babel/txtbabel.def) +\bbl@readstream=\read2 +\bbl@dirlevel=\count273 + (/usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf +Language: english 2017/06/06 v3.3r English support from the babel system +Package babel Info: Hyphen rules for 'canadian' set to \l@english +(babel) (\language0). Reported on input line 102. +Package babel Info: Hyphen rules for 'australian' set to \l@ukenglish +(babel) (\language61). Reported on input line 105. +Package babel Info: Hyphen rules for 'newzealand' set to \l@ukenglish +(babel) (\language61). Reported on input line 108. +)) (/usr/share/texlive/texmf-dist/tex/latex/substitutefont/substitutefont.sty +Package: substitutefont 2012/07/07 v0.1.3 combine font families +) (/usr/share/texmf/tex/latex/tex-gyre/tgtermes.sty +Package: tgtermes 2009/09/27 v1.2 TeX Gyre Termes as default roman family + (/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO) + (/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks23 +) (/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO) +) (/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +))) (/usr/share/texmf/tex/latex/tex-gyre/tgheros.sty +Package: tgheros 2009/09/27 v1.2 TeX Gyre Heros as default sans serif family +) (/usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/textalpha.sty +Package: textalpha 2020/10/30 2.0 macros for Greek letters in text +) (/usr/share/texlive/texmf-dist/tex/latex/fncychap/fncychap.sty +Package: fncychap 2007/07/30 v1.34 LaTeX package (Revised chapters) +\RW=\skip52 +\mylen=\skip53 +\myhi=\skip54 +\px=\skip55 +\py=\skip56 +\pyy=\skip57 +\pxx=\skip58 +\c@AlphaCnt=\count274 +\c@AlphaDecCnt=\count275 +) (./sphinx.sty +Package: sphinx 2021/01/27 v4.0.0 LaTeX package (Sphinx markup) + (/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2021/10/31 v2.13 LaTeX color extensions (UK) + (/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 227. + (/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex +) +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1352. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1356. +Package xcolor Info: Model `RGB' extended on input line 1368. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1370. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1371. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1372. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1373. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1374. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1375. +) +\sphinxverbatimsep=\dimen149 +\sphinxverbatimborder=\dimen150 +\sphinxshadowsep=\dimen151 +\sphinxshadowsize=\dimen152 +\sphinxshadowrule=\dimen153 +\spx@notice@border=\dimen154 + (./sphinxoptionshyperref.sty +File: sphinxoptionshyperref.sty 2021/01/27 hyperref +) (./sphinxoptionsgeometry.sty +File: sphinxoptionsgeometry.sty 2021/01/27 geometry +) (/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +Package: textcomp 2020/02/02 v2.0n Standard LaTeX package +) (/usr/share/texlive/texmf-dist/tex/latex/float/float.sty +Package: float 2001/11/08 v1.3d Float enhancements (AL) +\c@float@type=\count276 +\float@exts=\toks24 +\float@box=\box52 +\@float@everytoks=\toks25 +\@floatcapt=\box53 +) (/usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty +\wrapoverhang=\dimen155 +\WF@size=\dimen156 +\c@WF@wrappedlines=\count277 +\WF@box=\box54 +\WF@everypar=\toks26 +Package: wrapfig 2003/01/31 v 3.6 +) (/usr/share/texlive/texmf-dist/tex/latex/capt-of/capt-of.sty +Package: capt-of 2009/12/29 v0.2 standard captions outside of floats +) (/usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty +Package: multicol 2021/10/28 v1.9b multicolumn formatting (FMi) +\c@tracingmulticols=\count278 +\mult@box=\box55 +\multicol@leftmargin=\dimen157 +\c@unbalance=\count279 +\c@collectmore=\count280 +\doublecol@number=\count281 +\multicoltolerance=\count282 +\multicolpretolerance=\count283 +\full@width=\dimen158 +\page@free=\dimen159 +\premulticols=\dimen160 +\postmulticols=\dimen161 +\multicolsep=\skip59 +\multicolbaselineskip=\skip60 +\partial@page=\box56 +\last@line=\box57 +\maxbalancingoverflow=\dimen162 +\mult@rightbox=\box58 +\mult@grightbox=\box59 +\mult@firstbox=\box60 +\mult@gfirstbox=\box61 +\@tempa=\box62 +\@tempa=\box63 +\@tempa=\box64 +\@tempa=\box65 +\@tempa=\box66 +\@tempa=\box67 +\@tempa=\box68 +\@tempa=\box69 +\@tempa=\box70 +\@tempa=\box71 +\@tempa=\box72 +\@tempa=\box73 +\@tempa=\box74 +\@tempa=\box75 +\@tempa=\box76 +\@tempa=\box77 +\@tempa=\box78 +\@tempa=\box79 +\@tempa=\box80 +\@tempa=\box81 +\@tempa=\box82 +\@tempa=\box83 +\@tempa=\box84 +\@tempa=\box85 +\@tempa=\box86 +\@tempa=\box87 +\@tempa=\box88 +\@tempa=\box89 +\@tempa=\box90 +\@tempa=\box91 +\@tempa=\box92 +\@tempa=\box93 +\@tempa=\box94 +\@tempa=\box95 +\@tempa=\box96 +\@tempa=\box97 +\c@minrows=\count284 +\c@columnbadness=\count285 +\c@finalcolumnbadness=\count286 +\last@try=\dimen163 +\multicolovershoot=\dimen164 +\multicolundershoot=\dimen165 +\mult@nat@firstbox=\box98 +\colbreak@box=\box99 +\mc@col@check@num=\count287 +) (/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2021/09/16 v1.2d Enhanced LaTeX Graphics (DPC,SPQR) + (/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2021/03/04 v1.4d Standard LaTeX Graphics (DPC,SPQR) + (/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2021/08/11 v1.11 sin cos tan (DPC) +) (/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 107. +) +\Gin@req@height=\dimen166 +\Gin@req@width=\dimen167 +) (./sphinxlatexgraphics.sty +File: sphinxlatexgraphics.sty 2021/01/27 graphics +\spx@image@maxheight=\dimen168 +\spx@image@box=\box100 +) (./sphinxlatexadmonitions.sty +File: sphinxlatexadmonitions.sty 2021/01/27 admonitions + (/usr/share/texlive/texmf-dist/tex/latex/framed/framed.sty +Package: framed 2011/10/22 v 0.96: framed or shaded text with page breaks +\OuterFrameSep=\skip61 +\fb@frw=\dimen169 +\fb@frh=\dimen170 +\FrameRule=\dimen171 +\FrameSep=\dimen172 +)) (./sphinxlatexliterals.sty +File: sphinxlatexliterals.sty 2021/12/06 code-blocks and parsed literals + (/usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +Package: fancyvrb 2021/12/21 4.1b verbatim text (tvz,hv) +\FV@CodeLineNo=\count288 +\FV@InFile=\read3 +\FV@TabBox=\box101 +\c@FancyVerbLine=\count289 +\FV@StepNumber=\count290 +\FV@OutFile=\write3 +) (/usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty +Package: alltt 2021/01/29 v2.0g defines alltt environment +) (/usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty +Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verbatim +) (/usr/share/texlive/texmf-dist/tex/latex/needspace/needspace.sty +Package: needspace 2010/09/12 v1.3d reserve vertical space +) +\sphinxcontinuationbox=\box102 +\sphinxvisiblespacebox=\box103 +\sphinxVerbatim@TitleBox=\box104 +\sphinxVerbatim@ContentsBox=\box105 +\spx@scratchbox=\box106 +) (./sphinxlatexshadowbox.sty +File: sphinxlatexshadowbox.sty 2021/01/27 sphinxShadowBox +) (./sphinxlatexcontainers.sty +File: sphinxlatexcontainers.sty 2021/05/03 containers +) (./sphinxhighlight.sty +Package: sphinxhighlight 2016/05/29 stylesheet for highlighting with pygments +) (./sphinxlatextables.sty +File: sphinxlatextables.sty 2021/01/27 tables + (/usr/share/texlive/texmf-dist/tex/latex/tabulary/tabulary.sty +Package: tabulary 2014/06/11 v0.10 tabulary package (DPC) + (/usr/share/texlive/texmf-dist/tex/latex/tools/array.sty +Package: array 2021/10/04 v2.5f Tabular extension package (FMi) +\col@sep=\dimen173 +\ar@mcellbox=\box107 +\extrarowheight=\dimen174 +\NC@list=\toks27 +\extratabsurround=\skip62 +\backup@length=\skip63 +\ar@cellbox=\box108 +) +\TY@count=\count291 +\TY@linewidth=\dimen175 +\tymin=\dimen176 +\tymax=\dimen177 +\TY@tablewidth=\dimen178 +) (/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty +Package: longtable 2021-09-01 v4.17 Multi-page Table package (DPC) +\LTleft=\skip64 +\LTright=\skip65 +\LTpre=\skip66 +\LTpost=\skip67 +\LTchunksize=\count292 +\LTcapwidth=\dimen179 +\LT@head=\box109 +\LT@firsthead=\box110 +\LT@foot=\box111 +\LT@lastfoot=\box112 +\LT@gbox=\box113 +\LT@cols=\count293 +\LT@rows=\count294 +\c@LT@tables=\count295 +\c@LT@chunks=\count296 +\LT@p@ftn=\toks28 +) (/usr/share/texlive/texmf-dist/tex/latex/varwidth/varwidth.sty +Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages +\@vwid@box=\box114 +\sift@deathcycles=\count297 +\@vwid@loff=\dimen180 +\@vwid@roff=\dimen181 +) +\sphinx@TY@tablewidth=\dimen182 +) (./sphinxlatexnumfig.sty +File: sphinxlatexnumfig.sty 2021/01/27 numbering +) (./sphinxlatexlists.sty +File: sphinxlatexlists.sty 2021/01/27 lists +) +\c@sphinxscope=\count298 +\c@sphinxexplicit=\count299 + (./sphinxpackagefootnote.sty +Package: sphinxpackagefootnote 2021/02/04 v1.1d footnotehyper adapted to sphinx (Sphinx team) +\FNH@notes=\box115 +\FNH@toks=\toks29 +\FNH@width=\dimen183 +) (./sphinxlatexindbibtoc.sty +File: sphinxlatexindbibtoc.sty 2021/01/27 index, bib., toc + (/usr/share/texlive/texmf-dist/tex/latex/base/makeidx.sty +Package: makeidx 2021/10/04 v1.0m Standard LaTeX package +)) (./sphinxlatexstylepage.sty +File: sphinxlatexstylepage.sty 2021/01/27 page styling + (/usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty +Rollback for package 'parskip' requested -> version 'v1'. + This corresponds to the release introduced on 2001-04-09. + (/usr/share/texlive/texmf-dist/tex/latex/parskip/parskip-2001-04-09.sty +Package: parskip 2001/04/09 non-zero parskip adjustments +)) (/usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty +Package: fancyhdr 2021/01/28 v4.0.1 Extensive control of page headers and footers +\f@nch@headwidth=\skip68 +\f@nch@O@elh=\skip69 +\f@nch@O@erh=\skip70 +\f@nch@O@olh=\skip71 +\f@nch@O@orh=\skip72 +\f@nch@O@elf=\skip73 +\f@nch@O@erf=\skip74 +\f@nch@O@olf=\skip75 +\f@nch@O@orf=\skip76 +)) (./sphinxlatexstyleheadings.sty +File: sphinxlatexstyleheadings.sty 2021/01/27 headings + (/usr/share/texlive/texmf-dist/tex/latex/titlesec/titlesec.sty +Package: titlesec 2021/07/05 v2.14 Sectioning titles +\ttl@box=\box116 +\beforetitleunit=\skip77 +\aftertitleunit=\skip78 +\ttl@plus=\dimen184 +\ttl@minus=\dimen185 +\ttl@toksa=\toks30 +\titlewidth=\dimen186 +\titlewidthlast=\dimen187 +\titlewidthfirst=\dimen188 +)) (./sphinxlatexstyletext.sty +File: sphinxlatexstyletext.sty 2021/12/06 text styling +) (./sphinxlatexobjects.sty +File: sphinxlatexobjects.sty 2021/12/05 documentation environments +\py@argswidth=\skip79 +\lineblockindentation=\skip80 +\DUlineblockindent=\skip81 +)) (/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + (/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. + (/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +\Gm@cnth=\count300 +\Gm@cntv=\count301 +\c@Gm@tempcnt=\count302 +\Gm@bindingoffset=\dimen189 +\Gm@wd@mp=\dimen190 +\Gm@odd@mp=\dimen191 +\Gm@even@mp=\dimen192 +\Gm@layoutwidth=\dimen193 +\Gm@layoutheight=\dimen194 +\Gm@layouthoffset=\dimen195 +\Gm@layoutvoffset=\dimen196 +\Gm@dimlist=\toks31 +) (/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2021-06-07 v7.00m Hypertext links for LaTeX + (/usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO) + (/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) (/usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) (/usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) (/usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) (/usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) (/usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +\@linkdim=\dimen197 +\Hy@linkcounter=\count303 +\Hy@pagecounter=\count304 + (/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2021-06-07 v7.00m Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) (/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref-langpatches.def +File: hyperref-langpatches.def 2021-06-07 v7.00m Hyperref: patches for babel languages +) (/usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) (/usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) +) +\Hy@SavedSpaceFactor=\count305 + (/usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def +File: puenc.def 2021-06-07 v7.00m Hyperref: PDF Unicode definition (HO) +Now handling font encoding PU ... +... no UTF-8 mapping file for font encoding PU + (/usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc-greekbasic.def +File: puenc-greekbasic.def 2021-06-07 v7.00m Hyperref: PDF Unicode definition (greek block) (HO) +)) +Package hyperref Info: Option `unicode' set `true' on input line 4073. +Package hyperref Info: Option `colorlinks' set `true' on input line 4073. +Package hyperref Info: Option `breaklinks' set `true' on input line 4073. +Package hyperref Info: Hyper figures OFF on input line 4192. +Package hyperref Info: Link nesting OFF on input line 4197. +Package hyperref Info: Hyper index ON on input line 4200. +Package hyperref Info: Plain pages OFF on input line 4207. +Package hyperref Info: Backreferencing OFF on input line 4212. +Package hyperref Info: Implicit mode ON; LaTeX internals redefined. +Package hyperref Info: Bookmarks ON on input line 4445. +\c@Hy@tempcnt=\count306 + (/usr/share/texlive/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip17 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 4804. +\XeTeXLinkMargin=\dimen198 + (/usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + (/usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO) +)) +\Fld@menulength=\count307 +\Field@Width=\dimen199 +\Fld@charsize=\dimen256 +Package hyperref Info: Hyper figures OFF on input line 6076. +Package hyperref Info: Link nesting OFF on input line 6081. +Package hyperref Info: Hyper index ON on input line 6084. +Package hyperref Info: backreferencing OFF on input line 6091. +Package hyperref Info: Link coloring ON on input line 6094. +Package hyperref Info: Link coloring with OCG OFF on input line 6101. +Package hyperref Info: PDF/A mode OFF on input line 6106. +LaTeX Info: Redefining \ref on input line 6146. +LaTeX Info: Redefining \pageref on input line 6150. + (/usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty +Package: atbegshi-ltx 2021/01/10 v1.0c Emulation of the original atbegshi +package with kernel methods +) +\Hy@abspage=\count308 +\c@Item=\count309 +\c@Hfootnote=\count310 +) +Package hyperref Info: Driver (autodetected): hpdftex. + (/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2021-06-07 v7.00m Hyperref driver for pdfTeX + (/usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty +Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atveryend package +with kernel methods +) +\Fld@listcount=\count311 +\c@bookmark@seq@number=\count312 + (/usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) + (/usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 286. +) +\Hy@SectionHShift=\skip82 +) (/usr/share/texlive/texmf-dist/tex/latex/oberdiek/hypcap.sty +Package: hypcap 2016/05/16 v1.12 Adjusting the anchors of captions (HO) +) (./sphinxmessages.sty +Package: sphinxmessages 2019/01/04 v2.0 Localized LaTeX macros (Sphinx team) +) +\@indexfile=\write4 +\openout4 = `book.idx'. + + +Writing index file book.idx +LaTeX Font Info: Trying to load font information for T1+qtm on input line 92. +(/usr/share/texmf/tex/latex/tex-gyre/t1qtm.fd +File: t1qtm.fd 2009/09/25 v1.2 font definition file for T1/qtm +) (/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2022-01-12 L3 backend support: PDF output (pdfTeX) +\l__color_backend_stack_int=\count313 +\l__pdf_internal_box=\box117 +) (./book.aux) +\openout1 = `book.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 92. +LaTeX Font Info: ... okay on input line 92. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 92. +LaTeX Font Info: ... okay on input line 92. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 92. +LaTeX Font Info: ... okay on input line 92. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 92. +LaTeX Font Info: ... okay on input line 92. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 92. +LaTeX Font Info: ... okay on input line 92. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 92. +LaTeX Font Info: ... okay on input line 92. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 92. +LaTeX Font Info: ... okay on input line 92. +LaTeX Font Info: Checking defaults for LGR/cmr/m/n on input line 92. +LaTeX Font Info: Trying to load font information for LGR+cmr on input line 92. + (/usr/share/texlive/texmf-dist/tex/latex/cbfonts-fd/lgrcmr.fd +File: lgrcmr.fd 2017/07/29 v1.2 Greek European Computer Regular +) +LaTeX Font Info: ... okay on input line 92. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 92. +LaTeX Font Info: ... okay on input line 92. +LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 92. +LaTeX Font Info: ... okay on input line 92. + (/usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/puenc-greek.def +File: puenc-greek.def 2020/10/18 2.0 Greek LICRs for PDF strings + (/usr/share/texlive/texmf-dist/tex/latex/greek-fontenc/greek-fontenc.def +File: greek-fontenc.def 2020/10/30 2.0 Common Greek font encoding definitions +)) (/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count314 +\scratchdimen=\dimen257 +\scratchbox=\box118 +\nofMPsegments=\count315 +\nofMParguments=\count316 +\everyMPshowfont=\toks32 +\MPscratchCnt=\count317 +\MPscratchDim=\dimen258 +\MPnumerator=\count318 +\makeMPintoPDFobject=\count319 +\everyMPtoPDFconversion=\toks33 +) (/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 485. + (/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Live +)) +\c@literalblock=\count320 + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: a4paper +* layout: +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: twoside +* h-part:(L,W,R)=(72.26999pt, 452.9679pt, 72.26999pt) +* v-part:(T,H,B)=(72.26999pt, 700.50687pt, 72.26999pt) +* \paperwidth=597.50787pt +* \paperheight=845.04684pt +* \textwidth=452.9679pt +* \textheight=700.50687pt +* \oddsidemargin=0.0pt +* \evensidemargin=0.0pt +* \topmargin=-37.0pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=11.0pt +* \footskip=30.0pt +* \marginparwidth=36.135pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidetrue +* \@mparswitchtrue +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +Package hyperref Info: Link coloring ON on input line 92. +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2021-04-02 v2.47 Cross-referencing by name of section + (/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) (/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) +) +\c@section@level=\count321 +) +LaTeX Info: Redefining \ref on input line 92. +LaTeX Info: Redefining \pageref on input line 92. +LaTeX Info: Redefining \nameref on input line 92. + (./book.out) (./book.out) +\@outlinefile=\write5 +\openout5 = `book.out'. + +Package hyperref Info: Option `pageanchor' set `false' on input line 95. +LaTeX Font Info: Trying to load font information for T1+qhv on input line 95. + (/usr/share/texmf/tex/latex/tex-gyre/t1qhv.fd +File: t1qhv.fd 2009/09/25 v1.2 font definition file for T1/qhv +)<><><><> +LaTeX Font Info: Trying to load font information for U+msa on input line 95. + (/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 95. + (/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) [1 + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] [2 + + +] (./book.toc [1 + +]) +\tf@toc=\write6 +\openout6 = `book.toc'. + + [2] [1 + + +] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[2] [3 + +] +LaTeX Font Info: Trying to load font information for TS1+qtm on input line 249. + (/usr/share/texmf/tex/latex/tex-gyre/ts1qtm.fd +File: ts1qtm.fd 2009/09/25 v1.2 font definition file for TS1/qtm +) + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[4] +Chapter 1. +[5 + +] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[6] + +LaTeX Font Info: Trying to load font information for T1+txtt on input line 517. + (/usr/share/texlive/texmf-dist/tex/latex/txfonts/t1txtt.fd +File: t1txtt.fd 2000/12/15 v3.1 +) +File: Slide1.png Graphic file (type png) + +Package pdftex.def Info: Slide1.png used on input line 517. +(pdftex.def) Requested size: 376.40381pt x 219.51097pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[7] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[8 <./Slide1.png>] + +File: Slide14.png Graphic file (type png) + +Package pdftex.def Info: Slide14.png used on input line 644. +(pdftex.def) Requested size: 451.68457pt x 240.8327pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[9] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[10 <./Slide14.png>] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[11] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[12 + +] +Chapter 2. + +File: Slide2.png Graphic file (type png) + +Package pdftex.def Info: Slide2.png used on input line 854. +(pdftex.def) Requested size: 451.68457pt x 207.11969pt. +[13] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[14 <./Slide2.png>] + +File: Slide3.png Graphic file (type png) + +Package pdftex.def Info: Slide3.png used on input line 972. +(pdftex.def) Requested size: 301.12305pt x 151.33533pt. + +File: Slide4.png Graphic file (type png) + +Package pdftex.def Info: Slide4.png used on input line 1001. +(pdftex.def) Requested size: 376.40381pt x 152.60303pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[15 <./Slide3.png>] + +File: Slide5.png Graphic file (type png) + +Package pdftex.def Info: Slide5.png used on input line 1052. +(pdftex.def) Requested size: 225.84229pt x 166.82321pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[16 <./Slide4.png> <./Slide5.png>] + +File: Slide6.png Graphic file (type png) + +Package pdftex.def Info: Slide6.png used on input line 1135. +(pdftex.def) Requested size: 376.40381pt x 168.68105pt. + +File: Slide7.png Graphic file (type png) + +Package pdftex.def Info: Slide7.png used on input line 1149. +(pdftex.def) Requested size: 376.40381pt x 169.81593pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[17] + +File: Slide8.png Graphic file (type png) + +Package pdftex.def Info: Slide8.png used on input line 1165. +(pdftex.def) Requested size: 376.40381pt x 182.33691pt. + +File: Slide9.png Graphic file (type png) + +Package pdftex.def Info: Slide9.png used on input line 1192. +(pdftex.def) Requested size: 376.40381pt x 181.75334pt. + +File: Slide10.png Graphic file (type png) + +Package pdftex.def Info: Slide10.png used on input line 1211. +(pdftex.def) Requested size: 376.40381pt x 185.84286pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[18 <./Slide6.png> <./Slide7.png>] + +File: Slide11.png Graphic file (type png) + +Package pdftex.def Info: Slide11.png used on input line 1223. +(pdftex.def) Requested size: 376.40381pt x 180.33786pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[19 <./Slide8.png> <./Slide9.png>] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[20 <./Slide10.png> <./Slide11.png>] + +File: Slide12.png Graphic file (type png) + +Package pdftex.def Info: Slide12.png used on input line 1333. +(pdftex.def) Requested size: 451.68457pt x 172.33372pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[21 <./Slide12.png>] + +File: Slide13.png Graphic file (type png) + +Package pdftex.def Info: Slide13.png used on input line 1384. +(pdftex.def) Requested size: 376.40381pt x 165.78998pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[22 <./Slide13.png>] + +File: Slide21.png Graphic file (type png) + +Package pdftex.def Info: Slide21.png used on input line 1483. +(pdftex.def) Requested size: 225.84229pt x 165.55951pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[23 <./Slide21.png>] + +File: Slide31.png Graphic file (type png) + +Package pdftex.def Info: Slide31.png used on input line 1518. +(pdftex.def) Requested size: 452.96808pt x 242.67538pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[24 <./Slide31.png>] +Chapter 3. + +File: Slide141.png Graphic file (type png) + +Package pdftex.def Info: Slide141.png used on input line 1612. +(pdftex.def) Requested size: 376.40381pt x 42.36241pt. +[25 + + <./Slide141.png>] + +File: Slide15.png Graphic file (type png) + +Package pdftex.def Info: Slide15.png used on input line 1641. +(pdftex.def) Requested size: 451.68457pt x 151.27211pt. +LaTeX Font Info: Font shape `LGR/qtm/m/n' in size <10.95> not available +(Font) Font shape `LGR/cmr/m/n' tried instead on input line 1650. +<> + +File: Slide16.png Graphic file (type png) + +Package pdftex.def Info: Slide16.png used on input line 1679. +(pdftex.def) Requested size: 376.40381pt x 201.2147pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[26 <./Slide15.png>] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[27 <./Slide16.png>] + +File: Slide17.png Graphic file (type png) + +Package pdftex.def Info: Slide17.png used on input line 1784. +(pdftex.def) Requested size: 451.68457pt x 224.97276pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[28 <./Slide17.png>] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[29] + +File: Slide18.png Graphic file (type png) + +Package pdftex.def Info: Slide18.png used on input line 1961. +(pdftex.def) Requested size: 451.68457pt x 190.60326pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[30 <./Slide18.png>] + +File: Slide19.png Graphic file (type png) + +Package pdftex.def Info: Slide19.png used on input line 2002. +(pdftex.def) Requested size: 451.68457pt x 241.3707pt. + +File: Slide20.png Graphic file (type png) + +Package pdftex.def Info: Slide20.png used on input line 2024. +(pdftex.def) Requested size: 451.68457pt x 237.72876pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[31 <./Slide19.png>] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[32 <./Slide20.png>] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[33] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[34 + +] +Chapter 4. + +File: Slide110.png Graphic file (type png) + +Package pdftex.def Info: Slide110.png used on input line 2190. +(pdftex.def) Requested size: 451.68457pt x 136.56361pt. +[35 <./Slide110.png>] + +File: Slide24.png Graphic file (type png) + +Package pdftex.def Info: Slide24.png used on input line 2283. +(pdftex.def) Requested size: 451.68457pt x 104.7797pt. + +File: Slide32.png Graphic file (type png) + +Package pdftex.def Info: Slide32.png used on input line 2301. +(pdftex.def) Requested size: 301.12305pt x 203.47942pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[36] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[37 <./Slide24.png> <./Slide32.png>] + +File: Slide101.png Graphic file (type png) + +Package pdftex.def Info: Slide101.png used on input line 2383. +(pdftex.def) Requested size: 112.92114pt x 295.30843pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[38 <./Slide101.png>] + +File: Slide42.png Graphic file (type png) + +Package pdftex.def Info: Slide42.png used on input line 2452. +(pdftex.def) Requested size: 451.68457pt x 109.11333pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[39 <./Slide42.png>] + +File: Slide52.png Graphic file (type png) + +Package pdftex.def Info: Slide52.png used on input line 2473. +(pdftex.def) Requested size: 301.12305pt x 376.76074pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[40 <./Slide52.png>] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[41] + +File: Slide62.png Graphic file (type png) + +Package pdftex.def Info: Slide62.png used on input line 2677. +(pdftex.def) Requested size: 301.12305pt x 270.84076pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[42 <./Slide62.png>] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[43] + +File: Slide72.png Graphic file (type png) + +Package pdftex.def Info: Slide72.png used on input line 2805. +(pdftex.def) Requested size: 338.76343pt x 112.9196pt. + +File: Slide82.png Graphic file (type png) + +Package pdftex.def Info: Slide82.png used on input line 2821. +(pdftex.def) Requested size: 338.76343pt x 106.04202pt. + +File: Slide92.png Graphic file (type png) + +Package pdftex.def Info: Slide92.png used on input line 2840. +(pdftex.def) Requested size: 452.96703pt x 195.54727pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[44 <./Slide72.png> <./Slide82.png>] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[45 <./Slide92.png>] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[46 + +] +Chapter 5. +[47] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[48] + +File: Slide211.png Graphic file (type png) + +Package pdftex.def Info: Slide211.png used on input line 3034. +(pdftex.def) Requested size: 452.95593pt x 162.7244pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[49 <./Slide211.png>] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[50] + +File: Slide22.png Graphic file (type png) + +Package pdftex.def Info: Slide22.png used on input line 3205. +(pdftex.def) Requested size: 451.68457pt x 224.33572pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[51 <./Slide22.png>] + +File: Slide112.png Graphic file (type png) + +Package pdftex.def Info: Slide112.png used on input line 3318. +(pdftex.def) Requested size: 451.68457pt x 235.63014pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[52] + +File: peru_deploy_labelled.jpg Graphic file (type jpg) + +Package pdftex.def Info: peru_deploy_labelled.jpg used on input line 3353. +(pdftex.def) Requested size: 225.84229pt x 348.25757pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[53 <./Slide112.png>] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[54 <./peru_deploy_labelled.jpg>] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[55] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[56] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[57] + +File: Slide23.png Graphic file (type png) + +Package pdftex.def Info: Slide23.png used on input line 3747. +(pdftex.def) Requested size: 376.40381pt x 333.88818pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[58] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[59 <./Slide23.png>] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[60 + +] +Chapter 6. + +File: Slide41.png Graphic file (type png) + +Package pdftex.def Info: Slide41.png used on input line 3829. +(pdftex.def) Requested size: 301.12305pt x 170.43684pt. +[61] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[62 <./Slide41.png>] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[63] + +File: Slide51.png Graphic file (type png) + +Package pdftex.def Info: Slide51.png used on input line 4013. +(pdftex.def) Requested size: 263.48267pt x 180.37988pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[64 <./Slide51.png>] + +File: Slide61.png Graphic file (type png) + +Package pdftex.def Info: Slide61.png used on input line 4073. +(pdftex.def) Requested size: 451.68457pt x 144.36209pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[65 <./Slide61.png>] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[66] + +File: Slide71.png Graphic file (type png) + +Package pdftex.def Info: Slide71.png used on input line 4251. +(pdftex.def) Requested size: 451.68457pt x 276.31488pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[67] + +File: Slide111.png Graphic file (type png) + +Package pdftex.def Info: Slide111.png used on input line 4312. +(pdftex.def) Requested size: 376.40381pt x 255.2257pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[68 <./Slide71.png>] + +File: Slide121.png Graphic file (type png) + +Package pdftex.def Info: Slide121.png used on input line 4364. +(pdftex.def) Requested size: 338.76343pt x 158.6059pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[69 <./Slide111.png>] + +File: Slide81.png Graphic file (type png) + +Package pdftex.def Info: Slide81.png used on input line 4386. +(pdftex.def) Requested size: 451.68457pt x 182.22449pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[70 <./Slide121.png> <./Slide81.png>] + +File: Slide91.png Graphic file (type png) + +Package pdftex.def Info: Slide91.png used on input line 4484. +(pdftex.def) Requested size: 301.12305pt x 165.03128pt. + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[71] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[72 <./Slide91.png>] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[73] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[74] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[75] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[76] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[77] + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[78 + +] +Chapter 7. +[79] +Underfull \hbox (badness 6348) in paragraph at lines 5064--5067 +\T1/qtm/m/n/10.95 This book is part of the [][]Sys-tems Ap-proach Se-ries[][], with an on-line ver-sion pub-lished at + [] + + +Package fancyhdr Warning: \headheight is too small (12.0pt): +(fancyhdr) Make it at least 13.59999pt, for example: +(fancyhdr) \setlength{\headheight}{13.59999pt}. +(fancyhdr) You might also make \topmargin smaller to compensate: +(fancyhdr) \addtolength{\topmargin}{-1.59999pt}. + +[80] +Chapter 8. +(./book.ind) [81 + +] (./book.aux) +Package rerunfilecheck Info: File `book.out' has not changed. +(rerunfilecheck) Checksum: 48C87ABC398957A4E85279B800BBBEB5;9306. + ) +Here is how much of TeX's memory you used: + 17148 strings out of 478287 + 273967 string characters out of 5849289 + 580250 words of memory out of 5000000 + 34652 multiletter control sequences out of 15000+600000 + 534621 words of font info for 92 fonts, out of 8000000 for 9000 + 1142 hyphenation exceptions out of 8191 + 70i,14n,76p,641b,548s stack positions out of 5000i,500n,10000p,200000b,80000s +{/usr/share/texmf/fonts/enc/dvips/tex-gyre/q-ts1.enc}{/usr/share/texmf/fonts/enc/dvips/tex-gyre/q-ec.enc} +Output written on book.pdf (85 pages, 3632190 bytes). +PDF statistics: + 1184 PDF objects out of 1200 (max. 8388607) + 977 compressed objects within 10 object streams + 230 named destinations out of 1000 (max. 500000) + 695 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/book.out b/book.out new file mode 100644 index 0000000..d8b9c26 --- /dev/null +++ b/book.out @@ -0,0 +1,55 @@ +\BOOKMARK [0][-]{chapter.1}{\376\377\000C\000h\000a\000p\000t\000e\000r\000\040\0001\000:\000\040\000I\000n\000t\000r\000o\000d\000u\000c\000t\000i\000o\000n}{}% 1 +\BOOKMARK [1][-]{section.1.1}{\376\377\0001\000.\0001\000\040\000S\000t\000a\000n\000d\000a\000r\000d\000i\000z\000a\000t\000i\000o\000n\000\040\000L\000a\000n\000d\000s\000c\000a\000p\000e}{chapter.1}% 2 +\BOOKMARK [1][-]{section.1.2}{\376\377\0001\000.\0002\000\040\000A\000c\000c\000e\000s\000s\000\040\000N\000e\000t\000w\000o\000r\000k\000s}{chapter.1}% 3 +\BOOKMARK [1][-]{section.1.3}{\376\377\0001\000.\0003\000\040\000M\000a\000n\000a\000g\000e\000d\000\040\000C\000l\000o\000u\000d\000\040\000S\000e\000r\000v\000i\000c\000e}{chapter.1}% 4 +\BOOKMARK [1][-]{section.1.4}{\376\377\0001\000.\0004\000\040\000B\000e\000y\000o\000n\000d\000\040\0005\000G}{chapter.1}% 5 +\BOOKMARK [0][-]{chapter.2}{\376\377\000C\000h\000a\000p\000t\000e\000r\000\040\0002\000:\000\040\000A\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000e}{}% 6 +\BOOKMARK [1][-]{section.2.1}{\376\377\0002\000.\0001\000\040\000O\000v\000e\000r\000v\000i\000e\000w}{chapter.2}% 7 +\BOOKMARK [1][-]{section.2.2}{\376\377\0002\000.\0002\000\040\000R\000a\000d\000i\000o\000\040\000T\000r\000a\000n\000s\000m\000i\000s\000s\000i\000o\000n}{chapter.2}% 8 +\BOOKMARK [1][-]{section.2.3}{\376\377\0002\000.\0003\000\040\000R\000a\000d\000i\000o\000\040\000A\000c\000c\000e\000s\000s\000\040\000N\000e\000t\000w\000o\000r\000k}{chapter.2}% 9 +\BOOKMARK [1][-]{section.2.4}{\376\377\0002\000.\0004\000\040\000M\000o\000b\000i\000l\000e\000\040\000C\000o\000r\000e}{chapter.2}% 10 +\BOOKMARK [1][-]{section.2.5}{\376\377\0002\000.\0005\000\040\000M\000a\000n\000a\000g\000e\000d\000\040\000C\000l\000o\000u\000d\000\040\000S\000e\000r\000v\000i\000c\000e}{chapter.2}% 11 +\BOOKMARK [0][-]{chapter.3}{\376\377\000C\000h\000a\000p\000t\000e\000r\000\040\0003\000:\000\040\000R\000a\000d\000i\000o\000\040\000T\000r\000a\000n\000s\000m\000i\000s\000s\000i\000o\000n}{}% 12 +\BOOKMARK [1][-]{section.3.1}{\376\377\0003\000.\0001\000\040\000C\000o\000d\000i\000n\000g\000\040\000a\000n\000d\000\040\000M\000o\000d\000u\000l\000a\000t\000i\000o\000n}{chapter.3}% 13 +\BOOKMARK [1][-]{section.3.2}{\376\377\0003\000.\0002\000\040\000S\000c\000h\000e\000d\000u\000l\000e\000r}{chapter.3}% 14 +\BOOKMARK [2][-]{subsection.3.2.1}{\376\377\0003\000.\0002\000.\0001\000\040\000M\000u\000l\000t\000i\000p\000l\000e\000x\000i\000n\000g\000\040\000i\000n\000\040\0004\000G}{section.3.2}% 15 +\BOOKMARK [2][-]{subsection.3.2.2}{\376\377\0003\000.\0002\000.\0002\000\040\000M\000u\000l\000t\000i\000p\000l\000e\000x\000i\000n\000g\000\040\000i\000n\000\040\0005\000G}{section.3.2}% 16 +\BOOKMARK [1][-]{section.3.3}{\376\377\0003\000.\0003\000\040\000V\000i\000r\000t\000u\000a\000l\000i\000z\000e\000d\000\040\000S\000c\000h\000e\000d\000u\000l\000e\000r\000\040\000\050\000S\000l\000i\000c\000i\000n\000g\000\051}{chapter.3}% 17 +\BOOKMARK [1][-]{section.3.4}{\376\377\0003\000.\0004\000\040\000N\000e\000w\000\040\000U\000s\000e\000\040\000C\000a\000s\000e\000s}{chapter.3}% 18 +\BOOKMARK [0][-]{chapter.4}{\376\377\000C\000h\000a\000p\000t\000e\000r\000\040\0004\000:\000\040\000R\000a\000d\000i\000o\000\040\000A\000c\000c\000e\000s\000s\000\040\000N\000e\000t\000w\000o\000r\000k}{}% 19 +\BOOKMARK [1][-]{section.4.1}{\376\377\0004\000.\0001\000\040\000P\000a\000c\000k\000e\000t\000\040\000P\000r\000o\000c\000e\000s\000s\000i\000n\000g\000\040\000P\000i\000p\000e\000l\000i\000n\000e}{chapter.4}% 20 +\BOOKMARK [1][-]{section.4.2}{\376\377\0004\000.\0002\000\040\000S\000p\000l\000i\000t\000\040\000R\000A\000N}{chapter.4}% 21 +\BOOKMARK [1][-]{section.4.3}{\376\377\0004\000.\0003\000\040\000S\000o\000f\000t\000w\000a\000r\000e\000-\000D\000e\000f\000i\000n\000e\000d\000\040\000R\000A\000N}{chapter.4}% 22 +\BOOKMARK [1][-]{section.4.4}{\376\377\0004\000.\0004\000\040\000N\000e\000a\000r\000\040\000R\000e\000a\000l\000-\000T\000i\000m\000e\000\040\000R\000I\000C}{chapter.4}% 23 +\BOOKMARK [1][-]{section.4.5}{\376\377\0004\000.\0005\000\040\000C\000o\000n\000t\000r\000o\000l\000\040\000L\000o\000o\000p\000s}{chapter.4}% 24 +\BOOKMARK [0][-]{chapter.5}{\376\377\000C\000h\000a\000p\000t\000e\000r\000\040\0005\000:\000\040\000M\000o\000b\000i\000l\000e\000\040\000C\000o\000r\000e}{}% 25 +\BOOKMARK [1][-]{section.5.1}{\376\377\0005\000.\0001\000\040\000I\000d\000e\000n\000t\000i\000t\000y\000\040\000M\000a\000n\000a\000g\000e\000m\000e\000n\000t}{chapter.5}% 26 +\BOOKMARK [1][-]{section.5.2}{\376\377\0005\000.\0002\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000a\000l\000\040\000C\000o\000m\000p\000o\000n\000e\000n\000t\000s}{chapter.5}% 27 +\BOOKMARK [1][-]{section.5.3}{\376\377\0005\000.\0003\000\040\000C\000o\000n\000t\000r\000o\000l\000\040\000P\000l\000a\000n\000e}{chapter.5}% 28 +\BOOKMARK [2][-]{subsection.5.3.1}{\376\377\0005\000.\0003\000.\0001\000\040\000S\000D\000-\000C\000o\000r\000e}{section.5.3}% 29 +\BOOKMARK [2][-]{subsection.5.3.2}{\376\377\0005\000.\0003\000.\0002\000\040\000M\000a\000g\000m\000a}{section.5.3}% 30 +\BOOKMARK [1][-]{section.5.4}{\376\377\0005\000.\0004\000\040\000U\000s\000e\000r\000\040\000P\000l\000a\000n\000e}{chapter.5}% 31 +\BOOKMARK [2][-]{subsection.5.4.1}{\376\377\0005\000.\0004\000.\0001\000\040\000M\000i\000c\000r\000o\000s\000e\000r\000v\000i\000c\000e\000\040\000I\000m\000p\000l\000e\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.5.4}% 32 +\BOOKMARK [2][-]{subsection.5.4.2}{\376\377\0005\000.\0004\000.\0002\000\040\000P\0004\000\040\000I\000m\000p\000l\000e\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.5.4}% 33 +\BOOKMARK [0][-]{chapter.6}{\376\377\000C\000h\000a\000p\000t\000e\000r\000\040\0006\000:\000\040\000M\000a\000n\000a\000g\000e\000d\000\040\000C\000l\000o\000u\000d\000\040\000S\000e\000r\000v\000i\000c\000e}{}% 34 +\BOOKMARK [1][-]{section.6.1}{\376\377\0006\000.\0001\000\040\000B\000u\000i\000l\000d\000i\000n\000g\000\040\000B\000l\000o\000c\000k\000s}{chapter.6}% 35 +\BOOKMARK [1][-]{section.6.2}{\376\377\0006\000.\0002\000\040\000E\000x\000a\000m\000p\000l\000e\000\040\000D\000e\000p\000l\000o\000y\000m\000e\000n\000t}{chapter.6}% 36 +\BOOKMARK [2][-]{subsection.6.2.1}{\376\377\0006\000.\0002\000.\0001\000\040\000E\000d\000g\000e\000\040\000C\000l\000o\000u\000d}{section.6.2}% 37 +\BOOKMARK [2][-]{subsection.6.2.2}{\376\377\0006\000.\0002\000.\0002\000\040\000H\000y\000b\000r\000i\000d\000\040\000C\000l\000o\000u\000d}{section.6.2}% 38 +\BOOKMARK [2][-]{subsection.6.2.3}{\376\377\0006\000.\0002\000.\0003\000\040\000S\000t\000a\000k\000e\000h\000o\000l\000d\000e\000r\000s}{section.6.2}% 39 +\BOOKMARK [2][-]{subsection.6.2.4}{\376\377\0006\000.\0002\000.\0004\000\040\000A\000l\000t\000e\000r\000n\000a\000t\000i\000v\000e\000\040\000C\000o\000n\000f\000i\000g\000u\000r\000a\000t\000i\000o\000n\000s}{section.6.2}% 40 +\BOOKMARK [1][-]{section.6.3}{\376\377\0006\000.\0003\000\040\000C\000l\000o\000u\000d\000\040\000M\000a\000n\000a\000g\000e\000m\000e\000n\000t\000\040\000P\000l\000a\000t\000f\000o\000r\000m}{chapter.6}% 41 +\BOOKMARK [2][-]{subsection.6.3.1}{\376\377\0006\000.\0003\000.\0001\000\040\000R\000e\000s\000o\000u\000r\000c\000e\000\040\000P\000r\000o\000v\000i\000s\000i\000o\000n\000i\000n\000g}{section.6.3}% 42 +\BOOKMARK [2][-]{subsection.6.3.2}{\376\377\0006\000.\0003\000.\0002\000\040\000L\000i\000f\000e\000c\000y\000c\000l\000e\000\040\000M\000a\000n\000a\000g\000e\000m\000e\000n\000t}{section.6.3}% 43 +\BOOKMARK [2][-]{subsection.6.3.3}{\376\377\0006\000.\0003\000.\0003\000\040\000S\000e\000r\000v\000i\000c\000e\000\040\000O\000r\000c\000h\000e\000s\000t\000r\000a\000t\000i\000o\000n}{section.6.3}% 44 +\BOOKMARK [2][-]{subsection.6.3.4}{\376\377\0006\000.\0003\000.\0004\000\040\000M\000o\000n\000i\000t\000o\000r\000i\000n\000g\000\040\000a\000n\000d\000\040\000T\000e\000l\000e\000m\000e\000t\000r\000y}{section.6.3}% 45 +\BOOKMARK [1][-]{section.6.4}{\376\377\0006\000.\0004\000\040\000C\000o\000n\000n\000e\000c\000t\000i\000v\000i\000t\000y\000\040\000A\000P\000I}{chapter.6}% 46 +\BOOKMARK [2][-]{subsection.6.4.1}{\376\377\0006\000.\0004\000.\0001\000\040\000E\000n\000t\000e\000r\000p\000r\000i\000s\000e\000s}{section.6.4}% 47 +\BOOKMARK [2][-]{subsection.6.4.2}{\376\377\0006\000.\0004\000.\0002\000\040\000S\000l\000i\000c\000e\000s}{section.6.4}% 48 +\BOOKMARK [2][-]{subsection.6.4.3}{\376\377\0006\000.\0004\000.\0003\000\040\000Q\000o\000S\000\040\000P\000r\000o\000f\000i\000l\000e\000s}{section.6.4}% 49 +\BOOKMARK [2][-]{subsection.6.4.4}{\376\377\0006\000.\0004\000.\0004\000\040\000O\000t\000h\000e\000r\000\040\000M\000o\000d\000e\000l\000s}{section.6.4}% 50 +\BOOKMARK [0][-]{chapter.7}{\376\377\000A\000b\000o\000u\000t\000\040\000T\000h\000e\000\040\000B\000o\000o\000k}{}% 51 +\BOOKMARK [1][-]{section.7.1}{\376\377\000R\000e\000a\000d\000\040\000t\000h\000e\000\040\000B\000o\000o\000k}{chapter.7}% 52 +\BOOKMARK [1][-]{section.7.2}{\376\377\000B\000u\000i\000l\000d\000\040\000t\000h\000e\000\040\000B\000o\000o\000k}{chapter.7}% 53 +\BOOKMARK [1][-]{section.7.3}{\376\377\000C\000o\000n\000t\000r\000i\000b\000u\000t\000e\000\040\000t\000o\000\040\000t\000h\000e\000\040\000B\000o\000o\000k}{chapter.7}% 54 +\BOOKMARK [0][-]{chapter.8}{\376\377\000A\000b\000o\000u\000t\000\040\000T\000h\000e\000\040\000A\000u\000t\000h\000o\000r\000s}{}% 55 diff --git a/book.pdf b/book.pdf new file mode 100644 index 0000000..21409f3 Binary files /dev/null and b/book.pdf differ diff --git a/book.synctex.gz b/book.synctex.gz new file mode 100644 index 0000000..4a3ddc3 Binary files /dev/null and b/book.synctex.gz differ diff --git a/book.tex b/book.tex new file mode 100644 index 0000000..b56ede9 --- /dev/null +++ b/book.tex @@ -0,0 +1,5184 @@ +%% Generated by Sphinx. +\def\sphinxdocclass{report} +\documentclass[a4paper,11pt,english]{sphinxmanual} +\ifdefined\pdfpxdimen + \let\sphinxpxdimen\pdfpxdimen\else\newdimen\sphinxpxdimen +\fi \sphinxpxdimen=.75bp\relax +\ifdefined\pdfimageresolution + \pdfimageresolution= \numexpr \dimexpr1in\relax/\sphinxpxdimen\relax +\fi +%% let collapsible pdf bookmarks panel have high depth per default +\PassOptionsToPackage{bookmarksdepth=5}{hyperref} + +\PassOptionsToPackage{warn}{textcomp} +\usepackage[utf8]{inputenc} +\ifdefined\DeclareUnicodeCharacter +% support both utf8 and utf8x syntaxes + \ifdefined\DeclareUnicodeCharacterAsOptional + \def\sphinxDUC#1{\DeclareUnicodeCharacter{"#1}} + \else + \let\sphinxDUC\DeclareUnicodeCharacter + \fi + \sphinxDUC{00A0}{\nobreakspace} + \sphinxDUC{2500}{\sphinxunichar{2500}} + \sphinxDUC{2502}{\sphinxunichar{2502}} + \sphinxDUC{2514}{\sphinxunichar{2514}} + \sphinxDUC{251C}{\sphinxunichar{251C}} + \sphinxDUC{2572}{\textbackslash} +\fi +\usepackage{cmap} +\usepackage[LGR,T1]{fontenc} +\usepackage{amsmath,amssymb,amstext} +\usepackage{babel} +\usepackage{substitutefont} + + +\usepackage{tgtermes} +\usepackage{tgheros} +\renewcommand{\ttdefault}{txtt} + + +\expandafter\ifx\csname T@LGR\endcsname\relax +\else +% LGR was declared as font encoding + \substitutefont{LGR}{\rmdefault}{cmr} + \substitutefont{LGR}{\sfdefault}{cmss} + \substitutefont{LGR}{\ttdefault}{cmtt} +\fi +\expandafter\ifx\csname T@X2\endcsname\relax + \expandafter\ifx\csname T@T2A\endcsname\relax + \else + % T2A was declared as font encoding + \substitutefont{T2A}{\rmdefault}{cmr} + \substitutefont{T2A}{\sfdefault}{cmss} + \substitutefont{T2A}{\ttdefault}{cmtt} + \fi +\else +% X2 was declared as font encoding + \substitutefont{X2}{\rmdefault}{cmr} + \substitutefont{X2}{\sfdefault}{cmss} + \substitutefont{X2}{\ttdefault}{cmtt} +\fi + +\usepackage{textalpha} +\usepackage[Bjarne]{fncychap} +\usepackage[,numfigreset=1,mathnumfig]{sphinx} + +\fvset{fontsize=auto} +\usepackage{geometry} + + +% Include hyperref last. +\usepackage{hyperref} +% Fix anchor placement for figures with captions. +\usepackage{hypcap}% it must be loaded after hyperref. +% Set up styles of URL: it should be placed after hyperref. +\urlstyle{same} + +\addto\captionsenglish{\renewcommand{\contentsname}{Table of Contents}} + +\usepackage{sphinxmessages} +\setcounter{tocdepth}{1} + + + +\title{Private 5G: A Systems Approach} +\date{Oct 18, 2023} +\release{Version 1.1\sphinxhyphen{}dev} +\author{Peterson, Sunay, and Davie } +\newcommand{\sphinxlogo}{\vbox{}} +\renewcommand{\releasename}{Release} +\makeindex +\begin{document} + +\pagestyle{empty} +\sphinxmaketitle +\pagestyle{plain} +\sphinxtableofcontents +\pagestyle{normal} +\phantomsection\label{\detokenize{index::doc}} + + + +\chapter*{Foreword} +\label{\detokenize{foreword:foreword}}\label{\detokenize{foreword::doc}} +\sphinxAtStartPar +When I was a graduate student studying parallel computing in the early +1990s, the World Wide Web exploded onto the scene, and I wanted to +understand how the Internet made such rapid advances possible. I +picked up a copy of the first edition of \sphinxstyleemphasis{Computer Networks: A Systems +Approach}, and I started reading. I was delighted to learn not only +the Internet’s history and main concepts, but also to see examples of +real code that illustrated how the protocols actually worked and how +they could be changed. I was hooked. I loved the idea of working in +the computer networking field, where the technologies we build can +help bring people together and lower the barriers to innovation so +that anyone who can write software can contribute. + +\sphinxAtStartPar +As time went on, I saw that, while the Internet enabled rapid advances +in end\sphinxhyphen{}host applications, the inside of the Internet was harder to +change. Network devices were closed and proprietary, and protocol +standards evolved slowly and painfully. In response, enabling +innovation inside the network became a passion of mine, and of many +other technologists eager to make the Internet better\textendash{}more secure, +performant, reliable, cost\sphinxhyphen{}effective, and easier to manage. +Gradually, the computer networking field changed, with the advent of +software\sphinxhyphen{}defined networking, giving network owners\textendash{}such as the +hyperscalers running large data centers\textendash{}much more control over the +software inside their networks. (See \sphinxstyleemphasis{Software\sphinxhyphen{}Defined Networks: A +Systems Approach} for more of this story!) Nowadays, computer +networking really is about software. It’s a welcome change. + +\sphinxAtStartPar +In recent years, the excitement has moved to the network edge with the +emergence of 5G cellular access networks. No longer are wireless +communication, computer networking, and cloud computing siloed parts +of some larger ecosystem. They are brought together, allowing wireless +devices to connect to nearby computing resources. Far beyond providing +mobile Internet access, these networks enable exciting real\sphinxhyphen{}time +applications like augmented and virtual reality (AR/VR), Internet of +Things (IoT), self\sphinxhyphen{}driving cars, drones, robotic control, and more. +Plus, these networks are not only the purview of large carriers that +must invest significant resources in wireless spectrum, cell towers, +and more. Rather, individual enterprises, campuses, and communities +are deploying private 5G within their own organizations to support +their own applications, using lightly regulated spectrum like CBRS +(Citizens Broadband Radio Service). Opportunities for innovation +abound! + +\sphinxAtStartPar +However, now there is so much more to learn, to understand the many +parts of 5G access networks as a single coherent system. The learning +curve can be steep. Even fairly technical people usually know one or +at most two parts of the system, and do not know how the parts relate +to the larger whole. For example, I knew a good amount about computer +networking, a little about cloud computing, and not much about +wireless communication. \sphinxstyleemphasis{Private 5G: A Systems Approach}\textendash{}this +book\textendash{}changed that. I learned what I needed to know about the radio +access network, and how the pieces come together to be more than the +sum of their parts. More than that, the book shows that, despite the +complexity of the 3GPP cellular standards and the long and frustrating +history of closed network equipment in the cellular networking space, +open source software is gaining a foothold. Open source platforms like +Aether and Magma\textendash{}both discussed in this book\textendash{}are seeing practical +deployment in a wide variety of settings. The book even has a guide +for readers to bring up the Aether platform, including a 5G small +cell. + +\sphinxAtStartPar +For me, then, the story comes full circle. Private 5G networks are +something you can touch, code, and deploy yourself. Armed with the +knowledge of how 5G access networks work, and with hands\sphinxhyphen{}on experience +with open source software, just imagine the places you’ll go! + +\begin{DUlineblock}{0em} +\item[] Jennifer Rexford +\item[] Princeton, New Jersey +\end{DUlineblock} + + +\chapter*{Preface} +\label{\detokenize{preface:preface}}\label{\detokenize{preface::doc}} +\sphinxAtStartPar +When we wrote our introductory 5G book three years ago, our goal was +to help people with experience building Internet and cloud services to +understand the opportunity to bring best practices from those systems +to the mobile cellular network. On paper (and in the press) 5G had set +an ambitious goal of transformative changes, adopting a cloud\sphinxhyphen{}inspired +architecture and supporting a new set of innovative services. But the +gap between that aspirational story and the reality of 40 years of +network operators and hardware vendors protecting their incumbent +advantages made for a challenging pivot. So we started with the +basics, and set out to explain the fundamental networking concepts and +design principles behind the myriad of acronyms that dominate mobile +cellular networking. + +\sphinxAtStartPar +Because 5G adopts many of the principles of cloud native systems, it +promises to bring the feature velocity of the cloud to Telco +environments. That promise is being delivered most successfully in +private 5G deployments that are less constrained by existing Telco +organizations and legacy infrastructure. What started out as sketches +on a whiteboard three years ago is now becoming a reality: Several +cloud providers are offering private 5G solutions for enterprises, and +there is a complete open source implementation of a 5G\sphinxhyphen{}enabled edge +cloud that the Internet community can learn from and build upon. + +\sphinxAtStartPar +The architecture described in this book is not limited to private +deployments. It includes the necessary background information about +the mobile cellular network, much of which is rooted in its origin +story as a Telco voice network, but the overarching theme is to +describe the network through the lens of private deployments of 5G +connectivity as a managed cloud service. This includes adopting best +practices in horizontally scalable microservices, Software\sphinxhyphen{}Defined +Networking (SDN), and cloud operational practices such as DevOps. +These practices are appropriate for traditional operators, cloud +providers, and enterprises alike, but it is emerging use cases in +private deployments that will benefit first. + +\sphinxAtStartPar +The book makes extensive use of open source software—specifically, the +Aether and Magma projects—to illustrate how Private 5G can be realized +in practice. The availability of open software informs our +understanding of what has historically been a proprietary and opaque +system. The result complements the low\sphinxhyphen{}level engineering documents +that are available online (and to which we provide links) with an +architectural roadmap for anyone trying to understand all the moving +parts, how they fit together, and how they can be operationalized. +And once you’re done reading the book, we encourage you to jump into +the hands\sphinxhyphen{}on appendix that walks you through the step\sphinxhyphen{}by\sphinxhyphen{}step process +of deploying that software in your own local computing environment. + + +\section*{Acknowledgements} +\label{\detokenize{preface:acknowledgements}} +\sphinxAtStartPar +The software described in this book is due to the hard work of the ONF +engineering team, the Magma engineering team, and the open source +communities that work with them. Bilal Saleem did the heavy lifting on +Aether OnRamp (described in the \sphinxstyleemphasis{About the Software} Appendix), with a +special thanks to Ajay Thakur, Andy Bavier, Gabriel Arrobo, and +Muhammad Shahbaz for their guidance and feedback. + +\sphinxAtStartPar +Thanks to the members of the community who contributed text or +corrections to the book, including: +\begin{itemize} +\item {} +\sphinxAtStartPar +Edmar Candeia Gurjão + +\item {} +\sphinxAtStartPar +Muhammad Shahbaz + +\item {} +\sphinxAtStartPar +Mugahed Izzeldin + +\item {} +\sphinxAtStartPar +Robert MacDavid + +\item {} +\sphinxAtStartPar +Simon Leinen + +\item {} +\sphinxAtStartPar +Tiago Barros + +\item {} +\sphinxAtStartPar +Gabriel Arrobo + +\item {} +\sphinxAtStartPar +Ajay Thakur + +\end{itemize} + +\sphinxAtStartPar +The picture of a Magma deployment in Chapter 5 was provided by Shaddi Hasan. + +\begin{DUlineblock}{0em} +\item[] Larry Peterson, Oguz Sunay, and Bruce Davie +\item[] April 2023 +\end{DUlineblock} + + +\chapter{Chapter 1: Introduction} +\label{\detokenize{intro:chapter-1-introduction}}\label{\detokenize{intro::doc}} +\sphinxAtStartPar +Mobile networks, which have a 40\sphinxhyphen{}year history that parallels the +Internet’s, have undergone significant change. The first two +generations supported voice and then text, with 3G defining the +transition to broadband access, supporting data rates measured in +hundreds of kilobits per second. Today, the industry is transitioning +from 4G (with data rates typically measured in the few +megabits per second) to 5G, with the promise of a tenfold increase in +data rates. + +\sphinxAtStartPar +But 5G is about much more than increased bandwidth. 5G represents a +fundamental rearchitecting of the access network in a way that +leverages several key technology trends and sets it on a path to +enable much greater innovation. In the same way that 3G defined the +transition from voice to broadband, 5G’s promise is primarily about +the transition from a single access service (broadband connectivity) +to a richer collection of edge services and devices. 5G is expected to +provide support for immersive user interfaces (e.g., Augmented Reality, +Virtual Reality), mission\sphinxhyphen{}critical applications (e.g., public safety, +autonomous vehicles), and the Internet of Things (IoT). Because these +use cases will include everything from home appliances to industrial +robots to self\sphinxhyphen{}driving cars, 5G will support not only humans accessing +the Internet from their smartphones, but also swarms of autonomous +devices working together on their behalf. + +\sphinxAtStartPar +There is more to supporting these services than just improving +bandwidth or latency to individual users. As we will see, a +fundamentally different edge network architecture is required. The +requirements for this architecture are ambitious, and can be +illustrated by three classes of capabilities: +\begin{itemize} +\item {} +\sphinxAtStartPar +To support \sphinxstyleemphasis{Massive Internet of Things}, potentially including +devices with ultra\sphinxhyphen{}low energy (10+ years of battery life), ultra\sphinxhyphen{}low +complexity (10s of bits per second), and ultra\sphinxhyphen{}high density (1 +million nodes per square kilometer). + +\item {} +\sphinxAtStartPar +To support \sphinxstyleemphasis{Mission\sphinxhyphen{}Critical Control}, potentially including +ultra\sphinxhyphen{}high availability (greater than 99.999\% or “five nines”), +ultra\sphinxhyphen{}low latency (as low as 1 ms), and extreme mobility (up to 100 +km/h). + +\item {} +\sphinxAtStartPar +To support \sphinxstyleemphasis{Enhanced Mobile Broadband}, potentially including extreme +data rates (multi\sphinxhyphen{}Gbps peak, 100+ Mbps sustained) and extreme +capacity (10 Tbps of aggregate throughput per square kilometer). + +\end{itemize} + +\sphinxAtStartPar +These targets will certainly not be met overnight, but that’s in keeping +with each generation of the mobile network being a decade\sphinxhyphen{}long +endeavor. + +\sphinxAtStartPar +On top of these quantitative improvements to the capabilities of the +access network, 5G is being viewed as a chance for building a platform +to support innovation. Whereas prior access networks were generally +optimized for known services (such as voice calls and SMS), the +Internet has been hugely successful in large part because it supported +a wide range of applications that were not even thought of when it was +first designed. The 5G network is designed with this same goal: +enabling future applications beyond those we fully recognize today. +For an example of the grand vision for 5G, see the whitepaper +from one of the industry leaders. + +\phantomsection\label{\detokenize{intro:reading-vision}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +Qualcomm Whitepaper. \sphinxhref{https://www.qualcomm.com/media/documents/files/whitepaper-making-5g-nr-a-reality.pdf}{Making 5G NR a Reality}. +December 2016. +\end{sphinxadmonition} + +\sphinxAtStartPar +The 5G mobile network, because it is on an evolutionary path and not a +point solution, includes standardized specifications, a range of +implementation choices, and a long list of aspirational goals. Because +this leaves so much room for interpretation, our approach to +describing 5G is grounded in three mutually supportive principles. The +first is to apply a \sphinxstyleemphasis{systems lens}, which is to say, we explain the +sequence of design decisions that lead to a solution rather than fall +back on enumerating the overwhelming number of acronyms or individual +point technologies as a \sphinxstyleemphasis{fait accompli}. The second is to aggressively +disaggregate the system. Building a disaggregated, virtualized, and +software\sphinxhyphen{}defined 5G access network is the direction the industry is +already headed (for good technical and business reasons), but breaking +the 5G network down into its elemental components is also the best way +to explain how 5G works. + +\sphinxAtStartPar +The third principle is to illustrate how 5G can be realized in +practice by drawing on specific engineering decisions made in an open +source implementation. This implementation leverages best practices in +building cloud apps, which is an essential aspect of 5G evolving into +a platform for new services. This implementation also targets +enterprises that are increasingly deploying 5G locally, and using it +to help automate their manufacturing, retail, and business practices—a +trend that has been dubbed \sphinxstyleemphasis{Industry 4.0}. Such enterprise\sphinxhyphen{}level +deployments are known as \sphinxstyleemphasis{Private 5G}, but there is nothing about the +technical approach that couldn’t be adopted throughout the more +traditional “public mobile network” that comes to mind when you think +about your cell service today. The only difference is that private +deployments are more aggressively embracing the cloud practices that +will ultimately distinguish 5G from earlier generations. + +\phantomsection\label{\detokenize{intro:reading-industry4-0}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +K. Schwab. \sphinxhref{https://www.weforum.org/about/the-fourth-industrial-revolution-by-klaus-schwab}{The Fourth Industrial Revolution}. +World Economic Forum. +\end{sphinxadmonition} + +\sphinxAtStartPar +What this all means is that there is no simple definition of 5G, any +more than there is for the Internet. It is a complex and evolving +system, constrained by a set of standards that purposely give all the +stakeholders many degrees of freedom. In the chapters that follow, it +should be clear from the context whether we are talking about +\sphinxstyleemphasis{standards} (what everyone must do to interoperate), \sphinxstyleemphasis{trends} (where +the industry seems to be headed), or \sphinxstyleemphasis{implementation choices} +(examples to make the discussion more concrete). By adopting a systems +perspective throughout, our intent is to describe 5G in a way that +helps the reader navigate this rich and rapidly evolving system. + + +\section{1.1 Standardization Landscape} +\label{\detokenize{intro:standardization-landscape}} +\sphinxAtStartPar +As of 3G, the generational designation corresponds to a standard +defined by the \sphinxstyleemphasis{3rd Generation Partnership Project (3GPP)}. Even +though its name has “3G” in it, the 3GPP continues to define the +standards for 4G, 5G, and so on, each of which corresponds to a +sequence of releases of the standard. Release 15 is considered the +demarcation point between 4G and 5G, with Release 17 having been +completed in 2022. + +\sphinxAtStartPar +In addition to 3GPP\sphinxhyphen{}defined standards, national governments establish +how the radio spectrum is used locally. Unlike Wi\sphinxhyphen{}Fi, for which there +is international agreement that permits anyone to use a channel at +either 2.4 or 5 GHz (these are unlicensed bands), governments have +auctioned off and licensed exclusive use of various frequency bands to +service providers, who in turn sell mobile access service to their +subscribers. The use of licensed spectrum brings certain benefits such +as greater control over the quality of service delivered, while also +imposing costs both in terms of paying for licenses and in the +complexity of the systems needed to manage access to the spectrum. We +will explore how these costs and benefits play out in subsequent +chapters. + +\sphinxAtStartPar +There is also a shared\sphinxhyphen{}license band at 3.5 GHz, called \sphinxstyleemphasis{Citizens +Broadband Radio Service (CBRS)}, set aside in North America for +cellular use. Similar spectrum is being set aside in other countries. +The CBRS band allows 3 tiers of users to share the spectrum: first +right of use goes to the original owners of this spectrum (naval +radars and satellite ground stations); followed by priority users who +receive this right over 10MHz bands for three years via regional +auctions; and finally the rest of the population, who can access and +utilize a portion of this band as long as they first check with a +central database of registered users. CBRS, along with +standardization efforts to extend mobile cellular networks to operate +in the unlicensed bands, opens the door for private cellular networks +similar to Wi\sphinxhyphen{}Fi. This is proving especially attractive to enterprises +looking to establish a \sphinxstyleemphasis{Private 5G} service. + +\sphinxAtStartPar +The specific frequency bands that are licensed for cellular networks +vary around the world, and are complicated by the fact that network +operators often simultaneously support both old/legacy technologies and +new/next\sphinxhyphen{}generation technologies, each of which occupies a different +frequency band. The high\sphinxhyphen{}level summary is that traditional cellular +technologies range from 700\sphinxhyphen{}2400 MHz, with new mid\sphinxhyphen{}spectrum +allocations now happening at 6 GHz, and millimeter\sphinxhyphen{}wave (mmWave) +allocations opening above 24 GHz. + +\sphinxAtStartPar +While the specific frequency band is not directly relevant to +understanding 5G from an architectural perspective, it does impact the +physical\sphinxhyphen{}layer components, which in turn has indirect ramifications on +the overall 5G system. We identify and explain these ramifications in +later chapters, keeping in mind that ensuring the allocated spectrum +is used \sphinxstyleemphasis{efficiently} is a critical design goal. + +\sphinxAtStartPar +Finally, in addition to the long\sphinxhyphen{}established 3GPP standards body and +the set of national regulatory agencies around the world, a new +organization—called the \sphinxstyleemphasis{Open\sphinxhyphen{}RAN Alliance (O\sphinxhyphen{}RAN)} —has recently been +established to focus on “opening up the Radio Access Network”. We’ll +see specifically what this means and how the O\sphinxhyphen{}RAN differs from the +3GPP in Chapter 4, but for now, its existence highlights an important +dynamic in the industry: 3GPP has become a vendor\sphinxhyphen{}dominated +organization, with network operators (AT\&T and China Mobile were the +founding members) creating O\sphinxhyphen{}RAN to break vendor lock\sphinxhyphen{}in. + + +\section{1.2 Access Networks} +\label{\detokenize{intro:access-networks}} +\sphinxAtStartPar +The mobile cellular network is part of the access network that +implements the Internet’s so\sphinxhyphen{}called \sphinxstyleemphasis{last mile}. (Another common +access technology is \sphinxstyleemphasis{Passive Optical Networks (PON)}, colloquially +known as Fiber\sphinxhyphen{}to\sphinxhyphen{}the\sphinxhyphen{}Home.) These mobile access networks have +historically been provided by both big and small \sphinxstyleemphasis{Mobile Network +Operators (MNOs)}. Global MNOs such as AT\&T run access networks at +thousands of aggregation points of presence across a country such as the +US, along with a national backbone that interconnects those +sites. Small regional and municipal MNOs might run an access network +with one or two points of presence, and then connect to the rest of +the Internet through some large operator’s backbone. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=500\sphinxpxdimen]{{Slide1}.png} +\caption{A global mobile network built by first aggregating traffic from +hundreds of wireless base stations, and then interconnecting those +aggregation points over the Internet.}\label{\detokenize{intro:id3}}\label{\detokenize{intro:fig-global}}\end{figure} + +\sphinxAtStartPar +As illustrated in \hyperref[\detokenize{intro:fig-global}]{Figure \ref{\detokenize{intro:fig-global}}}, access networks +are physically anchored at thousands of aggregation points of presence +within close proximity to end users, each of which serves anywhere +from 1,000\sphinxhyphen{}100,000 subscribers, depending on population density. In +practice, the physical deployment of these “edge” locations vary from +operator to operator, but one possible scenario is to anchor both the +cellular and wireline access networks in Telco \sphinxstyleemphasis{Central Offices}. + +\sphinxAtStartPar +Historically, the Central Office—officially known as the \sphinxstyleemphasis{PSTN (Public +Switched Telephone Network) Central Office}—anchored wired access +(both telephony and broadband), while the cellular network evolved +independently by deploying a parallel set of \sphinxstyleemphasis{Mobile Telephone +Switching Offices (MTSO)}. Each MTSO serves as a \sphinxstyleemphasis{mobile aggregation} +point for the set of cell towers in a given geographic area. For our +purposes, the important idea is that such aggregation points exist, +and it is reasonable to think of them as defining the edge of an +operator\sphinxhyphen{}managed access network. For simplicity, we sometimes use the +term “Central Office” as a synonym for both types of edge sites. + +\sphinxAtStartPar +Finally, one aspect of the mobile network that may not be obvious +from \hyperref[\detokenize{intro:fig-global}]{Figure \ref{\detokenize{intro:fig-global}}} is that it supports global +connectivity, independent of the Internet (which is technically just +one of many available backbone technologies). That is, the cellular +network supports a universal addressing scheme, similar in principle +(but significantly different in details) from the Internet’s universal +IP\sphinxhyphen{}based addressing scheme. This addressing scheme makes it possible +to establish a voice call between any two cell phones, but of course, +IP addresses still come into play when trying to establish a data +(broadband) connection to/from a cell phone or other mobile +device. Understanding the relationship between mobile addresses and IP +addresses is a topic we will explore in later chapters. + + +\section{1.3 Managed Cloud Service} +\label{\detokenize{intro:managed-cloud-service}} +\sphinxAtStartPar +The previous section gives a decidedly Telco\sphinxhyphen{}centric view of the mobile +cellular network, which makes sense because Telcos have been the +dominant MNOs for the past 40+ years. But with 5G’s focus on +broadening the set of services it supports, and embracing general +platforms that can host yet\sphinxhyphen{}to\sphinxhyphen{}be\sphinxhyphen{}invented applications, the mobile +cellular network is starting to blur the line between the access +network and the cloud. + +\begin{sphinxShadowBox} +\sphinxstylesidebartitle{5G, Wi\sphinxhyphen{}Fi, and the Role of Spectrum} + +\sphinxAtStartPar +\sphinxstyleemphasis{WiFi networks use unlicensed radio spectrum that do not require WiFi +network operators to get advance regulatory approval. At the same +time, anyone can access the same spectrum, subject to limits on +transmission power. As a result, WiFi networks share their bands +with devices including baby monitors, cordless phones, etc., so the +WiFi MAC layer assumes the presence of physical\sphinxhyphen{}layer interference. +Enterprise WiFi deployments, such as those on college campuses and +in corporate office buildings, perform more centralized management +of interference across multiple overlapping access points, but risk +of interference remains and thus the service remains best\sphinxhyphen{}effort.} + +\sphinxAtStartPar +\sphinxstyleemphasis{Cellular access networks typically use licensed spectrum that is +owned or leased by the carrier for long periods of time at high +cost. Even “lightly licensed” spectrum such as CBRS offers more +control over interference than Wi\sphinxhyphen{}Fi. Since the cellular radio has +exclusive access to spectrum over a geographic region, cellular +waveforms are designed for wide\sphinxhyphen{}area coverage and high spectral +efficiency. Managing access to the spectrum, as we shall see, is an +important aspect of the 5G architecture.} + +\sphinxAtStartPar +\sphinxstyleemphasis{Many of the differences between 5G and Wi\sphinxhyphen{}Fi follow from the +differences in spectrum and radio characteristics. For example, +cellular deployments, with the expense of spectrum being a given, +have historically been carried out by well\sphinxhyphen{}resourced actors who can +acquire land, build and connect towers, and hire skilled +staff. However, the rise of enterprise 5G and the availability of +lightly licensed spectrum is leading to a blurring of the lines +between the two approaches.} +\end{sphinxShadowBox} + +\sphinxAtStartPar +The rest of this book explains what that means in detail. As an +overview, thinking of 5G connectivity as a cloud service means that +instead of using purpose\sphinxhyphen{}built devices and telephony\sphinxhyphen{}based operational +practices to deliver mobile connectivity, the 5G network is built from +commodity hardware, software\sphinxhyphen{}defined networks, and cloud\sphinxhyphen{}based +operational practices. And, just as with familiar cloud applications, +the end result is a system that increases both feature velocity and +operational uniformity. These advantages are available to legacy +MNOs, but whether they will fully embrace them is yet to be seen, so +we do not limit ourselves to existing stakeholders or business +models. In particular, this book focuses on how enterprises can be +their own MNOs, or alternatively, acquire private 5G connectivity as a +managed cloud service from non\sphinxhyphen{}traditional MNOs. + +\sphinxAtStartPar +To this end, \hyperref[\detokenize{intro:fig-enterprise}]{Figure \ref{\detokenize{intro:fig-enterprise}}} depicts a simplified +Private 5G deployment that the rest of this book works toward. At a +high level, the figure shows a wide range of enterprise use cases that +might take advantage of 5G connectivity, with the data plane of the 5G +service running on\sphinxhyphen{}prem (on an edge cloud running within the +enterprise), and the control plane of the 5G service running off\sphinxhyphen{}prem +(in the global cloud).% +\begin{footnote}[1]\sphinxAtStartFootnote +We use the term “data plane” in the generic sense in this +description. As we’ll see in Chapter 2, the 5G architecture +refers to it as “user plane”. +% +\end{footnote} Enterprise administrators control their +service through a management console, much in the same way they might +log into an AWS, GCP, or Azure console to control a cloud\sphinxhyphen{}based +storage or compute service. Finally, applications are distributed +across both edge and centralized clouds, taking advantage of what is +commonly referred to as a \sphinxstyleemphasis{hybrid cloud}. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=600\sphinxpxdimen]{{Slide14}.png} +\caption{Enterprise\sphinxhyphen{}based deployment of 5G connectivity, running as a +managed cloud service.}\label{\detokenize{intro:id4}}\label{\detokenize{intro:fig-enterprise}}\end{figure} + +\sphinxAtStartPar +Hosting a 5G connectivity service on an edge cloud is perfectly +aligned with one of the most pronounced trends in cloud computing: +moving elements of the cloud from the datacenter to locations that are +in close proximity to end users and their devices. Before looking at +how to realize 5G on an edge cloud, we start by considering why edge +clouds are gaining momentum in the first place. + +\sphinxAtStartPar +The cloud began as a collection of warehouse\sphinxhyphen{}sized datacenters, each +of which provided a cost\sphinxhyphen{}effective way to power, cool, and operate a +scalable number of servers. Over time, this shared infrastructure +lowered the barrier to deploying scalable Internet services, but +today, there is increasing pressure to offer +low\sphinxhyphen{}latency/high\sphinxhyphen{}bandwidth cloud applications that cannot be +effectively implemented in remote datacenters. Augmented Reality (AR), +Virtual Reality (VR), Internet of Things (IoT), and Autonomous +Vehicles are all examples of this kind of application. Such +applications benefit from moving at least part of their functionality +out of the datacenter and towards the edge of the network, closer to +end users. + +\sphinxAtStartPar +The idea of such deployments is to first collect operational data on +assets and infrastructure, from sensors, video feeds and telemetry +from machinery. It then applies Machine Learning (ML) or other forms +of analysis to this data to gain insights, identify patterns and +predict outcomes (e.g., when a device is likely to fail). The final +step is to automate industrial processes so as to minimize human +intervention and enable remote operations (e.g., power optimization, +idling quiescent machinery). The overall goal is to create an IT +foundation for continually improving industrial operations through +software. + +\sphinxAtStartPar +But precisely where this edge is \sphinxstyleemphasis{physically} located depends on who +you ask. If you ask a network operator that already owns and operates +thousands of Central Offices, then their Central Offices are an +obvious answer. Others might claim the edge is located at the 14,000 +Starbucks locations (for example) across the US, and still others might +point to the tens of thousands of cell towers spread across the globe. +Our approach is to be location agnostic, but to make the discussion +concrete, we use enterprises as our exemplar deployment. + +\sphinxAtStartPar +At the same time cloud providers started pursuing edge deployments, +network operators began to re\sphinxhyphen{}architect their access network to use +the same commodity hardware and best practices in building scalable +software as the cloud providers. Such a design, which is sometimes +referred to as CORD \sphinxstyleemphasis{(Central Office Re\sphinxhyphen{}architected as a Datacenter)}, +supports both the access network and edge services co\sphinxhyphen{}located on a +shared cloud platform. This platform is then replicated across +hundreds or thousands of operator sites, including Central Offices. + +\sphinxAtStartPar +Traditional network operators did this because they wanted to take +advantage of the same economies of scale and feature velocity as cloud +providers. CORD gave them a general architecture to work towards, but +also an open source Kubernetes\sphinxhyphen{}based reference implementation to model +their solutions on. That original implementation of CORD is the direct +predecessor to the Aether platform that we use as a reference +implementation in this book. + +\phantomsection\label{\detokenize{intro:reading-cord}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +L. Peterson, \sphinxstyleemphasis{et al}. \sphinxhref{https://wiki.opencord.org/download/attachments/1278027/PETERSON\_CORD.pdf}{Central Office Re\sphinxhyphen{}architected as a +Datacenter.}. +IEEE Communications, October 2016. + +\sphinxAtStartPar +A.D. Little Report. \sphinxhref{https://www.adlittle.com/en/who-dares-wins}{Who Dares Wins! How Access Transformation Can +Fast\sphinxhyphen{}Track Evolution of Operator Production Platforms}. September 2019. +\end{sphinxadmonition} + +\sphinxAtStartPar +An important takeaway from this discussion is that to understand how 5G +is being implemented, it is helpful to have a working understanding of +how clouds are built. This includes the use of \sphinxstyleemphasis{commodity hardware} +(both servers and bare\sphinxhyphen{}metal switches), horizontally scalable +\sphinxstyleemphasis{microservices} (also referred to as \sphinxstyleemphasis{cloud native}), and +\sphinxstyleemphasis{Software\sphinxhyphen{}Defined Networks (SDN)}. It is also helpful to have an +appreciation for how cloud software is developed, tested, deployed, and +operated, including practices such as \sphinxstyleemphasis{DevOps} and \sphinxstyleemphasis{Continuous Integration +/ Continuous Deployment (CI/CD)}. We recommend two companion books to +help fill the gaps in your understanding of these foundational +technologies. + +\phantomsection\label{\detokenize{intro:reading-devops}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +\sphinxhref{https://sdn.systemsapproach.org/}{Software\sphinxhyphen{}Defined Networks: A Systems Approach}. November 2021. + +\sphinxAtStartPar +\sphinxhref{https://ops.systemsapproach.org/}{Edge Cloud Operations: A Systems Approach}. June 2022. +\end{sphinxadmonition} + + +\section{1.4 Beyond 5G} +\label{\detokenize{intro:beyond-5g}} +\sphinxAtStartPar +From the moment MNOs started rolling out 5G in 2019, people started +talking about what comes next. The obvious answer is 6G, but it’s not +at all clear that the decadal generations of the past 40 years will +continue into the future. Today, you hear alternatives like +“NextG” and “Beyond 5G” more often than 6G, which could be a sign that +the industry is undergoing a fundamental shift. And there is an +argument that we’re in the midst of a sea change that will render the +generational distinction largely meaningless. There are two +complementary reasons for this, both at the heart of what’s important +about Private 5G. + +\sphinxAtStartPar +The first factor is that by adopting cloud technologies, the mobile +cellular network is hoping to cash in on the promise of feature +velocity. This “agility” story was always included in the early 5G +promotional material, as part of the case for why a 5G upgrade would +be a worthwhile investment, but the consequence of those technologies +now finding their way into the mainstream is that new features can be +introduced rapidly and deployed continuously. At some point, the +frequency of continual improvements renders generational distinctions +irrelevant. + +\sphinxAtStartPar +The second factor is that agility isn’t only about cadence; it’s also +about customization. That is, these changes can be introduced +bottom\sphinxhyphen{}up—for example by enterprises and their edge cloud partners in +the case of Private 5G—without necessarily depending on (or waiting +for) a global standardization effort. If an enterprise finds a new +use case that requires a specialized deployment, only its Private 5G +deployment needs to adopt the necessary changes. Reaching agreement +with all the incumbent stakeholders will no longer be a requirement. + +\sphinxAtStartPar +It’s anyone’s guess where this will take us, but it will be +interesting to see how this dynamic impacts the role of +standardization: what aspects of the mobile network require global +agreement and what aspects do not because they can evolve on a +case\sphinxhyphen{}by\sphinxhyphen{}case basis. While standards often spur innovation (TCP and +HTTP are two great examples from the Internet experience), sometimes +standards actually serve as a barrier to competition, and hence, +innovation. Now that software is eating the mobile cellular +network—with Private 5G deployed in enterprises likely setting the +pace—we will learn which standards are which. + +\sphinxAtStartPar +In summary, that 5G is on an evolutionary path is the central theme of +this book. We call attention to its importance here, and revisit the +topic throughout the book. We are writing this book for \sphinxstyleemphasis{system +generalists}, with the goal of helping bring a community that +understands a broad range of systems issues (but knows little or +nothing about the cellular network) up to speed so they can play a +role in its evolution. This is a community that understands both +feature velocity and best practices in building robust scalable +systems, and so has an important role to play in bringing all of 5G’s +potential to fruition. + + +\chapter{Chapter 2: Architecture} +\label{\detokenize{arch:chapter-2-architecture}}\label{\detokenize{arch::doc}} +\sphinxAtStartPar +This chapter identifies the main architectural components of the +mobile cellular network. We need to introduce some terminology to do +this, which can be confusing for those whose networking background +comes from the Internet. This is partly because some of what needs to +happen in a mobile network, such as keeping track of which base +station is serving a given mobile device, doesn’t really have a +parallel in fixed networks. On top of that, the terminology came out +of the 3GPP standardization process, which was historically concerned +with telephony and almost completely disconnected from the IETF and +other Internet\sphinxhyphen{}related efforts. To further confuse matters, 3GPP +terminology often changes with each generation (e.g., a base station +is called eNB in 4G and gNB in 5G). We address situations like this by +using generic terminology (e.g., base station), and referencing the +3GPP\sphinxhyphen{}specific counterpart only when the distinction is helpful. This +example is only the tip of the terminology iceberg. Marcin Dryjanski’s +blog post gives a broader perspective on the complexity of terminology +in 5G. + +\phantomsection\label{\detokenize{arch:reading-terminology}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +Marcin Dryjanski. \sphinxhref{https://www.grandmetric.com/blog/2018/07/14/lte-and-5g-differences-system-complexity/}{LTE and 5G Differences: System Complexity}. +July 2018. +\end{sphinxadmonition} + + +\section{2.1 Overview} +\label{\detokenize{arch:overview}} +\sphinxAtStartPar +The mobile cellular network provides wireless connectivity to devices +that are (potentially) on the move. These devices, which are known as +\sphinxstyleemphasis{User Equipment (UE)}, have traditionally corresponded to mobile phones +and tablets, but increasingly include cars, drones, industrial and +agricultural machines, robots, home appliances, medical devices, and +so on. In some cases, the UEs may be devices that do not move, e.g., +router interfaces using cellular connectivity to provide broadband +access to remote dwellings. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=600\sphinxpxdimen]{{Slide2}.png} +\caption{Mobile cellular networks consist of a Radio Access Network (RAN) +and a Mobile Core.}\label{\detokenize{arch:id3}}\label{\detokenize{arch:fig-cellular}}\end{figure} + +\sphinxAtStartPar +As shown in \hyperref[\detokenize{arch:fig-cellular}]{Figure \ref{\detokenize{arch:fig-cellular}}}, the mobile cellular +network consists of two main subsystems: the \sphinxstyleemphasis{Radio Access Network +(RAN)} and the \sphinxstyleemphasis{Mobile Core}. The RAN manages the radio resources +(i.e., spectrum), making sure it is used efficiently and meets the +quality of service (QoS) requirements of every user. It corresponds +to a distributed collection of base stations. As noted above, these +are cryptically named \sphinxstyleemphasis{eNodeB} or \sphinxstyleemphasis{eNB} (which is short for \sphinxstyleemphasis{evolved +Node B}) in 4G. In 5G, base stations are known as \sphinxstyleemphasis{gNB}, where the +“g” stands for \sphinxstyleemphasis{next Generation}. + +\sphinxAtStartPar +The Mobile Core is a bundle of functionality (conventionally packaged +as one or more devices) that serves several purposes. +\begin{itemize} +\item {} +\sphinxAtStartPar +Authenticates devices prior to attaching them to the network + +\item {} +\sphinxAtStartPar +Provides Internet (IP) connectivity for both data and voice services. + +\item {} +\sphinxAtStartPar +Ensures this connectivity fulfills the promised QoS requirements. + +\item {} +\sphinxAtStartPar +Tracks user mobility to ensure uninterrupted service. + +\item {} +\sphinxAtStartPar +Tracks subscriber usage for billing and charging. + +\end{itemize} + +\sphinxAtStartPar +For readers familiar with the Internet architecture and Wi\sphinxhyphen{}Fi as a +common access technology, some of these functions might look a bit +surprising. For example, Wi\sphinxhyphen{}Fi, like most of the Internet, normally +provides a best\sphinxhyphen{}effort service, whereas cellular networks often aim +to deliver some sort of QoS guarantee. Tracking subscribers for both +mobility and billing are also not the sort of things we tend to think +about in the Internet, but they are considered important functions for +cellular networks. The reasons for these differences are numerous, +including the typically large costs of acquiring cellular spectrum and +maintaining the infrastructure to use it such as radio towers. With +that large investment, there is a desire to recoup costs by charging +subscribers, which in turn leads to making some sort of service +guarantees to those subscribers to justify the cost. There is also a +need to maximize the efficiency of spectrum usage. Much of the +complexity of the mobile core follows from these requirements being +imposed by service providers. Even when we get to enterprises running +their own 5G networks, they still need to manage the usage of spectrum +to obtain the benefits of 5G over Wi\sphinxhyphen{}Fi, such as more predictable +control over latency and bandwidth. + +\sphinxAtStartPar +Note that Mobile Core is another example of a generic term. In 4G it +was called the \sphinxstyleemphasis{Evolved Packet Core (EPC)} and in 5G it is called the +\sphinxstyleemphasis{5G Core (5GC)}. Moreover, even though the word “Core” is in its name, +the Mobile Core runs near the edge of the network, effectively providing +a bridge between the RAN in some geographic area and the greater +IP\sphinxhyphen{}based Internet. 3GPP provides significant flexibility in how the +Mobile Core is geographically deployed, ranging from minimal deployments +(the RAN and the mobile core can be co\sphinxhyphen{}located) to areas that are +hundreds of kilometers wide. A common model is that an instantiation +of the Mobile Core serves a metropolitan area. The corresponding RAN +would then span several dozens (or even hundreds) of cell towers in +that geographic area. + +\sphinxAtStartPar +Taking a closer look at \hyperref[\detokenize{arch:fig-cellular}]{Figure \ref{\detokenize{arch:fig-cellular}}}, we see +that a \sphinxstyleemphasis{Backhaul Network} interconnects the base stations that +implement the RAN with the Mobile Core. This network is typically +wired, may or may not have the ring topology shown in the figure, and +is often constructed from commodity components found elsewhere in the +Internet. For example, the \sphinxstyleemphasis{Passive Optical Network (PON)} that +implements Fiber\sphinxhyphen{}to\sphinxhyphen{}the\sphinxhyphen{}Home is a prime candidate for implementing the +RAN backhaul, with the RAN effectively running as an \sphinxstyleemphasis{overlay} on top +of whatever technology is used. Switched ethernet, such as you might +find in an enterprise, is another suitable choice. The backhaul +network is obviously a necessary part of the RAN, but it is an +implementation choice and not prescribed by the 3GPP standard. + +\sphinxAtStartPar +Although 3GPP specifies all the elements that implement the RAN and +Mobile Core in an open standard—including sub\sphinxhyphen{}layers we have not yet +introduced—network operators have historically bought proprietary +implementations of each subsystem from a single vendor. This lack of +an open source implementation contributes to the perceived +“opaqueness” of the mobile cellular network in general, and the RAN in +particular. And while it is true that base stations contain +sophisticated algorithms for scheduling transmission on the radio +spectrum—algorithms that are considered valuable intellectual property +of the equipment vendors—there is significant opportunity to open and +disaggregate both the RAN and the Mobile Core. This book gives a +recipe for how to do exactly that. + +\sphinxAtStartPar +Before getting to those details, we have three more architectural +concepts to introduce. First, \hyperref[\detokenize{arch:fig-cups}]{Figure \ref{\detokenize{arch:fig-cups}}} redraws +components from \hyperref[\detokenize{arch:fig-cellular}]{Figure \ref{\detokenize{arch:fig-cellular}}} to highlight the +fact that a base station has an analog component (depicted by an +antenna) and a digital component (depicted by a processor pair). This +book mostly focuses on the latter, but we introduce enough information +about the over\sphinxhyphen{}the\sphinxhyphen{}air radio transmission to appreciate its impact on +the overall architecture. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=400\sphinxpxdimen]{{Slide3}.png} +\caption{Mobile Core divided into a Control Plane and a User Plane, an +architectural feature known as CUPS: Control and User Plane +Separation.}\label{\detokenize{arch:id4}}\label{\detokenize{arch:fig-cups}}\end{figure} + +\sphinxAtStartPar +The second concept, also depicted in \hyperref[\detokenize{arch:fig-cups}]{Figure \ref{\detokenize{arch:fig-cups}}}, +is to partition the Mobile Core into a \sphinxstyleemphasis{Control Plane} and \sphinxstyleemphasis{User +Plane}. This is similar to the control/data plane split that anyone +familiar with the Internet would recognize, and draws in particular on +the ideas of software\sphinxhyphen{}defined networking (SDN) by placing control and +user planes in separate devices. 3GPP has introduced a corresponding +acronym—\sphinxstyleemphasis{CUPS, Control and User Plane Separation}—to denote this +idea. One motivation for CUPS is to enable control plane resources and +data plane resources to be scaled independently of each other. + +\sphinxAtStartPar +Finally, one of the key aspirational goals of 5G is the ability to +segregate traffic for different usage domains into isolated \sphinxstyleemphasis{network +slices}, each of which delivers a different level of service to a +collection of devices and applications. Thinking of a network slice as +a wireless version of a virtual network is a fair approximation, +although as we’ll see in later chapters, the implementation details +differ. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=500\sphinxpxdimen]{{Slide4}.png} +\caption{Different usage domains (e.g., IoT and Video Streaming) +instantiate distinct \sphinxstyleemphasis{network slices} to connect a set of devices +with one or more applications.}\label{\detokenize{arch:id5}}\label{\detokenize{arch:fig-slice}}\end{figure} + +\sphinxAtStartPar +For example, \hyperref[\detokenize{arch:fig-slice}]{Figure \ref{\detokenize{arch:fig-slice}}} shows two slices, one +supporting IoT workloads and the other supporting multimedia streaming +traffic. As we’ll see throughout the book, an important question is +how slicing is realized end\sphinxhyphen{}to\sphinxhyphen{}end, across the radio, the RAN, and the +Mobile Core. This is done through a combination of allocating distinct +resources to each slice and scheduling shared resources on behalf of a +set of slices. + + +\section{2.2 Radio Transmission} +\label{\detokenize{arch:radio-transmission}} +\sphinxAtStartPar +Before describing the RAN and Mobile Core subsystems, we first call +attention to the obvious: that the base stations that comprise the RAN +communicate with UEs via electromagnetic radio waves. This book is not +about the physics of this over\sphinxhyphen{}the\sphinxhyphen{}air communication, and only skims +the surface of the information theory that underlies it. But +identifying the abstract properties of wireless communication is an +essential foundation for understanding the rest of the 5G +architecture. + +\sphinxAtStartPar +If you imagine the base stations as implementing a multi\sphinxhyphen{}layer +protocol stack (which, as we’ll see in Chapter 4, they do), then radio +transmission is the responsibility of the bottom\sphinxhyphen{}most layers of that +stack, where (a) digital/analog conversion happens, and (b) analog +radio waves are transmitted/received. Chapter 3 introduces radio +transmission with enough specificity to lay the necessary foundation, +so we’re able to understand all the layers that come above it. + +\sphinxAtStartPar +For the purposes of this chapter, we only need to understand the +following. First, the RAN is responsible for managing how the radio +spectrum is shared among thousands of UEs connected to hundreds of +base stations in a geographic region. The primary purpose of Chapter 3 +is to establish an abstract interface by which the RAN can manage that +spectrum without having to worry about the details of waveforms, +modulation, or coding algorithms. All important topics, to be sure, +but in the realm of information theory rather than system design that +is the focus of this book. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=300\sphinxpxdimen]{{Slide5}.png} +\caption{Abstractly, measures of signal quality (CQI) and declarations +of intended data delivery quality (5QI) are passed up and down +the RAN stack.}\label{\detokenize{arch:id6}}\label{\detokenize{arch:fig-quality}}\end{figure} + +\sphinxAtStartPar +Second, there are two important pieces of information shared between +the higher layers of the base station protocol stack that manages the +RAN as a whole, and the lower layers of the stack that manage radio +transmissions on a particular base station. One is the signal\sphinxhyphen{}to\sphinxhyphen{}noise +ratio that the base station observes when communicating with each +UE. This is called the \sphinxstyleemphasis{Channel Quality Indicator (CQI)} and it is +passed \sphinxstyleemphasis{up} from the radio. The other is the quality of service the +network wants to give a particular UE. This is called the \sphinxstyleemphasis{5G QoS +Identifier (5QI)} and it is passed \sphinxstyleemphasis{down} to the radio. This abstract +summary, as shown in \hyperref[\detokenize{arch:fig-quality}]{Figure \ref{\detokenize{arch:fig-quality}}}, is sufficient +to introduce the RAN and Mobile Core. We will fill in more details +about both of these parameters in Chapter 3. + +\begin{sphinxShadowBox} +\sphinxstylesidebartitle{Uniqueness of Wireless Links} + +\sphinxAtStartPar +\sphinxstyleemphasis{While it is common in networking to abstract the link layer by +treating the link as something that just delivers packets at some +rate from point A to point B, there are important differences +between wireless links and wired links that cannot be entirely +abstracted away at higher layers. This is especially true when +mobile devices are involved, as the quality of a link will vary +depending on the distance between transmitter and receiver, the +relative velocity of the endpoints, reflections of radio waves from +other objects, and interference from other transmitters. All of +these factors come into play in determining the Channel Quality +Indicator (CQI).} + +\sphinxAtStartPar +\sphinxstyleemphasis{Further complicating the picture in a mobile network is that a +given UE is often within reach of more than one base station, +presenting the option to handover the UE from one base station to +another. The decision to do so is not just a matter of picking the +base station with the best channel quality, but rather a matter of +trying to optimize the whole system, in which the goal is to +support as many UEs as possible at the desired quality level given +the available spectrum and coverage.} +\end{sphinxShadowBox} + +\sphinxAtStartPar +Finally, like the rest of the mobile cellular network, the radio comes +with a set of acronyms, with \sphinxstyleemphasis{LTE (Long\sphinxhyphen{}Term Evolution)} and \sphinxstyleemphasis{NR +(New Radio)} being the two most widely known. These are marketing +terms commonly associated with the radio technology for 4G and 5G, +respectively. They are important only in the sense that many of the +new features promised by 5G can be directly attributed to improvements +in the underlying radio technology. For our purposes, the key is the +set of new \sphinxstyleemphasis{use cases} the upgraded radio technology enables, and +why. We introduce these improvements to the radio in Chapter 3, and +tie them to the use cases they enable. Subsequent chapters will then +explain how the RAN and Mobile Core need to evolve so as to deliver on +this potential. + + +\section{2.3 Radio Access Network} +\label{\detokenize{arch:radio-access-network}} +\sphinxAtStartPar +We now describe the RAN by sketching the role each base station plays. +Keep in mind this is like describing the Internet by explaining +how a router works—not an unreasonable place to start, but it doesn’t +fully do justice to the end\sphinxhyphen{}to\sphinxhyphen{}end story. + +\sphinxAtStartPar +First, each base station establishes the wireless channel for a +subscriber’s UE upon power\sphinxhyphen{}up or upon handover when the UE is active. +This channel is released when the UE remains idle for a predetermined +period of time. Using 3GPP terminology, this wireless channel is said +to provide a \sphinxstyleemphasis{radio bearer}. The term “bearer” has historically been +used in telecommunications (including early wireline technologies such +as ISDN) to denote a data channel, as opposed to a channel that carries +signaling information. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=500\sphinxpxdimen]{{Slide6}.png} +\caption{UE detects (and connects to) base station.}\label{\detokenize{arch:id7}}\label{\detokenize{arch:fig-active-ue}}\end{figure} + +\sphinxAtStartPar +Second, each base station establishes “3GPP Control Plane” +connectivity between the UE and the corresponding Mobile Core Control +Plane component, and forwards signaling traffic between the two. This +signaling traffic enables UE authentication, registration, and +mobility tracking. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=500\sphinxpxdimen]{{Slide7}.png} +\caption{Base Station establishes control plane connectivity +between each UE and the Mobile Core.}\label{\detokenize{arch:id8}}\label{\detokenize{arch:fig-control-plane}}\end{figure} + +\sphinxAtStartPar +Third, for each active UE, the base station establishes one or more +tunnels to the corresponding Mobile Core User Plane component. +\hyperref[\detokenize{arch:fig-user-plane}]{Figure \ref{\detokenize{arch:fig-user-plane}}} shows just two (one for voice and +one for data), and while in practice 4G was limited to just two, 5G +aspires to support many such tunnels as part of a generalized network +slicing mechanism. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=500\sphinxpxdimen]{{Slide8}.png} +\caption{Base station establishes one or more tunnels between each UE and +the Mobile Core’s User Plane (known in 3GPP terms as PDU session).}\label{\detokenize{arch:id9}}\label{\detokenize{arch:fig-user-plane}}\end{figure} + +\sphinxAtStartPar +Fourth, the base station forwards both control and user plane packets +between the Mobile Core and the UE. These packets are tunneled over +SCTP/IP and GTP/UDP/IP, respectively. SCTP (Stream Control Transport +Protocol) is an alternative reliable transport to TCP, tailored to carry +signaling (control) information for telephony services. GTP (a nested +acronym corresponding to (General Packet Radio Service) Tunneling +Protocol) is a 3GPP\sphinxhyphen{}specific tunneling protocol designed to run over +UDP. + +\sphinxAtStartPar +It is noteworthy that connectivity between the RAN and the Mobile Core +is IP\sphinxhyphen{}based. This was introduced as one of the main changes between 3G +and 4G. Prior to 4G, the internals of the cellular network were +circuit\sphinxhyphen{}based, which is not surprising given its origins as a voice +network. This also helps to explain why in Section 2.1 we +characterized the RAN Backhaul as an overlay running on top of some +Layer 2 technology. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=500\sphinxpxdimen]{{Slide9}.png} +\caption{Base Station to Mobile Core (and Base Station to Base +Station) control plane tunneled over SCTP/IP and user plane +tunneled over GTP/UDP/IP.}\label{\detokenize{arch:id10}}\label{\detokenize{arch:fig-tunnels}}\end{figure} + +\sphinxAtStartPar +Fifth, each base station coordinates UE handovers with neighboring +base stations, using direct station\sphinxhyphen{}to\sphinxhyphen{}station links. Exactly like the +station\sphinxhyphen{}to\sphinxhyphen{}core connectivity shown in the previous figure, these links +are used to transfer both control plane (SCTP over IP) and user plane +(GTP over UDP/IP) packets. The decision as to when to do a handover is +based on the CQI values being reported by the radio on each of the +base stations within range of the UE, coupled with the 5QI value those +base stations know the RAN has promised to deliver to the UE. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=500\sphinxpxdimen]{{Slide10}.png} +\caption{Base Stations cooperate to implement UE hand over.}\label{\detokenize{arch:id11}}\label{\detokenize{arch:fig-handover}}\end{figure} + +\sphinxAtStartPar +Sixth, the base stations coordinate wireless multi\sphinxhyphen{}point transmission to +a UE from multiple base stations, which may or may not be part of a UE +handover from one base station to another. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=500\sphinxpxdimen]{{Slide11}.png} +\caption{Base Stations cooperate to implement multipath transmission (link +aggregation) to UEs.}\label{\detokenize{arch:id12}}\label{\detokenize{arch:fig-link-aggregation}}\end{figure} + +\sphinxAtStartPar +The main takeaway is that the base station can be viewed as a +specialized forwarder. In the Internet\sphinxhyphen{}to\sphinxhyphen{}UE direction, it fragments +outgoing IP packets into physical layer segments and schedules them +for transmission over the available radio spectrum, and in the +UE\sphinxhyphen{}to\sphinxhyphen{}Internet direction it assembles physical layer segments into IP +packets and forwards them (over a GTP/UDP/IP tunnel) to the upstream +user plane of the Mobile Core. Also, based on observations of the +wireless channel quality and per\sphinxhyphen{}subscriber policies, it decides +whether to (a) forward outgoing packets directly to the UE, (b) +indirectly forward packets to the UE via a neighboring base station, +or (c) utilize multiple paths to reach the UE. The third case has the +option of either spreading the physical payloads across multiple base +stations or across multiple carrier frequencies of a single base +station (including Wi\sphinxhyphen{}Fi). + +\sphinxAtStartPar +In other words, the RAN as a whole (i.e., not just a single base +station) not only supports handovers (an obvious requirement for +mobility), but also \sphinxstyleemphasis{link aggregation} and \sphinxstyleemphasis{load balancing}, +mechanisms that are similar to those found in other types of networks. +These functions imply a global decision\sphinxhyphen{}making process, whereby it’s +possible to forward traffic to a different base station (or to +multiple base stations) in an effort to make efficient use of the +radio spectrum over a larger geographic area. We will revisit how such +RAN\sphinxhyphen{}wide (global) decisions can be made using SDN techniques in +Chapter 4. + + +\section{2.4 Mobile Core} +\label{\detokenize{arch:mobile-core}} +\sphinxAtStartPar +At the most basic level, the function of the Mobile Core is to provide +packet data network connectivity to mobile subscribers, i.e., connect +them to the Internet. (The mobile network assumes that multiple packet +data networks can exist, but in practice the Internet is the one that +matters). As we noted above, there is more to providing this +connectivity than meets the eye: the Mobile Core ensures that +subscribers are authenticated and aims to deliver the service +qualities to which they have subscribed. As subscribers may move +around among base station coverage areas, the Mobile Core needs to +keep track of their whereabouts at the granularity of the serving +base station. The reasons for this tracking are discussed further in +Chapter 5. It is this support for security, mobility, and QoS that +differentiates the cellular network from Wi\sphinxhyphen{}Fi. + +\sphinxAtStartPar +We start with the security architecture, which is grounded in two +trust assumptions. First, each base station trusts that it is +connected to the Mobile Core by a secure private network, over which +it establishes the tunnels introduced in \hyperref[\detokenize{arch:fig-tunnels}]{Figure \ref{\detokenize{arch:fig-tunnels}}}: a GTP/UDP/IP tunnel to the Core’s User Plane (Core\sphinxhyphen{}UP) +and a SCTP/IP tunnel to the Core’s Control Plane (Core\sphinxhyphen{}CP). Second, +each UE has an operator\sphinxhyphen{}provided SIM card, which contains information +that uniquely identifies the subscriber and includes a secret key that +the UE uses to authenticate itself. + +\sphinxAtStartPar +The identifier burned into each SIM card, called an \sphinxstyleemphasis{IMSI +(International Mobile Subscriber Identity)}, is a globally unique +identifier for every device connected to the global mobile network. +Each IMSI is a 64\sphinxhyphen{}bit, self\sphinxhyphen{}describing identifier, which is to say, +it includes a \sphinxstyleemphasis{Format} field that effectively serves as a mask for +extracting other relevant fields. For example, the following is the +interpretation we assume in this book (where IMSIs are commonly +represented as an up to 15\sphinxhyphen{}digit decimal number): +\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxstylestrong{MCC:} Mobile Country Code (3\sphinxhyphen{}digit decimal number). + +\item {} +\sphinxAtStartPar +\sphinxstylestrong{MNC:} Mobile Network Code (2 or 3\sphinxhyphen{}digit decimal number). + +\item {} +\sphinxAtStartPar +\sphinxstylestrong{ENT:} Enterprise Code (3\sphinxhyphen{}digit decimal number). + +\item {} +\sphinxAtStartPar +\sphinxstylestrong{SUB:} Subscriber (6\sphinxhyphen{}digit decimal number). + +\end{itemize} + +\sphinxAtStartPar +The first two fields (\sphinxstyleemphasis{MCC}, \sphinxstyleemphasis{MNC}) are universally understood to +uniquely identify the MNO, while that last two fields are one example +of how an MNO might use additional hierarchical structure to uniquely +identify every device it serves. We are working towards delivering 5G +connectivity to enterprises (hence the \sphinxstyleemphasis{ENT} field), but other MNOs +might assign the last 9 digits using some other structure. + +\sphinxAtStartPar +The \sphinxstyleemphasis{MCC/MNC} pair—which is also called the \sphinxstyleemphasis{Public Land Mobile +Network (PLMN)} identifier—plays a role in roaming: when a UE tries +to connect to a “foreign network” those fields are used to find the +“home network”, where the rest of the IMSI leads to a subscriber +profile that says whether or not roaming is enabled for this +device. The following walks through what happens when a device +connects to its home network; more information about the global +ramifications is given at the end of the section. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=600\sphinxpxdimen]{{Slide12}.png} +\caption{Sequence of steps to establish secure Control and User Plane +channels.}\label{\detokenize{arch:id13}}\label{\detokenize{arch:fig-secure}}\end{figure} + +\sphinxAtStartPar +\hyperref[\detokenize{arch:fig-secure}]{Figure \ref{\detokenize{arch:fig-secure}}} shows the +per\sphinxhyphen{}UE connection sequence. When a UE first becomes active, it +communicates with a nearby base station over a temporary +(unauthenticated) radio link (Step 1). The base station forwards the +request to the Core\sphinxhyphen{}CP over the existing SCTP connection, and the +Core\sphinxhyphen{}CP (assuming it recognizes the IMSI) initiates an authentication +protocol with the UE (Step 2). 3GPP identifies a set of options for +authentication and encryption, where the actual protocols used are an +implementation choice. For example, \sphinxstyleemphasis{Advanced Encryption Standard} +(AES) is one of the options for encryption. Note that this +authentication exchange is initially in the clear since the base +station to UE link is not yet secure. + +\sphinxAtStartPar +Once the UE and Core\sphinxhyphen{}CP are satisfied with each other’s identity, the +Core\sphinxhyphen{}CP informs the other 5GC components of the parameters they will need +to service the UE (Step 3). This includes: (a) instructing the Core\sphinxhyphen{}UP +to initialize the user plane (e.g., assign an IP address to the UE and +set the appropriate 5QI); (b) instructing the base station to +establish an encrypted channel to the UE; and (c) giving the UE the +symmetric key it will need to use the encrypted channel with the base +station. The symmetric key is encrypted using the public key of the +UE (so only the UE can decrypt it, using its secret key). Once +complete, the UE can use the end\sphinxhyphen{}to\sphinxhyphen{}end user plane channel through the +Core\sphinxhyphen{}UP (Step 4). + +\sphinxAtStartPar +There are three additional details of note about this process. First, +the secure control channel between the UE and the Core\sphinxhyphen{}CP set up +during Step 2 remains available, and is used by the Core\sphinxhyphen{}CP to send +additional control instructions to the UE during the course of the +session. In other words, unlike the Internet, the network is able to +“control” the communication settings in edge devices. + +\sphinxAtStartPar +Second, the user plane channel established during Step 4 is referred +to as the \sphinxstyleemphasis{Default Data Radio Bearer}, but additional channels can be +established between the UE and Core\sphinxhyphen{}UP, each with a potentially +different 5QI. This might be done on an application\sphinxhyphen{}by\sphinxhyphen{}application +basis, for example, based on policies present in the Core\sphinxhyphen{}CP for +packets that require special/different treatment. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=500\sphinxpxdimen]{{Slide13}.png} +\caption{Sequence of per\sphinxhyphen{}hop tunnels involved in an end\sphinxhyphen{}to\sphinxhyphen{}end User Plane +channel.}\label{\detokenize{arch:id14}}\label{\detokenize{arch:fig-per-hop}}\end{figure} + +\sphinxAtStartPar +In practice, these per\sphinxhyphen{}flow tunnels are often bundled into a single +inter\sphinxhyphen{}component tunnel, which makes it impossible to differentiate the +level of service given to any particular end\sphinxhyphen{}to\sphinxhyphen{}end UE channel. This +is a limitation of 4G that 5G has ambitions to correct as part of its +support for network slicing. + +\sphinxAtStartPar +Support for mobility can now be understood as the process of +re\sphinxhyphen{}executing one or more of the steps shown in \hyperref[\detokenize{arch:fig-secure}]{Figure \ref{\detokenize{arch:fig-secure}}} as the UE moves throughout the RAN. The unauthenticated +link indicated by (1) allows the UE to be known to all base stations +within range. (We refer to these as \sphinxstyleemphasis{potential links} in later +chapters.) Based on the signal’s measured CQI, the base stations +communicate directly with each other to make a handover decision. +Once made, the decision is then communicated to the Mobile Core, +re\sphinxhyphen{}triggering the setup functions indicated by (3), which in turn +re\sphinxhyphen{}builds the user plane tunnel between the base station and the +Core\sphinxhyphen{}UP shown in \hyperref[\detokenize{arch:fig-per-hop}]{Figure \ref{\detokenize{arch:fig-per-hop}}}. One of the most +unique features of the cellular network is that the Mobile Core’s user +plane buffers data while idle UEs are transiting to active state, +thereby avoiding dropped packets and subsequent end\sphinxhyphen{}to\sphinxhyphen{}end +retransmissions. + +\sphinxAtStartPar +In other words, the mobile cellular network maintains the \sphinxstyleemphasis{UE session} +in the face of mobility (corresponding to the control and data +channels depicted by (2) and (4) in \hyperref[\detokenize{arch:fig-secure}]{Figure \ref{\detokenize{arch:fig-secure}}}, +respectively), but it is able to do so only when the same Mobile Core +serves the UE (i.e., only the base station changes). This would +typically be the case for a UE moving within a metropolitan area. +Moving between metro areas—and hence, between Mobile Cores—is +indistinguishable from power cycling a UE. The UE is assigned a new IP +address and no attempt is made to buffer and subsequently deliver +in\sphinxhyphen{}flight data. Independent of mobility, but relevant to this +discussion, any UE that becomes inactive for a period of time also +loses its session, with a new session established and a new IP address +assigned when the UE becomes active again. + +\sphinxAtStartPar +Note that this session\sphinxhyphen{}based approach can be traced to the mobile +cellular network’s roots as a connection\sphinxhyphen{}oriented network. An +interesting thought experiment is whether the Mobile Core will +continue to evolve so as to better match the connectionless +assumptions of the Internet protocols that typically run on top of it. + +\sphinxAtStartPar +We conclude this overview of the Mobile Core by returning to the role +it plays in implementing a \sphinxstyleemphasis{global} mobile network. It is probably +already clear that each MNO implements a database of subscriber +information, allowing it to map an IMSI to a profile that records what +services (roaming, data plane, hot spot support) the subscriber is +paying for. This record also includes the international phone number +for the device. How this database is realized is an implementation +choice (of which we’ll see an example in Chapter 5), but 3GPP defines +an interface by which one Mobile Core (running on behalf of one MNO) +queries another Mobile Core (running on behalf of some other MNO), to +map between the IMSI, the phone number, and the subscriber profile. + + +\section{2.5 Managed Cloud Service} +\label{\detokenize{arch:managed-cloud-service}} +\sphinxAtStartPar +The architectural overview presented up to this point focuses on the +functional elements of the mobile cellular network. We now turn our +attention to how this functionality is operationalized, and we do so +in a decidedly software\sphinxhyphen{}defined and cloud\sphinxhyphen{}native way. This lays the +foundation for the rest of the book, which builds towards supporting +5G connectivity as a managed cloud service. This is a marked change +from the conventional Telco approach, whereby an operator bought +purpose\sphinxhyphen{}built devices from a handful of vendors, and then managed them +using the legacy OSS/BSS machinery that was originally designed for +the telephony network.% +\begin{footnote}[1]\sphinxAtStartFootnote +OSS/BSS stands for Operation Support System / Business Support +System, and even traditional MNOs are now re\sphinxhyphen{}imagining them by +adopting cloud practices. But this transition is a slow process +due to all the legacy systems the Telcos need to continue +supporting. +% +\end{footnote} + +\sphinxAtStartPar +When we talk about “operationalizing” a network, we are referring to a +substantial system that operators (whether they are traditional MNOs +or cloud service providers) use to activate and manage all the +constituent components (whether they are purpose\sphinxhyphen{}built devices or +software running on commodity hardware). And because these network +operators are people, one high\sphinxhyphen{}level summary is that this management +layer (whether it is an OSS/BSS or a cloud orchestrator) provides a +way to map high\sphinxhyphen{}level \sphinxstyleemphasis{Intents} onto low\sphinxhyphen{}level \sphinxstyleemphasis{Actions}. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=300\sphinxpxdimen]{{Slide21}.png} +\caption{High\sphinxhyphen{}level summary of the role operationalization plays in a +network deployment.}\label{\detokenize{arch:id15}}\label{\detokenize{arch:fig-intent}}\end{figure} + +\sphinxAtStartPar +This overview, as illustrated in \hyperref[\detokenize{arch:fig-intent}]{Figure \ref{\detokenize{arch:fig-intent}}}, is +obviously quite abstract. To make the discussion more concrete, we use +an open source implementation, called Aether, as an example. Aether +is a Kubernetes\sphinxhyphen{}based edge cloud, augmented with a 5G\sphinxhyphen{}based +connectivity service. Aether is targeted at enterprises that want to +take advantage of 5G connectivity in support of edge applications that +require predictable, low\sphinxhyphen{}latency connectivity. In short, +“Kubernetes\sphinxhyphen{}based” means Aether is able to host container\sphinxhyphen{}based +services, with Kubernetes being the platform used to orchestrate the +services, and “5G\sphinxhyphen{}based connectivity” means Aether is able to connect +those services to mobile devices throughout the enterprise’s physical +environment. + +\sphinxAtStartPar +Aether supports this combination by implementing both the RAN and the +user plane of the Mobile Core on\sphinxhyphen{}prem, as cloud\sphinxhyphen{}native workloads +co\sphinxhyphen{}located on the Aether cluster. This is often referred to as \sphinxstyleemphasis{local +breakout} because it enables direct communication between mobile +devices and edge applications without data traffic leaving the +enterprise, in contrast to what would happen with standard, +operator\sphinxhyphen{}provided 5G service. This scenario is depicted in +\hyperref[\detokenize{arch:fig-hybrid}]{Figure \ref{\detokenize{arch:fig-hybrid}}}, which shows unnamed edge +applications running on\sphinxhyphen{}prem. Those edge applications might include +the local processing of sensor data or control applications for the +IoT devices, for example. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=700\sphinxpxdimen]{{Slide31}.png} +\caption{Overview of Aether as a hybrid cloud, with edge apps and the 5G +data plane (called \sphinxstyleemphasis{local breakout}) running on\sphinxhyphen{}prem and various +management and control\sphinxhyphen{}related workloads running in a central +cloud.}\label{\detokenize{arch:id16}}\label{\detokenize{arch:fig-hybrid}}\end{figure} + +\sphinxAtStartPar +The approach includes both edge (on\sphinxhyphen{}prem) and centralized (off\sphinxhyphen{}prem) +components. This is true for edge apps, which often have a centralized +counterpart running in a commodity cloud. It is also true for the 5G +Mobile Core, where the on\sphinxhyphen{}prem User Plane (UP) is paired with a +centralized Control Plane (CP). The central cloud shown in this figure +might be private (i.e., operated by the enterprise), public (i.e., +operated by a commercial cloud provider), or some combination of the +two (i.e., not all centralized elements need to run in the same +cloud). + +\sphinxAtStartPar +Also shown in \hyperref[\detokenize{arch:fig-hybrid}]{Figure \ref{\detokenize{arch:fig-hybrid}}} is a centralized +\sphinxstyleemphasis{Control and Management Platform}. This is Aether’s version of the +“Management Layer” depicted in \hyperref[\detokenize{arch:fig-intent}]{Figure \ref{\detokenize{arch:fig-intent}}}, and it +represents all the functionality needed to offer Aether as a managed +cloud service, with system administrators using a portal exported by +this platform to operate the underlying infrastructure and services +within their enterprise. + +\sphinxAtStartPar +Once we deconstruct the individual components in more details in the +next three chapters, we return to the question of how the resulting +set of components can be assembled into an operational edge cloud in +Chapter 6. The end result is 5G connectivity as a managed cloud service. + + +\chapter{Chapter 3: Radio Transmission} +\label{\detokenize{radio:chapter-3-radio-transmission}}\label{\detokenize{radio::doc}} +\sphinxAtStartPar +For anyone familiar with wireless access technologies that offer a +best\sphinxhyphen{}effort service, such as Wi\sphinxhyphen{}Fi, the cellular network presents a +notable contrast. This is mostly because cellular networks carefully +allocate available radio spectrum among many users (or more precisely, +UEs), aiming to deliver a certain quality to all active users in a +coverage area, while also allowing those users to remain connected +while moving. They also aim to maximize the efficiency of spectrum +usage, as it is a finite and often costly resource. This has resulted +in a highly dynamic and adaptive approach, in which coding, modulation +and scheduling play a central role. 5G takes the cellular approach to +managing radio resources to a new level of sophistication. + +\sphinxAtStartPar +Wireless transmission is full of challenges that don’t arise in wired +networks. Interference can arise from many sources ranging from +microwave ovens to baby monitors, while radio signals reflect off +objects such as buildings and vehicles. Some objects absorb wireless +signals. The properties of the wireless channel vary over time, and +depending on the frequency in use. Much of the design of cellular +radio systems is motivated by the need to deal with these challenges. + +\sphinxAtStartPar +As we will see in this chapter, mobile cellular networks use a +reservation\sphinxhyphen{}based strategy, whereas Wi\sphinxhyphen{}Fi is contention\sphinxhyphen{}based. This +difference is rooted in each system’s fundamental assumption about +utilization: Wi\sphinxhyphen{}Fi assumes a lightly loaded network (and hence +optimistically transmits when the wireless link is idle and backs off +if contention is detected), while 5G assumes (and strives for) high +utilization (and hence explicitly assign different users to different +“shares” of the available radio spectrum). + +\sphinxAtStartPar +The fact that 5G controls spectrum allocation carefully is central to +its ability to deliver guarantees of bandwidth and latency more +predictably than Wi\sphinxhyphen{}Fi. This in turn is why there is so much interest +in using 5G for mission\sphinxhyphen{}critical applications. + +\sphinxAtStartPar +We start by giving a short primer on radio transmission as a way of +laying a foundation for understanding the rest of the 5G architecture. +The following is not a substitute for a theoretical treatment of the topic, +but is instead intended as a way of grounding the systems\sphinxhyphen{}oriented +description of 5G that follows in the reality of wireless communication. + + +\section{3.1 Coding and Modulation} +\label{\detokenize{radio:coding-and-modulation}} +\sphinxAtStartPar +The mobile channel over which digital data needs to be reliably +transmitted brings a number of impairments, including noise, +attenuation, distortion, fading, and interference. This challenge is +addressed by a combination of coding and modulation, as depicted in +\hyperref[\detokenize{radio:fig-modulation}]{Figure \ref{\detokenize{radio:fig-modulation}}}. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=500\sphinxpxdimen]{{Slide141}.png} +\caption{The role of coding and modulation in mobile communication.}\label{\detokenize{radio:id5}}\label{\detokenize{radio:fig-modulation}}\end{figure} + +\sphinxAtStartPar +At its core, coding inserts extra bits into the data to help recover +from all the environmental factors that interfere with signal +propagation. This typically implies some form of \sphinxstyleemphasis{Forward Error +Correction} (e.g., turbo codes, polar codes). Modulation then +generates signals that represent the encoded data stream, and it does +so in a way that matches the channel characteristics: It first uses a +digital modulation signal format that maximizes the number of reliably +transmitted bits every second based on the specifics of the observed +channel impairments; it next matches the transmission +bandwidth to channel bandwidth using pulse shaping; and finally, it +uses RF modulation to transmit the signal as an electromagnetic wave +over an assigned \sphinxstyleemphasis{carrier frequency.} + +\sphinxAtStartPar +For a deeper appreciation of the challenges of reliably transmitting +data by propagating radio signals through the air, consider the +scenario depicted in \hyperref[\detokenize{radio:fig-multipath}]{Figure \ref{\detokenize{radio:fig-multipath}}}, where +the signal bounces off various stationary and moving objects, +following multiple paths from the transmitter to the receiver, who may +also be moving. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=600\sphinxpxdimen]{{Slide15}.png} +\caption{Signals propagate along multiple paths from +transmitter to receiver.}\label{\detokenize{radio:id6}}\label{\detokenize{radio:fig-multipath}}\end{figure} + +\sphinxAtStartPar +As a consequence of these multiple paths, the original signal arrives at +the receiver spread over time, as illustrated in +\hyperref[\detokenize{radio:fig-coherence}]{Figure \ref{\detokenize{radio:fig-coherence}}}. Empirical evidence shows that the +Multipath Spread—the time between the first and last signals of one +transmission arriving at the receiver—is 1\sphinxhyphen{}10μs in urban +environments and 10\sphinxhyphen{}30μs in suburban environments. These multipath +signals can interfere with each other constructively or destructively, +and this will vary over time. Theoretical +bounds for the time duration for which the channel may be assumed to +be invariant, known as the \sphinxstyleemphasis{Coherence Time} and denoted +\(T_c\), is given by +\begin{equation*} +\begin{split}T_c =c/v \times 1/f\end{split} +\end{equation*} +\sphinxAtStartPar +where \(c\) is the velocity of the signal, \(v\) is the +velocity of the receiver (e.g., moving car or train), and \(f\) is +the frequency of the carrier signal that is being modulated. This +says the coherence time is inversely proportional to the frequency of +the signal and the speed of movement, which makes intuitive sense: The +higher the frequency (narrower the wave) the shorter the coherence time, +and likewise, the faster the receiver is moving the shorter the coherence +time. Based on the target parameters to this model (selected according +to the target physical environment), it is possible to calculate +\(T_c\), which in turn bounds the rate at which symbols can be +transmitted without undue risk of interference. The dynamic nature of +the wireless channel is a central challenge to address in the cellular +network. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=500\sphinxpxdimen]{{Slide16}.png} +\caption{Received data spread over time due to multipath +variation.}\label{\detokenize{radio:id7}}\label{\detokenize{radio:fig-coherence}}\end{figure} + +\sphinxAtStartPar +To complicate matters further, +\hyperref[\detokenize{radio:fig-multipath}]{Figure \ref{\detokenize{radio:fig-multipath}}} and \hyperref[\detokenize{radio:fig-coherence}]{\ref{\detokenize{radio:fig-coherence}}} imply +the transmission originates from a single +antenna, but cell towers are equipped with an array of antennas, each +transmitting in a different (but overlapping) direction. This +technology, called \sphinxstyleemphasis{Multiple\sphinxhyphen{}Input\sphinxhyphen{}Multiple\sphinxhyphen{}Output (MIMO)}, opens the +door to purposely transmitting data from multiple antennas in an effort +to reach the receiver, adding even more paths to the environment\sphinxhyphen{}imposed +multipath propagation. + +\sphinxAtStartPar +One of the most important consequences of these factors is that the +transmitter must receive feedback from every receiver to judge how to +best utilize the wireless medium on their behalf. 3GPP specifies a +\sphinxstyleemphasis{Channel Quality Indicator (CQI)} for this purpose. In practice, +the receiver sends a CQI status report to the base station periodically +(e.g., every millisecond). These CQI messages report the observed +signal\sphinxhyphen{}to\sphinxhyphen{}noise ratio, which impacts the receiver’s ability to recover +the data bits. The base station then uses this information to adapt how +it allocates the available radio spectrum to the subscribers it is +serving, as well as which coding and modulation scheme to employ. +All of these decisions are made by the scheduler. + + +\section{3.2 Scheduler} +\label{\detokenize{radio:scheduler}} +\sphinxAtStartPar +How the scheduler does its job is one of the most important properties +of each generation of the cellular network, which in turn depends on +the multiplexing mechanism. For example, 2G used \sphinxstyleemphasis{Time Division +Multiple Access (TDMA)} and 3G used \sphinxstyleemphasis{Code Division Multiple Access +(CDMA)}. How data is multiplexed is also a major differentiator for 4G +and 5G, completing the transition from the cellular network being +fundamentally circuit\sphinxhyphen{}switched to fundamentally packet\sphinxhyphen{}switched. + +\sphinxAtStartPar +Both 4G and 5G are based on \sphinxstyleemphasis{Orthogonal Frequency\sphinxhyphen{}Division +Multiplexing (OFDM)}, an approach that multiplexes data over multiple +orthogonal subcarrier frequencies, each of which is modulated +independently. One attraction of OFDM is that, by splitting +the frequency band into subcarriers, it can send symbols on each +subcarrier at a relatively low rate. This makes it easier to correctly +decode symbols in the presence of multipath interference. The +efficiency of OFDM depends on the selection of +subcarrier frequencies so as to avoid interference, that is, how it +achieves orthogonality. That topic is beyond the scope of this book. + +\sphinxAtStartPar +As long as you understand that OFDM uses a set of subcarriers, with +symbols (each of which contain a few bits of data) being sent at some +rate on each subcarrier, that you can appreciate that there are +discrete schedulable units of the radio spectrum. The fundamental unit +is the time to transmit one symbol on one subcarrier. With that +building block in mind, we are now in a position to examine how +multiplexing and scheduling work in 4G and 5G. + + +\subsection{3.2.1 Multiplexing in 4G} +\label{\detokenize{radio:multiplexing-in-4g}} +\sphinxAtStartPar +We start with 4G because it provides a foundational understanding that +makes 5G easier to explain, where both 4G and 5G use an approach to +multiplexing called \sphinxstyleemphasis{Orthogonal Frequency\sphinxhyphen{}Division Multiple Access +(OFDMA)}. You can think of OFDMA as a specific application of OFDM. In +the 4G case, OFDMA multiplexes data over a set of 12 orthogonal +(non\sphinxhyphen{}interfering) subcarrier frequencies, each of which is modulated +independently.% +\begin{footnote}[1]\sphinxAtStartFootnote +4G uses OFDMA for downstream traffic, and a different +multiplexing strategy for upstream transmissions (from user +devices to base stations), but we do not describe it because +the approach is not applicable to 5G. +% +\end{footnote} The “Multiple Access” in OFDMA implies that data +can simultaneously be sent on behalf of multiple users, each on a +different subcarrier frequency and for a different duration of +time. The 4G\sphinxhyphen{}defined subbands are narrow (e.g., 15 kHz), and the +coding of user data into OFDMA symbols is designed to minimize the +risk of data loss due to interference. + +\sphinxAtStartPar +The use of OFDMA naturally leads to conceptualizing the radio spectrum +as a 2\sphinxhyphen{}D resource, as shown in \hyperref[\detokenize{radio:fig-sched-grid}]{Figure \ref{\detokenize{radio:fig-sched-grid}}}, +with the subcarriers represented in the vertical dimension and the time to +transmit symbols on each subcarrier represented in the horizontal dimension. +The basic unit of transmission, called a \sphinxstyleemphasis{Resource Element (RE)}, +corresponds to a 15\sphinxhyphen{}kHz band around one subcarrier frequency and the +time it takes to transmit one OFDMA symbol. The number of bits that +can be encoded in each symbol depends on the modulation scheme in use. +For example, using \sphinxstyleemphasis{Quadrature Amplitude Modulation (QAM)}, 16\sphinxhyphen{}QAM +yields 4 bits per symbol and 64\sphinxhyphen{}QAM yields 6 bits per symbol. The +details of the modulation need not concern us here; the key point is +that there is a degree of freedom to choose the modulation scheme +based on the measured channel quality, sending more bits per symbol +(and thus more bits per second) when the quality is high. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=600\sphinxpxdimen]{{Slide17}.png} +\caption{Spectrum abstractly represented by a 2\sphinxhyphen{}D grid of +schedulable Resource Elements.}\label{\detokenize{radio:id8}}\label{\detokenize{radio:fig-sched-grid}}\end{figure} + +\sphinxAtStartPar +A scheduler allocates some number of REs to each user that has data to +transmit during each 1 ms \sphinxstyleemphasis{Transmission Time Interval (TTI)}, where users +are depicted by different colored blocks in \hyperref[\detokenize{radio:fig-sched-grid}]{Figure \ref{\detokenize{radio:fig-sched-grid}}}. +The only constraint on the scheduler is that it must make its allocation +decisions on blocks of 7x12=84 resource elements, called a \sphinxstyleemphasis{Physical +Resource Block (PRB)}. \hyperref[\detokenize{radio:fig-sched-grid}]{Figure \ref{\detokenize{radio:fig-sched-grid}}} shows two +back\sphinxhyphen{}to\sphinxhyphen{}back PRBs. Of course time continues to flow along one axis, and +depending on the size of the available frequency band (e.g., it might be +100 MHz wide), there may be many more subcarrier slots (and hence PRBs) +available along the other axis, so the scheduler is essentially +preparing and transmitting a sequence of PRBs. + +\sphinxAtStartPar +Note that OFDMA is not a coding/modulation algorithm, but instead +provides a framework for selecting a specific coding and modulation for +each subcarrier frequency. QAM is one common example modulation. It is +the scheduler’s responsibility to select the modulation to use for each +PRB, based on the CQI feedback it has received. The scheduler also +selects the coding on a per\sphinxhyphen{}PRB basis, for example, by how it sets the +parameters to the turbo code algorithm. + +\sphinxAtStartPar +The 1\sphinxhyphen{}ms TTI corresponds to the time frame in which the scheduler +receives feedback from users about the quality of the signal they are +experiencing. This is the role of CQI: once every +millisecond, each user sends a set of metrics, which the scheduler uses +to make its decision as to how to allocate PRBs during the subsequent +TTI. + +\sphinxAtStartPar +Another input to the scheduling decision is the \sphinxstyleemphasis{QoS Class Identifier +(QCI)}, which indicates the quality\sphinxhyphen{}of\sphinxhyphen{}service each class of traffic +is to receive. In 4G, the QCI value assigned to each class (there are +twenty six such classes, in total) indicates whether the traffic has +a \sphinxstyleemphasis{Guaranteed Bit Rate (GBR)} or not \sphinxstyleemphasis{(non\sphinxhyphen{}GBR)}, plus the class’s +relative priority within those two categories. (Note that the 5QI +parameter introduced in Chapter 2 serves the same purpose as the +QCI parameter in 4G.) + +\sphinxAtStartPar +Finally, keep in mind that \hyperref[\detokenize{radio:fig-sched-grid}]{Figure \ref{\detokenize{radio:fig-sched-grid}}} focuses on +scheduling transmissions from a single antenna, but the MIMO technology +described above means the scheduler also has to determine which antenna +(or more generally, what subset of antennas) will most effectively reach +each receiver. But again, in the abstract, the scheduler is charged with +allocating a sequence of Resource Elements. + +\sphinxAtStartPar +Note that the scheduler has many degrees of freedom: it has to decide which +set of users to service during a given time interval, how many resource +elements to allocate to each such user, how to select the coding and +modulation levels, and which antenna to transmit their data on. This is +an optimization problem that, fortunately, we are not trying to solve +here. Our goal is to describe an architecture that allows someone else +to design and plug in an effective scheduler. Keeping the cellular +architecture open to innovations like this is one of our goals, and as +we will see in the next section, becomes even more important in 5G where +the scheduler operates with even more degrees of freedom. + + +\subsection{3.2.2 Multiplexing in 5G} +\label{\detokenize{radio:multiplexing-in-5g}} +\sphinxAtStartPar +The transition from 4G to 5G introduces additional flexibility in +how the radio spectrum is scheduled, making it possible to adapt the +cellular network to a more diverse set of devices and application +domains. + +\sphinxAtStartPar +Fundamentally, 5G defines a family of waveforms—unlike LTE, which +specified only one waveform—each optimized for a different band in the +radio spectrum.% +\begin{footnote}[2]\sphinxAtStartFootnote +A waveform is defined by the frequency, amplitude, and phase\sphinxhyphen{}shift +independent property (shape) of a signal. A sine wave is a simple +example of a waveform. +% +\end{footnote} The bands with carrier frequencies below 1 GHz are +designed to deliver mobile broadband and massive IoT services with a +primary focus on range. Carrier frequencies between 1\sphinxhyphen{}6 GHz are +designed to offer wider bandwidths, focusing on mobile broadband and +mission\sphinxhyphen{}critical applications. Carrier frequencies above 24 GHz +(mmWaves) are designed to provide super\sphinxhyphen{}wide bandwidths over short, +line\sphinxhyphen{}of\sphinxhyphen{}sight coverage. + +\sphinxAtStartPar +These different waveforms affect the scheduling and subcarrier intervals +(i.e., the “size” of the resource elements described in the previous +section). +\begin{itemize} +\item {} +\sphinxAtStartPar +For frequency range 1 (410 MHz \sphinxhyphen{} 7125 MHz), 5G allows maximum 100 MHz +bandwidths. In this case, there are three waveforms with subcarrier +spacings of 15, 30 and 60 kHz. (We used 15 kHz in the example shown in +\hyperref[\detokenize{radio:fig-sched-grid}]{Figure \ref{\detokenize{radio:fig-sched-grid}}}.) The corresponding to scheduling +intervals of 0.5, 0.25, and 0.125 ms, respectively. (We used 0.5 ms in +the example shown in \hyperref[\detokenize{radio:fig-sched-grid}]{Figure \ref{\detokenize{radio:fig-sched-grid}}}.) + +\item {} +\sphinxAtStartPar +For millimeter bands, also known as frequency range 2 (24.25 GHz \sphinxhyphen{} +52.6 GHz), bandwidths may go from 50 MHz up to 400 MHz. There are +two waveforms, with subcarrier spacings of 60 kHz and 120 kHz. Both +have scheduling intervals of 0.125 ms. + +\end{itemize} + +\sphinxAtStartPar +These various configurations of subcarrier spacing and scheduling +intervals are sometimes called the \sphinxstyleemphasis{numerology} of the radio’s air +interface. + +\sphinxAtStartPar +This range of numerology is important because it adds another degree +of freedom to the scheduler. In addition to allocating radio resources +to users, it has the ability to dynamically adjust the size of the +resource by changing the waveform being used. With this additional +freedom, fixed\sphinxhyphen{}sized REs are no longer the primary unit of resource +allocation. We instead use more abstract terminology, and talk about +allocating \sphinxstyleemphasis{Resource Blocks} to subscribers, where the 5G scheduler +determines both the size and number of Resource Blocks allocated +during each time interval. + +\sphinxAtStartPar +\hyperref[\detokenize{radio:fig-scheduler}]{Figure \ref{\detokenize{radio:fig-scheduler}}} depicts the role of the scheduler +from this more abstract perspective. Just as with 4G, CQI +feedback from the receivers and the 5QI quality\sphinxhyphen{}of\sphinxhyphen{}service class +selected by the subscriber are the two key pieces of input to the +scheduler. Note that the set of 5QI values available in 5G is +considerably greater than its QCI counterpart in 4G, +reflecting the increasing differentiation among classes that 5G aims +to support. For 5G, each class includes the following attributes: +\begin{itemize} +\item {} +\sphinxAtStartPar +Resource Type: Guaranteed Bit Rate (GBR), Delay\sphinxhyphen{}Critical GBR, Non\sphinxhyphen{}GBR + +\item {} +\sphinxAtStartPar +Priority Level + +\item {} +\sphinxAtStartPar +Packet Delay Budget + +\item {} +\sphinxAtStartPar +Packet Error Rate + +\item {} +\sphinxAtStartPar +Maximum Data Burst + +\item {} +\sphinxAtStartPar +Averaging Window + +\end{itemize} + +\sphinxAtStartPar +Note that while the preceding discussion could be interpreted to imply a +one\sphinxhyphen{}to\sphinxhyphen{}one relationship between subscribers and a 5QI, it is more +accurate to say that each 5QI is associated with a class of traffic +(often corresponding to some type of application), where a given +subscriber might be sending and receiving traffic that belongs to +multiple classes at any given time. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=600\sphinxpxdimen]{{Slide18}.png} +\caption{Scheduler allocates Resource Blocks to user data streams based on +CQI feedback from receivers and the 5QI parameters associated with +each class of service.}\label{\detokenize{radio:id9}}\label{\detokenize{radio:fig-scheduler}}\end{figure} + + +\section{3.3 Virtualized Scheduler (Slicing)} +\label{\detokenize{radio:virtualized-scheduler-slicing}} +\sphinxAtStartPar +The discussion up to this point presumes a single scheduler is +suitable for all workloads, but different applications have different +requirements for how their traffic gets scheduled. For example, some +applications care about latency and others care more about bandwidth. + +\sphinxAtStartPar +While in principle one could define a sophisticated scheduler that +takes dozens of different factors into account, 5G has introduced a +mechanism that allows the underlying resources (in this case radio +spectrum) to be “sliced” between different uses. The key to slicing +is to add a layer of indirection between the scheduler and the +physical resource blocks. Slicing, like much of 5G, has received a +degree of hype, but it boils down to virtualization at the level of +the radio scheduler. + +\sphinxAtStartPar +As shown in \hyperref[\detokenize{radio:fig-hypervisor}]{Figure \ref{\detokenize{radio:fig-hypervisor}}}, the idea is to first +schedule offered traffic demands to virtual RBs, and then +perform a second mapping of Virtual RBs to Physical RBs. This sort of +virtualization is common in resource allocators throughout computing +systems because we want to separate how many resources are allocated +to each user (or virtual machine in the computing case) from the +decision as to which physical resources are actually assigned. This +virtual\sphinxhyphen{}to\sphinxhyphen{}physical mapping is performed by a layer typically known as +a \sphinxstyleemphasis{Hypervisor}, and the important thing to keep in mind is that it is +totally agnostic about which user’s segment is affected by each +translation. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=600\sphinxpxdimen]{{Slide19}.png} +\caption{Wireless Hypervisor mapping virtual resource blocks to +physical resource blocks.}\label{\detokenize{radio:id10}}\label{\detokenize{radio:fig-hypervisor}}\end{figure} + +\sphinxAtStartPar +Having decoupled the Virtual RBs from Physical RBs, it is now possible +to define multiple Virtual RB sets (of varying sizes), each with its own +scheduler. \hyperref[\detokenize{radio:fig-multi-sched}]{Figure \ref{\detokenize{radio:fig-multi-sched}}} gives an example with two +equal\sphinxhyphen{}sized RB sets. The important consequence is this: having made +the macro\sphinxhyphen{}decision that the Physical RBs are divided into two equal +partitions, the scheduler associated with each partition is free to +allocate Virtual RBs independently from the other. For +example, one scheduler might be designed to deal with high\sphinxhyphen{}bandwidth +video traffic and another scheduler might be optimized for low\sphinxhyphen{}latency +IoT traffic. Alternatively, a certain fraction of the available capacity +could be reserved for premium customers or other high\sphinxhyphen{}priority traffic +(e.g., public safety), with the rest shared among everyone else. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=600\sphinxpxdimen]{{Slide20}.png} +\caption{Multiple schedulers running on top of wireless +hypervisor.}\label{\detokenize{radio:id11}}\label{\detokenize{radio:fig-multi-sched}}\end{figure} + +\sphinxAtStartPar +A final point to note is that there is considerable flexibility in the +allocation of resources to slices. While the example above shows +resources allocated in a fixed manner to each slice, it is possible to +make unused resources in one slice available to another slice, as long +as they can be reclaimed when needed. This is similar to how work\sphinxhyphen{}conserving +scheduling works in network queues: resources are not wasted if the +offered load in a class is less than the rate guaranteed for that class. + + +\section{3.4 New Use Cases} +\label{\detokenize{radio:new-use-cases}} +\sphinxAtStartPar +We conclude by noting that up to this point we have described 5G as +introducing additional degrees of freedom into how data is scheduled +for transmission, but when taken as a whole, the end result is a +qualitatively more powerful radio. This new 5G air interface +specification, which is commonly referred to as \sphinxstyleemphasis{New Radio (NR)}, +enables new use cases that go well beyond simply delivering +increased bandwidth. 3GPP defined five such use cases: +\begin{itemize} +\item {} +\sphinxAtStartPar +Enhanced Mobile Broadband (eMBB) + +\item {} +\sphinxAtStartPar +Ultra\sphinxhyphen{}Reliable Low\sphinxhyphen{}Latency Communications (URLLC) + +\item {} +\sphinxAtStartPar +Massive Internet of Things (MIoT) + +\item {} +\sphinxAtStartPar +Vehicle to Infrastructure/Vehicle (V2X) + +\item {} +\sphinxAtStartPar +High\sphinxhyphen{}Performance Machine\sphinxhyphen{}Type Communications (HMTC) + +\end{itemize} + +\sphinxAtStartPar +These use cases reflect the requirements introduced in Chapter 1, and +can be attributed to four fundamental improvements in how 5G +multiplexes data onto the radio spectrum. + +\sphinxAtStartPar +The first improvement is being able to change the waveform. This effectively +introduces the ability to dynamically change the size and number of +schedulable resource units, which opens the door to making fine\sphinxhyphen{}grained +scheduling decisions that are critical to predictable, low\sphinxhyphen{}latency +communication. + +\sphinxAtStartPar +The second is related to the “Multiple Access” aspect of how distinct +traffic sources are multiplexed onto the available spectrum. In 4G, +multiplexing happens in both the frequency and time domains for +downstream traffic, but only in the frequency +domain for upstream traffic. 5G NR multiplexes both upstream and +downstream traffic in both the time and frequency domains. Doing so +provides finer\sphinxhyphen{}grained scheduling control needed by latency\sphinxhyphen{}sensitive +applications. + +\sphinxAtStartPar +The third advance is related to the new spectrum available to 5G NR, +with the mmWave allocations opening above 24 GHz being especially +important. This is not only because of the abundance of capacity—which +makes it possible to set aside dedicated capacity for +applications that require low\sphinxhyphen{}latency communication—but also because +the higher frequency enables even finer\sphinxhyphen{}grained resource blocks (e.g., +scheduling intervals as short as 0.125 ms). Again, this improves +scheduling granularity to the benefit of applications that cannot +tolerate unpredictable latency. + +\sphinxAtStartPar +The fourth is related to delivering mobile connectivity to a massive +number of IoT devices, ranging from devices that require mobility +support and modest data rates (e.g. wearables, asset trackers) to +devices that support intermittent transmission of a few bytes of data +(e.g., sensors, meters). None of these devices are particularly +latency\sphinxhyphen{}sensitive or bandwidth\sphinxhyphen{}hungry, but they often require long +battery lifetimes, and hence, reduced hardware complexity that draws +less power. + +\sphinxAtStartPar +Support for IoT device connectivity revolves around allocating some of +the available radio spectrum to a light\sphinxhyphen{}weight (simplified) air +interface. This approach started with Release 13 of LTE via two +complementary technologies: mMTC and NB\sphinxhyphen{}IoT (NarrowBand\sphinxhyphen{}IoT). Both +technologies build on a significantly simplified version of LTE—i.e., +limiting the numerology and flexibility needed to achieve high spectrum +utilization—so as to allow for simpler IoT hardware design. mMTC +delivers up to 1 Mbps over 1.4 MHz of bandwidth and NB\sphinxhyphen{}IoT delivers a +few tens of kbps over 200 kHz of bandwidth; hence the term +\sphinxstyleemphasis{NarrowBand}. Both technologies have been designed to support over +1 million devices per square kilometer. With Release 16, both +technologies can be operated in\sphinxhyphen{}band with 5G, but still based on LTE +numerology. Starting with Release 17, a simpler version of 5G NR, +called \sphinxstyleemphasis{NR\sphinxhyphen{}Light}, will be introduced as the evolution of mMTC. +NR\sphinxhyphen{}Light is expected to scale the device density even further. + +\sphinxAtStartPar +As a complement to these four improvements, 5G NR is designed to +support partitioning the available bandwidth, with different +partitions dynamically allocated to different classes of traffic +(e.g., high\sphinxhyphen{}bandwidth, low\sphinxhyphen{}latency, and low\sphinxhyphen{}complexity). This is +the essence of \sphinxstyleemphasis{slicing}, as discussed above. +Moreover, once traffic with different requirements can be served by +different slices, 5G NR’s approach to multiplexing is general enough +to support varied scheduling decisions for those slices, each tailored +for the target traffic. We return to the applications of slicing in +Chapter 6. + + +\chapter{Chapter 4: Radio Access Network} +\label{\detokenize{ran:chapter-4-radio-access-network}}\label{\detokenize{ran::doc}} +\sphinxAtStartPar +The high\sphinxhyphen{}level description of the RAN in Chapter 2 was mostly silent +about the RAN’s internal structure. We now focus on those details, and +in doing so, explain how the RAN is being transformed in 5G. + +\sphinxAtStartPar +You can think of the RAN as having one main job: to transfer packets +between the mobile core and a set of UEs. This means it is deeply +involved in the management and scheduling of radio spectrum that we +discussed in the last chapter, but there is more to it than that. We +start by describing the stages in the RAN’s packet processing +pipeline, and then showing how these stages are being disaggregated, +distributed, and implemented. + +\sphinxAtStartPar +Note that the deconstruction of the RAN presented in this chapter +represents a combination of standardized specifications and +implementation strategies. The former continues to be under the +purview of the 3GPP, but the latter are primarily influenced by a +second organization: the \sphinxstyleemphasis{Open\sphinxhyphen{}RAN Alliance (O\sphinxhyphen{}RAN)} introduced in +Chapter 1. O\sphinxhyphen{}RAN is led by network operators with the goal of +developing a software\sphinxhyphen{}based implementation of the RAN that eliminates +vendor lock\sphinxhyphen{}in. Such business forces are certainly a factor in where +5G mobile networks are headed, but our goal in this chapter is to +identify the technical design decisions involved in that evolution. + + +\section{4.1 Packet Processing Pipeline} +\label{\detokenize{ran:packet-processing-pipeline}} +\sphinxAtStartPar +\hyperref[\detokenize{ran:fig-pipeline}]{Figure \ref{\detokenize{ran:fig-pipeline}}} shows the packet processing stages +historically bundled in base stations, as specified by the 3GPP +standard. Note that the figure depicts the base station as a pipeline +(running left\sphinxhyphen{}to\sphinxhyphen{}right for packets sent to the UE) but it is equally +valid to view it as a protocol stack (as is typically done in official +3GPP documents). Also note that (for now) we are agnostic as to how +these stages are implemented. Since we are ultimately heading +towards a cloud\sphinxhyphen{}based implementation, one possible implementation +strategy would be a microservice per box. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=600\sphinxpxdimen]{{Slide110}.png} +\caption{RAN processing pipeline, including both user and +control plane components.}\label{\detokenize{ran:id5}}\label{\detokenize{ran:fig-pipeline}}\end{figure} + +\sphinxAtStartPar +The key stages are as follows. +\begin{itemize} +\item {} +\sphinxAtStartPar +RRC (Radio Resource Control) \(\rightarrow\) Responsible for configuring the +coarse\sphinxhyphen{}grained and policy\sphinxhyphen{}related aspects of the pipeline. The RRC runs +in the RAN’s control plane; it does not process packets in the user +plane. + +\item {} +\sphinxAtStartPar +PDCP (Packet Data Convergence Protocol) \(\rightarrow\) Responsible for compressing +and decompressing IP headers, ciphering and deciphering, integrity +protection and integrity verification, duplication, reordering and +in\sphinxhyphen{}order delivery, and out\sphinxhyphen{}of\sphinxhyphen{}order delivery. + +\item {} +\sphinxAtStartPar +RLC (Radio Link Control) \(\rightarrow\) Responsible for segmentation and +reassembly, as well as reliably transmitting/receiving segments +using error correction through ARQ (automatic repeat request). + +\item {} +\sphinxAtStartPar +MAC (Media Access Control) \(\rightarrow\) Responsible for buffering, multiplexing +and demultiplexing segments, including all real\sphinxhyphen{}time scheduling +decisions about what segments are transmitted when. Also able to make +a “late” forwarding decision (i.e., to alternative carrier +frequencies, including Wi\sphinxhyphen{}Fi). + +\item {} +\sphinxAtStartPar +PHY (Physical Layer) \(\rightarrow\) Responsible for coding and modulation (as +discussed in Chapter 3), including FEC. + +\end{itemize} + +\sphinxAtStartPar +The last two stages in \hyperref[\detokenize{ran:fig-pipeline}]{Figure \ref{\detokenize{ran:fig-pipeline}}} (D/A +conversion and the RF front\sphinxhyphen{}end) are beyond the scope of this book. + +\sphinxAtStartPar +While it is simplest to view the stages in \hyperref[\detokenize{ran:fig-pipeline}]{Figure \ref{\detokenize{ran:fig-pipeline}}} as a pure left\sphinxhyphen{}to\sphinxhyphen{}right pipeline, the Scheduler +described in Section 3.2 (denoted “S” in the figure) runs in the MAC +stage/layer, and implements the “main loop” for outbound traffic: +It reads data from the upstream RLC and schedules transmissions to the +downstream PHY. Since the Scheduler determines the number of bytes to +transmit to a given UE during each time period (based on all the +factors outlined in Chapter 3), it must request (get) a segment of +that length from the upstream queue. In practice, the size of the +segment that can be transmitted on behalf of a single UE during a +single scheduling interval can range from a few bytes to an entire IP +packet. + +\sphinxAtStartPar +Also note that a combination of the RRC and PDCP are responsible for +the observation made in Section 2.3: that a \sphinxstyleemphasis{“base station can be +viewed as a specialized forwarder”}. The control plane logic that +decides whether this base station should continue processing a packet +or forward it to another base station runs in the RRC, and the +corresponding user plane mechanism that carries out the forwarding +decision is implemented in the PDCP. The interface between these two +elements is defined by the 3GPP spec, but the decision\sphinxhyphen{}making logic is +an implementation choice (and historically proprietary). This control +logic is generically referred as the \sphinxstyleemphasis{Radio Resource Management +(RRM)}, not to be confused with the standards\sphinxhyphen{}defined RRC stage +depicted in \hyperref[\detokenize{ran:fig-pipeline}]{Figure \ref{\detokenize{ran:fig-pipeline}}}. + + +\section{4.2 Split RAN} +\label{\detokenize{ran:split-ran}} +\sphinxAtStartPar +The next step is to understand how the functionality outlined above is +partitioned between physical elements, and hence, “split” across +centralized and distributed locations. The dominant option has +historically been “no split,” with the entire pipeline shown in +\hyperref[\detokenize{ran:fig-pipeline}]{Figure \ref{\detokenize{ran:fig-pipeline}}} running in the base station. Going +forward, the 3GPP standard has been extended to allow for multiple +split\sphinxhyphen{}points, with the partition shown in \hyperref[\detokenize{ran:fig-split-ran}]{Figure \ref{\detokenize{ran:fig-split-ran}}} being actively pursued by the operator\sphinxhyphen{}led O\sphinxhyphen{}RAN +Alliance. It is the split we adopt throughout the rest of this +book. Note that the split between centralized and distributed +components mirrors the split made in SDN, with similar motivations. We +discuss further how SDN techniques are applied to the RAN below. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=600\sphinxpxdimen]{{Slide24}.png} +\caption{Split RAN processing pipeline distributed across a +Central Unit (CU), Distributed Unit (DU), and Radio Unit (RU).}\label{\detokenize{ran:id6}}\label{\detokenize{ran:fig-split-ran}}\end{figure} + +\sphinxAtStartPar +This results in a RAN\sphinxhyphen{}wide configuration similar to that shown in +\hyperref[\detokenize{ran:fig-ran-hierarchy}]{Figure \ref{\detokenize{ran:fig-ran-hierarchy}}}, where a single \sphinxstyleemphasis{Central Unit +(CU)} running in the cloud serves multiple \sphinxstyleemphasis{Distributed Units (DUs)}, +each of which in turn serves multiple \sphinxstyleemphasis{Radio Units (RUs)}. Critically, +the RRC (centralized in the CU) is responsible for making only +near\sphinxhyphen{}real\sphinxhyphen{}time configuration and control decisions, while the +Scheduler that is part of the MAC stage is responsible for all +real\sphinxhyphen{}time scheduling decisions. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=400\sphinxpxdimen]{{Slide32}.png} +\caption{Split RAN hierarchy, with one CU serving multiple DUs, +each of which serves multiple RUs.}\label{\detokenize{ran:id7}}\label{\detokenize{ran:fig-ran-hierarchy}}\end{figure} + +\sphinxAtStartPar +Because scheduling decisions for radio transmission are made by the +MAC layer in real time, a DU needs to be “near” (within 1ms) the RUs +it manages. (You can’t afford to make scheduling decisions based on +out\sphinxhyphen{}of\sphinxhyphen{}date channel information.) One familiar configuration is to +co\sphinxhyphen{}locate a DU and an RU in a cell tower. But when an RU corresponds +to a small cell, many of which might be spread across a modestly\sphinxhyphen{}sized +geographic area (e.g., a mall, campus, or factory), then a single DU +would likely service multiple RUs. The use of mmWave in 5G is likely +to make this latter configuration all the more common. + +\sphinxAtStartPar +Also note that the Split RAN changes the nature of the Backhaul +Network, which originally connected the base stations back to the +Mobile Core. With the Split RAN there are multiple connections, which +are officially labeled as follows. +\begin{itemize} +\item {} +\sphinxAtStartPar +RU\sphinxhyphen{}DU connectivity is called the Fronthaul + +\item {} +\sphinxAtStartPar +DU\sphinxhyphen{}CU connectivity is called the Midhaul + +\item {} +\sphinxAtStartPar +CU\sphinxhyphen{}Mobile Core connectivity is called the Backhaul + +\end{itemize} + +\sphinxAtStartPar +For more insight into design considerations for interconnecting the +distributed components of a Split RAN, we recommend the NGMN Alliance +Report. + +\phantomsection\label{\detokenize{ran:reading-backhaul}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +\sphinxhref{https://www.ngmn.org/wp-content/uploads/NGMN\_RANEV\_D4\_BH\_FH\_Evolution\_V1.01.pdf}{RAN Evolution Project: Backhaul and Fronthaul Evolution}. +NGMN Alliance Report, March 2015. +\end{sphinxadmonition} + +\sphinxAtStartPar +One observation about the CU (which becomes relevant in Chapter 6 when +we incorporate it into a managed cloud service) is that one might +co\sphinxhyphen{}locate the CU and Mobile Core in the same cluster, meaning the +backhaul is implemented in the cluster switching fabric. In such a +configuration, the midhaul then effectively serves the same purpose as +the original backhaul, and the fronthaul is constrained by the +predictable/low\sphinxhyphen{}latency requirements of the MAC stage’s real\sphinxhyphen{}time +scheduler. This situation is further complicated by the fact that the +mobile core itself may be disaggregated, as discussed in Chapter 5. + +\sphinxAtStartPar +A second observation about the CU shown in \hyperref[\detokenize{ran:fig-split-ran}]{Figure \ref{\detokenize{ran:fig-split-ran}}} is that it encompasses two functional blocks—the RRC +and the PDCP—which lie on the RAN’s control plane and user plane, +respectively. This separation is consistent with the idea of CUPS +introduced in Chapter 2, and plays an increasingly important role as +we dig deeper into how the RAN is implemented. For now, we note that +the two parts are sometimes referred to as the CU\sphinxhyphen{}CP and CU\sphinxhyphen{}UP, +respectively. + +\sphinxAtStartPar +We conclude our description of the split RAN architecture with the +alternative depiction in \hyperref[\detokenize{ran:fig-split-alt}]{Figure \ref{\detokenize{ran:fig-split-alt}}}. +For completeness, this figure identifies the standardized interfaces +between the components (e.g., N2, N3, F1\sphinxhyphen{}U, F1\sphinxhyphen{}C, and Open Fronthaul). +We’re not going to talk about these interfaces, except to note that +they exist and there is a corresponding 3GPP specification that spells +out the details. Instead, we’re going to comment on the availability +of open source implementations for each component. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=150\sphinxpxdimen]{{Slide101}.png} +\caption{Alternative depiction of the Split RAN components, showing the +3GPP\sphinxhyphen{}specified inter\sphinxhyphen{}unit interfaces.}\label{\detokenize{ran:id8}}\label{\detokenize{ran:fig-split-alt}}\end{figure} + +\sphinxAtStartPar +With respect to the Central Unit, most of the complexity is in the +CU\sphinxhyphen{}CP, which, as we’ll see in the next section, is being re\sphinxhyphen{}engineered +using SDN, with open source solutions available. With respect to the +Radio Unit, nearly all the complexity is in D/A conversion and how the +resulting analog signal is amplified. Incumbent vendors have +significant proprietary know\sphinxhyphen{}how in this space, which will almost +certainly remain closed. + +\sphinxAtStartPar +With respect to the Distributed Unit, the news is mixed, and +correspondingly, the figure shows more detail. The High\sphinxhyphen{}PHY +module—which corresponds to all but the RF modulation step of +\hyperref[\detokenize{radio:fig-modulation}]{Figure \ref{\detokenize{radio:fig-modulation}}} in Section 3.1—is one of the most +complex components in the RAN stack. An open source implementation of +the High\sphinxhyphen{}PHY, known as FlexRAN, exists and is widely used in +commercial products. The only caveat is that the software license +restricts usage to Intel processors, although it is also the case that +the FlexRAN software exploits Intel\sphinxhyphen{}specific hardware capabilities. As +for the rest of the DU, the MAC is the other source of high\sphinxhyphen{}value +closed technology, particularly in how scheduling is done. There is an +open source version made available by the Open Air Initiative (OAI), +but its usage is restricted to research\sphinxhyphen{}only deployments. + +\phantomsection\label{\detokenize{ran:reading-du-impl}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +\sphinxhref{https://www.intel.com/content/www/us/en/developer/topic-technology/edge-5g/tools/flexran.html}{FlexRAN: Reference Architecture for Wireless Access}. + +\sphinxAtStartPar +\sphinxhref{https://openairinterface.org/}{Open Air Interface}. +\end{sphinxadmonition} + + +\section{4.3 Software\sphinxhyphen{}Defined RAN} +\label{\detokenize{ran:software-defined-ran}} +\sphinxAtStartPar +We now describe how the RAN is being implemented according to SDN +principles, resulting in an SD\sphinxhyphen{}RAN. The key architectural insight is +shown in \hyperref[\detokenize{ran:fig-rrc-split}]{Figure \ref{\detokenize{ran:fig-rrc-split}}}, where the RRC from +\hyperref[\detokenize{ran:fig-pipeline}]{Figure \ref{\detokenize{ran:fig-pipeline}}} is partitioned into two +sub\sphinxhyphen{}components: the one on the left provides a 3GPP\sphinxhyphen{}compliant way for +the RAN to interface to the Mobile Core’s control plane (the figure +labels this sub\sphinxhyphen{}component as a “Proxy”), while the one on the right +opens a new programmatic API for exerting software\sphinxhyphen{}based control over +the pipeline that implements the RAN user plane. + +\sphinxAtStartPar +To be more specific, the left sub\sphinxhyphen{}component simply forwards control +packets between the Mobile Core and the PDCP, providing a path over +which the Mobile Core can communicate with the UE for control +purposes, whereas the right sub\sphinxhyphen{}component implements the core of the +RRC’s control functionality (which as we explained in Section 4.1 is +also known as RRM). This latter component is commonly referred to as +the \sphinxstyleemphasis{RAN Intelligent Controller (RIC)} in O\sphinxhyphen{}RAN architecture +documents, so we adopt this terminology. The “Near\sphinxhyphen{}Real Time” +qualifier indicates the RIC is part of 10\sphinxhyphen{}100ms control loop +implemented in the CU, as opposed to the \textasciitilde{}1ms control loop required by +the MAC scheduler running in the DU. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=600\sphinxpxdimen]{{Slide42}.png} +\caption{RRC disaggregated into a Mobile Core facing control plane +component (a proxy) and a Near\sphinxhyphen{}Real\sphinxhyphen{}Time Controller.}\label{\detokenize{ran:id9}}\label{\detokenize{ran:fig-rrc-split}}\end{figure} + +\sphinxAtStartPar +Although not shown in \hyperref[\detokenize{ran:fig-rrc-split}]{Figure \ref{\detokenize{ran:fig-rrc-split}}}, keep in +mind (from \hyperref[\detokenize{ran:fig-split-ran}]{Figure \ref{\detokenize{ran:fig-split-ran}}}) that the RRC and the +PDCP form the CU. Reconciling these two figures is a little bit messy, but +to a first approximation, the PDCP corresponds to the CU\sphinxhyphen{}UP and +RRC\sphinxhyphen{}Proxy corresponds to the CU\sphinxhyphen{}CP, with the RIC “lifted out” and +responsible for overseeing both. We postpone a diagram depicting this +relationship until Section 4.5, where we summarize the end\sphinxhyphen{}to\sphinxhyphen{}end +result. For now, the important takeaway is that the SDN\sphinxhyphen{}inspired +refactoring of the RAN is free both to move functionality around and to +introduce new module boundaries, as long as the original 3GPP\sphinxhyphen{}defined +interfaces are preserved. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=400\sphinxpxdimen]{{Slide52}.png} +\caption{Example set of control applications (xApps) running on top of +Near\sphinxhyphen{}Real\sphinxhyphen{}Time RAN Controller (RIC), controlling a distributed set +of Split RAN elements (CU, DU, RU).}\label{\detokenize{ran:id10}}\label{\detokenize{ran:fig-ran-controller}}\end{figure} + +\sphinxAtStartPar +Completing the picture, \hyperref[\detokenize{ran:fig-ran-controller}]{Figure \ref{\detokenize{ran:fig-ran-controller}}} shows +the Near\sphinxhyphen{}RT RIC implemented as an SDN Controller hosting a set of SDN +control apps. The RIC maintains a \sphinxstyleemphasis{RAN Network Information Base +(R\sphinxhyphen{}NIB)}—a common set of information that can be consumed by numerous +control apps. The R\sphinxhyphen{}NIB includes time\sphinxhyphen{}averaged CQI values and other +per\sphinxhyphen{}session state (e.g., GTP tunnel IDs, 5QI values for the type of +traffic), while the MAC (as part of the DU) maintains the +instantaneous CQI values required by the real\sphinxhyphen{}time scheduler. More +generally, the R\sphinxhyphen{}NIB includes the following state: +\begin{itemize} +\item {} +\sphinxAtStartPar +Fixed Nodes (RU/DU/CU Attributes) +\begin{itemize} +\item {} +\sphinxAtStartPar +Identifiers + +\item {} +\sphinxAtStartPar +Version + +\item {} +\sphinxAtStartPar +Config Report + +\item {} +\sphinxAtStartPar +RRM config + +\item {} +\sphinxAtStartPar +PHY resource usage + +\end{itemize} + +\item {} +\sphinxAtStartPar +Mobile Nodes (UE Attributes) +\begin{itemize} +\item {} +\sphinxAtStartPar +Devices +\begin{itemize} +\item {} +\sphinxAtStartPar +Identifiers + +\item {} +\sphinxAtStartPar +Capability + +\item {} +\sphinxAtStartPar +Measurement Config + +\item {} +\sphinxAtStartPar +State (Active/Idle) + +\end{itemize} + +\item {} +\sphinxAtStartPar +Links (\sphinxstyleemphasis{Actual} and \sphinxstyleemphasis{Potential}) +\begin{itemize} +\item {} +\sphinxAtStartPar +Identifiers + +\item {} +\sphinxAtStartPar +Link Type + +\item {} +\sphinxAtStartPar +Config/Bearer Parameters + +\item {} +\sphinxAtStartPar +5QI Value + +\end{itemize} + +\end{itemize} + +\item {} +\sphinxAtStartPar +Virtual Constructs (Slice Attributes) +\begin{itemize} +\item {} +\sphinxAtStartPar +Links + +\item {} +\sphinxAtStartPar +Bearers/Flows + +\item {} +\sphinxAtStartPar +Validity Period + +\item {} +\sphinxAtStartPar +Desired KPIs + +\item {} +\sphinxAtStartPar +MAC RRM Configuration + +\item {} +\sphinxAtStartPar +RRM Control Configuration + +\end{itemize} + +\end{itemize} + +\sphinxAtStartPar +The four example Control Apps (xApps) in \hyperref[\detokenize{ran:fig-ran-controller}]{Figure \ref{\detokenize{ran:fig-ran-controller}}} do not constitute an exhaustive list, but they +do represent the sweet spot for SDN, with its emphasis on central +control over distributed forwarding. These functions—Link Aggregation +Control, Interference Management, Load Balancing, and Handover +Control—are often implemented by individual base stations with only +local visibility, but they have global consequences. The SDN approach +is to collect the available input data centrally, make a globally +optimal decision, and then push the respective control parameters back +to the base stations for execution. Evidence using an analogous +approach to optimize wide\sphinxhyphen{}area networks over many years (see, for +example, B4) is compelling. + +\phantomsection\label{\detokenize{ran:reading-b4}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +For an example of how SDN principles have been successfully applied +to a production network, we recommend \sphinxhref{https://cseweb.ucsd.edu/~vahdat/papers/b4-sigcomm13.pdf}{B4: Experience with a +Globally\sphinxhyphen{}Deployed Software Defined WAN}. ACM +SIGCOMM, August 2013. +\end{sphinxadmonition} + +\sphinxAtStartPar +One way to characterize xApps is based on the current practice of +controlling the mobile link at two different levels. At a fine\sphinxhyphen{}grained +level, per\sphinxhyphen{}node and per\sphinxhyphen{}link control are conducted using the RRM +functions that are distributed across the individual base stations.% +\begin{footnote}[1]\sphinxAtStartFootnote +Pedantically, Radio Resource Management (RRM) is another name +for the collection of control functionality typically +implemented in the RRC stage of the RAN pipeline. +% +\end{footnote} RRM functions include scheduling, handover control, link and +carrier aggregation control, bearer control, and access control. At a +coarse\sphinxhyphen{}grained level, regional mobile network optimization and +configuration is conducted using \sphinxstyleemphasis{Self\sphinxhyphen{}Organizing Network (SON)} +functions. These functions oversee neighbor lists, manage load +balancing, optimize coverage and capacity, aim for network\sphinxhyphen{}wide +interference mitigation, manage centrally configured parameters, and +so on. As a consequence of these two levels of control, it is not +uncommon to see reference to \sphinxstyleemphasis{RRM Applications} and \sphinxstyleemphasis{SON +Applications}, respectively, in O\sphinxhyphen{}RAN documents for SD\sphinxhyphen{}RAN. For +example, the Interference Management and Load Balancing xApps in +\hyperref[\detokenize{ran:fig-ran-controller}]{Figure \ref{\detokenize{ran:fig-ran-controller}}} are SON Applications, while +the other two xApps are RRM Applications. + +\sphinxAtStartPar +Keep in mind, however, that this characterization of xApps is based on +past (pre\sphinxhyphen{}SDN) implementations of the RAN. This is helpful as the +industry transitions to SD\sphinxhyphen{}RAN, but the situation is likely to change. +SDN is transforming the RAN, so new ways of controlling the +RAN—resulting in applications that do not fit neatly into the RRM vs SON +dichotomy—can be expected to emerge over time. + + +\section{4.4 Near Real\sphinxhyphen{}Time RIC} +\label{\detokenize{ran:near-real-time-ric}} +\sphinxAtStartPar +Drilling down to the next level of detail, \hyperref[\detokenize{ran:fig-ric}]{Figure \ref{\detokenize{ran:fig-ric}}} shows an exemplar implementation of a RIC based on a +retargeting of the Open Network OS (ONOS) for the SD\sphinxhyphen{}RAN use +case. ONOS (described in our SDN book) was originally designed to +support traditional wireline network switches using standard +interfaces (OpenFlow, P4Runtime, etc.). For the SD\sphinxhyphen{}RAN use case, the +ONOS\sphinxhyphen{}based RIC instead supports a set of RAN\sphinxhyphen{}specific north\sphinxhyphen{} and +south\sphinxhyphen{}facing interfaces, but internally takes advantage of the same +collection of subsystems (microservices) as in the wireline case.% +\begin{footnote}[2]\sphinxAtStartFootnote +Technically, the O\sphinxhyphen{}RAN definition of the RIC refers to the +combination of xApps and the underlying platform (in our case +ONOS), but we emphasize the distinction between the two, in keeping +with the SDN model of distinguishing between the Network OS +and the suite of Control Apps that run on it. +% +\end{footnote} + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=400\sphinxpxdimen]{{Slide62}.png} +\caption{O\sphinxhyphen{}RAN compliant RAN Intelligent Controller (RIC) built by adapting +and extending ONOS.}\label{\detokenize{ran:id11}}\label{\detokenize{ran:fig-ric}}\end{figure} + +\sphinxAtStartPar +Specifically, the ONOS\sphinxhyphen{}based RIC includes a Topology Service to keep +track of the fixed RAN infrastructure, a Device Service to track the +UEs, and a Configuration Service to manage RAN\sphinxhyphen{}wide configuration +state. All three of these services are implemented as Kubernetes\sphinxhyphen{}based +microservices, and take advantage of a scalable key\sphinxhyphen{}value store. + +\sphinxAtStartPar +Of the three interfaces called out in \hyperref[\detokenize{ran:fig-ric}]{Figure \ref{\detokenize{ran:fig-ric}}}, +the \sphinxstylestrong{A1} and \sphinxstylestrong{E2} interfaces are based on pre\sphinxhyphen{}existing 3GPP +standards. The third, \sphinxstylestrong{xApp SDK}, is specific to the ONOS\sphinxhyphen{}based +implementation. The O\sphinxhyphen{}RAN Alliance is using it to drive towards a +unified API (and corresponding SDK) for building RIC\sphinxhyphen{}agnostic xApps. + +\sphinxAtStartPar +The A1 interface provides a means for the mobile operator’s management +plane—typically called the \sphinxstyleemphasis{OSS/BSS (Operations Support System / +Business Support System)} in the Telco world—to configure the RAN. We +briefly introduced the OSS/BSS in Section 2.5, but all you need to +know about it for our purposes is that such a component sits at the +top of all Telco software stacks. It is the source of all +configuration settings and business logic needed to operate a +network. You can think of A1 as the RAN’s counterpart to gNMI/gNOI +(gRPC Network Management Interface/gRPC Network Operations Interface), +a pair of configuration APIs commonly used to configure commodity +cloud hardware. + +\sphinxAtStartPar +The Near\sphinxhyphen{}RT RIC uses the E2 interface to control the underlying RAN +elements, including the CU, DUs, and RUs. A requirement of the E2 +interface is that it be able to connect the Near\sphinxhyphen{}RT RIC to different +types of RAN elements from different vendors. This range is reflected +in the API, which revolves around a \sphinxstyleemphasis{Service Model} abstraction. The +idea is that each RAN element advertises a Service Model, which +effectively defines the set of RAN Functions the element is able to +support. The RIC then issues a combination of the following four +operations against this Service Model. +\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxstylestrong{Report:} RIC asks the element to report a function\sphinxhyphen{}specific value setting. + +\item {} +\sphinxAtStartPar +\sphinxstylestrong{Insert:} RIC instructs the element to activate a user plane function. + +\item {} +\sphinxAtStartPar +\sphinxstylestrong{Control:} RIC instructs the element to activate a control plane function. + +\item {} +\sphinxAtStartPar +\sphinxstylestrong{Policy:} RIC sets a policy parameter on one of the activated functions. + +\end{itemize} + +\sphinxAtStartPar +Of course, it is the RAN element, through its published Service Model, +that defines the relevant set of functions that can be activated, the +variables that can be reported, and policies that can be set. The +O\sphinxhyphen{}RAN community is working on three vendor\sphinxhyphen{}agnostic Service +Models. The first, called \sphinxstyleemphasis{Key Performance Measurement} (abbreviated +\sphinxstyleemphasis{E2SM\sphinxhyphen{}KPM}), specifies the metrics that can be retrieved from RAN +elements. The second, called \sphinxstyleemphasis{RAN Control} (abbreviated \sphinxstyleemphasis{E2SM\sphinxhyphen{}RC}), +specifies parameters that can be set to control RAN elements. The +third, called \sphinxstyleemphasis{Cell Configuration and Control} (abbreviated +\sphinxstyleemphasis{E2SM\sphinxhyphen{}CCC}), exposes configuration parameters at the cell level. + +\sphinxAtStartPar +In simple terms, E2SM\sphinxhyphen{}KPM defines what values can be \sphinxstyleemphasis{read} and +E2SM\sphinxhyphen{}RC and E2SM\sphinxhyphen{}CCC defines what values can be \sphinxstyleemphasis{written}. Because +the available values can be highly variable across all possible +devices, we can expect different vendors will support only a subset +of the entire collection. This will limit the “universality” the +O\sphinxhyphen{}RAN was hoping to achieve in an effort to break vendor lock\sphinxhyphen{}in, +but that outcome is familiar to network operators who have been +dealing with divergent \sphinxstyleemphasis{Management Information Bases (MIBs)} since +the earliest days of the Internet. + +\sphinxAtStartPar +Finally, the xApp SDK, which is specific to the ONOS\sphinxhyphen{}based +implementation, is currently little more than a “pass through” of the +E2 interface. This implies the xApps are expected to be aware of the +available Service Models. One of the challenges the SDK has to deal +with is how data passed to/from the RAN elements is encoded. For +historical reasons, the E2 interface uses ASN.1 formatting, whereas +the ONOS\sphinxhyphen{}RIC internally uses gRPC and Protocol Buffers to communicate +between the set of microservices. The south\sphinxhyphen{}bound E2 interface in +\hyperref[\detokenize{ran:fig-ric}]{Figure \ref{\detokenize{ran:fig-ric}}} translates between the two formats. The +SDK currently makes the gRPC\sphinxhyphen{}based API available to xApps. + +\phantomsection\label{\detokenize{ran:reading-onos}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +To learn more about the details of ONOS and its interfaces, we +recommend the chapter in our SDN book that covers it in +depth. \sphinxhref{https://sdn.systemsapproach.org/onos.html}{Software\sphinxhyphen{}Defined Networks: A Systems Approach. Chapter 6: +Network OS}. +\end{sphinxadmonition} + + +\section{4.5 Control Loops} +\label{\detokenize{ran:control-loops}} +\sphinxAtStartPar +We conclude this description of RAN internals by revisiting the +sequence of steps involved in disaggregation, which, as the previous +three sections reveal, is being pursued in multiple tiers. In doing +so, we tie up several loose ends, and focus attention on the resulting +three control loops. + +\sphinxAtStartPar +In the first tier of disaggregation, 3GPP defines multiple options for +how the RAN can be split and distributed, with the pipeline shown in +\hyperref[\detokenize{ran:fig-pipeline}]{Figure \ref{\detokenize{ran:fig-pipeline}}} disaggregated into the +independently operating CU, DU, and RU components shown in +\hyperref[\detokenize{ran:fig-disagg1}]{Figure \ref{\detokenize{ran:fig-disagg1}}}. The O\sphinxhyphen{}RAN Alliance has selected +specific disaggregation options from 3GPP and is developing open +interfaces between these components. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=450\sphinxpxdimen]{{Slide72}.png} +\caption{First tier of RAN disaggregation: Split RAN.}\label{\detokenize{ran:id12}}\label{\detokenize{ran:fig-disagg1}}\end{figure} + +\sphinxAtStartPar +The second tier of disaggregation focuses on the control/user plane +separation (CUPS) of the CU, resulting in the CU\sphinxhyphen{}UP and CU\sphinxhyphen{}CP shown in +\hyperref[\detokenize{ran:fig-disagg2}]{Figure \ref{\detokenize{ran:fig-disagg2}}}. The control plane in question is +the 3GPP control plane, where the CU\sphinxhyphen{}UP realizes a pipeline for user +traffic and the CU\sphinxhyphen{}CP focuses on control message signaling between +Mobile Core and the disaggregated RAN components (as well as to the +UE). + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=450\sphinxpxdimen]{{Slide82}.png} +\caption{Second tier of RAN disaggregation: CUPS.}\label{\detokenize{ran:id13}}\label{\detokenize{ran:fig-disagg2}}\end{figure} + +\sphinxAtStartPar +The third tier follows the SDN paradigm by separating most of RAN +control (RRC functions) from the disaggregated RAN components, and +logically centralizing them as applications running on an SDN +Controller, which corresponds to the Near\sphinxhyphen{}RT RIC shown previously in +\hyperref[\detokenize{ran:fig-rrc-split}]{Figures \ref{\detokenize{ran:fig-rrc-split}}} and \hyperref[\detokenize{ran:fig-ran-controller}]{\ref{\detokenize{ran:fig-ran-controller}}}. This SDN\sphinxhyphen{}based disaggregation is repeated in +\hyperref[\detokenize{ran:fig-ctl-loops}]{Figure \ref{\detokenize{ran:fig-ctl-loops}}}, which also shows the +O\sphinxhyphen{}RAN\sphinxhyphen{}prescribed interfaces A1 and E2 introduced in the previous +section. (Note that all the edges in \hyperref[\detokenize{ran:fig-disagg1}]{Figures \ref{\detokenize{ran:fig-disagg1}}} and \hyperref[\detokenize{ran:fig-disagg2}]{\ref{\detokenize{ran:fig-disagg2}}} correspond to +3GPP\sphinxhyphen{}defined interfaces, as identified in Section 4.2, but their +details are outside the scope of this discussion.) + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=800\sphinxpxdimen]{{Slide92}.png} +\caption{Third tier of RAN disaggregation: SDN.}\label{\detokenize{ran:id14}}\label{\detokenize{ran:fig-ctl-loops}}\end{figure} + +\sphinxAtStartPar +Taken together, the A1 and E2 interfaces complete two of the three +major control loops of the RAN: the outer (non\sphinxhyphen{}real\sphinxhyphen{}time) loop has the +Non\sphinxhyphen{}RT RIC as its control point and the middle (near\sphinxhyphen{}real\sphinxhyphen{}time) loop +has the Near\sphinxhyphen{}RT RIC as its control point. The third (innermost) +control loop—shown in \hyperref[\detokenize{ran:fig-ctl-loops}]{Figure \ref{\detokenize{ran:fig-ctl-loops}}} running +inside the DU—includes the real\sphinxhyphen{}time Scheduler embedded in the MAC +stage of the RAN pipeline. The two outer control loops have rough time +bounds of \textgreater{}\textgreater{}1sec and \textgreater{}10ms, respectively. As we saw in Chapter 2, +the real\sphinxhyphen{}time control loop is assumed to be \textless{}1ms. + +\sphinxAtStartPar +This raises the question of how specific functionality is distributed +between the Non\sphinxhyphen{}RT RIC, Near\sphinxhyphen{}RT RIC, and DU. Starting with the second +pair (i.e., the two inner loops), it is the case that not all RRC +functions can be centralized; some need to be implemented in the +DU. The SDN\sphinxhyphen{}based disaggregation then focuses on those that can be +centralized, with the Near\sphinxhyphen{}RT RIC supporting the RRC applications and +the SON applications mentioned in Section 4.3. + +\sphinxAtStartPar +Turning to the outer two control loops, the Near RT\sphinxhyphen{}RIC opens the +possibility of introducing policy\sphinxhyphen{}based RAN control, whereby +interrupts (exceptions) to operator\sphinxhyphen{}defined policies would signal the +need for the outer loop to become involved. For example, one can +imagine developing learning\sphinxhyphen{}based controls, where the inference +engines for these controls would run as applications on the Near +RT\sphinxhyphen{}RIC, and their non\sphinxhyphen{}real\sphinxhyphen{}time learning counterparts would run +elsewhere. The Non\sphinxhyphen{}RT RIC would then interact with the Near\sphinxhyphen{}RT RIC to +deliver relevant operator policies from the Management Plane to the +Near RT\sphinxhyphen{}RIC over the A1 interface. + + +\chapter{Chapter 5: Mobile Core} +\label{\detokenize{core:chapter-5-mobile-core}}\label{\detokenize{core::doc}} +\sphinxAtStartPar +The Mobile Core provides IP connectivity to the RAN. It authenticates +UEs as they connect, tracks them as they move from one base station to +another, ensures that this connectivity fulfills the promised QoS +requirements, and meters usage for billing. + +\sphinxAtStartPar +Historically, all of these functions were provided by one or more +proprietary network appliances. But like the rest of the 5G mobile +network, these appliances are being disaggregated and implemented as a +set of cloud services, with the goal of improving feature velocity for +new classes of applications. It is also the case that as the range of +use cases grows more diverse, a one\sphinxhyphen{}size\sphinxhyphen{}fits\sphinxhyphen{}all approach will become +problematic. The expectation is that it should be possible to +customize and specialize the Mobile Core on a per\sphinxhyphen{}application basis. + +\sphinxAtStartPar +This chapter introduces the functional elements of the Mobile Core, +and describes different strategies for implementing that +functionality. + + +\section{5.1 Identity Management} +\label{\detokenize{core:identity-management}} +\sphinxAtStartPar +There are two equally valid views of the Mobile Core. The +Internet\sphinxhyphen{}centric view is that each local instantiation of the Mobile +Core (e.g., serving a metro area) acts as a router that connects a +physical RAN (one of many possible access network technologies, not +unlike WiFi) to the global Internet. In this view, IP addresses serve +as the unique global identifier that makes it possible for any +RAN\sphinxhyphen{}connected device to communicate with any Internet\sphinxhyphen{}addressable +device or service. The 3GPP\sphinxhyphen{}centric view is that a distributed set of +Mobile Cores (interconnected by one or more backbone technologies, of +which the Internet is just one example) cooperate to turn a set of +physical RANs into one logically global RAN. In this perspective, the +IMSI burned into a device’s SIM card serves as the global identifier that +makes it possible for any two mobile devices to communicate with each +other. + +\sphinxAtStartPar +Both of these perspectives are correct, but since broadband +communication using Internet protocols to access cloud services is +the dominant use case, this section takes an Internet\sphinxhyphen{}centric +perspective of the Mobile Core. But before getting to that, we first +need to understand several things about the 3GPP\sphinxhyphen{}centric perspective. + +\sphinxAtStartPar +For starters, we need to be aware of the distinction between +“identity” and “identifier”. The first term is commonly used when +talking about principals or users, and the second term is used when +talking about abstract objects or physical devices. Unfortunately, the +two terms are conflated in the 3GPP architecture: The acronym IMSI +explicitly includes the word “Identity”, where the “S” in both IMSI +and SIM stands for subscriber (a kind of principal), yet the IMSI is +also used as a global identifier for a UE connected to the mobile +network. This conflation breaks down when there could be tens or +hundreds of IoT devices for every customer, with no obvious association +among them. Accounting for this problem is an “architecture alignment” +fix we discuss in the next chapter when we describe how to provide +Private 5G Connectivity as a managed cloud service. + +\sphinxAtStartPar +If we take the view that an IMSI is primarily a global identifier for +UEs, then we can think of it as the mobile network’s equivalent of a +48\sphinxhyphen{}bit 802.3 or 802.11 MAC address. This includes how addresses are +assigned to ensure uniqueness: (MCC, MNC) pairs are assigned by a +global authority to every MNO, each of which then decides how to +uniquely assign the rest of the IMSI identifier space to devices. This +approach is similar to how network vendors are assigned a unique +prefix for all the MAC addresses they configure into the NIC cards and +WiFi chips they ship, but with one big difference: It is the MNO, +rather than the vendor, that is responsible for assigning IMSIs to SIM +cards. This makes the IMSI allocation problem closer to how the +Internet assigns IP addresses to end hosts, but unlike DHCP, the +IMSI\sphinxhyphen{}to\sphinxhyphen{}device binding is static. + +\sphinxAtStartPar +This is important because, unlike 802.11 addresses, IMSIs are also +intended to support global routing. (Here, we are using a liberal +notion of routing—to locate an object—and focusing on the original +3GPP\sphinxhyphen{}perspective of the global RAN in which the Internet is just a +possible packet network that interconnects Mobile Cores.) A +hierarchically distributed database maps IMSIs onto the collection of +information needed to forward data to the corresponding device. This +includes a combination of relatively \sphinxstyleemphasis{static} information about the +level of service the device expects to receive (including the +corresponding phone number and subscriber profile/account +information), and more \sphinxstyleemphasis{dynamic} information about the current +location of the device (including which Mobile Core, and which base +station served by that Core, currently connects the device to the +global RAN). + +\sphinxAtStartPar +This mapping service has a name, or rather, several names that keep +changing from generation to generation. In 2G and 3G it was called HLR +(Home Location Registry). In 4G the HLR maintains only static +information and a separate HSS (Home Subscriber Server) maintains the +more dynamic information. In 5G the HLR is renamed the UDR (Unified +Data Registry) and the HSS is renamed UDM (Unified Data +Management). We will see the UDM in Section 5.2 because of the role it +plays \sphinxstyleemphasis{within} a single instance of the Mobile Core. + +\sphinxAtStartPar +There are, of course, many more details to the process—including how +to find a device that has roamed to another MNO’s network—but +conceptually the process is straightforward. (As a thought experiment, +imagine how you would build a “logically global WiFi” using just +802.11 addresses, rather than depending on the additional layer of +addressing provided by IP.) The important takeaway is that IMSIs are +used to locate the Mobile Core instance that is then responsible for +authenticating the device, tracking the device as it moves from base +station to base station within that Core’s geographic region, and +forwarding packets to/from the device. + +\sphinxAtStartPar +Two additional observations about the relationship between IMSIs and IP +addresses are worth highlighting. First, the odds of someone trying to +“call” or “text” an IoT device, drone, camera, or robot are virtually +zero. It is the IP address assigned to each device (by the local +Mobile Core) that is used to locate (route packets to) the device. In +this context, the IMSI plays exactly the same role in a physical RAN +as an 802.11 address plays in a LAN, and the Mobile Core behaves just +like any access router. + +\sphinxAtStartPar +Second, whether a device connects to a RAN or some other access +network, it is automatically assigned a new IP address any time it +moves from one coverage domain to another. Even for voice calls in the +RAN case, ongoing calls are dropped whenever a device moves between +instantiations of the Mobile Core (i.e., uninterrupted mobility is +supported only within the region served by a given Core). This is +typically not a problem when the RAN is being used to deliver +broadband connectivity because Internet devices are almost always +clients \sphinxstyleemphasis{requesting} a cloud service; they just start issuing requests +with their new (dynamically assigned) IP address. + + +\section{5.2 Functional Components} +\label{\detokenize{core:functional-components}} +\sphinxAtStartPar +The 5G Mobile Core, which 3GPP calls the \sphinxstyleemphasis{5GC}, adopts a +microservice\sphinxhyphen{}like architecture officially known as the 3GPP \sphinxstyleemphasis{Service +Based Architecture}. We say “microservice\sphinxhyphen{}like” because while the +3GPP specification spells out this level of disaggregation, it is +really just describing a set of functional blocks and not prescribing +an implementation. In practice, a set of functional blocks is very +different from the collection of engineering decisions that go into +designing a microservice\sphinxhyphen{}based system. That said, viewing the +collection of components shown in \hyperref[\detokenize{core:fig-5g-core}]{Figure \ref{\detokenize{core:fig-5g-core}}} as +a set of microservices is a reasonable working model (for now). + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=700\sphinxpxdimen]{{Slide211}.png} +\caption{5G Mobile Core (5GC), represented as a collection of +microservices, where 3GPP defines the interfaces connecting the +Mobile Core CP and UP to the RAN (denoted N2 and N3, respectively).}\label{\detokenize{core:id3}}\label{\detokenize{core:fig-5g-core}}\end{figure} + +\sphinxAtStartPar +Starting with the User Plane (UP), the \sphinxstyleemphasis{UPF (User Plane Function)} +forwards traffic between the RAN and the Internet. In addition to IP +packet forwarding, the UPF is responsible for policy enforcement, +lawful intercept, traffic usage measurement, and QoS policing. These +are all common functions in access routers, even if they go beyond +what you usually find in enterprise or backbone routers. The other +detail of note is that, because the RAN is an overlay network, the UPF +is responsible for tunneling (i.e., encapsulating and decapsulating) +packets as they are transmitted to and from base stations over the N3 +interface (as depicted in \hyperref[\detokenize{arch:fig-tunnels}]{Figure +\ref{\detokenize{arch:fig-tunnels}}} of Section 2.3). + +\sphinxAtStartPar +The rest of the functional elements in \hyperref[\detokenize{core:fig-5g-core}]{Figure \ref{\detokenize{core:fig-5g-core}}} implement the Control Plane (CP). Of these, two +represent the majority of the functionality that’s unique to the +Mobile Core CP (as sketched in \hyperref[\detokenize{arch:fig-secure}]{Figure \ref{\detokenize{arch:fig-secure}}} of +Section 2.4): +\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxstyleemphasis{AMF (Access and Mobility Management Function):} Responsible for +connection and reachability management, mobility management, access +authorization, and location services. + +\item {} +\sphinxAtStartPar +\sphinxstyleemphasis{SMF (Session Management Function):} Manages each UE session, +including IP address allocation, selection of associated UP +function, control aspects of QoS, and control aspects of UP +routing. + +\end{itemize} + +\sphinxAtStartPar +In other words, the AMF authorizes access when a UE first connects to +one of the local base stations, and then tracks (but does not control) +which base station currently serves each UE. The SMF then allocates an +IP address to each AMF\sphinxhyphen{}authorized UE, and directly interacts with the +UPF to maintain per\sphinxhyphen{}device session state. + +\sphinxAtStartPar +Of particular note, the per\sphinxhyphen{}UE session state controlled by the SMF +(and implemented by the UPF) includes a packet buffer in which packets +destine to an idle UE are queued during the time the UE transitions to +active state. This feature was originally designed to avoid data loss +during a voice call, but its value is less obvious when the data is an +IP packet since end\sphinxhyphen{}to\sphinxhyphen{}end protocols like TCP are prepared to retransmit +lost packets. On the other hand, if idle\sphinxhyphen{}to\sphinxhyphen{}active transitions are too +frequent, they can be problematic for TCP. + +\sphinxAtStartPar +Before continuing with our inventory of control\sphinxhyphen{}related elements in +\hyperref[\detokenize{core:fig-5g-core}]{Figure \ref{\detokenize{core:fig-5g-core}}}, it is important to note we show +only a fraction of the full set that 3GPP defines. The full set +includes a wide range of possible features, many of which are either +speculative (i.e., identify potential functionality) or overly +prescriptive (i.e., identify well\sphinxhyphen{}known cloud native microservices). +We limit our discussion to functional elements that provide value in +the private 5G deployments that we focus on. Of these, several provide +functionality similar to what one might find in any microservice\sphinxhyphen{}based +application: +\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxstyleemphasis{AUSF (Authentication Server Function):} Authenticates UEs. + +\item {} +\sphinxAtStartPar +\sphinxstyleemphasis{UDM (Unified Data Management):} Manages user identity, including +the generation of authentication credentials and access authorization. + +\item {} +\sphinxAtStartPar +\sphinxstyleemphasis{UDR (Unified Data Repository):} Manages user static +subscriber\sphinxhyphen{}related information. + +\item {} +\sphinxAtStartPar +\sphinxstyleemphasis{UDSF (Unstructured Data Storage Function):} Used to store +unstructured data, and so is similar to a \sphinxstyleemphasis{key\sphinxhyphen{}value store}. + +\item {} +\sphinxAtStartPar +\sphinxstyleemphasis{NEF (Network Exposure Function):} Exposes select capabilities to +third\sphinxhyphen{}party services, and so is similar to an \sphinxstyleemphasis{API Server}. + +\item {} +\sphinxAtStartPar +\sphinxstyleemphasis{NRF (Network Repository Function):} Used to discover available services +(network functions), and so is similar to a \sphinxstyleemphasis{Discovery Service}. + +\end{itemize} + +\sphinxAtStartPar +The above list includes 3GPP\sphinxhyphen{}specified control functions that are, in +some cases, similar to well\sphinxhyphen{}known microservices. In +such cases, substituting an existing cloud native component is a +viable implementation option. For example, MongoDB can be used to +implement a UDSF. In other cases, however, such a one\sphinxhyphen{}for\sphinxhyphen{}one swap is +not possible due to assumptions 3GPP makes. For example, AUSF, UDM, +UDR, and AMF collectively implement a \sphinxstyleemphasis{Authentication and +Authorization Service}, but an option like OAuth2 could not be used in +their place because (a) UDM and UDR are assumed to be part of the +global identity mapping service discussed in Section 5.1, and (b) 3GPP +specifies the interface by which the various components request +service from each other (e.g., AMF connects to the RAN via the N2 interface +depicted in \hyperref[\detokenize{core:fig-5g-core}]{Figure \ref{\detokenize{core:fig-5g-core}}}). We will see how to cope +with such issues in Section 5.3, where we talk about implementation issues +in more detail. + +\sphinxAtStartPar +Finally, \hyperref[\detokenize{core:fig-5g-core}]{Figure \ref{\detokenize{core:fig-5g-core}}} shows two other functional +elements that export a northbound interface to the management plane +(not shown): +\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxstyleemphasis{PCF (Policy Control Function):} Manages the policy rules for the +rest of the Mobile Core CP. + +\item {} +\sphinxAtStartPar +\sphinxstyleemphasis{NSSF (Network Slice Selection Function):} Manages how network +slices are selected to serve a given UE. + +\end{itemize} + +\sphinxAtStartPar +Keep in mind that even though 3GPP does not directly prescribe a +microservice implementation, the overall design clearly points to a +cloud native solution as the desired end\sphinxhyphen{}state for the Mobile Core. +Of particular note, introducing a distinct storage service means that +all the other services can be stateless, and hence, more readily +scalable. + + +\section{5.3 Control Plane} +\label{\detokenize{core:control-plane}} +\sphinxAtStartPar +This section describes two different strategies for implementing the +Mobile Core CP. Both correspond to open source projects that are +available for download and experimentation. + + +\subsection{5.3.1 SD\sphinxhyphen{}Core} +\label{\detokenize{core:sd-core}} +\sphinxAtStartPar +Our first example, called SD\sphinxhyphen{}Core, is a nearly one\sphinxhyphen{}for\sphinxhyphen{}one translation +of the functional blocks shown in \hyperref[\detokenize{core:fig-5g-core}]{Figure \ref{\detokenize{core:fig-5g-core}}} +into a cloud native implementation. A high\sphinxhyphen{}level schematic is shown in +\hyperref[\detokenize{core:fig-sd-core}]{Figure \ref{\detokenize{core:fig-sd-core}}}, where each element corresponds to a +scalable set of Kubernetes\sphinxhyphen{}hosted containers. We include this +schematic even though it looks quite similar to \hyperref[\detokenize{core:fig-5g-core}]{Figure \ref{\detokenize{core:fig-5g-core}}} because it highlights four implementation details. + +\phantomsection\label{\detokenize{core:reading-sd-core}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +\sphinxhref{https://opennetworking.org/sd-core/}{SD\sphinxhyphen{}Core}. +\end{sphinxadmonition} + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=600\sphinxpxdimen]{{Slide22}.png} +\caption{SD\sphinxhyphen{}Core implementation of the Mobile Core Control Plane, including +support for Standalone (SA) deployment of both 4G and 5G.}\label{\detokenize{core:id4}}\label{\detokenize{core:fig-sd-core}}\end{figure} + +\sphinxAtStartPar +First, SD\sphinxhyphen{}Core supports both the 5G and 4G versions of the Mobile +Core,% +\begin{footnote}[1]\sphinxAtStartFootnote +SD\sphinxhyphen{}Core’s 4G Core is a fork of the OMEC project and its 5G Core +is a fork of the Free5GC project. +% +\end{footnote} which share a common User Plane (UPF). We have not +discussed details of the 4G Core, but observe that it +is less disaggregated. In particular, the components in the 5G +Core are specified so that they can be stateless, simplifying the task +of horizontally scaling them out as load dictates. (The rough +correspondence between 4G and 5G is: MME\sphinxhyphen{}to\sphinxhyphen{}AMF, SPGW\_C\sphinxhyphen{}to\sphinxhyphen{}SMF, +HSS\sphinxhyphen{}to\sphinxhyphen{}UDM, and PCRF\sphinxhyphen{}to\sphinxhyphen{}PCF.) Although not shown in the schematic, +there is also a scalable key\sphinxhyphen{}value store microservice based on +MongoDB. It is used to make Core\sphinxhyphen{}related state persistent for the +Control Planes; for example, UDM/UDR (5G) and HSS (4G) write +subscriber state to MongoDB. + +\sphinxAtStartPar +Second, \hyperref[\detokenize{core:fig-sd-core}]{Figure \ref{\detokenize{core:fig-sd-core}}} illustrates 3GPP’s +\sphinxstyleemphasis{Standalone (SA)} deployment option, in which 4G and 5G networks +co\sphinxhyphen{}exist and run independently. They share a UPF implementation, but +UPF instances are instantiated separately for each RAN/Core pair, with +support for both the 4G and 5G interfaces, denoted \sphinxstyleemphasis{S1\sphinxhyphen{}U} and \sphinxstyleemphasis{N3}, +respectively. Although not obvious from the SA example, 3GPP defines +an alternative transition plan, called \sphinxstyleemphasis{NSA (Non\sphinxhyphen{}Standalone)}, in +which separate 4G and 5G RANs were paired with either a 4G Core or a +5G Core. The details of how that works are not relevant to this +discussion, except to make the point that production networks almost +never get to enjoy a “flag day” on which a new version is universally +substituted for an old version. A migration plan has to be part of the +design. More information on this topic can be found in a GSMA Report. + +\phantomsection\label{\detokenize{core:reading-migration}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +\sphinxhref{https://www.gsma.com/futurenetworks/wp-content/uploads/2018/04/Road-to-5G-Introduction-and-Migration\_FINAL.pdf}{Road to 5G: Introduction and Migration}. +GSMA Report, April 2018. +\end{sphinxadmonition} + +\sphinxAtStartPar +Third, \hyperref[\detokenize{core:fig-sd-core}]{Figure \ref{\detokenize{core:fig-sd-core}}} shows many of the +3GPP\sphinxhyphen{}defined inter\sphinxhyphen{}component interfaces. These include an over\sphinxhyphen{}the\sphinxhyphen{}air +interface between base stations and UEs (\sphinxstyleemphasis{NR Uu}), control interfaces +between the Core and both UEs and base stations (\sphinxstyleemphasis{N1} and \sphinxstyleemphasis{N2}, +respectively), a user plane interface between the Core and base +stations (\sphinxstyleemphasis{N3}), and a data plane interface between the Core and the +backbone network (\sphinxstyleemphasis{N6}). + +\sphinxAtStartPar +The schematic also shows interfaces between the individual +microservices that make up the Core’s Control Plane; for example, +\sphinxstyleemphasis{Nudm} is the interface to the UDM microservice. These latter +interfaces are RESTful, meaning clients access each microservice by +issuing GET, PUT, POST, PATCH, and DELETE operations over HTTP, where +a service\sphinxhyphen{}specific schema defines the available resources that can be +accessed. Note that some of these interfaces are necessary for +interoperability (e.g., \sphinxstyleemphasis{N1} and \sphinxstyleemphasis{N Uu} make it possible to connect +your phone to any MNO’s network), but others could be seen as internal +implementation details. We’ll see how Magma takes advantage of this +distinction in the next section. + +\sphinxAtStartPar +Fourth, by adopting a cloud native design, SD\sphinxhyphen{}Core benefits from being +able to horizontally scale individual microservices. But realizing +this benefit isn’t always straightforward. In particular, because the +AMF is connected to the RAN by SCTP (corresponding to the \sphinxstyleemphasis{N1} and +\sphinxstyleemphasis{N2} interfaces shown in \hyperref[\detokenize{core:fig-sd-core}]{Figure \ref{\detokenize{core:fig-sd-core}}}), it is +necessary to put an \sphinxstyleemphasis{SCTP load balancer} in front of the AMF. This +load balancer terminates the SCTP connections, and distributes +requests across a set of AMF containers. These AMF instances then +depend on a scalable backend store (specifically MongoDB) to read and +write shared state. + + +\subsection{5.3.2 Magma} +\label{\detokenize{core:magma}} +\sphinxAtStartPar +Magma is an open source Mobile Core implementation that takes a +different and slightly non\sphinxhyphen{}standard approach. Magma is similar to +SD\sphinxhyphen{}Core in that it is implemented as a set of microservices, but it +differs in that it is designed to be particularly suitable for remote +and rural environments with poor backhaul connectivity. This +emphasis, in turn, leads Magma to (1) adopt an SDN\sphinxhyphen{}inspired approach +to how it separates functionality into centralized and distributed +components, and (2) factor the distributed functionality into +microservices without strict adherence to all the standard 3GPP interface +specifications. This refactoring is also a consequence of Magma being +designed to unify 4G, 5G, and WiFi under a single architecture. + +\sphinxAtStartPar +One of the first things to note about Magma is that it takes a +different view of “backhaul” from the approaches we have seen to +date. Whereas the backhaul networks shown previously connect the +eNBs/gNBs and radio towers back to the mobile core (\hyperref[\detokenize{arch:fig-cellular}]{Figure \ref{\detokenize{arch:fig-cellular}}}), Magma actually puts much of the mobile core +functionality right next to the radio as seen in \hyperref[\detokenize{core:fig-magma-peru}]{Figure \ref{\detokenize{core:fig-magma-peru}}}. It is able to do this because of the way it splits +the core into centralized and distributed parts. So Magma views +“backhaul” as the link that connects a remote deployment to the rest +of the Internet (including the central components), contrasting with +conventional 3GPP usage. As explored further below, this can overcome +many of the challenges that unreliable backhaul links introduce in +conventional approaches. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=600\sphinxpxdimen]{{Slide112}.png} +\caption{Overall architecture of the Magma Mobile Core, including +support for 4G and 5G, and Wi\sphinxhyphen{}Fi. There is one central +Orchestrator and typically many Access Gateways (AGWs).}\label{\detokenize{core:id5}}\label{\detokenize{core:fig-magma-arch}}\end{figure} + +\sphinxAtStartPar +\hyperref[\detokenize{core:fig-magma-arch}]{Figure \ref{\detokenize{core:fig-magma-arch}}} shows the overall Magma +architecture. The central part of Magma is the single box in the +figure marked \sphinxstyleemphasis{Central Control \& Management (Orchestrator)}. This is +roughly analogous to the central controller found in typical SDN +systems, and provides a northbound API by which an operator or other +software systems (such as a traditional OSS/BSS) can interact with the +Magma core. The orchestrator communicates over backhaul links with +Access Gateways (AGWs), which are the distributed components of +Magma. A single AGW typically handles a small number of eNBs/gNBs. As +an example, see \hyperref[\detokenize{core:fig-magma-peru}]{Figure \ref{\detokenize{core:fig-magma-peru}}} which includes a +single eNB and AGW located on a radio tower. In this example, a +point\sphinxhyphen{}to\sphinxhyphen{}point wireless link is used for backhaul. + +\sphinxAtStartPar +The AGW is designed to have a small footprint, so that small +deployments do not require a datacenter’s worth of equipment. Each AGW +also contains both data plane and control plane elements. This is a +little different from the classic approach to SDN systems in which +only the data plane is distributed. Magma can be described as a +hierarchical SDN approach, as the control plane itself is divided into +a centralized part (running in the Orchestrator) and a distributed +part (running in the AGW). \hyperref[\detokenize{core:fig-magma-arch}]{Figure \ref{\detokenize{core:fig-magma-arch}}} shows +the distributed control plane components and data plane in detail. We +postpone a general discussion of orchestration until Chapter 6. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=300\sphinxpxdimen]{{peru_deploy_labelled}.jpg} +\caption{A sample Magma deployment in rural Peru, showing (a) +point\sphinxhyphen{}to\sphinxhyphen{}point wireless backhaul, (b) LTE radio and antenna, (c) +ruggedized embedded PC serving as AGW, and (d) solar power and +battery backup for site.}\label{\detokenize{core:id6}}\label{\detokenize{core:fig-magma-peru}}\end{figure} + +\sphinxAtStartPar +Magma differs from the standard 3GPP approach in that it terminates +3GPP protocols logically close to the edge, which in this context +corresponds to two interface points: (1) the radio interface +connecting Magma to an eNB or gNB (implemented by set of modules on +the left side of the AGW in the figure) or the federation interface +connecting Magma to another mobile network (implemented by the +\sphinxstyleemphasis{Federation Gateway} module in the figure). Everything “between” those +two external interfaces is free to deviate from the 3GPP specification, +which has a broad impact as discussed below. + +\sphinxAtStartPar +One consequence of this approach is that Magma can interoperate with +other implementations \sphinxstyleemphasis{only} at the edges. Thus, it is possible to +connect a Magma mobile core to any standards\sphinxhyphen{}compliant 4G or 5G base +station and expect it to work, and similarly, it is possible to +federate a Magma core with an existing MNO’s 4G or 5G network. +However, since Magma does not implement all the 3GPP interfaces that +are internal to a mobile packet core, it is not possible to +arbitrarily mix and match components within the core. Whereas (in +principle) a traditional 3GPP implementation would permit an AMF from +one vendor to interoperate with the SMF of another vendor, it is not +possible to connect parts of a mobile core from another vendor (or +another open source project) with parts of Magma, aside from via the +two interfaces just described. + +\sphinxAtStartPar +Being free to deviate from the 3GPP spec means Magma can take a +unifying approach across multiple wireless technologies, including 4G, +5G and WiFi. There is a set of functions that the core must implement +for any radio technology (e.g., finding the appropriate policy for a +given subscriber by querying a database); Magma provides them in an +access\sphinxhyphen{}technology\sphinxhyphen{}independent way. These functions form the heart of +an Access Gateway (AGW), as illustrated on the right side of +\hyperref[\detokenize{core:fig-magma-arch}]{Figure \ref{\detokenize{core:fig-magma-arch}}}. On the other hand, control +protocols that are specific to a given radio technology are terminated +in technology\sphinxhyphen{}specific modules close to the radio. For example, \sphinxstyleemphasis{SCTP} +shown on the left side of the figure is the RAN tunneling protocol +introduced in Section 2.3. These technology\sphinxhyphen{}specific modules then +communicate with the generic functions (e.g., subscriber management, +access control and management) on the right using gRPC messages that +are technology\sphinxhyphen{}agnostic. + +\sphinxAtStartPar +Magma’s design is particularly well suited for environments where +backhaul links are unreliable, for example, when a satellite is used. +This is because the 3GPP protocols that traditionally have to traverse +the backhaul from core to eNB/gNB are quite sensitive to loss and +latency. Loss or latency can cause connections to be dropped, which in +turn forces UEs to repeat the process of attaching to the core. In +practice, not all UEs handle this elegantly, sometimes ending up in a +“stuck” state. + +\sphinxAtStartPar +Magma addresses the challenge of unreliable backhaul in several ways. +First, Magma frequently avoids sending messages over the backhaul +entirely by running more functionality in the AGW, which is located +close to the radio as seen above. Functions that would be centralized +in a conventional 3GPP implementation are distributed out to the access +gateways in Magma. Thus, for example, the operations required to +authenticate and attach a UE to the core can typically be completed +using information cached locally in the AGW, without any traffic +crossing the backhaul. Secondly, when Magma does need to pass +information over a backhaul link (e.g., to obtain configuration state +from the orchestrator), it does so using gRPC, which is designed to +operate reliably in the face of unreliable or high\sphinxhyphen{}latency links. + +\sphinxAtStartPar +Note that while Magma has distributed much of the control plane out to +the AGWs, it still supports centralized management via the Orchestrator. +For example, adding a new subscriber to the network is done centrally, +and the relevant AGW then obtains the necessary state to authenticate +that subscriber when their UE tries to attach to the network. + +\sphinxAtStartPar +Finally, Magma adopts a \sphinxstyleemphasis{desired state} model for managing runtime and +configuration state. By this we mean that it communicates a state +change (e.g., the addition of a new session in the user plane) by +specifying the desired end state via an API call. This is in contrast +with the \sphinxstyleemphasis{incremental update} model that is common in the 3GPP +specification. When the desired end state is communicated, the +loss of a message or failure of a component has less serious +consequences. This makes reasoning about changes across elements +of the system more robust in the case of partial failures, which are +common in challenged environments like the ones Magma is designed to +serve. + +\sphinxAtStartPar +Consider an example where we are establishing user plane state for a set +of active sessions. Initially, there are two active sessions, X +and Y. Then a third UE becomes active and a session Z needs to be +established. In the incremental update model, the control plane would +instruct the user plane to “add session Z”. The desired state model, +by contrast, communicates the entire new state: “the set of sessions +is now X, Y, Z”. The incremental model is brittle in the face of +failures. If a message is lost, or a component is temporarily unable +to receive updates, the receiver falls out of sync with the sender. So +it is possible that the control plane believes that sessions X, Y and +Z have been established, while the user plane has state for only X +and Y. By sending the entire desired end state, Magma ensures that the +receiver comes back into sync with the sender once it is able to +receive messages again. + +\sphinxAtStartPar +As described, this approach might appear inefficient because it +implies sending complete state information rather than incremental +updates. However, at the scale of an AGW, which handles on the order +of hundreds to a few thousands of subscribers, it is possible to encode the +state efficiently enough to overcome this drawback. With the benefit +of experience, mechanisms have been added to Magma to avoid overloading the +orchestrator, which has state related to all subscribers in the +network. + +\sphinxAtStartPar +The desired state approach is hardly novel but differs from typical +3GPP systems. It allows Magma to tolerate occasional communication +failures or component outages due to software restarts, hardware +failures, and so on. Limiting the scope of 3GPP protocols to the very +edge of the network is what enables Magma to rethink the state +synchronization model. The team that worked on Magma describes their +approach in more detail in an NSDI paper. + +\phantomsection\label{\detokenize{core:reading-magma}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +S. Hasan, \sphinxstyleemphasis{et al.} \sphinxhref{https://arxiv.org/abs/2209.10001}{Building Flexible, Low\sphinxhyphen{}Cost Wireless Access +Networks With Magma}. +NSDI, April 2023. +\end{sphinxadmonition} + +\sphinxAtStartPar +Finally, while we have focused on its Control Plane, Magma also +includes a User Plane component. The implementation is fairly simple, +and is based on Open vSwitch (OVS). Having a programmable user plane +is important, as it needs to support a range of access technologies, and +at the same time, OVS meets the performance needs of AGWs. However, +this choice of user plane is not fundamental to Magma, and other +implementations have been considered. We take a closer look at the +User Plane in the next section. + + +\section{5.4 User Plane} +\label{\detokenize{core:user-plane}} +\sphinxAtStartPar +The User Plane of the Mobile Core—corresponding to the UPF component +in \hyperref[\detokenize{core:fig-5g-core}]{Figure \ref{\detokenize{core:fig-5g-core}}}—connects the RAN to the +Internet. Much like the data plane for any router, the UPF forwards IP +packets, but because UEs often sleep to save power and may be in the +process of being handed off from one base station to another, it +sometimes has to buffer packets for an indeterminate amount of +time. Also like other routers, a straightforward way to understand the +UPF is to think of it as implementing a collection of Match/Action +rules, where the UPF first classifies each packet against a set of +matching rules, and then executes the associated action. + +\sphinxAtStartPar +Using 3GPP terminology, packet classification is defined by a set of +\sphinxstyleemphasis{Packet Detection Rules (PDRs)}, where a given PDR might simply match +the device’s IP address, but may also take the domain name of the far +end\sphinxhyphen{}point into consideration. Each attached UE has at least two PDRs, +one for uplink traffic and one for downlink traffic, plus possibly +additional PDRs to support multiple traffic classes (e.g., for +different QoS levels, pricing plans, and so on.). The Control Plane +creates, updates, and removes PDRs as UEs attach, move, and detach. + +\sphinxAtStartPar +Each PDR then identifies one or more actions to execute, which in 3GPP +terminology are also called “rules”, of which there are four types: +\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxstylestrong{Forwarding Action Rules (FARs):} Instructs the UPF to forward +downlink packets to a particular base station and uplink traffic to +a next\sphinxhyphen{}hop router. Each FAR specifies a set of parameters needed to +forward the packet (e.g., how to tunnel downlink packets to the +appropriate base station), plus one of the following processing +flags: a \sphinxtitleref{forward} flag indicates the packet should be forwarded up +to the Internet; a \sphinxtitleref{tunnel} flag indicates the packet should be +tunneled down to a base station; a \sphinxtitleref{buffer} flag indicates the +packet should be buffered until the UE becomes active; and a +\sphinxtitleref{notify} flag indicates that the CP should be notified to awaken an +idle UE. FARs are created and removed when a device attaches or +detaches, respectively, and the downlink FAR changes the processing +flag when the device moves, goes idle, or awakes. + +\item {} +\sphinxAtStartPar +\sphinxstylestrong{Buffering Action Rules (BARs):} Instructs the UPF to buffer +downlink traffic for idle UEs, while also sending a \sphinxtitleref{Downlink Data +Notification} to the Control Plane. This notification, in turn, +causes the CP to instruct the base station to awaken the UE. Once +the UE becomes active, the UPF releases the buffered traffic and +resumes normal forwarding. The buffering and notification functions +are activated by modifying a FAR to include \sphinxtitleref{buffer} and \sphinxtitleref{notify} +flags, as just described. An additional set of parameters are used +to configure the buffer, for example setting its maximum size +(number of bytes) and duration (amount of time). Optionally, the CP +can itself buffer packets by creating a PDR that directs the UPF to +forward data packets to the control plane. + +\item {} +\sphinxAtStartPar +\sphinxstylestrong{Usage Reporting Rules (URRs):} Instructs the UPF to periodically +send usage reports for each UE to the CP. These reports include +counts of the packets sent/received for uplink/downlink traffic for +each UE and traffic class. These reports are used to both limit and +bill subscribers. The CP creates and removes URRs when the device +attaches and detaches, respectively, and each URR specifies whether +usage reports should be sent periodically or when a quota is +exceeded. A UE typically has two URRs (for uplink/downlink usage), +but if a subscriber’s plan includes special treatment for certain +types of traffic, an additional URR is created for each such traffic +class. + +\item {} +\sphinxAtStartPar +\sphinxstylestrong{Quality Enforcement Rules (QERs):} Instructs the UPF to guarantee +a minimum amount of bandwidth and to enforce a bandwidth cap. These +parameters are specified on a per\sphinxhyphen{}UE / per\sphinxhyphen{}direction / per\sphinxhyphen{}class +basis. The CP creates and removes QERs when a device attaches and +detaches, respectively, and modifies them according to +operator\sphinxhyphen{}defined events, such as when the network becomes more or +less congested, the UE exceeds a quota, or the network policy +changes (e.g., the user signs up for a new pricing plan). The UPF +then performs traffic policing to enforce the bandwidth cap, along +with packet scheduling to ensure a minimum bandwidth in conjunction +with admission control in the control plane. + +\end{itemize} + +\sphinxAtStartPar +The rest of this section describes two complementary strategies for +implementing a UPF, one server\sphinxhyphen{}based and one switch\sphinxhyphen{}based. + + +\subsection{5.4.1 Microservice Implementation} +\label{\detokenize{core:microservice-implementation}} +\sphinxAtStartPar +A seemingly straightforward approach to supporting the set of +Match/Action rules just described is to implement the UPF in software +on a commodity server. Like any software\sphinxhyphen{}based router, the process +would read a packet from an input port, classify the packet by +matching it against a table of configured PDRs, execute the associated +action(s), and then write the packet to an output port. Such a process +could then be packaged as a Docker container, with one or more +instances spun up on a Kubernetes cluster as workload dictates. This +is mostly consistent with a microservice\sphinxhyphen{}based approach, with one +important catch: the actions required to process each packet are +stateful. + +\sphinxAtStartPar +What we mean by this is that the UPF has two pieces of state that +needs to be maintained on a per\sphinxhyphen{}UE / per\sphinxhyphen{}direction / per\sphinxhyphen{}class basis: +(1) a finite state machine that transitions between \sphinxtitleref{forward}, +\sphinxtitleref{tunnel}, \sphinxtitleref{buffer}, and \sphinxtitleref{notify}; and (2) a corresponding packet +buffer when in \sphinxtitleref{buffer} state. This means that as the UPF scales +up to handle more and more traffic—by adding a second, third, and +fourth instance—packets still need to be directed to the original +instance that knows the state for that particular flow. This breaks a +fundamental assumption of a truly horizontally scalable service, in +which traffic can be randomly directed to any instance in a way that +balances the load. It also forces you to do packet classification +before selecting which instance is the right one, which can +potentially become a performance bottleneck, although it is possible +to offload the classification stage to a SmartNIC/IPU. + + +\subsection{5.4.2 P4 Implementation} +\label{\detokenize{core:p4-implementation}} +\sphinxAtStartPar +Since the UPF is fundamentally an IP packet forwarding engine, it can +also be implemented—at least in part—as a P4 program running on a +programmable switch. Robert MacDavid and colleagues describe how that +is done in SD\sphinxhyphen{}Core, which builds on the base packet forwarding +machinery described in our companion SDN book. For the purposes of +this section, the focus is on the four main challenges that are unique +to implementing the UPF in P4. + +\phantomsection\label{\detokenize{core:reading-p4-upf}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +R. MacDavid, \sphinxstyleemphasis{et al.} \sphinxhref{https://www.cs.princeton.edu/~jrex/papers/up4-sosr21.pdf}{A P4\sphinxhyphen{}based 5G User Plane Function}. +Symposium on SDN Research, September 2021. + +\sphinxAtStartPar +\sphinxhref{https://sdn.systemsapproach.org}{Software\sphinxhyphen{}Defined Networks: A Systems Approach}. November 2021. +\end{sphinxadmonition} + +\sphinxAtStartPar +First, P4\sphinxhyphen{}programmable forwarding pipelines include an explicit +“matching” mechanism built on \sphinxstyleemphasis{Ternary Content\sphinxhyphen{}Addressable Memory +(TCAM)}. This memory supports fast table lookups for patterns that +include wildcards, making it ideal for matching IP prefixes. In the +case of the UPF, however, the most common PDRs correspond to exact +matches of IP addresses (for downlink traffic to each UE) and GTP +tunnel identifiers (for uplink traffic from each UE). More complex +PDRs might include regular expressions for DNS names or require deep +packet inspection. + +\sphinxAtStartPar +Because TCAM capacity is limited, and the number of unique PDRs that +need to be matched in both directions is potentially in the tens of +thousands, it’s necessary to use the TCAM judiciously. One +implementation strategy is to set up two parallel PDR tables: one +using the relatively plentiful switch SRAM for common\sphinxhyphen{}case uplink +rules that exactly matches on tunnel identifiers (which can be treated +as table indices); and one using TCAM for common\sphinxhyphen{}case downlink rules +that match the IP destination address. + +\sphinxAtStartPar +Second, when a packet arrives from the Internet destined for an idle +UE, the UPF buffers the packet and sends an alert to the 5G control +plane, asking that the UE be awakened. Today’s P4\sphinxhyphen{}capable switches do +not have large buffers or the ability to hold packets indefinitely, +but a buffering microservice running on a server can be used to +address this limitation. The microservice indefinitely holds any +packets that it receives, and later releases them back to the switch +when instructed to do so. The following elaborates on how this would +work. + +\sphinxAtStartPar +When the Mobile Core detects that a UE has gone idle (or is in the +middle of a handover), it creates a FAR with the \sphinxtitleref{buffer} flag set, +causing the on\sphinxhyphen{}switch P4 program to redirect packets to the buffering +microservice. Packets are redirected without modifying their IP +headers by placing them in a tunnel, using the same tunneling protocol +that is used to send data to base stations. This allows the switch to +treat the buffering microservice just like another base station. + +\sphinxAtStartPar +When the first packet of a flow arrives at the buffering microservice, +it sends an alert to the CP, which then (1) wakes up the UE, (2) +modifies the corresponding FAR by unsetting the \sphinxtitleref{buffer} flag and +setting the \sphinxtitleref{tunnel} flag, and once the UE is active, (3) instructs +the buffering microservice to release all packets back to the +switch. Packets arriving at the switch from the buffering microservice +skip the portion of the UPF module they encountered before buffering, +giving the illusion they are being buffered in the middle of the +switch. That is, their processing resumes at the tunneling stage, +where they are encapsulated and routed to the appropriate base +station. + +\sphinxAtStartPar +Third, QERs cannot be fully implemented in the switch because P4 does +not include support for programming the packet scheduler. However, +today’s P4 hardware does include fixed\sphinxhyphen{}function schedulers with +configurable weights and priorities; these parameters are set using a +runtime interface unrelated to P4. A viable approach, similar to the +one MacDavid, Chen, and Rexford describe in their INFOCOM paper, is to +map each QoS class specified in a QER onto one of the available +queues, and assign a weight to that queue proportional to the fraction +of the available bandwidth the class is to receive. As long as each +class/queue is not over subscribed, individual UEs in the class will +receive approximately the bit rate they have been promised. As an +aside, since 3GPP under\sphinxhyphen{}specifies QoS guarantees (leaving the details +to the implementation), such an approach is 3GPP\sphinxhyphen{}compliant. + +\phantomsection\label{\detokenize{core:reading-p4-qos}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +R. MacDavid, X. Chen, J. Rexford. \sphinxhref{https://www.cs.princeton.edu/~jrex/papers/infocom23.pdf}{Scalable Real\sphinxhyphen{}time Bandwidth +Fairness in Switches}. +IEEE INFOCOM, May 2023. +\end{sphinxadmonition} + +\sphinxAtStartPar +Finally, while the above description implies the Mobile Core’s CP +talks directly to the P4 program on the switch, the implementation is +not that straightforward. From the Core’s perspective, the SMF is +responsible for sending/receiving control information to/from the UPF, +but the P4 program implementing the UPF is controlled through an +interface (known as P4Runtime or P4RT) that is auto\sphinxhyphen{}generated from the +P4 program being controlled. MacDavid’s paper describes how this is +done in more detail (and presumes a deep understanding of the P4 +toolchain), but it can be summarized as follows. It is necessary to +first write a “Model UPF” in P4, use that to program to generate the +UPF\sphinxhyphen{}specific P4RT interface, and then write translators that (1) +connect SMF to P4RT, and (2) connect P4RT to the underlying physical +switches and servers. A high\sphinxhyphen{}level schematic of this software stack is +shown in \hyperref[\detokenize{core:fig-p4-upf}]{Figure \ref{\detokenize{core:fig-p4-upf}}}. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=500\sphinxpxdimen]{{Slide23}.png} +\caption{A model P4\sphinxhyphen{}based implementation of the UPF is used to generate the +interface that is then used by the SMF running in the Mobile Core +control plane to control the physical implementation of the UPF +running on a combination of hardware switches and servers.}\label{\detokenize{core:id7}}\label{\detokenize{core:fig-p4-upf}}\end{figure} + +\sphinxAtStartPar +Note that while this summary focuses on how the CP controls the UPF +(the downward part of the schematic shown in \hyperref[\detokenize{core:fig-p4-upf}]{Figure \ref{\detokenize{core:fig-p4-upf}}}), the usage counters needed to generate URRs that flow +upward to the CP are easy to support because the counters implemented +in the switching hardware are identical to the counters in the Model +UPF. When the Mobile Core requests counter values from the Model UPF, +the backend translator polls the corresponding hardware switch +counters and relays the response. + + +\chapter{Chapter 6: Managed Cloud Service} +\label{\detokenize{cloud:chapter-6-managed-cloud-service}}\label{\detokenize{cloud::doc}} +\sphinxAtStartPar +This chapter describes how to assemble all the pieces described in the +previous chapters to provide 5G connectivity as a managed cloud +service. Such a service might be deployed in enterprises, for example, +in support of collection of operational data, video, robots, IoT +devices, and so on—a set of use cases sometimes referred to as +Industry 4.0. + +\sphinxAtStartPar +The first step is to implement all the components using cloud native +building blocks. We start by introducing those building blocks in +Section 6.1. The second step is to introduce yet another component—a +\sphinxstyleemphasis{Cloud Management Platform}—that is responsible for operationalizing +5G\sphinxhyphen{}as\sphinxhyphen{}a\sphinxhyphen{}Service. The rest of the sections describe how to build such a +management system using open source tools. + +\sphinxAtStartPar +Before getting into the details, it is important to remember that +mobile cellular service (both voice and broadband) has been offered as a +Telco service for 40 years. Treating it as a managed cloud service is +a significant departure from that history, most notably in how the +connectivity it provides is operated and managed. As a consequence, +the Cloud Management Platform described in this chapter is +significantly different from the legacy OSS/BSS mechanisms that have +traditionally been the centerpiece of the Telco management +machinery. The terminology is also different, but that only matters if +you are trying to map Telco terminology onto cloud terminology (which +we are not). We take up the “terminology mapping problem” in a +companion book, and here focus instead on a from\sphinxhyphen{}scratch cloud\sphinxhyphen{}based +design. + +\phantomsection\label{\detokenize{cloud:reading-ops}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +L. Peterson, A. Bavier, S. Baker, Z. Williams, and B. Davie. \sphinxhref{https://ops.systemsapproach.org/lifecycle.html}{Edge +Cloud Operations: A Systems Approach}. June 2022. +\end{sphinxadmonition} + + +\section{6.1 Building Blocks} +\label{\detokenize{cloud:building-blocks}} +\sphinxAtStartPar +The implementation strategy starts with commodity hardware and open +source software. These building blocks will be familiar to anyone who +has built a cloud native application, but they deserve to be +explicitly named in a discussion of mobile cellular networks, which +have historically been built using closed, proprietary hardware +devices. + +\sphinxAtStartPar +The hardware building blocks include bare\sphinxhyphen{}metal servers and switches, +which might include ARM or x86 processor chips and Tomahawk or Tofino +switching chips, respectively. A physical cloud cluster is then +constructed with the hardware building blocks arranged as shown in +\hyperref[\detokenize{cloud:fig-hw}]{Figure \ref{\detokenize{cloud:fig-hw}}}: one or more racks of servers connected +by a leaf\sphinxhyphen{}spine switching fabric. We show the servers above the +switching fabric to emphasize that software running on the servers +controls the switches (as we will see in the next section). + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=400\sphinxpxdimen]{{Slide41}.png} +\caption{Example building block components used to construct an edge cloud, +including commodity servers and switches, interconnected by a +leaf\sphinxhyphen{}spine switching fabric.}\label{\detokenize{cloud:id1}}\label{\detokenize{cloud:fig-hw}}\end{figure} + +\sphinxAtStartPar +The software building blocks start with the following open source +components: +\begin{enumerate} +\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% +\item {} +\sphinxAtStartPar +Docker containers package software functionality. + +\item {} +\sphinxAtStartPar +Kubernetes instantiates and interconnects a set of containers. + +\item {} +\sphinxAtStartPar +Helm specifies how collections of related containers are +interconnected to build microservice\sphinxhyphen{}based applications. + +\item {} +\sphinxAtStartPar +Fleet specifies how a set of Kubernetes applications are to be +deployed on the available infrastructure. + +\item {} +\sphinxAtStartPar +Terraform provisions a set of one or more Kubernetes clusters, +configuring them to host microservice applications. + +\end{enumerate} + +\sphinxAtStartPar +Docker is a container runtime that leverages OS isolation APIs to +instantiate and run multiple containers, each of which is an instance +defined by a Docker image. Docker images are most frequently built +using a Dockerfile, which uses a layering approach that allows sharing +and building customized images on top of base images. A final image +for a particular task incorporates all dependencies required by the +software that is to run in the container, resulting in a container +image that is portable across servers, depending only on the kernel +and Docker runtime. We also assume one or more image artifact +repositories of Docker containers that we will want to deploy in our +cloud, of which \sphinxurl{https://hub.docker.com/} is the best known +example. + +\phantomsection\label{\detokenize{cloud:reading-docker}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +\sphinxhref{https://www.docker.com/101-tutorial}{Docker Tutorial}. +\end{sphinxadmonition} + +\sphinxAtStartPar +Kubernetes is a container orchestration system. It provides a +programmatic interface for scaling container instances up and down, +allocating server resources to them, setting up virtual networks to +interconnect those instances, and opening service ports that external +clients can use to access those instances. Behind the scenes, +Kubernetes monitors the liveness of those containers, and +automatically restarts any that have failed. In other words, if you +instruct Kubernetes to spin up three instances of microservice X, +Kubernetes will do its best to keep three instances of the container +that implements X running at all times. + +\phantomsection\label{\detokenize{cloud:reading-k8s}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +\sphinxhref{https://kubernetes.io/docs/tutorials/kubernetes-basics/}{Kubernetes Tutorial}. +\end{sphinxadmonition} + +\sphinxAtStartPar +Helm is a configuration manager that runs on top of Kubernetes. It +issues calls against the Kubernetes API according to a +developer\sphinxhyphen{}provided specification, known as a \sphinxstyleemphasis{Helm Chart}. It is now +common practice for cloud applications built from a set of +microservices to publish a Helm chart that defines how the application +is to be deployed on a Kubernetes cluster. See +\sphinxurl{https://artifacthub.io/} for a collection of publicly available +Helm Charts. + +\phantomsection\label{\detokenize{cloud:reading-helm}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +\sphinxhref{https://helm.sh/docs/intro/quickstart/}{Helm Tutorial}. +\end{sphinxadmonition} + +\sphinxAtStartPar +Fleet, an application deployment manager, is responsible for +installing a \sphinxstyleemphasis{Bundle} of Helm Charts on one or more target +clusters. If we were trying to deploy a single Chart on just one +Kubernetes cluster, then Helm would be sufficient. The value of Fleet +is that it scales up that process, helping us manage the deployment of +multiple charts across multiple clusters. Moreover, Fleet does this +using an approach known as \sphinxstyleemphasis{Configuration\sphinxhyphen{}as\sphinxhyphen{}Code}, where the desired +configuration is checked into a repo, just like any other +software. Checking a new or updated Bundle into a repo +triggers the deployment of the corresponding applications. + +\phantomsection\label{\detokenize{cloud:reading-fleet}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +\sphinxhref{https://fleet.rancher.io/}{Fleet: GitOps at Scale}. +\end{sphinxadmonition} + +\sphinxAtStartPar +Terraform is an infrastructure manager that, in our scenario, +provisions one or more Kubernetes clusters, preparing them to host a +collection of Helm\sphinxhyphen{}specified applications. It does this using an +approach known as \sphinxstyleemphasis{Infrastructure\sphinxhyphen{}as\sphinxhyphen{}Code}, which documents exactly +how the infrastructure is to be configured in a declarative format +that can be (a) checked into a repo, (b) version\sphinxhyphen{}controlled, and (c) +executed just like any piece of software. Terraform assumes an +underlying provisioning API, with Microsoft’s Azure Kubernetes Service +(AKS), AWS’s Amazon Elastic Kubernetes Service (EKS), Google’s Google +Kubernetes Engine (GKE) and Rancher’s Rancher Kubernetes Engine (RKE) +being widely available examples. + +\phantomsection\label{\detokenize{cloud:reading-terraform}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +\sphinxhref{https://learn.hashicorp.com/terraform}{Terraform Tutorials}. +\end{sphinxadmonition} + +\sphinxAtStartPar +The inter\sphinxhyphen{}related roles of Helm, Fleet, and Terraform can be +confusing, in part because there is overlap in what each tries to do. +One distinction is that Helm Charts are typically specified by +\sphinxstyleemphasis{developers} as a way of specifying how an application is constructed +from a set of microservices, whereas Fleet and Terraform give +\sphinxstyleemphasis{operators} an opportunity to specify details of their particular +deployment scenarios. A second distinction is that Helm and Fleet help +manage the \sphinxstyleemphasis{applications running on} one or more Kubernetes clusters, +whereas Terraform is used to set up and configure the \sphinxstyleemphasis{underlying +Kubernetes clusters} in the first place. Again, there is overlap in +the capabilities of these respective tools, but these two distinctions +characterize how they are used in Aether. The more general takeaway is +that cloud management has to accommodate both developers and +operators, and to clearly delineate between applications and +platforms. + + +\section{6.2 Example Deployment} +\label{\detokenize{cloud:example-deployment}} +\sphinxAtStartPar +Using these building blocks, it is possible to construct a wide range +of deployment scenarios for a managed 5G service. For illustrative +purposes, we use a particular deployment based on the Aether edge +cloud introduced in Chapter 2. Aether is an operational edge cloud +that has been deployed to multiple sites, and most importantly for our +purposes, includes an API that edge apps can use to customize 5G +connectivity to better meet their objectives. + + +\subsection{6.2.1 Edge Cloud} +\label{\detokenize{cloud:edge-cloud}} +\sphinxAtStartPar +An Aether edge deployment, called ACE (Aether Connected Edge), is a +Kubernetes\sphinxhyphen{}based cluster. It consists of one or more server racks +interconnected by a leaf\sphinxhyphen{}spine switching fabric, with an SDN control +plane (denoted SD\sphinxhyphen{}Fabric) managing the fabric. We briefly saw +SD\sphinxhyphen{}Fabric in Chapter 5 as an implementation option for the Mobile +Core’s User Plane Function (UPF), but for an in\sphinxhyphen{}depth description of +SD\sphinxhyphen{}Fabric, we refer you to a companion book. + +\phantomsection\label{\detokenize{cloud:reading-sdn}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +L. Peterson, C. Cascone, B. O’Connor, T. Vachuska, and B. Davie. +\sphinxhref{https://sdn.systemsapproach.org}{Software\sphinxhyphen{}Defined Networks: A Systems Approach}. November 2021. +\end{sphinxadmonition} + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=350\sphinxpxdimen]{{Slide51}.png} +\caption{Aether Connected Edge (ACE) = The cloud platform (Kubernetes and +SD\sphinxhyphen{}Fabric) plus the 5G connectivity service (RAN and User Plane of +Mobile Core). Dotted lines (e.g., between SD\sphinxhyphen{}RAN and the individual +base stations, and between the Network OS and the individual +switches) represent control relationships (e.g., SD\sphinxhyphen{}RAN controls +the small cells and SD\sphinxhyphen{}Fabric controls the switches).}\label{\detokenize{cloud:id2}}\label{\detokenize{cloud:fig-ace}}\end{figure} + +\sphinxAtStartPar +As shown in \hyperref[\detokenize{cloud:fig-ace}]{Figure \ref{\detokenize{cloud:fig-ace}}}, ACE hosts two additional +microservice\sphinxhyphen{}based subsystems on top of this platform; they +collectively implement \sphinxstyleemphasis{5G\sphinxhyphen{}as\sphinxhyphen{}a\sphinxhyphen{}Service}. The first subsystem, SD\sphinxhyphen{}RAN, +is the SDN\sphinxhyphen{}based implementation of the Radio Access Network described +in Chapter 4. It controls the small cell base stations deployed +throughout the enterprise. The second subsystem, SD\sphinxhyphen{}Core, is an +SDN\sphinxhyphen{}based implementation of the User Plane half of the Mobile Core +described in Chapter 5. It is responsible for forwarding traffic +between the RAN and the Internet. The SD\sphinxhyphen{}Core Control Plane (CP) runs +off\sphinxhyphen{}site, and is not shown in \hyperref[\detokenize{cloud:fig-ace}]{Figure \ref{\detokenize{cloud:fig-ace}}}. Both +subsystems (as well as the SD\sphinxhyphen{}Fabric), are deployed as a set of +microservices, just as any other cloud native workload. + +\sphinxAtStartPar +Once an edge cluster is running in this configuration, it is ready to +host a collection of cloud\sphinxhyphen{}native edge applications (not shown in +\hyperref[\detokenize{cloud:fig-ace}]{Figure \ref{\detokenize{cloud:fig-ace}}}). What’s unique to our example +configuration is its ability to connect such applications to mobile +devices throughout the enterprise using the 5G Connectivity Service +implemented by SD\sphinxhyphen{}RAN and SD\sphinxhyphen{}Core, without the resulting network +traffic ever leaving the enterprise; a scenario known as \sphinxstyleemphasis{local +breakout}. Moreover, this service is offered as a managed service, +with enterprise system administrators able to use a programmatic API +(and associated GUI portal) to control that service; that is, +authorize devices, restrict access, set QoS profiles for different +devices and applications, and so on. + + +\subsection{6.2.2 Hybrid Cloud} +\label{\detokenize{cloud:hybrid-cloud}} +\sphinxAtStartPar +While it is possible to instantiate a single ACE cluster in just one +site, Aether is designed to support multiple edge deployments, all of +which are managed from the central cloud. Such a hybrid cloud scenario +is depicted in \hyperref[\detokenize{cloud:fig-aether}]{Figure \ref{\detokenize{cloud:fig-aether}}}, which shows two +subsystems running in the central cloud: (1) one or more +instantiations of the Mobile Core Control Plane (CP), and (2) the +Aether Management Platform (AMP). + +\sphinxAtStartPar +Each SD\sphinxhyphen{}Core CP controls one or more SD\sphinxhyphen{}Core UPFs. Exactly how CP +instances (running centrally) are paired with UPF instances (running +at the edges) is a runtime decision, and depends on the degree of +isolation the enterprise sites require. AMP is Aether’s realization of +a Cloud Management Platform; it is responsible for managing all the +centralized and edge subsystems (as introduced in the next section). + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=600\sphinxpxdimen]{{Slide61}.png} +\caption{Aether runs in a hybrid cloud configuration, with Control Plane of +Mobile Core and the Aether Management Platform (AMP) running in the +Central Cloud.}\label{\detokenize{cloud:id3}}\label{\detokenize{cloud:fig-aether}}\end{figure} + +\sphinxAtStartPar +There is an important aspect of this hybrid cloud that is not obvious +from \hyperref[\detokenize{cloud:fig-aether}]{Figure \ref{\detokenize{cloud:fig-aether}}}, which is that the “hybrid +cloud” we keep referring to is best described as a set of Kubernetes +clusters, rather than a set of physical clusters. This is because, +while each ACE site usually corresponds to a physical cluster built +out of bare\sphinxhyphen{}metal components, each of the SD\sphinxhyphen{}Core CP subsystems shown +in \hyperref[\detokenize{cloud:fig-aether}]{Figure \ref{\detokenize{cloud:fig-aether}}} is actually deployed in a logical +Kubernetes cluster on a commodity cloud. The same is true for +AMP. Aether’s centralized components are able to run in Google Cloud +Platform, Microsoft Azure, and Amazon’s AWS. They also run as an +emulated cluster implemented by a system like KIND (Kubernetes in +Docker), making it possible for developers to run these components on +their laptops. + +\begin{sphinxShadowBox} +\sphinxstylesidebartitle{Near\sphinxhyphen{}Edge vs Far\sphinxhyphen{}Edge} + +\sphinxAtStartPar +\sphinxstyleemphasis{We use enterprises as the exemplar edge deployment in this book, +without prescribing a role for traditional MNOs. When traditional +MNOs are involved, it is not uncommon for them to make a +distinction between the “near\sphinxhyphen{}edge” and the “far\sphinxhyphen{}edge”, where the +far\sphinxhyphen{}edge corresponds to the enterprise and the near\sphinxhyphen{}edge +corresponds to their traditional aggregation points (or Central +Offices), as described in Section 1.2. In such a scenario, it is +typically the case that the RU and DU are located at the far\sphinxhyphen{}edge +(on\sphinxhyphen{}prem), while the CU—along with both the Control and User Planes +of the Mobile Core—run in the near\sphinxhyphen{}edge. Such a configuration does +not support local breakout, since all traffic must travel to the +near\sphinxhyphen{}edge before being routed to the edge app (which might be +running back in the enterprise).} + +\sphinxAtStartPar +\sphinxstyleemphasis{In contrast, the deployment described in this Chapter has +everything except the Mobile Core Control Plane (CP) running +on\sphinxhyphen{}prem. Moreover, because there is no traditional MNO involved, +there is no near\sphinxhyphen{}edge to speak of, with the Core CP instead running +in a central cloud. For example, this section describes a +deployment with SD\sphinxhyphen{}Core (CP) running in the Google Cloud. It is the +case, however, that the SD\sphinxhyphen{}Core (CP) can optionally run on\sphinxhyphen{}prem if +a fully local configuration is preferred. Where each component runs +is a configuration option.} +\end{sphinxShadowBox} + + +\subsection{6.2.3 Stakeholders} +\label{\detokenize{cloud:stakeholders}} +\sphinxAtStartPar +With the understanding that our target environment is a collection of +Kubernetes clusters—some running on bare\sphinxhyphen{}metal hardware at edge sites +and some running in central datacenters—there is an orthogonal issue +of how decision\sphinxhyphen{}making responsibility for those clusters is shared +among multiple stakeholders. Identifying the relevant stakeholders is +an important prerequisite for establishing a cloud service, and while +the example we use may not be suitable for all situations, it does +illustrate the design implications. + +\sphinxAtStartPar +For Aether, we care about two primary stakeholders: (1) the \sphinxstyleemphasis{cloud +operators} who manage the hybrid cloud as a whole, and (2) the +\sphinxstyleemphasis{enterprise users} who decide on a per\sphinxhyphen{}site basis how to take +advantage of the local cloud resources (e.g., what edge applications +to run and how to slice connectivity resources among those apps). We +sometimes call the latter “enterprise admins” to distinguish them from +“end\sphinxhyphen{}users” who might want to manage their own personal devices. + +\sphinxAtStartPar +Aether is multi\sphinxhyphen{}tenant in the sense that it authenticates and isolates +these stakeholders, allowing each to access only those objects they +are responsible for. This makes the approach agnostic as to whether +all the edge sites belong to a single organization (with that +organization also responsible for operating the cloud), or +alternatively, there being a separate organization that offers a +managed service to a set of distinct enterprises (each of which spans +one or more sites). + +\sphinxAtStartPar +There is a third stakeholder of note—third\sphinxhyphen{}party service +providers—which points to the larger issue of how we deploy and manage +the edge applications that take advantage of 5G\sphinxhyphen{}as\sphinxhyphen{}a\sphinxhyphen{}Service. The +approach Aether adopts is to expect service providers to make their +applications available either as source code (which works for open +source or in\sphinxhyphen{}house apps), or as standard cloud native artifacts (e.g., +Docker images and Helm charts). Either format can be fed into the +Lifecycle Management pipeline described in Section 6.3.2. The +alternative would be for edge service providers to share operational +responsibility for the edge cloud with the cloud operator, which is +possible if the infrastructure running at the edge is either +multi\sphinxhyphen{}tenant or a multi\sphinxhyphen{}cloud. + + +\subsection{6.2.4 Alternative Configurations} +\label{\detokenize{cloud:alternative-configurations}} +\sphinxAtStartPar +The deployment just described is Aether in its full glory. Simpler +configurations are also possible, which makes sense in less demanding +scenarios. Examples include: +\begin{itemize} +\item {} +\sphinxAtStartPar +Small edge clusters can be built with only a single switch (or two +switches for resiliency), with or without SDN\sphinxhyphen{}based control. In the +limit, an Aether edge can run on a single server. + +\item {} +\sphinxAtStartPar +It is possible to substitute legacy small cells for O\sphinxhyphen{}RAN compliant +small cells and the SD\sphinxhyphen{}RAN solution that includes a near RT\sphinxhyphen{}RIC and +associated xApps. + +\item {} +\sphinxAtStartPar +It is possible co\sphinxhyphen{}locate both AMP and the SD\sphinxhyphen{}Core on the edge +cluster, resulting in a complete Aether deployment that is +self\sphinxhyphen{}contained in a single site. + +\end{itemize} + +\sphinxAtStartPar +These are all straightforward configuration options. A very different +approach is to start with an edge cluster that is managed by one of +the hyperscalers, rather than have Aether provision Kubernetes on +bare\sphinxhyphen{}metal. Google’s Anthos, Microsoft’s Azure Arc, and Amazon’s +ECS\sphinxhyphen{}Anywhere are examples of such edge cloud products. In such a +scenario, AMP still manages the SD\sphinxhyphen{}Core and SD\sphinxhyphen{}RAN applications +running on top of Kubernetes, but not the underlying platform (which +may or may not include an SDN\sphinxhyphen{}based switching fabric). + +\sphinxAtStartPar +Another variable in how 5G can be deployed at the edge is related to +who owns the underlying cloud infrastructure. Instead of a cloud +provider, an enterprise, or a traditional MNO owning the hardware, +there are situations where a third\sphinxhyphen{}party, often called a \sphinxstyleemphasis{neutral +host}, owns and operates the hardware (along with the real estate it +sits in), and then rents access to these resources to multiple 5G +providers. Each mobile service provider is then a tenant of that +shared infrastructure. + +\sphinxAtStartPar +This kind of arrangement has existed for years, albeit with +conventional RAN devices, but shifting to a cloud\sphinxhyphen{}based design makes +it possible for neutral hosts to lease access to \sphinxstyleemphasis{virtualized} edge +resources to their tenants. In principle, the only difference between +this scenario and today’s multi\sphinxhyphen{}tenant clouds is that such providers +would offer edge resources—located in cell towers, apartment +buildings, and dense urban centers—instead of datacenter resources. +The business arrangements would also have to be different from Private +5G, but the technical design outlined in this book still applies. + + +\section{6.3 Cloud Management Platform} +\label{\detokenize{cloud:cloud-management-platform}} +\sphinxAtStartPar +Operationalizing the hardware and software components described in the +previous two sections is the essence of what it means to offer 5G as a +\sphinxstyleemphasis{managed service}. This responsibility falls to the Cloud Management +Platform, which in Aether corresponds to the centralized AMP component +shown in \hyperref[\detokenize{cloud:fig-aether}]{Figure \ref{\detokenize{cloud:fig-aether}}}. AMP manages both the +distributed set of ACE clusters and one or more SD\sphinxhyphen{}Core CP clusters +running in the central cloud. + +\sphinxAtStartPar +The following uses AMP to illustrate how to deliver 5G\sphinxhyphen{}as\sphinxhyphen{}a\sphinxhyphen{}Service, +but the approach generalizes because AMP is based on widely\sphinxhyphen{}used open +source tools. For more details about all the subsystems involved in +operationalizing an edge cloud, we refer you to the companion book +mentioned in the introduction to this chapter. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=600\sphinxpxdimen]{{Slide71}.png} +\caption{The four subsystems that comprise AMP: Resource Provisioning, +Lifecycle Management, Service Orchestrator, and Monitoring \& Telemetry.}\label{\detokenize{cloud:id4}}\label{\detokenize{cloud:fig-amp}}\end{figure} + +\sphinxAtStartPar +At a high level, AMP is organized around the four subsystems shown in +\hyperref[\detokenize{cloud:fig-amp}]{Figure \ref{\detokenize{cloud:fig-amp}}}: +\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxstylestrong{Resource Provisioning} is responsible for initializing resources +(e.g., servers, switches) that add, replace, or upgrade capacity. +It configures and bootstraps both physical and virtual resources, +bringing them up to a state so Lifecycle Management can take over +and manage the software running on those resources. + +\item {} +\sphinxAtStartPar +\sphinxstylestrong{Lifecycle Management} is responsible for continuous integration +and deployment of the software components that collectively +implement 5G\sphinxhyphen{}as\sphinxhyphen{}a\sphinxhyphen{}Service. It adopts the GitOps practice of +\sphinxstyleemphasis{Configuration\sphinxhyphen{}as\sphinxhyphen{}Code}, using Helm Charts, Terraform Templates, and +Fleet Bundles to specify how functionality is to be deployed and +configured. + +\item {} +\sphinxAtStartPar +\sphinxstylestrong{Service Orchestration} provides a means to manage services once +they are operational. It defines an API that hides the +implementation details of the underlying microservices, and is used +to manage the provided 5G connectivity service. + +\item {} +\sphinxAtStartPar +\sphinxstylestrong{Monitoring \& Telemetry} is responsible for collecting, archiving, +evaluating, and analyzing operational data generated by the +underlying components. It makes it possible to diagnose and respond +to failures, tune performance, do root cause analysis, perform +security audits, and understand when it is necessary to provision +additional capacity. + +\end{itemize} + +\sphinxAtStartPar +AMP implements all four subsystems, but an alternative perspective +that characterizes the management platform as having \sphinxstyleemphasis{online} and +\sphinxstyleemphasis{offline} components is also instructive. Such a two dimensional +schematic is shown in \hyperref[\detokenize{cloud:fig-2d}]{Figure \ref{\detokenize{cloud:fig-2d}}}. Lifecycle +Management (coupled with Resource Provisioning) runs offline, sitting +adjacent to the hybrid cloud. Operators and Developers provision and +change the system by checking code (including configuration specs) +into a repo, which in turn triggers an upgrade of the running system. +Service Orchestration (coupled with Monitoring and Telemetry) runs +online, layered on top of the hybrid cloud being managed. It defines +an API that can be used to read and write parameters of the running +system, which serves as a foundation for building closed\sphinxhyphen{}loop control. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=500\sphinxpxdimen]{{Slide111}.png} +\caption{Alternative representation of the management platform, highlighting +the offline and online aspects of cloud management.}\label{\detokenize{cloud:id5}}\label{\detokenize{cloud:fig-2d}}\end{figure} + +\sphinxAtStartPar +The offline and online aspects of cloud management are related in the +sense that the offline component is also responsible for +lifecycle\sphinxhyphen{}managing the online component. This is because the latter is +deployed as a collection of Kubernetes applications, just like SD\sphinxhyphen{}Core +and SD\sphinxhyphen{}RAN. Version management is a key aspect of this relationship +since the runtime API to the 5G connectivity service has to stay in +sync with the underlying implementation of the constituent +subsystems. How Aether realizes version control is described in more +detail in the companion Edge Cloud Operations book. + + +\subsection{6.3.1 Resource Provisioning} +\label{\detokenize{cloud:resource-provisioning}} +\sphinxAtStartPar +Resource Provisioning is the process of bringing virtual and physical +resources online. For physical resources, it has both a hands\sphinxhyphen{}on +component (racking and connecting devices) and a bootstrap component +(configuring how the resources boot into a “ready” state). When +utilizing virtual resources (e.g., VMs instantiated on a commercial +cloud) the “rack and connect” step is carried out by a sequence of API +calls rather than a hands\sphinxhyphen{}on technician. + +\sphinxAtStartPar +Because we want to automate the sequence of calls needed to activate +virtual infrastructure, we adopt an approach known as +\sphinxstyleemphasis{Infrastructure\sphinxhyphen{}as\sphinxhyphen{}Code}. This is where Terraform comes into play. +The general idea is to document, in a declarative format that can be +“executed”, exactly what our infrastructure is to look like. The code +defines how the infrastructure is to be configured. + +\sphinxAtStartPar +When a cloud is built from a combination of virtual and physical +resources, as is the case for a hybrid cloud like Aether, we need a +seamless way to accommodate both. To this end, our approach is to +first overlay a \sphinxstyleemphasis{logical structure} on top of hardware resources, +making them roughly equivalent to the virtual resources we get from a +commercial cloud provider. This results in a hybrid scenario similar +to the one shown in \hyperref[\detokenize{cloud:fig-infra}]{Figure \ref{\detokenize{cloud:fig-infra}}}. One way to think +about this is that the task of booting hardware into the “ready” state +involves installing and configuring several subsystems that +collectively form the cloud platform. It is this platform that +Terraform interacts with, indirectly, through a cloud provisioning API. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=450\sphinxpxdimen]{{Slide121}.png} +\caption{Resource Provisioning in a hybrid cloud that includes both +physical and virtual resources.}\label{\detokenize{cloud:id6}}\label{\detokenize{cloud:fig-infra}}\end{figure} + + +\subsection{6.3.2 Lifecycle Management} +\label{\detokenize{cloud:lifecycle-management}} +\sphinxAtStartPar +Lifecycle Management is concerned with updating and evolving a running +system over time. \hyperref[\detokenize{cloud:fig-cicd}]{Figure \ref{\detokenize{cloud:fig-cicd}}} gives an overview of +the pipeline/toolchain that make up the two halves of Lifecycle +Management—Continuous Integration (CI) and Continuous Deployment +(CD). The key thing to focus on is the Image and Config Repos in the +middle. They represent the “interface” between the two halves: CI +produces Docker Images and Helm Charts, storing them in the respective +Repositories, while CD consumes Docker Images and Helm Charts, pulling +them from the respective Repositories. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=600\sphinxpxdimen]{{Slide81}.png} +\caption{Overview of the CI/CD pipeline.}\label{\detokenize{cloud:id7}}\label{\detokenize{cloud:fig-cicd}}\end{figure} + +\sphinxAtStartPar +The Config Repo also contains declarative specifications of the +infrastructure artifacts (specifically, Terraform templates and Fleet +Bundles). These files are input to Lifecycle Management, which implies +that Terraform and Fleet gets invoked as part of CI/CD whenever these +files change. In other words, CI/CD keeps both the software\sphinxhyphen{}related +components in the underlying cloud platform and the microservice +workloads that run on top of that platform up to date. + +\begin{sphinxShadowBox} +\sphinxstylesidebartitle{Continuous Delivery vs Deployment} + +\sphinxAtStartPar +\sphinxstyleemphasis{You will also hear CD refer to “Continuous Delivery” instead of +“Continuous Deployment”, but we are interested in the complete +end\sphinxhyphen{}to\sphinxhyphen{}end process, so CD will always imply the latter in this +book. But keep in mind that “continuous” does not necessarily mean +“instantaneous”; there can be a variety of gating functions +injected into the CI/CD pipeline to control when and how upgrades +get rolled out. The important point is that all the stages in the pipeline +are automated.} + +\sphinxAtStartPar +\sphinxstyleemphasis{So what exactly does “Continuous Delivery” mean? Arguably, it’s +redundant when coupled with “Continuous Integration” since the +set of artifacts being produced by the CI half of the pipeline +(e.g., Docker images) is precisely what’s being delivered. There +is no “next step” unless you also deploy those artifacts. It’s +hair\sphinxhyphen{}splitting, but some would argue CI is limited to testing new +code and Continuous Delivery corresponds to the final “publish +the artifact” step. For our purposes, we lump “publish the +artifact” into the CI half of the pipeline.} +\end{sphinxShadowBox} + +\sphinxAtStartPar +There are three takeaways from this overview. The first is that by +having well\sphinxhyphen{}defined artifacts passed between CI and CD (and between +operators responsible for resource provisioning and CD), the +subsystems are loosely coupled, and able to perform their respective +tasks independently. The second is that all authoritative state needed +to successfully build and deploy the system is contained within the +pipeline, specifically, as declarative specifications in the Config +Repo. This is the cornerstone of \sphinxstyleemphasis{Configuration\sphinxhyphen{}as\sphinxhyphen{}Code} (also known +as \sphinxstyleemphasis{GitOps}), the cloud native approach to CI/CD. The third is that +there is an opportunity for operators to apply discretion to the +pipeline, as denoted by the \sphinxstyleemphasis{“Deployment Gate”} in the Figure, +controlling what features get deployed when. + +\sphinxAtStartPar +The third repository shown in \hyperref[\detokenize{cloud:fig-cicd}]{Figure \ref{\detokenize{cloud:fig-cicd}}} is the +Code Repo (on the far left). Developers continually check new features +and bug fixes into this repo, which triggers the CI/CD pipeline. A set +of tests and code reviews are run against these check\sphinxhyphen{}ins, with the +output of those tests/reviews reported back to developers, who modify +their patch sets accordingly. (These develop\sphinxhyphen{}and\sphinxhyphen{}test feedback loops +are implied by the dotted lines in \hyperref[\detokenize{cloud:fig-cicd}]{Figure \ref{\detokenize{cloud:fig-cicd}}}.) + +\sphinxAtStartPar +The far right of \hyperref[\detokenize{cloud:fig-cicd}]{Figure \ref{\detokenize{cloud:fig-cicd}}} shows the set of +deployment targets, with \sphinxstyleemphasis{Staging} and \sphinxstyleemphasis{Production} called out as two +illustrative examples. The idea is that a new version of the software +is deployed first to a set of Staging clusters, where it is subjected +to realistic workloads for a period of time, and then rolled out to +the Production clusters once the Staging deployments give us +confidence that the upgrade is reliable. + +\sphinxAtStartPar +Finally, two of the CI stages shown in \hyperref[\detokenize{cloud:fig-cicd}]{Figure \ref{\detokenize{cloud:fig-cicd}}} +identify a \sphinxstyleemphasis{Testing} component. One is a set of component\sphinxhyphen{}level tests +that are run against each patch set checked into the Code Repo. These +tests gate integration; fully merging a patch into the Code Repo +requires first passing this preliminary round of tests. Once merged, +the pipeline runs a build across all the components, and a second +round of testing happens on a \sphinxstyleemphasis{Quality Assurance (QA)} +cluster. Passing these tests gate deployment, but as just noted, +testing also happens in the Staging clusters as part of the CD end of +the pipeline. + + +\subsection{6.3.3 Service Orchestration} +\label{\detokenize{cloud:service-orchestration}} +\sphinxAtStartPar +Service Orchestration is responsible for managing the Kubernetes +workloads once they are up and running, which in our case means +providing a programmatic API that can be used by various stakeholders +to manage the 5G connectivity service. As shown in \hyperref[\detokenize{cloud:fig-control}]{Figure \ref{\detokenize{cloud:fig-control}}}, the Service Orchestrator hides the implementation +details of 5G connectivity, which spans four different components and +multiple clouds. It does this by providing a coherent service +interface for users, enabling them to authorize +devices and set QoS parameters on an end\sphinxhyphen{}to\sphinxhyphen{}end basis. + +\begin{figure}[ht] +\centering +\capstart + +\noindent\sphinxincludegraphics[width=400\sphinxpxdimen]{{Slide91}.png} +\caption{Example use case that requires ongoing runtime control.}\label{\detokenize{cloud:id8}}\label{\detokenize{cloud:fig-control}}\end{figure} + +\sphinxAtStartPar +In other words, the Service Orchestrator defines an abstraction layer +on top of a collection of backend components, effectively turning them +into an externally visible (and controllable) cloud service. In some +situations a single backend component might implement the entirety of +a service, but in the case of 5G, which is constructed from a +collection of disaggregated components, Service Orchestration is where +we define an API that logically integrates those components into a +unified and coherent whole. It is also an opportunity to “raise the +level of abstraction” for the underlying subsystems, hiding +unnecessary implementation details. + +\sphinxAtStartPar +We describe this connectivity interface in Section 6.4. For now, our +focus is on the main issues Service Orchestration must address in +order to offer such an API. At a high level, it must: +\begin{enumerate} +\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}% +\item {} +\sphinxAtStartPar +Authenticate the principal wanting to perform the operation. + +\item {} +\sphinxAtStartPar +Determine if that principal has sufficient privilege to carry out the +operation. + +\item {} +\sphinxAtStartPar +Push the new parameter setting(s) to one or more backend components. + +\item {} +\sphinxAtStartPar +Record the specified parameter setting(s), so the new value(s) +persist. + +\end{enumerate} + +\sphinxAtStartPar +Central to this role is the requirement that Service Orchestration be +able to represent a set of abstract objects, which is to say, it +implements a \sphinxstyleemphasis{data model}. The API is then generated from this data +model, and persistent state associated with instances of the models is +stored in a key\sphinxhyphen{}value store. Aether uses YANG to specify the models, +in part because it is a rich language for data modeling, but also +because there is a robust collection of YANG\sphinxhyphen{}based tools that we can +build upon. + +\phantomsection\label{\detokenize{cloud:reading-yang}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +\sphinxhref{https://datatracker.ietf.org/doc/html/rfc6020}{YANG \sphinxhyphen{} A Data Modeling Language for the Network Configuration Protocol}. RFC 6020. October 2010. +\end{sphinxadmonition} + +\sphinxAtStartPar +Finally, changes to the model\sphinxhyphen{}defined parameters must be propagated to +the backend components, and in practice there is no established +API for doing this. Aether assumes gNMI as its southbound interface to +communicate configuration changes to the software services, where an +Adapter (not shown in the figure) has to be written for any services +that do not support gNMI natively. + + +\subsection{6.3.4 Monitoring and Telemetry} +\label{\detokenize{cloud:monitoring-and-telemetry}} +\sphinxAtStartPar +Collecting telemetry data for a running system is an essential +function of the management platform. It enables operators to monitor +system behavior, evaluate performance, make informed provisioning +decisions, respond to failures, identify attacks, and diagnose +problems. There are three types of telemetry data—\sphinxstyleemphasis{metrics}, \sphinxstyleemphasis{logs}, +and \sphinxstyleemphasis{traces}—along with open source software stacks available to help +collect, store, and act upon each of them. + +\sphinxAtStartPar +Metrics are quantitative data about a system. These include common +performance metrics such as link bandwidth, CPU utilization, and +memory usage, but also binary results corresponding to “up” and +“down”, as well as other state variables that can be encoded +numerically. These values are produced and collected periodically +(e.g., every few seconds), either by reading a counter, or by +executing a runtime test that returns a value. These metrics can be +associated with physical resources such as servers and switches, +virtual resources such as VMs and containers, or high\sphinxhyphen{}level +abstractions such as the \sphinxstyleemphasis{Connectivity Service} described in the next +section. Given these many possible sources of data, the job of the +metrics monitoring stack is to collect, archive, visualize, and +optionally analyze this data. Prometheus is a popular open source tool +for storing and querying metrics. + +\phantomsection\label{\detokenize{cloud:reading-monitor}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +\sphinxhref{https://prometheus.io/docs/introduction/overview/}{Prometheus}. +\end{sphinxadmonition} + +\sphinxAtStartPar +Logs are the qualitative data that is generated whenever a noteworthy +event occurs. This information can be used to identify problematic +operating conditions (i.e., it may trigger an alert), but more +commonly, it is used to troubleshoot problems after they have been +detected. Various system components—all the way from the low\sphinxhyphen{}level OS +kernel to high\sphinxhyphen{}level cloud services—write messages that adhere to a +well\sphinxhyphen{}defined format to the log. These messages include a timestamp, +which makes it possible for the logging stack to parse and correlate +messages from different components. ElasticSearch is a widely\sphinxhyphen{}used +tool for storing and analyzing log messages. + +\phantomsection\label{\detokenize{cloud:reading-logging}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +\sphinxhref{https://www.elastic.co/elasticsearch/}{ElasticSearch}. +\end{sphinxadmonition} + +\sphinxAtStartPar +Traces are a record of causal relationships (e.g., Service A calls +Service B) resulting from user\sphinxhyphen{}initiated transactions or jobs. They +are related to logs, but provide more specialized information about +the context in which different events happen. Tracing is +well understood in a single program, where an execution trace is +commonly recorded as an in\sphinxhyphen{}memory call stack, but traces are +inherently distributed across a graph of network\sphinxhyphen{}connected +microservices in a cloud setting. This makes the problem challenging, +but also critically important because it is often the case that the +only way to understand time\sphinxhyphen{}dependent phenomena—such as why a +particular resource is overloaded—is to understand how multiple +independent workflows interact with each other. Jaeger is a popular +open source tool used for tracing. + +\phantomsection\label{\detokenize{cloud:reading-tracing}} +\begin{sphinxadmonition}{note}{Further Reading} + +\sphinxAtStartPar +\sphinxhref{https://www.jaegertracing.io/}{Jaeger: End\sphinxhyphen{}to\sphinxhyphen{}End Distributed Tracing}. +\end{sphinxadmonition} + +\sphinxAtStartPar +Finally, note that our framing of monitoring and telemetry as part of +the online aspect of management is somewhat simplistic. Certainly +telemetry data is collected from online processes embedded in a +running system, and such data can be coupled with online control +operations to realize closed\sphinxhyphen{}loop control, but it is also the case +that some telemetry data is evaluated offline. This is true for logs +and traces used to diagnose problems, and for performance data used to +make provisioning decisions, both of which can lead to code changes +that feed back into the next iteration of lifecycle management. + + +\section{6.4 Connectivity API} +\label{\detokenize{cloud:connectivity-api}} +\sphinxAtStartPar +The visible aspect of a 5G service is the programmatic interface it +provides to users, giving them the ability to control and customize +the underlying connectivity service. This API is implemented by the +Service Orchestrator outlined in the previous section, but what we +really care about is the interface itself. Using Aether as a concrete +example, this section describes such an API. + +\sphinxAtStartPar +Like many cloud services, the API for 5G\sphinxhyphen{}as\sphinxhyphen{}a\sphinxhyphen{}Service is RESTful. +This means it supports REST’s GET, POST, PATCH, and DELETE operations +on a set of resources (objects): +\begin{itemize} +\item {} +\sphinxAtStartPar +GET: Retrieve an object. + +\item {} +\sphinxAtStartPar +POST: Create an object. + +\item {} +\sphinxAtStartPar +PUT, PATCH: Modify an existing object. + +\item {} +\sphinxAtStartPar +DELETE: Delete an object. + +\end{itemize} + +\sphinxAtStartPar +Each object, in turn, is typically defined by a data model. In Aether +this model is specified in YANG, but rather than dive into the +particulars of YANG, this section describes the models informally by +describing the relevant fields. + +\sphinxAtStartPar +Every object contains an \sphinxtitleref{id} field that is used to uniquely identify +the object. Some objects contain references to other objects. For +example, many objects contain references to the \sphinxtitleref{Enterprise} object, +which allows them to be associated with a particular enterprise. That +is, references are constructed using the \sphinxtitleref{id} field of the referenced +object. + +\sphinxAtStartPar +In addition to the \sphinxtitleref{id} field, several other fields are also common to +all models. These include: +\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxtitleref{description}: A human\sphinxhyphen{}readable description, used to store additional context about the object. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{display\sphinxhyphen{}name}: A human\sphinxhyphen{}readable name that is shown in the GUI. + +\end{itemize} + +\sphinxAtStartPar +As these fields are common to all models, we omit them from the +per\sphinxhyphen{}model descriptions that follow. Note that we use upper case to +denote a model (e.g., \sphinxtitleref{Enterprise}) and lower case to denote a field +within a model (e.g., \sphinxtitleref{enterprise}). + + +\subsection{6.4.1 Enterprises} +\label{\detokenize{cloud:enterprises}} +\sphinxAtStartPar +Aether is deployed in enterprises, and so needs to define a +representative set of organizational abstractions. These include +\sphinxtitleref{Enterprise}, which forms the root of a customer\sphinxhyphen{}specific +hierarchy. The \sphinxtitleref{Enterprise} model is referenced by many other objects, +and allows those objects to be scoped to a particular Enterprise for +ownership and role\sphinxhyphen{}based access control purposes. \sphinxtitleref{Enterprise} +contains the following fields: +\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxtitleref{connectivity\sphinxhyphen{}service}: A list of backend subsystems that implement +connectivity for this enterprise. This list corresponds to the API +endpoint for the SD\sphinxhyphen{}Core, SD\sphinxhyphen{}Fabric, and SD\sphinxhyphen{}RAN components. + +\end{itemize} + +\sphinxAtStartPar +\sphinxtitleref{Enterprises} are further divided into \sphinxtitleref{Sites}. A site is a +point\sphinxhyphen{}of\sphinxhyphen{}presence for an \sphinxtitleref{Enterprise} and may be either physical or +logical (i.e., a single geographic location could contain several +logical sites). The \sphinxtitleref{Site} model, in turn, contains the following +fields: +\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxtitleref{enterprise}: A link to the \sphinxtitleref{Enterprise} that owns this site. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{imsi\sphinxhyphen{}definition}: A description of how IMSIs are constructed for +this site. It consists of the following sub\sphinxhyphen{}fields: +\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxtitleref{mcc}: Mobile country code. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{mnc}: Mobile network code. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{enterprise}: A numeric enterprise id. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{format}: A mask that defines how the above three fields are +encoded in an IMSI. For example \sphinxtitleref{CCCNNNEEESSSSSS} specifies an +IMSI with a 3\sphinxhyphen{}digit MCC, a 3\sphinxhyphen{}digit MNC, a 3\sphinxhyphen{}digit ENT, and a 6\sphinxhyphen{}digit +subscriber. + +\end{itemize} + +\end{itemize} + +\sphinxAtStartPar +As a reminder, an IMSI is burned into every SIM card, and is used to +identify and locate UEs throughout the global cellular network. + + +\subsection{6.4.2 Slices} +\label{\detokenize{cloud:slices}} +\sphinxAtStartPar +Aether models 5G connectivity as a \sphinxtitleref{Slice}, which represents an +isolated communication channel (and associated QoS parameters) that +connects a set of devices (modeled as a \sphinxtitleref{Device\sphinxhyphen{}Group}) to a set of +applications (each of which is modeled as an \sphinxtitleref{Application}). For +example, an enterprise might configure one slice to carry IoT traffic +and another slice to carry video traffic. The \sphinxtitleref{Slice} model has the +following fields: +\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxtitleref{device\sphinxhyphen{}group}: A list of \sphinxtitleref{Device\sphinxhyphen{}Group} objects that can participate in this \sphinxtitleref{Slice}. Each +entry in the list contains both the reference to the \sphinxtitleref{Device\sphinxhyphen{}Group} as well as an \sphinxtitleref{enable} +field which may be used to temporarily remove access to the group. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{application}: A list of \sphinxtitleref{Application} objects that are either allowed or denied for this +\sphinxtitleref{Slice}. Each entry in the list contains both a reference to the \sphinxtitleref{Application} as well as an +\sphinxtitleref{allow} field which can be set to \sphinxtitleref{true} to allow the application or \sphinxtitleref{false} to deny it. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{template}: Reference to the \sphinxtitleref{Template} that was used to initialize this \sphinxtitleref{Slice}. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{upf}: Reference to the User Plane Function (\sphinxtitleref{UPF}) that should be +used to process packets for this \sphinxtitleref{Slice}. Multiple \sphinxtitleref{Slices} may share +a single \sphinxtitleref{UPF}. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{enterprise}: Reference to the \sphinxtitleref{Enterprise} that owns this \sphinxtitleref{Slice}. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{site}: Reference to the \sphinxtitleref{Site} where this \sphinxtitleref{Slice} is deployed. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{sst}, \sphinxtitleref{sd}: 3GPP\sphinxhyphen{}defined slice identifiers assigned by the operations team. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{mbr.uplink}, \sphinxtitleref{mbr.downlink}, \sphinxtitleref{mbr.uplink\sphinxhyphen{}burst\sphinxhyphen{}size}, +\sphinxtitleref{mbr.downlink\sphinxhyphen{}burst\sphinxhyphen{}size}: Maximum bit\sphinxhyphen{}rate and burst sizes for +this slice. + +\end{itemize} + +\sphinxAtStartPar +The rate\sphinxhyphen{}related parameters are initialized using a selected +\sphinxtitleref{template}, as described below, but these values may be changed at +runtime. Also note that this example illustrates how modeling can be +used to enforce invariants, in this case, that the \sphinxtitleref{Site} of the \sphinxtitleref{UPF} +and \sphinxtitleref{Device\sphinxhyphen{}Group} must match the \sphinxtitleref{Site} of the \sphinxtitleref{Slice}. That is, the +physical devices that connect to a slice and the UPF that implements +the core segment of the slice must be constrained to a single physical +location. + +\sphinxAtStartPar +At one end of a Slice is a \sphinxtitleref{Device\sphinxhyphen{}Group}, which identifies a set of +devices that are allowed to use the Slice to connect to various +applications. The \sphinxtitleref{Device\sphinxhyphen{}Group} model contains the following fields: +\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxtitleref{imsis}: A list of IMSI ranges. Each range has the following +fields: +\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxtitleref{name}: Name of the range. Used as a key. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{imsi\sphinxhyphen{}range\sphinxhyphen{}from}: First IMSI in the range. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{imsi\sphinxhyphen{}range\sphinxhyphen{}to}: Last IMSI in the range. Can be omitted if +the range only contains one IMSI. + +\end{itemize} + +\item {} +\sphinxAtStartPar +\sphinxtitleref{ip\sphinxhyphen{}domain}: Reference to an \sphinxtitleref{IP\sphinxhyphen{}Domain} object that describes the +IP and DNS settings for UEs within this group. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{site}: Reference to the site where this \sphinxtitleref{Device\sphinxhyphen{}Group} may be +used. (This field indirectly identifies the \sphinxtitleref{Enterprise} since a +\sphinxtitleref{Site} contains a reference to \sphinxtitleref{Enterprise}.) + +\item {} +\sphinxAtStartPar +\sphinxtitleref{mbr.uplink}, \sphinxtitleref{mbr.downlink}: Maximum bit\sphinxhyphen{}rate for the device group. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{traffic\sphinxhyphen{}class}: The traffic class to be used for devices in this group. + +\end{itemize} + +\sphinxAtStartPar +At the other end of a Slice is a list of \sphinxtitleref{Application} objects, which +specifies the endpoints for the program devices talk to. The +\sphinxtitleref{Application} model contains the following fields: +\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxtitleref{address}: The DNS name or IP address of the endpoint. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{endpoint}: A list of endpoints. Each has the following +fields: +\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxtitleref{name}: Name of the endpoint. Used as a key. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{port\sphinxhyphen{}start}: Starting port number. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{port\sphinxhyphen{}end}: Ending port number. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{protocol}: Protocol (\sphinxtitleref{TCP|UDP}) for the endpoint. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{mbr.uplink}, \sphinxtitleref{mbr.downlink}: Maximum bitrate for devices communicating with this +application. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{traffic\sphinxhyphen{}class}: Traffic class for devices communicating with this application. + +\end{itemize} + +\item {} +\sphinxAtStartPar +\sphinxtitleref{enterprise}: Link to an \sphinxtitleref{Enterprise} object that owns this +application. May be left empty to indicate a global application that +may be used by multiple enterprises. + +\end{itemize} + +\sphinxAtStartPar +Note that Aether’s \sphinxstyleemphasis{Slice} abstraction is similar to 3GPP’s +specification of a “slice”, but the \sphinxtitleref{Slice} model includes a +combination of 3GPP\sphinxhyphen{}specified identifiers (e.g., \sphinxtitleref{sst} and \sphinxtitleref{sd}), and +details about the underlying implementation (e.g., \sphinxtitleref{upf} denotes the +UPF implementation for the Core’s user plane). The \sphinxtitleref{Slice} model also +includes fields related to RAN slicing, with the Service Orchestrator +responsible for stitching together end\sphinxhyphen{}to\sphinxhyphen{}end connectivity across the +RAN, Core, and Fabric. + + +\subsection{6.4.3 QoS Profiles} +\label{\detokenize{cloud:qos-profiles}} +\sphinxAtStartPar +Associated with each Slice is a QoS\sphinxhyphen{}related profile that governs how +traffic carried by that slice is to be treated. This starts with a +\sphinxtitleref{Template} model, which defines the valid (accepted) connectivity +settings. The Aether Operations team is responsible for defining these (the +features they offer must be supported by the backend subsystems), with +enterprises selecting the template they want applied to any instances +of the connectivity service they create (e.g., via a drop\sphinxhyphen{}down +menu). That is, templates are used to initialize \sphinxtitleref{Slice} objects. The +\sphinxtitleref{Template} model has the following fields: +\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxtitleref{sst}, \sphinxtitleref{sd}: Slice identifiers, as specified by 3GPP. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{mbr.uplink}, \sphinxtitleref{mbr.downlink}: Maximum uplink and downlink bandwidth. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{mbr.uplink\sphinxhyphen{}burst\sphinxhyphen{}size}, \sphinxtitleref{mbr.downlink\sphinxhyphen{}burst\sphinxhyphen{}size}: Maximum burst size. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{traffic\sphinxhyphen{}class}: Link to a \sphinxtitleref{Traffic\sphinxhyphen{}Class} object that describes the +type of traffic. + +\end{itemize} + +\sphinxAtStartPar +You will see that the \sphinxtitleref{Device\sphinxhyphen{}Group} and \sphinxtitleref{Application} models include +similar fields. The idea is that QoS parameters are established for +the slice as a whole (based on the selected \sphinxtitleref{Template}) and then +individual devices and applications connected to that slice can define +their own, more\sphinxhyphen{}restrictive QoS parameters on an instance\sphinxhyphen{}by\sphinxhyphen{}instance +basis. + +\sphinxAtStartPar +Finally, the \sphinxtitleref{Traffic\sphinxhyphen{}Class} model specifies the classes of traffic, +and includes the following fields: +\begin{itemize} +\item {} +\sphinxAtStartPar +\sphinxtitleref{arp}: Allocation and retention priority. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{qci}: QoS class identifier. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{pelr}: Packet error loss rate. + +\item {} +\sphinxAtStartPar +\sphinxtitleref{pdb}: Packet delay budget. + +\end{itemize} + + +\subsection{6.4.4 Other Models} +\label{\detokenize{cloud:other-models}} +\sphinxAtStartPar +The above description references other models, which we do not fully +describe here. They include \sphinxtitleref{AP\sphinxhyphen{}List}, which specifies a list of +access points (radios); \sphinxtitleref{IP\sphinxhyphen{}Domain}, which specifies IP and DNS +settings; and \sphinxtitleref{UPF}, which specifies the User Plane Function (the data +plane element of the SD\sphinxhyphen{}Core) that is to forward packets on behalf of +this particular instance of the connectivity service. The \sphinxtitleref{UPF} model +is necessary because Aether supports two different implementations: +one runs as a microservice on a server and the other runs as a P4 +program loaded into the switching fabric. Both implementations are +described in Chapter 5. + + +\chapter{About The Book} +\label{\detokenize{README:about-the-book}}\label{\detokenize{README::doc}} +\sphinxAtStartPar +Source for \sphinxstyleemphasis{Private 5G: A Systems Approach} is available +on GitHub under +terms of the \sphinxhref{https://creativecommons.org/licenses/by-nc-nd/4.0}{Creative Commons (CC BY\sphinxhyphen{}NC\sphinxhyphen{}ND 4.0)} license. The +community is invited to contribute corrections, improvements, updates, +and new material under the same terms. While this license does not +automatically grant the right to make derivative works, we are keen to +discuss derivative works (such as translations) with interested +parties. Please reach out to \sphinxhref{mailto:discuss@systemsapproach.org}{discuss@systemsapproach.org}. + +\sphinxAtStartPar +If you make use of this work, the attribution should include the +following information: + +\begin{DUlineblock}{0em} +\item[] \sphinxstyleemphasis{Title: Private 5G: A Systems Approach} +\item[] \sphinxstyleemphasis{Authors: Larry Peterson, Oguz Sunay, and Bruce Davie} +\item[] \sphinxstyleemphasis{Source:} \sphinxurl{https://github.com/SystemsApproach/private5g} +\item[] \sphinxstyleemphasis{License:} \sphinxhref{https://creativecommons.org/licenses/by-nc-nd/4.0}{CC BY\sphinxhyphen{}NC\sphinxhyphen{}ND 4.0} +\end{DUlineblock} + +\sphinxAtStartPar +This book incorporates introductory and background content from: + +\begin{DUlineblock}{0em} +\item[] \sphinxstyleemphasis{Title: 5G Mobile Networks: A Systems Approach} +\item[] \sphinxstyleemphasis{Authors: Larry Peterson and Oguz Sunay} +\item[] \sphinxstyleemphasis{Source:} \sphinxurl{https://github.com/SystemsApproach/5g} +\item[] \sphinxstyleemphasis{License:} \sphinxhref{https://creativecommons.org/licenses/by-nc-nd/4.0}{CC BY\sphinxhyphen{}NC\sphinxhyphen{}ND 4.0} +\end{DUlineblock} + +\sphinxAtStartPar +a version of which was also published by Morgan \& Claypool in 2020 +as part of their Synthesis Lectures on Network Systems. + +\sphinxAtStartPar +Designations used by companies to distinguish their products are often +claimed as trademarks or registered trademarks. In all instances in +which Systems Approach, LLC, is aware of a claim, the product names +appear in initial capital or all capital letters. Readers, however, +should contact the appropriate companies for more complete information +regarding trademarks and registration. + + +\section{Read the Book} +\label{\detokenize{README:read-the-book}} +\sphinxAtStartPar +This book is part of the \sphinxhref{https://www.systemsapproach.org}{Systems Approach Series}, with an online version published at +\sphinxhref{https://5g.systemsapproach.org}{https://5G.systemsapproach.org}. + +\sphinxAtStartPar +For those users looking for our earlier 5G book, \sphinxstyleemphasis{5G Mobile Networks: +A Systems Approach}, published as this URL, you can still find source +for it archived on \sphinxhref{https://github.com/SystemsApproach/5g}{GitHub}. +This new book incorporates the background material covered in the old +one, plus goes into significant detail about how Private 5G is +implemented and deployed as a managed cloud service. + +\sphinxAtStartPar +To track progress and receive notices about new versions, you can follow +the project on +\sphinxhref{https://www.facebook.com/Computer-Networks-A-Systems-Approach-110933578952503/}{Facebook} +and \sphinxhref{https://discuss.systems/@SystemsAppr}{Mastodon}. To read a running +commentary on how the Internet is evolving, follow the \sphinxhref{https://systemsapproach.substack.com}{Systems Approach +on Substack}. + + +\section{Build the Book} +\label{\detokenize{README:build-the-book}} +\sphinxAtStartPar +To build a web\sphinxhyphen{}viewable version, you first need to download the source: + +\begin{sphinxVerbatim}[commandchars=\\\{\}] +\PYGZdl{} mkdir \PYGZti{}/systemsapproach +\PYGZdl{} cd \PYGZti{}/systemsapproach +\PYGZdl{} git clone https://github.com/SystemsApproach/private5g.git +\PYGZdl{} cd private5g +\end{sphinxVerbatim} + +\sphinxAtStartPar +The build process is stored in the Makefile and requires Python be +installed. The Makefile will create a virtualenv (\sphinxcode{\sphinxupquote{venv\sphinxhyphen{}docs}}) which +installs the documentation generation toolset. You may also need to +install the \sphinxcode{\sphinxupquote{enchant}} C library using your system’s package manager +for the spelling checker to function properly. + +\sphinxAtStartPar +To generate HTML in \sphinxcode{\sphinxupquote{\_build/html}}, run \sphinxcode{\sphinxupquote{make html}}. + +\sphinxAtStartPar +To check the formatting of the book, run \sphinxcode{\sphinxupquote{make lint}}. + +\sphinxAtStartPar +To check spelling, run \sphinxcode{\sphinxupquote{make spelling}}. If there are additional +words, names, or acronyms that are correctly spelled but not in the dictionary, +please add them to the \sphinxcode{\sphinxupquote{dict.txt}} file. + +\sphinxAtStartPar +To see the other available output formats, run \sphinxcode{\sphinxupquote{make}}. + + +\section{Contribute to the Book} +\label{\detokenize{README:contribute-to-the-book}} +\sphinxAtStartPar +We hope that if you use this material, you are also willing to +contribute back to it. If you are new to open source, you might check +out this \sphinxhref{https://opensource.guide/how-to-contribute/}{How to Contribute to Open +Source} guide. Among +other things, you’ll learn about posting \sphinxstyleemphasis{Issues} that you’d like to see +addressed, and issuing \sphinxstyleemphasis{Pull Requests} to merge your improvements back +into GitHub. + +\sphinxAtStartPar +If you’d like to contribute and are looking for something that needs +attention, see the \sphinxhref{https://github.com/SystemsApproach/private5g/wiki}{wiki} +for the current TODO list. + + +\chapter{About The Authors} +\label{\detokenize{authors:about-the-authors}}\label{\detokenize{authors::doc}} +\sphinxAtStartPar +\sphinxstylestrong{Larry Peterson} is the Robert E. Kahn Professor of Computer +Science, Emeritus at Princeton University, where he served as Chair +from 2003\sphinxhyphen{}2009. His research focuses on the design, implementation, +and operation of Internet\sphinxhyphen{}scale distributed systems, including the +widely used PlanetLab and MeasurementLab platforms. He is currently +contributing to the Aether access\sphinxhyphen{}edge cloud project at the Open +Networking Foundation (ONF), where he serves as Chief Scientist. +Peterson is a member of the National Academy of Engineering, a Fellow +of the ACM and the IEEE, the 2010 recipient of the IEEE Kobayashi +Computer and Communication Award, and the 2013 recipient of the ACM +SIGCOMM Award. He received his Ph.D. degree from Purdue University. + +\sphinxAtStartPar +\sphinxstylestrong{Oguz Sunay} is Chief Architect for the Network and Edge Group (NEX) +at Intel, which he joined as part of Intel’s acquisition of the Open +Networking Foundation (ONF) engineering team. While at ONF, he was +Vice President for Research \& Development, where led all +mobile\sphinxhyphen{}related projects. Before joining ONF, Sunay was the CTO at +Argela\sphinxhyphen{}USA, where he was the innovator of a Programmable Radio Access +Network Architecture (ProgRAN) for 5G that enabled the world’s first +dynamically programmable RAN slicing solution. He has also held prior +industry positions at Nokia Research Center and Bell Laboratories, +where he focused on 3G and 4G end\sphinxhyphen{}to\sphinxhyphen{}end systems architectures and +participated and chaired various standardization activities. Sunay has +also spent over 10 years in academia, as a Professor of Electrical and +Computer Engineering. He holds many U.S. and European patents on +various aspects of 3G, 4G, and 5G, and has authored numerous journal +and conference publications. He received his Ph.D. and M.Sc. from +Queen’s University, Canada, and his B.Sc.Hon. from METU, Turkey. + +\sphinxAtStartPar +\sphinxstylestrong{Bruce Davie} is a computer scientist noted for his contributions to +the field of networking. He is a former VP and CTO for the Asia +Pacific region at VMware. He joined VMware during the acquisition of +Software Defined Networking (SDN) startup Nicira. Prior to that, he +was a Fellow at Cisco Systems, leading a team of architects +responsible for Multiprotocol Label Switching (MPLS). Davie has over +30 years of networking industry experience and has co\sphinxhyphen{}authored 17 +RFCs. He was recognized as an ACM Fellow in 2009 and chaired ACM +SIGCOMM from 2009 to 2013. He was also a visiting lecturer at the +Massachusetts Institute of Technology for five years. Davie is the +author of multiple books and the holder of more than 40 U.S. Patents. + +\renewcommand{\indexname}{Index} +\printindex +\end{document} \ No newline at end of file diff --git a/book.toc b/book.toc new file mode 100644 index 0000000..0c11139 --- /dev/null +++ b/book.toc @@ -0,0 +1,56 @@ +\babel@toc {english}{}\relax +\contentsline {chapter}{\numberline {1}Chapter 1: Introduction}{5}{chapter.1}% +\contentsline {section}{\numberline {1.1}1.1 Standardization Landscape}{6}{section.1.1}% +\contentsline {section}{\numberline {1.2}1.2 Access Networks}{7}{section.1.2}% +\contentsline {section}{\numberline {1.3}1.3 Managed Cloud Service}{8}{section.1.3}% +\contentsline {section}{\numberline {1.4}1.4 Beyond 5G}{11}{section.1.4}% +\contentsline {chapter}{\numberline {2}Chapter 2: Architecture}{13}{chapter.2}% +\contentsline {section}{\numberline {2.1}2.1 Overview}{13}{section.2.1}% +\contentsline {section}{\numberline {2.2}2.2 Radio Transmission}{16}{section.2.2}% +\contentsline {section}{\numberline {2.3}2.3 Radio Access Network}{17}{section.2.3}% +\contentsline {section}{\numberline {2.4}2.4 Mobile Core}{20}{section.2.4}% +\contentsline {section}{\numberline {2.5}2.5 Managed Cloud Service}{23}{section.2.5}% +\contentsline {chapter}{\numberline {3}Chapter 3: Radio Transmission}{25}{chapter.3}% +\contentsline {section}{\numberline {3.1}3.1 Coding and Modulation}{25}{section.3.1}% +\contentsline {section}{\numberline {3.2}3.2 Scheduler}{27}{section.3.2}% +\contentsline {subsection}{\numberline {3.2.1}3.2.1 Multiplexing in 4G}{28}{subsection.3.2.1}% +\contentsline {subsection}{\numberline {3.2.2}3.2.2 Multiplexing in 5G}{29}{subsection.3.2.2}% +\contentsline {section}{\numberline {3.3}3.3 Virtualized Scheduler (Slicing)}{31}{section.3.3}% +\contentsline {section}{\numberline {3.4}3.4 New Use Cases}{32}{section.3.4}% +\contentsline {chapter}{\numberline {4}Chapter 4: Radio Access Network}{35}{chapter.4}% +\contentsline {section}{\numberline {4.1}4.1 Packet Processing Pipeline}{35}{section.4.1}% +\contentsline {section}{\numberline {4.2}4.2 Split RAN}{36}{section.4.2}% +\contentsline {section}{\numberline {4.3}4.3 Software\sphinxhyphen {}Defined RAN}{39}{section.4.3}% +\contentsline {section}{\numberline {4.4}4.4 Near Real\sphinxhyphen {}Time RIC}{42}{section.4.4}% +\contentsline {section}{\numberline {4.5}4.5 Control Loops}{44}{section.4.5}% +\contentsline {chapter}{\numberline {5}Chapter 5: Mobile Core}{47}{chapter.5}% +\contentsline {section}{\numberline {5.1}5.1 Identity Management}{47}{section.5.1}% +\contentsline {section}{\numberline {5.2}5.2 Functional Components}{49}{section.5.2}% +\contentsline {section}{\numberline {5.3}5.3 Control Plane}{51}{section.5.3}% +\contentsline {subsection}{\numberline {5.3.1}5.3.1 SD\sphinxhyphen {}Core}{51}{subsection.5.3.1}% +\contentsline {subsection}{\numberline {5.3.2}5.3.2 Magma}{52}{subsection.5.3.2}% +\contentsline {section}{\numberline {5.4}5.4 User Plane}{56}{section.5.4}% +\contentsline {subsection}{\numberline {5.4.1}5.4.1 Microservice Implementation}{57}{subsection.5.4.1}% +\contentsline {subsection}{\numberline {5.4.2}5.4.2 P4 Implementation}{57}{subsection.5.4.2}% +\contentsline {chapter}{\numberline {6}Chapter 6: Managed Cloud Service}{61}{chapter.6}% +\contentsline {section}{\numberline {6.1}6.1 Building Blocks}{61}{section.6.1}% +\contentsline {section}{\numberline {6.2}6.2 Example Deployment}{64}{section.6.2}% +\contentsline {subsection}{\numberline {6.2.1}6.2.1 Edge Cloud}{64}{subsection.6.2.1}% +\contentsline {subsection}{\numberline {6.2.2}6.2.2 Hybrid Cloud}{65}{subsection.6.2.2}% +\contentsline {subsection}{\numberline {6.2.3}6.2.3 Stakeholders}{66}{subsection.6.2.3}% +\contentsline {subsection}{\numberline {6.2.4}6.2.4 Alternative Configurations}{66}{subsection.6.2.4}% +\contentsline {section}{\numberline {6.3}6.3 Cloud Management Platform}{67}{section.6.3}% +\contentsline {subsection}{\numberline {6.3.1}6.3.1 Resource Provisioning}{69}{subsection.6.3.1}% +\contentsline {subsection}{\numberline {6.3.2}6.3.2 Lifecycle Management}{70}{subsection.6.3.2}% +\contentsline {subsection}{\numberline {6.3.3}6.3.3 Service Orchestration}{71}{subsection.6.3.3}% +\contentsline {subsection}{\numberline {6.3.4}6.3.4 Monitoring and Telemetry}{73}{subsection.6.3.4}% +\contentsline {section}{\numberline {6.4}6.4 Connectivity API}{74}{section.6.4}% +\contentsline {subsection}{\numberline {6.4.1}6.4.1 Enterprises}{74}{subsection.6.4.1}% +\contentsline {subsection}{\numberline {6.4.2}6.4.2 Slices}{75}{subsection.6.4.2}% +\contentsline {subsection}{\numberline {6.4.3}6.4.3 QoS Profiles}{76}{subsection.6.4.3}% +\contentsline {subsection}{\numberline {6.4.4}6.4.4 Other Models}{77}{subsection.6.4.4}% +\contentsline {chapter}{\numberline {7}About The Book}{79}{chapter.7}% +\contentsline {section}{\numberline {7.1}Read the Book}{80}{section.7.1}% +\contentsline {section}{\numberline {7.2}Build the Book}{80}{section.7.2}% +\contentsline {section}{\numberline {7.3}Contribute to the Book}{80}{section.7.3}% +\contentsline {chapter}{\numberline {8}About The Authors}{81}{chapter.8}% diff --git a/latexmkjarc b/latexmkjarc new file mode 100644 index 0000000..6e36b19 --- /dev/null +++ b/latexmkjarc @@ -0,0 +1,22 @@ +$latex = 'pdflatex ' . $ENV{'LATEXOPTS'} . ' -kanji=utf8 %O %S'; +$dvipdf = 'dvipdfmx %O -o %D %S'; +$makeindex = 'internal mendex %S %B %D'; +sub mendex { + my ($source, $basename, $destination) = @_; + my $dictfile = $basename . ".dic"; + unlink($destination); + system("mendex", "-U", "-f", "-d", $dictfile, "-s", "python.ist", $source); + if ($? > 0) { + print("mendex exited with error code $? (ignored)\n"); + } + if (!-e $destination) { + # create an empty .ind file if nothing + open(FH, ">" . $destination); + close(FH); + } + return 0; +} +add_cus_dep( "glo", "gls", 0, "makeglo" ); +sub makeglo { + return system( "mendex -J -f -s gglo.ist -o '$_[0].gls' '$_[0].glo'" ); +} \ No newline at end of file diff --git a/latexmkrc b/latexmkrc new file mode 100644 index 0000000..bba17fa --- /dev/null +++ b/latexmkrc @@ -0,0 +1,9 @@ +$latex = 'latex ' . $ENV{'LATEXOPTS'} . ' %O %S'; +$pdflatex = 'pdflatex ' . $ENV{'LATEXOPTS'} . ' %O %S'; +$lualatex = 'lualatex ' . $ENV{'LATEXOPTS'} . ' %O %S'; +$xelatex = 'xelatex --no-pdf ' . $ENV{'LATEXOPTS'} . ' %O %S'; +$makeindex = 'makeindex -s python.ist %O -o %D %S'; +add_cus_dep( "glo", "gls", 0, "makeglo" ); +sub makeglo { + return system( "makeindex -s gglo.ist -o '$_[0].gls' '$_[0].glo'" ); +} \ No newline at end of file diff --git a/make.bat b/make.bat new file mode 100644 index 0000000..94bda21 --- /dev/null +++ b/make.bat @@ -0,0 +1,31 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +pushd %~dp0 + +set PDFLATEX=latexmk -pdf -dvi- -ps- + +set "LATEXOPTS= " + +if "%1" == "" goto all-pdf + +if "%1" == "all-pdf" ( + :all-pdf + for %%i in (*.tex) do ( + %PDFLATEX% %LATEXMKOPTS% %%i + ) + goto end +) + +if "%1" == "all-pdf-ja" ( + goto all-pdf +) + +if "%1" == "clean" ( + del /q /s *.dvi *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla *.ps *.tar *.tar.gz *.tar.bz2 *.tar.xz *.fls *.fdb_latexmk + goto end +) + +:end +popd \ No newline at end of file diff --git a/peru_deploy_labelled.jpg b/peru_deploy_labelled.jpg new file mode 100644 index 0000000..25b87a9 Binary files /dev/null and b/peru_deploy_labelled.jpg differ diff --git a/proxmox.png b/proxmox.png new file mode 100644 index 0000000..5988a83 Binary files /dev/null and b/proxmox.png differ diff --git a/python.ist b/python.ist new file mode 100644 index 0000000..70536a6 --- /dev/null +++ b/python.ist @@ -0,0 +1,16 @@ +line_max 100 +headings_flag 1 +heading_prefix " \\bigletter " + +preamble "\\begin{sphinxtheindex} +\\let\\bigletter\\sphinxstyleindexlettergroup +\\let\\spxpagem \\sphinxstyleindexpagemain +\\let\\spxentry \\sphinxstyleindexentry +\\let\\spxextra \\sphinxstyleindexextra + +" + +postamble "\n\n\\end{sphinxtheindex}\n" + +symhead_positive "{\\sphinxsymbolsname}" +numhead_positive "{\\sphinxnumbersname}" diff --git a/sphinx.sty b/sphinx.sty new file mode 100644 index 0000000..4d42199 --- /dev/null +++ b/sphinx.sty @@ -0,0 +1,351 @@ +% +% sphinx.sty +% +% Adapted from the old python.sty, mostly written by Fred Drake, +% by Georg Brandl. +% + +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesPackage{sphinx}[2021/01/27 v4.0.0 LaTeX package (Sphinx markup)] + +% provides \ltx@ifundefined +% (many packages load ltxcmds: graphicx does for pdftex and lualatex but +% not xelatex, and anyhow kvoptions does, but it may be needed in future to +% use \sphinxdeprecationwarning earlier, and it needs \ltx@ifundefined) +\RequirePackage{ltxcmds} + +%% for deprecation warnings +\newcommand\sphinxdeprecationwarning[4]{% #1 the deprecated macro or name, +% #2 = when deprecated, #3 = when removed, #4 = additional info + \edef\spx@tempa{\detokenize{#1}}% + \ltx@ifundefined{sphinx_depr_\spx@tempa}{% + \global\expandafter\let\csname sphinx_depr_\spx@tempa\endcsname\spx@tempa + \expandafter\AtEndDocument\expandafter{\expandafter\let\expandafter + \sphinxdeprecatedmacro\csname sphinx_depr_\spx@tempa\endcsname + \PackageWarningNoLine{sphinx}{^^J**** SPHINX DEPRECATION WARNING:^^J + \sphinxdeprecatedmacro^^J + \@spaces- is deprecated at Sphinx #2^^J + \@spaces- and removed at Sphinx #3.^^J + #4^^J****}}% + }{% warning already emitted (at end of latex log), don't repeat + }} + + +%% OPTION HANDLING +% + +% We first handle options then load packages, but we need \definecolor from +% xcolor/color. + +% FIXME: we should \RequirePackage{xcolor} always now +% The xcolor package draws better fcolorboxes around verbatim code +\IfFileExists{xcolor.sty}{ + \RequirePackage{xcolor} +}{ + \RequirePackage{color} +} + +% Handle options via "kvoptions" (later loaded by hyperref anyhow) +\RequirePackage{kvoptions} +\SetupKeyvalOptions{prefix=spx@opt@} % use \spx@opt@ prefix + +% Sphinx legacy text layout: 1in margins on all four sides +\ifx\@jsc@uplatextrue\@undefined +\DeclareStringOption[1in]{hmargin} +\DeclareStringOption[1in]{vmargin} +\DeclareStringOption[.5in]{marginpar} +\else +% Japanese standard document classes handle \mag in a special way +\DeclareStringOption[\inv@mag in]{hmargin} +\DeclareStringOption[\inv@mag in]{vmargin} +\DeclareStringOption[.5\dimexpr\inv@mag in\relax]{marginpar} +\fi + +\DeclareStringOption[0]{maxlistdepth}% \newcommand*\spx@opt@maxlistdepth{0} +\DeclareStringOption[-1]{numfigreset} +\DeclareBoolOption[false]{nonumfigreset} +\DeclareBoolOption[false]{mathnumfig} +\define@key{sphinx}{bookmarksdepth}{\AtBeginDocument{\hypersetup{bookmarksdepth=#1}}} +\AtBeginDocument{\define@key{sphinx}{bookmarksdepth}{\hypersetup{bookmarksdepth=#1}}} +% \DeclareBoolOption[false]{usespart}% not used +% dimensions, we declare the \dimen registers here. +\newdimen\sphinxverbatimsep +\newdimen\sphinxverbatimborder +\newdimen\sphinxshadowsep +\newdimen\sphinxshadowsize +\newdimen\sphinxshadowrule +% \DeclareStringOption is not convenient for the handling of these dimensions +% because we want to assign the values to the corresponding registers. Even if +% we added the code to the key handler it would be too late for the initial +% set-up and we would need to do initial assignments explicitly. We end up +% using \define@key directly. +% verbatim +\sphinxverbatimsep=\fboxsep + \define@key{sphinx}{verbatimsep}{\sphinxverbatimsep\dimexpr #1\relax} +\sphinxverbatimborder=\fboxrule + \define@key{sphinx}{verbatimborder}{\sphinxverbatimborder\dimexpr #1\relax} +% topic boxes +\sphinxshadowsep =5pt + \define@key{sphinx}{shadowsep}{\sphinxshadowsep\dimexpr #1\relax} +\sphinxshadowsize=4pt + \define@key{sphinx}{shadowsize}{\sphinxshadowsize\dimexpr #1\relax} +\sphinxshadowrule=\fboxrule + \define@key{sphinx}{shadowrule}{\sphinxshadowrule\dimexpr #1\relax} +% verbatim +\DeclareBoolOption[true]{verbatimwithframe} +\DeclareBoolOption[true]{verbatimwrapslines} +\DeclareBoolOption[false]{verbatimforcewraps} +\DeclareStringOption[3]{verbatimmaxoverfull} +\DeclareStringOption[100]{verbatimmaxunderfull} +\DeclareBoolOption[true]{verbatimhintsturnover} +\DeclareBoolOption[true]{inlineliteralwraps} +\DeclareStringOption[t]{literalblockcappos} +\DeclareStringOption[r]{verbatimcontinuedalign} +\DeclareStringOption[r]{verbatimcontinuesalign} +% parsed literal +\DeclareBoolOption[true]{parsedliteralwraps} +% \textvisiblespace for compatibility with fontspec+XeTeX/LuaTeX +\DeclareStringOption[\textcolor{red}{\textvisiblespace}]{verbatimvisiblespace} +\DeclareStringOption % must use braces to hide the brackets + [{\makebox[2\fontcharwd\font`\x][r]{\textcolor{red}{\tiny$\m@th\hookrightarrow$}}}]% + {verbatimcontinued} +% notices/admonitions +% the dimensions for notices/admonitions are kept as macros and assigned to +% \spx@notice@border at time of use, hence \DeclareStringOption is ok for this +\newdimen\spx@notice@border +\DeclareStringOption[0.5pt]{noteborder} +\DeclareStringOption[0.5pt]{hintborder} +\DeclareStringOption[0.5pt]{importantborder} +\DeclareStringOption[0.5pt]{tipborder} +\DeclareStringOption[1pt]{warningborder} +\DeclareStringOption[1pt]{cautionborder} +\DeclareStringOption[1pt]{attentionborder} +\DeclareStringOption[1pt]{dangerborder} +\DeclareStringOption[1pt]{errorborder} +% footnotes +\DeclareStringOption[\mbox{ }]{AtStartFootnote} +% we need a public macro name for direct use in latex file +\newcommand*{\sphinxAtStartFootnote}{\spx@opt@AtStartFootnote} +% no such need for this one, as it is used inside other macros +\DeclareStringOption[\leavevmode\unskip]{BeforeFootnote} +% some font styling. +\DeclareStringOption[\sffamily\bfseries]{HeaderFamily} +% colours +% same problems as for dimensions: we want the key handler to use \definecolor. +% first, some colours with no prefix, for backwards compatibility +\newcommand*{\sphinxDeclareColorOption}[2]{% + \definecolor{#1}#2% + \define@key{sphinx}{#1}{\definecolor{#1}##1}% +}% +\sphinxDeclareColorOption{TitleColor}{{rgb}{0.126,0.263,0.361}} +\sphinxDeclareColorOption{InnerLinkColor}{{rgb}{0.208,0.374,0.486}} +\sphinxDeclareColorOption{OuterLinkColor}{{rgb}{0.216,0.439,0.388}} +\sphinxDeclareColorOption{VerbatimColor}{{rgb}{1,1,1}} +\sphinxDeclareColorOption{VerbatimBorderColor}{{rgb}{0,0,0}} +% now the colours defined with "sphinx" prefix in their names +\newcommand*{\sphinxDeclareSphinxColorOption}[2]{% + % set the initial default + \definecolor{sphinx#1}#2% + % set the key handler. The "value" ##1 must be acceptable by \definecolor. + \define@key{sphinx}{#1}{\definecolor{sphinx#1}##1}% +}% +% Default color chosen to be as in minted.sty LaTeX package! +\sphinxDeclareSphinxColorOption{VerbatimHighlightColor}{{rgb}{0.878,1,1}} +% admonition boxes, "light" style +\sphinxDeclareSphinxColorOption{noteBorderColor}{{rgb}{0,0,0}} +\sphinxDeclareSphinxColorOption{hintBorderColor}{{rgb}{0,0,0}} +\sphinxDeclareSphinxColorOption{importantBorderColor}{{rgb}{0,0,0}} +\sphinxDeclareSphinxColorOption{tipBorderColor}{{rgb}{0,0,0}} +% admonition boxes, "heavy" style +\sphinxDeclareSphinxColorOption{warningBorderColor}{{rgb}{0,0,0}} +\sphinxDeclareSphinxColorOption{cautionBorderColor}{{rgb}{0,0,0}} +\sphinxDeclareSphinxColorOption{attentionBorderColor}{{rgb}{0,0,0}} +\sphinxDeclareSphinxColorOption{dangerBorderColor}{{rgb}{0,0,0}} +\sphinxDeclareSphinxColorOption{errorBorderColor}{{rgb}{0,0,0}} +\sphinxDeclareSphinxColorOption{warningBgColor}{{rgb}{1,1,1}} +\sphinxDeclareSphinxColorOption{cautionBgColor}{{rgb}{1,1,1}} +\sphinxDeclareSphinxColorOption{attentionBgColor}{{rgb}{1,1,1}} +\sphinxDeclareSphinxColorOption{dangerBgColor}{{rgb}{1,1,1}} +\sphinxDeclareSphinxColorOption{errorBgColor}{{rgb}{1,1,1}} + +\DeclareDefaultOption{\@unknownoptionerror} +\ProcessKeyvalOptions* +% don't allow use of maxlistdepth via \sphinxsetup. +\DisableKeyvalOption{sphinx}{maxlistdepth} +\DisableKeyvalOption{sphinx}{numfigreset} +\DisableKeyvalOption{sphinx}{nonumfigreset} +\DisableKeyvalOption{sphinx}{mathnumfig} +% FIXME: this is unrelated to an option, move this elsewhere +% To allow hyphenation of first word in narrow contexts; no option, +% customization to be done via 'preamble' key +\newcommand*\sphinxAtStartPar{\leavevmode\nobreak\hskip\z@skip} +% No need for the \hspace{0pt} trick (\hskip\z@skip) with luatex +\ifdefined\directlua\let\sphinxAtStartPar\@empty\fi +% user interface: options can be changed midway in a document! +\newcommand\sphinxsetup[1]{\setkeys{sphinx}{#1}} + + +%% MISCELLANEOUS CONTEXT +% +% flag to be set in a framed environment +% (defined here as currently needed by three sphinxlatex....sty files and +% even if not needed if such files are replaced, the definition does no harm) +\newif\ifspx@inframed +% +% \spx@ifcaptionpackage (defined at begin document) +% is needed currently in macros from: +% sphinxlatexliterals.sty (sphinxVerbatim) +% sphinxlatextables.sty (for some macros used in the table templates) +% +% \sphinxcaption is mark-up injected by the tabular and tabulary templates +% it is defined in sphinxlatextables.sty +% +% store the original \caption macro for usage with figures inside longtable +% and tabulary cells. Make sure we get the final \caption in presence of +% caption package, whether the latter was loaded before or after sphinx. +\AtBeginDocument{% + \let\spx@originalcaption\caption + \@ifpackageloaded{caption} + {\let\spx@ifcaptionpackage\@firstoftwo + \caption@AtBeginDocument*{\let\spx@originalcaption\caption}% +% in presence of caption package, drop our own \sphinxcaption whose aim was to +% ensure same width of caption to all kinds of tables (tabular(y), longtable), +% because caption package has its own width (or margin) option + \def\sphinxcaption{\caption}% + }% + {\let\spx@ifcaptionpackage\@secondoftwo}% +} + +%% PASS OPTIONS +% +% pass options to hyperref; it must not have been loaded already +\input{sphinxoptionshyperref.sty} +% pass options to geometry; it must not have been loaded already +\input{sphinxoptionsgeometry.sty} + + +%% COLOR (general) +% +% FIXME: these two should be deprecated +% +% FIXME: \normalcolor should be used and \py@NormalColor never defined +\def\py@NormalColor{\color{black}} +% FIXME: \color{TitleColor} should be used directly and \py@TitleColor +% should never get defined. +\def\py@TitleColor{\color{TitleColor}} + + +%% PACKAGES +% +% as will be indicated below, secondary style files load some more packages +% +% For \text macro (sphinx.util.texescape) +% also for usage of \firstchoice@true(false) in sphinxlatexgraphics.sty +\RequirePackage{amstext} +% It was passed "warn" option from latex template in case it is already loaded +% via some other package before \usepackage{sphinx} in preamble +\RequirePackage{textcomp} +% For the H specifier. Do not \restylefloat{figure}, it breaks Sphinx code +% for allowing figures in tables. +\RequirePackage{float} +% For floating figures in the text. Better to load after float. +\RequirePackage{wrapfig} +% Provides \captionof, used once by latex writer (\captionof{figure}) +\RequirePackage{capt-of} +% Support hlist directive +\RequirePackage{multicol} + + +%% GRAPHICS +% +% It will always be needed, so let's load it here +\RequirePackage{graphicx} +\input{sphinxlatexgraphics.sty} + + +%% FRAMED ENVIRONMENTS +% +\input{sphinxlatexadmonitions.sty} +\input{sphinxlatexliterals.sty} +\input{sphinxlatexshadowbox.sty} + + +%% CONTAINERS +% +\input{sphinxlatexcontainers.sty} + + +%% PYGMENTS +% stylesheet for highlighting with pygments +\RequirePackage{sphinxhighlight} + + +%% TABLES +% +\input{sphinxlatextables.sty} + + +%% NUMBERING OF FIGURES, TABLES, AND LITERAL BLOCKS +% +\input{sphinxlatexnumfig.sty} + + +%% LISTS +% +\input{sphinxlatexlists.sty} + + +%% FOOTNOTES +% +% Support scopes for footnote numbering +\newcounter{sphinxscope} +\newcommand{\sphinxstepscope}{\stepcounter{sphinxscope}} +% Explicitly numbered footnotes may be referred to, and for this to be +% clickable we need to have only one target. So we will step this at each +% explicit footnote and let \thesphinxscope take it into account +\newcounter{sphinxexplicit} +\newcommand{\sphinxstepexplicit}{\stepcounter{sphinxexplicit}} +% Some babel/polyglossia languages fiddle with \@arabic, so let's be extra +% cautious and redefine \thesphinxscope with \number not \@arabic. +% Memo: we expect some subtle redefinition of \thesphinxscope to be a part of page +% scoping for footnotes, when we shall implement it. +\renewcommand{\thesphinxscope}{\number\value{sphinxscope}.\number\value{sphinxexplicit}} +\newcommand\sphinxthefootnotemark[2]{% + % this is used to make reference to an explicitly numbered footnote not on same page + % #1=label of footnote text, #2=page number where footnote text was printed + \ifdefined\pagename + \pagename\space#2, % <- space + \else + p. #2, % <- space + \fi #1% no space +} +% support large numbered footnotes in minipage; but this is now obsolete +% from systematic use of savenotes environment around minipages +\def\thempfootnote{\arabic{mpfootnote}} +% This package is needed to support hyperlinked footnotes in tables and +% framed contents, and to allow code-blocks in footnotes. +\RequirePackage{sphinxpackagefootnote} + + +%% INDEX, BIBLIOGRAPHY, APPENDIX, TABLE OF CONTENTS +% +\input{sphinxlatexindbibtoc.sty} + + +%% STYLING +% +\input{sphinxlatexstylepage.sty} +\input{sphinxlatexstyleheadings.sty} +\input{sphinxlatexstyletext.sty} + + +%% MODULE RELEASE DATA AND OBJECT DESCRIPTIONS +% +\input{sphinxlatexobjects.sty} + + +% FIXME: this line should be dropped, as "9" is default anyhow. +\ifdefined\pdfcompresslevel\pdfcompresslevel = 9 \fi + + +\endinput diff --git a/sphinx.xdy b/sphinx.xdy new file mode 100644 index 0000000..0dcf113 --- /dev/null +++ b/sphinx.xdy @@ -0,0 +1,230 @@ +;;; -*- mode: lisp; coding: utf-8; -*- + +;; Unfortunately xindy is out-of-the-box hyperref-incompatible. This +;; configuration is a workaround, which requires to pass option +;; hyperindex=false to hyperref. +;; textit and emph not currently used, spxpagem replaces former textbf +(define-attributes (("textbf" "textit" "emph" "spxpagem" "default"))) +(markup-locref :open "\textbf{\hyperpage{" :close "}}" :attr "textbf") +(markup-locref :open "\textit{\hyperpage{" :close "}}" :attr "textit") +(markup-locref :open "\emph{\hyperpage{" :close "}}" :attr "emph") +(markup-locref :open "\spxpagem{\hyperpage{" :close "}}" :attr "spxpagem") +(markup-locref :open "\hyperpage{" :close "}" :attr "default") + +(require "numeric-sort.xdy") + +;; xindy base module latex.xdy loads tex.xdy and the latter instructs +;; xindy to ignore **all** TeX macros in .idx entries, except those +;; explicitly described in merge rule. But when after applying all +;; merge rules an empty string results, xindy raises an error: + +;; ERROR: CHAR: index 0 should be less than the length of the string + +;; For example when using pdflatex with utf-8 characters the index +;; file will contain \IeC macros and they will get ignored except if +;; suitable merge rules are loaded early. The texindy script coming +;; with xindy provides this, but only for Latin scripts. The texindy +;; man page says to use rather xelatex or lualatex in case of Cyrillic +;; scripts. + +;; Sphinx contributes LICRcyr2utf8.xdy to provide support for Cyrillic +;; scripts for the pdflatex engine. + +;; Another issue caused by xindy ignoring all TeX macros except those +;; explicitly declared reveals itself when attempting to index ">>>", +;; as the ">" is converted to "\textgreater{}" by Sphinx's LaTeX +;; escaping. + +;; To fix this, Sphinx does **not** use texindy, and does not even +;; load the xindy latex.xdy base module. + +;(require "latex.xdy") + +;; Rather it incorporates some suitable extracts from latex.xdy and +;; tex.xdy with additional Sphinx contributed rules. + +;; But, this means for pdflatex and Latin scripts that the xindy file +;; tex/inputenc/uf8.xdy is not usable because it refers to the macro +;; \IeC only sporadically, and as tex.xdy is not loaded, a rule such as +;; (merge-rule "\'e" "é" :string) +;; does not work, it must be +;; (merge-rule "\IeC {\'e}" "é" :string) +;; So Sphinx contributes LICRlatin2utf8.xdy to mitigate that problem. + +;;;;;;;; extracts from tex.xdy (discarding most original comments): + +;;; +;;; TeX conventions +;;; + +;; Discard leading and trailing white space. Collapse multiple white +;; space characters to blank. + +(merge-rule "^ +" "" :eregexp) +(merge-rule " +$" "" :eregexp) +(merge-rule " +" " " :eregexp) + +;; Handle TeX markup + +(merge-rule "\\([{}$%&#])" "\1" :eregexp) + +;;;;;;;; end of extracts from xindy's tex.xdy + +;;;;;;;; extracts from latex.xdy: + +;; Standard location classes: arabic and roman numbers, and alphabets. + +(define-location-class "arabic-page-numbers" ("arabic-numbers")) +(define-location-class "roman-page-numbers" ("roman-numbers-lowercase")) +(define-location-class "Roman-page-numbers" ("roman-numbers-uppercase")) +(define-location-class "alpha-page-numbers" ("alpha")) +(define-location-class "Alpha-page-numbers" ("ALPHA")) + +;; Output Markup + +(markup-letter-group-list :sep "~n~n \indexspace~n") + +(markup-indexentry :open "~n \item " :depth 0) +(markup-indexentry :open "~n \subitem " :depth 1) +(markup-indexentry :open "~n \subsubitem " :depth 2) + +(markup-locclass-list :open ", " :sep ", ") +(markup-locref-list :sep ", ") + +;;;;;;;; end of extracts from latex.xdy + +;; The LaTeX \index command turns \ into normal character so the TeX macros +;; written to .idx files are not followed by a blank. This is different +;; from non-ascii letters which end up (with pdflatex) as \IeC macros in .idx +;; file, with a blank space after \IeC + +;; Details of the syntax are explained at +;; http://xindy.sourceforge.net/doc/manual-3.html +;; In absence of :string, "xindy uses an auto-detection mechanism to decide, +;; if the pattern is a regular expression or not". But it is not obvious to +;; guess, for example "\\_" is not detected as RE but "\\P\{\}" is, so for +;; being sure we apply the :string switch everywhere and do not use \\ etc... + +;; Go back from sphinx.util.texescape TeX macros to UTF-8 + +(merge-rule "\sphinxleftcurlybrace{}" "{" :string) +(merge-rule "\sphinxrightcurlybrace{}" "}" :string) +(merge-rule "\_" "_" :string) +(merge-rule "{[}" "[" :string) +(merge-rule "{]}" "]" :string) +(merge-rule "\textbackslash{}" "\" :string) ; " for Emacs syntax highlighting +(merge-rule "\textasciitilde{}" "~~" :string); the ~~ escape is needed here +(merge-rule "\textasciicircum{}" "^" :string) +(merge-rule "\sphinxhyphen{}" "-" :string) +(merge-rule "\textquotesingle{}" "'" :string) +(merge-rule "\textasciigrave{}" "`" :string) +(merge-rule "\textless{}" "<" :string) +(merge-rule "\textgreater{}" ">" :string) +(merge-rule "\P{}" "¶" :string) +(merge-rule "\S{}" "§" :string) +(merge-rule "\texteuro{}" "€" :string) +(merge-rule "\(\infty\)" "∞" :string) +(merge-rule "\(\pm\)" "±" :string) +(merge-rule "\(\rightarrow\)" "→" :string) +(merge-rule "\(\checkmark\)" "✓" :string) +(merge-rule "\textendash{}" "–" :string) +(merge-rule "\textbar{}" "|" :string) +(merge-rule "\(\sp{\text{0}}\)" "⁰" :string) +(merge-rule "\(\sp{\text{1}}\)" "¹" :string) +(merge-rule "\(\sp{\text{2}}\)" "²" :string) +(merge-rule "\(\sp{\text{3}}\)" "³" :string) +(merge-rule "\(\sp{\text{4}}\)" "⁴" :string) +(merge-rule "\(\sp{\text{5}}\)" "⁵" :string) +(merge-rule "\(\sp{\text{6}}\)" "⁶" :string) +(merge-rule "\(\sp{\text{7}}\)" "⁷" :string) +(merge-rule "\(\sp{\text{8}}\)" "⁸" :string) +(merge-rule "\(\sp{\text{9}}\)" "⁹" :string) +(merge-rule "\(\sb{\text{0}}\)" "₀" :string) +(merge-rule "\(\sb{\text{1}}\)" "₁" :string) +(merge-rule "\(\sb{\text{2}}\)" "₂" :string) +(merge-rule "\(\sb{\text{3}}\)" "₃" :string) +(merge-rule "\(\sb{\text{4}}\)" "₄" :string) +(merge-rule "\(\sb{\text{5}}\)" "₅" :string) +(merge-rule "\(\sb{\text{6}}\)" "₆" :string) +(merge-rule "\(\sb{\text{7}}\)" "₇" :string) +(merge-rule "\(\sb{\text{8}}\)" "₈" :string) +(merge-rule "\(\sb{\text{9}}\)" "₉" :string) +(merge-rule "\IeC {\textalpha }" "α" :string) +(merge-rule "\IeC {\textbeta }" "β" :string) +(merge-rule "\IeC {\textgamma }" "γ" :string) +(merge-rule "\IeC {\textdelta }" "δ" :string) +(merge-rule "\IeC {\textepsilon }" "ε" :string) +(merge-rule "\IeC {\textzeta }" "ζ" :string) +(merge-rule "\IeC {\texteta }" "η" :string) +(merge-rule "\IeC {\texttheta }" "θ" :string) +(merge-rule "\IeC {\textiota }" "ι" :string) +(merge-rule "\IeC {\textkappa }" "κ" :string) +(merge-rule "\IeC {\textlambda }" "λ" :string) +(merge-rule "\IeC {\textmu }" "μ" :string) +(merge-rule "\IeC {\textnu }" "ν" :string) +(merge-rule "\IeC {\textxi }" "ξ" :string) +(merge-rule "\IeC {\textomicron }" "ο" :string) +(merge-rule "\IeC {\textpi }" "π" :string) +(merge-rule "\IeC {\textrho }" "ρ" :string) +(merge-rule "\IeC {\textsigma }" "σ" :string) +(merge-rule "\IeC {\texttau }" "τ" :string) +(merge-rule "\IeC {\textupsilon }" "υ" :string) +(merge-rule "\IeC {\textphi }" "φ" :string) +(merge-rule "\IeC {\textchi }" "χ" :string) +(merge-rule "\IeC {\textpsi }" "ψ" :string) +(merge-rule "\IeC {\textomega }" "ω" :string) +(merge-rule "\IeC {\textAlpha }" "Α" :string) +(merge-rule "\IeC {\textBeta }" "Β" :string) +(merge-rule "\IeC {\textGamma }" "Γ" :string) +(merge-rule "\IeC {\textDelta }" "Δ" :string) +(merge-rule "\IeC {\textEpsilon }" "Ε" :string) +(merge-rule "\IeC {\textZeta }" "Ζ" :string) +(merge-rule "\IeC {\textEta }" "Η" :string) +(merge-rule "\IeC {\textTheta }" "Θ" :string) +(merge-rule "\IeC {\textIota }" "Ι" :string) +(merge-rule "\IeC {\textKappa }" "Κ" :string) +(merge-rule "\IeC {\textLambda }" "Λ" :string) +(merge-rule "\IeC {\textMu }" "Μ" :string) +(merge-rule "\IeC {\textNu }" "Ν" :string) +(merge-rule "\IeC {\textTheta }" "Θ" :string) +(merge-rule "\IeC {\textIota }" "Ι" :string) +(merge-rule "\IeC {\textKappa }" "Κ" :string) +(merge-rule "\IeC {\textLambda }" "Λ" :string) +(merge-rule "\IeC {\textMu }" "Μ" :string) +(merge-rule "\IeC {\textNu }" "Ν" :string) +(merge-rule "\IeC {\textXi }" "Ξ" :string) +(merge-rule "\IeC {\textOmicron }" "Ο" :string) +(merge-rule "\IeC {\textPi }" "Π" :string) +(merge-rule "\IeC {\textRho }" "Ρ" :string) +(merge-rule "\IeC {\textSigma }" "Σ" :string) +(merge-rule "\IeC {\textTau }" "Τ" :string) +(merge-rule "\IeC {\textUpsilon }" "Υ" :string) +(merge-rule "\IeC {\textPhi }" "Φ" :string) +(merge-rule "\IeC {\textChi }" "Χ" :string) +(merge-rule "\IeC {\textPsi }" "Ψ" :string) +(merge-rule "\IeC {\textOmega }" "Ω" :string) +(merge-rule "\IeC {\textohm }" "Ω" :string) + +;; This xindy module provides some basic support for "see" +(require "makeindex.xdy") + +;; This creates one-letter headings and works fine with utf-8 letters. +;; For Cyrillic with pdflatex works thanks to LICRcyr2utf8.xdy +(require "latin-lettergroups.xdy") + +;; currently we don't (know how to easily) separate "Numbers" from +;; "Symbols" with xindy as is the case with makeindex. +(markup-index :open "\begin{sphinxtheindex} +\let\lettergroup\sphinxstyleindexlettergroup +\let\lettergroupDefault\sphinxstyleindexlettergroupDefault +\let\spxpagem\sphinxstyleindexpagemain +\let\spxentry\sphinxstyleindexentry +\let\spxextra\sphinxstyleindexextra + +" + :close " + +\end{sphinxtheindex} +" + :tree) + diff --git a/sphinxhighlight.sty b/sphinxhighlight.sty new file mode 100644 index 0000000..2c619d8 --- /dev/null +++ b/sphinxhighlight.sty @@ -0,0 +1,107 @@ +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesPackage{sphinxhighlight}[2016/05/29 stylesheet for highlighting with pygments] +% Its contents depend on pygments_style configuration variable. + + +\makeatletter +\def\PYG@reset{\let\PYG@it=\relax \let\PYG@bf=\relax% + \let\PYG@ul=\relax \let\PYG@tc=\relax% + \let\PYG@bc=\relax \let\PYG@ff=\relax} +\def\PYG@tok#1{\csname PYG@tok@#1\endcsname} +\def\PYG@toks#1+{\ifx\relax#1\empty\else% + \PYG@tok{#1}\expandafter\PYG@toks\fi} +\def\PYG@do#1{\PYG@bc{\PYG@tc{\PYG@ul{% + \PYG@it{\PYG@bf{\PYG@ff{#1}}}}}}} +\def\PYG#1#2{\PYG@reset\PYG@toks#1+\relax+\PYG@do{#2}} + +\@namedef{PYG@tok@w}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}} +\@namedef{PYG@tok@c}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} +\@namedef{PYG@tok@cp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@cs}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}\def\PYG@bc##1{{\setlength{\fboxsep}{0pt}\colorbox[rgb]{1.00,0.94,0.94}{\strut ##1}}}} +\@namedef{PYG@tok@k}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@kp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@kt}{\def\PYG@tc##1{\textcolor[rgb]{0.56,0.13,0.00}{##1}}} +\@namedef{PYG@tok@o}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\@namedef{PYG@tok@ow}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@nb}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@nf}{\def\PYG@tc##1{\textcolor[rgb]{0.02,0.16,0.49}{##1}}} +\@namedef{PYG@tok@nc}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.05,0.52,0.71}{##1}}} +\@namedef{PYG@tok@nn}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.05,0.52,0.71}{##1}}} +\@namedef{PYG@tok@ne}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@nv}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} +\@namedef{PYG@tok@no}{\def\PYG@tc##1{\textcolor[rgb]{0.38,0.68,0.84}{##1}}} +\@namedef{PYG@tok@nl}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.13,0.44}{##1}}} +\@namedef{PYG@tok@ni}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.84,0.33,0.22}{##1}}} +\@namedef{PYG@tok@na}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@nt}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.02,0.16,0.45}{##1}}} +\@namedef{PYG@tok@nd}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.33,0.33,0.33}{##1}}} +\@namedef{PYG@tok@s}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@sd}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@si}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.44,0.63,0.82}{##1}}} +\@namedef{PYG@tok@se}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@sr}{\def\PYG@tc##1{\textcolor[rgb]{0.14,0.33,0.53}{##1}}} +\@namedef{PYG@tok@ss}{\def\PYG@tc##1{\textcolor[rgb]{0.32,0.47,0.09}{##1}}} +\@namedef{PYG@tok@sx}{\def\PYG@tc##1{\textcolor[rgb]{0.78,0.36,0.04}{##1}}} +\@namedef{PYG@tok@m}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} +\@namedef{PYG@tok@gh}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\@namedef{PYG@tok@gu}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}} +\@namedef{PYG@tok@gd}{\def\PYG@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}} +\@namedef{PYG@tok@gi}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}} +\@namedef{PYG@tok@gr}{\def\PYG@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}} +\@namedef{PYG@tok@ge}{\let\PYG@it=\textit} +\@namedef{PYG@tok@gs}{\let\PYG@bf=\textbf} +\@namedef{PYG@tok@ges}{\let\PYG@bf=\textbf\let\PYG@it=\textit} +\@namedef{PYG@tok@gp}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.78,0.36,0.04}{##1}}} +\@namedef{PYG@tok@go}{\def\PYG@tc##1{\textcolor[rgb]{0.20,0.20,0.20}{##1}}} +\@namedef{PYG@tok@gt}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}} +\@namedef{PYG@tok@err}{\def\PYG@bc##1{{\setlength{\fboxsep}{\string -\fboxrule}\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}}} +\@namedef{PYG@tok@kc}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@kd}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@kn}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@kr}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@bp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@fm}{\def\PYG@tc##1{\textcolor[rgb]{0.02,0.16,0.49}{##1}}} +\@namedef{PYG@tok@vc}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} +\@namedef{PYG@tok@vg}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} +\@namedef{PYG@tok@vi}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} +\@namedef{PYG@tok@vm}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} +\@namedef{PYG@tok@sa}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@sb}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@sc}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@dl}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@s2}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@sh}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@s1}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@mb}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} +\@namedef{PYG@tok@mf}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} +\@namedef{PYG@tok@mh}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} +\@namedef{PYG@tok@mi}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} +\@namedef{PYG@tok@il}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} +\@namedef{PYG@tok@mo}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} +\@namedef{PYG@tok@ch}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} +\@namedef{PYG@tok@cm}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} +\@namedef{PYG@tok@cpf}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} +\@namedef{PYG@tok@c1}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} + +\def\PYGZbs{\char`\\} +\def\PYGZus{\char`\_} +\def\PYGZob{\char`\{} +\def\PYGZcb{\char`\}} +\def\PYGZca{\char`\^} +\def\PYGZam{\char`\&} +\def\PYGZlt{\char`\<} +\def\PYGZgt{\char`\>} +\def\PYGZsh{\char`\#} +\def\PYGZpc{\char`\%} +\def\PYGZdl{\char`\$} +\def\PYGZhy{\char`\-} +\def\PYGZsq{\char`\'} +\def\PYGZdq{\char`\"} +\def\PYGZti{\char`\~} +% for compatibility with earlier versions +\def\PYGZat{@} +\def\PYGZlb{[} +\def\PYGZrb{]} +\makeatother + +\renewcommand\PYGZsq{\textquotesingle} diff --git a/sphinxhowto.cls b/sphinxhowto.cls new file mode 100644 index 0000000..951cf81 --- /dev/null +++ b/sphinxhowto.cls @@ -0,0 +1,102 @@ +% +% sphinxhowto.cls for Sphinx (https://www.sphinx-doc.org/) +% + +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{sphinxhowto}[2019/12/01 v2.3.0 Document class (Sphinx howto)] + +% 'oneside' option overriding the 'twoside' default +\newif\if@oneside +\DeclareOption{oneside}{\@onesidetrue} +% Pass remaining document options to the parent class. +\DeclareOption*{\PassOptionsToClass{\CurrentOption}{\sphinxdocclass}} +\ProcessOptions\relax + +% Default to two-side document +\if@oneside +% nothing to do (oneside is the default) +\else +\PassOptionsToClass{twoside}{\sphinxdocclass} +\fi + +\LoadClass{\sphinxdocclass} + +% Set some sane defaults for section numbering depth and TOC depth. You can +% reset these counters in your preamble. +% +\setcounter{secnumdepth}{2} +\setcounter{tocdepth}{2}% i.e. section and subsection + +% Adapt \and command to the flushright context of \sphinxmaketitle, to +% avoid ragged line endings if author names do not fit all on one single line +\DeclareRobustCommand{\and}{% + \end{tabular}\kern-\tabcolsep + \allowbreak + \hskip\dimexpr1em+\tabcolsep\@plus.17fil\begin{tabular}[t]{c}% +}% +% If it is desired that each author name be on its own line, use in preamble: +%\DeclareRobustCommand{\and}{% +% \end{tabular}\kern-\tabcolsep\\\begin{tabular}[t]{c}% +%}% +% Change the title page to look a bit better, and fit in with the fncychap +% ``Bjarne'' style a bit better. +% +\newcommand{\sphinxmaketitle}{% + \noindent\rule{\textwidth}{1pt}\par + \begingroup % for PDF information dictionary + \def\endgraf{ }\def\and{\& }% + \pdfstringdefDisableCommands{\def\\{, }}% overwrite hyperref setup + \hypersetup{pdfauthor={\@author}, pdftitle={\@title}}% + \endgroup + \begin{flushright} + \sphinxlogo + \py@HeaderFamily + {\Huge \@title }\par + {\itshape\large \py@release \releaseinfo}\par + \vspace{25pt} + {\Large + \begin{tabular}[t]{c} + \@author + \end{tabular}\kern-\tabcolsep}\par + \vspace{25pt} + \@date \par + \py@authoraddress \par + \end{flushright} + \@thanks + \setcounter{footnote}{0} + \let\thanks\relax\let\maketitle\relax + %\gdef\@thanks{}\gdef\@author{}\gdef\@title{} +} + +\newcommand{\sphinxtableofcontents}{% + \begingroup + \parskip \z@skip + \sphinxtableofcontentshook + \tableofcontents + \endgroup + \noindent\rule{\textwidth}{1pt}\par + \vspace{12pt}% +} +\newcommand\sphinxtableofcontentshook{} +\pagenumbering{arabic} + +% Fix the bibliography environment to add an entry to the Table of +% Contents. +% For an article document class this environment is a section, +% so no page break before it. +% +\newenvironment{sphinxthebibliography}[1]{% + % \phantomsection % not needed here since TeXLive 2010's hyperref + \begin{thebibliography}{#1}% + \addcontentsline{toc}{section}{\ifdefined\refname\refname\else\ifdefined\bibname\bibname\fi\fi}}{\end{thebibliography}} + + +% Same for the indices. +% The memoir class already does this, so we don't duplicate it in that case. +% +\@ifclassloaded{memoir} + {\newenvironment{sphinxtheindex}{\begin{theindex}}{\end{theindex}}} + {\newenvironment{sphinxtheindex}{% + \phantomsection % needed because no chapter, section, ... is created by theindex + \begin{theindex}% + \addcontentsline{toc}{section}{\indexname}}{\end{theindex}}} diff --git a/sphinxlatexadmonitions.sty b/sphinxlatexadmonitions.sty new file mode 100644 index 0000000..1e418c8 --- /dev/null +++ b/sphinxlatexadmonitions.sty @@ -0,0 +1,148 @@ +%% NOTICES AND ADMONITIONS +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexadmonitions.sty}[2021/01/27 admonitions] + +% Provides support for this output mark-up from Sphinx latex writer: +% +% - sphinxadmonition (environment) +% This is a dispatch supporting +% +% - note, hint, important, tip (via sphinxlightbox) +% - warning, caution, attention, danger, error (via sphinxheavybox) +% +% Each sphinx environment can be redefined by user. +% The defaults are customizable via various colour and dimension +% settings, cf sphinx docs (latex customization). +% +% Requires: +\RequirePackage{framed}% used by sphinxheavybox +% +% Dependencies (they do not need to be defined at time of loading): +% - of course the various colour and dimension options handled via sphinx.sty +% - \sphinxstrong (for sphinxlightbox and sphinxheavybox) +% - dimension register \spx@image@maxheight from sphinxlatexgraphics.sty +% - \savenotes/\spewnotes from sphinxpackagefootnote (for sphinxheavybox) + +% Provides: (also in sphinxlatexliterals.sty) +\providecommand*\sphinxvspacefixafterfrenchlists{% + \ifvmode\ifdim\lastskip<\z@ \vskip\parskip\fi\else\par\fi +} + +% Some are quite plain +% the spx@notice@bordercolor etc are set in the sphinxadmonition environment +\newenvironment{sphinxlightbox}{% + \par + \noindent{\color{spx@notice@bordercolor}% + \rule{\linewidth}{\spx@notice@border}}\par\nobreak + {\parskip\z@skip\noindent}% + } + {% + % counteract previous possible negative skip (French lists!): + % (we can't cancel that any earlier \vskip introduced a potential pagebreak) + \sphinxvspacefixafterfrenchlists + \nobreak\vbox{\noindent\kern\@totalleftmargin + {\color{spx@notice@bordercolor}% + \rule[\dimexpr.4\baselineskip-\spx@notice@border\relax] + {\linewidth}{\spx@notice@border}}\hss}\allowbreak + }% end of sphinxlightbox environment definition +% may be renewenvironment'd by user for complete customization +\newenvironment{sphinxnote}[1] + {\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}} +\newenvironment{sphinxhint}[1] + {\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}} +\newenvironment{sphinximportant}[1] + {\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}} +\newenvironment{sphinxtip}[1] + {\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}} +% or just use the package options +% these are needed for common handling by notice environment of lightbox +% and heavybox but they are currently not used by lightbox environment +% and there is consequently no corresponding package option +\definecolor{sphinxnoteBgColor}{rgb}{1,1,1} +\definecolor{sphinxhintBgColor}{rgb}{1,1,1} +\definecolor{sphinximportantBgColor}{rgb}{1,1,1} +\definecolor{sphinxtipBgColor}{rgb}{1,1,1} + +% Others get more distinction +% Code adapted from framed.sty's "snugshade" environment. +% Nesting works (inner frames do not allow page breaks). +\newenvironment{sphinxheavybox}{\par + \setlength{\FrameRule}{\spx@notice@border}% + \setlength{\FrameSep}{\dimexpr.6\baselineskip-\FrameRule\relax} + \advance\spx@image@maxheight + -\dimexpr2\FrameRule + +2\FrameSep + +\baselineskip\relax % will happen again if nested, needed indeed! + % configure framed.sty's parameters to obtain same vertical spacing + % as for "light" boxes. We need for this to manually insert parskip glue and + % revert a skip done by framed before the frame. + \ltx@ifundefined{OuterFrameSep}{}{\OuterFrameSep\z@skip}% + \vspace{\FrameHeightAdjust} + % copied/adapted from framed.sty's snugshade + \def\FrameCommand##1{\hskip\@totalleftmargin + \fboxsep\FrameSep \fboxrule\FrameRule + \fcolorbox{spx@notice@bordercolor}{spx@notice@bgcolor}{##1}% + \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% + \savenotes + % use a minipage if we are already inside a framed environment + \ifspx@inframed + \noindent\begin{minipage}{\linewidth} + \else + % handle case where notice is first thing in a list item (or is quoted) + \if@inlabel + \noindent\par\vspace{-\baselineskip} + \else + \vspace{\parskip} + \fi + \fi + \MakeFramed {\spx@inframedtrue + \advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize + % minipage initialization copied from LaTeX source code. + \@pboxswfalse + \let\@listdepth\@mplistdepth \@mplistdepth\z@ + \@minipagerestore + \@setminipage }% + } + {% + \par\unskip + \@minipagefalse + \endMakeFramed + \ifspx@inframed\end{minipage}\fi + % set footnotes at bottom of page + \spewnotes + % arrange for similar spacing below frame as for "light" boxes. + \vskip .4\baselineskip + }% end of sphinxheavybox environment definition +% may be renewenvironment'd by user for complete customization +\newenvironment{sphinxwarning}[1] + {\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}} +\newenvironment{sphinxcaution}[1] + {\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}} +\newenvironment{sphinxattention}[1] + {\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}} +\newenvironment{sphinxdanger}[1] + {\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}} +\newenvironment{sphinxerror}[1] + {\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}} +% or just use package options + +% the \colorlet of xcolor (if at all loaded) is overkill for our use case +\newcommand{\sphinxcolorlet}[2] + {\expandafter\let\csname\@backslashchar color@#1\expandafter\endcsname + \csname\@backslashchar color@#2\endcsname } + +% the main dispatch for all types of notices +\newenvironment{sphinxadmonition}[2]{% #1=type, #2=heading + % can't use #1 directly in definition of end part + \def\spx@noticetype {#1}% + % set parameters of heavybox/lightbox + \sphinxcolorlet{spx@notice@bordercolor}{sphinx#1BorderColor}% + \sphinxcolorlet{spx@notice@bgcolor}{sphinx#1BgColor}% + \spx@notice@border \dimexpr\csname spx@opt@#1border\endcsname\relax + % start specific environment, passing the heading as argument + \begin{sphinx#1}{#2}} + % workaround some LaTeX "feature" of \end command + {\edef\spx@temp{\noexpand\end{sphinx\spx@noticetype}}\spx@temp} + +\endinput diff --git a/sphinxlatexcontainers.sty b/sphinxlatexcontainers.sty new file mode 100644 index 0000000..93b2c8c --- /dev/null +++ b/sphinxlatexcontainers.sty @@ -0,0 +1,22 @@ +%% CONTAINER DIRECTIVES +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexcontainers.sty}[2021/05/03 containers] + +% The purpose of this file is to provide a dummy environment sphinxclass which +% will be inserted for each class in each container directive. The class name +% will be passed as the argument to the environment. +% +% For a class foo, the user can define customised handling of that class by +% defining the sphinxclassfoo LaTeX environment. + +\newenvironment{sphinxuseclass}[1]{% + \def\sphinxClassFunctionName{sphinxclass#1}% + \ltx@ifundefined{\sphinxClassFunctionName}% + {}% undefined so do nothing + {\expandafter\begin\expandafter{\sphinxClassFunctionName}}% +}{% + \ltx@ifundefined{\sphinxClassFunctionName}% + {}% we did nothing so we keep doing nothing + {\expandafter\end\expandafter{\sphinxClassFunctionName}}% +}% diff --git a/sphinxlatexgraphics.sty b/sphinxlatexgraphics.sty new file mode 100644 index 0000000..fd0aae6 --- /dev/null +++ b/sphinxlatexgraphics.sty @@ -0,0 +1,122 @@ +%% GRAPHICS +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexgraphics.sty}[2021/01/27 graphics] + +% Provides support for this output mark-up from Sphinx latex writer: +% +% - macros: +% +% - \sphinxfigcaption +% - \sphinxincludegraphics +% +% - environments: +% +% - sphinxfigure-in-table +% +% May change: +% +% - \sphinxcaption (at begin document) +% +% Also provides: +% +% - \sphinxsafeincludegraphics (default of \sphinxincludegraphics since 2.0) +% - \spx@image@maxheight dimension (used by sphinxlatexadmonitions.sty) +% - \spx@image@box scratch box register (also used by sphinxlatexliterals.sty) +% +% Requires: +% \RequirePackage{graphicx}% done in sphinx.sty +\RequirePackage{amstext}% needed for \firstchoice@true(false) + +% \sphinxincludegraphics resizes images larger than the TeX \linewidth (which +% is adjusted in indented environments), or taller than a certain maximal +% height (usually \textheight and this is reduced in the environments which use +% framed.sty to avoid infinite loop if image too tall). +% +% In case height or width options are present the rescaling is done +% (since 2.0), in a way keeping the width:height ratio either native from +% image or from the width and height options if both were present. +% +\newdimen\spx@image@maxheight +\AtBeginDocument{\spx@image@maxheight\textheight} + +% box scratch register +\newbox\spx@image@box +\newcommand*{\sphinxsafeincludegraphics}[2][]{% + % #1 contains possibly width=, height=, but no scale= since 1.8.4 + \setbox\spx@image@box\hbox{\includegraphics[#1,draft]{#2}}% + \in@false % use some handy boolean flag + \ifdim \wd\spx@image@box>\linewidth + \in@true % flag to remember to adjust options and set box dimensions + % compute height which results from rescaling width to \linewidth + % and keep current aspect ratio. multiply-divide in \numexpr uses + % temporarily doubled precision, hence no overflow. (of course we + % assume \ht is not a few sp's below \maxdimen...(about 16384pt). + \edef\spx@image@rescaledheight % with sp units + {\the\numexpr\ht\spx@image@box + *\linewidth/\wd\spx@image@box sp}% + \ifdim\spx@image@rescaledheight>\spx@image@maxheight + % the rescaled height will be too big, so it is height which decides + % the rescaling factor + \def\spx@image@requiredheight{\spx@image@maxheight}% dimen register + \edef\spx@image@requiredwidth % with sp units + {\the\numexpr\wd\spx@image@box + *\spx@image@maxheight/\ht\spx@image@box sp}% + % TODO: decide if this commented-out block could be needed due to + % rounding in numexpr operations going up + % \ifdim\spx@image@requiredwidth>\linewidth + % \def\spx@image@requiredwidth{\linewidth}% dimen register + % \fi + \else + \def\spx@image@requiredwidth{\linewidth}% dimen register + \let\spx@image@requiredheight\spx@image@rescaledheight% sp units + \fi + \else + % width is ok, let's check height + \ifdim\ht\spx@image@box>\spx@image@maxheight + \in@true + \edef\spx@image@requiredwidth % with sp units + {\the\numexpr\wd\spx@image@box + *\spx@image@maxheight/\ht\spx@image@box sp}% + \def\spx@image@requiredheight{\spx@image@maxheight}% dimen register + \fi + \fi % end of check of width and height + \ifin@ + \setbox\spx@image@box + \hbox{\includegraphics + [%#1,% contained only width and/or height and overruled anyhow + width=\spx@image@requiredwidth,height=\spx@image@requiredheight]% + {#2}}% + % \includegraphics does not set box dimensions to the exactly + % requested ones, see https://github.com/latex3/latex2e/issues/112 + \wd\spx@image@box\spx@image@requiredwidth + \ht\spx@image@box\spx@image@requiredheight + \leavevmode\box\spx@image@box + \else + % here we do not modify the options, no need to adjust width and height + % on output, they will be computed exactly as with "draft" option + \setbox\spx@image@box\box\voidb@x % clear memory + \includegraphics[#1]{#2}% + \fi +}% +% Use the "safe" one by default (2.0) +\def\sphinxincludegraphics{\sphinxsafeincludegraphics} + + +%% FIGURE IN TABLE +% +\newenvironment{sphinxfigure-in-table}[1][\linewidth]{% + \def\@captype{figure}% + \sphinxsetvskipsforfigintablecaption + \begin{minipage}{#1}% +}{\end{minipage}} +% tabulary expands twice contents, we need to prevent double counter stepping +\newcommand*\sphinxfigcaption + {\ifx\equation$%$% this is trick to identify tabulary first pass + \firstchoice@false\else\firstchoice@true\fi + \spx@originalcaption } +\newcommand*\sphinxsetvskipsforfigintablecaption + {\abovecaptionskip\smallskipamount + \belowcaptionskip\smallskipamount} + +\endinput diff --git a/sphinxlatexindbibtoc.sty b/sphinxlatexindbibtoc.sty new file mode 100644 index 0000000..79e30a1 --- /dev/null +++ b/sphinxlatexindbibtoc.sty @@ -0,0 +1,69 @@ +%% INDEX, BIBLIOGRAPHY, APPENDIX, TABLE OF CONTENTS +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexindbibtoc.sty}[2021/01/27 index, bib., toc] + +% Provides support for this output mark-up from Sphinx latex writer: +% +% - environments: (backup defaults or get redefined) +% +% - sphinxtheindex (direct mark-up or via python.ist or sphinx.xdy) +% - sphinxthebibliography +% +% - macros: (defines defaults) +% +% - \sphinxmaketitle +% - \sphinxtableofcontents +% - \sphinxnonalphabeticalgroupname +% - \sphinxsymbolsname +% - \sphinxnumbersname +% - \sphinxcite +% +% Requires: +\RequirePackage{makeidx} + +% fix the double index and bibliography on the table of contents +% in jsclasses (Japanese standard document classes) +\ifx\@jsc@uplatextrue\@undefined\else + \renewenvironment{sphinxtheindex} + {\cleardoublepage\phantomsection + \begin{theindex}} + {\end{theindex}} + + \renewenvironment{sphinxthebibliography}[1] + {\cleardoublepage% \phantomsection % not needed here since TeXLive 2010's hyperref + \begin{thebibliography}{#1}} + {\end{thebibliography}} +\fi + +% disable \@chappos in Appendix in pTeX +\ifx\kanjiskip\@undefined\else + \let\py@OldAppendix=\appendix + \renewcommand{\appendix}{ + \py@OldAppendix + \gdef\@chappos{} + } +\fi + +% make commands known to non-Sphinx document classes +\providecommand*{\sphinxmaketitle}{\maketitle} +\providecommand*{\sphinxtableofcontents}{\tableofcontents} +\ltx@ifundefined{sphinxthebibliography} + {\newenvironment + {sphinxthebibliography}{\begin{thebibliography}}{\end{thebibliography}}% + } + {}% else clause of \ltx@ifundefined +\ltx@ifundefined{sphinxtheindex} + {\newenvironment{sphinxtheindex}{\begin{theindex}}{\end{theindex}}}% + {}% else clause of \ltx@ifundefined + +% for usage with xindy: this string gets internationalized in preamble +\newcommand*{\sphinxnonalphabeticalgroupname}{} +% redefined in preamble, headings for makeindex produced index +\newcommand*{\sphinxsymbolsname}{} +\newcommand*{\sphinxnumbersname}{} + +\protected\def\sphinxcite{\cite} + + +\endinput diff --git a/sphinxlatexlists.sty b/sphinxlatexlists.sty new file mode 100644 index 0000000..ed7521c --- /dev/null +++ b/sphinxlatexlists.sty @@ -0,0 +1,97 @@ +%% ALPHANUMERIC LIST ITEMS +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexlists.sty}[2021/01/27 lists] + +% Provides support for this output mark-up from Sphinx latex writer: +% - \sphinxsetlistlabels + +% Dependencies: the \spx@opt@maxlistdepth from sphinx.sty + +\newcommand\sphinxsetlistlabels[5] +{% #1 = style, #2 = enum, #3 = enumnext, #4 = prefix, #5 = suffix + % #2 and #3 are counters used by enumerate environment e.g. enumi, enumii. + % #1 is a macro such as \arabic or \alph + % prefix and suffix are strings (by default empty and a dot). + \@namedef{the#2}{#1{#2}}% + \@namedef{label#2}{#4\@nameuse{the#2}#5}% + \@namedef{p@#3}{\@nameuse{p@#2}#4\@nameuse{the#2}#5}% +}% + + +%% MAXLISTDEPTH +% +% remove LaTeX's cap on nesting depth if 'maxlistdepth' key used. +% This is a hack, which works with the standard classes: it assumes \@toodeep +% is always used in "true" branches: "\if ... \@toodeep \else .. \fi." + +% will force use the "false" branch (if there is one) +\def\spx@toodeep@hack{\fi\iffalse} + +% do nothing if 'maxlistdepth' key not used or if package enumitem loaded. +\ifnum\spx@opt@maxlistdepth=\z@\expandafter\@gobbletwo\fi +\AtBeginDocument{% +\@ifpackageloaded{enumitem}{\remove@to@nnil}{}% + \let\spx@toodeepORI\@toodeep + \def\@toodeep{% + \ifnum\@listdepth<\spx@opt@maxlistdepth\relax + \expandafter\spx@toodeep@hack + \else + \expandafter\spx@toodeepORI + \fi}% +% define all missing \@list... macros + \count@\@ne + \loop + \ltx@ifundefined{@list\romannumeral\the\count@} + {\iffalse}{\iftrue\advance\count@\@ne}% + \repeat + \loop + \ifnum\count@>\spx@opt@maxlistdepth\relax\else + \expandafter\let + \csname @list\romannumeral\the\count@\expandafter\endcsname + \csname @list\romannumeral\the\numexpr\count@-\@ne\endcsname + % workaround 2.6--3.2d babel-french issue (fixed in 3.2e; no change needed) + \ltx@ifundefined{leftmargin\romannumeral\the\count@} + {\expandafter\let + \csname leftmargin\romannumeral\the\count@\expandafter\endcsname + \csname leftmargin\romannumeral\the\numexpr\count@-\@ne\endcsname}{}% + \advance\count@\@ne + \repeat +% define all missing enum... counters and \labelenum... macros and \p@enum.. + \count@\@ne + \loop + \ltx@ifundefined{c@enum\romannumeral\the\count@} + {\iffalse}{\iftrue\advance\count@\@ne}% + \repeat + \loop + \ifnum\count@>\spx@opt@maxlistdepth\relax\else + \newcounter{enum\romannumeral\the\count@}% + \expandafter\def + \csname labelenum\romannumeral\the\count@\expandafter\endcsname + \expandafter + {\csname theenum\romannumeral\the\numexpr\count@\endcsname.}% + \expandafter\def + \csname p@enum\romannumeral\the\count@\expandafter\endcsname + \expandafter + {\csname p@enum\romannumeral\the\numexpr\count@-\@ne\expandafter + \endcsname\csname theenum\romannumeral\the\numexpr\count@-\@ne\endcsname.}% + \advance\count@\@ne + \repeat +% define all missing labelitem... macros + \count@\@ne + \loop + \ltx@ifundefined{labelitem\romannumeral\the\count@} + {\iffalse}{\iftrue\advance\count@\@ne}% + \repeat + \loop + \ifnum\count@>\spx@opt@maxlistdepth\relax\else + \expandafter\let + \csname labelitem\romannumeral\the\count@\expandafter\endcsname + \csname labelitem\romannumeral\the\numexpr\count@-\@ne\endcsname + \advance\count@\@ne + \repeat + \PackageInfo{sphinx}{maximal list depth extended to \spx@opt@maxlistdepth}% +\@gobble\@nnil +} + +\endinput diff --git a/sphinxlatexliterals.sty b/sphinxlatexliterals.sty new file mode 100644 index 0000000..cc768c2 --- /dev/null +++ b/sphinxlatexliterals.sty @@ -0,0 +1,804 @@ +%% LITERAL BLOCKS +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexliterals.sty}[2021/12/06 code-blocks and parsed literals] + +% Provides support for this output mark-up from Sphinx latex writer: +% +% - macros: +% - \sphinxLiteralBlockLabel +% - \sphinxSetupCaptionForVerbatim +% - \sphinxSetupCodeBlockInFootnote +% - \sphinxhref +% - \sphinxnolinkurl +% - \sphinxresetverbatimhllines +% - \sphinxunactivateextrasandspace +% - \sphinxupquote +% - \sphinxurl +% +% - environments: +% - sphinxVerbatim +% - sphinxVerbatimintable +% - sphinxalltt +% +% Dependency: +% +% - hyperref (for \phantomsection and \capstart) (loaded later) +% +% Executes \RequirePackage for: +% +% - framed +% - fancyvrb +% - alltt +% - upquote +% - needspace + +% also in sphinxlatexadmonitions.sty: +% This is a workaround to a "feature" of French lists, when literal block +% follows immediately; usable generally (does only \par then), a priori... +\providecommand*\sphinxvspacefixafterfrenchlists{% + \ifvmode\ifdim\lastskip<\z@ \vskip\parskip\fi\else\par\fi +} + +% For framing allowing pagebreaks +\RequirePackage{framed} +% For source code +% MEMO: fancyvrb is used mainly to +% 1- control horizontal and vertical spacing +% 2- optional line numbering +% 3- optional line emphasizing +% 4- while still allowing expansion of Pygments latex mark-up +% Other aspects such as framing, caption handling, codeline wrapping are +% added on top of it. We should stop using fancyvrb and implement +% 1, 2, 3, 4 by own Sphinx fully native Verbatim. This would allow to solve +% limitations with wrapped long code line not allowing page break. +\RequirePackage{fancyvrb} +% For parsed-literal blocks. +\RequirePackage{alltt} +% Display "real" single quotes in literal blocks. +\RequirePackage{upquote} +% Skip to next page if not enough space at bottom +\RequirePackage{needspace} + +% Based on use of "fancyvrb.sty"'s Verbatim. +% - with framing allowing page breaks ("framed.sty") +% - with breaking of long lines (exploits Pygments mark-up), +% - with possibly of a top caption, non-separable by pagebreak. +% - and usable inside tables or footnotes ("sphinxpackagefootnote.sty"). + +% for emphasizing lines +\define@key{FV}{hllines}{\def\sphinx@verbatim@checkifhl##1{\in@{, ##1,}{#1}}} +% sphinxVerbatim must be usable by third party without requiring hllines set-up +\def\sphinxresetverbatimhllines{\def\sphinx@verbatim@checkifhl##1{\in@false}} +\sphinxresetverbatimhllines + +% Prior to Sphinx 1.5, \Verbatim and \endVerbatim were modified by Sphinx. +% The aliases defined here are used in sphinxVerbatim environment and can +% serve as hook-points with no need to modify \Verbatim itself. +\let\OriginalVerbatim \Verbatim +\let\endOriginalVerbatim\endVerbatim + +% for captions of literal blocks +% at start of caption title +\newcommand*{\fnum@literalblock}{\literalblockname\nobreakspace\theliteralblock} +% this will be overwritten in document preamble by Babel translation +\newcommand*{\literalblockname}{Listing } +% file extension needed for \caption's good functioning, the file is created +% only if a \listof{literalblock}{foo} command is encountered, which is +% analogous to \listoffigures, but for the code listings (foo = chosen title.) +\newcommand*{\ext@literalblock}{lol} + +% if forced use of minipage encapsulation is needed (e.g. table cells) +\newif\ifsphinxverbatimwithminipage \sphinxverbatimwithminipagefalse + +% Framing macro for use with framed.sty's \FrameCommand +% - it obeys current indentation, +% - frame is \fboxsep separated from the contents, +% - the contents use the full available text width, +% - #1 = color of frame, #2 = color of background, +% - #3 = above frame, #4 = below frame, #5 = within frame, +% - #3 and #4 must be already typeset boxes; they must issue \normalcolor +% or similar, else, they are under scope of color #1 +\long\def\spx@fcolorbox #1#2#3#4#5{% + \hskip\@totalleftmargin + \hskip-\fboxsep\hskip-\fboxrule + % use of \color@b@x here is compatible with both xcolor.sty and color.sty + \color@b@x {\color{#1}\spx@CustomFBox{#3}{#4}}{\color{#2}}{#5}% + \hskip-\fboxsep\hskip-\fboxrule + \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth +}% +% #1 = for material above frame, such as a caption or a "continued" hint +% #2 = for material below frame, such as a caption or "continues on next page" +% #3 = actual contents, which will be typeset with a background color +\long\def\spx@CustomFBox#1#2#3{% + \begingroup + \setbox\@tempboxa\hbox{{#3}}% inner braces to avoid color leaks + \vbox{#1% above frame + % draw frame border _latest_ to avoid pdf viewer issue + \kern\fboxrule + \hbox{\kern\fboxrule + \copy\@tempboxa + \kern-\wd\@tempboxa\kern-\fboxrule + \vrule\@width\fboxrule + \kern\wd\@tempboxa + \vrule\@width\fboxrule}% + \kern-\dimexpr\ht\@tempboxa+\dp\@tempboxa+\fboxrule\relax + \hrule\@height\fboxrule + \kern\dimexpr\ht\@tempboxa+\dp\@tempboxa\relax + \hrule\@height\fboxrule + #2% below frame + }% + \endgroup +}% +\def\spx@fcolorbox@put@c#1{% hide width from framed.sty measuring + \moveright\dimexpr\fboxrule+.5\wd\@tempboxa\hb@xt@\z@{\hss#1\hss}% +}% +\def\spx@fcolorbox@put@r#1{% right align with contents, width hidden + \moveright\dimexpr\fboxrule+\wd\@tempboxa-\fboxsep\hb@xt@\z@{\hss#1}% +}% +\def\spx@fcolorbox@put@l#1{% left align with contents, width hidden + \moveright\dimexpr\fboxrule+\fboxsep\hb@xt@\z@{#1\hss}% +}% +% +\def\sphinxVerbatim@Continued + {\csname spx@fcolorbox@put@\spx@opt@verbatimcontinuedalign\endcsname + {\normalcolor\sphinxstylecodecontinued\literalblockcontinuedname}}% +\def\sphinxVerbatim@Continues + {\csname spx@fcolorbox@put@\spx@opt@verbatimcontinuesalign\endcsname + {\normalcolor\sphinxstylecodecontinues\literalblockcontinuesname}}% +\def\sphinxVerbatim@Title + {\spx@fcolorbox@put@c{\unhcopy\sphinxVerbatim@TitleBox}}% +\let\sphinxVerbatim@Before\@empty +\let\sphinxVerbatim@After\@empty +% Defaults are redefined in document preamble according to language +\newcommand*\literalblockcontinuedname{continued from previous page}% +\newcommand*\literalblockcontinuesname{continues on next page}% +% +\def\spx@verbatimfcolorbox{\spx@fcolorbox{VerbatimBorderColor}{VerbatimColor}}% +\def\sphinxVerbatim@FrameCommand + {\spx@verbatimfcolorbox\sphinxVerbatim@Before\sphinxVerbatim@After}% +\def\sphinxVerbatim@FirstFrameCommand + {\spx@verbatimfcolorbox\sphinxVerbatim@Before\sphinxVerbatim@Continues}% +\def\sphinxVerbatim@MidFrameCommand + {\spx@verbatimfcolorbox\sphinxVerbatim@Continued\sphinxVerbatim@Continues}% +\def\sphinxVerbatim@LastFrameCommand + {\spx@verbatimfcolorbox\sphinxVerbatim@Continued\sphinxVerbatim@After}% + +% For linebreaks inside Verbatim environment from package fancyvrb. +\newbox\sphinxcontinuationbox +\newbox\sphinxvisiblespacebox +\newcommand*\sphinxafterbreak {\copy\sphinxcontinuationbox} + +% Take advantage of the already applied Pygments mark-up to insert +% potential linebreaks for TeX processing. +% {, <, #, %, $, ' and ": go to next line. +% _, }, ^, &, >, -, ~, and \: stay at end of broken line. +% Use of \textquotesingle for straight quote. +% FIXME: convert this to package options ? +\newcommand*\sphinxbreaksbeforelist {% + \do\PYGZob\{\do\PYGZlt\<\do\PYGZsh\#\do\PYGZpc\%% {, <, #, %, + \do\PYGZdl\$\do\PYGZdq\"% $, " + \def\PYGZsq + {\discretionary{}{\sphinxafterbreak\textquotesingle}{\textquotesingle}}% ' +} +\newcommand*\sphinxbreaksafterlist {% + \do\PYGZus\_\do\PYGZcb\}\do\PYGZca\^\do\PYGZam\&% _, }, ^, &, + \do\PYGZgt\>\do\PYGZhy\-\do\PYGZti\~% >, -, ~ + \do\PYGZbs\\% \ +} +\newcommand*\sphinxbreaksatspecials {% + \def\do##1##2% + {\def##1{\discretionary{}{\sphinxafterbreak\char`##2}{\char`##2}}}% + \sphinxbreaksbeforelist + \def\do##1##2% + {\def##1{\discretionary{\char`##2}{\sphinxafterbreak}{\char`##2}}}% + \sphinxbreaksafterlist +} + +\def\sphinx@verbatim@nolig@list {\do \`}% +% Some characters . , ; ? ! / are neither pygmentized nor "tex-escaped". +% This macro makes them "active" and they will insert potential linebreaks. +% Not compatible with math mode (cf \sphinxunactivateextras). +\newcommand*\sphinxbreaksbeforeactivelist {}% none +\newcommand*\sphinxbreaksafteractivelist {\do\.\do\,\do\;\do\?\do\!\do\/} +\newcommand*\sphinxbreaksviaactive {% + \def\do##1{\lccode`\~`##1% + \lowercase{\def~}{\discretionary{}{\sphinxafterbreak\char`##1}{\char`##1}}% + \catcode`##1\active}% + \sphinxbreaksbeforeactivelist + \def\do##1{\lccode`\~`##1% + \lowercase{\def~}{\discretionary{\char`##1}{\sphinxafterbreak}{\char`##1}}% + \catcode`##1\active}% + \sphinxbreaksafteractivelist + \lccode`\~`\~ +} + +% If the linebreak is at a space, the latter will be displayed as visible +% space at end of first line, and a continuation symbol starts next line. +\def\spx@verbatim@space {% + \nobreak\hskip\z@skip + \discretionary{\copy\sphinxvisiblespacebox}{\sphinxafterbreak} + {\kern\fontdimen2\font}% +}% + +% if the available space on page is less than \literalblockneedspace, insert pagebreak +\newcommand{\sphinxliteralblockneedspace}{5\baselineskip} +\newcommand{\sphinxliteralblockwithoutcaptionneedspace}{1.5\baselineskip} +% The title (caption) is specified from outside as macro \sphinxVerbatimTitle. +% \sphinxVerbatimTitle is reset to empty after each use of Verbatim. +\newcommand*\sphinxVerbatimTitle {} +% This box to typeset the caption before framed.sty multiple passes for framing. +\newbox\sphinxVerbatim@TitleBox +% This box to measure contents if nested as inner \MakeFramed requires then +% minipage encapsulation but too long contents then break outer \MakeFramed +\newbox\sphinxVerbatim@ContentsBox +% Holder macro for labels of literal blocks. Set-up by LaTeX writer. +\newcommand*\sphinxLiteralBlockLabel {} +\newcommand*\sphinxSetupCaptionForVerbatim [1] +{% + \sphinxvspacefixafterfrenchlists + \needspace{\sphinxliteralblockneedspace}% +% insert a \label via \sphinxLiteralBlockLabel +% reset to normal the color for the literal block caption + \def\sphinxVerbatimTitle + {\py@NormalColor\sphinxcaption{\sphinxLiteralBlockLabel #1}}% +} +\newcommand*\sphinxSetupCodeBlockInFootnote {% + \fvset{fontsize=\footnotesize}\let\caption\sphinxfigcaption + \sphinxverbatimwithminipagetrue % reduces vertical spaces + % we counteract (this is in a group) the \@normalsize from \caption + \let\normalsize\footnotesize\let\@parboxrestore\relax + \def\spx@abovecaptionskip{\sphinxverbatimsmallskipamount}% +} +\newcommand*{\sphinxverbatimsmallskipamount}{\smallskipamount} +% serves to implement line highlighting and line wrapping +\newcommand\sphinxFancyVerbFormatLine[1]{% + \expandafter\sphinx@verbatim@checkifhl\expandafter{\the\FV@CodeLineNo}% + \ifin@ + \sphinxVerbatimHighlightLine{#1}% + \else + \sphinxVerbatimFormatLine{#1}% + \fi +}% +\newcommand\sphinxVerbatimHighlightLine[1]{% + \edef\sphinxrestorefboxsep{\fboxsep\the\fboxsep\relax}% + \fboxsep0pt\relax % cf LaTeX bug graphics/4524 + \colorbox{sphinxVerbatimHighlightColor}% + {\sphinxrestorefboxsep\sphinxVerbatimFormatLine{#1}}% + % no need to restore \fboxsep here, as this ends up in a \hbox from fancyvrb +}% +% \sphinxVerbatimFormatLine will be set locally to one of those two: +\newcommand\sphinxVerbatimFormatLineWrap{% + \hsize\linewidth + \ifspx@opt@verbatimforcewraps + \expandafter\spx@verb@FormatLineForceWrap + \else\expandafter\spx@verb@FormatLineWrap + \fi +}% +\newcommand\sphinxVerbatimFormatLineNoWrap[1]{\hb@xt@\linewidth{\strut #1\hss}}% +\long\def\spx@verb@FormatLineWrap#1{% + \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@ + \doublehyphendemerits\z@\finalhyphendemerits\z@ + \strut #1\strut}% +}% +% +% The normal line wrapping allows breaks at spaces and ascii non +% letters, non digits. The \raggedright above means there will be +% an overfilled line only if some non-breakable "word" was +% encountered, which is longer than a line (it is moved always to +% be on its own on a new line). +% +% The "forced" line wrapping will parse the tokens to add potential +% breakpoints at each character. As some strings are highlighted, +% we have to apply the highlighting character per character, which +% requires to manipulate the output of the Pygments LaTeXFormatter. +% +% Doing this at latex level is complicated. The contents should +% be as expected: i.e. some active characters from +% \sphinxbreaksviaactive, some Pygments character escapes such as +% \PYGZdl{}, and the highlighting \PYG macro with always 2 +% arguments. No other macros should be there, except perhaps +% zero-parameter macros. In particular: +% - the texcomments Pygments option must be set to False +% +% With pdflatex, Unicode input gives multi-bytes characters +% where the first byte is active. We support the "utf8" macros +% only. "utf8x" is not supported. +% +% The highlighting macro \PYG will be applied character per +% character. Highlighting via a colored background gives thus a +% chain of small colored boxes which may cause some artefact in +% some pdf viewers. Can't do anything here if we do want the line +% break to be possible. +% +% First a measurement step is done of what would the standard line +% wrapping give (i.e line breaks only at spaces and non-letter, +% non-digit ascii characters), cf TeX by Topic for the basic +% dissecting technique: TeX unfortunately when building a vertical +% box does not store in an accessible way what was the maximal +% line-width during paragraph building. +% +% Avoid LaTeX 2021 alteration of \@@par which potentially could break our +% measurement step (typically if the para/after hook is configured to use +% \vspace). Of course, breakage could happen only from user or package +% adding things to basic Sphinx latex. And perhaps spring LaTeX 2021 will +% provide a non-hooked \@@par, but this should work anyway and can't be +% beaten for speed. +\ltx@ifundefined{tex_par:D} +% We could use \@ifl@t@r\fmtversion{2020/02/02}{use \tex_par:D}{use \@@par}. + {\let\spx@par\@@par}% \@@par is then expected to be TeX's original \par + {\expandafter\let\expandafter\spx@par\csname tex_par:D\endcsname} +% More hesitation for avoiding the at-start-of-par hooks for our +% measurement : 1. with old LaTeX, we can not avoid hooks from everyhook +% or similar packages, 2. and perhaps the hooks add stuff which we should +% actually measure. Ideally, hooks are for inserting things in margin +% which do not change spacing. Most everything else in fact should not be +% executed in our scratch box for measurement, such as counter stepping. +\ltx@ifundefined{tex_everypar:D} + {\let\spx@everypar\everypar} + {\expandafter\let\expandafter\spx@everypar\csname tex_everypar:D\endcsname} +% +% If the max width exceeds the linewidth by more than verbatimmaxoverfull +% character widths, or if the min width plus verbatimmaxunderfull character +% widths is inferior to linewidth, then we apply the "force wrapping" with +% potential line break at each character, else we don't. +\long\def\spx@verb@FormatLineForceWrap#1{% + % \spx@image@box is a scratch box register that we can use here + \global\let\spx@verb@maxwidth\z@ + \global\let\spx@verb@minwidth\linewidth + \setbox\spx@image@box + \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@ + \doublehyphendemerits\z@\finalhyphendemerits\z@ + \spx@everypar{}\noindent\strut #1\strut\spx@par + \spx@verb@getwidths}% + \ifdim\spx@verb@maxwidth> + \dimexpr\linewidth+\spx@opt@verbatimmaxoverfull\fontcharwd\font`X \relax + \spx@verb@FormatLineWrap{\spx@verb@wrapPYG #1\spx@verb@wrapPYG}% + \else + \ifdim\spx@verb@minwidth< + \dimexpr\linewidth-\spx@opt@verbatimmaxunderfull\fontcharwd\font`X \relax + \spx@verb@FormatLineWrap{\spx@verb@wrapPYG #1\spx@verb@wrapPYG}% + \else + \spx@verb@FormatLineWrap{#1}% + \fi\fi +}% +% auxiliary paragraph dissector to get max and min widths +% but minwidth must not take into account the last line +\newbox\spx@scratchbox +\def\spx@verb@getwidths {% + \unskip\unpenalty + \setbox\spx@scratchbox\lastbox + \ifvoid\spx@scratchbox + \else + \setbox\spx@scratchbox\hbox{\unhbox\spx@scratchbox}% + \ifdim\spx@verb@maxwidth<\wd\spx@scratchbox + \xdef\spx@verb@maxwidth{\number\wd\spx@scratchbox sp}% + \fi + \expandafter\spx@verb@getwidths@loop + \fi +}% +\def\spx@verb@getwidths@loop {% + \unskip\unpenalty + \setbox\spx@scratchbox\lastbox + \ifvoid\spx@scratchbox + \else + \setbox\spx@scratchbox\hbox{\unhbox\spx@scratchbox}% + \ifdim\spx@verb@maxwidth<\wd\spx@scratchbox + \xdef\spx@verb@maxwidth{\number\wd\spx@scratchbox sp}% + \fi + \ifdim\spx@verb@minwidth>\wd\spx@scratchbox + \xdef\spx@verb@minwidth{\number\wd\spx@scratchbox sp}% + \fi + \expandafter\spx@verb@getwidths@loop + \fi +}% +% auxiliary macros to implement "cut long line even in middle of word" +\catcode`Z=3 % safe delimiter +\def\spx@verb@wrapPYG{% + \futurelet\spx@nexttoken\spx@verb@wrapPYG@i +}% +\def\spx@verb@wrapPYG@i{% + \ifx\spx@nexttoken\spx@verb@wrapPYG\let\next=\@gobble\else + \ifx\spx@nexttoken\PYG\let\next=\spx@verb@wrapPYG@PYG@onebyone\else + \discretionary{}{\sphinxafterbreak}{}% + \let\next\spx@verb@wrapPYG@ii + \fi\fi + \next +}% +% Let's recognize active characters. We don't support utf8x only utf8. +% And here #1 should not have picked up (non empty) braced contents +\long\def\spx@verb@wrapPYG@ii#1{% + \ifcat\noexpand~\noexpand#1\relax% active character + \expandafter\spx@verb@wrapPYG@active + \else % non-active character, control sequence such as \PYGZdl, or empty + \expandafter\spx@verb@wrapPYG@one + \fi {#1}% +}% +\long\def\spx@verb@wrapPYG@active#1{% +% Let's hope expansion of active character does not really require arguments, +% as we certainly don't want to go into expanding upfront token stream anyway. + \expandafter\spx@verb@wrapPYG@iii#1{}{}{}{}{}{}{}{}{}Z#1% +}% +\long\def\spx@verb@wrapPYG@iii#1#2Z{% + \ifx\UTFviii@four@octets#1\let\next=\spx@verb@wrapPYG@four\else + \ifx\UTFviii@three@octets#1\let\next=\spx@verb@wrapPYG@three\else + \ifx\UTFviii@two@octets#1\let\next=\spx@verb@wrapPYG@two\else + \let\next=\spx@verb@wrapPYG@one + \fi\fi\fi + \next +}% +\long\def\spx@verb@wrapPYG@one #1{#1\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}% +\long\def\spx@verb@wrapPYG@two #1#2{#1#2\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}% +\long\def\spx@verb@wrapPYG@three #1#2#3{#1#2#3\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}% +\long\def\spx@verb@wrapPYG@four #1#2#3#4{#1#2#3#4\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}% +% Replace \PYG by itself applied one character at a time! This way breakpoints +% can be inserted. +\def\spx@verb@wrapPYG@PYG@onebyone#1#2#3{% #1 = \PYG, #2 = highlight spec, #3 = tokens + \def\spx@verb@wrapPYG@PYG@spec{{#2}}% + \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i#3Z% +}% +\def\spx@verb@wrapPYG@PYG@i{% + \ifx\spx@nexttokenZ\let\next=\spx@verb@wrapPYG@PYG@done\else + \discretionary{}{\sphinxafterbreak}{}% + \let\next\spx@verb@wrapPYG@PYG@ii + \fi + \next +}% +\def\spx@verb@wrapPYG@PYG@doneZ{\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}% +\long\def\spx@verb@wrapPYG@PYG@ii#1{% + \ifcat\noexpand~\noexpand#1\relax% active character + \expandafter\spx@verb@wrapPYG@PYG@active + \else % non-active character, control sequence such as \PYGZdl, or empty + \expandafter\spx@verb@wrapPYG@PYG@one + \fi {#1}% +}% +\long\def\spx@verb@wrapPYG@PYG@active#1{% +% Let's hope expansion of active character does not really require arguments, +% as we certainly don't want to go into expanding upfront token stream anyway. + \expandafter\spx@verb@wrapPYG@PYG@iii#1{}{}{}{}{}{}{}{}{}Z#1% +}% +\long\def\spx@verb@wrapPYG@PYG@iii#1#2Z{% + \ifx\UTFviii@four@octets#1\let\next=\spx@verb@wrapPYG@PYG@four\else + \ifx\UTFviii@three@octets#1\let\next=\spx@verb@wrapPYG@PYG@three\else + \ifx\UTFviii@two@octets#1\let\next=\spx@verb@wrapPYG@PYG@two\else + \let\next=\spx@verb@wrapPYG@PYG@one + \fi\fi\fi + \next +}% +\long\def\spx@verb@wrapPYG@PYG@one#1{% + \expandafter\PYG\spx@verb@wrapPYG@PYG@spec{#1}% + \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i +}% +\long\def\spx@verb@wrapPYG@PYG@two#1#2{% + \expandafter\PYG\spx@verb@wrapPYG@PYG@spec{#1#2}% + \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i +}% +\long\def\spx@verb@wrapPYG@PYG@three#1#2#3{% + \expandafter\PYG\spx@verb@wrapPYG@PYG@spec{#1#2#3}% + \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i +}% +\long\def\spx@verb@wrapPYG@PYG@four#1#2#3#4{% + \expandafter\PYG\spx@verb@wrapPYG@PYG@spec{#1#2#3#4}% + \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i +}% +\catcode`Z 11 % +% +\g@addto@macro\FV@SetupFont{% + \sbox\sphinxcontinuationbox {\spx@opt@verbatimcontinued}% + \sbox\sphinxvisiblespacebox {\spx@opt@verbatimvisiblespace}% +}% +\newenvironment{sphinxVerbatim}{% + % first, let's check if there is a caption + \ifx\sphinxVerbatimTitle\empty + \sphinxvspacefixafterfrenchlists + \parskip\z@skip + \vskip\sphinxverbatimsmallskipamount + % there was no caption. Check if nevertheless a label was set. + \ifx\sphinxLiteralBlockLabel\empty\else + % we require some space to be sure hyperlink target from \phantomsection + % will not be separated from upcoming verbatim by a page break + \needspace{\sphinxliteralblockwithoutcaptionneedspace}% + \phantomsection\sphinxLiteralBlockLabel + \fi + \else + \parskip\z@skip + \if t\spx@opt@literalblockcappos + \vskip\spx@abovecaptionskip + \def\sphinxVerbatim@Before + {\sphinxVerbatim@Title\nointerlineskip + \kern\dimexpr-\dp\strutbox+\sphinxbelowcaptionspace + % if no frame (code-blocks inside table cells), remove + % the "verbatimsep" whitespace from the top (better visually) + \ifspx@opt@verbatimwithframe\else-\sphinxverbatimsep\fi + % caption package adds \abovecaptionskip vspace, remove it + \spx@ifcaptionpackage{-\abovecaptionskip}{}\relax}% + \else + \vskip\sphinxverbatimsmallskipamount + \def\sphinxVerbatim@After + {\nointerlineskip\kern\dimexpr\dp\strutbox + \ifspx@opt@verbatimwithframe\else-\sphinxverbatimsep\fi + \spx@ifcaptionpackage{-\abovecaptionskip}{}\relax + \sphinxVerbatim@Title}% + \fi + \def\@captype{literalblock}% + \capstart + % \sphinxVerbatimTitle must reset color + \setbox\sphinxVerbatim@TitleBox + \hbox{\begin{minipage}{\linewidth}% + % caption package may detect wrongly if top or bottom, so we help it + \spx@ifcaptionpackage + {\caption@setposition{\spx@opt@literalblockcappos}}{}% + \sphinxVerbatimTitle + \end{minipage}}% + \fi + \global\let\sphinxLiteralBlockLabel\empty + \global\let\sphinxVerbatimTitle\empty + \fboxsep\sphinxverbatimsep \fboxrule\sphinxverbatimborder + \ifspx@opt@verbatimwithframe\else\fboxrule\z@\fi + \let\FrameCommand \sphinxVerbatim@FrameCommand + \let\FirstFrameCommand\sphinxVerbatim@FirstFrameCommand + \let\MidFrameCommand \sphinxVerbatim@MidFrameCommand + \let\LastFrameCommand \sphinxVerbatim@LastFrameCommand + \ifspx@opt@verbatimhintsturnover\else + \let\sphinxVerbatim@Continued\@empty + \let\sphinxVerbatim@Continues\@empty + \fi + \ifspx@opt@verbatimwrapslines + % fancyvrb's Verbatim puts each input line in (unbreakable) horizontal boxes. + % This customization wraps each line from the input in a \vtop, thus + % allowing it to wrap and display on two or more lines in the latex output. + % - The codeline counter will be increased only once. + % - The wrapped material will not break across pages, it is impossible + % to achieve this without extensive rewrite of fancyvrb. + % - The (not used in sphinx) obeytabs option to Verbatim is + % broken by this change (showtabs and tabspace work). + \let\sphinxVerbatimFormatLine\sphinxVerbatimFormatLineWrap + \let\FV@Space\spx@verbatim@space + % Allow breaks at special characters using \PYG... macros. + \sphinxbreaksatspecials + % Breaks at punctuation characters . , ; ? ! and / (needs catcode activation) + \fvset{codes*=\sphinxbreaksviaactive}% + \else % end of conditional code for wrapping long code lines + \let\sphinxVerbatimFormatLine\sphinxVerbatimFormatLineNoWrap + \fi + \let\FancyVerbFormatLine\sphinxFancyVerbFormatLine + \VerbatimEnvironment + % workaround to fancyvrb's check of current list depth + \def\@toodeep {\advance\@listdepth\@ne}% + % The list environment is needed to control perfectly the vertical space. + % Note: \OuterFrameSep used by framed.sty is later set to \topsep hence 0pt. + % - if caption: distance from last text baseline to caption baseline is + % A+(B-F)+\ht\strutbox, A = \abovecaptionskip (default 10pt), B = + % \baselineskip, F is the framed.sty \FrameHeightAdjust macro, default 6pt. + % Formula valid for F < 10pt. + % - distance of baseline of caption to top of frame is like for tables: + % \sphinxbelowcaptionspace (=0.5\baselineskip) + % - if no caption: distance of last text baseline to code frame is S+(B-F), + % with S = \sphinxverbatimtopskip (=\smallskip) + % - and distance from bottom of frame to next text baseline is + % \baselineskip+\parskip. + % The \trivlist is used to avoid possible "too deeply nested" error. + \itemsep \z@skip + \topsep \z@skip + \partopsep \z@skip + % trivlist will set \parsep to \parskip (which itself is set to zero above) + % \leftmargin will be set to zero by trivlist + \rightmargin\z@ + \parindent \z@% becomes \itemindent. Default zero, but perhaps overwritten. + \trivlist\item\relax + \ifspx@inframed\setbox\sphinxVerbatim@ContentsBox\vbox\bgroup + \@setminipage\hsize\linewidth + % use bulk of minipage paragraph shape restores (this is needed + % in indented contexts, at least for some) + \textwidth\hsize \columnwidth\hsize \@totalleftmargin\z@ + \leftskip\z@skip \rightskip\z@skip \@rightskip\z@skip + \else + \ifsphinxverbatimwithminipage\noindent\begin{minipage}{\linewidth}\fi + \MakeFramed {% adapted over from framed.sty's snugshade environment + \advance\hsize-\width\@totalleftmargin\z@\linewidth\hsize\@setminipage + }% + \fi + % For grid placement from \strut's in \FancyVerbFormatLine + \lineskip\z@skip + % active comma should not be overwritten by \@noligs + \ifspx@opt@verbatimwrapslines + \let\verbatim@nolig@list \sphinx@verbatim@nolig@list + \fi + % will fetch its optional arguments if any + \OriginalVerbatim +} +{% + \endOriginalVerbatim + \ifspx@inframed + \egroup % finish \sphinxVerbatim@ContentsBox vbox + \nobreak % update page totals + \ifdim\dimexpr\ht\sphinxVerbatim@ContentsBox+ + \dp\sphinxVerbatim@ContentsBox+ + \ht\sphinxVerbatim@TitleBox+ + \dp\sphinxVerbatim@TitleBox+ + 2\fboxsep+2\fboxrule+ + % try to account for external frame parameters + \FrameSep+\FrameRule+ + % Usage here of 2 baseline distances is empirical. + % In border case where code-block fits barely in remaining space, + % it gets framed and looks good but the outer frame may continue + % on top of next page and give (if no contents after code-block) + % an empty framed line, as testing showed. + 2\baselineskip+ + % now add all to accumulated page totals and compare to \pagegoal + \pagetotal+\pagedepth>\pagegoal + % long contents: do not \MakeFramed. Do make a caption (either before or + % after) if title exists. Continuation hints across pagebreaks dropped. + % FIXME? a bottom caption may end up isolated at top of next page + % (no problem with a top caption, which is default) + \spx@opt@verbatimwithframefalse + \def\sphinxVerbatim@Title{\noindent\box\sphinxVerbatim@TitleBox\par}% + \sphinxVerbatim@Before + \noindent\unvbox\sphinxVerbatim@ContentsBox\par + \sphinxVerbatim@After + \else + % short enough contents: use \MakeFramed. As it is nested, this requires + % minipage encapsulation. + \noindent\begin{minipage}{\linewidth}% + \MakeFramed {% Use it now with the fetched contents + \advance\hsize-\width\@totalleftmargin\z@\linewidth\hsize\@setminipage + }% + \unvbox\sphinxVerbatim@ContentsBox + % some of this may be superfluous: + \par\unskip\@minipagefalse\endMakeFramed + \end{minipage}% + \fi + \else % non-nested \MakeFramed + \par\unskip\@minipagefalse\endMakeFramed % from framed.sty snugshade + \ifsphinxverbatimwithminipage\end{minipage}\fi + \fi + \endtrivlist +} +\newenvironment {sphinxVerbatimNoFrame} + {\spx@opt@verbatimwithframefalse + \VerbatimEnvironment + \begin{sphinxVerbatim}} + {\end{sphinxVerbatim}} +\newenvironment {sphinxVerbatimintable} + {% don't use a frame if in a table cell + \spx@opt@verbatimwithframefalse + \sphinxverbatimwithminipagetrue + % the literal block caption uses \sphinxcaption which is wrapper of \caption, + % but \caption must be modified because longtable redefines it to work only + % for the own table caption, and tabulary has multiple passes + \let\caption\sphinxfigcaption + % reduce above caption skip + \def\spx@abovecaptionskip{\sphinxverbatimsmallskipamount}% + \VerbatimEnvironment + \begin{sphinxVerbatim}} + {\end{sphinxVerbatim}} + + +%% PARSED LITERALS +% allow long lines to wrap like they do in code-blocks + +% this should be kept in sync with definitions in sphinx.util.texescape +\newcommand*\sphinxbreaksattexescapedchars{% + \def\do##1##2% put potential break point before character + {\def##1{\discretionary{}{\sphinxafterbreak\char`##2}{\char`##2}}}% + \do\{\{\do\textless\<\do\#\#\do\%\%\do\$\$% {, <, #, %, $ + \def\do##1##2% put potential break point after character + {\def##1{\discretionary{\char`##2}{\sphinxafterbreak}{\char`##2}}}% + \do\_\_\do\}\}\do\textasciicircum\^\do\&\&% _, }, ^, &, + \do\textgreater\>\do\textasciitilde\~% >, ~ + \do\textbackslash\\% \ +} +\newcommand*\sphinxbreaksviaactiveinparsedliteral{% + \sphinxbreaksviaactive % by default handles . , ; ? ! / + \lccode`\~`\~ % + % update \dospecials as it is used by \url + % but deactivation will already have been done hence this is unneeded: + % \expandafter\def\expandafter\dospecials\expandafter{\dospecials + % \sphinxbreaksbeforeactivelist\sphinxbreaksafteractivelist\do\-}% +} +\newcommand*\sphinxbreaksatspaceinparsedliteral{% + \lccode`~32 \lowercase{\let~}\spx@verbatim@space\lccode`\~`\~ +} +\newcommand*{\sphinxunactivateextras}{\let\do\@makeother + \sphinxbreaksbeforeactivelist\sphinxbreaksafteractivelist}% +% the \catcode13=5\relax (deactivate end of input lines) is left to callers +\newcommand*{\sphinxunactivateextrasandspace}{\catcode32=10\relax + \sphinxunactivateextras}% +% alltt uses a monospace font and linebreaks at dashes (which are escaped +% to \sphinxhyphen{} which expands to -\kern\z@) are inhibited with pdflatex. +% Not with xelatex (cf \defaultfontfeatures in latex writer), so: +\newcommand*{\sphinxhypheninparsedliteral}{\sphinxhyphennobreak} +% now for the modified alltt environment +\newenvironment{sphinxalltt} +{% at start of next line to workaround Emacs/AUCTeX issue with this file +\begin{alltt}% + \ifspx@opt@parsedliteralwraps + \sbox\sphinxcontinuationbox {\spx@opt@verbatimcontinued}% + \sbox\sphinxvisiblespacebox {\spx@opt@verbatimvisiblespace}% + \let\sphinxhyphen\sphinxhypheninparsedliteral + \sphinxbreaksattexescapedchars + \sphinxbreaksviaactiveinparsedliteral + \sphinxbreaksatspaceinparsedliteral +% alltt takes care of the ' as derivative ("prime") in math mode + \everymath\expandafter{\the\everymath\sphinxunactivateextrasandspace + \catcode`\<=12\catcode`\>=12\catcode`\^=7\catcode`\_=8 }% +% not sure if displayed math (align,...) can end up in parsed-literal, anyway + \everydisplay\expandafter{\the\everydisplay + \catcode13=5 \sphinxunactivateextrasandspace + \catcode`\<=12\catcode`\>=12\catcode`\^=7\catcode`\_=8 }% + \fi } +{\end{alltt}} + + +%% INLINE MARK-UP +% + +% Protect \href's first argument in contexts such as sphinxalltt (or +% \sphinxcode). Sphinx uses \#, \%, \& ... always inside \sphinxhref. +\protected\def\sphinxhref#1#2{{% + \sphinxunactivateextrasandspace % never do \scantokens with active space! +% for the \endlinechar business, https://github.com/latex3/latex2e/issues/286 + \endlinechar\m@ne\everyeof{{\endlinechar13 #2}}% keep catcode regime for #2 + \scantokens{\href{#1}}% normalise it for #1 during \href expansion +}} +% Same for \url. And also \nolinkurl for coherence. +\protected\def\sphinxurl#1{{% + \sphinxunactivateextrasandspace\everyeof{}% (<- precaution for \scantokens) + \endlinechar\m@ne\scantokens{\url{#1}}% +}} +\protected\def\sphinxnolinkurl#1{{% + \sphinxunactivateextrasandspace\everyeof{}% + \endlinechar\m@ne\scantokens{\nolinkurl{#1}}% +}} + +% \sphinxupquote +% to obtain straight quotes we execute \@noligs as patched by upquote, and +% \scantokens is needed in cases where it would be too late for the macro to +% first set catcodes and then fetch its argument. We also make the contents +% breakable at non-escaped . , ; ? ! / using \sphinxbreaksviaactive, +% and also at \ character (which is escaped to \textbackslash{}). +\protected\def\sphinxtextbackslashbreakbefore + {\discretionary{}{\sphinxafterbreak\sphinx@textbackslash}{\sphinx@textbackslash}} +\protected\def\sphinxtextbackslashbreakafter + {\discretionary{\sphinx@textbackslash}{\sphinxafterbreak}{\sphinx@textbackslash}} +\let\sphinxtextbackslash\sphinxtextbackslashbreakafter +% - is escaped to \sphinxhyphen{} and this default ensures no linebreak +% behaviour (also with a non monospace font, or with xelatex) +\newcommand*{\sphinxhyphenininlineliteral}{\sphinxhyphennobreak} +% the macro must be protected if it ends up used in moving arguments, +% in 'alltt' \@noligs is done already, and the \scantokens must be avoided. +\protected\def\sphinxupquote#1{{\def\@tempa{alltt}% + \ifx\@tempa\@currenvir\else + \let\sphinxhyphen\sphinxhyphenininlineliteral + \ifspx@opt@inlineliteralwraps + % break at . , ; ? ! / + \sphinxbreaksviaactive + % break also at \ + \setbox8=\hbox{\textbackslash}% + \def\sphinx@textbackslash{\copy8}% + \let\textbackslash\sphinxtextbackslash + % by default, no continuation symbol on next line but may be added + \let\sphinxafterbreak\sphinxafterbreakofinlineliteral + % do not overwrite the comma set-up + \let\verbatim@nolig@list\sphinx@literal@nolig@list + \fi + % fix a space-gobbling issue due to LaTeX's original \do@noligs +% TODO: using \@noligs as patched by upquote.sty is now unneeded because +% either ` and ' are escaped (non-unicode engines) or they don't build +% ligatures (unicode engines). Thus remove this and unify handling of `, <, >, +% ' and - with the characters . , ; ? ! / as handled via +% \sphinxbreaksviaactive. +% Hence \sphinx@do@noligs will be removed, or rather replaced with code +% inserting discretionaries, as they allow a continuation symbol on start of +% next line to achieve common design with code-blocks. + \let\do@noligs\sphinx@do@noligs + \@noligs\endlinechar\m@ne\everyeof{}% (<- in case inside \sphinxhref) + \expandafter\scantokens + \fi {{#1}}}}% extra brace pair to fix end-space gobbling issue... +\def\sphinx@do@noligs #1{\catcode`#1\active\begingroup\lccode`\~`#1\relax + \lowercase{\endgroup\def~{\leavevmode\kern\z@\char`#1 }}} +\def\sphinx@literal@nolig@list {\do\`\do\<\do\>\do\'\do\-}% +\let\sphinxafterbreakofinlineliteral\empty + + +\endinput diff --git a/sphinxlatexnumfig.sty b/sphinxlatexnumfig.sty new file mode 100644 index 0000000..6d72961 --- /dev/null +++ b/sphinxlatexnumfig.sty @@ -0,0 +1,122 @@ +%% NUMBERING OF FIGURES, TABLES, AND LITERAL BLOCKS +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexnumfig.sty}[2021/01/27 numbering] + +% Requires: remreset (old LaTeX only) +% relates to numfig and numfig_secnum_depth configuration variables + +% LaTeX 2018-04-01 and later provides \@removefromreset +\ltx@ifundefined{@removefromreset} + {\RequirePackage{remreset}} + {}% avoid warning +% Everything is delayed to \begin{document} to allow hyperref patches into +% \newcounter to solve duplicate label problems for internal hyperlinks to +% code listings (literalblock counter). User or extension re-definitions of +% \theliteralblock, et al., thus have also to be delayed. (changed at 3.5.0) +\AtBeginDocument{% +\ltx@ifundefined{c@chapter} + {\newcounter{literalblock}}% + {\newcounter{literalblock}[chapter]% + \def\theliteralblock{\ifnum\c@chapter>\z@\arabic{chapter}.\fi + \arabic{literalblock}}% + }% +\ifspx@opt@nonumfigreset + \ltx@ifundefined{c@chapter}{}{% + \@removefromreset{figure}{chapter}% + \@removefromreset{table}{chapter}% + \@removefromreset{literalblock}{chapter}% + \ifspx@opt@mathnumfig + \@removefromreset{equation}{chapter}% + \fi + }% + \def\thefigure{\arabic{figure}}% + \def\thetable {\arabic{table}}% + \def\theliteralblock{\arabic{literalblock}}% + \ifspx@opt@mathnumfig + \def\theequation{\arabic{equation}}% + \fi +\else +\let\spx@preAthefigure\@empty +\let\spx@preBthefigure\@empty +% \ifspx@opt@usespart % <-- LaTeX writer could pass such a 'usespart' boolean +% % as sphinx.sty package option +% If document uses \part, (triggered in Sphinx by latex_toplevel_sectioning) +% LaTeX core per default does not reset chapter or section +% counters at each part. +% But if we modify this, we need to redefine \thechapter, \thesection to +% include the part number and this will cause problems in table of contents +% because of too wide numbering. Simplest is to do nothing. +% \fi +\ifnum\spx@opt@numfigreset>0 + \ltx@ifundefined{c@chapter} + {} + {\g@addto@macro\spx@preAthefigure{\ifnum\c@chapter>\z@\arabic{chapter}.}% + \g@addto@macro\spx@preBthefigure{\fi}}% +\fi +\ifnum\spx@opt@numfigreset>1 + \@addtoreset{figure}{section}% + \@addtoreset{table}{section}% + \@addtoreset{literalblock}{section}% + \ifspx@opt@mathnumfig + \@addtoreset{equation}{section}% + \fi% + \g@addto@macro\spx@preAthefigure{\ifnum\c@section>\z@\arabic{section}.}% + \g@addto@macro\spx@preBthefigure{\fi}% +\fi +\ifnum\spx@opt@numfigreset>2 + \@addtoreset{figure}{subsection}% + \@addtoreset{table}{subsection}% + \@addtoreset{literalblock}{subsection}% + \ifspx@opt@mathnumfig + \@addtoreset{equation}{subsection}% + \fi% + \g@addto@macro\spx@preAthefigure{\ifnum\c@subsection>\z@\arabic{subsection}.}% + \g@addto@macro\spx@preBthefigure{\fi}% +\fi +\ifnum\spx@opt@numfigreset>3 + \@addtoreset{figure}{subsubsection}% + \@addtoreset{table}{subsubsection}% + \@addtoreset{literalblock}{subsubsection}% + \ifspx@opt@mathnumfig + \@addtoreset{equation}{subsubsection}% + \fi% + \g@addto@macro\spx@preAthefigure{\ifnum\c@subsubsection>\z@\arabic{subsubsection}.}% + \g@addto@macro\spx@preBthefigure{\fi}% +\fi +\ifnum\spx@opt@numfigreset>4 + \@addtoreset{figure}{paragraph}% + \@addtoreset{table}{paragraph}% + \@addtoreset{literalblock}{paragraph}% + \ifspx@opt@mathnumfig + \@addtoreset{equation}{paragraph}% + \fi% + \g@addto@macro\spx@preAthefigure{\ifnum\c@subparagraph>\z@\arabic{subparagraph}.}% + \g@addto@macro\spx@preBthefigure{\fi}% +\fi +\ifnum\spx@opt@numfigreset>5 + \@addtoreset{figure}{subparagraph}% + \@addtoreset{table}{subparagraph}% + \@addtoreset{literalblock}{subparagraph}% + \ifspx@opt@mathnumfig + \@addtoreset{equation}{subparagraph}% + \fi% + \g@addto@macro\spx@preAthefigure{\ifnum\c@subsubparagraph>\z@\arabic{subsubparagraph}.}% + \g@addto@macro\spx@preBthefigure{\fi}% +\fi +\expandafter\g@addto@macro +\expandafter\spx@preAthefigure\expandafter{\spx@preBthefigure}% +\let\thefigure\spx@preAthefigure +\let\thetable\spx@preAthefigure +\let\theliteralblock\spx@preAthefigure +\g@addto@macro\thefigure{\arabic{figure}}% +\g@addto@macro\thetable{\arabic{table}}% +\g@addto@macro\theliteralblock{\arabic{literalblock}}% + \ifspx@opt@mathnumfig + \let\theequation\spx@preAthefigure + \g@addto@macro\theequation{\arabic{equation}}% + \fi +\fi +}% end of big \AtBeginDocument + +\endinput diff --git a/sphinxlatexobjects.sty b/sphinxlatexobjects.sty new file mode 100644 index 0000000..3deda5c --- /dev/null +++ b/sphinxlatexobjects.sty @@ -0,0 +1,215 @@ +%% MODULE RELEASE DATA AND OBJECT DESCRIPTIONS +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexobjects.sty}[2021/12/05 documentation environments] + +% Provides support for this output mark-up from Sphinx latex writer: +% +% - environments +% +% - fulllineitems +% - productionlist +% - optionlist +% - DUlineblock (also "lineblock") +% +% - macros +% +% - \DUrole +% - various legacy support macros related to author and release +% data of documented objects and modules. + +% \moduleauthor{name}{email} +\newcommand{\moduleauthor}[2]{} + +% \sectionauthor{name}{email} +\newcommand{\sectionauthor}[2]{} + +% Allow the release number to be specified independently of the +% \date{}. This allows the date to reflect the document's date and +% release to specify the release that is documented. +% +\newcommand{\py@release}{\releasename\space\version} +\newcommand{\version}{}% part of \py@release, used by title page and headers +% \releaseinfo is used on titlepage (sphinxmanual.cls, sphinxhowto.cls) +\newcommand{\releaseinfo}{} +\newcommand{\setreleaseinfo}[1]{\renewcommand{\releaseinfo}{#1}} +% this is inserted via template and #1=release config variable +\newcommand{\release}[1]{\renewcommand{\version}{#1}} +% this is defined by template to 'releasename' latex_elements key +\newcommand{\releasename}{} +% Fix issue in case release and releasename deliberately left blank +\newcommand{\sphinxheadercomma}{, }% used in fancyhdr header definition +\newcommand{\sphinxifemptyorblank}[1]{% +% test after one expansion of macro #1 if contents is empty or spaces + \if&\expandafter\@firstofone\detokenize\expandafter{#1}&% + \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}% +\AtBeginDocument {% + \sphinxifemptyorblank{\releasename} + {\sphinxifemptyorblank{\version}{\let\sphinxheadercomma\empty}{}} + {}% +}% + +% Allow specification of the author's address separately from the +% author's name. This can be used to format them differently, which +% is a good thing. +% +\newcommand{\py@authoraddress}{} +\newcommand{\authoraddress}[1]{\renewcommand{\py@authoraddress}{#1}} + +% {fulllineitems} is the main environment for object descriptions. +% +% With 4.0.0 \pysigline (and \pysiglinewithargsret), used in a fulllineitems +% environment the #1 will already be of the width which is computed here, i.e. +% the available width on line, so the \makebox becomes a bit superfluous +\newcommand{\py@itemnewline}[1]{% macro used as \makelabel in fulllineitems +% Memo: this presupposes \itemindent is 0pt + \kern\labelsep % because \@labels core latex box does \hskip-\labelsep + \makebox[\dimexpr\linewidth+\labelwidth\relax][l]{#1}% + \kern-\labelsep % because at end of \@labels box there is \hskip\labelsep +} + +\newenvironment{fulllineitems}{% + \begin{list}{}{\labelwidth \leftmargin + \rightmargin \z@ \topsep -\parskip \partopsep \parskip + \itemsep -\parsep + \let\makelabel=\py@itemnewline}% +}{\end{list}} + +% Signatures, possibly multi-line +% +\newlength{\py@argswidth} +\newcommand{\py@sigparams}[2]{% + % The \py@argswidth has been computed in \pysiglinewithargsret to make this + % occupy full available width on line. + \parbox[t]{\py@argswidth}{\raggedright #1\sphinxcode{)}#2\strut}% + % final strut is to help get correct vertical separation in case of multi-line + % box with the item contents. +} +\newcommand{\pysigline}[1]{% +% the \py@argswidth is available we use it despite its name (no "args" here) +% the \relax\relax is because \py@argswidth is a "skip" variable and the first +% \relax only ends its "dimen" part + \py@argswidth=\dimexpr\linewidth+\labelwidth\relax\relax + \item[{\parbox[t]{\py@argswidth}{\raggedright #1\strut}}] + \futurelet\sphinx@token\pysigline@preparevspace@i +} +\newcommand{\pysiglinewithargsret}[3]{% + \settowidth{\py@argswidth}{#1\sphinxcode{(}}% + \py@argswidth=\dimexpr\linewidth+\labelwidth-\py@argswidth\relax\relax + \item[{#1\sphinxcode{(}\py@sigparams{#2}{#3}\strut}] + \futurelet\sphinx@token\pysigline@preparevspace@i +} +\def\pysigline@preparevspace@i{% + \ifx\sphinx@token\@sptoken + \expandafter\pysigline@preparevspace@again + \else\expandafter\pysigline@preparevspace@ii + \fi +} +\@firstofone{\def\pysigline@preparevspace@again} {\futurelet\sphinx@token\pysigline@preparevspace@i} +\long\def\pysigline@preparevspace@ii#1{% + \ifx\sphinx@token\bgroup\expandafter\@firstoftwo + \else + \ifx\sphinx@token\phantomsection + \else +% this strange incantation is because at its root LaTeX in fact did not +% imagine a multi-line label, it is always wrapped in a horizontal box at core +% LaTeX level and we have to find tricks to get correct interline distances. +% It interacts badly with a follow-up \phantomsection hence the test above + \leavevmode\par\nobreak\vskip-\parskip\prevdepth\dp\strutbox + \fi + \expandafter\@secondoftwo + \fi + {{#1}}{#1}% +} +\newcommand{\pysigstartmultiline}{% + \def\pysigstartmultiline{\vskip\smallskipamount\parskip\z@skip\itemsep\z@skip}% + \edef\pysigstopmultiline + {\noexpand\leavevmode\parskip\the\parskip\relax\itemsep\the\itemsep\relax}% + \parskip\z@skip\itemsep\z@skip +} + +% Production lists +% +\newenvironment{productionlist}{% +% \def\sphinxoptional##1{{\Large[}##1{\Large]}} + \def\production##1##2{\\\sphinxcode{\sphinxupquote{##1}}&::=&\sphinxcode{\sphinxupquote{##2}}}% + \def\productioncont##1{\\& &\sphinxcode{\sphinxupquote{##1}}}% + \parindent=2em + \indent + \setlength{\LTpre}{0pt}% + \setlength{\LTpost}{0pt}% + \begin{longtable}[l]{lcl} +}{% + \end{longtable} +} + +% Definition lists; requested by AMK for HOWTO documents. Probably useful +% elsewhere as well, so keep in in the general style support. +% +\newenvironment{definitions}{% + \begin{description}% + \def\term##1{\item[{##1}]\mbox{}\\*[0mm]}% +}{% + \end{description}% +} + +%% FROM DOCTUTILS LATEX WRITER +% +% The following is stuff copied from docutils' latex writer. +% +\newcommand{\optionlistlabel}[1]{\normalfont\bfseries #1 \hfill}% \bf deprecated +\newenvironment{optionlist}[1] +{\begin{list}{} + {\setlength{\labelwidth}{#1} + \setlength{\rightmargin}{1cm} + \setlength{\leftmargin}{\rightmargin} + \addtolength{\leftmargin}{\labelwidth} + \addtolength{\leftmargin}{\labelsep} + \renewcommand{\makelabel}{\optionlistlabel}} +}{\end{list}} + +\newlength{\lineblockindentation} +\setlength{\lineblockindentation}{2.5em} +\newenvironment{lineblock}[1] +{\begin{list}{} + {\setlength{\partopsep}{\parskip} + \addtolength{\partopsep}{\baselineskip} + \topsep0pt\itemsep0.15\baselineskip\parsep0pt + \leftmargin#1\relax} + \raggedright} +{\end{list}} + +% From docutils.writers.latex2e +% inline markup (custom roles) +% \DUrole{#1}{#2} tries \DUrole#1{#2} +\providecommand*{\DUrole}[2]{% + \ifcsname DUrole\detokenize{#1}\endcsname + \csname DUrole\detokenize{#1}\endcsname{#2}% + \else% backwards compatibility: try \docutilsrole#1{#2} + \ifcsname docutilsrole\detokenize{#1}\endcsname + \csname docutilsrole\detokenize{#1}\endcsname{#2}% + \else + #2% + \fi + \fi +} + +\providecommand*{\DUprovidelength}[2]{% + \ifdefined#1\else\newlength{#1}\setlength{#1}{#2}\fi +} + +\DUprovidelength{\DUlineblockindent}{2.5em} +\ifdefined\DUlineblock\else + \newenvironment{DUlineblock}[1]{% + \list{}{\setlength{\partopsep}{\parskip} + \addtolength{\partopsep}{\baselineskip} + \setlength{\topsep}{0pt} + \setlength{\itemsep}{0.15\baselineskip} + \setlength{\parsep}{0pt} + \setlength{\leftmargin}{#1}} + \raggedright + } + {\endlist} +\fi + +\endinput diff --git a/sphinxlatexshadowbox.sty b/sphinxlatexshadowbox.sty new file mode 100644 index 0000000..8d6c786 --- /dev/null +++ b/sphinxlatexshadowbox.sty @@ -0,0 +1,100 @@ +%% TOPIC AND CONTENTS BOXES +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexshadowbox.sty}[2021/01/27 sphinxShadowBox] + +% Provides support for this output mark-up from Sphinx latex writer: +% +% - sphinxShadowBox (environment) +% +% Dependencies (they do not need to be defined at time of loading): +% +% - of course the various colour and dimension options handled via sphinx.sty +% - dimension register \spx@image@maxheight from sphinxlatexgraphics.sty +% - \savenotes/\spewnotes from sphinxpackagefootnote +% - \ifspx@inframed defined in sphinx.sty +% +% Requires: +\RequirePackage{framed} + +% Again based on use of "framed.sty", this allows breakable framed boxes. +\long\def\spx@ShadowFBox#1{% + \leavevmode\begingroup + % first we frame the box #1 + \setbox\@tempboxa + \hbox{\vrule\@width\sphinxshadowrule + \vbox{\hrule\@height\sphinxshadowrule + \kern\sphinxshadowsep + \hbox{\kern\sphinxshadowsep #1\kern\sphinxshadowsep}% + \kern\sphinxshadowsep + \hrule\@height\sphinxshadowrule}% + \vrule\@width\sphinxshadowrule}% + % Now we add the shadow, like \shadowbox from fancybox.sty would do + \dimen@\dimexpr.5\sphinxshadowrule+\sphinxshadowsize\relax + \hbox{\vbox{\offinterlineskip + \hbox{\copy\@tempboxa\kern-.5\sphinxshadowrule + % add shadow on right side + \lower\sphinxshadowsize + \hbox{\vrule\@height\ht\@tempboxa \@width\dimen@}% + }% + \kern-\dimen@ % shift back vertically to bottom of frame + % and add shadow at bottom + \moveright\sphinxshadowsize + \vbox{\hrule\@width\wd\@tempboxa \@height\dimen@}% + }% + % move left by the size of right shadow so shadow adds no width + \kern-\sphinxshadowsize + }% + \endgroup +} + +% use framed.sty to allow page breaks in frame+shadow +% works well inside Lists and Quote-like environments +% produced by ``topic'' directive (or local contents) +% could nest if LaTeX writer authorized it +\newenvironment{sphinxShadowBox} + {\def\FrameCommand {\spx@ShadowFBox }% + \advance\spx@image@maxheight + -\dimexpr2\sphinxshadowrule + +2\sphinxshadowsep + +\sphinxshadowsize + +\baselineskip\relax + % configure framed.sty not to add extra vertical spacing + \ltx@ifundefined{OuterFrameSep}{}{\OuterFrameSep\z@skip}% + % the \trivlist will add the vertical spacing on top and bottom which is + % typical of center environment as used in Sphinx <= 1.4.1 + % the \noindent has the effet of an extra blank line on top, to + % imitate closely the layout from Sphinx <= 1.4.1; the \FrameHeightAdjust + % will put top part of frame on this baseline. + \def\FrameHeightAdjust {\baselineskip}% + % use package footnote to handle footnotes + \savenotes + \trivlist\item\noindent + % use a minipage if we are already inside a framed environment + \ifspx@inframed\begin{minipage}{\linewidth}\fi + \MakeFramed {\spx@inframedtrue + % framed.sty puts into "\width" the added width (=2shadowsep+2shadowrule) + % adjust \hsize to what the contents must use + \advance\hsize-\width + % adjust LaTeX parameters to behave properly in indented/quoted contexts + \FrameRestore + % typeset the contents as in a minipage (Sphinx <= 1.4.1 used a minipage and + % itemize/enumerate are therein typeset more tightly, we want to keep + % that). We copy-paste from LaTeX source code but don't do a real minipage. + \@pboxswfalse + \let\@listdepth\@mplistdepth \@mplistdepth\z@ + \@minipagerestore + \@setminipage + }% + }% + {% insert the "endminipage" code + \par\unskip + \@minipagefalse + \endMakeFramed + \ifspx@inframed\end{minipage}\fi + \endtrivlist + % output the stored footnotes + \spewnotes + } + +\endinput diff --git a/sphinxlatexstyleheadings.sty b/sphinxlatexstyleheadings.sty new file mode 100644 index 0000000..fa9be82 --- /dev/null +++ b/sphinxlatexstyleheadings.sty @@ -0,0 +1,83 @@ +%% TITLES +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexstyleheadings.sty}[2021/01/27 headings] + +\RequirePackage[nobottomtitles*]{titlesec} +\@ifpackagelater{titlesec}{2016/03/15}% + {\@ifpackagelater{titlesec}{2016/03/21}% + {}% + {\newif\ifsphinx@ttlpatch@ok + \IfFileExists{etoolbox.sty}{% + \RequirePackage{etoolbox}% + \patchcmd{\ttlh@hang}{\parindent\z@}{\parindent\z@\leavevmode}% + {\sphinx@ttlpatch@oktrue}{}% + \ifsphinx@ttlpatch@ok + \patchcmd{\ttlh@hang}{\noindent}{}{}{\sphinx@ttlpatch@okfalse}% + \fi + }{}% + \ifsphinx@ttlpatch@ok + \typeout{^^J Package Sphinx Info: ^^J + **** titlesec 2.10.1 successfully patched for bugfix ****^^J}% + \else + \AtEndDocument{\PackageWarningNoLine{sphinx}{^^J% +******** titlesec 2.10.1 has a bug, (section numbers disappear) ......|^^J% +******** and Sphinx could not patch it, perhaps because your local ...|^^J% +******** copy is already fixed without a changed release date. .......|^^J% +******** If not, you must update titlesec! ...........................|}}% + \fi + }% + }{} + +% Augment the sectioning commands used to get our own font family in place, +% and reset some internal data items (\titleformat from titlesec package) +\titleformat{\section}{\Large\py@HeaderFamily}% + {\py@TitleColor\thesection}{0.5em}{\py@TitleColor} +\titleformat{\subsection}{\large\py@HeaderFamily}% + {\py@TitleColor\thesubsection}{0.5em}{\py@TitleColor} +\titleformat{\subsubsection}{\py@HeaderFamily}% + {\py@TitleColor\thesubsubsection}{0.5em}{\py@TitleColor} +% By default paragraphs (and subsubsections) will not be numbered because +% sphinxmanual.cls and sphinxhowto.cls set secnumdepth to 2 +\titleformat{\paragraph}{\py@HeaderFamily}% + {\py@TitleColor\theparagraph}{0.5em}{\py@TitleColor} +\titleformat{\subparagraph}{\py@HeaderFamily}% + {\py@TitleColor\thesubparagraph}{0.5em}{\py@TitleColor} + + +% Since Sphinx 1.5, users should use HeaderFamily key to 'sphinxsetup' rather +% than defining their own \py@HeaderFamily command (which is still possible). +% Memo: \py@HeaderFamily is also used by \maketitle as defined in +% sphinxmanual.cls/sphinxhowto.cls +\newcommand{\py@HeaderFamily}{\spx@opt@HeaderFamily} + +% This sets up the fancy chapter headings that make the documents look +% at least a little better than the usual LaTeX output. +\@ifpackagewith{fncychap}{Bjarne}{ + \ChNameVar {\raggedleft\normalsize \py@HeaderFamily} + \ChNumVar {\raggedleft\Large \py@HeaderFamily} + \ChTitleVar{\raggedleft\Large \py@HeaderFamily} + % This creates (numbered) chapter heads without the leading \vspace*{}: + \def\@makechapterhead#1{% + {\parindent \z@ \raggedright \normalfont + \ifnum \c@secnumdepth >\m@ne + \if@mainmatter + \DOCH + \fi + \fi + \interlinepenalty\@M + \if@mainmatter + \DOTI{#1}% + \else% + \DOTIS{#1}% + \fi + }} +}{}% <-- "false" clause of \@ifpackagewith + +% fix fncychap's bug which uses prematurely the \textwidth value +\@ifpackagewith{fncychap}{Bjornstrup} + {\AtBeginDocument{\mylen\textwidth\advance\mylen-2\myhi}}% + {}% <-- "false" clause of \@ifpackagewith + + +\endinput diff --git a/sphinxlatexstylepage.sty b/sphinxlatexstylepage.sty new file mode 100644 index 0000000..4066129 --- /dev/null +++ b/sphinxlatexstylepage.sty @@ -0,0 +1,79 @@ +%% PAGE STYLING +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexstylepage.sty}[2021/01/27 page styling] + +% Separate paragraphs by space by default. +\IfFileExists{parskip-2001-04-09.sty}% since September 2018 TeXLive update +% new parskip.sty, but let it rollback to old one. +% hopefully TeX installation not broken and LaTeX kernel not too old + {\RequirePackage{parskip}[=v1]} +% standard one from 1989. Admittedly \section of article/book gives possibly +% anomalous spacing, but we can't require September 2018 release for some time. + {\RequirePackage{parskip}} + +% Style parameters and macros used by most documents here +\raggedbottom +\sloppy +\hbadness = 5000 % don't print trivial gripes + +% Require package fancyhdr except under memoir class +\@ifclassloaded{memoir}{}{\RequirePackage{fancyhdr}} +% Use \pagestyle{normal} as the primary pagestyle for text. +% Redefine the 'normal' header/footer style when using "fancyhdr" package: +\@ifpackageloaded{fancyhdr}{% + \ltx@ifundefined{c@chapter} + {% no \chapter, "howto" (non-Japanese) docclass + \fancypagestyle{plain}{ + \fancyhf{} + \fancyfoot[C]{{\py@HeaderFamily\thepage}} + \renewcommand{\headrulewidth}{0pt} + \renewcommand{\footrulewidth}{0pt} + } + % Same as 'plain', this way we can use it in template + % FIXME: shouldn't this have a running header with Name and Release like 'manual'? + \fancypagestyle{normal}{ + \fancyhf{} + \fancyfoot[C]{{\py@HeaderFamily\thepage}} + \renewcommand{\headrulewidth}{0pt} + \renewcommand{\footrulewidth}{0pt} + } + }% + {% classes with \chapter command + \fancypagestyle{normal}{ + \fancyhf{} + \fancyfoot[RO]{{\py@HeaderFamily\thepage}} + \fancyfoot[LO]{{\py@HeaderFamily\nouppercase{\rightmark}}} + \fancyhead[RO]{{\py@HeaderFamily \@title\sphinxheadercomma\py@release}} + \if@twoside + \fancyfoot[LE]{{\py@HeaderFamily\thepage}} + \fancyfoot[RE]{{\py@HeaderFamily\nouppercase{\leftmark}}} + \fancyhead[LE]{{\py@HeaderFamily \@title\sphinxheadercomma\py@release}} + \fi + \renewcommand{\headrulewidth}{0.4pt} + \renewcommand{\footrulewidth}{0.4pt} + % define chaptermark with \@chappos when \@chappos is available for Japanese + \ltx@ifundefined{@chappos}{} + {\def\chaptermark##1{\markboth{\@chapapp\space\thechapter\space\@chappos\space ##1}{}}} + } + % Update the plain style so we get the page number & footer line, + % but not a chapter or section title. This is to keep the first + % page of a chapter `clean.' + \fancypagestyle{plain}{ + \fancyhf{} + \fancyfoot[RO]{{\py@HeaderFamily\thepage}} + \if@twoside\fancyfoot[LE]{{\py@HeaderFamily\thepage}}\fi + \renewcommand{\headrulewidth}{0pt} + \renewcommand{\footrulewidth}{0.4pt} + } + } + } + {% no fancyhdr: memoir class + % Provide default for 'normal' style simply as an alias of 'plain' style + % This way we can use \pagestyle{normal} in LaTeX template + \def\ps@normal{\ps@plain} + % Users of memoir class are invited to redefine 'normal' style in preamble + } + + +\endinput diff --git a/sphinxlatexstyletext.sty b/sphinxlatexstyletext.sty new file mode 100644 index 0000000..539ee0d --- /dev/null +++ b/sphinxlatexstyletext.sty @@ -0,0 +1,134 @@ +%% TEXT STYLING +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexstyletext.sty}[2021/12/06 text styling] + +% Basically everything here consists of macros which are part of the latex +% markup produced by the Sphinx latex writer + +% Some custom font markup commands. +\protected\def\sphinxstrong#1{\textbf{#1}} +\protected\def\sphinxcode#1{\texttt{#1}} +\protected\def\sphinxbfcode#1{\textbf{\sphinxcode{#1}}} +\protected\def\sphinxemail#1{\textsf{#1}} +\protected\def\sphinxtablecontinued#1{\textsf{#1}} +\protected\def\sphinxtitleref#1{\emph{#1}} +\protected\def\sphinxmenuselection#1{\emph{#1}} +\protected\def\sphinxguilabel#1{\emph{#1}} +\protected\def\sphinxkeyboard#1{\sphinxcode{#1}} +\protected\def\sphinxaccelerator#1{\underline{#1}} +\protected\def\sphinxcrossref#1{\emph{#1}} +\protected\def\sphinxtermref#1{\emph{#1}} +% \optional is used for ``[, arg]``, i.e. desc_optional nodes. +\long\protected\def\sphinxoptional#1{% + {\textnormal{\Large[}}{#1}\hspace{0.5mm}{\textnormal{\Large]}}} + +% additional customizable styling +\def\sphinxstyleindexentry #1{\texttt{#1}} +\def\sphinxstyleindexextra #1{ (\emph{#1})} +\def\sphinxstyleindexpageref #1{, \pageref{#1}} +\def\sphinxstyleindexpagemain#1{\textbf{#1}} +\def\spxentry{\@backslashchar spxentry}% let to \sphinxstyleindexentry in index +\def\spxextra{\@backslashchar spxextra}% let to \sphinxstyleindexextra in index +\def\sphinxstyleindexlettergroup #1% + {{\Large\sffamily#1}\nopagebreak\vspace{1mm}} +\def\sphinxstyleindexlettergroupDefault #1% + {{\Large\sffamily\sphinxnonalphabeticalgroupname}\nopagebreak\vspace{1mm}} +\protected\def\sphinxstyletopictitle #1{\textbf{#1}\par\medskip} +\let\sphinxstylesidebartitle\sphinxstyletopictitle +\protected\def\sphinxstyleothertitle #1{\textbf{#1}} +\protected\def\sphinxstylesidebarsubtitle #1{~\\\textbf{#1} \smallskip} +% \text.. commands do not allow multiple paragraphs +\protected\def\sphinxstyletheadfamily {\sffamily} +\protected\def\sphinxstyleemphasis #1{\emph{#1}} +\protected\def\sphinxstyleliteralemphasis#1{\emph{\sphinxcode{#1}}} +\protected\def\sphinxstylestrong #1{\textbf{#1}} +\protected\def\sphinxstyleliteralstrong#1{\sphinxbfcode{#1}} +\protected\def\sphinxstyleabbreviation #1{\textsc{#1}} +\protected\def\sphinxstyleliteralintitle#1{\sphinxcode{#1}} +\newcommand*\sphinxstylecodecontinued[1]{\footnotesize(#1)}% +\newcommand*\sphinxstylecodecontinues[1]{\footnotesize(#1)}% +% figure legend comes after caption and may contain arbitrary body elements +\newenvironment{sphinxlegend}{\par\small}{\par} +% reduce hyperref "Token not allowed in a PDF string" warnings on PDF builds +\AtBeginDocument{\pdfstringdefDisableCommands{% +% all "protected" macros possibly ending up in section titles should be here +% TODO: examine if \sphinxhref, \sphinxurl, \sphinnolinkurl should be handled + \let\sphinxstyleemphasis \@firstofone + \let\sphinxstyleliteralemphasis \@firstofone + \let\sphinxstylestrong \@firstofone + \let\sphinxstyleliteralstrong \@firstofone + \let\sphinxstyleabbreviation \@firstofone + \let\sphinxstyleliteralintitle \@firstofone + \let\sphinxupquote \@firstofone + \let\sphinxstrong \@firstofone + \let\sphinxcode \@firstofone + \let\sphinxbfcode \@firstofone + \let\sphinxemail \@firstofone + \let\sphinxcrossref \@firstofone + \let\sphinxtermref \@firstofone + \let\sphinxhyphen\sphinxhyphenforbookmarks +}} + +% Special characters +% +% The \kern\z@ is to prevent en-dash and em-dash TeX ligatures. +% A linebreak can occur after the dash in regular text (this is +% normal behaviour of "-" in TeX, it is not related to \kern\z@). +% +% Parsed-literals and inline literals also use the \sphinxhyphen +% but linebreaks there are prevented due to monospace font family. +% (xelatex needs a special addition, cf. sphinxlatexliterals.sty) +% +% Inside code-blocks, dashes are escaped via another macro, from +% Pygments latex output (search for \PYGZhy in sphinxlatexliterals.sty), +% and are configured to allow linebreaks despite the monospace font. +% (the #1 swallows the {} from \sphinxhyphen{} mark-up) +\protected\def\sphinxhyphen#1{-\kern\z@} +\protected\def\sphinxhyphennobreak#1{\mbox{-}} +% The {} from texescape mark-up is kept, else -- gives en-dash in PDF bookmark +\def\sphinxhyphenforbookmarks{-} + +% For curly braces inside \index macro +\def\sphinxleftcurlybrace{\{} +\def\sphinxrightcurlybrace{\}} + +% Declare Unicode characters used by linux tree command to pdflatex utf8/utf8x +\def\spx@bd#1#2{% + \leavevmode + \begingroup + \ifx\spx@bd@height \@undefined\def\spx@bd@height{\baselineskip}\fi + \ifx\spx@bd@width \@undefined\setbox0\hbox{0}\def\spx@bd@width{\wd0 }\fi + \ifx\spx@bd@thickness\@undefined\def\spx@bd@thickness{.6\p@}\fi + \ifx\spx@bd@lower \@undefined\def\spx@bd@lower{\dp\strutbox}\fi + \lower\spx@bd@lower#1{#2}% + \endgroup +}% +\@namedef{sphinx@u2500}% BOX DRAWINGS LIGHT HORIZONTAL + {\spx@bd{\vbox to\spx@bd@height} + {\vss\hrule\@height\spx@bd@thickness + \@width\spx@bd@width\vss}}% +\@namedef{sphinx@u2502}% BOX DRAWINGS LIGHT VERTICAL + {\spx@bd{\hb@xt@\spx@bd@width} + {\hss\vrule\@height\spx@bd@height + \@width \spx@bd@thickness\hss}}% +\@namedef{sphinx@u2514}% BOX DRAWINGS LIGHT UP AND RIGHT + {\spx@bd{\hb@xt@\spx@bd@width} + {\hss\raise.5\spx@bd@height + \hb@xt@\z@{\hss\vrule\@height.5\spx@bd@height + \@width \spx@bd@thickness\hss}% + \vbox to\spx@bd@height{\vss\hrule\@height\spx@bd@thickness + \@width.5\spx@bd@width\vss}}}% +\@namedef{sphinx@u251C}% BOX DRAWINGS LIGHT VERTICAL AND RIGHT + {\spx@bd{\hb@xt@\spx@bd@width} + {\hss + \hb@xt@\z@{\hss\vrule\@height\spx@bd@height + \@width \spx@bd@thickness\hss}% + \vbox to\spx@bd@height{\vss\hrule\@height\spx@bd@thickness + \@width.5\spx@bd@width\vss}}}% +\protected\def\sphinxunichar#1{\@nameuse{sphinx@u#1}}% + +% Tell TeX about pathological hyphenation cases: +\hyphenation{Base-HTTP-Re-quest-Hand-ler} + +\endinput diff --git a/sphinxlatextables.sty b/sphinxlatextables.sty new file mode 100644 index 0000000..c3c1d6a --- /dev/null +++ b/sphinxlatextables.sty @@ -0,0 +1,481 @@ +%% TABLES (WITH SUPPORT FOR MERGED CELLS OF GENERAL CONTENTS) +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatextables.sty}[2021/01/27 tables]% + +% Provides support for this output mark-up from Sphinx latex writer +% and table templates: +% +% - the tabulary and longtable environments from the eponymous packages +% - the varwidth environment +% - the >{} etc mark-up possible in tabularcolumns is from array package +% which is loaded by longtable and tabulary +% - \X, \Y, T column types; others (L, C, R, J) are from tabulary package +% - \sphinxaftertopcaption +% - \sphinxatlongtableend +% - \sphinxatlongtablestart +% - \sphinxattableend +% - \sphinxattablestart +% - \sphinxcapstartof +% - \sphinxcolwidth +% - \sphinxlongtablecapskipadjust +% - \sphinxmultirow +% - \sphinxstartmulticolumn +% - \sphinxstopmulticolumn +% - \sphinxtablestrut +% - \sphinxthecaptionisattop +% - \sphinxthelongtablecaptionisattop +% +% Executes \RequirePackage for: +% +% - tabulary +% - longtable +% - varwidth +% +% Extends tabulary and longtable via patches and custom macros to support +% merged cells possibly containing code-blocks in complex tables + +\RequirePackage{tabulary} +% tabulary has a bug with its re-definition of \multicolumn in its first pass +% which is not \long. But now Sphinx does not use LaTeX's \multicolumn but its +% own macro. Hence we don't even need to patch tabulary. See +% sphinxpackagemulticell.sty +% X or S (Sphinx) may have meanings if some table package is loaded hence +% \X was chosen to avoid possibility of conflict +\newcolumntype{\X}[2]{p{\dimexpr + (\linewidth-\arrayrulewidth)*#1/#2-\tw@\tabcolsep-\arrayrulewidth\relax}} +\newcolumntype{\Y}[1]{p{\dimexpr + #1\dimexpr\linewidth-\arrayrulewidth\relax-\tw@\tabcolsep-\arrayrulewidth\relax}} +% using here T (for Tabulary) feels less of a problem than the X could be +\newcolumntype{T}{J}% +% For tables allowing pagebreaks +\RequirePackage{longtable} +% User interface to set-up whitespace before and after tables: +\newcommand*\sphinxtablepre {0pt}% +\newcommand*\sphinxtablepost{\medskipamount}% +% Space from caption baseline to top of table or frame of literal-block +\newcommand*\sphinxbelowcaptionspace{.5\sphinxbaselineskip}% +% as one can not use \baselineskip from inside longtable (it is zero there) +% we need \sphinxbaselineskip, which defaults to \baselineskip +\def\sphinxbaselineskip{\baselineskip}% +% The following is to ensure that, whether tabular(y) or longtable: +% - if a caption is on top of table: +% a) the space between its last baseline and the top rule of table is +% exactly \sphinxbelowcaptionspace +% b) the space from last baseline of previous text to first baseline of +% caption is exactly \parskip+\baselineskip+ height of a strut. +% c) the caption text will wrap at width \LTcapwidth (4in) +% - make sure this works also if "caption" package is loaded by user +% (with its width or margin option taking place of \LTcapwidth role) +% TODO: obtain same for caption of literal block: a) & c) DONE, b) TO BE DONE +% +% To modify space below such top caption, adjust \sphinxbelowcaptionspace +% To add or remove space above such top caption, adjust \sphinxtablepre: +% notice that \abovecaptionskip, \belowcaptionskip, \LTpre are **ignored** +% A. Table with longtable +\def\sphinxatlongtablestart + {\par + \vskip\parskip + \vskip\dimexpr\sphinxtablepre\relax % adjust vertical position + \vbox{}% get correct baseline from above + \LTpre\z@skip\LTpost\z@skip % set to zero longtable's own skips + \edef\sphinxbaselineskip{\dimexpr\the\dimexpr\baselineskip\relax\relax}% + }% +% Compatibility with caption package +\def\sphinxthelongtablecaptionisattop{% + \spx@ifcaptionpackage{\noalign{\vskip-\belowcaptionskip}}{}% +}% +% Achieves exactly \sphinxbelowcaptionspace below longtable caption +\def\sphinxlongtablecapskipadjust + {\dimexpr-\dp\strutbox + -\spx@ifcaptionpackage{\abovecaptionskip}{\sphinxbaselineskip}% + +\sphinxbelowcaptionspace\relax}% +\def\sphinxatlongtableend{\@nobreakfalse % latex3/latex2e#173 + \prevdepth\z@\vskip\sphinxtablepost\relax}% +% B. Table with tabular or tabulary +\def\sphinxattablestart{\par\vskip\dimexpr\sphinxtablepre\relax}% +\let\sphinxattableend\sphinxatlongtableend +% This is used by tabular and tabulary templates +\newcommand*\sphinxcapstartof[1]{% + \vskip\parskip + \vbox{}% force baselineskip for good positioning by capstart of hyperanchor + % hyperref puts the anchor 6pt above this baseline; in case of caption + % this baseline will be \ht\strutbox above first baseline of caption + \def\@captype{#1}% + \capstart +% move back vertically, as tabular (or its caption) will compensate + \vskip-\baselineskip\vskip-\parskip +}% +\def\sphinxthecaptionisattop{% locate it after \sphinxcapstartof + \spx@ifcaptionpackage + {\caption@setposition{t}% + \vskip\baselineskip\vskip\parskip % undo those from \sphinxcapstartof + \vskip-\belowcaptionskip % anticipate caption package skip + % caption package uses a \vbox, not a \vtop, so "single line" case + % gives different result from "multi-line" without this: + \nointerlineskip + }% + {}% +}% +\def\sphinxthecaptionisatbottom{% (not finalized; for template usage) + \spx@ifcaptionpackage{\caption@setposition{b}}{}% +}% +% The aim of \sphinxcaption is to apply to tabular(y) the maximal width +% of caption as done by longtable +\def\sphinxtablecapwidth{\LTcapwidth}% +\newcommand\sphinxcaption{\@dblarg\spx@caption}% +\long\def\spx@caption[#1]#2{% + \noindent\hb@xt@\linewidth{\hss + \vtop{\@tempdima\dimexpr\sphinxtablecapwidth\relax +% don't exceed linewidth for the caption width + \ifdim\@tempdima>\linewidth\hsize\linewidth\else\hsize\@tempdima\fi +% longtable ignores \abovecaptionskip/\belowcaptionskip, so do the same here + \abovecaptionskip\sphinxabovecaptionskip % \z@skip + \belowcaptionskip\sphinxbelowcaptionskip % \z@skip + \caption[{#1}]% + {\strut\ignorespaces#2\ifhmode\unskip\@finalstrut\strutbox\fi}% + }\hss}% + \par\prevdepth\dp\strutbox +}% +\def\sphinxabovecaptionskip{\z@skip}% Do not use! Flagged for removal +\def\sphinxbelowcaptionskip{\z@skip}% Do not use! Flagged for removal +% This wrapper of \abovecaptionskip is used in sphinxVerbatim for top +% caption, and with another value in sphinxVerbatimintable +% TODO: To unify space above caption of a code-block with the one above +% caption of a table/longtable, \abovecaptionskip must not be used +% This auxiliary will get renamed and receive a different meaning +% in future. +\def\spx@abovecaptionskip{\abovecaptionskip}% +% Achieve \sphinxbelowcaptionspace below a caption located above a tabular +% or a tabulary +\newcommand\sphinxaftertopcaption +{% + \spx@ifcaptionpackage + {\par\prevdepth\dp\strutbox\nobreak\vskip-\abovecaptionskip}{\nobreak}% + \vskip\dimexpr\sphinxbelowcaptionspace\relax + \vskip-\baselineskip\vskip-\parskip +}% +% varwidth is crucial for our handling of general contents in merged cells +\RequirePackage{varwidth} +% but addition of a compatibility patch with hyperref is needed +% (tested with varwidth v 0.92 Mar 2009) +\AtBeginDocument {% + \let\@@vwid@Hy@raisedlink\Hy@raisedlink + \long\def\@vwid@Hy@raisedlink#1{\@vwid@wrap{\@@vwid@Hy@raisedlink{#1}}}% + \edef\@vwid@setup{% + \let\noexpand\Hy@raisedlink\noexpand\@vwid@Hy@raisedlink % HYPERREF ! + \unexpanded\expandafter{\@vwid@setup}}% +}% + +%%%%%%%%%%%%%%%%%%%%% +% --- MULTICOLUMN --- +% standard LaTeX's \multicolumn +% 1. does not allow verbatim contents, +% 2. interacts very poorly with tabulary. +% +% It is needed to write own macros for Sphinx: to allow code-blocks in merged +% cells rendered by tabular/longtable, and to allow multi-column cells with +% paragraphs to be taken into account sanely by tabulary algorithm for column +% widths. +% +% This requires quite a bit of hacking. First, in Sphinx, the multi-column +% contents will *always* be wrapped in a varwidth environment. The issue +% becomes to pass it the correct target width. We must trick tabulary into +% believing the multicolumn is simply separate columns, else tabulary does not +% incorporate the contents in its algorithm. But then we must clear the +% vertical rules... +% +% configuration of tabulary +\setlength{\tymin}{3\fontcharwd\font`0 }% minimal width of "squeezed" columns +\setlength{\tymax}{10000pt}% allow enough room for paragraphs to "compete" +% we need access to tabulary's final computed width. \@tempdima is too volatile +% to hope it has kept tabulary's value when \sphinxcolwidth needs it. +\newdimen\sphinx@TY@tablewidth +\def\tabulary{% + \def\TY@final{\sphinx@TY@tablewidth\@tempdima\tabular}% + \let\endTY@final\endtabular + \TY@tabular}% +% next hack is needed only if user has set latex_use_latex_multicolumn to True: +% it fixes tabulary's bug with \multicolumn defined "short" in first pass. (if +% upstream tabulary adds a \long, our extra one causes no harm) +\def\sphinx@tempa #1\def\multicolumn#2#3#4#5#6#7#8#9\sphinx@tempa + {\def\TY@tab{#1\long\def\multicolumn####1####2####3{\multispan####1\relax}#9}}% +\expandafter\sphinx@tempa\TY@tab\sphinx@tempa +% +% TN. 1: as \omit is never executed, Sphinx multicolumn does not need to worry +% like standard multicolumn about |l| vs l|. On the other hand it assumes +% columns are separated by a | ... (if not it will add extraneous +% \arrayrulewidth space for each column separation in its estimate of available +% width). +% +% TN. 1b: as Sphinx multicolumn uses neither \omit nor \span, it can not +% (easily) get rid of extra macros from >{...} or <{...} between columns. At +% least, it has been made compatible with colortbl's \columncolor. +% +% TN. 2: tabulary's second pass is handled like tabular/longtable's single +% pass, with the difference that we hacked \TY@final to set in +% \sphinx@TY@tablewidth the final target width as computed by tabulary. This is +% needed only to handle columns with a "horizontal" specifier: "p" type columns +% (inclusive of tabulary's LJRC) holds the target column width in the +% \linewidth dimension. +% +% TN. 3: use of \begin{sphinxmulticolumn}...\end{sphinxmulticolumn} mark-up +% would need some hacking around the fact that groups can not span across table +% cells (the code does inserts & tokens, see TN1b). It was decided to keep it +% simple with \sphinxstartmulticolumn...\sphinxstopmulticolumn. +% +% MEMO about nesting: if sphinxmulticolumn is encountered in a nested tabular +% inside a tabulary it will think to be at top level in the tabulary. But +% Sphinx generates no nested tables, and if some LaTeX macro uses internally a +% tabular this will not have a \sphinxstartmulticolumn within it! +% +\def\sphinxstartmulticolumn{% + \ifx\equation$% $ tabulary's first pass + \expandafter\sphinx@TYI@start@multicolumn + \else % either not tabulary or tabulary's second pass + \expandafter\sphinx@start@multicolumn + \fi +}% +\def\sphinxstopmulticolumn{% + \ifx\equation$% $ tabulary's first pass + \expandafter\sphinx@TYI@stop@multicolumn + \else % either not tabulary or tabulary's second pass + \ignorespaces + \fi +}% +\def\sphinx@TYI@start@multicolumn#1{% + % use \gdef always to avoid stack space build up + \gdef\sphinx@tempa{#1}\begingroup\setbox\z@\hbox\bgroup +}% +\def\sphinx@TYI@stop@multicolumn{\egroup % varwidth was used with \tymax + \xdef\sphinx@tempb{\the\dimexpr\wd\z@/\sphinx@tempa}% per column width + \endgroup + \expandafter\sphinx@TYI@multispan\expandafter{\sphinx@tempa}% +}% +\def\sphinx@TYI@multispan #1{% + \kern\sphinx@tempb\ignorespaces % the per column occupied width + \ifnum#1>\@ne % repeat, taking into account subtleties of TeX's & ... + \expandafter\sphinx@TYI@multispan@next\expandafter{\the\numexpr#1-\@ne\expandafter}% + \fi +}% +\def\sphinx@TYI@multispan@next{&\relax\sphinx@TYI@multispan}% +% +% Now the branch handling either the second pass of tabulary or the single pass +% of tabular/longtable. This is the delicate part where we gather the +% dimensions from the p columns either set-up by tabulary or by user p column +% or Sphinx \X, \Y columns. The difficulty is that to get the said width, the +% template must be inserted (other hacks would be horribly complicated except +% if we rewrote crucial parts of LaTeX's \@array !) and we can not do +% \omit\span like standard \multicolumn's easy approach. Thus we must cancel +% the \vrule separators. Also, perhaps the column specifier is of the l, c, r +% type, then we attempt an ad hoc rescue to give varwidth a reasonable target +% width. +\def\sphinx@start@multicolumn#1{% + \gdef\sphinx@multiwidth{0pt}\gdef\sphinx@tempa{#1}\sphinx@multispan{#1}% +}% +\def\sphinx@multispan #1{% + \ifnum#1=\@ne\expandafter\sphinx@multispan@end + \else\expandafter\sphinx@multispan@next + \fi {#1}% +}% +\def\sphinx@multispan@next #1{% + % trick to recognize L, C, R, J or p, m, b type columns + \ifdim\baselineskip>\z@ + \gdef\sphinx@tempb{\linewidth}% + \else + % if in an l, r, c type column, try and hope for the best + \xdef\sphinx@tempb{\the\dimexpr(\ifx\TY@final\@undefined\linewidth\else + \sphinx@TY@tablewidth\fi-\arrayrulewidth)/\sphinx@tempa + -\tw@\tabcolsep-\arrayrulewidth\relax}% + \fi + \noindent\kern\sphinx@tempb\relax + \xdef\sphinx@multiwidth + {\the\dimexpr\sphinx@multiwidth+\sphinx@tempb+\tw@\tabcolsep+\arrayrulewidth}% + % hack the \vline and the colortbl macros + \sphinx@hack@vline\sphinx@hack@CT&\relax + % repeat + \expandafter\sphinx@multispan\expandafter{\the\numexpr#1-\@ne}% +}% +% packages like colortbl add group levels, we need to "climb back up" to be +% able to hack the \vline and also the colortbl inserted tokens. This creates +% empty space whether or not the columns were | separated: +\def\sphinx@hack@vline{\ifnum\currentgrouptype=6\relax + \kern\arrayrulewidth\arrayrulewidth\z@\else\aftergroup\sphinx@hack@vline\fi}% +\def\sphinx@hack@CT{\ifnum\currentgrouptype=6\relax + \let\CT@setup\sphinx@CT@setup\else\aftergroup\sphinx@hack@CT\fi}% +% It turns out \CT@row@color is not expanded contrarily to \CT@column@color +% during LaTeX+colortbl preamble preparation, hence it would be possible for +% \sphinx@CT@setup to discard only the column color and choose to obey or not +% row color and cell color. It would even be possible to propagate cell color +% to row color for the duration of the Sphinx multicolumn... the (provisional?) +% choice has been made to cancel the colortbl colours for the multicolumn +% duration. +\def\sphinx@CT@setup #1\endgroup{\endgroup}% hack to remove colour commands +\def\sphinx@multispan@end#1{% + % first, trace back our steps horizontally + \noindent\kern-\dimexpr\sphinx@multiwidth\relax + % and now we set the final computed width for the varwidth environment + \ifdim\baselineskip>\z@ + \xdef\sphinx@multiwidth{\the\dimexpr\sphinx@multiwidth+\linewidth}% + \else + \xdef\sphinx@multiwidth{\the\dimexpr\sphinx@multiwidth+ + (\ifx\TY@final\@undefined\linewidth\else + \sphinx@TY@tablewidth\fi-\arrayrulewidth)/\sphinx@tempa + -\tw@\tabcolsep-\arrayrulewidth\relax}% + \fi + % we need to remove colour set-up also for last cell of the multi-column + \aftergroup\sphinx@hack@CT +}% +\newcommand*\sphinxcolwidth[2]{% + % this dimension will always be used for varwidth, and serves as maximum + % width when cells are merged either via multirow or multicolumn or both, + % as always their contents is wrapped in varwidth environment. + \ifnum#1>\@ne % multi-column (and possibly also multi-row) + % we wrote our own multicolumn code especially to handle that (and allow + % verbatim contents) + \ifx\equation$%$ + \tymax % first pass of tabulary (cf MEMO above regarding nesting) + \else % the \@gobble thing is for compatibility with standard \multicolumn + \sphinx@multiwidth\@gobble{#1/#2}% + \fi + \else % single column multirow + \ifx\TY@final\@undefined % not a tabulary. + \ifdim\baselineskip>\z@ + % in a p{..} type column, \linewidth is the target box width + \linewidth + \else + % l, c, r columns. Do our best. + \dimexpr(\linewidth-\arrayrulewidth)/#2- + \tw@\tabcolsep-\arrayrulewidth\relax + \fi + \else % in tabulary + \ifx\equation$%$% first pass + \tymax % it is set to a big value so that paragraphs can express themselves + \else + % second pass. + \ifdim\baselineskip>\z@ + \linewidth % in a L, R, C, J column or a p, \X, \Y ... + \else + % we have hacked \TY@final to put in \sphinx@TY@tablewidth the table width + \dimexpr(\sphinx@TY@tablewidth-\arrayrulewidth)/#2- + \tw@\tabcolsep-\arrayrulewidth\relax + \fi + \fi + \fi + \fi +}% +% fallback default in case user has set latex_use_latex_multicolumn to True: +% \sphinxcolwidth will use this only inside LaTeX's standard \multicolumn +\def\sphinx@multiwidth #1#2{\dimexpr % #1 to gobble the \@gobble (!) + (\ifx\TY@final\@undefined\linewidth\else\sphinx@TY@tablewidth\fi + -\arrayrulewidth)*#2-\tw@\tabcolsep-\arrayrulewidth\relax}% + +%%%%%%%%%%%%%%%%%% +% --- MULTIROW --- +% standard \multirow +% 1. does not allow verbatim contents, +% 2. does not allow blank lines in its argument, +% 3. its * specifier means to typeset "horizontally" which is very +% bad for paragraph content. 2016 version has = specifier but it +% must be used with p type columns only, else results are bad, +% 4. it requires manual intervention if the contents is too long to fit +% in the asked-for number of rows. +% 5. colour panels (either from \rowcolor or \columncolor) will hide +% the bottom part of multirow text, hence manual tuning is needed +% to put the multirow insertion at the _bottom_. +% +% The Sphinx solution consists in always having contents wrapped +% in a varwidth environment so that it makes sense to estimate how many +% lines it will occupy, and then ensure by insertion of suitable struts +% that the table rows have the needed height. The needed mark-up is done +% by LaTeX writer, which has its own id for the merged cells. +% +% The colour issue is solved by clearing colour panels in all cells, +% whether or not the multirow is single-column or multi-column. +% +% In passing we obtain baseline alignements across rows (only if +% \arraystretch is 1, as LaTeX's does not obey \arraystretch in "p" +% multi-line contents, only first and last line...) +% +% TODO: examine the situation with \arraystretch > 1. The \extrarowheight +% is hopeless for multirow anyhow, it makes baseline alignment strictly +% impossible. +\newcommand\sphinxmultirow[2]{\begingroup + % #1 = nb of spanned rows, #2 = Sphinx id of "cell", #3 = contents + % but let's fetch #3 in a way allowing verbatim contents ! + \def\sphinx@nbofrows{#1}\def\sphinx@cellid{#2}% + \afterassignment\sphinx@multirow\let\next= +}% +\def\sphinx@multirow {% + \setbox\z@\hbox\bgroup\aftergroup\sphinx@@multirow\strut +}% +\def\sphinx@@multirow {% + % The contents, which is a varwidth environment, has been captured in + % \box0 (a \hbox). + % We have with \sphinx@cellid an assigned unique id. The goal is to give + % about the same height to all the involved rows. + % For this Sphinx will insert a \sphinxtablestrut{cell_id} mark-up + % in LaTeX file and the expansion of the latter will do the suitable thing. + \dimen@\dp\z@ + \dimen\tw@\ht\@arstrutbox + \advance\dimen@\dimen\tw@ + \advance\dimen\tw@\dp\@arstrutbox + \count@=\dimen@ % type conversion dim -> int + \count\tw@=\dimen\tw@ + \divide\count@\count\tw@ % TeX division truncates + \advance\dimen@-\count@\dimen\tw@ + % 1300sp is about 0.02pt. For comparison a rule default width is 0.4pt. + % (note that if \count@ holds 0, surely \dimen@>1300sp) + \ifdim\dimen@>1300sp \advance\count@\@ne \fi + % now \count@ holds the count L of needed "lines" + % and \sphinx@nbofrows holds the number N of rows + % we have L >= 1 and N >= 1 + % if L is a multiple of N, ... clear what to do ! + % else write L = qN + r, 1 <= r < N and we will + % arrange for each row to have enough space for: + % q+1 "lines" in each of the first r rows + % q "lines" in each of the (N-r) bottom rows + % for a total of (q+1) * r + q * (N-r) = q * N + r = L + % It is possible that q == 0. + \count\tw@\count@ + % the TeX division truncates + \divide\count\tw@\sphinx@nbofrows\relax + \count4\count\tw@ % q + \multiply\count\tw@\sphinx@nbofrows\relax + \advance\count@-\count\tw@ % r + \expandafter\xdef\csname sphinx@tablestrut_\sphinx@cellid\endcsname + {\noexpand\sphinx@tablestrut{\the\count4}{\the\count@}{\sphinx@cellid}}% + \dp\z@\z@ + % this will use the real height if it is >\ht\@arstrutbox + \sphinxtablestrut{\sphinx@cellid}\box\z@ + \endgroup % group was opened in \sphinxmultirow +}% +\newcommand*\sphinxtablestrut[1]{% + % #1 is a "cell_id", i.e. the id of a merged group of table cells + \csname sphinx@tablestrut_#1\endcsname +}% +% LaTeX typesets the table row by row, hence each execution can do +% an update for the next row. +\newcommand*\sphinx@tablestrut[3]{\begingroup + % #1 = q, #2 = (initially) r, #3 = cell_id, q+1 lines in first r rows + % if #2 = 0, create space for max(q,1) table lines + % if #2 > 0, create space for q+1 lines and decrement #2 + \leavevmode + \count@#1\relax + \ifnum#2=\z@ + \ifnum\count@=\z@\count@\@ne\fi + \else + % next row will be with a #2 decremented by one + \expandafter\xdef\csname sphinx@tablestrut_#3\endcsname + {\noexpand\sphinx@tablestrut{#1}{\the\numexpr#2-\@ne}{#3}}% + \advance\count@\@ne + \fi + \vrule\@height\ht\@arstrutbox + \@depth\dimexpr\count@\ht\@arstrutbox+\count@\dp\@arstrutbox-\ht\@arstrutbox\relax + \@width\z@ + \endgroup + % we need this to avoid colour panels hiding bottom parts of multirow text + \sphinx@hack@CT +}% + +\endinput diff --git a/sphinxmanual.cls b/sphinxmanual.cls new file mode 100644 index 0000000..2e4b30d --- /dev/null +++ b/sphinxmanual.cls @@ -0,0 +1,128 @@ +% +% sphinxmanual.cls for Sphinx (https://www.sphinx-doc.org/) +% + +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{sphinxmanual}[2019/12/01 v2.3.0 Document class (Sphinx manual)] + +% chapters starting at odd pages (overridden by 'openany' document option) +\PassOptionsToClass{openright}{\sphinxdocclass} + +% 'oneside' option overriding the 'twoside' default +\newif\if@oneside +\DeclareOption{oneside}{\@onesidetrue} +% Pass remaining document options to the parent class. +\DeclareOption*{\PassOptionsToClass{\CurrentOption}{\sphinxdocclass}} +\ProcessOptions\relax + +% Defaults two-side document +\if@oneside +% nothing to do (oneside is the default) +\else +\PassOptionsToClass{twoside}{\sphinxdocclass} +\fi + +\LoadClass{\sphinxdocclass} + +% Set some sane defaults for section numbering depth and TOC depth. You can +% reset these counters in your preamble. +% +\setcounter{secnumdepth}{2} +\setcounter{tocdepth}{1} + +% Adapt \and command to the flushright context of \sphinxmaketitle, to +% avoid ragged line endings if author names do not fit all on one single line +\DeclareRobustCommand{\and}{% + \end{tabular}\kern-\tabcolsep + \allowbreak + \hskip\dimexpr1em+\tabcolsep\@plus.17fil\begin{tabular}[t]{c}% +}% +% If it is desired that each author name be on its own line, use in preamble: +%\DeclareRobustCommand{\and}{% +% \end{tabular}\kern-\tabcolsep\\\begin{tabular}[t]{c}% +%}% +% Change the title page to look a bit better, and fit in with the fncychap +% ``Bjarne'' style a bit better. +% +\newcommand{\sphinxmaketitle}{% + \let\sphinxrestorepageanchorsetting\relax + \ifHy@pageanchor\def\sphinxrestorepageanchorsetting{\Hy@pageanchortrue}\fi + \hypersetup{pageanchor=false}% avoid duplicate destination warnings + \begin{titlepage}% + \let\footnotesize\small + \let\footnoterule\relax + \noindent\rule{\textwidth}{1pt}\par + \begingroup % for PDF information dictionary + \def\endgraf{ }\def\and{\& }% + \pdfstringdefDisableCommands{\def\\{, }}% overwrite hyperref setup + \hypersetup{pdfauthor={\@author}, pdftitle={\@title}}% + \endgroup + \begin{flushright}% + \sphinxlogo + \py@HeaderFamily + {\Huge \@title \par} + {\itshape\LARGE \py@release\releaseinfo \par} + \vfill + {\LARGE + \begin{tabular}[t]{c} + \@author + \end{tabular}\kern-\tabcolsep + \par} + \vfill\vfill + {\large + \@date \par + \vfill + \py@authoraddress \par + }% + \end{flushright}%\par + \@thanks + \end{titlepage}% + \setcounter{footnote}{0}% + \let\thanks\relax\let\maketitle\relax + %\gdef\@thanks{}\gdef\@author{}\gdef\@title{} + \clearpage + \ifdefined\sphinxbackoftitlepage\sphinxbackoftitlepage\fi + \if@openright\cleardoublepage\else\clearpage\fi + \sphinxrestorepageanchorsetting +} + +\newcommand{\sphinxtableofcontents}{% + \pagenumbering{roman}% + \begingroup + \parskip \z@skip + \sphinxtableofcontentshook + \tableofcontents + \endgroup + % before resetting page counter, let's do the right thing. + \if@openright\cleardoublepage\else\clearpage\fi + \pagenumbering{arabic}% +} + +% This is needed to get the width of the section # area wide enough in the +% library reference. Doing it here keeps it the same for all the manuals. +% +\newcommand{\sphinxtableofcontentshook}{% + \renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.6em}}% + \renewcommand*\l@subsection{\@dottedtocline{2}{4.1em}{3.5em}}% +} + +% Fix the bibliography environment to add an entry to the Table of +% Contents. +% For a report document class this environment is a chapter. +% +\newenvironment{sphinxthebibliography}[1]{% + \if@openright\cleardoublepage\else\clearpage\fi + % \phantomsection % not needed here since TeXLive 2010's hyperref + \begin{thebibliography}{#1}% + \addcontentsline{toc}{chapter}{\bibname}}{\end{thebibliography}} + +% Same for the indices. +% The memoir class already does this, so we don't duplicate it in that case. +% +\@ifclassloaded{memoir} + {\newenvironment{sphinxtheindex}{\begin{theindex}}{\end{theindex}}} + {\newenvironment{sphinxtheindex}{% + \if@openright\cleardoublepage\else\clearpage\fi + \phantomsection % needed as no chapter, section, ... created + \begin{theindex}% + \addcontentsline{toc}{chapter}{\indexname}}{\end{theindex}}} diff --git a/sphinxmessages.sty b/sphinxmessages.sty new file mode 100644 index 0000000..940ac21 --- /dev/null +++ b/sphinxmessages.sty @@ -0,0 +1,21 @@ +% +% sphinxmessages.sty +% +% message resources for Sphinx +% +\ProvidesPackage{sphinxmessages}[2019/01/04 v2.0 Localized LaTeX macros (Sphinx team)] + +\renewcommand{\literalblockcontinuedname}{continued from previous page} +\renewcommand{\literalblockcontinuesname}{continues on next page} +\renewcommand{\sphinxnonalphabeticalgroupname}{Non\sphinxhyphen{}alphabetical} +\renewcommand{\sphinxsymbolsname}{Symbols} +\renewcommand{\sphinxnumbersname}{Numbers} +\def\pageautorefname{page} + +\addto\captionsenglish{\renewcommand{\figurename}{Figure }} +\def\fnum@figure{\figurename\thefigure{}.} + +\addto\captionsenglish{\renewcommand{\tablename}{Table }} +\def\fnum@table{\tablename\thetable{}.} + +\addto\captionsenglish{\renewcommand{\literalblockname}{Listing}} \ No newline at end of file diff --git a/sphinxoptionsgeometry.sty b/sphinxoptionsgeometry.sty new file mode 100644 index 0000000..af5a804 --- /dev/null +++ b/sphinxoptionsgeometry.sty @@ -0,0 +1,54 @@ +%% OPTIONS FOR GEOMETRY +% +% change this info string if making any custom modification +\ProvidesFile{sphinxoptionsgeometry.sty}[2021/01/27 geometry] + +% geometry +\ifx\kanjiskip\@undefined + \PassOptionsToPackage{% + hmargin={\unexpanded{\spx@opt@hmargin}},% + vmargin={\unexpanded{\spx@opt@vmargin}},% + marginpar=\unexpanded{\spx@opt@marginpar}} + {geometry} +\else + % set text width for Japanese documents to be integer multiple of 1zw + % and text height to be integer multiple of \baselineskip + % the execution is delayed to \sphinxsetup then geometry.sty + \normalsize\normalfont + \newcommand*\sphinxtextwidthja[1]{% + \if@twocolumn\tw@\fi + \dimexpr + \numexpr\dimexpr\paperwidth-\tw@\dimexpr#1\relax\relax/ + \dimexpr\if@twocolumn\tw@\else\@ne\fi zw\relax + zw\relax}% + \newcommand*\sphinxmarginparwidthja[1]{% + \dimexpr\numexpr\dimexpr#1\relax/\dimexpr1zw\relax zw\relax}% + \newcommand*\sphinxtextlinesja[1]{% + \numexpr\@ne+\dimexpr\paperheight-\topskip-\tw@\dimexpr#1\relax\relax/ + \baselineskip\relax}% + \ifx\@jsc@uplatextrue\@undefined\else + % the way we found in order for the papersize special written by + % geometry in the dvi file to be correct in case of jsbook class + \ifnum\mag=\@m\else % do nothing special if nomag class option or 10pt + \PassOptionsToPackage{truedimen}{geometry}% + \fi + \fi + \PassOptionsToPackage{% + hmarginratio={1:1},% + textwidth=\unexpanded{\sphinxtextwidthja{\spx@opt@hmargin}},% + vmarginratio={1:1},% + lines=\unexpanded{\sphinxtextlinesja{\spx@opt@vmargin}},% + marginpar=\unexpanded{\sphinxmarginparwidthja{\spx@opt@marginpar}},% + footskip=2\baselineskip,% + }{geometry}% + \AtBeginDocument + {% update a dimension used by the jsclasses + \ifx\@jsc@uplatextrue\@undefined\else\fullwidth\textwidth\fi + % for some reason, jreport normalizes all dimensions with \@settopoint + \@ifclassloaded{jreport} + {\@settopoint\textwidth\@settopoint\textheight\@settopoint\marginparwidth} + {}% <-- "false" clause of \@ifclassloaded + }% +\fi + +\endinput diff --git a/sphinxoptionshyperref.sty b/sphinxoptionshyperref.sty new file mode 100644 index 0000000..b88f108 --- /dev/null +++ b/sphinxoptionshyperref.sty @@ -0,0 +1,35 @@ +%% Bookmarks and hyperlinks +% +% change this info string if making any custom modification +\ProvidesFile{sphinxoptionshyperref.sty}[2021/01/27 hyperref] + +% to make pdf with correct encoded bookmarks in Japanese +% this should precede the hyperref package +\ifx\kanjiskip\@undefined +% for non-Japanese: make sure bookmarks are ok also with lualatex + \PassOptionsToPackage{pdfencoding=unicode}{hyperref} +\else + \RequirePackage{atbegshi} + \ifx\ucs\@undefined + \ifnum 42146=\euc"A4A2 + \AtBeginShipoutFirst{\special{pdf:tounicode EUC-UCS2}} + \else + \AtBeginShipoutFirst{\special{pdf:tounicode 90ms-RKSJ-UCS2}} + \fi + \else + \AtBeginShipoutFirst{\special{pdf:tounicode UTF8-UCS2}} + \fi +\fi + +\ifx\@jsc@uplatextrue\@undefined\else + \PassOptionsToPackage{setpagesize=false}{hyperref} +\fi + +% These options can be overridden inside 'hyperref' key +% or by later use of \hypersetup. +\PassOptionsToPackage{colorlinks,breaklinks,% + linkcolor=InnerLinkColor,filecolor=OuterLinkColor,% + menucolor=OuterLinkColor,urlcolor=OuterLinkColor,% + citecolor=InnerLinkColor}{hyperref} + +\endinput diff --git a/sphinxpackagecyrillic.sty b/sphinxpackagecyrillic.sty new file mode 100644 index 0000000..9aa62fc --- /dev/null +++ b/sphinxpackagecyrillic.sty @@ -0,0 +1,55 @@ +%% CYRILLIC IN NON-CYRILLIC DOCUMENTS (pdflatex only) +% +% refs: https://tex.stackexchange.com/q/460271/ +\ProvidesPackage{sphinxpackagecyrillic}% + [2018/11/21 v2.0 support for Cyrillic in non-Cyrillic documents] +\RequirePackage{kvoptions} +\SetupKeyvalOptions{prefix=spx@cyropt@} % use \spx@cyropt@ prefix +\DeclareBoolOption[false]{Xtwo} +\DeclareBoolOption[false]{TtwoA} +\DeclareDefaultOption{\@unknownoptionerror} +\ProcessLocalKeyvalOptions* % ignore class options + +\ifspx@cyropt@Xtwo +% original code by tex.sx user egreg (updated 2019/10/28): +% https://tex.stackexchange.com/a/460325/ +% 159 Cyrillic glyphs as available in X2 TeX 8bit font encoding +% This assumes inputenc loaded with utf8 option, or LaTeX release +% as recent as 2018/04/01 which does it automatically. + \@tfor\next:=% + {Ё}{Ђ}{Є}{Ѕ}{І}{Ј}{Љ}{Њ}{Ћ}{Ў}{Џ}{А}{Б}{В}{Г}{Д}{Е}{Ж}{З}{И}{Й}% + {К}{Л}{М}{Н}{О}{П}{Р}{С}{Т}{У}{Ф}{Х}{Ц}{Ч}{Ш}{Щ}{Ъ}{Ы}{Ь}{Э}{Ю}% + {Я}{а}{б}{в}{г}{д}{е}{ж}{з}{и}{й}{к}{л}{м}{н}{о}{п}{р}{с}{т}{у}% + {ф}{х}{ц}{ч}{ш}{щ}{ъ}{ы}{ь}{э}{ю}{я}{ё}{ђ}{є}{ѕ}{і}{ј}{љ}{њ}{ћ}% + {ў}{џ}{Ѣ}{ѣ}{Ѫ}{ѫ}{Ѵ}{ѵ}{Ґ}{ґ}{Ғ}{ғ}{Ҕ}{ҕ}{Җ}{җ}{Ҙ}{ҙ}{Қ}{қ}{Ҝ}{ҝ}% + {Ҟ}{ҟ}{Ҡ}{ҡ}{Ң}{ң}{Ҥ}{ҥ}{Ҧ}{ҧ}{Ҩ}{ҩ}{Ҫ}{ҫ}{Ҭ}{ҭ}{Ү}{ү}{Ұ}{ұ}{Ҳ}{ҳ}% + {Ҵ}{ҵ}{Ҷ}{ҷ}{Ҹ}{ҹ}{Һ}{һ}{Ҽ}{ҽ}{Ҿ}{ҿ}{Ӏ}{Ӄ}{ӄ}{Ӆ}{ӆ}{Ӈ}{ӈ}{Ӌ}{ӌ}% + {Ӎ}{ӎ}{Ӕ}{ӕ}{Ә}{ә}{Ӡ}{ӡ}{Ө}{ө}\do + {% + \begingroup\def\IeC{\protect\DeclareTextSymbolDefault}% + \protected@edef\@temp{\endgroup + \@ifl@t@r{\fmtversion}{2019/10/01}{\csname u8:\next\endcsname}{\next}}% + \@temp{X2}% + }% +\else +\ifspx@cyropt@TtwoA +% original code by tex.sx user jfbu: +% https://tex.stackexchange.com/a/460305/ +% 63*2+1=127 Cyrillic glyphs as found in T2A 8bit TeX font-encoding + \@tfor\@tempa:=% + {ae}{a}{b}{chrdsc}{chvcrs}{ch}{c}{dje}{dze}{dzhe}{d}{erev}{ery}{e}% + {f}{ghcrs}{gup}{g}{hdsc}{hrdsn}{h}{ie}{ii}{ishrt}{i}{je}% + {kbeak}{kdsc}{kvcrs}{k}{lje}{l}{m}{ndsc}{ng}{nje}{n}{otld}{o}{p}{r}% + {schwa}{sdsc}{sftsn}{shch}{shha}{sh}{s}{tshe}{t}{ushrt}{u}{v}% + {ya}{yhcrs}{yi}{yo}{yu}{y}{zdsc}{zhdsc}{zh}{z}\do + {% + \expandafter\DeclareTextSymbolDefault\expandafter + {\csname cyr\@tempa\endcsname}{T2A}% + \expandafter\uppercase\expandafter{\expandafter + \def\expandafter\@tempa\expandafter{\@tempa}}% + \expandafter\DeclareTextSymbolDefault\expandafter + {\csname CYR\@tempa\endcsname}{T2A}% + }% + \DeclareTextSymbolDefault{\CYRpalochka}{T2A}% +\fi\fi +\endinput diff --git a/sphinxpackagefootnote.sty b/sphinxpackagefootnote.sty new file mode 100644 index 0000000..a6071cf --- /dev/null +++ b/sphinxpackagefootnote.sty @@ -0,0 +1,396 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{sphinxpackagefootnote}% + [2021/02/04 v1.1d footnotehyper adapted to sphinx (Sphinx team)] +% Provides support for this output mark-up from Sphinx latex writer: +% - footnote environment +% - savenotes environment (table templates) +% - \sphinxfootnotemark +% +%% +%% Package: sphinxpackagefootnote +%% Version: based on footnotehyper.sty 2021/02/04 v1.1d +%% as available at https://www.ctan.org/pkg/footnotehyper +%% License: the one applying to Sphinx +%% +%% Refer to the PDF documentation at https://www.ctan.org/pkg/footnotehyper for +%% the code comments. +%% +%% Differences: +%% 1. a partial tabulary compatibility layer added (enough for Sphinx mark-up), +%% 2. use of \spx@opt@BeforeFootnote from sphinx.sty, +%% 3. use of \sphinxunactivateextrasandspace from sphinx.sty, +%% 4. macro definition \sphinxfootnotemark, +%% 5. macro definition \sphinxlongtablepatch +%% 6. replaced some \undefined by \@undefined +\newif\iffootnotehyperparse\footnotehyperparsetrue +\DeclareOption*{\PackageWarning{sphinxpackagefootnote}{Option `\CurrentOption' is unknown}}% +\ProcessOptions\relax +\newbox\FNH@notes +\newtoks\FNH@toks % 1.1c +\newdimen\FNH@width +\let\FNH@colwidth\columnwidth +\newif\ifFNH@savingnotes +\AtBeginDocument {% + \let\FNH@latex@footnote \footnote + \let\FNH@latex@footnotetext\footnotetext + \let\FNH@H@@footnotetext \@footnotetext + \let\FNH@H@@mpfootnotetext \@mpfootnotetext + \newenvironment{savenotes} + {\FNH@savenotes\ignorespaces}{\FNH@spewnotes\ignorespacesafterend}% + \let\spewnotes \FNH@spewnotes + \let\footnote \FNH@footnote + \let\footnotetext \FNH@footnotetext + \let\endfootnote \FNH@endfntext + \let\endfootnotetext\FNH@endfntext + \@ifpackageloaded{hyperref} + {\ifHy@hyperfootnotes + \let\FNH@H@@footnotetext\H@@footnotetext + \let\FNH@H@@mpfootnotetext\H@@mpfootnotetext + \else + \let\FNH@hyper@fntext\FNH@nohyp@fntext + \fi}% + {\let\FNH@hyper@fntext\FNH@nohyp@fntext}% +}% +\def\FNH@hyper@fntext{\FNH@fntext\FNH@hyper@fntext@i}% +\def\FNH@nohyp@fntext{\FNH@fntext\FNH@nohyp@fntext@i}% +\def\FNH@fntext #1{% + \ifx\ifmeasuring@\@undefined + \expandafter\@secondoftwo\else\expandafter\@firstofone\fi +% these two lines modified for Sphinx (tabulary compatibility): + {\ifmeasuring@\expandafter\@gobbletwo\else\expandafter\@firstofone\fi}% + {\ifx\equation$\expandafter\@gobbletwo\fi #1}%$ +}% +\long\def\FNH@hyper@fntext@i#1{% + \global\setbox\FNH@notes\vbox + {\unvbox\FNH@notes + \FNH@startnote + \@makefntext + {\rule\z@\footnotesep\ignorespaces + \ifHy@nesting\expandafter\ltx@firstoftwo + \else\expandafter\ltx@secondoftwo + \fi + {\expandafter\hyper@@anchor\expandafter{\Hy@footnote@currentHref}{#1}}% + {\Hy@raisedlink + {\expandafter\hyper@@anchor\expandafter{\Hy@footnote@currentHref}% + {\relax}}% + \let\@currentHref\Hy@footnote@currentHref + \let\@currentlabelname\@empty + #1}% + \@finalstrut\strutbox + }% + \FNH@endnote + }% +}% +\long\def\FNH@nohyp@fntext@i#1{% + \global\setbox\FNH@notes\vbox + {\unvbox\FNH@notes + \FNH@startnote + \@makefntext{\rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}% + \FNH@endnote + }% +}% +\def\FNH@startnote{% + \hsize\FNH@colwidth + \interlinepenalty\interfootnotelinepenalty + \reset@font\footnotesize + \floatingpenalty\@MM + \@parboxrestore + \protected@edef\@currentlabel{\csname p@\@mpfn\endcsname\@thefnmark}% + \color@begingroup +}% +\def\FNH@endnote{\color@endgroup}% +\def\FNH@savenotes{% + \begingroup + \ifFNH@savingnotes\else + \FNH@savingnotestrue + \let\@footnotetext \FNH@hyper@fntext + \let\@mpfootnotetext \FNH@hyper@fntext + \let\H@@mpfootnotetext\FNH@nohyp@fntext + \FNH@width\columnwidth + \let\FNH@colwidth\FNH@width + \global\setbox\FNH@notes\box\voidb@x + \let\FNH@thempfn\thempfn + \let\FNH@mpfn\@mpfn + \ifx\@minipagerestore\relax\let\@minipagerestore\@empty\fi + \expandafter\def\expandafter\@minipagerestore\expandafter{% + \@minipagerestore + \let\thempfn\FNH@thempfn + \let\@mpfn\FNH@mpfn + }% + \fi +}% +\def\FNH@spewnotes {% + \if@endpe\ifx\par\@@par\FNH@toks{}\else + \FNH@toks\expandafter{\expandafter + \def\expandafter\par\expandafter{\par}\@endpetrue}% + \expandafter\expandafter\expandafter + \FNH@toks + \expandafter\expandafter\expandafter + {\expandafter\the\expandafter\FNH@toks + \expandafter\def\expandafter\@par\expandafter{\@par}}% + \expandafter\expandafter\expandafter + \FNH@toks + \expandafter\expandafter\expandafter + {\expandafter\the\expandafter\FNH@toks + \expandafter\everypar\expandafter{\the\everypar}}\fi + \else\FNH@toks{}\fi + \expandafter + \endgroup\the\FNH@toks + \ifFNH@savingnotes\else + \ifvoid\FNH@notes\else + \begingroup + \let\@makefntext\@empty + \let\@finalstrut\@gobble + \let\rule\@gobbletwo + \ifx\@footnotetext\@mpfootnotetext + \expandafter\FNH@H@@mpfootnotetext + \else + \expandafter\FNH@H@@footnotetext + \fi{\unvbox\FNH@notes}% + \endgroup + \fi + \fi +}% +\def\FNH@footnote@envname {footnote}% +\def\FNH@footnotetext@envname{footnotetext}% +\def\FNH@footnote{% +% this line added for Sphinx: + \spx@opt@BeforeFootnote + \ifx\@currenvir\FNH@footnote@envname + \expandafter\FNH@footnoteenv + \else + \expandafter\FNH@latex@footnote + \fi +}% +\def\FNH@footnoteenv{% +% this line added for Sphinx (footnotes in parsed literal blocks): + \catcode13=5 \sphinxunactivateextrasandspace + \@ifnextchar[% + \FNH@footnoteenv@i %] + {\stepcounter\@mpfn + \protected@xdef\@thefnmark{\thempfn}% + \@footnotemark + \def\FNH@endfntext@fntext{\@footnotetext}% + \FNH@startfntext}% +}% +\def\FNH@footnoteenv@i[#1]{% + \begingroup + \csname c@\@mpfn\endcsname #1\relax + \unrestored@protected@xdef\@thefnmark{\thempfn}% + \endgroup + \@footnotemark + \def\FNH@endfntext@fntext{\@footnotetext}% + \FNH@startfntext +}% +\def\FNH@footnotetext{% + \ifx\@currenvir\FNH@footnotetext@envname + \expandafter\FNH@footnotetextenv + \else + \expandafter\FNH@latex@footnotetext + \fi +}% +\def\FNH@footnotetextenv{% + \@ifnextchar[% + \FNH@footnotetextenv@i %] + {\protected@xdef\@thefnmark{\thempfn}% + \def\FNH@endfntext@fntext{\@footnotetext}% + \FNH@startfntext}% +}% +\def\FNH@footnotetextenv@i[#1]{% + \begingroup + \csname c@\@mpfn\endcsname #1\relax + \unrestored@protected@xdef\@thefnmark{\thempfn}% + \endgroup + \ifFNH@savingnotes + \def\FNH@endfntext@fntext{\FNH@nohyp@fntext}% + \else + \def\FNH@endfntext@fntext{\FNH@H@@footnotetext}% + \fi + \FNH@startfntext +}% +\def\FNH@startfntext{% + \setbox\z@\vbox\bgroup + \FNH@startnote + \FNH@prefntext + \rule\z@\footnotesep\ignorespaces +}% +\def\FNH@endfntext {% + \@finalstrut\strutbox + \FNH@postfntext + \FNH@endnote + \egroup + \begingroup + \let\@makefntext\@empty\let\@finalstrut\@gobble\let\rule\@gobbletwo + \FNH@endfntext@fntext {\unvbox\z@}% + \endgroup +}% +\let\FNH@prefntext\@empty +\let\FNH@postfntext\@empty +\AtBeginDocument{\iffootnotehyperparse\expandafter\FNH@check\fi}% +\def\FNH@safeif#1{% + \iftrue\csname if#1\endcsname\csname fi\endcsname\expandafter\@firstoftwo + \else\csname fi\endcsname\expandafter\@secondoftwo + \fi +}% +\def\FNH@check{% + \ifx\@makefntextFB\@undefined\expandafter\FNH@check@ + \else\expandafter\FNH@frenchb@ + \fi +}% +\def\FNH@frenchb@{% + \def\FNH@prefntext{% + \localleftbox{}% + \let\FBeverypar@save\FBeverypar@quote + \let\FBeverypar@quote\relax + \FNH@safeif{FB@koma}% + {\FNH@safeif{FBFrenchFootnotes}% + {\ifx\footnote\thanks + \let\@@makefnmark\@@makefnmarkTH + \@makefntextTH{} % space as in french.ldf + \else + \let\@@makefnmark\@@makefnmarkFB + \@makefntextFB{} % space as in french.ldf + \fi + }{\let\@@makefnmark\@@makefnmarkORI + \@makefntextORI{}% no space as in french.ldf + }% + }% + {\FNH@safeif{FBFrenchFootnotes}% + {\@makefntextFB{}}% + {\@makefntextORI{}}% + }% + }% + \def\FNH@postfntext{% + \let\FBeverypar@quote\FBeverypar@save + \localleftbox{\FBeveryline@quote}% + }% +}% +\def\FNH@check@{% + \expandafter\FNH@check@a\@makefntext{1.2!3?4,}% + \FNH@@@1.2!3?4,\FNH@@@\relax +}% +\long\def\FNH@check@a #11.2!3?4,#2\FNH@@@#3{% + \ifx\relax#3\expandafter\FNH@checkagain@ + \else + \def\FNH@prefntext{#1}\def\FNH@postfntext{#2}% + \expandafter\FNH@check@b + \fi +}% +\def\FNH@checkagain@{% + \expandafter\FNH@checkagain@a + \detokenize\expandafter{\@makefntext{1.2!3?4,}}\relax\FNH@@@ +}% +\edef\FNH@temp{\noexpand\FNH@checkagain@a ##1\string{1.2!3?4,\string}}% +\expandafter\def\FNH@temp#2#3\FNH@@@{% + \ifx\relax#2% + \def\FNH@prefntext{\@makefntext{}}% + \else\FNH@bad@makefntext@alert + \fi +}% +\def\FNH@check@b #1\relax{% + \expandafter\expandafter\expandafter\FNH@check@c + \expandafter\meaning\expandafter\FNH@prefntext + \meaning\FNH@postfntext1.2!3?4,\FNH@check@c\relax +}% +\def\FNH@check@c #11.2!3?4,#2#3\relax{% + \ifx\FNH@check@c#2\else\FNH@bad@makefntext@alert\fi +}% +% slight reformulation for Sphinx +\def\FNH@bad@makefntext@alert{% + \PackageWarningNoLine{sphinxpackagefootnote}% + {Footnotes will be sub-optimal, sorry. This is due to the document class or^^J + some package modifying macro \string\@makefntext.^^J + You can try to report this incompatibility at^^J + https://github.com/sphinx-doc/sphinx with this info:}% + \typeout{\meaning\@makefntext}% + \let\FNH@prefntext\@empty\let\FNH@postfntext\@empty +}% +% this macro from original footnote.sty is not used anymore by Sphinx +% but for simplicity sake let's just keep it as is +\def\makesavenoteenv{\@ifnextchar[\FNH@msne@ii\FNH@msne@i}%] +\def\FNH@msne@i #1{% + \expandafter\let\csname FNH$#1\expandafter\endcsname %$ + \csname #1\endcsname + \expandafter\let\csname endFNH$#1\expandafter\endcsname %$ + \csname end#1\endcsname + \FNH@msne@ii[#1]{FNH$#1}%$ +}% +\def\FNH@msne@ii[#1]#2{% + \expandafter\edef\csname#1\endcsname{% + \noexpand\savenotes + \expandafter\noexpand\csname#2\endcsname + }% + \expandafter\edef\csname end#1\endcsname{% + \expandafter\noexpand\csname end#2\endcsname + \noexpand\expandafter + \noexpand\spewnotes + \noexpand\if@endpe\noexpand\@endpetrue\noexpand\fi + }% +}% +% +% some extras for Sphinx : +% \sphinxfootnotemark: usable in section titles and silently removed from TOCs. +\def\sphinxfootnotemark [#1]% + {\ifx\thepage\relax\else\sphinxfootref{#1}\fi}% +% \sphinxfootref: +% - \spx@opt@BeforeFootnote is from BeforeFootnote sphinxsetup option +% - \ref: +% the latex.py writer inserts a \phantomsection\label{.} +% whenever +% - the footnote was explicitly numbered in sources, +% - or it was in restrained context and is rendered using footnotetext +% +% These are the two types of footnotes that \sphinxfootnotemark must +% handle. But for explicitly numbered footnotes the same number +% can be found in document. So a secondary part in is updated +% at each novel such footnote to know what is the target from then on +% for \sphinxfootnotemark and already encountered [1], or [2],... +% +% LaTeX package varioref is not supported by hyperref (from its doc: "There +% are too many problems with varioref. Nobody has time to sort them out. +% Therefore this package is now unsupported.") So we will simply use our own +% macros to access the page number of footnote text and decide whether to print +% it. \pagename is internationalized by latex-babel. +\def\spx@thefnmark#1#2{% + % #1=label for reference, #2=page where footnote was printed + \ifx\spx@tempa\spx@tempb + % same page + #1% + \else + \sphinxthefootnotemark{#1}{#2}% + \fi +}% +\def\sphinxfootref@get #1#2#3#4#5\relax{% + \def\sphinxfootref@label{#1}% + \def\sphinxfootref@page {#2}% + \def\sphinxfootref@Href {#4}% +}% +\protected\def\sphinxfootref#1{% #1 always explicit number in Sphinx usage + \spx@opt@BeforeFootnote + \ltx@ifundefined{r@\thesphinxscope.#1}% + {\gdef\@thefnmark{?}\H@@footnotemark}% + {\expandafter\expandafter\expandafter\sphinxfootref@get + \csname r@\thesphinxscope.#1\endcsname\relax + \edef\spx@tempa{\thepage}\edef\spx@tempb{\sphinxfootref@page}% + \protected@xdef\@thefnmark{\spx@thefnmark{\sphinxfootref@label}{\sphinxfootref@page}}% + \let\spx@@makefnmark\@makefnmark + \def\@makefnmark{% + \hyper@linkstart{link}{\sphinxfootref@Href}% + \spx@@makefnmark + \hyper@linkend + }% + \H@@footnotemark + \let\@makefnmark\spx@@makefnmark + }% +}% +\AtBeginDocument{% + % let hyperref less complain + \pdfstringdefDisableCommands{\def\sphinxfootnotemark [#1]{}}% + % to obtain hyperlinked footnotes in longtable environment we must replace + % hyperref's patch of longtable's patch of \@footnotetext by our own + \let\LT@p@ftntext\FNH@hyper@fntext + % this *requires* longtable to be used always wrapped in savenotes environment +}% +\endinput +%% +%% End of file `sphinxpackagefootnote.sty'.