Zusammenfassung der VL bis einschließlich Puffer
This commit is contained in:
commit
bfc8b5d6d4
227
.gitignore
vendored
Normal file
227
.gitignore
vendored
Normal file
@ -0,0 +1,227 @@
|
|||||||
|
### LaTeX ###
|
||||||
|
## Core latex/pdflatex auxiliary files:
|
||||||
|
*.aux
|
||||||
|
*.lof
|
||||||
|
*.log
|
||||||
|
*.lot
|
||||||
|
*.fls
|
||||||
|
*.out
|
||||||
|
*.toc
|
||||||
|
*.fmt
|
||||||
|
*.fot
|
||||||
|
*.cb
|
||||||
|
*.cb2
|
||||||
|
|
||||||
|
## Intermediate documents:
|
||||||
|
*.dvi
|
||||||
|
*.xdv
|
||||||
|
*-converted-to.*
|
||||||
|
# these rules might exclude image files for figures etc.
|
||||||
|
# *.ps
|
||||||
|
# *.eps
|
||||||
|
# *.pdf
|
||||||
|
|
||||||
|
## Generated if empty string is given at "Please type another file name for output:"
|
||||||
|
.pdf
|
||||||
|
|
||||||
|
## Bibliography auxiliary files (bibtex/biblatex/biber):
|
||||||
|
*.bbl
|
||||||
|
*.bcf
|
||||||
|
*.blg
|
||||||
|
*-blx.aux
|
||||||
|
*-blx.bib
|
||||||
|
*.run.xml
|
||||||
|
|
||||||
|
## Build tool auxiliary files:
|
||||||
|
*.fdb_latexmk
|
||||||
|
*.synctex
|
||||||
|
*.synctex(busy)
|
||||||
|
*.synctex.gz
|
||||||
|
*.synctex.gz(busy)
|
||||||
|
*.pdfsync
|
||||||
|
*Notes.bib
|
||||||
|
|
||||||
|
## Auxiliary and intermediate files from other packages:
|
||||||
|
# algorithms
|
||||||
|
*.alg
|
||||||
|
*.loa
|
||||||
|
|
||||||
|
# achemso
|
||||||
|
acs-*.bib
|
||||||
|
|
||||||
|
# amsthm
|
||||||
|
*.thm
|
||||||
|
|
||||||
|
# beamer
|
||||||
|
*.nav
|
||||||
|
*.pre
|
||||||
|
*.snm
|
||||||
|
*.vrb
|
||||||
|
|
||||||
|
# changes
|
||||||
|
*.soc
|
||||||
|
|
||||||
|
# cprotect
|
||||||
|
*.cpt
|
||||||
|
|
||||||
|
# elsarticle (documentclass of Elsevier journals)
|
||||||
|
*.spl
|
||||||
|
|
||||||
|
# endnotes
|
||||||
|
*.ent
|
||||||
|
|
||||||
|
# fixme
|
||||||
|
*.lox
|
||||||
|
|
||||||
|
# feynmf/feynmp
|
||||||
|
*.mf
|
||||||
|
*.mp
|
||||||
|
*.t[1-9]
|
||||||
|
*.t[1-9][0-9]
|
||||||
|
*.tfm
|
||||||
|
|
||||||
|
#(r)(e)ledmac/(r)(e)ledpar
|
||||||
|
*.end
|
||||||
|
*.?end
|
||||||
|
*.[1-9]
|
||||||
|
*.[1-9][0-9]
|
||||||
|
*.[1-9][0-9][0-9]
|
||||||
|
*.[1-9]R
|
||||||
|
*.[1-9][0-9]R
|
||||||
|
*.[1-9][0-9][0-9]R
|
||||||
|
*.eledsec[1-9]
|
||||||
|
*.eledsec[1-9]R
|
||||||
|
*.eledsec[1-9][0-9]
|
||||||
|
*.eledsec[1-9][0-9]R
|
||||||
|
*.eledsec[1-9][0-9][0-9]
|
||||||
|
*.eledsec[1-9][0-9][0-9]R
|
||||||
|
|
||||||
|
# glossaries
|
||||||
|
*.acn
|
||||||
|
*.acr
|
||||||
|
*.glg
|
||||||
|
*.glo
|
||||||
|
*.gls
|
||||||
|
*.glsdefs
|
||||||
|
|
||||||
|
# gnuplottex
|
||||||
|
*-gnuplottex-*
|
||||||
|
|
||||||
|
# gregoriotex
|
||||||
|
*.gaux
|
||||||
|
*.gtex
|
||||||
|
|
||||||
|
# hyperref
|
||||||
|
*.brf
|
||||||
|
|
||||||
|
# knitr
|
||||||
|
*-concordance.tex
|
||||||
|
# TODO Comment the next line if you want to keep your tikz graphics files
|
||||||
|
*.tikz
|
||||||
|
*-tikzDictionary
|
||||||
|
|
||||||
|
# listings
|
||||||
|
*.lol
|
||||||
|
|
||||||
|
# makeidx
|
||||||
|
*.idx
|
||||||
|
*.ilg
|
||||||
|
*.ind
|
||||||
|
*.ist
|
||||||
|
|
||||||
|
# minitoc
|
||||||
|
*.maf
|
||||||
|
*.mlf
|
||||||
|
*.mlt
|
||||||
|
*.mtc[0-9]*
|
||||||
|
*.slf[0-9]*
|
||||||
|
*.slt[0-9]*
|
||||||
|
*.stc[0-9]*
|
||||||
|
|
||||||
|
# minted
|
||||||
|
_minted*
|
||||||
|
*.pyg
|
||||||
|
|
||||||
|
# morewrites
|
||||||
|
*.mw
|
||||||
|
|
||||||
|
# nomencl
|
||||||
|
*.nlo
|
||||||
|
|
||||||
|
# pax
|
||||||
|
*.pax
|
||||||
|
|
||||||
|
# pdfpcnotes
|
||||||
|
*.pdfpc
|
||||||
|
|
||||||
|
# sagetex
|
||||||
|
*.sagetex.sage
|
||||||
|
*.sagetex.py
|
||||||
|
*.sagetex.scmd
|
||||||
|
|
||||||
|
# scrwfile
|
||||||
|
*.wrt
|
||||||
|
|
||||||
|
# sympy
|
||||||
|
*.sout
|
||||||
|
*.sympy
|
||||||
|
sympy-plots-for-*.tex/
|
||||||
|
|
||||||
|
# pdfcomment
|
||||||
|
*.upa
|
||||||
|
*.upb
|
||||||
|
|
||||||
|
# pythontex
|
||||||
|
*.pytxcode
|
||||||
|
pythontex-files-*/
|
||||||
|
|
||||||
|
# thmtools
|
||||||
|
*.loe
|
||||||
|
|
||||||
|
# TikZ & PGF
|
||||||
|
*.dpth
|
||||||
|
*.md5
|
||||||
|
*.auxlock
|
||||||
|
|
||||||
|
# todonotes
|
||||||
|
*.tdo
|
||||||
|
|
||||||
|
# easy-todo
|
||||||
|
*.lod
|
||||||
|
|
||||||
|
# xindy
|
||||||
|
*.xdy
|
||||||
|
|
||||||
|
# xypic precompiled matrices
|
||||||
|
*.xyc
|
||||||
|
|
||||||
|
# endfloat
|
||||||
|
*.ttt
|
||||||
|
*.fff
|
||||||
|
|
||||||
|
# Latexian
|
||||||
|
TSWLatexianTemp*
|
||||||
|
|
||||||
|
## Editors:
|
||||||
|
# WinEdt
|
||||||
|
*.bak
|
||||||
|
*.sav
|
||||||
|
|
||||||
|
# Texpad
|
||||||
|
.texpadtmp
|
||||||
|
|
||||||
|
# Kile
|
||||||
|
*.backup
|
||||||
|
|
||||||
|
# KBibTeX
|
||||||
|
*~[0-9]*
|
||||||
|
|
||||||
|
# auto folder when using emacs and auctex
|
||||||
|
/auto/*
|
||||||
|
|
||||||
|
# expex forward references with \gathertags
|
||||||
|
*-tags.tex
|
||||||
|
|
||||||
|
### LaTeX Patch ###
|
||||||
|
# glossaries
|
||||||
|
*.glstex
|
BIN
zusammenfassung.pdf
Normal file
BIN
zusammenfassung.pdf
Normal file
Binary file not shown.
203
zusammenfassung.tex
Normal file
203
zusammenfassung.tex
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
\documentclass[11pt,a4paper]{scrartcl}
|
||||||
|
\usepackage[a4paper,left=2.5cm,right=2.5cm,top=2.5cm,bottom=2.5cm]{geometry}
|
||||||
|
\usepackage[ngerman]{babel}
|
||||||
|
\usepackage{amssymb}
|
||||||
|
\usepackage{amsthm}
|
||||||
|
\usepackage{mathrsfs}
|
||||||
|
\usepackage{scrextend}
|
||||||
|
\usepackage[utf8]{inputenc}
|
||||||
|
\usepackage{amsmath}
|
||||||
|
\usepackage{enumitem}
|
||||||
|
\usepackage{tikz-qtree}
|
||||||
|
\usepackage{mathtools}
|
||||||
|
\usepackage{latexsym}
|
||||||
|
\usepackage{algorithmicx}
|
||||||
|
\usepackage{csquotes}
|
||||||
|
\usepackage{pdfpages}
|
||||||
|
\usepackage{pgfplots}
|
||||||
|
\usepackage{hyperref}
|
||||||
|
\usepackage{listings}
|
||||||
|
\usepackage{pdflscape}
|
||||||
|
\usepackage{tikz}
|
||||||
|
\usetikzlibrary{positioning}
|
||||||
|
\usetikzlibrary{arrows.meta}
|
||||||
|
\usepackage{datetime}
|
||||||
|
\usepackage{xcolor}
|
||||||
|
|
||||||
|
\pdfminorversion=7 % Import-Unterstützung für PDFs bis Version 1.7
|
||||||
|
\pgfplotsset{compat=1.16} % verhindern, dass pgfplots im Rückwärtskompatibilitätsmodus arbeitet
|
||||||
|
|
||||||
|
\theoremstyle{definition}
|
||||||
|
\newtheorem{aufgabe}{Aufgabe}[section]
|
||||||
|
\newtheorem{definition}{Definition}[section]
|
||||||
|
|
||||||
|
\renewcommand\qedsymbol{}
|
||||||
|
\renewcommand*{\proofname}{Antwort}
|
||||||
|
\addto\captionsngerman{\renewcommand\proofname{Antwort}}
|
||||||
|
|
||||||
|
\newcommand*{\bps}{\frac{\text{b}}{\text{s}}}
|
||||||
|
\newcommand*{\kbps}{\frac{\text{Kb}}{\text{s}}}
|
||||||
|
\newcommand*{\mbps}{\frac{\text{Mb}}{\text{s}}}
|
||||||
|
\newcommand*{\gbps}{\frac{\text{Gb}}{\text{s}}}
|
||||||
|
\newcommand*{\tbps}{\frac{\text{Tb}}{\text{s}}}
|
||||||
|
|
||||||
|
\newcommand{\sql}[1]{\lstinline[frameround=fttt,language=SQL,numbers=left,breaklines=true,keywordstyle=\color{blue}\bfseries,basicstyle=\ttfamily\color{red},numberstyle=\color{black}]{#1}}
|
||||||
|
|
||||||
|
\definecolor{fau_blau}{RGB}{26, 71, 115}
|
||||||
|
|
||||||
|
\newcommand{\begriff}[1]{\textcolor{fau_blau}{\emph{#1}}}
|
||||||
|
\newcommand{\wichtig}[1]{\emph{#1}}
|
||||||
|
|
||||||
|
\setlist[enumerate,1]{label={\alph*)}}
|
||||||
|
\setlist[enumerate,2]{label={\roman*)}}
|
||||||
|
|
||||||
|
\title{Zusammenfassung IDB}
|
||||||
|
\author{Marco Ammon}
|
||||||
|
\date{\today}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
\maketitle
|
||||||
|
|
||||||
|
\section{Einführung}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \begriff{Datenabstraktion} / \begriff{Datenunabhängigkeit}: persistentes Speichern und Wiedergewinnen (Auffinden und Aushändigen) von Daten \wichtig{unabhängig} von Details der Speicherung
|
||||||
|
\item \begriff{Schicht}: realisiert \begriff{Dienst} und stellt ihn per \begriff{Schnittstelle} zur Verfügung
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\section{Dateiverwaltung}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \begriff{physische} Speichergeräte (z.B. Festplatten) werden durch \begriff{logische} abstrahiert (z.B. Neueinlesen bei Checksum-Fehlern)
|
||||||
|
\item \begriff{Block} als kleinste Einheit der IO
|
||||||
|
\item \enquote{Adresse} eines Blocks: (Zylinder, Spur, Sektor)
|
||||||
|
\item \begriff{Dateien} als benannte Menge von Blöcken
|
||||||
|
\item \begriff{blockorientierte} Zugriffsmethode: verwendet eindeutige, fortlaufende Blockadressen innerhalb der Datei
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\section{Sätze}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \begriff{Satz} als zusammengehörende Daten eines Gegenstands der Anwendung (z.B. Tupel, Objekt) mit variabler oder fester Länge
|
||||||
|
\item \begriff{Satzdatei} als Sammlung von Sätzen, kann über verschiedene Blöcke verteilt sein
|
||||||
|
\item Ausprägungen: \begin{itemize}
|
||||||
|
\item \begriff{sequentiell}: \begin{itemize}
|
||||||
|
\item Reihenfolge der Abspeicherung und des Auslesens bereits mit Schreiben festgelegt
|
||||||
|
\item \wichtig{keine} Änderungen / Löschen möglich
|
||||||
|
\item kein wahlfreier Zugriff
|
||||||
|
\end{itemize}
|
||||||
|
\item \begriff{direkt}: \begin{itemize}
|
||||||
|
\item Verwendung sogenannter \begriff{Satzadressen} (hier als \begriff{TID}s realisiert; \wichtig{eindeutig} und \wichtig{unveränderlich}) als Adresstupel (Block, Index)
|
||||||
|
\item Abbildung von Index auf Offset innerhalb eines Blockes durch Array am Ende eines Blockes
|
||||||
|
\item erlaubt wahlfreien Zugriff
|
||||||
|
\item erlaubt Löschen von Sätzen: Index wird ungültig markiert, folgende Sätze nach vorne verschoben, Anpassung der Offsets
|
||||||
|
\item erlaubt Ändern von Sätzen: \begin{itemize}
|
||||||
|
\item \wichtig{ohne} Überlauf: Verschieben der folgenden Sätze, Anpassung der Offsets
|
||||||
|
\item \wichtig{mit} Überlauf: Satz wird in anderen Block verschoben, Verweis auf diesen wird angelegt, (evtl.) Anpassung der Offsets
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\section{Schlüssel}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \begriff{Schlüsselwerte} als \enquote{inhaltsbezogene Adressen}
|
||||||
|
\item \begriff{Hashing}: \begin{itemize}
|
||||||
|
\item \begriff{Hash-Funktion} verteilt Schlüsselwert möglichst gleichmäßig auf verfügbare \begriff{Buckets} (Blöcke)
|
||||||
|
\item \begriff{Divisions-Rest-Verfahren}: $h(k) = (k \mod q)$ mit Schlüsselwert $k$ und Anzahl der Buckets $q$
|
||||||
|
\item Problem des \begriff{Überlaufs} mit verschiedenen Lösungsmöglichkeiten: \begin{itemize}
|
||||||
|
\item \begriff{Open Addressing}: Ausweichen auf Nachbarbuckets
|
||||||
|
\item spezeille \begriff{Overflow-Buckets}: Bucket verweist auf \enquote{\wichtig{seinen}} Overflow-Bucket
|
||||||
|
\end{itemize}
|
||||||
|
\item \begriff{virtuelles Hashing} zur konstanten Reorganisation: \begin{itemize}
|
||||||
|
\item Anzahl der Buckets $q$, Sätze pro Bucket $b$ $\Rightarrow$ Kapazität $\coloneqq q \cdot b$
|
||||||
|
\item Belegungsfaktor $\beta \coloneqq \frac{\text{Anzahl gespeicherter Sätze}\ N}{\text{Kapazität}}$
|
||||||
|
\item Wenn $\beta > \text{Schwellwert}\ \alpha$, Menge der Buckets vergrößern
|
||||||
|
\item als \begriff{VH1}: \begin{itemize}
|
||||||
|
\item Anzahl der Blöcke direkt verdoppeln
|
||||||
|
\item neue Hashfunktion $h_2$ einführen
|
||||||
|
\item Bitmaske um Verwendung der neuen Hashfunktion zu verwalten
|
||||||
|
\item bei \wichtig{Einfügen} eines Satzes in ein \enquote{altes} Bucket Neuverteilung dieses Buckets mittels $h_2$, Bit setzen
|
||||||
|
\end{itemize}
|
||||||
|
\item als \begriff{Lineares Hashing}: \begin{itemize}
|
||||||
|
\item Positionszeiger $p$
|
||||||
|
\item \wichtig{ein} neues Bucket anlegen
|
||||||
|
\item Bucket an Stelle $p$ mit $h_2$ aufteilen, $p$++
|
||||||
|
\item wenn $h_1(k) < p$, dann mittels $h_2$ verteilen
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
\item \begriff{Indizes} mittels \begriff{Bäumen}: \begin{itemize}
|
||||||
|
\item \begriff{B-Baum}: \begin{itemize}
|
||||||
|
\item jeder \begriff{Knoten} ist genau einen Block groß
|
||||||
|
\item \wichtig{balanciert}, alle Blätter außer Wurzel immer mindestens zur Hälfte gefüllt
|
||||||
|
\item Knoten: \begin{itemize}
|
||||||
|
\item Anzahl der verwendeten Einträge $n$, es gilt $k \leq n \leq 2k$
|
||||||
|
\item \begriff{Eintrag}: Tupel (Schlüsselwert, Datensatz, Blocknummer des Kindknotens)
|
||||||
|
\item Einträge nach Schlüsselwert \wichtig{sortiert}
|
||||||
|
\end{itemize}
|
||||||
|
\item Einfügen: wie Suchen; nur in Blattknoten; bei Überlauf \enquote{linke} und \enquote{rechte} Einträge als neue Knoten, \enquote{mittlerer} als \begriff{Diskriminator} in Eltern-Knoten einfügen
|
||||||
|
\item Löschen von Schlüssel $S$ im Blattknoten: \begin{itemize}
|
||||||
|
\item Entfernen und ggf. Unterlauf behandeln
|
||||||
|
\end{itemize}
|
||||||
|
\item Löschen von Schlüssel $S$ in innerem Knoten: \begin{itemize}
|
||||||
|
\item betrachte doe Blattknoten mit direktem Vorgänger $S'$ und direktem Nachfolger $S''$ von $S$
|
||||||
|
\item wähle den größeren
|
||||||
|
\item ersetze $S$ je nach Wahl durch $S'$ bzw. $S''$
|
||||||
|
\item lösche entsprechenden Schlüssel $S'$ bzw. $S''$ und ggf. Unterlauf behandeln
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
\item \begriff{B*-Baum} / \begriff{B+-Baum}: \begin{itemize}
|
||||||
|
\item Sätze stehen \wichtig{ausschließlich} in Blattknoten
|
||||||
|
\item innerer Knoten: \begin{itemize}
|
||||||
|
\item Anzahl der verwendeten Einträge $n$
|
||||||
|
\item Eintrag: Tupel (Referenzschlüssel, Blocknummer des Kindknotens)
|
||||||
|
\end{itemize}
|
||||||
|
\item Blattknoten: \begin{itemize}
|
||||||
|
\item Anzahl der verwendeten Einträge $n$
|
||||||
|
\item Vorgänger-Zeiger, Nachfolger-Zeiger
|
||||||
|
\item Eintrag: Tupel (Schlüsselwert, Datensatz)
|
||||||
|
\end{itemize}
|
||||||
|
\item Löschen ohne Unterlauf: lösche Satz aus Blatt; Diskriminator muss \wichtig{nicht} geändert werden
|
||||||
|
\item Löschen mit Unterlauf:\begin{itemize}
|
||||||
|
\item Ist Anzahl der Einträge des Blatts und eines Nachbarknotens größer als 2k, verteile Sätze neu auf beide Knoten
|
||||||
|
\item ansonsten mische beide Blätter zu einem einzigen
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
\item Müssen nicht zwangsläufig zur \begriff{Primärorganisation} verwendet werden, können als \enquote{Sätze} z.B. auch nur Satzadressen enthalten
|
||||||
|
\end{itemize}
|
||||||
|
\item \begriff{Bitmap-Indizes}: eine Bitmap \wichtig{pro Schlüsselwert}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\section{Puffer}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Hauptspeicherbereich, der Blöcke aufnehmen kann, um (Lese-/Schreibe-) Zugriffe zu \wichtig{beschleunigen}
|
||||||
|
\item \begriff{Ersetzungsstrategie}: \enquote{Welcher Block wird verdrängt?} \begin{itemize}
|
||||||
|
\item \begriff{first in, first out} (FIFO): \enquote{ältester} Block
|
||||||
|
\item \begriff{least frequently used} (LFU): am seltensten benutzter Block
|
||||||
|
\item \begriff{least recently used} (LRU): am längsten nicht mehr benutzter Block
|
||||||
|
\item \begriff{second chance} (CLOCK): Approximation von LRU mit einfacherer Implementierung: \begin{itemize}
|
||||||
|
\item Jeder Block im Puffer besitzt ein \begriff{Benutzt-Bit}
|
||||||
|
\item bei Verdrängung Suche mit Zeiger
|
||||||
|
\item falls Benutzt-Bit 1, auf 0 setzen
|
||||||
|
\item falls Benutzt-Bit 0, Block ersetzen
|
||||||
|
\item \textbf{TODO:} Muss immer weitergegangen werden?
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
\item Zustand im Fehlerfall hängt unter anderem von \begriff{Einbringstrategie} (siehe \textbf{TODO} Recovery) und \begriff{Seitenzuordnung} ab
|
||||||
|
\item Seitenzuordnung: \enquote{Welche Blöcke (in einer Datei) gehören zu einer Seite (im Puffer)?} \begin{itemize}
|
||||||
|
\item \begriff{direkt}: aufeinander folgende Seiten werden auf aufeinander folgende Blöcke einer Datei abgebildet
|
||||||
|
\item \begriff{indirekt}: \begriff{Page Table} enthält zu jeder Seite eine Blocknummer
|
||||||
|
\end{itemize}
|
||||||
|
\item Seiteneinbringung: \begin{itemize}
|
||||||
|
\item \begriff{direkt}: Bei Verdrängung aus Puffer wird genau der Block überschrieben, aus dem ursprünglich eingelagert wurde (\enquote{update-in-place})
|
||||||
|
\item \begriff{indirekt}: Bei Verdrängung aus Puffer wird in einen freien Block geschrieben.
|
||||||
|
\end{itemize}
|
||||||
|
\item Problem der indirekten Seiteneinbringung: \enquote{Wann können alte Blöcke gelöscht werden?}; verschiedene Lösungsansätze: \begin{itemize}
|
||||||
|
\item \begriff{Schattenspeicher}: \begin{itemize}
|
||||||
|
\item Änderungen nur auf Kopien, die periodisch dann mit \enquote{gesicherter} Version vertauscht wird
|
||||||
|
\end{itemize}
|
||||||
|
\item \begriff{Twin Slots}: \begin{itemize}
|
||||||
|
\item jede Seite hat zwei Blöcke
|
||||||
|
\item immer beide lesen, bei Änderungen älteren überschreiben
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
\end{document}
|
Loading…
Reference in New Issue
Block a user