diff --git a/docs/mqtt-communication-sequence.drawio b/docs/mqtt-communication-sequence.drawio
new file mode 100644
index 0000000..3bfc45b
--- /dev/null
+++ b/docs/mqtt-communication-sequence.drawio
@@ -0,0 +1 @@
+5Vpbb6M4FP41SLMPjcBcUh6TtJOt1Gpmt5U62zcnOIk1DkbGNGF+/RpwAGNI6DZ0205f6nNsbHy+79xQDHu23c8ZjDZ3NEDEAGawN+wrAwDLunTFv0yTFhrPsQvFmuFALqoU9/gXkkpTahMcoFhZyCklHEeqcknDEC25ooOM0Z26bEWJemoE10hT3C8h0bWPOOCbQnvpmpX+T4TXm8PJlilntvCwWCriDQzorqayrw17xijlxWi7nyGSGe9gl+K5rx2z5YsxFPI+D9hhMv26Z/4yvTWj8NvjA4DzC7nLMySJvPAUsyBEXNgceAawBQ72dHIj1twj9oyXSF6GpwcLiXtF2TDZklu8QgSHQppGiOGt2IaJGSLV3yvdVODFodBl81YuEwKjGC/ybbNDGVomLMbP6G8UF7TItTQJAxRIqbRpLnBGf5YoZZvqJjrcFzGO9jWVNNkcUfGCLBVL5OylRC9VxV3FhRLxTY0H5UIo+bcud64gEgOJ0gsQAxpiGiIRxSHPz3WnhnvVQIMyvqFrGkJSx+OVdj1Krt7GdlzF2OM2Y7fYeihTu63OsYVRzTXu/np4+G2dwwYqYP+/d3gfxzvcl1rb6WFs3daWdwZb36Br/rR6fCK/5k/2+JuNJ3N4YTmnjZ3dDotsOiF4HQrVgnJOt8JIKAwmWXrOdIQuf542K9pj/iMbjyzHkfI/2eqRK6WrvXw4F9KaUMMy1xXviQIt9/fDLKYJW6LTNOSQrRE/ZsJxO+IMEciFd6vlTAuA8tHvGacrpgAHjDLPK/8chTlialSbNBv7F7eTW9YLisYplq3mRtBkWnF9bSOBO0xry6RDdt6mZHCqyp3v1VgPTGW9GBRvUDG/tPwrnEFPFiJLEAH+dMHEaM1L2tXcI2PgLVyImtmebviWSKpD6S1LwcY8/jTdaIuDINtD5AER/mGVF/Tg1hFlyopZPmyUabTuBEf8vjNMXZiCe56nQlBI/5XWhyV0tYoRb4B5Hvj0xAGD4IFOk9UKMR3JLwHK8v1NYIBZ1t1AjopRxOgCLjDBPP3jd4HbdsBZ4S7jy8j16nEKqIcAdcMByTF+N1VFC7D9klYnfm57sDxVVthDVXCXmq2jZEFwvDFmwJiIU833P/iCgx7R4Iy1kc4Eq2elAvRK5Vjl0yiZzl+5jNUiV6te+xYnJWm7NuooTs4WMzQat31YuQmjhH/k9vFEPDre0LhAxehN28dW1N7Px5UThu3mXN/20e8X552hTG1rpi4+pTQrrVi4RlaBNUspQnAUo8KcuY8sCU3EgdPdBnN0H8E87O0YjNRi6wy8tRofBS3QYkvQYszBeNvjs8cgnbjpXyqduOkd5s/ai/dNZr3b7kFyl9NIOWUp9dLc5XbVZG+Uu/wWNn3OVtY76ucfs5M1NfQEV+4Qh6Iq/SQt6UnYBupIgTMCvrLvoV15A1z1inLQGB+K1/2RB3XfP8hFkLetckEV5XMprUvNOH/IGgIe0/KVtOH7zhuljWNV38keqIN2rySV20wbzSqhb9rwrPForNJTlHmjselXfw26Dt0EtdXTnzOTWMdLxo+ZSvQanSGesDD7xKF/AP0kyeU0kgNllwvbG5ljNb1Y1sgFr08xQqx+aFIsr36uY1//Cw==
\ No newline at end of file
diff --git a/docs/thesis/bib/mybib.bib b/docs/thesis/bib/mybib.bib
index 61c3a0c..eb7a9a5 100644
--- a/docs/thesis/bib/mybib.bib
+++ b/docs/thesis/bib/mybib.bib
@@ -43,11 +43,16 @@
url = {https://code.visualstudio.com/},
}
-@misc{nglog,
+@misc{nlog,
title = {Az NLog hivatalos oldala},
url = {https://nlog-project.org/},
}
+@misc{jwt,
+ title = {Az JSON Web Token hivatalos oldala},
+ url = {https://jwt.io/introduction/},
+}
+
@misc{react,
title = {A React.js hivatalos oldala},
url = {https://reactjs.org/},
@@ -78,6 +83,11 @@
url = {https://github.com/RicoSuter/NSwag},
}
+@misc{swagger-ui,
+ title = {A Swagger UI hivatalos oldala},
+ url = {https://swagger.io/tools/swagger-ui/},
+}
+
@misc{hmacsha512,
title = {Az HMACSHA512 dokumentációja},
url = {https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.hmacsha512},
diff --git a/docs/thesis/content/birdmap-backend.tex b/docs/thesis/content/birdmap-backend.tex
index 08f3dc1..48e9e30 100644
--- a/docs/thesis/content/birdmap-backend.tex
+++ b/docs/thesis/content/birdmap-backend.tex
@@ -63,6 +63,7 @@ A \verb+Role+ mező ennek a megkülönböztetsnek a jelzője.
%----------------------------------------------------------------------------
\subsection{Seedelés}
+\label{subsect:seeding}
%----------------------------------------------------------------------------
Az alkalmazás konfigurációs fájljából meg lehet adni alapértelmezett felhasználókat és szolgáltatásokat.
Ezeknek megkülönböztetésére szolgál az entitások \verb+IsFromConfig+ mezője.
@@ -90,6 +91,7 @@ ha igen, akkor a megadott jelszóból az imént említett folyamattal generált
\section{Megjelenítési réteg}
%----------------------------------------------------------------------------
A fejezet elején említett \verb+Startup+ osztály ebben a rétegben található, itt kerülnek az egyes szolgáltatások regisztrálásra.
+Itt történik a \ref{subsect:seeding} fejezetben leírt adatbázis seedelése is.
Többek között a naplózás is itt kerül inicializálásra, mely az NLog saját konfigurációs fájljával történik.
Meg lehet adni különböző szűrőket és kimeneteket, amellyel szelektálni lehet, hogy az egyes naplózott események hova kerüljenek.
@@ -111,20 +113,78 @@ Minden \verb+Debug+ szintől nagyobb és \verb+Error+ szinttől kisebb bejegyzé
...
\end{lstlisting}
-%
-program.cs startup.cs
-middlewares
-logolás
-seedelés
-swagger
+
+A \verb+Startup+ osztály másik metódusa a \verb+Configure+, mellyel a HTTP kérések csővezetéke konfigurálható.
+Azaz, hogy egy kérés-t milyen sorrendben dolgozzák fel a regisztrált szolgáltatások.
+A szerveroldali kivételkezelésre szánt szolgáltatás, az \verb+ExceptionHandlerMiddleware+ is itt van használva,
+amely elkap minden kivételt, amit a csővezeték további részei dobtak és JSON formátumban visszaadja azokat a kliensnek.
+
+Továbbá az NSwag\cite{nswag} szoftvercsomag segítségével regisztrálok egy szolgáltatást,
+mely a szerveroldalon található kontrollereket felhasználva generál egy OpenAPI specifikációt és annak egy Swagger UI\cite{swagger-ui} felületet,
+ahol a végpontok kipróbálhatóak, tesztelhetőek kliensoldal nélkül is.
+
+\begin{figure}[!ht]
+ \centering
+ \includegraphics[width=150mm, keepaspectratio]{figures/swagger-ui.png}
+ \caption{Az alkalmazásom Swagger felülete}
+ \label{fig:swagger-ui}
+\end{figure}
+
%----------------------------------------------------------------------------
\subsection{Kommunikációs Szolgáltatások}
%----------------------------------------------------------------------------
-mqtt
-signalR
+A kliensoldal frissítésére több megoldás is létezik. Például bizonyos időközönként lehetne kéréseket indítani a szerver felé a friss adatok megszerzéséért.
+Egy másik megoldás a SignalR használata, amellyel a klienseket eseményvezérelten lehet értesíteni, megvalósítja a kétoldalú kommunikációt.
+Így a kliensek csak akkor indítanak kéréseket amikor az adat tényleg változott. Ezzel a technológiával oldottam meg például, hogy az eszközök állapotainak változására
+frissüljön a felület.
+
+Egy másik szolgáltatás a Birdnetes MQTT kommunikációért felelős szolgáltatás,
+mely felregisztrál a \ref{subsect:birdnetes-ai-service}-as alfejezetben bemutatott AI Service által publikált üzenetekre.
+Ezekben az üzenetekben található a hanganyagok egyedi azonosítója, illetve azok seregélytől való származásának valószínüsége.
+Ha a szolgáltatás kap egy ilyen üzenetet akkor lekérdezi a \ref{subsect:birdnetes-input-service}-es alfejezetben bemutatott Input Service-től
+a hanganyag azonosítójához tartozó metaadatokat.
+Ezekből felhasználva a kihelyezett eszköz azonosítóját, a hanganyag beérkezésének dátumát és az említett valószínüséget új üzeneteket készítek, melyeket egy pufferben tárolok.
+Ezt a folyamatot a \ref{fig:birdmap-mqtt-service}-es ábra szemlélteti.
+
+\begin{figure}[!ht]
+ \centering
+ \includegraphics[width=150mm, keepaspectratio]{figures/mqtt-communication-sequence.png}
+ \caption{A Birdmap MQTT szolgáltatásának szekvenciája}
+ \label{fig:birdmap-mqtt-service}
+\end{figure}
+
+A puffer tartalmát másodperces gyakorisággal elküldöm a klienseknek a SignalR segítségével.
+Azért van szükség a puffer használatára, mert az MQTT-n érkezett üzenetek gyakorisága akár miliszekundum nagyságrendű is lehet.
+Míg a szerver képes is az üzeneteket feldolgozni, ha ezeket rögtön tovább küldeném a kliensek felé, azok nem biztos, hogy képesek lennének rá.
+
%----------------------------------------------------------------------------
\subsection{Kontrollerek}
%----------------------------------------------------------------------------
+A kontrollerek határozzák meg, hogy a szerveroldalon milyen végpontokat, milyen paraméterekkel lehet meghívni, ahhoz milyen jogosultságok kellenek.
+A jogosultságok kezelését a JSON Web Token-ekkel oldottam meg. A fejlasználó bejelentkezéskor kap egy ilyen token-t,
+amelyben tárolom a hozzá tartozó szerepet. A \ref{lst:devices-controller}-as listában látszik, hogy hogyan használom ezeket a szerepeket.
+A kontroller végpontjait alapértelmezetten \verb+User+ és \verb+Admin+ jogosultságú felhasználó hívhatja, az online végpontot azonban csak \verb+Admin+ jogosultságú.
+Hasonló képpen oldottam meg ezt a többi kontrollernél is. A \verb+User+ felhasználók csak olyan végpontokat hívhat, mely kizárolag az állapotok olvasásával jár.
+Az \verb+Admin+ felhasználók hívhatnak bármilyen végpontot.
+
+\lstset{style=sharpc, morekeywords={record, async}}
+\begin{lstlisting}[caption=Az eszköz kontroller és annak "online" végpontja, label=lst:devices-controller]
+ [Authorize(Roles = "User, Admin")]
+ [ApiController]
+ [Route("api/[controller]")]
+ public class DevicesController : ControllerBase
+ {
+ [Authorize(Roles = "Admin")]
+ [HttpPost, Route("online")]
+ public async Task Onlineall()
+ {
+ ...
+ }
+
+ ...
+ }
+\end{lstlisting}
+
Controllersw
Dtos
mapper
\ No newline at end of file
diff --git a/docs/thesis/content/birdmap-technologies.tex b/docs/thesis/content/birdmap-technologies.tex
index 8550ba8..8f77ac0 100644
--- a/docs/thesis/content/birdmap-technologies.tex
+++ b/docs/thesis/content/birdmap-technologies.tex
@@ -68,6 +68,17 @@ vagy a React.js-t.
Az Entity Framework Core (röviden EF Core) egy objektum-relációs leképező keretrendszer a .NET-hez. Az adatbázissal való kommunikációt könnyítését szolgálja.
Használatával C\#-ban lehet adatbázis lekérdezéseket írni a LINQ (Language-Integrated Query) segítségével.
+%----------------------------------------------------------------------------
+\subsection{JSON Web Token}
+%----------------------------------------------------------------------------
+Az autorizációt többféleképpen meg lehet oldani egy alkalmazás szempontjából. Az egyik ilyen megoldás a JSON Web Token-ek (röviden JWT) \cite{jwt} használata,
+ami nem más mint egy szabvány, mely módszert ad a felek közötti információ biztonságos továbbítására JSON objektumokkal.
+Ezen objektumok adatokat tárolhatnak a felhasználóról például a neve vagy a szerepe, melyek segítségével a szerver eldöntheti,
+hogy van-e jogosultsága hívni az adott végpontot.
+
+A Microsoft-nak van egy beépített szoftvercsomagja, mellyel ilyen tokeneket lehet készíteni és validálni.
+A szerveroldal jogosultság kezelését ezzel a csomaggal oldottam meg.
+
%----------------------------------------------------------------------------
\subsection{SignalR}
%----------------------------------------------------------------------------
diff --git a/docs/thesis/content/birdnetes-introduction.tex b/docs/thesis/content/birdnetes-introduction.tex
index fd5bd77..1d1cc3b 100644
--- a/docs/thesis/content/birdnetes-introduction.tex
+++ b/docs/thesis/content/birdnetes-introduction.tex
@@ -103,6 +103,7 @@ Tartalmaznak még egy hangszórót is, mely a madarak elijesztését szolgálja.
%----------------------------------------------------------------------------
\subsubsection{Input Service}
+\label{subsect:birdnetes-input-service}
%----------------------------------------------------------------------------
A kihelyezett IoT eszközök által felvett hangfájlok ezen a komponensen keresztül érkeznek be a rendszerbe.
Itt történik a hanganyaghoz tartozó metaadatok lementése az Input Service saját adatbázisába.
@@ -112,6 +113,7 @@ publikál egy üzenetet az MQTT üzenetsorra a többi kliensnek feldolgozásra.
%----------------------------------------------------------------------------
\subsubsection{AI Service}
+\label{subsect:birdnetes-ai-service}
%----------------------------------------------------------------------------
Az AI Service példányai fogadják az Input Service-től érkező üzeneteket és elkezdik klasszifikálni az abban található hanganyagot.
Meghatározzák, hogy a hanganyag mekkora valószínűséggel volt seregély hang vagy sem.
diff --git a/docs/thesis/figures/mqtt-communication-sequence.png b/docs/thesis/figures/mqtt-communication-sequence.png
new file mode 100644
index 0000000..f6ba413
Binary files /dev/null and b/docs/thesis/figures/mqtt-communication-sequence.png differ
diff --git a/docs/thesis/figures/swagger-ui.png b/docs/thesis/figures/swagger-ui.png
new file mode 100644
index 0000000..3e516a5
Binary files /dev/null and b/docs/thesis/figures/swagger-ui.png differ
diff --git a/docs/thesis/ideas.txt b/docs/thesis/ideas.txt
index 6f3fda7..c1b00b9 100644
--- a/docs/thesis/ideas.txt
+++ b/docs/thesis/ideas.txt
@@ -55,6 +55,11 @@ Forma
- felépítés architektúra
- App and navigation
- Components and services
+ - kép minden felületről
+ - kép user és admin felhasználók különbségéről
+ - Device service
+ - dashboard systeminfo service
+ - kép a skeletonról -> igazi adat
- Tesztkörnyezet
- Kubenetes
- Összefoglaló
diff --git a/docs/thesis/thesis.pdf b/docs/thesis/thesis.pdf
index 335a419..fc71468 100644
--- a/docs/thesis/thesis.pdf
+++ b/docs/thesis/thesis.pdf
@@ -220,165 +220,170 @@ endobj
<< /S /GoTo /D (subsection.4.2.3) >>
endobj
148 0 obj
-(\376\377\000S\000i\000g\000n\000a\000l\000R)
+(\376\377\000J\000S\000O\000N\000\040\000W\000e\000b\000\040\000T\000o\000k\000e\000n)
endobj
149 0 obj
<< /S /GoTo /D (subsection.4.2.4) >>
endobj
152 0 obj
-(\376\377\000M\000Q\000T\000T\000.\000N\000E\000T)
+(\376\377\000S\000i\000g\000n\000a\000l\000R)
endobj
153 0 obj
<< /S /GoTo /D (subsection.4.2.5) >>
endobj
156 0 obj
-(\376\377\000N\000L\000o\000g)
+(\376\377\000M\000Q\000T\000T\000.\000N\000E\000T)
endobj
157 0 obj
-<< /S /GoTo /D (section.4.3) >>
+<< /S /GoTo /D (subsection.4.2.6) >>
endobj
160 0 obj
-(\376\377\000F\000r\000o\000n\000t\000e\000n\000d\000\040\000t\000e\000c\000h\000n\000o\000l\000\363\000g\000i\000\341\000k)
+(\376\377\000N\000L\000o\000g)
endobj
161 0 obj
-<< /S /GoTo /D (subsection.4.3.1) >>
+<< /S /GoTo /D (section.4.3) >>
endobj
164 0 obj
-(\376\377\000R\000e\000a\000c\000t\000.\000j\000s)
+(\376\377\000F\000r\000o\000n\000t\000e\000n\000d\000\040\000t\000e\000c\000h\000n\000o\000l\000\363\000g\000i\000\341\000k)
endobj
165 0 obj
-<< /S /GoTo /D (subsection.4.3.2) >>
+<< /S /GoTo /D (subsection.4.3.1) >>
endobj
168 0 obj
-(\376\377\000M\000a\000t\000e\000r\000i\000a\000l\000\040\000U\000I)
+(\376\377\000R\000e\000a\000c\000t\000.\000j\000s)
endobj
169 0 obj
-<< /S /GoTo /D (subsection.4.3.3) >>
+<< /S /GoTo /D (subsection.4.3.2) >>
endobj
172 0 obj
-(\376\377\000A\000p\000e\000x\000c\000h\000a\000r\000t\000s)
+(\376\377\000M\000a\000t\000e\000r\000i\000a\000l\000\040\000U\000I)
endobj
173 0 obj
-<< /S /GoTo /D (subsection.4.3.4) >>
+<< /S /GoTo /D (subsection.4.3.3) >>
endobj
176 0 obj
-(\376\377\000G\000o\000o\000g\000l\000e\000\040\000M\000a\000p\000s\000\040\000A\000p\000i)
+(\376\377\000A\000p\000e\000x\000c\000h\000a\000r\000t\000s)
endobj
177 0 obj
-<< /S /GoTo /D (chapter.5) >>
+<< /S /GoTo /D (subsection.4.3.4) >>
endobj
180 0 obj
-(\376\377\000S\000z\000e\000r\000v\000e\000r\000\040\000o\000l\000d\000a\000l)
+(\376\377\000G\000o\000o\000g\000l\000e\000\040\000M\000a\000p\000s\000\040\000A\000p\000i)
endobj
181 0 obj
-<< /S /GoTo /D (section.5.1) >>
+<< /S /GoTo /D (chapter.5) >>
endobj
184 0 obj
-(\376\377\000A\000r\000c\000h\000i\000t\000e\000k\000t\000\372\000r\000a)
+(\376\377\000S\000z\000e\000r\000v\000e\000r\000\040\000o\000l\000d\000a\000l)
endobj
185 0 obj
-<< /S /GoTo /D (section.5.2) >>
+<< /S /GoTo /D (section.5.1) >>
endobj
188 0 obj
-(\376\377\000A\000d\000a\000t\000\040\000e\000l\000\351\000r\000\351\000s\000i\000\040\000r\000\351\000t\000e\000g)
+(\376\377\000A\000r\000c\000h\000i\000t\000e\000k\000t\000\372\000r\000a)
endobj
189 0 obj
-<< /S /GoTo /D (subsection.5.2.1) >>
+<< /S /GoTo /D (section.5.2) >>
endobj
192 0 obj
-(\376\377\000E\000n\000t\000i\000t\000\341\000s\000o\000k)
+(\376\377\000A\000d\000a\000t\000\040\000e\000l\000\351\000r\000\351\000s\000i\000\040\000r\000\351\000t\000e\000g)
endobj
193 0 obj
-<< /S /GoTo /D (subsection.5.2.2) >>
+<< /S /GoTo /D (subsection.5.2.1) >>
endobj
196 0 obj
-(\376\377\000S\000e\000e\000d\000e\000l\000\351\000s)
+(\376\377\000E\000n\000t\000i\000t\000\341\000s\000o\000k)
endobj
197 0 obj
-<< /S /GoTo /D (section.5.3) >>
+<< /S /GoTo /D (subsection.5.2.2) >>
endobj
200 0 obj
-(\376\377\000\334\000z\000l\000e\000t\000i\000\040\000l\000o\000g\000i\000k\000a\000i\000\040\000r\000\351\000t\000e\000g)
+(\376\377\000S\000e\000e\000d\000e\000l\000\351\000s)
endobj
201 0 obj
-<< /S /GoTo /D (section.5.4) >>
+<< /S /GoTo /D (section.5.3) >>
endobj
204 0 obj
-(\376\377\000M\000e\000g\000j\000e\000l\000e\000n\000\355\000t\000\351\000s\000i\000\040\000r\000\351\000t\000e\000g)
+(\376\377\000\334\000z\000l\000e\000t\000i\000\040\000l\000o\000g\000i\000k\000a\000i\000\040\000r\000\351\000t\000e\000g)
endobj
205 0 obj
-<< /S /GoTo /D (subsection.5.4.1) >>
+<< /S /GoTo /D (section.5.4) >>
endobj
208 0 obj
-(\376\377\000K\000o\000m\000m\000u\000n\000i\000k\000\341\000c\000i\000\363\000s\000\040\000S\000z\000o\000l\000g\000\341\000l\000t\000a\000t\000\341\000s\000o\000k)
+(\376\377\000M\000e\000g\000j\000e\000l\000e\000n\000\355\000t\000\351\000s\000i\000\040\000r\000\351\000t\000e\000g)
endobj
209 0 obj
-<< /S /GoTo /D (subsection.5.4.2) >>
+<< /S /GoTo /D (subsection.5.4.1) >>
endobj
212 0 obj
-(\376\377\000K\000o\000n\000t\000r\000o\000l\000l\000e\000r\000e\000k)
+(\376\377\000K\000o\000m\000m\000u\000n\000i\000k\000\341\000c\000i\000\363\000s\000\040\000S\000z\000o\000l\000g\000\341\000l\000t\000a\000t\000\341\000s\000o\000k)
endobj
213 0 obj
<< /S /GoTo /D (subsection.5.4.2) >>
endobj
-215 0 obj
-(\376\377\000I\000r\000o\000d\000a\000l\000o\000m\000j\000e\000g\000y\000z\000\351\000k)
-endobj
216 0 obj
-<< /S /GoTo /D (appendix*.10) >>
+(\376\377\000K\000o\000n\000t\000r\000o\000l\000l\000e\000r\000e\000k)
endobj
-219 0 obj
-(\376\377\000F\000\374\000g\000g\000e\000l\000\351\000k)
+217 0 obj
+<< /S /GoTo /D (lstnumber.5.3.14) >>
endobj
220 0 obj
-<< /S /GoTo /D (section.F.1) >>
+(\376\377\000I\000r\000o\000d\000a\000l\000o\000m\000j\000e\000g\000y\000z\000\351\000k)
endobj
-223 0 obj
-(\376\377\000A\000\040\000T\000e\000X\000s\000t\000u\000d\000i\000o\000\040\000f\000e\000l\000\374\000l\000e\000t\000e)
+221 0 obj
+<< /S /GoTo /D (appendix*.12) >>
endobj
224 0 obj
-<< /S /GoTo /D (section.F.2) >>
+(\376\377\000F\000\374\000g\000g\000e\000l\000\351\000k)
endobj
-227 0 obj
-(\376\377\000V\000\341\000l\000a\000s\000z\000\040\000a\000z\000\040\000,\000,\000\311\000l\000e\000t\000,\000\040\000a\000\040\000v\000i\000l\000\341\000g\000m\000i\000n\000d\000e\000n\000s\000\351\000g\000,\000\040\000m\000e\000g\000\040\000m\000i\000n\000d\000e\000n\000'\000'\000\040\000k\000\351\000r\000d\000\351\000s\000\351\000r\000e)
+225 0 obj
+<< /S /GoTo /D (section.F.1) >>
endobj
228 0 obj
-<< /S /GoTo /D [229 0 R /Fit] >>
+(\376\377\000A\000\040\000T\000e\000X\000s\000t\000u\000d\000i\000o\000\040\000f\000e\000l\000\374\000l\000e\000t\000e)
+endobj
+229 0 obj
+<< /S /GoTo /D (section.F.2) >>
endobj
232 0 obj
+(\376\377\000V\000\341\000l\000a\000s\000z\000\040\000a\000z\000\040\000,\000,\000\311\000l\000e\000t\000,\000\040\000a\000\040\000v\000i\000l\000\341\000g\000m\000i\000n\000d\000e\000n\000s\000\351\000g\000,\000\040\000m\000e\000g\000\040\000m\000i\000n\000d\000e\000n\000'\000'\000\040\000k\000\351\000r\000d\000\351\000s\000\351\000r\000e)
+endobj
+233 0 obj
+<< /S /GoTo /D [234 0 R /Fit] >>
+endobj
+237 0 obj
<<
-/Length 538
+/Length 537
/Filter /FlateDecode
>>
stream
-xڅSMo0Wz_ɵP ܵ6d_xѪ Hd~<#>yCX91HQCJĺ*\Ks)q뀼Ṕfqz[g7 Y+ 3]2-
-/
FoOsRO{zZit/L[.N{!8Ũt?{1hk
J2ji[
Sy~/^,$ٹ9T|c EJΕQ\:X҈+[r]c7,2 ~ZSILkTQAחm%84]D.hCb:%vCy|eJD
-?M_T 1
-;B eR,uC{kC혒bZK(+Ǡf?>/@VZl_96$Y_`J6UJ&74hKAFn7KM&