From 7fcdc1c788725f866de71fc9dfd8c4d1cb132b57 Mon Sep 17 00:00:00 2001 From: Orangerot Date: Fri, 24 May 2024 17:42:08 +0200 Subject: Initial commit --- 20-implementierungsheft/.gitignore | 305 + 20-implementierungsheft/.gitlab-ci.yml | 36 + 20-implementierungsheft/.latexmkrc | 7 + 20-implementierungsheft/Makefile | 18 + 20-implementierungsheft/README.md | 31 + 20-implementierungsheft/assets/.gitignore | 3 + 20-implementierungsheft/assets/KIT_Deckblatt.pdf | Bin 0 -> 11836 bytes .../assets/diagrams/backendComponentDiagram.puml | 61 + .../assets/diagrams/class_after.puml | 574 + .../assets/diagrams/classdiagram.puml | 463 + .../assets/diagrams/componentdiagram.puml | 79 + 20-implementierungsheft/assets/diagrams/db.puml | 78 + .../assets/diagrams/deployment.puml | 59 + .../assets/diagrams/gantt-plan.puml | 31 + .../assets/diagrams/gantt-reality.puml | 39 + .../diagrams/sequencediagram-forgotAndResetPW.puml | 41 + .../sequencediagram-getEpisodeActions.puml | 38 + ...ncediagram-getEpisodeActionsOfPodcastSince.puml | 32 + .../diagrams/sequencediagram-getSubscriptions.puml | 38 + .../assets/diagrams/sequencediagram-register.puml | 26 + .../sequencediagram-uploadEpisodeActions.puml | 38 + .../sequencediagram-uploadSubscriptions.puml | 32 + 20-implementierungsheft/assets/episode.png | Bin 0 -> 10778 bytes 20-implementierungsheft/assets/errorlog.png | Bin 0 -> 23928 bytes .../assets/floatinglabelinput.png | Bin 0 -> 6125 bytes .../assets/gantt-plan-eps-converted-to.pdf | Bin 0 -> 99852 bytes 20-implementierungsheft/assets/gantt-plan.eps | 8314 ++++++++++++++ 20-implementierungsheft/assets/gantt-plan.pdf | 0 .../assets/gantt-reality-eps-converted-to.pdf | Bin 0 -> 135081 bytes 20-implementierungsheft/assets/gantt-reality.eps | 11142 +++++++++++++++++++ 20-implementierungsheft/assets/gantt.png | Bin 0 -> 39076 bytes 20-implementierungsheft/assets/help.png | Bin 0 -> 14423 bytes 20-implementierungsheft/assets/lastupdate.png | Bin 0 -> 9363 bytes 20-implementierungsheft/assets/loading.png | Bin 0 -> 5236 bytes 20-implementierungsheft/assets/logo.pdf | Bin 0 -> 11797 bytes 20-implementierungsheft/assets/logo.svg | 211 + 20-implementierungsheft/assets/navbar.png | Bin 0 -> 8940 bytes 20-implementierungsheft/assets/password-margin.png | Bin 0 -> 8701 bytes 20-implementierungsheft/assets/password.png | Bin 0 -> 8781 bytes 20-implementierungsheft/assets/passwordinput.png | Bin 0 -> 6856 bytes .../assets/passwordvalidator.png | Bin 0 -> 24197 bytes 20-implementierungsheft/assets/progresstime.png | Bin 0 -> 4222 bytes 20-implementierungsheft/assets/subscription.png | Bin 0 -> 79929 bytes 20-implementierungsheft/implementierungsheft.tex | 98 + .../sections/anforderungsanalyse.tex | 185 + 20-implementierungsheft/sections/apidoc.tex | 191 + 20-implementierungsheft/sections/aufbau.tex | 47 + 20-implementierungsheft/sections/backend.tex | 28 + 20-implementierungsheft/sections/changes.tex | 241 + 20-implementierungsheft/sections/einleitung.tex | 11 + 20-implementierungsheft/sections/features.tex | 43 + 20-implementierungsheft/sections/features.tex.orig | 82 + 20-implementierungsheft/sections/frontend.tex | 196 + 20-implementierungsheft/sections/glossar.tex | 371 + 20-implementierungsheft/sections/methodology.tex | 16 + 20-implementierungsheft/sections/tests.tex | 21 + 20-implementierungsheft/sections/timeline.tex | 7 + 20-implementierungsheft/titlepage.tex | 75 + 58 files changed, 23308 insertions(+) create mode 100644 20-implementierungsheft/.gitignore create mode 100644 20-implementierungsheft/.gitlab-ci.yml create mode 100644 20-implementierungsheft/.latexmkrc create mode 100644 20-implementierungsheft/Makefile create mode 100644 20-implementierungsheft/README.md create mode 100644 20-implementierungsheft/assets/.gitignore create mode 100644 20-implementierungsheft/assets/KIT_Deckblatt.pdf create mode 100644 20-implementierungsheft/assets/diagrams/backendComponentDiagram.puml create mode 100644 20-implementierungsheft/assets/diagrams/class_after.puml create mode 100644 20-implementierungsheft/assets/diagrams/classdiagram.puml create mode 100644 20-implementierungsheft/assets/diagrams/componentdiagram.puml create mode 100644 20-implementierungsheft/assets/diagrams/db.puml create mode 100644 20-implementierungsheft/assets/diagrams/deployment.puml create mode 100644 20-implementierungsheft/assets/diagrams/gantt-plan.puml create mode 100644 20-implementierungsheft/assets/diagrams/gantt-reality.puml create mode 100644 20-implementierungsheft/assets/diagrams/sequencediagram-forgotAndResetPW.puml create mode 100644 20-implementierungsheft/assets/diagrams/sequencediagram-getEpisodeActions.puml create mode 100644 20-implementierungsheft/assets/diagrams/sequencediagram-getEpisodeActionsOfPodcastSince.puml create mode 100644 20-implementierungsheft/assets/diagrams/sequencediagram-getSubscriptions.puml create mode 100644 20-implementierungsheft/assets/diagrams/sequencediagram-register.puml create mode 100644 20-implementierungsheft/assets/diagrams/sequencediagram-uploadEpisodeActions.puml create mode 100644 20-implementierungsheft/assets/diagrams/sequencediagram-uploadSubscriptions.puml create mode 100644 20-implementierungsheft/assets/episode.png create mode 100644 20-implementierungsheft/assets/errorlog.png create mode 100644 20-implementierungsheft/assets/floatinglabelinput.png create mode 100644 20-implementierungsheft/assets/gantt-plan-eps-converted-to.pdf create mode 100644 20-implementierungsheft/assets/gantt-plan.eps create mode 100644 20-implementierungsheft/assets/gantt-plan.pdf create mode 100644 20-implementierungsheft/assets/gantt-reality-eps-converted-to.pdf create mode 100644 20-implementierungsheft/assets/gantt-reality.eps create mode 100644 20-implementierungsheft/assets/gantt.png create mode 100644 20-implementierungsheft/assets/help.png create mode 100644 20-implementierungsheft/assets/lastupdate.png create mode 100644 20-implementierungsheft/assets/loading.png create mode 100644 20-implementierungsheft/assets/logo.pdf create mode 100644 20-implementierungsheft/assets/logo.svg create mode 100644 20-implementierungsheft/assets/navbar.png create mode 100644 20-implementierungsheft/assets/password-margin.png create mode 100644 20-implementierungsheft/assets/password.png create mode 100644 20-implementierungsheft/assets/passwordinput.png create mode 100644 20-implementierungsheft/assets/passwordvalidator.png create mode 100644 20-implementierungsheft/assets/progresstime.png create mode 100644 20-implementierungsheft/assets/subscription.png create mode 100644 20-implementierungsheft/implementierungsheft.tex create mode 100644 20-implementierungsheft/sections/anforderungsanalyse.tex create mode 100644 20-implementierungsheft/sections/apidoc.tex create mode 100644 20-implementierungsheft/sections/aufbau.tex create mode 100644 20-implementierungsheft/sections/backend.tex create mode 100644 20-implementierungsheft/sections/changes.tex create mode 100644 20-implementierungsheft/sections/einleitung.tex create mode 100644 20-implementierungsheft/sections/features.tex create mode 100644 20-implementierungsheft/sections/features.tex.orig create mode 100644 20-implementierungsheft/sections/frontend.tex create mode 100644 20-implementierungsheft/sections/glossar.tex create mode 100644 20-implementierungsheft/sections/methodology.tex create mode 100644 20-implementierungsheft/sections/tests.tex create mode 100644 20-implementierungsheft/sections/timeline.tex create mode 100644 20-implementierungsheft/titlepage.tex (limited to '20-implementierungsheft') diff --git a/20-implementierungsheft/.gitignore b/20-implementierungsheft/.gitignore new file mode 100644 index 0000000..b1b3dda --- /dev/null +++ b/20-implementierungsheft/.gitignore @@ -0,0 +1,305 @@ +## Core latex/pdflatex auxiliary files: +*.aux +*.lof +*.log +*.lot +*.fls +*.out +*.toc +*.fmt +*.fot +*.cb +*.cb2 +.*.lb + +## Intermediate documents: +*.dvi +*.xdv +*-converted-to.* +# these rules might exclude image files for figures etc. +# *.ps +# *.eps +*.pdf +!assets/*.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 + +## Build tool directories for auxiliary files +# latexrun +latex.out/ + +## Auxiliary and intermediate files from other packages: +# algorithms +*.alg +*.loa + +# achemso +acs-*.bib + +# amsthm +*.thm + +# beamer +*.nav +*.pre +*.snm +*.vrb + +# changes +*.soc + +# comment +*.cut + +# 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 +*.lzo +*.lzs +*.slg +*.slo +*.sls + +# uncomment this for glossaries-extra (will ignore makeindex's style files!) +*.ist + +# gnuplot +*.gnuplot +*.table + +# gnuplottex +*-gnuplottex-* + +# gregoriotex +*.gaux +*.glog +*.gtex + +# htlatex +*.4ct +*.4tc +*.idv +*.lg +*.trc +*.xref + +# hyperref +*.brf + +# knitr +*-concordance.tex +# TODO Uncomment the next line if you use knitr and want to ignore its generated tikz files +# *.tikz +*-tikzDictionary + +# listings +*.lol + +# luatexja-ruby +*.ltjruby + +# makeidx +*.idx +*.ilg +*.ind + +# minitoc +*.maf +*.mlf +*.mlt +*.mtc[0-9]* +*.slf[0-9]* +*.slt[0-9]* +*.stc[0-9]* + +# minted +_minted* +*.pyg + +# morewrites +*.mw + +# newpax +*.newpax + +# nomencl +*.nlg +*.nlo +*.nls + +# pax +*.pax + +# pdfpcnotes +*.pdfpc + +# sagetex +*.sagetex.sage +*.sagetex.py +*.sagetex.scmd + +# scrwfile +*.wrt + +# svg +svg-inkscape/ + +# sympy +*.sout +*.sympy +sympy-plots-for-*.tex/ + +# pdfcomment +*.upa +*.upb + +# pythontex +*.pytxcode +pythontex-files-*/ + +# tcolorbox +*.listing + +# thmtools +*.loe + +# TikZ & PGF +*.dpth +*.md5 +*.auxlock + +# titletoc +*.ptc + +# todonotes +*.tdo + +# vhistory +*.hst +*.ver + +# easy-todo +*.lod + +# xcolor +*.xcp + +# xmpincl +*.xmpi + +# xindy +*.xdy + +# xypic precompiled matrices and outlines +*.xyc +*.xyd + +# endfloat +*.ttt +*.fff + +# Latexian +TSWLatexianTemp* + +## Editors: +# WinEdt +*.bak +*.sav + +# Texpad +.texpadtmp + +# LyX +*.lyx~ + +# Kile +*.backup + +# gummi +.*.swp + +# KBibTeX +*~[0-9]* + +# TeXnicCenter +*.tps + +# auto folder when using emacs and auctex +./auto/* +*.el + +# expex forward references with \gathertags +*-tags.tex + +# standalone packages +*.sta + +# Makeindex log files +*.lpz + +# xwatermark package +*.xwm + +# REVTeX puts footnotes in the bibliography by default, unless the nofootinbib +# option is specified. Footnotes are the stored in a file with suffix Notes.bib. +# Uncomment the next line to have this generated file ignored. +#*Notes.bib + +# Gannt Diagramm als EPS ignorieren +assets/gantt.eps \ No newline at end of file diff --git a/20-implementierungsheft/.gitlab-ci.yml b/20-implementierungsheft/.gitlab-ci.yml new file mode 100644 index 0000000..27d0617 --- /dev/null +++ b/20-implementierungsheft/.gitlab-ci.yml @@ -0,0 +1,36 @@ +plantuml: + stage: .pre + image: + name: plantuml/plantuml + entrypoint: [""] + script: + - java -jar plantuml.jar -tpdf assets/diagrams/*.puml + artifacts: + paths: + - assets + +tex: + stage: build + image: texlive/texlive + script: + - mkdir public + - make tex + - mv *.pdf public + artifacts: + paths: + - public + dependencies: + - plantuml + +pages: + stage: deploy + script: + - echo Hello, World! + artifacts: + paths: + - public + rules: + - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + dependencies: + - tex + diff --git a/20-implementierungsheft/.latexmkrc b/20-implementierungsheft/.latexmkrc new file mode 100644 index 0000000..bec2b38 --- /dev/null +++ b/20-implementierungsheft/.latexmkrc @@ -0,0 +1,7 @@ +# https://tex.stackexchange.com/questions/1226/how-to-make-latexmk-use-makeglossaries +add_cus_dep('glo', 'gls', 0, 'makeglo2gls'); +add_cus_dep('acn', 'acr', 0, 'makeglo2gls'); +sub makeglo2gls { + system("makeglossaries $_[0]"); +} + diff --git a/20-implementierungsheft/Makefile b/20-implementierungsheft/Makefile new file mode 100644 index 0000000..335b123 --- /dev/null +++ b/20-implementierungsheft/Makefile @@ -0,0 +1,18 @@ +MAIN = implementierungsheft +FLAGS = -pdf + +all: clean compile +compile: diagram tex +clean: clean-diagram clean-tex + +dev: + latexmk $(FLAGS) -pvc $(MAIN) +tex: + latexmk $(FLAGS) $(MAIN) +diagram: + java -jar plantuml.jar -tpdf assets/diagrams/*.puml +clean-tex: + latexmk -C +clean-diagram: + find assets/diagrams -type f -not -name '*.puml' -delete + diff --git a/20-implementierungsheft/README.md b/20-implementierungsheft/README.md new file mode 100644 index 0000000..2c08f29 --- /dev/null +++ b/20-implementierungsheft/README.md @@ -0,0 +1,31 @@ +# Entwurfsheft + +> Systemdesign und -spezifikation + +## Diagramme + +Installiere [PlantUML](https://plantuml.com/starting) (oder über einen Paketmanager). + +Arbeiten an Diagrammen mit Echtzeit-Vorschau (Anzeige wird beim Speichern der +puml-Datei aktualisiert): +```sh +java -jar plantuml.jar -gui assets/classdiagram.puml + +# bzw (wenn zu PATH hinzugefügt oder Linux) +plantuml -gui assets/classdiagram.puml +``` + +Bauen der Diagramme: +```sh +java -jar plantuml.jar -teps assets/*.puml + +# bzw (wenn zu PATH hinzugefügt oder Linux) +plantuml -teps assets/*.puml + +# bzw über Makefile (Linux) +make diagram + +# oder zum Erstellen von Diagrammen und LaTeX: +make +``` + diff --git a/20-implementierungsheft/assets/.gitignore b/20-implementierungsheft/assets/.gitignore new file mode 100644 index 0000000..16252a4 --- /dev/null +++ b/20-implementierungsheft/assets/.gitignore @@ -0,0 +1,3 @@ +diagrams/* +!diagrams/*.puml + diff --git a/20-implementierungsheft/assets/KIT_Deckblatt.pdf b/20-implementierungsheft/assets/KIT_Deckblatt.pdf new file mode 100644 index 0000000..7de8ed4 Binary files /dev/null and b/20-implementierungsheft/assets/KIT_Deckblatt.pdf differ diff --git a/20-implementierungsheft/assets/diagrams/backendComponentDiagram.puml b/20-implementierungsheft/assets/diagrams/backendComponentDiagram.puml new file mode 100644 index 0000000..806522c --- /dev/null +++ b/20-implementierungsheft/assets/diagrams/backendComponentDiagram.puml @@ -0,0 +1,61 @@ +@startuml +' skinparam linetype ortho + +'######################################################################### +'SubscriptionsAPI +component SubscriptionsAPI { + + component SubscriptionService + component SubscriptionController + component SubscriptionDataAccessLayer + + portout "Webserver" as wSub + portin "Database" as dSub + } + +dSub --0)- SubscriptionDataAccessLayer +SubscriptionDataAccessLayer --0)- SubscriptionService +SubscriptionService --0)- SubscriptionController +SubscriptionController --0)- wSub + +'######################################################################### + + +'######################################################################### +'EpisodeActionsAPI + +component EpisodeActionsAPI { + component EpisodeActionService + component EpisodeActionController + component EpisodeActionDataAccessLayer + + portout "Webserver" as wEpisode + portin "Database" as dEpisode +} + +dEpisode --0)- EpisodeActionDataAccessLayer +EpisodeActionController --0)- wEpisode +EpisodeActionDataAccessLayer --0)- EpisodeActionService +EpisodeActionService --0)- EpisodeActionController + +'######################################################################### + + +'######################################################################### +'AuthenticationAPI + +component AuthenticationAPI { + component AuthenticationService + component AuthenticationController + component AuthenticationDataAccessLayer + + portout "Webserver" as wAuth + portin "Database" as dAuth +} + +dAuth --0)- AuthenticationDataAccessLayer +AuthenticationController --0)- wAuth +AuthenticationDataAccessLayer --0)- AuthenticationService +AuthenticationService --0)- AuthenticationController + +@enduml diff --git a/20-implementierungsheft/assets/diagrams/class_after.puml b/20-implementierungsheft/assets/diagrams/class_after.puml new file mode 100644 index 0000000..0a8f475 --- /dev/null +++ b/20-implementierungsheft/assets/diagrams/class_after.puml @@ -0,0 +1,574 @@ +@startuml +' skinparam linetype ortho +' skinparam groupInheritance 2 +allowmixing + +package authentication_api <> { + + package controller as auth.controller <> { + + class AuthenticationController <<@RestController>> { + + <> AuthenticationController(AuthenticationService, EMailConfigProperties): + + logout(String, HttpServletResponse): HttpStatus + + registerUser(UserInfoRequest): HttpStatus + + forgotPassword(String): HttpStatus + + getDeviceList(String, HttpServletResponse): ResponseEntity> + + login(String, HttpServletResponse): HttpStatus + + deleteUser(String, PasswordRequest): HttpStatus + + changePassword(String, ChangePasswordRequest): HttpStatus + + verifyRegistration(String, String, HttpServletResponse): HttpStatus + + resetPassword(String, String, PasswordRequest): HttpStatus + } + + entity AuthenticationResponse << record >> { + + <> AuthenticationResponse(String): + + token(): String + } + + entity ChangePasswordRequest << record >> { + + <> ChangePasswordRequest(String, String): + + oldPassword(): String + + newPassword(): String + } + + entity DeviceWrapper << record >> { + + <> DeviceWrapper(): + + <> DeviceWrapper(String, String, String, int): + + id(): String + + caption(): String + + type(): String + + subscriptions(): int + } + + entity ForgotPasswordRequest << record >> { + + <> ForgotPasswordRequest(String): + + email(): String + } + + entity PasswordRequest << record >> { + + <> PasswordRequest(String): + + password(): String + } + + entity UserInfoRequest << record >> { + + <> UserInfoRequest(String, String, String): + + password(): String + + email(): String + + username(): String + } + } + + package data_access as auth.dao <> { + + interface AuthenticationDao <<@Repository>> { + + findByEmail(String): Optional + + deleteAllByEnabledFalseAndCreatedAtLessThan(long): void + + existsByUsername(String): boolean + + findByUsername(String): Optional + } + } + + package service as auth.service <> { + + class AuthenticationService <<@Service>> { + + <> AuthenticationService(AuthenticationDao, PasswordEncoder, JwtService, EMailServiceImpl, EncryptionService, InputCheckService): + + verifyRegistration(String, String): HttpStatus + + logout(String, HttpServletResponse): HttpStatus + + changePassword(String, ChangePasswordRequest): HttpStatus + + registerUser(UserInfoRequest): HttpStatus + + deleteUser(String, PasswordRequest): HttpStatus + + forgotPassword(String): HttpStatus + + resetPassword(String, String, PasswordRequest): HttpStatus + + deleteInvalidUsersOlderThan(long): void + + login(String, HttpServletResponse): HttpStatus + } + + class EMailServiceImpl <<@Service>> { + + <> EMailServiceImpl(JavaMailSender, EMailConfigProperties, JwtService): + - substitutePlaceholders(String, UserDetails, String): String + + sendVerification(String, UserDetails): void + + sendPasswordReset(String, UserDetails): void + - generatePasswordResetURLString(UserDetails): String + - sendMail(String, String, String): void + - generateVerificationURLString(UserDetails): String + } + + class EncryptionService <<@Service>> { + + <> EncryptionService(SecurityConfigProperties): + + saltAndHashEmail(String): String + - getSalt(): byte[] + } + + class InputCheckService <<@Service>> { + + <> InputCheckService(): + + validateEmail(String): boolean + + validateUsername(String): boolean + + validatePassword(String): boolean + } + + class ResourceReader { + + <> ResourceReader(): + + readFileToString(String): String + } + } +} + +package config <> { + + class ApplicationConfig <<@Configuration>> { + + <> ApplicationConfig(AuthenticationDao): + + userDetailsService(): UserDetailsService + + addInterceptors(InterceptorRegistry): void + + authenticationManager(AuthenticationConfiguration): AuthenticationManager + + passwordEncoder(): PasswordEncoder + + corsConfigurer(): WebMvcConfigurer + + authenticationProvider(): AuthenticationProvider + } + + class AuthenticationValidatorInterceptor { + + <> AuthenticationValidatorInterceptor(): + - extractUsernamePathVariable(HttpServletRequest): String? + + preHandle(HttpServletRequest, HttpServletResponse, Object): boolean + } + + entity EMailConfigProperties << record >> { + + <> EMailConfigProperties(String, String, String): + + resetUrlPath(): String + + verificationUrl(): String + + dashboardBaseUrl(): String + } + + class JwtAuthenticationFilter <<@Component>> { + + <> JwtAuthenticationFilter(JwtService, UserDetailsService): + # doFilterInternal(HttpServletRequest, HttpServletResponse, FilterChain): void + - authenticateIfValid(Cookie, HttpServletRequest): void + } + + class JwtService <<@Service>> { + + <> JwtService(SecurityConfigProperties): + + generateUrlTokenString(UserDetails): String + + isTokenValid(String, UserDetails): boolean + + generateAccessTokenString(UserDetails): String + + extractUsername(String): String + + extractClaim(String, Function): T + - isTokenExpired(String): boolean + + generateTokenString(Map, UserDetails, long): String + - extractExpiration(String): Date + - extractAllClaims(String): Claims + - getSigningKey(): Key + } + + class SecurityConfig <<@Configuration>> { + + <> SecurityConfig(JwtAuthenticationFilter, AuthenticationProvider): + ~ corsConfigurationSource(): CorsConfigurationSource + + securityFilterChain(HttpSecurity): SecurityFilterChain + } + + entity SecurityConfigProperties << record >> { + + <> SecurityConfigProperties(String, String): + + jwtSigningKey(): String + + emailSigningKey(): String + } +} + +package episode_actions_api <> { + + package controller as episode.controller <> { + + class EpisodeActionController <<@RestController>> { + + <> EpisodeActionController(EpisodeActionService): + + addEpisodeActions(String, List): ResponseEntity + + getEpisodeActionsOfPodcast(String, String): ResponseEntity + + getEpisodeActions(String): ResponseEntity + + getEpisodeActionsSince(String, long): ResponseEntity + + getEpisodeActionsOfPodcastSince(String, String, long): ResponseEntity + } + + class EpisodeActionGetResponse { + + <> EpisodeActionGetResponse(List): + + getTimestamp(): long + + getActions(): List + } + + class EpisodeActionPost { + + <> EpisodeActionPost(): + + <> EpisodeActionPost(String, String, String, String, int, EpisodeAction): + + equals(Object): boolean + + hashCode(): int + + builder(): EpisodeActionPostBuilder + + getPodcastURL(): String + + getEpisodeURL(): String + + getTitle(): String + + getGuid(): String + + setGuid(String): void + + setEpisodeAction(EpisodeAction): void + + setTotal(int): void + + getTotal(): int + + setTitle(String): void + # canEqual(Object): boolean + + getEpisodeAction(): EpisodeAction + + toString(): String + + setPodcastURL(String): void + + setEpisodeURL(String): void + } + } + + package data_access as episode.dao <> { + + interface EpisodeActionDao <<@Repository>> { + + findByUserUsernameAndEpisodeSubscriptionUrl(String, String): List + + delete(EpisodeAction): void + + findByUserUsernameAndTimestampGreaterThanEqual(String, LocalDateTime): List + + findByUserUsername(String): List + + findByUserAndEpisodeUrlAndAction(User, String, Action): Optional + + findByUserUsernameAndTimestampGreaterThanEqualAndEpisodeSubscriptionUrl(String, LocalDateTime, String): List + + deleteByUserUsernameAndEpisodeSubscriptionUrl(String, String): void + + existsByUserAndEpisodeUrlAndAction(User, String, Action): boolean + } + + interface EpisodeDao <<@Repository>> { + + existsByGuid(String): boolean + + findByUrl(String): Optional + + existsByUrl(String): boolean + + findByGuid(String): Optional + } + } + + package service as episode.service <> { + + class EpisodeActionService <<@Service>> { + + <> EpisodeActionService(EpisodeActionDao, EpisodeDao, AuthenticationDao, SubscriptionDao, SubscriptionActionDao, RSSParser): + - episodeActionPostsToEpisodeActions(User, List): List + - createEpisode(EpisodeActionPost): Episode + + getEpisodeActionsOfPodcastSince(String, String, long): List + - getEpisodeFromDatabase(EpisodeActionPost): Episode + - addEpisodeActionsToDatabase(User, List): void + - addNewestEpisodeActionToDatabase(User, EpisodeAction): void + - episodeActionsToEpisodeActionPosts(List): List + - addEpisodeActionToDatabase(User, EpisodeAction): void + + getEpisodeActionsSince(String, long): List + - episodeActionPostToEpisodeAction(User, EpisodeActionPost): EpisodeAction + + getEpisodeActions(String): List + + getEpisodeActionsOfPodcast(String, String): List + + addEpisodeActions(String, List): void + } + } +} + +package model <> { + + enum Action << enumeration >> { + + <> Action(): + + valueOf(String): Action + + getJsonProperty(): String + + values(): Action[] + } + + class Episode <<@Entity>> { + + <> Episode(): + + <> Episode(Long, String, String, String, int, Subscription, List): + + getId(): Long + # canEqual(Object): boolean + + getGuid(): String + + setTitle(String): void + + builder(): EpisodeBuilder + + setTotal(int): void + + setGuid(String): void + + equals(Object): boolean + + setSubscription(Subscription): void + + getUrl(): String + + getTitle(): String + + toString(): String + + getTotal(): int + + setUrl(String): void + + setEpisodeActions(List): void + + getSubscription(): Subscription + + getEpisodeActions(): List + + setId(Long): void + + hashCode(): int + } + + class EpisodeAction <<@Entity>> { + + <> EpisodeAction(Long, User, Episode, LocalDateTime, Action, int, int): + + <> EpisodeAction(): + + getEpisode(): Episode + + setEpisode(Episode): void + + setPosition(int): void + # canEqual(Object): boolean + + setUser(User): void + + setStarted(int): void + + getId(): Long + + getUser(): User + + getTimestamp(): LocalDateTime + + getAction(): Action + + getStarted(): int + + hashCode(): int + + setTimestamp(LocalDateTime): void + + equals(Object): boolean + + getPosition(): int + + builder(): EpisodeActionBuilder + + setId(Long): void + + setAction(Action): void + + toString(): String + + toEpisodeActionPost(): EpisodeActionPost + } + + enum Role << enumeration >> { + + <> Role(): + + valueOf(String): Role + + toString(): String + + values(): Role[] + } + + class Subscription <<@Entity>> { + + <> Subscription(): + + <> Subscription(Long, String, String, long, List, List): + + setId(Long): void + + getId(): Long + + equals(Object): boolean + + getUrl(): String + + hashCode(): int + + builder(): SubscriptionBuilder + # canEqual(Object): boolean + + toString(): String + + getTitle(): String + + getTimestamp(): long + + setEpisodes(List): void + + getSubscriptionActions(): List + + getEpisodes(): List + + setSubscriptionActions(List): void + + setUrl(String): void + + setTitle(String): void + + setTimestamp(long): void + + addEpisode(Episode): void + } + + class SubscriptionAction <<@Entity>> { + + <> SubscriptionAction(): + + <> SubscriptionAction(int, User, long, Subscription, boolean): + + equals(Object): boolean + + getId(): int + + getUser(): User + + getTimestamp(): long + + getSubscription(): Subscription + + isAdded(): boolean + # canEqual(Object): boolean + + setId(int): void + + hashCode(): int + + setUser(User): void + + toString(): String + + builder(): SubscriptionActionBuilder + + setTimestamp(long): void + + setSubscription(Subscription): void + + setAdded(boolean): void + } + + class User <<@Entity>> { + + <> User(Long, String, String, String, boolean, long, Role, List, List): + + <> User(): + + getId(): Long + + setCreatedAt(long): void + + getUsername(): String + + builder(): UserBuilder + + toString(): String + + getEmail(): String + + setPassword(String): void + + setSubscriptionActions(List): void + + equals(Object): boolean + + getPassword(): String + + setEmail(String): void + + setRole(Role): void + + isEnabled(): boolean + + setUsername(String): void + + getCreatedAt(): long + + getRole(): Role + + getSubscriptionActions(): List + # canEqual(Object): boolean + + hashCode(): int + + setEnabled(boolean): void + + setEpisodeActions(List): void + + getEpisodeActions(): List + + setId(Long): void + + getAuthorities(): Collection + + isCredentialsNonExpired(): boolean + + isAccountNonLocked(): boolean + + isAccountNonExpired(): boolean + } +} + +package subscriptions_api <> { + + package controller as subscription.controller <> { + + class SubscriptionController <<@RestController>> { + + <> SubscriptionController(SubscriptionService): + + applySubscriptionDelta(String, String, SubscriptionDelta): ResponseEntity + + getSubscriptions(String, String, String): ResponseEntity> + + getSubscriptionDelta(String, String, long): ResponseEntity + + getTitles(String): ResponseEntity> + + uploadSubscriptions(String, String, List): ResponseEntity + } + + class SubscriptionDelta { + + <> SubscriptionDelta(List, List): + + getTimestamp(): long + + getRemove(): List + + getAdd(): List + } + + entity SubscriptionTitles << record >> { + + <> SubscriptionTitles(Subscription, List): + + episodes(): List + + subscription(): Subscription + } + } + + package data_access as subscription.dao <> { + + interface SubscriptionActionDao <<@Repository>> { + + findByUserUsernameAndAddedTrue(String): List + + existsByUserAndSubscription(User, Subscription): boolean + + findByUserAndSubscription(User, Subscription): Optional + + findByUserUsernameAndTimestampGreaterThanEqual(String, long): List + + findByUserUsernameAndAddedTrueAndTimestampGreaterThanEqual(String, long): List + } + + interface SubscriptionDao <<@Repository>> { + + findByUrl(String): Optional + + existsByUrl(String): boolean + } + } + + package service as subscription.service <> { + + class SubscriptionService <<@Service>> { + + <> SubscriptionService(RSSParser, AuthenticationDao, SubscriptionDao, SubscriptionActionDao, EpisodeActionDao, EpisodeActionService): + + getTitles(String): List + + getSubscriptions(String): List + + applySubscriptionDelta(String, SubscriptionDelta): int + + getSubscriptionDelta(String, long): SubscriptionDelta + + uploadSubscriptions(String, List): int + } + } +} + +package util <> { + + class RSSParser <<@Component>> { + + <> RSSParser(EpisodeDao, SubscriptionDao): + + validate(Subscription): void + - parseTimeToSeconds(String): int + - parseEpisode(SyndEntry, Subscription): Episode + - saveEpisodes(List): void + - fetchSubscriptionFeed(Subscription): Map? + - saveSubscription(Subscription): void + - deleteSubscription(Subscription): void + - getFetchedEpisodeForURL(String, Map): Episode + - deleteEpisodes(List): void + } + + class Scheduler <<@Component>> { + + <> Scheduler(): + + clean(): void + } + + class UpdateURLsWrapper { + + <> UpdateURLsWrapper(): + + getTimestamp(): long + + getUpdateURLs(): List> + } +} + +class ServerApplication <<@SpringBootApplication>> { + + <> ServerApplication(): + + main(String[]): void +} + +database Datenbank +Datenbank <-[hidden]d- subscriptions_api +Datenbank <-[hidden]d- episode_actions_api +Datenbank <-[hidden]d- authentication_api +() SQL as SQLSub +() SQL as SQLAuth +() SQL as SQLEpisode + +Datenbank -- SQLSub +Datenbank -- SQLAuth +Datenbank -- SQLEpisode + +SubscriptionController ..o ServerApplication +AuthenticationController ..o ServerApplication +EpisodeActionController ..o ServerApplication + +ServerApplication --() HTTP + +SQLSub )-- SubscriptionActionDao: JPA +SQLSub )-- SubscriptionDao: JPA +SQLAuth )-- AuthenticationDao: JPA +SQLEpisode )-- EpisodeActionDao: JPA +SQLEpisode )-- EpisodeDao: JPA + +model .o Datenbank: ORM (User, SubscriptionAction, Subscription, EpisodeAction, Episode) +' Datenbank o.. Subscription: ORM +' Datenbank o.. SubscriptionAction: ORM +' Datenbank o.. Episode: ORM +' Datenbank o.. EpisodeAction: ORM +' Datenbank o.. User: ORM + +ApplicationConfig "1" *-[#595959,plain]-> "authenticationDao\n1" AuthenticationDao +ApplicationConfig -[#595959,dashed]-> AuthenticationValidatorInterceptor : "«create»" +AuthenticationController "1" *-[#595959,plain]-> "authenticationService\n1" AuthenticationService +AuthenticationController -[#595959,dashed]-> DeviceWrapper : "«create»" +AuthenticationController "1" *-[#595959,plain]-> "eMailConfigProperties\n1" EMailConfigProperties +AuthenticationService "1" *-[#595959,plain]-> "authenticationDao\n1" AuthenticationDao +AuthenticationService "1" *-[#595959,plain]-> "eMailService\n1" EMailServiceImpl +AuthenticationService "1" *-[#595959,plain]-> "encryptionService\n1" EncryptionService +AuthenticationService "1" *-[#595959,plain]-> "inputCheckService\n1" InputCheckService +AuthenticationService "1" *-[#595959,plain]-> "jwtService\n1" JwtService +AuthenticationService "1" *-[#595959,plain]-> "DEFAULT_USER\n1" Role +EMailServiceImpl "1" *-[#595959,plain]-> "eMailConfigProperties\n1" EMailConfigProperties +EMailServiceImpl "1" *-[#595959,plain]-> "jwtService\n1" JwtService +EncryptionService "1" *-[#595959,plain]-> "securityConfigProperties\n1" SecurityConfigProperties +Episode "1" *-[#595959,plain]-> "episodeActions\n*" EpisodeAction +Episode "1" *-[#595959,plain]-> "subscription\n1" Subscription +EpisodeAction "1" *-[#595959,plain]-> "action\n1" Action +EpisodeAction "1" *-[#595959,plain]-> "episode\n1" Episode +EpisodeAction -[#595959,dashed]-> EpisodeActionPost : "«create»" +EpisodeAction "1" *-[#595959,plain]-> "user\n1" User +EpisodeActionController -[#595959,dashed]-> EpisodeActionGetResponse : "«create»" +EpisodeActionController "1" *-[#595959,plain]-> "episodeActionService\n1" EpisodeActionService +EpisodeActionController -[#595959,dashed]-> UpdateURLsWrapper : "«create»" +EpisodeActionGetResponse "1" *-[#595959,plain]-> "actions\n*" EpisodeActionPost +EpisodeActionPost "1" *-[#595959,plain]-> "episodeAction\n1" EpisodeAction +EpisodeActionService "1" *-[#595959,plain]-> "authenticationDao\n1" AuthenticationDao +EpisodeActionService "1" *-[#595959,plain]-> "episodeActionDao\n1" EpisodeActionDao +EpisodeActionService "1" *-[#595959,plain]-> "episodeDao\n1" EpisodeDao +EpisodeActionService "1" *-[#595959,plain]-> "rssParser\n1" RSSParser +EpisodeActionService -[#595959,dashed]-> Subscription : "«create»" +EpisodeActionService "1" *-[#595959,plain]-> "subscriptionActionDao\n1" SubscriptionActionDao +EpisodeActionService "1" *-[#595959,plain]-> "subscriptionDao\n1" SubscriptionDao +JwtAuthenticationFilter "1" *-[#595959,plain]-> "jwtService\n1" JwtService +JwtService "1" *-[#595959,plain]-> "securityConfigProperties\n1" SecurityConfigProperties +RSSParser "1" *-[#595959,plain]-> "episodeDao\n1" EpisodeDao +RSSParser "1" *-[#595959,plain]-> "subscriptionDao\n1" SubscriptionDao +Scheduler "1" *-[#595959,plain]-> "authenticationService\n1" AuthenticationService +SecurityConfig "1" *-[#595959,plain]-> "jwtAuthFilter\n1" JwtAuthenticationFilter +Subscription "1" *-[#595959,plain]-> "episodes\n*" Episode +Subscription "1" *-[#595959,plain]-> "subscriptionActions\n*" SubscriptionAction +SubscriptionAction "1" *-[#595959,plain]-> "subscription\n1" Subscription +SubscriptionAction "1" *-[#595959,plain]-> "user\n1" User +SubscriptionController "1" *-[#595959,plain]-> "subscriptionService\n1" SubscriptionService +SubscriptionController -[#595959,dashed]-> UpdateURLsWrapper : "«create»" +SubscriptionService "1" *-[#595959,plain]-> "authenticationDao\n1" AuthenticationDao +SubscriptionService "1" *-[#595959,plain]-> "episodeActionDao\n1" EpisodeActionDao +SubscriptionService "1" *-[#595959,plain]-> "episodeActionService\n1" EpisodeActionService +SubscriptionService "1" *-[#595959,plain]-> "rssParser\n1" RSSParser +SubscriptionService "1" *-[#595959,plain]-> "subscriptionActionDao\n1" SubscriptionActionDao +SubscriptionService "1" *-[#595959,plain]-> "subscriptionDao\n1" SubscriptionDao +SubscriptionService -[#595959,dashed]-> SubscriptionDelta : "«create»" +SubscriptionService -[#595959,dashed]-> SubscriptionTitles : "«create»" +SubscriptionTitles "1" *-[#595959,plain]-> "subscription\n1" Subscription +User "1" *-[#595959,plain]-> "episodeActions\n*" EpisodeAction +User "1" *-[#595959,plain]-> "role\n1" Role +User "1" *-[#595959,plain]-> "subscriptionActions\n*" SubscriptionAction +@enduml diff --git a/20-implementierungsheft/assets/diagrams/classdiagram.puml b/20-implementierungsheft/assets/diagrams/classdiagram.puml new file mode 100644 index 0000000..4b1970a --- /dev/null +++ b/20-implementierungsheft/assets/diagrams/classdiagram.puml @@ -0,0 +1,463 @@ +@startuml +' skinparam linetype ortho +' skinparam groupInheritance 2 +allowmixing + +package subscriptionsAPI <> { + package subscriptionDataAccessLayer <> { + class SubscriptionDataAccessService <<@Repository>> { + <> SubscriptionDataAccessService(JpaTemplate jpaTemplate) + int uploadSubscriptions(String username, List subscriptions) + List getSubscriptions(String username) + List getSubscriptionsSince(String username, LocalDateTime time) + int addSubscriptions(String username, List addedSubscriptions) + int removeSubscriptions(String username, List removedSubscriptions) + List getTitles(String username) + } + + interface SubscriptionDao { + int uploadSubscriptions(String username, List subscriptions) + List getSubscriptions(String username) + List getSubscriptionsSince(String username, LocalDateTime time) + int addSubscriptions(String username, List addedSubscriptions) + int removeSubscriptions(String username, List removedSubscriptions) + List getTitles(String username) + } + } + + package subscriptionService <> { + class SubscriptionService <<@Service>> { + <> SubscriptionService(SubscriptionDao subscriptionDao) + int uploadSubscriptions(String username, List subscriptions) + List getSubscriptions(String username) + List getSubscriptionsSince(String username, LocalDateTime time) + int addSubscriptions(String username, List addedSubscriptions) + int removeSubscriptions(String username, List removedSubscriptions) + List getTitles(String username) + } + } + + package subscriptionController <> { + class SubscriptionController <<@Controller>>{ + ' @Autowired + <> SubscriptionController(SubscriptionService subscriptionService) + ' @GetMapping + ResponseEntity> getSubscriptions(String username, String deviceID, String functionJSONP) + ' @PutMapping + ResponseEntity uploadSubscriptions(String username, String deviceID, List subscriptions) + ' @PostMapping + ResponseEntity applySubscriptionDelta(String username, String deviceID, SubscriptionDelta delta) + ' @GetMapping + ResponseEntity getSubscriptionDelta(String username, String deviceID, long since) + ResponseEntity> getTitles(String username, String deviceID) + } + + class SubscriptionTitles { + <> SubscriptionTitles(Subscription subscription, List episodeTitles) + Subscription getSubscription() + List getEpisodesTitles() + } + + class SubscriptionDelta { + <> SubscriptionDelta(List add, List remove) + List getRemove() + LocalDate getTimestamp() + List> getUpdate_urls() + } + } + +} + +package episodeActionsAPI <> { + package episodeActionDataAccessLayer <> { + class EpisodeActionDataAccessService <<@Repository>> { + <> EpisodeActionDataAccessService (JpaTemplate jpaTemplate) + long addEpisodeActions(String username, List episodeActionPosts) + List getEpisodeActions(String username) + List getEpisodeActionsOfPodcast(String username, String podcastURL) + List getEpisodeActionsSince(String username, LocalDateTime since) + List getEpisodeActionsOfPodcastSince(String username, String podcastURL, LocalDateTime since) + } + + interface EpisodeActionDao { + long addEpisodeActions(String username, List episodeActionPosts) + List getEpisodeActions(String username) + List getEpisodeActionsOfPodcast(String username, String podcastURL) + List getEpisodeActionsSince(String username, LocalDateTime since) + List getEpisodeActionsOfPodcastSince(String username, String podcastURL, LocalDateTime since) + } + } + + package episodeActionService <> { + class EpisodeActionService <<@Service>> { + <> EpisodeActionService (EpisodeActionDao episodeActionDao) + LocalDateTime addEpisodeActions(String username, List episodeActionPosts) + List getEpisodeActions(String username) + List getEpisodeActionsOfPodcast(String username, String podcastURL) + List getEpisodeActionsSince(String username, LocalDateTime since) + List getEpisodeActionsOfPodcastSince(String username, String podcastURL, LocalDateTime since) + } + } + + package episodeActionController <> { + class EpisodeActionController <<@Controller>>{ + <> EpisodeActionController (EpisodeActionService episodeActionService) + ResponseEntity addEpisodeActions(String username, EpisodeActionPostRequest episodeActionPostRequest) + ResponseEntity getEpisodeActions(String username, String deviceID, boolean aggregated) + ResponseEntity getEpisodeActionsOfPodcast(String username, String podcastURL, String deviceID, boolean aggregated) + ResponseEntity getEpisodeActionsSince(String username, String deviceID, long since, boolean aggregated) + ResponseEntity getEpisodeActionsOfPodcastSince(String username, String podcastURL, String deviceID, long since, boolean aggregated) + } + + class EpisodeActionPostResponse { + <> EpisodeActionPostResponse(List> updateURLs) + long getTimestamp() + List> getUpdatedURLs() + } + + class EpisodeActionPost { + <> EpisodeActionPost(String podcastURL, String episodeURL, Action action, LocalDateTime timestamp, int started, int position) + String getPodcastURL() + String getEpisodeURL() + int getGUID() + Action getAction() + LocalDateTime getTimestamp() + int getStarted() + int getPosition() + EpisodeAction getEpisodeAction() + } + + class EpisodeActionPostRequest { + <> EpisodeActionPostRequest(List episodeActionPosts) + List getEpisodeActionPosts() + } + + class EpisodeActionGetResponse { + <> EpisodeActionGetResponse(List episodeActionPosts) + List getEpisodeActionPosts() + long getTimestamp() + } + } +} + +package authenticationAPI <> { + package authenticationDataAccessLayer <> { + ' interface AuthenticationDao { + ' String login(String username) + ' int logout(String username) + ' } + + ' class AuthenticationDataAccessService <<@Respository>> { + ' <> AuthenticationDataAccessService(JpaTemplate jpaTemplate) + ' String login(String username) + ' int logout(String username) + ' } + + interface UserDetailsManager { + void createUser(UserDetails userDetails) + void changePassword(String oldPassword, String newPassword) + void deleteUser(String username) + void updateUser(UserDetails user) + boolean userExists(String username) + } + note left + Aus org.springframework.security.provisioning + - liefert Methoden zum Erstellen neuer User + und zum Aktualisieren bestehender. + end note + + class JdbcUserDetailsManager <<@Repository>> { + <> JdbcUserDetailsManager(DataSource dataSource) + void createUser(UserDetails user) + void changePassword(String oldPassword, String newPassword) + void deleteUser(String username) + void updateUser(UserDetails user) + boolean userExists(String username) + } + note right + User Management Service aus dem Paket + org.springframework.security.provisioning + der CRUD Operationen für User bereitstellt. + Hier sind nur die relevanten Methoden modelliert. + end note + } + + package authenticationService <> { + class AuthenticationService <<@Service>> { + -- + <> AuthenticationService(UserDetailsManager userDetailsManager) + List verifyLogin(String username) + int logout(String username) + int forgotPassword(ForgotPasswordRequest forgotPasswordRequest) + .. via JdbcUserDetailsManager .. + int resetPassword(String username, RequestWithPassword requestWithPassword) + int registerUser(UserDetails user) + int changePassword(String username, ChangePasswordRequest changePasswordRequest) + int deleteUser(String username, RequestWithPassword requestWithPassword) + } + + class JavaMailSenderImpl {} + note left + Aus org.springframework.mail.javamail. + Implementierung des JavaMailSender Interfaces, + welches das MailSender Interface durch Unterstützung + von MIME Nachrichten erweitert. + Das MailSender Interface definiert dabei eine + Strategie zum Versenden einfacher Mails. + Unterstützt sowohl JavaMail MimeMessages und + Spring SimpleMailMessages. + end note + } + + package authenticationController <> { + class AuthenticationController <<@Controller>> { + <> AuthenticationController(AuthenticationService authenticationService) + ResponseEntity> verifyLogin(String username) + ResponseEntity logout(String username) + ResponseEntity forgotPassword(ForgotPasswordRequest forgotPasswordRequest) + ResponseEntity resetPassword(String username, RequestWithPassword requestWithPassword) + ResponseEntity registerUser(UserDetails user) + ResponseEntity changePassword(String username, ChangePasswordRequest changePasswordRequest) + ResponseEntity deleteUser(String username, RequestWithPassword requestWithPassword) + } + + class ChangePasswordRequest { + <> ChangePasswordRequest(String oldPassword, String newPassword) + String getOldPassword() + String getNewPassword() + } + + class ForgotPasswordRequest { + <> ForgotPasswordRequest(String email) + String getEmail() + } + + class RequestWithPassword { + <> ResetPasswordRequest(String password) + String getPassword() + } + } +} + +package model <> { + class Subscription { + <> Subscription(String url, String title) + int getID() + String getURL() + long getLastActionTimestamp() + String getTitle() + } + + class SubscriptionAction { + <> SubscriptionAction(int userID, int subscriptionID) + int getID() + int getUserID() + int getSubscriptionID() + long getTimestamp() + boolean getAdded() + } + + class Episode { + <> Episode(int subscriptionID, int id, String url, String title, String thumbnailURL, int total) + int getSubscriptionID() + int getID() + int getGUID() + String getURL() + String getTitle() + int getTotal() + } + + enum Action { + Download + Play + Delete + New + Flattr + String getJsonProperty() + } + + class EpisodeAction { + <> EpisodeAction(Action action, LocalDateTime timestamp, int started, int position) + int getEpisodeID() + Action getAction() + long getTimestamp() + int getStarted() + int getPosition() + void setEpisodeID() + EpisodeActionPost getEpisodeActionPost(String podcastURL, String episodeURL) + } + + interface UserDetails { + String getUsername() + String getPassword() + Collection getAuthorities() + boolean isAccountExpired() + boolean isAccountLocked() + boolean isCredentialsNonExpired() + boolean isEnabled() + } + note left + Aus org.springframework.security.core.userdetails. + Wird für die Schnittstelle UserDetailsManager benötigt. + Stellt wichtige Informationen eines Users bereit. + Diese werden nur indirekt von Spring Security + benutzt, indem sie vorher in Authentication Objekten + gekapselt werden. + end note + + class User { + -- + <> User(String username, String password) + int getID() + String getSessionToken() + boolean getEmailIsValidated() + .. interface methods .. + String getUsername() + String getPassword() + Collection getAuthorities() + boolean isAccountExpired() + boolean isAccountLocked() + boolean isCredentialsNonExpired() + boolean isEnabled() + } + + interface GrantedAuthority { + String getAuthority() + } + note right + Aus org.springframework.security.core. + Wird für die Schnittstelle UserDetails benötigt. + Repräsentiert eine Autorisierung, die einem + Authentication Objekt gewährt wird. + end note + + class Authority { + <> Authority() + String getAuthority() + } +} + +package util <> { + class RSSParser { + <> RSSParser(String subscriptionURL) + String getSubscriptionTitle() + List getEpisodes() + Episode getEpisodeForURL(String episodeURL) + } + note bottom + Verwendet intern Spring um + HTTP-Anfragen zu erstellen. + end note + + class CleanCronJob { + <> CleanCronJob(JdbcUserDetailsManager jdbcUserDetailsManager) + void cleanInvalidUsers() + } + note bottom + Hintergrundservice, der in periodischen Abständen + Nutzer, die ihre E-Mail-Adresse nicht nach 24 Stunden + bestätigt haben, wieder aus der Datenbank löscht. + (Auf die Assoziation zu JdbcUserDetailsManager wird + im Sinne der Übersichtlichkeit verzichtet.) + end note + + class ResponseEntity { + <> ResponseEntity(T body, HttpStatusCode status) + T getBody() + HttpStatusCode getStatusCode() + } + note bottom + Aus org.springframework.http. + Erweitert die Klasse HttpEntity, welche + ein HTTP Anfrage- oder Antwort-Objekt + repräsentiert, durch einen HttpStatusCode. + Wird von den Controller-Methoden als + Rückgabewert verwendet. + end note +} + +class SecurityConfigurationBasicAuth { + <> SecurityConfigurationBasicAuth() + PasswordEncoder encoder() + UserDetailsManager userDetailsService() + SecuryFilterChain fiterChain(HTTPSecurity http) throws Excpetion +} +note top + Erstellt einen Servlet Filter (springSecurityFilterChain) + der für die gesamte Sicherheit zuständig ist (Schutz der URLs, + Validierung von Anmeldedaten, Weiterleitung zur Anmeldung, etc.). +end note + +class PSEApplication { + <> PSEApplication() + void main(String[] args) +} + +database Datenbank +Datenbank <-[hidden]d- subscriptionsAPI +Datenbank <-[hidden]d- episodeActionsAPI +Datenbank <-[hidden]d- authenticationAPI +() SQL as SQLSub +() SQL as SQLAuth +() SQL as SQLEpisode + +Datenbank -- SQLSub +Datenbank -- SQLAuth +Datenbank -- SQLEpisode + +SubscriptionController ..o PSEApplication +AuthenticationController ..o PSEApplication +EpisodeActionController ..o PSEApplication +SecurityConfigurationBasicAuth ..o PSEApplication + +PSEApplication --() HTTP + +SQLSub )-- SubscriptionDataAccessService: JPA +' SQLAuth )-- AuthenticationDataAccessService: JPA +SQLAuth )-- JdbcUserDetailsManager: JDBC +SQLEpisode )-- EpisodeActionDataAccessService: JPA + +Subscription <. SubscriptionAction: ID +' Subscription <.. SubscriptionDataAccessService: DB +' SubscriptionAction <.. SubscriptionDataAccessService: DB +SubscriptionService --o SubscriptionController +SubscriptionDao <.. SubscriptionService: <> +Subscription --o SubscriptionTitles +EpisodeActionPost -o SubscriptionTitles +SubscriptionDao <|. SubscriptionDataAccessService: <> + +' User <.. AuthenticationDataAccessService: DB +' User <.. JdbcUserDetailsManager: DB +UserDetailsManager <.. AuthenticationService: <> +' AuthenticationDao <.. AuthenticationService: <> +AuthenticationService --o AuthenticationController +' AuthenticationDao <|. AuthenticationDataAccessService: <> +UserDetailsManager <|. JdbcUserDetailsManager: <> +UserDetailsManager <.. SecurityConfigurationBasicAuth: <> +UserDetails <|.. User: <> +User -> Authority +GrantedAuthority <|.. Authority: <> +JavaMailSenderImpl <. AuthenticationService: <> + +Action <-- EpisodeAction +EpisodeActionPost -o EpisodeActionGetResponse +EpisodeActionPost -o EpisodeActionPostRequest +EpisodeAction .> Episode: ID +' EpisodeAction <.. EpisodeActionDataAccessService: DB +' Episode <.. EpisodeActionDataAccessService: DB +EpisodeActionDao <.. EpisodeActionService: <> +EpisodeActionService --o EpisodeActionController +EpisodeActionDao <|. EpisodeActionDataAccessService: <> + +RSSParser <. SubscriptionDataAccessService: <> +RSSParser <. EpisodeActionDataAccessService: <> +' JdbcUserDetailsManager <-- CleanCronJob + +model .o Datenbank: ORM (User, SubscriptionAction, Subscription, EpisodeAction, Episode) +' Datenbank o.. Subscription: ORM +' Datenbank o.. SubscriptionAction: ORM +' Datenbank o.. Episode: ORM +' Datenbank o.. EpisodeAction: ORM +' Datenbank o.. User: ORM + +@enduml diff --git a/20-implementierungsheft/assets/diagrams/componentdiagram.puml b/20-implementierungsheft/assets/diagrams/componentdiagram.puml new file mode 100644 index 0000000..7e23754 --- /dev/null +++ b/20-implementierungsheft/assets/diagrams/componentdiagram.puml @@ -0,0 +1,79 @@ +@startuml + +[App] as app +[VueRouter] as router + +[EpisodesViewComponent] as episodes_view +[ForgotPasswordViewComponent] as forgot_password_view +[LoginViewComponent] as login_view +[RegistrationViewComponent] as registration_view +[ResetPasswordViewComponent] as reset_password_view +[settingsViewComponent] as settings_view +[SubscriptionsViewComponent] as subscriptions_view + +[DashboardLayoutComponent] as dashboard_layout +[EpisodeComponent] as episode +[ErrorLogComponent] as error_log +[FloatingLabelInputComponent] as floating_label_input +[FormLayoutComponent] as form_layout +[HelpComponent] as help +[LastUpdateComponent] as last_update +[LoadingComponent] as loading +[NavbarComponent] as navbar +[PasswordInputComponent] as password_input +[PasswordValidatorComponent] as password_validator +[ProgressTimeComponent] as progress_time +[SubscriptionComponent] as subscription + +app --> router +app --> navbar +app --> help +app --> error_log + +password_validator --> password_input +password_input --> floating_label_input + +router --> registration_view +router --> login_view +router --> reset_password_view +router --> forgot_password_view +router --> episodes_view +router --> subscriptions_view +router --> settings_view + + +login_view --> form_layout +login_view --> floating_label_input +login_view --> password_input + +forgot_password_view --> form_layout +forgot_password_view --> floating_label_input + +registration_view --> form_layout +registration_view --> password_validator +registration_view --> floating_label_input + +reset_password_view --> form_layout +reset_password_view --> password_validator + +settings_view --> dashboard_layout +settings_view --> floating_label_input +settings_view --> password_input +settings_view --> password_validator + +episodes_view --> dashboard_layout +episodes_view --> episode +episodes_view --> loading + +episode --> last_update +episode --> progress_time + +subscriptions_view --> dashboard_layout +subscriptions_view --> floating_label_input +subscriptions_view --> loading +subscriptions_view --> subscription + +subscription --> last_update +subscription --> progress_time + +@enduml diff --git a/20-implementierungsheft/assets/diagrams/db.puml b/20-implementierungsheft/assets/diagrams/db.puml new file mode 100644 index 0000000..bdefaea --- /dev/null +++ b/20-implementierungsheft/assets/diagrams/db.puml @@ -0,0 +1,78 @@ +@startuml +' Type Symbol +' Zero or One |o-- +' Exactly One ||-- +' Zero or Many }o-- +' One or Many }|-- + +skinparam linetype ortho + +entity User { + * int id <> + * String email + * String password + * boolean verified + * long created_at +} + +entity SubscriptionAction { + * int id <> + * int user_id + * long timestamp + * int subscription_id + * boolean added +} + +entity Subscription { + * int id <> + * String url + * long timestamp + * String title +} + +entity Episode { + * int id <> + * int guid <> + * String url + * String title + * int total + * int subscription_id +} +note right + Wenn der Client eine GUID aus dem Feed mitsendet, wird + diese statt der URL verwendet um die Episode zu finden. + So wird die Episode auch noch gefunden, nachdem sich + die URL geändert hat. +end note +note bottom of Episode + Wenn für die Episoden-URL einer EpisodeAction noch keine Episode in der Datenbank steht, + dann schreibe dafür ein Dummy-Objekt in Datenbank und lade asynchron die Episoden der Subscription. + Ersetze dann die Dummy-Objekte durch die Episoden und setze den Timestamp der Subscription auf + die aktuelle Zeit. + Um DoS-Angriffe auf den Backend-Server abzuwenden, können die Episoden einer Subscription erst + nach einer Stunde erneut gefetched werden. Bis dahin werden für EpisodeActions, die sich auf noch + nicht geladene Episoden beziehen, nur Dummy-Objekte für die Episoden in die Datenbank geschrieben. + Es sei noch darauf hingewiesen, dass diese Dummy-Episoden bei Anfragen nicht mit ausgegeben werden. +end note + +entity EpisodeAction { + * int id <> + * int user_id + * int episode_id + * long timestamp + * int action + * int started + * int position +} +note right + Speichere für jede Episode + nur letzte Play-Action. +endnote + +User ||--o{ EpisodeAction +User ||--o{ SubscriptionAction +SubscriptionAction }|--|| Subscription +EpisodeAction }|--|| Episode +Subscription ||-right-|{ Episode + +@enduml diff --git a/20-implementierungsheft/assets/diagrams/deployment.puml b/20-implementierungsheft/assets/diagrams/deployment.puml new file mode 100644 index 0000000..26918e2 --- /dev/null +++ b/20-implementierungsheft/assets/diagrams/deployment.puml @@ -0,0 +1,59 @@ +@startuml + +node "<> \nBackend Server" as backendServer{ + database " <> \n MariaDB Server 10.6" as database { + rectangle rectangle1 [ + <> + User + ] + rectangle rectangle2 [ + <> + SubscriptionAction + ] + rectangle rectangle3 [ + <> + EpisodeAction + ] + rectangle rectangle4 [ + <> + Subscription + ] + rectangle rectangle5 [ + <> + Episode + ] + } + + node "<> \nJava Spring" as javaSpring{ + node " <> \n Tomcat Webserver" + } +} + +node "<> \nFrontend" as frontendServer { + +} + +node "<> \nEndgerät" as terminal { + node "<> \nBrowser" as browser + node "<> \nPodcatcher" as podcatcher +} + +backendServer "1" - "*" podcatcher + +node "<> \nFrontend Server" as frontendServer{ + node "<> \nVue.js" as vuejs { + + } +} + +podcatcher -[hidden] browser + +backendServer - "1" frontendServer + +database "1" -- "1" javaSpring + +browser "*" -- frontendServer + + + +@enduml diff --git a/20-implementierungsheft/assets/diagrams/gantt-plan.puml b/20-implementierungsheft/assets/diagrams/gantt-plan.puml new file mode 100644 index 0000000..0e90aa2 --- /dev/null +++ b/20-implementierungsheft/assets/diagrams/gantt-plan.puml @@ -0,0 +1,31 @@ +@startgantt + +printscale daily zoom 5 +project starts on 2023-01-30 + +-- Backend -- +[Controller-Schicht] on {Immanuel} lasts 2 days +[Service-Schicht (Daten durchreichen)] on {Daniel} lasts 2 days +[Authentifizierung] on {Gero} lasts 4 days +[Model-Paket] on {Daniel} lasts 1 days +[Datenbank aufsetzen] on {Immanuel} lasts 4 days +[Util-Paket (RSSParser)] on {Daniel} {Lukas} lasts 6 days +[DataAccess-Schicht] on {Immanuel} {Julius} lasts 8 days +[Service-Schicht (Geschäftslogik)] on {Daniel} {Immanuel} lasts 8 days +[Util-Paket (CleanCronJob)] on {Julius} lasts 2 days +-- Frontend -- +[Komponenten] on {Gero} {Julius} {Lukas} lasts 15 days +[API-Anbindung] on {Gero} {Lukas} lasts 4 days + +'Backend +[Service-Schicht (Daten durchreichen)] starts at [Controller-Schicht]'s end +[Datenbank aufsetzen] starts at [Model-Paket]'s end +[Authentifizierung] starts at [Controller-Schicht]'s end +[DataAccess-Schicht] starts at [Datenbank aufsetzen]'s end +[Util-Paket (RSSParser)] starts at [Datenbank aufsetzen]'s end +[Service-Schicht (Geschäftslogik)] starts at [DataAccess-Schicht]'s end +[Util-Paket (CleanCronJob)] starts at [DataAccess-Schicht]'s end +'Frontend +[API-Anbindung] starts at [DataAccess-Schicht]'s end + +@endgantt \ No newline at end of file diff --git a/20-implementierungsheft/assets/diagrams/gantt-reality.puml b/20-implementierungsheft/assets/diagrams/gantt-reality.puml new file mode 100644 index 0000000..f726c56 --- /dev/null +++ b/20-implementierungsheft/assets/diagrams/gantt-reality.puml @@ -0,0 +1,39 @@ +@startgantt + +printscale daily zoom 5 +project starts on 2023-01-30 + +-- Backend -- +[Controller-Schicht] on {Immanuel} lasts 3 days +[Model-Paket] on {Daniel} lasts 3 days +[Datenbank aufsetzen] on {Immanuel} lasts 6 days +[Util-Paket (RSSParser)] on {Daniel} {Lukas} lasts 32 days +[DAO-Interfaces] on {Julius} {Immanuel} lasts 6 days +[Authentifizierung] on {Immanuel} lasts 13 days +[Service-Schicht mit Datenzugriff] on {Julius} lasts 14 days +[Util-Paket (CleanCronJob)] on {Daniel} lasts 2 days +[Docker] on {Daniel} lasts 12 days +[EMailService] on {Gero} lasts 1 days +-- Frontend -- +[Komponenten] on {Gero} {Julius} lasts 15 days +[Mehrsprachigkeit] on {Lukas} lasts 5 days +[Router] on {Gero} lasts 1 days +[API-Anbindung] on {Gero} {Lukas} lasts 28 days +[Error-Handling] on {Gero} lasts 5 days + +'Backend +[Datenbank aufsetzen] starts at [Model-Paket]'s end +[Util-Paket (RSSParser)] starts at [Datenbank aufsetzen]'s end +[DAO-Interfaces] starts at [Datenbank aufsetzen]'s end +[Authentifizierung] starts at [DAO-Interfaces]'s end +[Service-Schicht mit Datenzugriff] starts at [DAO-Interfaces]'s end +[Util-Paket (CleanCronJob)] starts at [DAO-Interfaces]'s end +[Docker] starts at [Util-Paket (CleanCronJob)]'s end +[EMailService] starts 2023-02-14 +'Frontend +[Mehrsprachigkeit] starts 2023-02-01 +[Router] starts at [Mehrsprachigkeit]'s end +[API-Anbindung] starts at [Router]'s end +[Error-Handling] starts 2023-02-05 + +@endgantt \ No newline at end of file diff --git a/20-implementierungsheft/assets/diagrams/sequencediagram-forgotAndResetPW.puml b/20-implementierungsheft/assets/diagrams/sequencediagram-forgotAndResetPW.puml new file mode 100644 index 0000000..603130c --- /dev/null +++ b/20-implementierungsheft/assets/diagrams/sequencediagram-forgotAndResetPW.puml @@ -0,0 +1,41 @@ +@startuml + +skinparam ParticipantPadding 30 + +participant AuthenticationController << (C, #ADD1B2) @Controller >> +-> AuthenticationController: ""POST /api/2/auth/forgot.json"" \n//@RequestBody ForgotPasswordRequest forgotPasswordRequest// \n\n-> forgotPassword(//forgotPasswordRequest//) +activate AuthenticationController +participant AuthenticationService << (C, #ADD1B2) @Service >> +AuthenticationController -> AuthenticationService: forgotPassword(//forgotPasswordRequest//) +activate AuthenticationService +participant JavaMailSenderImpl << (C, #ADD1B2) >> +AuthenticationService -> JavaMailSenderImpl: create link to reset password with JWT as URL parameter \n-> send(SimpleMailMessage simpleMessage) with link +activate JavaMailSenderImpl +<<- JavaMailSenderImpl: sends email with link containing a JWT to reset password +JavaMailSenderImpl --> AuthenticationService +deactivate JavaMailSenderImpl +AuthenticationService --> AuthenticationController: int indicating status +deactivate AuthenticationService +<-- AuthenticationController: ResponseEntity indicating status \n\n-> ""HTTP status code"" +deactivate AuthenticationController +||60|| +-> AuthenticationController: ""PUT /api/2/auth/{username}/resetpassword.json"" \n//@RequestParam String jwt// \n//@RequestBody ResetPasswordRequest resetPasswordRequest// \n\n-> login user (""username"") via JWT (//jwt//) \n-> resetPassword(""username"", //resetPasswordRequest//) +activate AuthenticationController +AuthenticationController -> AuthenticationService: resetPassword(""username"", //resetPasswordRequest//) +activate AuthenticationService +participant JdbcUserDetailsManager << (C, #ADD1B2) @Repository >> +AuthenticationService -> JdbcUserDetailsManager: String oldPassword = //resetPasswordRequest//.getOldPassword() \nString newPassword = //resetPasswordRequest//.getNewPassword() \n-> changePassword(newPassword, oldPassword) +activate JdbcUserDetailsManager +database Database +JdbcUserDetailsManager -> Database: change password of logged in user +activate Database +Database --> JdbcUserDetailsManager +deactivate Database +JdbcUserDetailsManager --> AuthenticationService: int indicating status +deactivate JdbcUserDetailsManager +AuthenticationService --> AuthenticationController: int indicating status +deactivate AuthenticationService +<-- AuthenticationController: ResponseEntity indicating status \n\n-> ""HTTP status code"" +deactivate AuthenticationController + +@enduml \ No newline at end of file diff --git a/20-implementierungsheft/assets/diagrams/sequencediagram-getEpisodeActions.puml b/20-implementierungsheft/assets/diagrams/sequencediagram-getEpisodeActions.puml new file mode 100644 index 0000000..47497d5 --- /dev/null +++ b/20-implementierungsheft/assets/diagrams/sequencediagram-getEpisodeActions.puml @@ -0,0 +1,38 @@ +@startuml + +' title =**Get All Episode Actions** + +participant EpisodeActionController << (C, #ADD1B2) @Controller >> +-> EpisodeActionController: ""GET /api/2/episodes/{username}.json"" \n//@RequestParam("device") String deviceID// \n//@RequestParam("aggregated") boolean aggregated// \n\n-> getEpisodeActions(""username"", //deviceID//, //aggregated//) +note right + Die Parameter //deviceID// und //aggregated// werden ignoriert, + da nicht zwischen Geräten unterschieden und für jede + Episode sowieso nur die letzte Play-Action gespeichert + wird. Dies gilt für alle GET-Anfragen der Episode Actions API. +end note +activate EpisodeActionController +participant EpisodeActionService << (C, #ADD1B2) @Service >> +EpisodeActionController -> EpisodeActionService: getEpisodeActions(""username"") +activate EpisodeActionService +participant EpisodeActionDataAccessService << (C, #ADD1B2) @Repository >> +EpisodeActionService -> EpisodeActionDataAccessService: getEpisodeActions(""username"") +activate EpisodeActionDataAccessService +EpisodeActionDataAccessService -> EpisodeActionDataAccessService: getEpisodeActionsSince(""username"", \nLocalDateTime.MIN.toEpochSecond(ZoneOffset.UTC)) +database Database +activate EpisodeActionDataAccessService +EpisodeActionDataAccessService -> Database: get all EpisodeActions for all subscribed podcasts +activate Database +Database --> EpisodeActionDataAccessService: List selectedEpisodeActions \n-> then remove all older than LocalDateTime.MIN (none) +EpisodeActionDataAccessService -> Database: join EpisodeActions in selectedEpisodeActions with episodeURL of Episode +Database --> EpisodeActionDataAccessService +deactivate Database +EpisodeActionDataAccessService --> EpisodeActionDataAccessService: List episodeActionPosts +deactivate EpisodeActionDataAccessService +EpisodeActionDataAccessService --> EpisodeActionService: List episodeActionPosts +deactivate EpisodeActionDataAccessService +EpisodeActionService --> EpisodeActionController: List episodeActionPosts +deactivate EpisodeActionService +<-- EpisodeActionController: ResponseEntity response \n\n-> ""HTTP status code"" \n-> ""JSON"" +deactivate EpisodeActionController + +@enduml \ No newline at end of file diff --git a/20-implementierungsheft/assets/diagrams/sequencediagram-getEpisodeActionsOfPodcastSince.puml b/20-implementierungsheft/assets/diagrams/sequencediagram-getEpisodeActionsOfPodcastSince.puml new file mode 100644 index 0000000..d8797d1 --- /dev/null +++ b/20-implementierungsheft/assets/diagrams/sequencediagram-getEpisodeActionsOfPodcastSince.puml @@ -0,0 +1,32 @@ +@startuml + +' title =**Get Episode Actions of Podcast Since** + +participant EpisodeActionController << (C, #ADD1B2) @Controller >> +-> EpisodeActionController: ""GET /api/2/episodes/{username}.json"" \n//@RequestParam("podcast") String podcastURL// \n//@RequestParam("device") String deviceID// \n//@RequestParam("since") long since// \n//@RequestParam("aggregated") boolean aggregated// \n\n-> getEpisodeActionsOfPodcastSince(""username"", //podcastURL//, //deviceID//, //since//, //aggregated//) +note right + Die Parameter //deviceID// und //aggregated// werden ignoriert. + Siehe Notiz in Sequenzdiagramm **Get All Episode Actions**. +end note +activate EpisodeActionController +participant EpisodeActionService << (C, #ADD1B2) @Service >> +EpisodeActionController -> EpisodeActionService: getEpisodeActionsOfPodcastSince(""username"", //podcastURL//, //since//) +activate EpisodeActionService +participant EpisodeActionDataAccessService << (C, #ADD1B2) @Repository >> +EpisodeActionService -> EpisodeActionDataAccessService: getEpisodeActionsOfPodcastSince(""username"", //podcastURL//, //since//) +activate EpisodeActionDataAccessService +database Database +EpisodeActionDataAccessService -> Database: get all EpisodeActions the given podcast (//podcastURL//) +activate Database +Database --> EpisodeActionDataAccessService: List selectedEpisodeActions \n-> then remove all older than //since// +EpisodeActionDataAccessService -> Database: join EpisodeActions in selectedEpisodeActions with episodeURL of Episode +Database --> EpisodeActionDataAccessService +deactivate Database +EpisodeActionDataAccessService --> EpisodeActionService: List episodeActionPosts +deactivate EpisodeActionDataAccessService +EpisodeActionService --> EpisodeActionController: List episodeActionPosts +deactivate EpisodeActionService +<-- EpisodeActionController: ResponseEntity response \n\n-> ""HTTP status code"" \n-> ""JSON"" +deactivate EpisodeActionController + +@enduml \ No newline at end of file diff --git a/20-implementierungsheft/assets/diagrams/sequencediagram-getSubscriptions.puml b/20-implementierungsheft/assets/diagrams/sequencediagram-getSubscriptions.puml new file mode 100644 index 0000000..4d8ab90 --- /dev/null +++ b/20-implementierungsheft/assets/diagrams/sequencediagram-getSubscriptions.puml @@ -0,0 +1,38 @@ +@startuml + +' title =**Get All Subscriptions** + +participant SubscriptionController << (C, #ADD1B2) @Controller >> +-> SubscriptionController: ""GET /subscriptions/{username}.json"" \n"" /subscriptions/{username}/{deviceid}.json"" \n//@RequestParam("jsonp") String functionJSONP// \n\n-> getSubscriptions(""username"", ""deviceid"", //functionJSONP//) +activate SubscriptionController +note right + Die Parameter ""deviceid"" und + //functionJSONP// werden ignoriert, + da nicht zwischen Geräten unterschieden + und JSONP nicht unterstützt wird. +end note +participant SubscriptionService << (C, #ADD1B2) @Service >> +SubscriptionController -> SubscriptionService: getSubscriptions(""username"") +activate SubscriptionService +participant SubscriptionDataAccessService << (C, #ADD1B2) @Repository >> +SubscriptionService -> SubscriptionDataAccessService: getSubscriptions(""username"") +activate SubscriptionDataAccessService +SubscriptionDataAccessService -> SubscriptionDataAccessService: getSubscriptionsSince(""username"", LocalDateTime.MIN) +database Database +activate SubscriptionDataAccessService +SubscriptionDataAccessService -> Database: get all Subscriptions for ""username"" +activate Database +Database --> SubscriptionDataAccessService: List subscriptions +SubscriptionDataAccessService -> Database: get Podcasts from Subscriptions +Database --> SubscriptionDataAccessService: List subscribedPodcasts +deactivate Database +SubscriptionDataAccessService --> SubscriptionDataAccessService: List podcastURLs +deactivate SubscriptionDataAccessService +SubscriptionDataAccessService --> SubscriptionService: List podcastURLs +deactivate SubscriptionDataAccessService +SubscriptionService --> SubscriptionController: List podcastURLs +deactivate SubscriptionService +<-- SubscriptionController: ResponseEntity> podcastURLs \n \n-> ""HTTP status code"" \n-> ""JSON"" +deactivate SubscriptionController + +@enduml \ No newline at end of file diff --git a/20-implementierungsheft/assets/diagrams/sequencediagram-register.puml b/20-implementierungsheft/assets/diagrams/sequencediagram-register.puml new file mode 100644 index 0000000..b7b7aa1 --- /dev/null +++ b/20-implementierungsheft/assets/diagrams/sequencediagram-register.puml @@ -0,0 +1,26 @@ +@startuml + +' title =**Register** + +participant AuthenticationController << (C, #ADD1B2) @Controller >> +-> AuthenticationController: ""POST /api/2/auth/register.json"" \n//@RequestBody UserDetails user// \n\n-> registerUser(//user//) +activate AuthenticationController +participant AuthenticationService << (C, #ADD1B2) @Service >> +AuthenticationController -> AuthenticationService: registerUser(//user//) +activate AuthenticationService +participant JdbcUserDetailsManager << (C, #ADD1B2) @Repository >> +AuthenticationService -> JdbcUserDetailsManager: createUser(//user//) +activate JdbcUserDetailsManager +database Database +JdbcUserDetailsManager -> Database: create new User with given UserDetails (//user//) +activate Database +Database --> JdbcUserDetailsManager +deactivate Database +JdbcUserDetailsManager --> AuthenticationService: int indicating status +deactivate JdbcUserDetailsManager +AuthenticationService --> AuthenticationController: int indicating status +deactivate AuthenticationService +<-- AuthenticationController: ResponseEntity indicating status \n\n-> ""HTTP status code"" +deactivate AuthenticationController + +@enduml \ No newline at end of file diff --git a/20-implementierungsheft/assets/diagrams/sequencediagram-uploadEpisodeActions.puml b/20-implementierungsheft/assets/diagrams/sequencediagram-uploadEpisodeActions.puml new file mode 100644 index 0000000..d3dac57 --- /dev/null +++ b/20-implementierungsheft/assets/diagrams/sequencediagram-uploadEpisodeActions.puml @@ -0,0 +1,38 @@ +@startuml + +' title =**Upload Episode Actions** + +participant EpisodeActionController << (C, #ADD1B2) @Controller >> +-> EpisodeActionController: ""POST /api/2/episodes/{username}.json"" \n//@RequestBody EpisodeActionPostRequest episodeActionPostRequest// \n\n-> addEpisodeActions(""username"", //episodeActionPostRequest//) +activate EpisodeActionController +participant EpisodeActionService << (C, #ADD1B2) @Service >> +EpisodeActionController -> EpisodeActionService: addEpisodeActions(""username"", \nepisodeActionPosts = //episodeActionPostRequest//.getEpisodeActionPosts()) +activate EpisodeActionService +participant EpisodeActionDataAccessService << (C, #ADD1B2) @Repository >> +EpisodeActionService -> EpisodeActionDataAccessService: addEpisodeActions(""username"", episodeActionPosts) +database Database +activate EpisodeActionDataAccessService +loop for each EpisodeActionPost in episodeActionPosts -> episodeAction = episodeActionPost.getEpisodeAction() +opt episodeAction.getAction().equals(Action.PLAY) +EpisodeActionDataAccessService -> Database: set episodeID field of episodeAction for this ""username"" via podcastURL and episodeURL +activate Database +Database --> EpisodeActionDataAccessService +EpisodeActionDataAccessService -> Database: get last EpisodeAction with this episodeID if present +Database --> EpisodeActionDataAccessService: Optional lastEpisodeAction +opt lastEpisodeAction.isPresent() +EpisodeActionDataAccessService -> Database: replace lastEpisodeAction with episodeAction +else else +EpisodeActionDataAccessService -> Database: add episodeAction to DB as new entry +end +Database --> EpisodeActionDataAccessService +deactivate Database +end +end +EpisodeActionDataAccessService --> EpisodeActionService: long latestTimestamp +deactivate EpisodeActionDataAccessService +EpisodeActionService --> EpisodeActionController: LocalDateTime timestamp = LocalDateTime.ofEpochSecond(latestTimestamp, 0, ZoneOffset.UTC) +deactivate EpisodeActionService +<-- EpisodeActionController: ResponseEntity \n(with empty list for updateURLs) \n\n-> ""HTTP status code"" \n-> ""JSON"" +deactivate EpisodeActionController + +@enduml \ No newline at end of file diff --git a/20-implementierungsheft/assets/diagrams/sequencediagram-uploadSubscriptions.puml b/20-implementierungsheft/assets/diagrams/sequencediagram-uploadSubscriptions.puml new file mode 100644 index 0000000..1edc8cf --- /dev/null +++ b/20-implementierungsheft/assets/diagrams/sequencediagram-uploadSubscriptions.puml @@ -0,0 +1,32 @@ +@startuml + +' title =**Upload Subscriptions** + +participant SubscriptionController << (C, #ADD1B2) @Controller >> +-> SubscriptionController: ""PUT /subscriptions/{username}/{deviceid}.json"" \n//@RequestBody List subscriptions// \n\n-> uploadSubscriptions(""username"", ""deviceid"", //subscriptions//) +activate SubscriptionController +participant SubscriptionService << (C, #ADD1B2) @Service >> +SubscriptionController -> SubscriptionService: uploadSubscriptions(""username"", //subscriptions//) +activate SubscriptionService +participant SubscriptionDataAccessService << (C, #ADD1B2) @Repository >> +SubscriptionService -> SubscriptionDataAccessService: uploadSubscriptions(""username"", //subscriptions//) +activate SubscriptionDataAccessService +database Database +SubscriptionDataAccessService -> Database: delete all subsciptions of ""username"" +activate Database +Database --> SubscriptionDataAccessService +SubscriptionDataAccessService -> SubscriptionDataAccessService: addSubscriptions(""username"", //subscriptions//) +activate SubscriptionDataAccessService +SubscriptionDataAccessService -> Database: upload all subscriptions (//subscriptions//) for ""username"" +Database --> SubscriptionDataAccessService +deactivate Database +SubscriptionDataAccessService --> SubscriptionDataAccessService: int indicating status +deactivate SubscriptionDataAccessService +SubscriptionDataAccessService --> SubscriptionService: int indicating status +deactivate SubscriptionDataAccessService +SubscriptionService --> SubscriptionController: int indicating status +deactivate SubscriptionService +<-- SubscriptionController: ResponseEntity with empty String for success \n\n-> ""HTTP status code"" \n-> ""JSON"" +deactivate SubscriptionController + +@enduml \ No newline at end of file diff --git a/20-implementierungsheft/assets/episode.png b/20-implementierungsheft/assets/episode.png new file mode 100644 index 0000000..c0db4a2 Binary files /dev/null and b/20-implementierungsheft/assets/episode.png differ diff --git a/20-implementierungsheft/assets/errorlog.png b/20-implementierungsheft/assets/errorlog.png new file mode 100644 index 0000000..3f6ea82 Binary files /dev/null and b/20-implementierungsheft/assets/errorlog.png differ diff --git a/20-implementierungsheft/assets/floatinglabelinput.png b/20-implementierungsheft/assets/floatinglabelinput.png new file mode 100644 index 0000000..25f013b Binary files /dev/null and b/20-implementierungsheft/assets/floatinglabelinput.png differ diff --git a/20-implementierungsheft/assets/gantt-plan-eps-converted-to.pdf b/20-implementierungsheft/assets/gantt-plan-eps-converted-to.pdf new file mode 100644 index 0000000..add028f Binary files /dev/null and b/20-implementierungsheft/assets/gantt-plan-eps-converted-to.pdf differ diff --git a/20-implementierungsheft/assets/gantt-plan.eps b/20-implementierungsheft/assets/gantt-plan.eps new file mode 100644 index 0000000..0242842 --- /dev/null +++ b/20-implementierungsheft/assets/gantt-plan.eps @@ -0,0 +1,8314 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: PlantUML v1.2023.0 +%%Title: noTitle +%%BoundingBox: 0 0 1049 488 +%%ColorUsage: Color +%%Origin: 0 0 +%%EndComments + +gsave +0 488 translate +.01 -.01 scale +/simplerect { +newpath moveto 1 index 0 rlineto +0 exch rlineto +neg 0 rlineto +} def +/rquadto { +3 index 3 index 4 2 roll rcurveto +} def +/P$h { +134 12 rlineto +0 26 rlineto +-353 0 rlineto +0 -26 rlineto +134 -12 rlineto +0 -534 rlineto +-131 46 rlineto +0 -25 rlineto +190 -109 rlineto +25 0 rlineto +0 621 rlineto +closepath +} def +/P$1d { +0 -60 -42 -87 rquadto +-40 -26 -120 -26 rquadto +-173 0 rlineto +0 240 rlineto +173 0 rlineto +81 0 121 -31 rquadto +40 -31 40 -95 rquadto +closepath +} def +/P$30 { +109 17 rlineto +0 34 rlineto +-340 0 rlineto +0 -34 rlineto +109 -17 rlineto +0 -750 rlineto +-109 -15 rlineto +0 -34 rlineto +340 0 rlineto +0 34 rlineto +-109 15 rlineto +0 750 rlineto +} def +/P$k { +0 143 rlineto +-84 0 rlineto +0 -143 rlineto +-290 0 rlineto +0 -65 rlineto +318 -448 rlineto +56 0 rlineto +0 443 rlineto +89 0 rlineto +0 70 rlineto +-89 0 rlineto +closepath +} def +/P$a { +0 125 rlineto +-21 0 rlineto +-28 -54 rlineto +-25 0 -57 7 rquadto +-32 6 -57 17 rquadto +0 342 rlineto +78 12 rlineto +0 21 rlineto +-217 0 rlineto +0 -21 rlineto +57 -12 rlineto +0 -390 rlineto +-57 -12 rlineto +0 -21 rlineto +132 0 rlineto +4 57 rlineto +29 -25 79 -46 rquadto +50 -23 79 -23 rquadto +7 0 rlineto +closepath +} def +/P$1u { +0 -85 rlineto +268 0 rlineto +0 85 rlineto +-268 0 rlineto +} def +/P$2p { +0 -65 -45 -100 rquadto +-45 -35 -129 -35 rquadto +-243 0 rlineto +0 279 rlineto +248 0 rlineto +81 0 125 -37 rquadto +45 -37 45 -106 rquadto +} def +/P$1i { +-196 -265 rlineto +-71 59 rlineto +0 206 rlineto +-96 0 rlineto +0 -796 rlineto +96 0 rlineto +0 498 rlineto +256 -282 rlineto +112 0 rlineto +-235 250 rlineto +248 331 rlineto +-112 0 rlineto +} def +/P$8 { +0 51 -3 73 rquadto +34 -20 78 -34 rquadto +45 -15 76 -15 rquadto +59 0 89 35 rquadto +31 34 31 100 rquadto +0 301 rlineto +56 12 rlineto +0 21 rlineto +-198 0 rlineto +0 -21 rlineto +60 -12 rlineto +0 -295 rlineto +0 -84 -81 -84 rquadto +-45 0 -109 14 rquadto +0 365 rlineto +62 12 rlineto +0 21 rlineto +-201 0 rlineto +0 -21 rlineto +57 -12 rlineto +0 -626 rlineto +-68 -10 rlineto +0 -21 rlineto +150 0 rlineto +0 198 rlineto +closepath +} def +/P$2j { +0 -146 -175 -146 rquadto +-204 0 rlineto +0 298 rlineto +207 0 rlineto +171 0 171 -151 rquadto +} def +/P$x { +206 0 206 151 rquadto +0 357 rlineto +54 14 rlineto +0 39 rlineto +-201 0 rlineto +-14 -42 rlineto +-45 31 -82 42 rquadto +-35 12 -73 12 rquadto +-170 0 -170 -165 rquadto +0 -60 25 -98 rquadto +25 -37 71 -54 rquadto +48 -18 150 -20 rquadto +71 -1 rlineto +0 -81 rlineto +0 -100 -81 -100 rquadto +-50 0 -110 31 rquadto +-21 68 rlineto +-39 0 rlineto +0 -132 rlineto +89 -14 129 -17 rquadto +42 -3 85 -3 rquadto +closepath +} def +/P$3f { +235 0 350 106 rquadto +114 104 114 315 rquadto +0 212 -110 323 rquadto +-109 109 -326 109 rquadto +-303 -3 rlineto +-109 0 rlineto +0 -34 rlineto +109 -17 rlineto +0 -750 rlineto +-109 -15 rlineto +0 -34 rlineto +385 0 rlineto +} def +/P$1 { +0 240 -215 240 rquadto +-103 0 -156 -60 rquadto +-53 -62 -53 -179 rquadto +0 -117 53 -178 rquadto +53 -62 160 -62 rquadto +104 0 157 60 rquadto +53 60 53 179 rquadto +closepath +} def +/P$2w { +0 281 rlineto +423 0 rlineto +0 85 rlineto +-423 0 rlineto +0 306 rlineto +-101 0 rlineto +0 -756 rlineto +537 0 rlineto +0 82 rlineto +-435 0 rlineto +} def +/P$33 { +-82 3 rlineto +-85 3 -115 32 rquadto +-29 29 -29 100 rquadto +0 110 90 110 rquadto +42 0 73 -9 rquadto +32 -9 64 -25 rquadto +0 -212 rlineto +} def +/P$2l { +0 -121 -32 -173 rquadto +-31 -53 -104 -53 rquadto +-81 0 -118 56 rquadto +-37 54 -37 176 rquadto +0 114 35 168 rquadto +37 54 120 54 rquadto +71 0 104 -53 rquadto +32 -54 32 -176 rquadto +} def +/P$1j { +0 100 40 154 rquadto +42 53 121 53 rquadto +62 0 100 -25 rquadto +37 -25 51 -64 rquadto +84 25 rlineto +-51 137 -235 137 rquadto +-129 0 -196 -76 rquadto +-67 -76 -67 -228 rquadto +0 -145 67 -221 rquadto +67 -76 192 -76 rquadto +256 0 256 309 rquadto +0 12 rlineto +-414 0 rlineto +closepath +} def +/P$1p { +0 151 -67 226 rquadto +-67 75 -195 75 rquadto +-126 0 -192 -76 rquadto +-64 -78 -64 -225 rquadto +0 -301 259 -301 rquadto +134 0 196 73 rquadto +62 73 62 228 rquadto +closepath +} def +/P$0 { +-17 0 rlineto +-239 -562 rlineto +0 523 rlineto +87 12 rlineto +0 26 rlineto +-223 0 rlineto +0 -26 rlineto +84 -12 rlineto +0 -576 rlineto +-84 -14 rlineto +0 -25 rlineto +198 0 rlineto +214 498 rlineto +231 -498 rlineto +187 0 rlineto +0 25 rlineto +-82 14 rlineto +0 576 rlineto +82 12 rlineto +0 26 rlineto +-265 0 rlineto +0 -26 rlineto +89 -12 rlineto +0 -523 rlineto +-262 562 rlineto +} def +/P$35 { +0 109 101 109 rquadto +79 0 146 -20 rquadto +0 -470 rlineto +-89 -17 rlineto +0 -28 rlineto +193 0 rlineto +0 553 rlineto +76 15 rlineto +0 28 rlineto +-175 0 rlineto +-4 -48 rlineto +-45 25 -104 43 rquadto +-57 17 -98 17 rquadto +-151 0 -151 -175 rquadto +0 -389 rlineto +-76 -17 rlineto +0 -28 rlineto +181 0 rlineto +0 426 rlineto +} def +/P$l { +-1 0 rlineto +-234 329 rlineto +235 0 rlineto +0 -329 rlineto +closepath +} def +/P$1a { +0 -109 -26 -159 rquadto +-26 -50 -87 -50 rquadto +-21 0 -48 4 rquadto +-26 4 -43 14 rquadto +0 421 rlineto +37 9 92 9 rquadto +57 0 85 -56 rquadto +28 -56 28 -184 rquadto +closepath +} def +/P$7 { +-50 0 -78 42 rquadto +-26 40 -26 120 rquadto +196 0 rlineto +0 -87 -23 -125 rquadto +-21 -37 -68 -37 rquadto +closepath +} def +/P$2i { +0 107 -70 171 rquadto +-68 62 -189 62 rquadto +-223 0 rlineto +0 295 rlineto +-101 0 rlineto +0 -756 rlineto +318 0 rlineto +126 0 195 59 rquadto +70 59 70 167 rquadto +closepath +} def +/P$m { +112 0 167 46 rquadto +56 45 56 140 rquadto +0 98 -60 151 rquadto +-59 53 -170 53 rquadto +-93 0 -165 -20 rquadto +-6 -137 rlineto +32 0 rlineto +21 90 rlineto +21 12 51 20 rquadto +29 6 57 6 rquadto +76 0 112 -35 rquadto +37 -35 37 -123 rquadto +0 -59 -15 -90 rquadto +-15 -31 -50 -45 rquadto +-34 -15 -92 -15 rquadto +-45 0 -87 12 rquadto +-46 0 rlineto +0 -325 rlineto +332 0 rlineto +0 75 rlineto +-289 0 rlineto +0 207 rlineto +53 -10 114 -10 rquadto +closepath +} def +/P$j { +0 87 -60 137 rquadto +-59 50 -170 50 rquadto +-93 0 -176 -20 rquadto +-4 -137 rlineto +31 0 rlineto +21 90 rlineto +20 10 54 18 rquadto +34 7 65 7 rquadto +76 0 112 -34 rquadto +37 -35 37 -117 rquadto +0 -64 -34 -96 rquadto +-34 -34 -104 -37 rquadto +-70 -4 rlineto +0 -40 rlineto +70 -3 rlineto +54 -3 81 -34 rquadto +26 -31 26 -95 rquadto +0 -65 -28 -95 rquadto +-28 -31 -90 -31 rquadto +-26 0 -54 7 rquadto +-28 7 -50 18 rquadto +-17 79 rlineto +-32 0 rlineto +0 -125 rlineto +48 -12 82 -17 rquadto +35 -4 71 -4 rquadto +209 0 209 160 rquadto +0 68 -37 109 rquadto +-37 39 -106 50 rquadto +89 9 131 50 rquadto +42 40 42 114 rquadto +closepath +} def +/P$29 { +0 156 -48 279 rquadto +-48 123 -150 232 rquadto +-93 0 rlineto +101 -112 148 -237 rquadto +46 -125 46 -275 rquadto +0 -150 -48 -275 rquadto +-46 -125 -146 -237 rquadto +93 0 rlineto +101 109 150 232 rquadto +48 123 48 278 rquadto +0 1 rlineto +} def +/P$2d { +0 -73 rlineto +325 -432 rlineto +-307 0 rlineto +0 -75 rlineto +421 0 rlineto +0 73 rlineto +-326 432 rlineto +337 0 rlineto +0 75 rlineto +-450 0 rlineto +} def +/P$s { +0 -67 -26 -98 rquadto +-26 -32 -79 -32 rquadto +-51 0 -78 31 rquadto +-25 31 -25 100 rquadto +0 68 25 98 rquadto +25 28 78 28 rquadto +54 0 79 -29 rquadto +26 -29 26 -96 rquadto +closepath +} def +/P$1n { +0 121 31 175 rquadto +32 51 104 51 rquadto +82 0 118 -56 rquadto +37 -57 37 -176 rquadto +0 -115 -37 -168 rquadto +-35 -54 -117 -54 rquadto +-73 0 -106 54 rquadto +-31 53 -31 175 rquadto +closepath +} def +/P$1s { +0 -445 rlineto +0 -62 -3 -135 rquadto +90 0 rlineto +4 98 4 118 rquadto +1 0 rlineto +23 -75 53 -101 rquadto +31 -28 85 -28 rquadto +18 0 39 6 rquadto +0 87 rlineto +-20 -4 -51 -4 rquadto +-60 0 -92 51 rquadto +-31 51 -31 148 rquadto +0 303 rlineto +-96 0 rlineto +} def +/P$2a { +-85 -221 rlineto +-345 0 rlineto +-87 221 rlineto +-106 0 rlineto +309 -756 rlineto +117 0 rlineto +303 756 rlineto +-104 0 rlineto +closepath +} def +/P$3p { +-109 -15 rlineto +0 -34 rlineto +326 0 rlineto +0 34 rlineto +-95 15 rlineto +0 526 rlineto +0 85 -26 150 rquadto +-26 64 -79 101 rquadto +-53 35 -117 35 rquadto +-81 0 -132 -18 rquadto +0 -154 rlineto +42 0 rlineto +18 87 rlineto +12 15 34 23 rquadto +23 7 50 7 rquadto +89 0 89 -120 rquadto +0 -639 rlineto +} def +/P$20 { +0 -756 rlineto +103 0 rlineto +0 756 rlineto +-103 0 rlineto +} def +/P$1y { +0 -581 rlineto +96 0 rlineto +0 581 rlineto +-96 0 rlineto +} def +/P$3m { +-131 15 rlineto +0 746 rlineto +168 0 rlineto +134 0 198 -12 rquadto +39 -176 rlineto +40 0 rlineto +-10 243 rlineto +-667 0 rlineto +0 -34 rlineto +109 -17 rlineto +0 -750 rlineto +-109 -15 rlineto +0 -34 rlineto +362 0 rlineto +0 34 rlineto +} def +/P$n { +0 101 -51 157 rquadto +-51 54 -148 54 rquadto +-110 0 -168 -85 rquadto +-57 -85 -57 -246 rquadto +0 -104 29 -181 rquadto +31 -78 85 -117 rquadto +56 -40 128 -40 rquadto +71 0 142 17 rquadto +0 112 rlineto +-31 0 rlineto +-17 -65 rlineto +-17 -9 -45 -15 rquadto +-26 -7 -48 -7 rquadto +-70 0 -110 70 rquadto +-39 68 -43 201 rquadto +79 -42 160 -42 rquadto +85 0 131 48 rquadto +45 48 45 140 rquadto +closepath +} def +/P$10 { +-39 20 rlineto +-82 42 -148 42 rquadto +-151 0 -151 -162 rquadto +0 -350 rlineto +-54 -14 rlineto +0 -39 rlineto +223 0 rlineto +0 381 rlineto +0 48 20 76 rquadto +21 28 60 28 rquadto +43 0 89 -20 rquadto +0 -412 rlineto +-51 -14 rlineto +0 -39 rlineto +220 0 rlineto +0 498 rlineto +54 14 rlineto +0 39 rlineto +-214 0 rlineto +-9 -48 rlineto +} def +/P$38 { +103 15 rlineto +0 28 rlineto +-309 0 rlineto +0 -28 rlineto +101 -15 rlineto +0 -814 rlineto +-101 -15 rlineto +0 -28 rlineto +206 0 rlineto +0 857 rlineto +closepath +} def +/P$4 { +0 84 78 84 rquadto +60 0 112 -15 rquadto +0 -362 rlineto +-68 -12 rlineto +0 -21 rlineto +150 0 rlineto +0 425 rlineto +57 12 rlineto +0 21 rlineto +-134 0 rlineto +-3 -37 rlineto +-34 18 -79 32 rquadto +-45 14 -76 14 rquadto +-117 0 -117 -134 rquadto +0 -300 rlineto +-59 -12 rlineto +0 -21 rlineto +140 0 rlineto +0 328 rlineto +closepath +} def +/P$13 { +-498 0 rlineto +0 -110 rlineto +51 -53 93 -96 rquadto +93 -92 135 -145 rquadto +43 -53 64 -109 rquadto +20 -57 20 -129 rquadto +0 -64 -31 -103 rquadto +-29 -39 -81 -39 rquadto +-37 0 -59 7 rquadto +-20 6 -39 21 rquadto +-25 114 rlineto +-51 0 rlineto +0 -178 rlineto +46 -10 92 -18 rquadto +45 -7 96 -7 rquadto +129 0 198 54 rquadto +68 53 68 151 rquadto +0 60 -20 110 rquadto +-20 50 -65 98 rquadto +-43 46 -175 154 rquadto +-50 40 -109 92 rquadto +385 0 rlineto +0 132 rlineto +} def +/P$f { +0 339 -215 339 rquadto +-103 0 -156 -85 rquadto +-53 -87 -53 -253 rquadto +0 -162 53 -248 rquadto +53 -87 160 -87 rquadto +103 0 156 85 rquadto +54 84 54 250 rquadto +closepath +} def +/P$b { +32 0 rlineto +17 89 rlineto +17 21 60 40 rquadto +45 17 87 17 rquadto +68 0 106 -34 rquadto +39 -35 39 -96 rquadto +0 -35 -15 -57 rquadto +-14 -23 -39 -39 rquadto +-23 -15 -54 -26 rquadto +-29 -10 -62 -21 rquadto +-32 -12 -64 -25 rquadto +-29 -14 -54 -34 rquadto +-23 -21 -39 -53 rquadto +-14 -31 -14 -76 rquadto +0 -78 57 -121 rquadto +59 -45 162 -45 rquadto +79 0 171 21 rquadto +0 135 rlineto +-31 0 rlineto +-17 -79 rlineto +-50 -37 -123 -37 rquadto +-64 0 -101 28 rquadto +-37 26 -37 73 rquadto +0 31 14 53 rquadto +15 20 39 35 rquadto +25 14 56 25 rquadto +31 10 64 21 rquadto +32 10 62 26 rquadto +31 14 54 35 rquadto +25 21 39 54 rquadto +15 31 15 78 rquadto +0 95 -57 146 rquadto +-57 51 -167 51 rquadto +-53 0 -106 -9 rquadto +-53 -9 -95 -25 rquadto +0 -151 rlineto +} def +/P$2e { +-93 0 -151 -37 rquadto +-56 -37 -71 -106 rquadto +96 -14 rlineto +9 40 42 62 rquadto +34 21 87 21 rquadto +145 0 145 -168 rquadto +0 -93 rlineto +-1 0 rlineto +-28 56 -76 84 rquadto +-46 28 -110 28 rquadto +-106 0 -156 -70 rquadto +-50 -71 -50 -223 rquadto +0 -154 53 -228 rquadto +54 -73 164 -73 rquadto +62 0 107 28 rquadto +45 28 70 81 rquadto +0 0 rlineto +0 -17 1 -56 rquadto +3 -40 4 -43 rquadto +92 0 rlineto +-3 29 -3 120 rquadto +0 443 rlineto +0 245 -243 245 rquadto +closepath +} def +/P$2u { +0 -98 rlineto +87 0 rlineto +0 98 rlineto +-87 0 rlineto +closepath +} def +/P$1v { +0 104 -82 162 rquadto +-81 57 -229 57 rquadto +-276 0 -320 -192 rquadto +100 -20 rlineto +17 68 71 101 rquadto +56 31 153 31 rquadto +98 0 151 -34 rquadto +54 -34 54 -100 rquadto +0 -37 -17 -60 rquadto +-15 -23 -46 -37 rquadto +-31 -15 -73 -25 rquadto +-42 -10 -93 -21 rquadto +-89 -20 -135 -40 rquadto +-46 -20 -73 -43 rquadto +-26 -25 -40 -57 rquadto +-14 -32 -14 -75 rquadto +0 -96 73 -150 rquadto +75 -53 214 -53 rquadto +128 0 195 40 rquadto +68 39 96 134 rquadto +-101 17 rlineto +-15 -59 -62 -85 rquadto +-46 -28 -129 -28 rquadto +-90 0 -139 29 rquadto +-46 29 -46 90 rquadto +0 34 17 57 rquadto +18 21 53 37 rquadto +35 15 140 39 rquadto +34 7 68 17 rquadto +34 7 65 20 rquadto +32 10 59 26 rquadto +28 15 48 39 rquadto +20 21 31 53 rquadto +12 29 12 70 rquadto +} def +/P$1e { +0 -132 -187 -132 rquadto +-192 0 rlineto +0 271 rlineto +200 0 rlineto +93 0 135 -34 rquadto +43 -34 43 -104 rquadto +} def +/P$1c { +0 100 -73 156 rquadto +-73 56 -204 56 rquadto +-306 0 rlineto +0 -756 rlineto +275 0 rlineto +265 0 265 182 rquadto +0 67 -37 114 rquadto +-37 45 -106 60 rquadto +90 9 139 59 rquadto +48 50 48 126 rquadto +closepath +} def +/P$9 { +0 254 rlineto +107 12 rlineto +0 26 rlineto +-279 0 rlineto +0 -26 rlineto +76 -12 rlineto +0 -576 rlineto +-84 -14 rlineto +0 -25 rlineto +492 0 rlineto +0 156 rlineto +-32 0 rlineto +-15 -106 rlineto +-54 -6 -157 -6 rquadto +-106 0 rlineto +0 273 rlineto +192 0 rlineto +15 -78 rlineto +29 0 rlineto +0 200 rlineto +-29 0 rlineto +-15 -78 rlineto +-192 0 rlineto +} def +/P$1w { +31 -57 75 -84 rquadto +43 -26 110 -26 rquadto +93 0 139 46 rquadto +45 46 45 157 rquadto +0 387 rlineto +-96 0 rlineto +0 -368 rlineto +0 -60 -12 -90 rquadto +-10 -29 -37 -43 rquadto +-25 -14 -70 -14 rquadto +-68 0 -109 46 rquadto +-40 46 -40 128 rquadto +0 342 rlineto +-96 0 rlineto +0 -796 rlineto +96 0 rlineto +0 207 rlineto +0 32 -3 67 rquadto +-1 34 -1 40 rquadto +1 0 rlineto +} def +/P$1b { +-56 -14 rlineto +0 -37 rlineto +225 0 rlineto +0 201 rlineto +0 54 -6 110 rquadto +23 -18 67 -31 rquadto +45 -14 87 -14 rquadto +120 0 175 65 rquadto +54 65 54 209 rquadto +0 142 -70 223 rquadto +-70 79 -198 79 rquadto +-95 0 -278 -40 rquadto +0 -753 rlineto +} def +/P$34 { +48 -28 103 -45 rquadto +56 -18 92 -18 rquadto +78 0 117 45 rquadto +39 45 39 129 rquadto +0 393 rlineto +71 15 rlineto +0 28 rlineto +-256 0 rlineto +0 -28 rlineto +79 -15 rlineto +0 -381 rlineto +0 -53 -26 -82 rquadto +-25 -31 -79 -31 rquadto +-56 0 -140 18 rquadto +0 476 rlineto +81 15 rlineto +0 28 rlineto +-257 0 rlineto +0 -28 rlineto +71 -15 rlineto +0 -507 rlineto +-71 -17 rlineto +0 -28 rlineto +170 0 rlineto +6 48 rlineto +} def +/P$3l { +0 -137 -40 -198 rquadto +-39 -62 -123 -62 rquadto +-84 0 -121 59 rquadto +-35 59 -35 201 rquadto +0 143 37 204 rquadto +37 59 120 59 rquadto +82 0 123 -62 rquadto +40 -62 40 -201 rquadto +closepath +} def +/P$12 { +-220 -515 rlineto +-37 -14 rlineto +0 -39 rlineto +281 0 rlineto +0 39 rlineto +-65 15 rlineto +129 304 rlineto +115 -306 rlineto +-65 -14 rlineto +0 -39 rlineto +181 0 rlineto +0 39 rlineto +-40 12 rlineto +-217 534 rlineto +-37 95 -65 137 rquadto +-28 43 -62 65 rquadto +-34 21 -78 21 rquadto +-46 0 -96 -10 rquadto +0 -142 rlineto +35 0 rlineto +25 73 rlineto +17 14 42 14 rquadto +23 0 39 -10 rquadto +17 -10 32 -31 rquadto +15 -18 28 -48 rquadto +14 -28 39 -85 rquadto +} def +/P$2c { +0 510 rlineto +-96 0 rlineto +0 -510 rlineto +-81 0 rlineto +0 -70 rlineto +81 0 rlineto +0 -65 rlineto +0 -79 34 -114 rquadto +35 -34 107 -34 rquadto +40 0 68 6 rquadto +0 73 rlineto +-25 -4 -43 -4 rquadto +-37 0 -54 18 rquadto +-15 18 -15 68 rquadto +0 51 rlineto +114 0 rlineto +0 70 rlineto +-114 0 rlineto +} def +/P$o { +57 0 84 -39 rquadto +26 -39 26 -126 rquadto +0 -79 -25 -115 rquadto +-25 -35 -79 -35 rquadto +-67 0 -142 25 rquadto +0 148 32 220 rquadto +34 71 103 71 rquadto +closepath +} def +/P$18 { +112 0 162 59 rquadto +50 59 50 185 rquadto +0 48 rlineto +-289 0 rlineto +0 9 rlineto +0 87 14 125 rquadto +14 35 45 56 rquadto +32 18 87 18 rquadto +51 0 129 -17 rquadto +0 45 rlineto +-31 18 -82 31 rquadto +-51 12 -100 12 rquadto +-135 0 -201 -70 rquadto +-64 -70 -64 -218 rquadto +0 -143 60 -214 rquadto +62 -71 187 -71 rquadto +closepath +} def +/P$u { +-121 0 -121 170 rquadto +0 75 29 110 rquadto +29 34 90 34 rquadto +62 0 126 -25 rquadto +0 -150 -29 -220 rquadto +-29 -70 -95 -70 rquadto +closepath +} def +/P$2f { +0 -70 -20 -121 rquadto +-18 -51 -54 -78 rquadto +-34 -28 -79 -28 rquadto +-73 0 -107 54 rquadto +-32 53 -32 173 rquadto +0 118 31 171 rquadto +31 51 107 51 rquadto +45 0 81 -26 rquadto +35 -26 54 -76 rquadto +20 -51 20 -120 rquadto +} def +/P$3c { +0 -142 -26 -204 rquadto +-26 -62 -85 -62 rquadto +-56 0 -81 59 rquadto +-25 59 -25 207 rquadto +0 148 25 209 rquadto +25 60 81 60 rquadto +57 0 84 -62 rquadto +28 -64 28 -207 rquadto +closepath +} def +/P$g { +0 -157 -29 -226 rquadto +-29 -70 -95 -70 rquadto +-62 0 -90 65 rquadto +-28 65 -28 231 rquadto +0 165 28 234 rquadto +28 67 90 67 rquadto +64 0 93 -70 rquadto +31 -71 31 -231 rquadto +closepath +} def +/P$1z { +-67 0 -104 -42 rquadto +-35 -40 -35 -115 rquadto +0 -193 rlineto +0 -62 -28 -92 rquadto +-28 -31 -87 -34 rquadto +0 -68 rlineto +57 -1 85 -32 rquadto +29 -31 29 -93 rquadto +0 -193 rlineto +0 -76 34 -117 rquadto +35 -40 106 -40 rquadto +73 0 rlineto +0 68 rlineto +-34 0 rlineto +-48 0 -70 29 rquadto +-20 28 -20 85 rquadto +0 190 rlineto +0 51 -28 89 rquadto +-28 35 -75 46 rquadto +0 1 rlineto +46 10 75 48 rquadto +28 35 28 87 rquadto +0 192 rlineto +0 56 20 85 rquadto +21 29 70 29 rquadto +34 0 rlineto +0 68 rlineto +-73 0 rlineto +} def +/P$p { +-32 0 rlineto +0 -154 rlineto +406 0 rlineto +0 37 rlineto +-292 617 rlineto +-64 0 rlineto +287 -579 rlineto +-287 0 rlineto +-17 79 rlineto +closepath +} def +/P$3i { +-73 23 -153 40 rquadto +-79 15 -171 15 rquadto +-206 0 -321 -110 rquadto +-115 -112 -115 -317 rquadto +0 -223 112 -334 rquadto +112 -110 328 -110 rquadto +154 0 298 37 rquadto +0 182 rlineto +-42 0 rlineto +-17 -104 rlineto +-43 -31 -104 -46 rquadto +-60 -17 -129 -17 rquadto +-162 0 -237 96 rquadto +-75 96 -75 295 rquadto +0 187 76 284 rquadto +78 96 229 96 rquadto +53 0 110 -12 rquadto +59 -12 90 -31 rquadto +0 -242 rlineto +-109 -15 rlineto +0 -34 rlineto +314 0 rlineto +0 34 rlineto +-82 15 rlineto +0 278 rlineto +} def +/P$2q { +50 0 70 -29 rquadto +21 -29 21 -85 rquadto +0 -192 rlineto +0 -53 28 -89 rquadto +28 -35 75 -46 rquadto +0 -1 rlineto +-45 -10 -75 -46 rquadto +-28 -35 -28 -89 rquadto +0 -190 rlineto +0 -57 -21 -85 rquadto +-20 -29 -70 -29 rquadto +-31 0 rlineto +0 -68 rlineto +70 0 rlineto +70 0 106 40 rquadto +35 40 35 117 rquadto +0 193 rlineto +0 62 28 93 rquadto +28 31 87 32 rquadto +0 68 rlineto +-59 1 -87 32 rquadto +-28 31 -28 93 rquadto +0 193 rlineto +0 75 -37 115 rquadto +-35 42 -104 42 rquadto +-70 0 rlineto +0 -68 rlineto +31 0 rlineto +} def +/P$2g { +0 -184 98 -285 rquadto +100 -101 278 -101 rquadto +126 0 204 43 rquadto +78 42 120 135 rquadto +-96 28 rlineto +-32 -64 -89 -93 rquadto +-56 -29 -140 -29 rquadto +-131 0 -201 79 rquadto +-68 78 -68 223 rquadto +0 142 73 226 rquadto +73 82 203 82 rquadto +75 0 139 -21 rquadto +64 -23 104 -62 rquadto +0 -135 rlineto +-226 0 rlineto +0 -85 rlineto +320 0 rlineto +0 260 rlineto +-59 60 -146 95 rquadto +-87 32 -190 32 rquadto +-117 0 -203 -46 rquadto +-85 -48 -132 -135 rquadto +-45 -89 -45 -209 rquadto +} def +/P$24 { +-114 0 rlineto +-212 -581 rlineto +103 0 rlineto +128 378 rlineto +7 21 37 128 rquadto +18 -64 rlineto +20 -62 rlineto +132 -379 rlineto +103 0 rlineto +-217 581 rlineto +} def +/P$2y { +0 304 -214 304 rquadto +-134 0 -179 -101 rquadto +-3 0 rlineto +1 4 1 92 rquadto +0 226 rlineto +-96 0 rlineto +0 -690 rlineto +0 -89 -3 -118 rquadto +93 0 rlineto +1 1 1 15 rquadto +1 12 3 40 rquadto +1 26 1 37 rquadto +1 0 rlineto +26 -54 68 -78 rquadto +42 -25 110 -25 rquadto +107 0 160 71 rquadto +53 71 53 225 rquadto +closepath +} def +/P$37 { +-65 0 -101 54 rquadto +-35 53 -35 156 rquadto +256 0 rlineto +0 -112 -29 -160 rquadto +-29 -50 -89 -50 rquadto +} def +/P$11 { +62 -70 112 -101 rquadto +51 -31 92 -31 rquadto +31 0 rlineto +0 201 rlineto +-32 0 rlineto +-34 -73 rlineto +-35 0 -82 15 rquadto +-46 15 -82 37 rquadto +0 334 rlineto +87 14 rlineto +0 39 rlineto +-328 0 rlineto +0 -39 rlineto +70 -14 rlineto +0 -445 rlineto +-70 -14 rlineto +0 -39 rlineto +231 0 rlineto +6 115 rlineto +} def +/P$3e { +0 -178 -96 -270 rquadto +-95 -92 -275 -92 rquadto +-114 0 rlineto +0 734 rlineto +76 4 181 4 rquadto +156 0 229 -92 rquadto +75 -92 75 -284 rquadto +closepath +} def +/P$2n { +-92 0 -162 -32 rquadto +-68 -34 -107 -98 rquadto +-37 -65 -37 -154 rquadto +0 -481 rlineto +103 0 rlineto +0 471 rlineto +0 104 51 159 rquadto +53 53 153 53 rquadto +101 0 157 -56 rquadto +57 -56 57 -162 rquadto +0 -465 rlineto +101 0 rlineto +0 471 rlineto +0 92 -39 159 rquadto +-39 65 -110 101 rquadto +-70 34 -167 34 rquadto +} def +/P$2s { +53 0 93 -23 rquadto +42 -23 65 -65 rquadto +25 -42 25 -87 rquadto +0 -48 rlineto +-106 3 rlineto +-67 0 -103 14 rquadto +-34 12 -53 39 rquadto +-18 26 -18 70 rquadto +0 46 25 73 rquadto +25 25 71 25 rquadto +closepath +} def +/P$i { +-401 0 rlineto +0 -71 rlineto +90 -82 rlineto +87 -76 128 -123 rquadto +42 -46 59 -96 rquadto +18 -51 18 -115 rquadto +0 -64 -29 -96 rquadto +-28 -34 -93 -34 rquadto +-26 0 -54 7 rquadto +-26 7 -46 18 rquadto +-17 79 rlineto +-32 0 rlineto +0 -125 rlineto +89 -21 151 -21 rquadto +107 0 160 45 rquadto +54 43 54 126 rquadto +0 54 -21 103 rquadto +-21 48 -65 96 rquadto +-43 46 -145 134 rquadto +-43 35 -92 81 rquadto +337 0 rlineto +0 75 rlineto +closepath +} def +/P$1h { +0 117 35 173 rquadto +35 54 109 54 rquadto +51 0 85 -28 rquadto +35 -28 43 -85 rquadto +96 6 rlineto +-10 84 -71 134 rquadto +-59 50 -151 50 rquadto +-121 0 -185 -76 rquadto +-64 -78 -64 -225 rquadto +0 -146 64 -223 rquadto +64 -78 184 -78 rquadto +89 0 148 46 rquadto +59 45 73 126 rquadto +-98 7 rlineto +-7 -48 -39 -76 rquadto +-29 -28 -85 -28 rquadto +-76 0 -110 51 rquadto +-34 50 -34 170 rquadto +} def +/P$2x { +-301 -365 rlineto +-100 75 rlineto +0 290 rlineto +-101 0 rlineto +0 -756 rlineto +101 0 rlineto +0 378 rlineto +365 -378 rlineto +120 0 rlineto +-321 328 rlineto +365 428 rlineto +-128 0 rlineto +} def +/P$2h { +0 -504 rlineto +0 -84 4 -160 rquadto +-26 95 -48 150 rquadto +-195 515 rlineto +-71 0 rlineto +-198 -515 rlineto +-29 -90 rlineto +-17 -59 rlineto +1 59 rlineto +1 101 rlineto +0 504 rlineto +-90 0 rlineto +0 -756 rlineto +134 0 rlineto +201 523 rlineto +10 32 20 68 rquadto +10 35 14 51 rquadto +3 -20 17 -64 rquadto +14 -43 18 -56 rquadto +196 -523 rlineto +132 0 rlineto +0 756 rlineto +-92 0 rlineto +} def +/P$39 { +120 12 rlineto +0 23 rlineto +-315 0 rlineto +0 -23 rlineto +120 -12 rlineto +0 -479 rlineto +-118 42 rlineto +0 -23 rlineto +171 -96 rlineto +21 0 rlineto +0 557 rlineto +} def +/P$3a { +0 306 -193 306 rquadto +-92 0 -140 -78 rquadto +-46 -79 -46 -228 rquadto +0 -146 46 -223 rquadto +48 -78 145 -78 rquadto +92 0 140 76 rquadto +48 76 48 225 rquadto +closepath +} def +/P$3d { +-360 0 rlineto +0 -64 rlineto +82 -75 rlineto +78 -68 114 -110 rquadto +37 -43 53 -89 rquadto +17 -45 17 -103 rquadto +0 -57 -26 -87 rquadto +-25 -29 -84 -29 rquadto +-23 0 -48 6 rquadto +-25 6 -43 17 rquadto +-14 71 rlineto +-29 0 rlineto +0 -112 rlineto +79 -18 135 -18 rquadto +96 0 145 40 rquadto +48 39 48 112 rquadto +0 50 -20 93 rquadto +-18 43 -57 87 rquadto +-39 42 -131 120 rquadto +-39 32 -82 73 rquadto +303 0 rlineto +0 67 rlineto +} def +/P$15 { +0 -182 -20 -262 rquadto +-20 -79 -64 -79 rquadto +-43 0 -62 78 rquadto +-18 76 -18 264 rquadto +0 192 18 271 rquadto +18 78 62 78 rquadto +42 0 62 -81 rquadto +21 -81 21 -268 rquadto +} def +/P$d { +-64 3 rlineto +-65 1 -89 25 rquadto +-23 21 -23 76 rquadto +0 85 70 85 rquadto +32 0 56 -7 rquadto +25 -7 50 -18 rquadto +0 -164 rlineto +closepath +} def +/P$c { +75 0 110 31 rquadto +35 29 35 93 rquadto +0 309 rlineto +56 12 rlineto +0 21 rlineto +-125 0 rlineto +-9 -45 rlineto +-56 54 -142 54 rquadto +-117 0 -117 -135 rquadto +0 -46 17 -76 rquadto +17 -29 56 -45 rquadto +39 -15 114 -17 rquadto +68 -3 rlineto +0 -71 rlineto +0 -46 -17 -68 rquadto +-17 -23 -53 -23 rquadto +-50 0 -90 23 rquadto +-15 57 rlineto +-28 0 rlineto +0 -100 rlineto +79 -17 139 -17 rquadto +closepath +} def +/P$1k { +-7 -92 -46 -134 rquadto +-37 -42 -110 -42 rquadto +-70 0 -110 46 rquadto +-40 46 -43 129 rquadto +312 0 rlineto +} def +/P$16 { +0 107 -76 167 rquadto +-76 59 -214 59 rquadto +-109 0 -217 -25 rquadto +-6 -189 rlineto +53 0 rlineto +31 125 rlineto +51 29 106 29 rquadto +71 0 110 -45 rquadto +40 -46 40 -128 rquadto +0 -70 -32 -107 rquadto +-31 -37 -103 -42 rquadto +-68 -4 rlineto +0 -70 rlineto +65 -4 rlineto +53 -4 78 -39 rquadto +25 -34 25 -104 rquadto +0 -65 -29 -103 rquadto +-29 -37 -84 -37 rquadto +-31 0 -51 9 rquadto +-20 9 -39 20 rquadto +-25 114 rlineto +-51 0 rlineto +0 -178 rlineto +60 -15 103 -20 rquadto +43 -6 85 -6 rquadto +264 0 264 193 rquadto +0 79 -42 129 rquadto +-42 48 -120 60 rquadto +198 23 198 196 rquadto +closepath +} def +/P$2v { +0 -98 rlineto +89 0 rlineto +0 98 rlineto +-89 0 rlineto +} def +/P$3o { +0 89 -56 134 rquadto +-56 45 -165 45 rquadto +-45 0 -100 -9 rquadto +-53 -9 -82 -20 rquadto +0 -146 rlineto +28 0 rlineto +31 82 rlineto +48 43 123 43 rquadto +123 0 123 -104 rquadto +0 -78 -96 -110 rquadto +-56 -18 rlineto +-64 -20 -93 -42 rquadto +-29 -21 -45 -53 rquadto +-15 -31 -15 -76 rquadto +0 -78 53 -123 rquadto +54 -45 145 -45 rquadto +65 0 164 20 rquadto +0 129 rlineto +-29 0 rlineto +-26 -68 rlineto +-34 -31 -106 -31 rquadto +-51 0 -78 26 rquadto +-26 25 -26 68 rquadto +0 35 23 60 rquadto +25 23 75 40 rquadto +92 31 120 46 rquadto +29 14 50 35 rquadto +20 20 31 48 rquadto +10 26 10 67 rquadto +closepath +} def +/P$r { +0 -78 -31 -112 rquadto +-29 -35 -95 -35 rquadto +-64 0 -92 34 rquadto +-28 32 -28 114 rquadto +0 82 28 115 rquadto +29 32 92 32 rquadto +65 0 95 -34 rquadto +31 -34 31 -114 rquadto +closepath +} def +/P$2b { +-4 15 rlineto +-12 43 -39 114 rquadto +-96 248 rlineto +282 0 rlineto +-96 -250 rlineto +-15 -35 -29 -82 rquadto +-15 -45 rlineto +} def +/P$2r { +0 -756 rlineto +101 0 rlineto +0 671 rlineto +382 0 rlineto +0 84 rlineto +-484 0 rlineto +} def +/P$3g { +0 28 -20 48 rquadto +-20 20 -48 20 rquadto +-28 0 -48 -20 rquadto +-20 -20 -20 -48 rquadto +0 -28 20 -48 rquadto +20 -20 48 -20 rquadto +28 0 48 20 rquadto +20 20 20 48 rquadto +closepath +} def +/P$e { +0 87 -60 137 rquadto +-59 50 -170 50 rquadto +-93 0 -176 -20 rquadto +-4 -137 rlineto +31 0 rlineto +21 90 rlineto +20 10 54 18 rquadto +34 7 65 7 rquadto +76 0 112 -34 rquadto +37 -35 37 -117 rquadto +0 -64 -34 -96 rquadto +-34 -34 -104 -37 rquadto +-70 -4 rlineto +0 -40 rlineto +70 -3 rlineto +54 -3 81 -34 rquadto +26 -31 26 -95 rquadto +0 -65 -28 -95 rquadto +-28 -31 -90 -31 rquadto +-26 0 -54 7 rquadto +-28 7 -50 18 rquadto +-17 79 rlineto +-32 0 rlineto +0 -125 rlineto +48 -12 82 -17 rquadto +35 -4 71 -4 rquadto +209 0 209 160 rquadto +0 68 -37 109 rquadto +-37 39 -106 50 rquadto +89 9 131 50 rquadto +42 40 42 114 rquadto +} def +/P$22 { +0 368 rlineto +0 57 10 89 rquadto +10 31 35 45 rquadto +25 14 73 14 rquadto +68 0 109 -46 rquadto +40 -48 40 -132 rquadto +0 -337 rlineto +96 0 rlineto +0 457 rlineto +0 101 3 123 rquadto +-92 0 rlineto +0 -3 -1 -14 rquadto +0 -12 -1 -26 rquadto +0 -15 0 -59 rquadto +-1 0 rlineto +-34 60 -78 85 rquadto +-43 25 -107 25 rquadto +-96 0 -140 -46 rquadto +-43 -48 -43 -157 rquadto +0 -387 rlineto +96 0 rlineto +} def +/P$5 { +-25 0 rlineto +-170 -451 rlineto +-173 451 rlineto +-26 0 rlineto +-217 -631 rlineto +-56 -14 rlineto +0 -25 rlineto +250 0 rlineto +0 25 rlineto +-96 14 rlineto +156 460 rlineto +176 -454 rlineto +21 0 rlineto +168 454 rlineto +148 -460 rlineto +-101 -14 rlineto +0 -25 rlineto +217 0 rlineto +0 25 rlineto +-57 14 rlineto +-214 631 rlineto +closepath +} def +/P$1m { +-26 56 -71 81 rquadto +-43 23 -109 23 rquadto +-109 0 -160 -73 rquadto +-51 -75 -51 -225 rquadto +0 -304 212 -304 rquadto +67 0 110 25 rquadto +43 23 70 76 rquadto +1 0 rlineto +-1 -65 rlineto +0 -240 rlineto +96 0 rlineto +0 676 rlineto +0 90 3 120 rquadto +-92 0 rlineto +-1 -9 -3 -39 rquadto +-1 -31 -1 -54 rquadto +-3 0 rlineto +closepath +} def +/P$3j { +0 160 rlineto +-28 0 rlineto +-35 -70 rlineto +-32 0 -76 9 rquadto +-42 7 -75 21 rquadto +0 446 rlineto +103 15 rlineto +0 28 rlineto +-282 0 rlineto +0 -28 rlineto +75 -15 rlineto +0 -507 rlineto +-75 -17 rlineto +0 -28 rlineto +173 0 rlineto +6 75 rlineto +37 -32 101 -60 rquadto +65 -29 104 -29 rquadto +9 0 rlineto +} def +/P$q { +0 53 -26 90 rquadto +-26 37 -70 57 rquadto +56 20 85 64 rquadto +31 43 31 106 rquadto +0 92 -53 139 rquadto +-51 46 -162 46 rquadto +-209 0 -209 -185 rquadto +0 -65 31 -107 rquadto +31 -42 84 -62 rquadto +-42 -20 -68 -56 rquadto +-26 -37 -26 -92 rquadto +0 -81 50 -125 rquadto +50 -45 143 -45 rquadto +90 0 140 45 rquadto +50 43 50 125 rquadto +closepath +} def +/P$1l { +0 -368 rlineto +0 -57 -12 -89 rquadto +-10 -31 -35 -45 rquadto +-23 -14 -71 -14 rquadto +-70 0 -110 48 rquadto +-39 46 -39 131 rquadto +0 337 rlineto +-96 0 rlineto +0 -457 rlineto +0 -101 -3 -123 rquadto +90 0 rlineto +1 3 1 15 rquadto +0 10 0 26 rquadto +1 14 3 57 rquadto +1 0 rlineto +32 -60 76 -85 rquadto +43 -25 109 -25 rquadto +95 0 139 48 rquadto +45 46 45 156 rquadto +0 387 rlineto +-96 0 rlineto +} def +/P$28 { +0 121 31 175 rquadto +32 51 104 51 rquadto +82 0 118 -56 rquadto +37 -57 37 -176 rquadto +0 -115 -37 -168 rquadto +-35 -54 -117 -54 rquadto +-73 0 -106 54 rquadto +-31 53 -31 175 rquadto +} def +/P$2t { +-192 0 -228 -198 rquadto +100 -17 rlineto +9 62 43 98 rquadto +34 34 84 34 rquadto +56 0 87 -39 rquadto +32 -39 32 -112 rquadto +0 -450 rlineto +-145 0 rlineto +0 -82 rlineto +248 0 rlineto +0 531 rlineto +0 109 -60 173 rquadto +-59 62 -162 62 rquadto +} def +/P$31 { +48 -26 101 -45 rquadto +53 -18 93 -18 rquadto +43 0 81 17 rquadto +37 15 56 51 rquadto +48 -26 114 -46 rquadto +65 -21 109 -21 rquadto +151 0 151 175 rquadto +0 393 rlineto +76 15 rlineto +0 28 rlineto +-270 0 rlineto +0 -28 rlineto +89 -15 rlineto +0 -381 rlineto +0 -109 -101 -109 rquadto +-17 0 -39 3 rquadto +-21 1 -43 4 rquadto +-21 3 -42 7 rquadto +-20 4 -32 6 rquadto +10 34 10 75 rquadto +0 393 rlineto +89 15 rlineto +0 28 rlineto +-282 0 rlineto +0 -28 rlineto +87 -15 rlineto +0 -381 rlineto +0 -53 -26 -81 rquadto +-26 -28 -81 -28 rquadto +-56 0 -139 18 rquadto +0 471 rlineto +90 15 rlineto +0 28 rlineto +-271 0 rlineto +0 -28 rlineto +76 -15 rlineto +0 -507 rlineto +-76 -17 rlineto +0 -28 rlineto +175 0 rlineto +4 48 rlineto +} def +/P$2 { +0 -106 -31 -153 rquadto +-29 -48 -95 -48 rquadto +-64 0 -92 46 rquadto +-28 45 -28 154 rquadto +0 109 28 156 rquadto +29 46 92 46 rquadto +64 0 95 -48 rquadto +31 -48 31 -154 rquadto +closepath +} def +/P$v { +134 12 rlineto +0 26 rlineto +-353 0 rlineto +0 -26 rlineto +134 -12 rlineto +0 -534 rlineto +-131 46 rlineto +0 -25 rlineto +190 -109 rlineto +25 0 rlineto +0 621 rlineto +} def +/P$w { +-101 -15 rlineto +0 -42 rlineto +375 0 rlineto +0 42 rlineto +-89 15 rlineto +0 475 rlineto +0 126 -70 196 rquadto +-70 68 -200 68 rquadto +-43 0 -87 -6 rquadto +-42 -4 -67 -12 rquadto +0 -178 rlineto +53 0 rlineto +17 104 rlineto +10 14 31 21 rquadto +20 7 45 7 rquadto +40 0 67 -28 rquadto +26 -28 26 -84 rquadto +0 -565 rlineto +} def +/P$26 { +0 117 -46 204 rquadto +-45 87 -129 134 rquadto +-82 46 -192 46 rquadto +-282 0 rlineto +0 -756 rlineto +250 0 rlineto +192 0 296 96 rquadto +104 95 104 273 rquadto +closepath +} def +/P$3n { +243 -264 rlineto +-62 -17 rlineto +0 -28 rlineto +210 0 rlineto +0 28 rlineto +-73 15 rlineto +-170 173 rlineto +218 335 rlineto +64 15 rlineto +0 28 rlineto +-243 0 rlineto +0 -28 rlineto +54 -15 rlineto +-164 -257 rlineto +-78 85 rlineto +0 171 rlineto +62 15 rlineto +0 28 rlineto +-243 0 rlineto +0 -28 rlineto +75 -15 rlineto +0 -814 rlineto +-87 -15 rlineto +0 -28 rlineto +193 0 rlineto +0 614 rlineto +} def +/P$17 { +0 276 rlineto +129 17 rlineto +0 42 rlineto +-407 0 rlineto +0 -42 rlineto +93 -17 rlineto +0 -668 rlineto +-101 -15 rlineto +0 -42 rlineto +654 0 rlineto +0 210 rlineto +-54 0 rlineto +-18 -137 rlineto +-28 -4 -95 -6 rquadto +-65 -3 -103 -3 rquadto +-96 0 rlineto +0 321 rlineto +190 0 rlineto +18 -100 rlineto +51 0 rlineto +0 265 rlineto +-51 0 rlineto +-18 -101 rlineto +-190 0 rlineto +} def +/P$2m { +0 82 -62 128 rquadto +-62 43 -173 43 rquadto +-109 0 -168 -35 rquadto +-57 -35 -75 -110 rquadto +84 -17 rlineto +12 46 51 68 rquadto +39 21 107 21 rquadto +73 0 106 -21 rquadto +34 -23 34 -68 rquadto +0 -34 -23 -54 rquadto +-23 -21 -76 -35 rquadto +-68 -18 rlineto +-82 -21 -118 -42 rquadto +-34 -20 -54 -50 rquadto +-20 -29 -20 -73 rquadto +0 -79 56 -120 rquadto +57 -42 165 -42 rquadto +96 0 153 34 rquadto +56 34 71 107 rquadto +-87 10 rlineto +-7 -39 -43 -59 rquadto +-34 -20 -93 -20 rquadto +-65 0 -96 20 rquadto +-29 18 -29 59 rquadto +0 25 12 42 rquadto +12 15 37 26 rquadto +25 10 106 31 rquadto +76 18 110 35 rquadto +34 15 53 35 rquadto +20 20 31 46 rquadto +10 25 10 57 rquadto +} def +/P$1t { +0 -796 rlineto +96 0 rlineto +0 796 rlineto +-96 0 rlineto +} def +/P$27 { +0 -140 -78 -214 rquadto +-76 -75 -221 -75 rquadto +-146 0 rlineto +0 592 rlineto +168 0 rlineto +84 0 146 -35 rquadto +62 -35 96 -104 rquadto +34 -68 34 -162 rquadto +} def +/P$3b { +0 -142 -26 -204 rquadto +-26 -62 -85 -62 rquadto +-56 0 -81 59 rquadto +-25 59 -25 207 rquadto +0 148 25 209 rquadto +25 60 81 60 rquadto +57 0 84 -62 rquadto +28 -64 28 -207 rquadto +} def +/P$2k { +0 304 -214 304 rquadto +-65 0 -109 -23 rquadto +-43 -25 -71 -78 rquadto +0 0 rlineto +0 17 -3 51 rquadto +-1 34 -3 39 rquadto +-93 0 rlineto +3 -29 3 -120 rquadto +0 -676 rlineto +96 0 rlineto +0 226 rlineto +0 35 -1 82 rquadto +1 0 rlineto +28 -56 71 -79 rquadto +43 -25 109 -25 rquadto +110 0 162 75 rquadto +51 73 51 223 rquadto +closepath +} def +/P$1g { +53 0 93 -23 rquadto +42 -23 65 -65 rquadto +25 -42 25 -87 rquadto +0 -48 rlineto +-106 3 rlineto +-67 0 -103 14 rquadto +-34 12 -53 39 rquadto +-18 26 -18 70 rquadto +0 46 25 73 rquadto +25 25 71 25 rquadto +} def +/P$2o { +-196 -314 rlineto +-235 0 rlineto +0 314 rlineto +-101 0 rlineto +0 -756 rlineto +356 0 rlineto +126 0 196 57 rquadto +70 56 70 157 rquadto +0 84 -50 142 rquadto +-48 57 -135 71 rquadto +215 326 rlineto +-118 0 rlineto +closepath +} def +/P$23 { +50 0 70 -29 rquadto +21 -29 21 -85 rquadto +0 -192 rlineto +0 -53 28 -89 rquadto +28 -35 75 -46 rquadto +0 -1 rlineto +-45 -10 -75 -46 rquadto +-28 -35 -28 -89 rquadto +0 -190 rlineto +0 -57 -21 -85 rquadto +-20 -29 -70 -29 rquadto +-31 0 rlineto +0 -68 rlineto +70 0 rlineto +70 0 106 40 rquadto +35 40 35 117 rquadto +0 193 rlineto +0 62 28 93 rquadto +28 31 87 32 rquadto +0 68 rlineto +-59 1 -87 32 rquadto +-28 31 -28 93 rquadto +0 193 rlineto +0 75 -37 115 rquadto +-35 42 -104 42 rquadto +-70 0 rlineto +0 -68 rlineto +31 0 rlineto +closepath +} def +/P$1q { +0 -120 -35 -175 rquadto +-35 -54 -120 -54 rquadto +-84 0 -121 56 rquadto +-37 54 -37 173 rquadto +0 114 35 171 rquadto +37 57 118 57 rquadto +85 0 123 -54 rquadto +37 -56 37 -175 rquadto +} def +/P$z { +39 -20 rlineto +82 -42 148 -42 rquadto +151 0 151 162 rquadto +0 350 rlineto +56 14 rlineto +0 39 rlineto +-275 0 rlineto +0 -39 rlineto +50 -14 rlineto +0 -326 rlineto +0 -50 -21 -76 rquadto +-20 -28 -57 -28 rquadto +-45 0 -89 20 rquadto +0 410 rlineto +50 14 rlineto +0 39 rlineto +-273 0 rlineto +0 -39 rlineto +53 -14 rlineto +0 -445 rlineto +-53 -14 rlineto +0 -39 rlineto +214 0 rlineto +7 48 rlineto +} def +/P$25 { +0 -154 48 -278 rquadto +48 -123 150 -232 rquadto +92 0 rlineto +-100 110 -146 237 rquadto +-46 125 -46 275 rquadto +0 148 45 273 rquadto +46 125 148 239 rquadto +-92 0 rlineto +-101 -109 -150 -232 rquadto +-48 -125 -48 -279 rquadto +0 -1 rlineto +} def +/P$3 { +0 -26 rlineto +104 -12 rlineto +0 -573 rlineto +-25 0 rlineto +-123 0 -168 9 rquadto +-12 101 rlineto +-32 0 rlineto +0 -153 rlineto +575 0 rlineto +0 153 rlineto +-32 0 rlineto +-12 -101 rlineto +-15 -3 -65 -6 rquadto +-48 -3 -106 -3 rquadto +-25 0 rlineto +0 573 rlineto +104 12 rlineto +0 26 rlineto +-303 0 rlineto +} def +/P$3h { +101 15 rlineto +0 28 rlineto +-309 0 rlineto +0 -28 rlineto +101 -15 rlineto +0 -507 rlineto +-84 -17 rlineto +0 -28 rlineto +190 0 rlineto +0 553 rlineto +} def +/P$t { +0 -98 54 -153 rquadto +54 -54 156 -54 rquadto +110 0 162 81 rquadto +53 79 53 251 rquadto +0 165 -67 253 rquadto +-67 85 -187 85 rquadto +-79 0 -146 -15 rquadto +0 -114 rlineto +32 0 rlineto +15 70 rlineto +15 7 42 14 rquadto +26 4 53 4 rquadto +78 0 120 -68 rquadto +42 -68 46 -201 rquadto +-75 42 -151 42 rquadto +-85 0 -135 -51 rquadto +-48 -51 -48 -143 rquadto +closepath +} def +/P$32 { +96 0 142 40 rquadto +46 39 46 121 rquadto +0 403 rlineto +75 15 rlineto +0 28 rlineto +-164 0 rlineto +-12 -59 rlineto +-71 71 -184 71 rquadto +-153 0 -153 -178 rquadto +0 -59 23 -98 rquadto +23 -39 73 -59 rquadto +51 -20 148 -21 rquadto +89 -3 rlineto +0 -93 rlineto +0 -60 -23 -90 rquadto +-21 -29 -68 -29 rquadto +-64 0 -115 31 rquadto +-21 73 rlineto +-35 0 rlineto +0 -129 rlineto +103 -21 181 -21 rquadto +closepath +} def +/P$1f { +-87 0 -131 -45 rquadto +-43 -46 -43 -128 rquadto +0 -90 59 -137 rquadto +59 -48 190 -53 rquadto +131 -1 rlineto +0 -31 rlineto +0 -71 -31 -101 rquadto +-29 -31 -93 -31 rquadto +-64 0 -93 21 rquadto +-29 21 -35 70 rquadto +-101 -7 rlineto +25 -157 234 -157 rquadto +109 0 164 50 rquadto +56 50 56 145 rquadto +0 250 rlineto +0 43 10 65 rquadto +10 21 42 21 rquadto +14 0 32 -4 rquadto +0 60 rlineto +-37 7 -75 7 rquadto +-54 0 -79 -28 rquadto +-23 -28 -26 -87 rquadto +-3 0 rlineto +-37 65 -87 93 rquadto +-48 28 -118 28 rquadto +closepath +} def +/P$14 { +0 409 -257 409 rquadto +-125 0 -189 -104 rquadto +-62 -104 -62 -304 rquadto +0 -193 62 -296 rquadto +64 -104 193 -104 rquadto +123 0 187 103 rquadto +65 101 65 298 rquadto +closepath +} def +/P$36 { +0 10 rlineto +0 87 18 135 rquadto +18 48 59 75 rquadto +40 25 106 25 rquadto +34 0 81 -4 rquadto +46 -6 76 -14 rquadto +0 35 rlineto +-29 18 -82 34 rquadto +-51 14 -106 14 rquadto +-139 0 -203 -75 rquadto +-64 -75 -64 -240 rquadto +0 -156 64 -232 rquadto +65 -76 187 -76 rquadto +228 0 228 260 rquadto +0 51 rlineto +-365 0 rlineto +closepath +} def +/P$y { +-50 1 rlineto +-56 3 -78 31 rquadto +-21 26 -21 87 rquadto +0 50 17 73 rquadto +17 23 45 23 rquadto +40 0 87 -20 rquadto +0 -196 rlineto +} def +/P$1x { +0 -92 rlineto +96 0 rlineto +0 92 rlineto +-96 0 rlineto +closepath +} def +/P$3k { +0 314 -278 314 rquadto +-135 0 -204 -79 rquadto +-67 -81 -67 -234 rquadto +0 -151 67 -231 rquadto +68 -79 209 -79 rquadto +135 0 204 78 rquadto +68 78 68 232 rquadto +closepath +} def +/P$21 { +0 -368 rlineto +0 -84 -23 -115 rquadto +-23 -32 -82 -32 rquadto +-62 0 -98 46 rquadto +-35 46 -35 132 rquadto +0 337 rlineto +-95 0 rlineto +0 -457 rlineto +0 -101 -3 -123 rquadto +90 0 rlineto +1 3 1 15 rquadto +0 10 0 26 rquadto +1 14 3 57 rquadto +1 0 rlineto +31 -62 70 -85 rquadto +40 -25 100 -25 rquadto +65 0 103 26 rquadto +39 26 54 84 rquadto +1 0 rlineto +29 -59 71 -84 rquadto +43 -26 103 -26 rquadto +89 0 128 48 rquadto +40 46 40 156 rquadto +0 387 rlineto +-95 0 rlineto +0 -368 rlineto +0 -84 -23 -115 rquadto +-23 -32 -82 -32 rquadto +-64 0 -100 46 rquadto +-34 46 -34 132 rquadto +0 337 rlineto +-95 0 rlineto +} def +/P$19 { +-34 0 -51 37 rquadto +-17 37 -17 134 rquadto +126 0 rlineto +0 -78 -4 -109 rquadto +-4 -32 -18 -46 rquadto +-12 -15 -34 -15 rquadto +} def +/P$3q { +103 15 rlineto +0 28 rlineto +-309 0 rlineto +0 -28 rlineto +101 -15 rlineto +0 -814 rlineto +-101 -15 rlineto +0 -28 rlineto +206 0 rlineto +0 857 rlineto +} def +/P$1r { +-46 14 -96 14 rquadto +-115 0 -115 -132 rquadto +0 -387 rlineto +-67 0 rlineto +0 -70 rlineto +70 0 rlineto +28 -129 rlineto +65 0 rlineto +0 129 rlineto +106 0 rlineto +0 70 rlineto +-106 0 rlineto +0 367 rlineto +0 42 12 59 rquadto +14 15 48 15 rquadto +18 0 54 -6 rquadto +0 70 rlineto +} def +/P$1o { +-125 0 -195 81 rquadto +-70 81 -70 221 rquadto +0 139 73 223 rquadto +73 84 196 84 rquadto +159 0 239 -157 rquadto +84 42 rlineto +-46 98 -132 150 rquadto +-84 50 -195 50 rquadto +-114 0 -198 -46 rquadto +-82 -48 -126 -135 rquadto +-43 -89 -43 -209 rquadto +0 -181 96 -284 rquadto +98 -103 271 -103 rquadto +120 0 201 48 rquadto +81 46 118 139 rquadto +-96 32 rlineto +-26 -65 -85 -100 rquadto +-57 -35 -137 -35 rquadto +} def +/P$2z { +0 -121 -32 -173 rquadto +-32 -53 -104 -53 rquadto +-56 0 -89 25 rquadto +-32 23 -50 75 rquadto +-17 51 -17 132 rquadto +0 115 35 170 rquadto +37 53 120 53 rquadto +71 0 104 -53 rquadto +32 -53 32 -176 rquadto +} def +/P$6 { +0 9 rlineto +0 67 14 104 rquadto +15 37 46 57 rquadto +31 18 81 18 rquadto +26 0 62 -4 rquadto +35 -4 59 -9 rquadto +0 26 rlineto +-23 15 -64 26 rquadto +-39 10 -81 10 rquadto +-107 0 -157 -57 rquadto +-48 -57 -48 -184 rquadto +0 -120 50 -179 rquadto +50 -59 143 -59 rquadto +176 0 176 201 rquadto +0 39 rlineto +-282 0 rlineto +closepath +} def +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3720 2533 moveto +P$0 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4662 2302 moveto +P$1 +4573 2302 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11603 2533 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12203 2402 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20020 2549 moveto +P$5 +20376 2302 moveto +P$6 +20482 2100 moveto +P$7 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27603 2533 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28209 2038 moveto +P$8 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +35757 2239 moveto +P$9 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36475 2061 moveto +P$a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +43567 2357 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44326 2064 moveto +P$c +44392 2299 moveto +P$d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +51517 2357 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52203 2402 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +59720 2533 moveto +P$0 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60662 2302 moveto +P$1 +60573 2302 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +67603 2533 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +68203 2402 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76020 2549 moveto +P$5 +76376 2302 moveto +P$6 +76482 2100 moveto +P$7 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83603 2533 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84209 2038 moveto +P$8 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91757 2239 moveto +P$9 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92475 2061 moveto +P$a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +99567 2357 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100326 2064 moveto +P$c +100392 2299 moveto +P$d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3960 3555 moveto +P$e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4462 3403 moveto +P$f +4371 3403 moveto +P$g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11960 3555 moveto +P$e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12306 3694 moveto +P$h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20056 3694 moveto +P$h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28195 3733 moveto +P$i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36210 3555 moveto +P$j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44145 3589 moveto +P$k +44060 3189 moveto +P$l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +51987 3350 moveto +P$m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60220 3530 moveto +P$n +60018 3705 moveto +P$o +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +67848 3233 moveto +P$p +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76192 3238 moveto +P$q +76123 3557 moveto +P$r +76104 3238 moveto +P$s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83782 3278 moveto +P$t +83993 3110 moveto +P$u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91806 3694 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92462 3403 moveto +P$f +92371 3403 moveto +P$g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +99806 3694 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100306 3694 moveto +P$h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4793 392 moveto +P$w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5420 557 moveto +P$x +5457 843 moveto +P$y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5954 617 moveto +P$z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +6812 1071 moveto +P$10 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7420 557 moveto +P$x +7457 843 moveto +P$y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7970 684 moveto +P$11 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +8470 1137 moveto +P$12 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +9648 1120 moveto +P$13 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10254 723 moveto +P$14 +10082 723 moveto +P$15 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10848 1120 moveto +P$13 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11459 906 moveto +P$16 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +56556 784 moveto +P$17 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +57239 556 moveto +P$18 +57232 615 moveto +P$19 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +57896 829 moveto +P$1a +57521 339 moveto +P$1b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +58420 684 moveto +P$11 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +59062 1071 moveto +P$10 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +59670 557 moveto +P$x +59707 843 moveto +P$y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60220 684 moveto +P$11 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60720 1137 moveto +P$12 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +61898 1120 moveto +P$13 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +62504 723 moveto +P$14 +62332 723 moveto +P$15 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +63098 1120 moveto +P$13 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +63709 906 moveto +P$16 +fill +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +0 4100 moveto +0 40843 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +8000 4100 moveto +0 40843 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +16000 4100 moveto +0 40843 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +24000 4100 moveto +0 40843 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +32000 4100 moveto +0 40843 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +40000 4100 moveto +0 40843 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +48000 4100 moveto +0 40843 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +56000 4100 moveto +0 40843 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +64000 4100 moveto +0 40843 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +72000 4100 moveto +0 40843 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +80000 4100 moveto +0 40843 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +88000 4100 moveto +0 40843 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +96000 4100 moveto +0 40843 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +104000 4100 moveto +0 40843 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +0 4100 moveto +104000 0 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +0 44943 moveto +104000 0 rlineto +stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +12000 8829 moveto +0 1032 rlineto +stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +12000 9862 moveto +3900 0 rlineto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +15500 9462 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +15500 9462 lineto +closepath eofill +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +15500 9462 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +15500 9462 lineto +closepath stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +4000 13824 moveto +0 1032 rlineto +stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +4000 14856 moveto +3900 0 rlineto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +7500 14456 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +7500 14456 lineto +closepath eofill +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +7500 14456 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +7500 14456 lineto +closepath stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +12000 8829 moveto +0 2697 rlineto +stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +12000 11527 moveto +3900 0 rlineto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +15500 11127 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +15500 11127 lineto +closepath eofill +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +15500 11127 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +15500 11127 lineto +closepath stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +36000 15489 moveto +0 2697 rlineto +stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +36000 18186 moveto +3900 0 rlineto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +39500 17786 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +39500 17786 lineto +closepath eofill +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +39500 17786 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +39500 17786 lineto +closepath stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +36000 15489 moveto +0 1032 rlineto +stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +36000 16521 moveto +3900 0 rlineto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +39500 16121 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +39500 16121 lineto +closepath eofill +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +39500 16121 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +39500 16121 lineto +closepath stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +68000 18819 moveto +0 1032 rlineto +stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +68000 19851 moveto +3900 0 rlineto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +71500 19451 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +71500 19451 lineto +closepath eofill +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +71500 19451 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +71500 19451 lineto +closepath stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +68000 18819 moveto +0 2697 rlineto +stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +68000 21516 moveto +3900 0 rlineto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +71500 21116 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +71500 21116 lineto +closepath eofill +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +71500 21116 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +71500 21116 lineto +closepath stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +68000 18819 moveto +0 9292 rlineto +stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +68000 28111 moveto +3900 0 rlineto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +71500 27711 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +71500 27711 lineto +closepath eofill +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +71500 27711 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +71500 27711 lineto +closepath stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +0 5732 moveto +500 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +5800 5732 moveto +98100 0 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +15600 1264 200 7564 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +200 7564 moveto +15600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +200 8829 moveto +15600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +200 7564 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +15800 7564 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +15600 1264 16200 9229 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +16200 9229 moveto +15600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +16200 10494 moveto +15600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +16200 9229 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +31800 9229 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +31600 1264 16200 10894 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +16200 10894 moveto +31600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +16200 12159 moveto +31600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +16200 10894 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +47800 10894 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +7600 1264 200 12559 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +200 12559 moveto +7600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +200 13824 moveto +7600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +200 12559 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +7800 12559 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +31600 1264 8200 14224 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +8200 14224 moveto +31600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +8200 15489 moveto +31600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +8200 14224 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +39800 14224 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +23600 1264 40200 15889 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +40200 15889 moveto +23600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +40200 17154 moveto +23600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +40200 15889 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +63800 15889 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +31600 1264 40200 17554 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +40200 17554 moveto +31600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +40200 18819 moveto +31600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +40200 17554 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +71800 17554 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +31600 1264 72200 19219 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +72200 19219 moveto +31600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +72200 20484 moveto +31600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +72200 19219 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +103800 19219 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +15600 1264 72200 20884 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +72200 20884 moveto +15600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +72200 22148 moveto +15600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +72200 20884 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +87800 20884 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +0 23981 moveto +500 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +5900 23981 moveto +98000 0 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +39600 1264 200 25813 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +200 25813 moveto +39600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +200 27078 moveto +39600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +200 25813 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +39800 25813 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +15600 1264 72200 27478 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +72200 27478 moveto +15600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +72200 28743 moveto +15600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +72200 27478 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +87800 27478 moveto +0 1264 rlineto +stroke +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1675 5919 moveto +P$1c +1528 5570 moveto +P$1d +1571 5909 moveto +P$1e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1921 6142 moveto +P$1f +1943 6069 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2448 5838 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3339 6131 moveto +P$1i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3648 5861 moveto +P$1j +3962 5788 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4543 6131 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5140 6038 moveto +P$1m +4848 5841 moveto +P$1n +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1025 7912 moveto +P$1o +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1965 8306 moveto +P$1p +1864 8306 moveto +P$1q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2443 8596 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2896 8591 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2976 8596 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3865 8306 moveto +P$1p +3764 8306 moveto +P$1q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3973 8596 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4173 8596 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4448 8326 moveto +P$1j +4762 8252 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4976 8596 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5348 8346 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +6382 8387 moveto +P$1v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +6548 8302 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7170 8115 moveto +P$1w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7673 7891 moveto +P$1x +7673 8596 moveto +P$1y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7948 8302 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +8570 8115 moveto +P$1w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +9296 8591 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +9875 8824 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10101 8596 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10712 8596 moveto +P$21 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11612 8596 moveto +P$21 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12321 8607 moveto +P$1f +12343 8534 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +13143 8596 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +13468 8015 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +14048 8326 moveto +P$1j +14362 8252 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +14573 8596 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +14750 8756 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +32882 10052 moveto +P$1v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +33048 9991 moveto +P$1j +33362 9917 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +33576 10261 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +34229 10261 moveto +P$24 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +34573 9556 moveto +P$1x +34573 10261 moveto +P$1y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +34848 9967 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +35448 9991 moveto +P$1j +35762 9917 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +35948 10011 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36982 10052 moveto +P$1v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +37148 9967 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +37770 9780 moveto +P$1w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +38273 9556 moveto +P$1x +38273 10261 moveto +P$1y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +38548 9967 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +39170 9780 moveto +P$1w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +39896 10256 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +40268 9975 moveto +P$25 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +41342 9875 moveto +P$26 +41239 9875 moveto +P$27 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +41621 10272 moveto +P$1f +41643 10199 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +42296 10256 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +42448 9991 moveto +P$1j +42762 9917 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +43343 10261 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44240 10167 moveto +P$1m +43948 9970 moveto +P$28 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44568 9680 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +45076 10261 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +45548 9967 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +46170 9780 moveto +P$1w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +46676 10261 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +47148 9991 moveto +P$1j +47462 9917 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +47673 9556 moveto +P$1x +47673 10261 moveto +P$1y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +47948 9967 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +48570 9780 moveto +P$1w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +49148 9991 moveto +P$1j +49462 9917 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +50043 10261 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +50498 9977 moveto +P$29 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +51175 10489 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52042 9875 moveto +P$26 +51939 9875 moveto +P$27 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52321 10272 moveto +P$1f +52343 10199 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +53143 10261 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +53373 9556 moveto +P$1x +53373 10261 moveto +P$1y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +53648 9991 moveto +P$1j +53962 9917 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +54173 10261 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +54350 10420 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +17226 11926 moveto +P$2a +16967 11246 moveto +P$2b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +17468 11345 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +18196 11921 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +18370 11445 moveto +P$1w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +18948 11656 moveto +P$1j +19262 11582 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +19843 11926 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20296 11921 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20373 11221 moveto +P$1x +20373 11926 moveto +P$1y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20693 11415 moveto +P$2c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20873 11221 moveto +P$1x +20873 11926 moveto +P$1y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +21045 11926 moveto +P$2d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +21673 11221 moveto +P$1x +21673 11926 moveto +P$1y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +21948 11656 moveto +P$1j +22262 11582 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +22476 11926 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +22968 11345 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +23843 11926 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +24293 12154 moveto +P$2e +24442 11635 moveto +P$2f +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +25175 12154 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +25354 11545 moveto +P$2g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +26348 11656 moveto +P$1j +26662 11582 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +26876 11926 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27765 11635 moveto +P$1p +27664 11635 moveto +P$1q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27850 12085 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +8934 13591 moveto +P$2h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +9665 13300 moveto +P$1p +9564 13300 moveto +P$1q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10140 13497 moveto +P$1m +9848 13300 moveto +P$28 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10448 13321 moveto +P$1j +10762 13247 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10973 13591 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11148 13341 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12175 13061 moveto +P$2i +12071 13063 moveto +P$2j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12421 13602 moveto +P$1f +12443 13528 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +13239 13591 moveto +P$1i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +13548 13321 moveto +P$1j +13862 13247 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +14296 13586 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +14875 13819 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +15742 13205 moveto +P$26 +15639 13205 moveto +P$27 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +16021 13602 moveto +P$1f +16043 13528 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +16843 13591 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +17073 12886 moveto +P$1x +17073 13591 moveto +P$1y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +17348 13321 moveto +P$1j +17662 13247 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +17873 13591 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +18050 13750 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +9342 14870 moveto +P$26 +9239 14870 moveto +P$27 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +9621 15267 moveto +P$1f +9643 15193 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10296 15251 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10448 14985 moveto +P$1j +10762 14912 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11343 15256 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12065 14962 moveto +P$2k +11964 14965 moveto +P$2l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12321 15267 moveto +P$1f +12343 15193 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +13143 15256 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +13739 15256 moveto +P$1i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +14421 15267 moveto +P$1f +14443 15193 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +14968 14675 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +15593 14745 moveto +P$2c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +16210 15095 moveto +P$2m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +16448 14985 moveto +P$1j +16762 14912 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +17196 15251 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +17245 15256 moveto +P$2d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +17948 14985 moveto +P$1j +18262 14912 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +18843 15256 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +19575 15484 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +19801 15256 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20412 15256 moveto +P$21 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +21312 15256 moveto +P$21 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +22021 15267 moveto +P$1f +22043 15193 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +22843 15256 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +23168 14675 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +23748 14985 moveto +P$1j +24062 14912 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +24273 15256 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +24450 15415 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +40992 16932 moveto +P$2n +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +41696 16916 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +41773 16216 moveto +P$1x +41773 16921 moveto +P$1y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +41973 16921 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +42148 16671 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +43175 16391 moveto +P$2i +43071 16393 moveto +P$2j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +43421 16932 moveto +P$1f +43443 16858 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44239 16921 moveto +P$1i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44548 16650 moveto +P$1j +44862 16577 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +45296 16916 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +45668 16635 moveto +P$25 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +46625 16921 moveto +P$2o +46610 16382 moveto +P$2p +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +47482 16711 moveto +P$1v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +48182 16711 moveto +P$1v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +48875 16391 moveto +P$2i +48771 16393 moveto +P$2j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +49121 16932 moveto +P$1f +49143 16858 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +49576 16921 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +50410 16760 moveto +P$2m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +50648 16650 moveto +P$1j +50962 16577 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +51176 16921 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +51798 16636 moveto +P$29 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52475 17149 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +53342 16535 moveto +P$26 +53239 16535 moveto +P$27 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +53621 16932 moveto +P$1f +53643 16858 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +54443 16921 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +54673 16216 moveto +P$1x +54673 16921 moveto +P$1y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +54948 16650 moveto +P$1j +55262 16577 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +55473 16921 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +55650 17080 moveto +P$2q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +56575 17149 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +56790 16921 moveto +P$2r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +57468 16339 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +58339 16921 moveto +P$1i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +58721 16932 moveto +P$1f +58743 16858 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +59610 16760 moveto +P$2m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +59750 17080 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +41342 18200 moveto +P$26 +41239 18200 moveto +P$27 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +41621 18596 moveto +P$1f +41643 18523 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +42296 18581 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +42521 18596 moveto +P$1f +42543 18523 moveto +P$2s +43526 18586 moveto +P$2a +43267 17906 moveto +P$2b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +43748 18292 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44348 18292 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44948 18315 moveto +P$1j +45262 18242 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +45910 18425 moveto +P$2m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +46510 18425 moveto +P$2m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +46648 18336 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +47682 18376 moveto +P$1v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +47848 18292 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +48470 18104 moveto +P$1w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +48973 17881 moveto +P$1x +48973 18586 moveto +P$1y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +49248 18292 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +49870 18104 moveto +P$1w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +50596 18581 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +51175 18814 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +51401 18586 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52012 18586 moveto +P$21 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52912 18586 moveto +P$21 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +53621 18596 moveto +P$1f +53643 18523 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +54443 18586 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +54768 18004 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +55348 18315 moveto +P$1j +55662 18242 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +55873 18586 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +56050 18745 moveto +P$2q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +56975 18814 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +57345 18596 moveto +P$2t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +57868 18004 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +58373 18586 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +58573 17881 moveto +P$1x +58573 18586 moveto +P$1y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +58868 18004 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +59810 18425 moveto +P$2m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +59950 18745 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +73282 20041 moveto +P$1v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +73448 19980 moveto +P$1j +73762 19907 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +73976 20250 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +74629 20250 moveto +P$24 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +74973 19546 moveto +P$1x +74973 20250 moveto +P$1y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +75248 19957 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +75848 19980 moveto +P$1j +76162 19907 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76348 20000 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +77382 20041 moveto +P$1v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +77548 19957 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +78170 19769 moveto +P$1w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +78673 19546 moveto +P$1x +78673 20250 moveto +P$1y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +78948 19957 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +79570 19769 moveto +P$1w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +80296 20246 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +80668 19964 moveto +P$25 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +81054 19869 moveto +P$2g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +82048 19980 moveto +P$1j +82362 19907 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83010 20089 moveto +P$2m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83248 19957 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83870 19769 moveto +P$1w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84521 20261 moveto +P$1f +84543 20188 moveto +P$2s +84662 19596 moveto +P$2u +84450 19596 moveto +P$2v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +85093 19739 moveto +P$2c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +85496 20246 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +86010 20089 moveto +P$2m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +86173 20250 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +86865 19960 moveto +P$1p +86764 19960 moveto +P$1q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +87193 20479 moveto +P$2e +87342 19960 moveto +P$2f +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +87573 19546 moveto +P$1x +87573 20250 moveto +P$1y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +88139 20250 moveto +P$1i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +88598 19966 moveto +P$29 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +89275 20479 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +90142 19864 moveto +P$26 +90039 19864 moveto +P$27 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +90421 20261 moveto +P$1f +90443 20188 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91243 20250 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91473 19546 moveto +P$1x +91473 20250 moveto +P$1y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91748 19980 moveto +P$1j +92062 19907 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92273 20250 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92450 20410 moveto +P$2q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +93375 20479 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +93601 20250 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +94212 20250 moveto +P$21 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +95112 20250 moveto +P$21 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +95821 20261 moveto +P$1f +95843 20188 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +96643 20250 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +96968 19669 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +97548 19980 moveto +P$1j +97862 19907 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +98073 20250 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +98250 20410 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +88592 21926 moveto +P$2n +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +89296 21911 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +89373 21211 moveto +P$1x +89373 21915 moveto +P$1y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +89573 21915 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +89748 21665 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +90775 21386 moveto +P$2i +90671 21387 moveto +P$2j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91021 21926 moveto +P$1f +91043 21853 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91839 21915 moveto +P$1i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92148 21645 moveto +P$1j +92462 21572 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92896 21911 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +93268 21629 moveto +P$25 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +94025 21231 moveto +P$1o +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +94473 21915 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +94748 21645 moveto +P$1j +95062 21572 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +95421 21926 moveto +P$1f +95443 21853 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +96243 21915 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +96825 21231 moveto +P$1o +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +97276 21915 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +98165 21625 moveto +P$1p +98064 21625 moveto +P$1q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +98643 21915 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +99045 21926 moveto +P$2t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +99965 21625 moveto +P$1p +99864 21625 moveto +P$1q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100565 21622 moveto +P$2k +100464 21625 moveto +P$2l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100898 21631 moveto +P$29 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +101575 22143 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +101945 21926 moveto +P$2t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +102468 21334 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +102973 21915 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +103173 21211 moveto +P$1x +103173 21915 moveto +P$1y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +103468 21334 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +104410 21754 moveto +P$2m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +104550 22075 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1192 23707 moveto +P$2w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1776 24380 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2665 24090 moveto +P$1p +2564 24090 moveto +P$1q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3143 24380 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3596 24376 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3748 24110 moveto +P$1j +4062 24036 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4643 24380 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5240 24286 moveto +P$1m +4948 24090 moveto +P$1n +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1193 26845 moveto +P$2x +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1865 26554 moveto +P$1p +1764 26554 moveto +P$1q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2312 26845 moveto +P$21 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3365 26551 moveto +P$2y +3264 26554 moveto +P$2z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3965 26554 moveto +P$1p +3864 26554 moveto +P$1q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4443 26845 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4748 26575 moveto +P$1j +5062 26501 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5643 26845 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +6096 26840 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +6248 26575 moveto +P$1j +6562 26501 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7143 26845 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7875 27073 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +8054 26464 moveto +P$2g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +9048 26575 moveto +P$1j +9362 26501 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +9576 26845 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10465 26554 moveto +P$1p +10364 26554 moveto +P$1q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10550 27004 moveto +P$2q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11475 27073 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11845 26856 moveto +P$2t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12368 26264 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12873 26845 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +13073 26140 moveto +P$1x +13073 26845 moveto +P$1y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +13368 26264 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +14310 26684 moveto +P$2m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +14450 27004 moveto +P$2q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +15375 27073 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +15590 26845 moveto +P$2r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +16268 26264 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +17139 26845 moveto +P$1i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +17521 26856 moveto +P$1f +17543 26783 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +18410 26684 moveto +P$2m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +18550 27004 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +88826 28510 moveto +P$2a +88567 27830 moveto +P$2b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +89575 27980 moveto +P$2i +89471 27982 moveto +P$2j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +89701 28510 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +89948 28260 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +90926 28510 moveto +P$2a +90667 27830 moveto +P$2b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91443 28510 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92165 28216 moveto +P$2k +92064 28219 moveto +P$2l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92273 27805 moveto +P$1x +92273 28510 moveto +P$1y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92843 28510 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +93440 28416 moveto +P$1m +93148 28219 moveto +P$28 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +93768 27929 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +94643 28510 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +95093 28738 moveto +P$2e +95242 28219 moveto +P$2f +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +95975 28738 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +96154 28129 moveto +P$2g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +97148 28240 moveto +P$1j +97462 28166 moveto +P$1k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +97676 28510 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +98565 28219 moveto +P$1p +98464 28219 moveto +P$1q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +98650 28669 moveto +P$2q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +99575 28738 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +99790 28510 moveto +P$2r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100468 27929 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +101339 28510 moveto +P$1i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +101721 28521 moveto +P$1f +101743 28447 moveto +P$1g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +102610 28349 moveto +P$2m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +102750 28669 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +278 30105 moveto +P$30 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +606 29608 moveto +P$31 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1606 29608 moveto +P$31 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2695 29547 moveto +P$32 +2779 29852 moveto +P$33 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3206 29608 moveto +P$34 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3898 29986 moveto +P$35 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4565 29857 moveto +P$36 +4703 29594 moveto +P$37 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5232 30113 moveto +P$38 +fill +100 setlinewidth +0 0 0 setrgbcolor +newpath +0 30438 moveto +104000 0 rlineto +stroke +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3525 31347 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4165 31086 moveto +P$3a +4084 31086 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4665 31086 moveto +P$3a +4584 31086 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +11650 31383 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +12165 31086 moveto +P$3a +12084 31086 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +12665 31086 moveto +P$3a +12584 31086 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +19525 31347 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20165 31086 moveto +P$3a +20084 31086 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20665 31086 moveto +P$3a +20584 31086 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27525 31347 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28165 31086 moveto +P$3a +28084 31086 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28665 31086 moveto +P$3a +28584 31086 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +35525 31347 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36165 31086 moveto +P$3a +36084 31086 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36665 31086 moveto +P$3a +36584 31086 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +43525 31347 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44165 31086 moveto +P$3a +44084 31086 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44665 31086 moveto +P$3a +44584 31086 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +51525 31347 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52165 31086 moveto +P$3a +52084 31086 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52665 31086 moveto +P$3a +52584 31086 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +59525 31347 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60165 31086 moveto +P$3a +60084 31086 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60665 31086 moveto +P$3a +60584 31086 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +67525 31347 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +68165 31086 moveto +P$3a +68084 31086 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +68665 31086 moveto +P$3a +68584 31086 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +75525 31347 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76165 31086 moveto +P$3a +76084 31086 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76665 31086 moveto +P$3a +76584 31086 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83525 31347 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84165 31086 moveto +P$3a +84084 31086 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84665 31086 moveto +P$3a +84584 31086 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91525 31347 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92165 31086 moveto +P$3a +92084 31086 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92665 31086 moveto +P$3a +92584 31086 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +99525 31347 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100165 31086 moveto +P$3a +100084 31086 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100665 31086 moveto +P$3a +100584 31086 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +754 32926 moveto +P$3e +423 32505 moveto +P$3f +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1195 32747 moveto +P$32 +1279 33052 moveto +P$33 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1706 32808 moveto +P$34 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2440 32565 moveto +P$3g +2434 33313 moveto +P$3h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2765 33057 moveto +P$36 +2903 32794 moveto +P$37 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3432 33313 moveto +P$38 +fill +100 setlinewidth +0 0 0 setrgbcolor +newpath +0 33638 moveto +104000 0 rlineto +stroke +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3525 34547 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4165 34286 moveto +P$3a +4084 34286 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4665 34286 moveto +P$3a +4584 34286 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +19525 34547 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20165 34286 moveto +P$3a +20084 34286 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20665 34286 moveto +P$3a +20584 34286 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27525 34547 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28165 34286 moveto +P$3a +28084 34286 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28665 34286 moveto +P$3a +28584 34286 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +43525 34547 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44165 34286 moveto +P$3a +44084 34286 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44665 34286 moveto +P$3a +44584 34286 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +51525 34547 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52165 34286 moveto +P$3a +52084 34286 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52665 34286 moveto +P$3a +52584 34286 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +59525 34547 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60165 34286 moveto +P$3a +60084 34286 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60665 34286 moveto +P$3a +60584 34286 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +75525 34547 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76165 34286 moveto +P$3a +76084 34286 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76665 34286 moveto +P$3a +76584 34286 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83525 34547 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84165 34286 moveto +P$3a +84084 34286 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84665 34286 moveto +P$3a +84584 34286 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91525 34547 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92165 34286 moveto +P$3a +92084 34286 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92665 34286 moveto +P$3a +92584 34286 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +99525 34547 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100165 34286 moveto +P$3a +100084 34286 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100665 34286 moveto +P$3a +100584 34286 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +815 36513 moveto +P$3i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1065 36257 moveto +P$36 +1203 35994 moveto +P$37 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1921 35944 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2500 36255 moveto +P$3k +2385 36255 moveto +P$3l +fill +100 setlinewidth +0 0 0 setrgbcolor +newpath +0 36838 moveto +104000 0 rlineto +stroke +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3525 37747 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4165 37486 moveto +P$3a +4084 37486 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4665 37486 moveto +P$3a +4584 37486 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11525 37747 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12165 37486 moveto +P$3a +12084 37486 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12665 37486 moveto +P$3a +12584 37486 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +19650 37783 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +20165 37486 moveto +P$3a +20084 37486 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +20665 37486 moveto +P$3a +20584 37486 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +27650 37783 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +28165 37486 moveto +P$3a +28084 37486 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +28665 37486 moveto +P$3a +28584 37486 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +35650 37783 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +36165 37486 moveto +P$3a +36084 37486 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +36665 37486 moveto +P$3a +36584 37486 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +43525 37747 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44165 37486 moveto +P$3a +44084 37486 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44665 37486 moveto +P$3a +44584 37486 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +75525 37747 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76165 37486 moveto +P$3a +76084 37486 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76665 37486 moveto +P$3a +76584 37486 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83525 37747 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84165 37486 moveto +P$3a +84084 37486 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84665 37486 moveto +P$3a +84584 37486 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +400 38940 moveto +P$3m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +998 39586 moveto +P$35 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1718 39469 moveto +P$3n +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2495 39147 moveto +P$32 +2579 39452 moveto +P$33 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3259 39590 moveto +P$3o +fill +100 setlinewidth +0 0 0 setrgbcolor +newpath +0 40038 moveto +104000 0 rlineto +stroke +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3525 40947 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4165 40686 moveto +P$3a +4084 40686 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4665 40686 moveto +P$3a +4584 40686 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11525 40947 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12165 40686 moveto +P$3a +12084 40686 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12665 40686 moveto +P$3a +12584 40686 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +19525 40947 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20165 40686 moveto +P$3a +20084 40686 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20665 40686 moveto +P$3a +20584 40686 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27525 40947 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28165 40686 moveto +P$3a +28084 40686 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28665 40686 moveto +P$3a +28584 40686 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +35525 40947 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36165 40686 moveto +P$3a +36084 40686 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36665 40686 moveto +P$3a +36584 40686 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +43525 40947 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44165 40686 moveto +P$3a +44084 40686 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44665 40686 moveto +P$3a +44584 40686 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +51525 40947 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52165 40686 moveto +P$3a +52084 40686 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52665 40686 moveto +P$3a +52584 40686 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +59525 40947 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60165 40686 moveto +P$3a +60084 40686 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60665 40686 moveto +P$3a +60584 40686 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +75525 40947 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76165 40686 moveto +P$3a +76084 40686 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76665 40686 moveto +P$3a +76584 40686 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83525 40947 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84165 40686 moveto +P$3a +84084 40686 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84665 40686 moveto +P$3a +84584 40686 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +260 42155 moveto +P$3p +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +698 42786 moveto +P$35 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1432 42913 moveto +P$3q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1840 42165 moveto +P$3g +1834 42913 moveto +P$3h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2198 42786 moveto +P$35 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3159 42790 moveto +P$3o +fill +100 setlinewidth +0 0 0 setrgbcolor +newpath +0 43238 moveto +104000 0 rlineto +stroke +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3525 44147 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4165 43886 moveto +P$3a +4084 43886 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4665 43886 moveto +P$3a +4584 43886 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11525 44147 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12165 43886 moveto +P$3a +12084 43886 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12665 43886 moveto +P$3a +12584 43886 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +19525 44147 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20165 43886 moveto +P$3a +20084 43886 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20665 43886 moveto +P$3a +20584 43886 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27525 44147 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28165 43886 moveto +P$3a +28084 43886 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28665 43886 moveto +P$3a +28584 43886 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +35525 44147 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36165 43886 moveto +P$3a +36084 43886 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36665 43886 moveto +P$3a +36584 43886 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +43525 44147 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44165 43886 moveto +P$3a +44084 43886 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44665 43886 moveto +P$3a +44584 43886 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +51525 44147 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52165 43886 moveto +P$3a +52084 43886 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52665 43886 moveto +P$3a +52584 43886 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +59525 44147 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60165 43886 moveto +P$3a +60084 43886 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60665 43886 moveto +P$3a +60584 43886 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +67525 44147 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +68165 43886 moveto +P$3a +68084 43886 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +68665 43886 moveto +P$3a +68584 43886 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +75525 44147 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76165 43886 moveto +P$3a +76084 43886 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76665 43886 moveto +P$3a +76584 43886 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83525 44147 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84165 43886 moveto +P$3a +84084 43886 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84665 43886 moveto +P$3a +84584 43886 moveto +P$3c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3960 46899 moveto +P$e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4462 46747 moveto +P$f +4371 46747 moveto +P$g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11960 46899 moveto +P$e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12306 47038 moveto +P$h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20056 47038 moveto +P$h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28195 47077 moveto +P$i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36210 46899 moveto +P$j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44145 46933 moveto +P$k +44060 46533 moveto +P$l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +51987 46694 moveto +P$m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60220 46874 moveto +P$n +60018 47049 moveto +P$o +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +67848 46577 moveto +P$p +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76192 46581 moveto +P$q +76123 46900 moveto +P$r +76104 46581 moveto +P$s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83782 46622 moveto +P$t +83993 46453 moveto +P$u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91806 47038 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92462 46747 moveto +P$f +92371 46747 moveto +P$g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +99806 47038 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100306 47038 moveto +P$h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3720 45877 moveto +P$0 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4662 45645 moveto +P$1 +4573 45645 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11603 45877 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12203 45745 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20020 45892 moveto +P$5 +20376 45645 moveto +P$6 +20482 45444 moveto +P$7 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27603 45877 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28209 45381 moveto +P$8 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +35757 45583 moveto +P$9 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36475 45405 moveto +P$a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +43567 45700 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44326 45408 moveto +P$c +44392 45642 moveto +P$d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +51517 45700 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52203 45745 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +59720 45877 moveto +P$0 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60662 45645 moveto +P$1 +60573 45645 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +67603 45877 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +68203 45745 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76020 45892 moveto +P$5 +76376 45645 moveto +P$6 +76482 45444 moveto +P$7 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83603 45877 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84209 45381 moveto +P$8 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91757 45583 moveto +P$9 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92475 45405 moveto +P$a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +99567 45700 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100326 45408 moveto +P$c +100392 45642 moveto +P$d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4793 47735 moveto +P$w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5420 47901 moveto +P$x +5457 48187 moveto +P$y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5954 47960 moveto +P$z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +6812 48415 moveto +P$10 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7420 47901 moveto +P$x +7457 48187 moveto +P$y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7970 48027 moveto +P$11 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +8470 48481 moveto +P$12 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +9648 48463 moveto +P$13 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10254 48067 moveto +P$14 +10082 48067 moveto +P$15 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10848 48463 moveto +P$13 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11459 48249 moveto +P$16 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +56556 48127 moveto +P$17 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +57239 47899 moveto +P$18 +57232 47959 moveto +P$19 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +57896 48173 moveto +P$1a +57521 47682 moveto +P$1b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +58420 48027 moveto +P$11 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +59062 48415 moveto +P$10 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +59670 47901 moveto +P$x +59707 48187 moveto +P$y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60220 48027 moveto +P$11 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60720 48481 moveto +P$12 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +61898 48463 moveto +P$13 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +62504 48067 moveto +P$14 +62332 48067 moveto +P$15 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +63098 48463 moveto +P$13 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +63709 48249 moveto +P$16 +fill +grestore +showpage +%plantuml done +%%EOF diff --git a/20-implementierungsheft/assets/gantt-plan.pdf b/20-implementierungsheft/assets/gantt-plan.pdf new file mode 100644 index 0000000..e69de29 diff --git a/20-implementierungsheft/assets/gantt-reality-eps-converted-to.pdf b/20-implementierungsheft/assets/gantt-reality-eps-converted-to.pdf new file mode 100644 index 0000000..5379947 Binary files /dev/null and b/20-implementierungsheft/assets/gantt-reality-eps-converted-to.pdf differ diff --git a/20-implementierungsheft/assets/gantt-reality.eps b/20-implementierungsheft/assets/gantt-reality.eps new file mode 100644 index 0000000..435dbb1 --- /dev/null +++ b/20-implementierungsheft/assets/gantt-reality.eps @@ -0,0 +1,11142 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: PlantUML v1.2023.0 +%%Title: noTitle +%%BoundingBox: 0 0 2081 554 +%%ColorUsage: Color +%%Origin: 0 0 +%%EndComments + +gsave +0 554 translate +.01 -.01 scale +/simplerect { +newpath moveto 1 index 0 rlineto +0 exch rlineto +neg 0 rlineto +} def +/rquadto { +3 index 3 index 4 2 roll rcurveto +} def +/P$h { +134 12 rlineto +0 26 rlineto +-353 0 rlineto +0 -26 rlineto +134 -12 rlineto +0 -534 rlineto +-131 46 rlineto +0 -25 rlineto +190 -109 rlineto +25 0 rlineto +0 621 rlineto +closepath +} def +/P$1e { +0 -60 -42 -87 rquadto +-40 -26 -120 -26 rquadto +-173 0 rlineto +0 240 rlineto +173 0 rlineto +81 0 121 -31 rquadto +40 -31 40 -95 rquadto +closepath +} def +/P$32 { +109 17 rlineto +0 34 rlineto +-340 0 rlineto +0 -34 rlineto +109 -17 rlineto +0 -750 rlineto +-109 -15 rlineto +0 -34 rlineto +340 0 rlineto +0 34 rlineto +-109 15 rlineto +0 750 rlineto +} def +/P$k { +0 143 rlineto +-84 0 rlineto +0 -143 rlineto +-290 0 rlineto +0 -65 rlineto +318 -448 rlineto +56 0 rlineto +0 443 rlineto +89 0 rlineto +0 70 rlineto +-89 0 rlineto +closepath +} def +/P$a { +0 125 rlineto +-21 0 rlineto +-28 -54 rlineto +-25 0 -57 7 rquadto +-32 6 -57 17 rquadto +0 342 rlineto +78 12 rlineto +0 21 rlineto +-217 0 rlineto +0 -21 rlineto +57 -12 rlineto +0 -390 rlineto +-57 -12 rlineto +0 -21 rlineto +132 0 rlineto +4 57 rlineto +29 -25 79 -46 rquadto +50 -23 79 -23 rquadto +7 0 rlineto +closepath +} def +/P$1v { +0 -85 rlineto +268 0 rlineto +0 85 rlineto +-268 0 rlineto +} def +/P$2j { +0 -65 -45 -100 rquadto +-45 -35 -129 -35 rquadto +-243 0 rlineto +0 279 rlineto +248 0 rlineto +81 0 125 -37 rquadto +45 -37 45 -106 rquadto +} def +/P$1j { +-196 -265 rlineto +-71 59 rlineto +0 206 rlineto +-96 0 rlineto +0 -796 rlineto +96 0 rlineto +0 498 rlineto +256 -282 rlineto +112 0 rlineto +-235 250 rlineto +248 331 rlineto +-112 0 rlineto +} def +/P$8 { +0 51 -3 73 rquadto +34 -20 78 -34 rquadto +45 -15 76 -15 rquadto +59 0 89 35 rquadto +31 34 31 100 rquadto +0 301 rlineto +56 12 rlineto +0 21 rlineto +-198 0 rlineto +0 -21 rlineto +60 -12 rlineto +0 -295 rlineto +0 -84 -81 -84 rquadto +-45 0 -109 14 rquadto +0 365 rlineto +62 12 rlineto +0 21 rlineto +-201 0 rlineto +0 -21 rlineto +57 -12 rlineto +0 -626 rlineto +-68 -10 rlineto +0 -21 rlineto +150 0 rlineto +0 198 rlineto +closepath +} def +/P$28 { +0 -146 -175 -146 rquadto +-204 0 rlineto +0 298 rlineto +207 0 rlineto +171 0 171 -151 rquadto +} def +/P$y { +206 0 206 151 rquadto +0 357 rlineto +54 14 rlineto +0 39 rlineto +-201 0 rlineto +-14 -42 rlineto +-45 31 -82 42 rquadto +-35 12 -73 12 rquadto +-170 0 -170 -165 rquadto +0 -60 25 -98 rquadto +25 -37 71 -54 rquadto +48 -18 150 -20 rquadto +71 -1 rlineto +0 -81 rlineto +0 -100 -81 -100 rquadto +-50 0 -110 31 rquadto +-21 68 rlineto +-39 0 rlineto +0 -132 rlineto +89 -14 129 -17 rquadto +42 -3 85 -3 rquadto +closepath +} def +/P$3g { +235 0 350 106 rquadto +114 104 114 315 rquadto +0 212 -110 323 rquadto +-109 109 -326 109 rquadto +-303 -3 rlineto +-109 0 rlineto +0 -34 rlineto +109 -17 rlineto +0 -750 rlineto +-109 -15 rlineto +0 -34 rlineto +385 0 rlineto +} def +/P$1 { +0 240 -215 240 rquadto +-103 0 -156 -60 rquadto +-53 -62 -53 -179 rquadto +0 -117 53 -178 rquadto +53 -62 160 -62 rquadto +104 0 157 60 rquadto +53 60 53 179 rquadto +closepath +} def +/P$2x { +0 281 rlineto +423 0 rlineto +0 85 rlineto +-423 0 rlineto +0 306 rlineto +-101 0 rlineto +0 -756 rlineto +537 0 rlineto +0 82 rlineto +-435 0 rlineto +} def +/P$35 { +-82 3 rlineto +-85 3 -115 32 rquadto +-29 29 -29 100 rquadto +0 110 90 110 rquadto +42 0 73 -9 rquadto +32 -9 64 -25 rquadto +0 -212 rlineto +} def +/P$2c { +0 -121 -32 -173 rquadto +-31 -53 -104 -53 rquadto +-81 0 -118 56 rquadto +-37 54 -37 176 rquadto +0 114 35 168 rquadto +37 54 120 54 rquadto +71 0 104 -53 rquadto +32 -54 32 -176 rquadto +} def +/P$1k { +0 100 40 154 rquadto +42 53 121 53 rquadto +62 0 100 -25 rquadto +37 -25 51 -64 rquadto +84 25 rlineto +-51 137 -235 137 rquadto +-129 0 -196 -76 rquadto +-67 -76 -67 -228 rquadto +0 -145 67 -221 rquadto +67 -76 192 -76 rquadto +256 0 256 309 rquadto +0 12 rlineto +-414 0 rlineto +closepath +} def +/P$1q { +0 151 -67 226 rquadto +-67 75 -195 75 rquadto +-126 0 -192 -76 rquadto +-64 -78 -64 -225 rquadto +0 -301 259 -301 rquadto +134 0 196 73 rquadto +62 73 62 228 rquadto +closepath +} def +/P$0 { +-17 0 rlineto +-239 -562 rlineto +0 523 rlineto +87 12 rlineto +0 26 rlineto +-223 0 rlineto +0 -26 rlineto +84 -12 rlineto +0 -576 rlineto +-84 -14 rlineto +0 -25 rlineto +198 0 rlineto +214 498 rlineto +231 -498 rlineto +187 0 rlineto +0 25 rlineto +-82 14 rlineto +0 576 rlineto +82 12 rlineto +0 26 rlineto +-265 0 rlineto +0 -26 rlineto +89 -12 rlineto +0 -523 rlineto +-262 562 rlineto +} def +/P$37 { +0 109 101 109 rquadto +79 0 146 -20 rquadto +0 -470 rlineto +-89 -17 rlineto +0 -28 rlineto +193 0 rlineto +0 553 rlineto +76 15 rlineto +0 28 rlineto +-175 0 rlineto +-4 -48 rlineto +-45 25 -104 43 rquadto +-57 17 -98 17 rquadto +-151 0 -151 -175 rquadto +0 -389 rlineto +-76 -17 rlineto +0 -28 rlineto +181 0 rlineto +0 426 rlineto +} def +/P$l { +-1 0 rlineto +-234 329 rlineto +235 0 rlineto +0 -329 rlineto +closepath +} def +/P$1b { +0 -109 -26 -159 rquadto +-26 -50 -87 -50 rquadto +-21 0 -48 4 rquadto +-26 4 -43 14 rquadto +0 421 rlineto +37 9 92 9 rquadto +57 0 85 -56 rquadto +28 -56 28 -184 rquadto +closepath +} def +/P$7 { +-50 0 -78 42 rquadto +-26 40 -26 120 rquadto +196 0 rlineto +0 -87 -23 -125 rquadto +-21 -37 -68 -37 rquadto +closepath +} def +/P$27 { +0 107 -70 171 rquadto +-68 62 -189 62 rquadto +-223 0 rlineto +0 295 rlineto +-101 0 rlineto +0 -756 rlineto +318 0 rlineto +126 0 195 59 rquadto +70 59 70 167 rquadto +closepath +} def +/P$m { +112 0 167 46 rquadto +56 45 56 140 rquadto +0 98 -60 151 rquadto +-59 53 -170 53 rquadto +-93 0 -165 -20 rquadto +-6 -137 rlineto +32 0 rlineto +21 90 rlineto +21 12 51 20 rquadto +29 6 57 6 rquadto +76 0 112 -35 rquadto +37 -35 37 -123 rquadto +0 -59 -15 -90 rquadto +-15 -31 -50 -45 rquadto +-34 -15 -92 -15 rquadto +-45 0 -87 12 rquadto +-46 0 rlineto +0 -325 rlineto +332 0 rlineto +0 75 rlineto +-289 0 rlineto +0 207 rlineto +53 -10 114 -10 rquadto +closepath +} def +/P$j { +0 87 -60 137 rquadto +-59 50 -170 50 rquadto +-93 0 -176 -20 rquadto +-4 -137 rlineto +31 0 rlineto +21 90 rlineto +20 10 54 18 rquadto +34 7 65 7 rquadto +76 0 112 -34 rquadto +37 -35 37 -117 rquadto +0 -64 -34 -96 rquadto +-34 -34 -104 -37 rquadto +-70 -4 rlineto +0 -40 rlineto +70 -3 rlineto +54 -3 81 -34 rquadto +26 -31 26 -95 rquadto +0 -65 -28 -95 rquadto +-28 -31 -90 -31 rquadto +-26 0 -54 7 rquadto +-28 7 -50 18 rquadto +-17 79 rlineto +-32 0 rlineto +0 -125 rlineto +48 -12 82 -17 rquadto +35 -4 71 -4 rquadto +209 0 209 160 rquadto +0 68 -37 109 rquadto +-37 39 -106 50 rquadto +89 9 131 50 rquadto +42 40 42 114 rquadto +closepath +} def +/P$2f { +0 -73 rlineto +325 -432 rlineto +-307 0 rlineto +0 -75 rlineto +421 0 rlineto +0 73 rlineto +-326 432 rlineto +337 0 rlineto +0 75 rlineto +-450 0 rlineto +} def +/P$2k { +0 156 -48 279 rquadto +-48 123 -150 232 rquadto +-93 0 rlineto +101 -112 148 -237 rquadto +46 -125 46 -275 rquadto +0 -150 -48 -275 rquadto +-46 -125 -146 -237 rquadto +93 0 rlineto +101 109 150 232 rquadto +48 123 48 278 rquadto +0 1 rlineto +} def +/P$s { +0 -67 -26 -98 rquadto +-26 -32 -79 -32 rquadto +-51 0 -78 31 rquadto +-25 31 -25 100 rquadto +0 68 25 98 rquadto +25 28 78 28 rquadto +54 0 79 -29 rquadto +26 -29 26 -96 rquadto +closepath +} def +/P$1o { +0 121 31 175 rquadto +32 51 104 51 rquadto +82 0 118 -56 rquadto +37 -57 37 -176 rquadto +0 -115 -37 -168 rquadto +-35 -54 -117 -54 rquadto +-73 0 -106 54 rquadto +-31 53 -31 175 rquadto +closepath +} def +/P$1t { +0 -445 rlineto +0 -62 -3 -135 rquadto +90 0 rlineto +4 98 4 118 rquadto +1 0 rlineto +23 -75 53 -101 rquadto +31 -28 85 -28 rquadto +18 0 39 6 rquadto +0 87 rlineto +-20 -4 -51 -4 rquadto +-60 0 -92 51 rquadto +-31 51 -31 148 rquadto +0 303 rlineto +-96 0 rlineto +} def +/P$2n { +-85 -221 rlineto +-345 0 rlineto +-87 221 rlineto +-106 0 rlineto +309 -756 rlineto +117 0 rlineto +303 756 rlineto +-104 0 rlineto +closepath +} def +/P$3n { +-109 -15 rlineto +0 -34 rlineto +326 0 rlineto +0 34 rlineto +-95 15 rlineto +0 526 rlineto +0 85 -26 150 rquadto +-26 64 -79 101 rquadto +-53 35 -117 35 rquadto +-81 0 -132 -18 rquadto +0 -154 rlineto +42 0 rlineto +18 87 rlineto +12 15 34 23 rquadto +23 7 50 7 rquadto +89 0 89 -120 rquadto +0 -639 rlineto +} def +/P$21 { +0 -756 rlineto +103 0 rlineto +0 756 rlineto +-103 0 rlineto +} def +/P$1z { +0 -581 rlineto +96 0 rlineto +0 581 rlineto +-96 0 rlineto +} def +/P$3k { +-131 15 rlineto +0 746 rlineto +168 0 rlineto +134 0 198 -12 rquadto +39 -176 rlineto +40 0 rlineto +-10 243 rlineto +-667 0 rlineto +0 -34 rlineto +109 -17 rlineto +0 -750 rlineto +-109 -15 rlineto +0 -34 rlineto +362 0 rlineto +0 34 rlineto +} def +/P$n { +0 101 -51 157 rquadto +-51 54 -148 54 rquadto +-110 0 -168 -85 rquadto +-57 -85 -57 -246 rquadto +0 -104 29 -181 rquadto +31 -78 85 -117 rquadto +56 -40 128 -40 rquadto +71 0 142 17 rquadto +0 112 rlineto +-31 0 rlineto +-17 -65 rlineto +-17 -9 -45 -15 rquadto +-26 -7 -48 -7 rquadto +-70 0 -110 70 rquadto +-39 68 -43 201 rquadto +79 -42 160 -42 rquadto +85 0 131 48 rquadto +45 48 45 140 rquadto +closepath +} def +/P$11 { +-39 20 rlineto +-82 42 -148 42 rquadto +-151 0 -151 -162 rquadto +0 -350 rlineto +-54 -14 rlineto +0 -39 rlineto +223 0 rlineto +0 381 rlineto +0 48 20 76 rquadto +21 28 60 28 rquadto +43 0 89 -20 rquadto +0 -412 rlineto +-51 -14 rlineto +0 -39 rlineto +220 0 rlineto +0 498 rlineto +54 14 rlineto +0 39 rlineto +-214 0 rlineto +-9 -48 rlineto +} def +/P$3a { +103 15 rlineto +0 28 rlineto +-309 0 rlineto +0 -28 rlineto +101 -15 rlineto +0 -814 rlineto +-101 -15 rlineto +0 -28 rlineto +206 0 rlineto +0 857 rlineto +closepath +} def +/P$4 { +0 84 78 84 rquadto +60 0 112 -15 rquadto +0 -362 rlineto +-68 -12 rlineto +0 -21 rlineto +150 0 rlineto +0 425 rlineto +57 12 rlineto +0 21 rlineto +-134 0 rlineto +-3 -37 rlineto +-34 18 -79 32 rquadto +-45 14 -76 14 rquadto +-117 0 -117 -134 rquadto +0 -300 rlineto +-59 -12 rlineto +0 -21 rlineto +140 0 rlineto +0 328 rlineto +closepath +} def +/P$14 { +-498 0 rlineto +0 -110 rlineto +51 -53 93 -96 rquadto +93 -92 135 -145 rquadto +43 -53 64 -109 rquadto +20 -57 20 -129 rquadto +0 -64 -31 -103 rquadto +-29 -39 -81 -39 rquadto +-37 0 -59 7 rquadto +-20 6 -39 21 rquadto +-25 114 rlineto +-51 0 rlineto +0 -178 rlineto +46 -10 92 -18 rquadto +45 -7 96 -7 rquadto +129 0 198 54 rquadto +68 53 68 151 rquadto +0 60 -20 110 rquadto +-20 50 -65 98 rquadto +-43 46 -175 154 rquadto +-50 40 -109 92 rquadto +385 0 rlineto +0 132 rlineto +} def +/P$f { +0 339 -215 339 rquadto +-103 0 -156 -85 rquadto +-53 -87 -53 -253 rquadto +0 -162 53 -248 rquadto +53 -87 160 -87 rquadto +103 0 156 85 rquadto +54 84 54 250 rquadto +closepath +} def +/P$b { +32 0 rlineto +17 89 rlineto +17 21 60 40 rquadto +45 17 87 17 rquadto +68 0 106 -34 rquadto +39 -35 39 -96 rquadto +0 -35 -15 -57 rquadto +-14 -23 -39 -39 rquadto +-23 -15 -54 -26 rquadto +-29 -10 -62 -21 rquadto +-32 -12 -64 -25 rquadto +-29 -14 -54 -34 rquadto +-23 -21 -39 -53 rquadto +-14 -31 -14 -76 rquadto +0 -78 57 -121 rquadto +59 -45 162 -45 rquadto +79 0 171 21 rquadto +0 135 rlineto +-31 0 rlineto +-17 -79 rlineto +-50 -37 -123 -37 rquadto +-64 0 -101 28 rquadto +-37 26 -37 73 rquadto +0 31 14 53 rquadto +15 20 39 35 rquadto +25 14 56 25 rquadto +31 10 64 21 rquadto +32 10 62 26 rquadto +31 14 54 35 rquadto +25 21 39 54 rquadto +15 31 15 78 rquadto +0 95 -57 146 rquadto +-57 51 -167 51 rquadto +-53 0 -106 -9 rquadto +-53 -9 -95 -25 rquadto +0 -151 rlineto +} def +/P$2s { +-93 0 -151 -37 rquadto +-56 -37 -71 -106 rquadto +96 -14 rlineto +9 40 42 62 rquadto +34 21 87 21 rquadto +145 0 145 -168 rquadto +0 -93 rlineto +-1 0 rlineto +-28 56 -76 84 rquadto +-46 28 -110 28 rquadto +-106 0 -156 -70 rquadto +-50 -71 -50 -223 rquadto +0 -154 53 -228 rquadto +54 -73 164 -73 rquadto +62 0 107 28 rquadto +45 28 70 81 rquadto +0 0 rlineto +0 -17 1 -56 rquadto +3 -40 4 -43 rquadto +92 0 rlineto +-3 29 -3 120 rquadto +0 443 rlineto +0 245 -243 245 rquadto +closepath +} def +/P$1w { +0 104 -82 162 rquadto +-81 57 -229 57 rquadto +-276 0 -320 -192 rquadto +100 -20 rlineto +17 68 71 101 rquadto +56 31 153 31 rquadto +98 0 151 -34 rquadto +54 -34 54 -100 rquadto +0 -37 -17 -60 rquadto +-15 -23 -46 -37 rquadto +-31 -15 -73 -25 rquadto +-42 -10 -93 -21 rquadto +-89 -20 -135 -40 rquadto +-46 -20 -73 -43 rquadto +-26 -25 -40 -57 rquadto +-14 -32 -14 -75 rquadto +0 -96 73 -150 rquadto +75 -53 214 -53 rquadto +128 0 195 40 rquadto +68 39 96 134 rquadto +-101 17 rlineto +-15 -59 -62 -85 rquadto +-46 -28 -129 -28 rquadto +-90 0 -139 29 rquadto +-46 29 -46 90 rquadto +0 34 17 57 rquadto +18 21 53 37 rquadto +35 15 140 39 rquadto +34 7 68 17 rquadto +34 7 65 20 rquadto +32 10 59 26 rquadto +28 15 48 39 rquadto +20 21 31 53 rquadto +12 29 12 70 rquadto +} def +/P$1f { +0 -132 -187 -132 rquadto +-192 0 rlineto +0 271 rlineto +200 0 rlineto +93 0 135 -34 rquadto +43 -34 43 -104 rquadto +} def +/P$1d { +0 100 -73 156 rquadto +-73 56 -204 56 rquadto +-306 0 rlineto +0 -756 rlineto +275 0 rlineto +265 0 265 182 rquadto +0 67 -37 114 rquadto +-37 45 -106 60 rquadto +90 9 139 59 rquadto +48 50 48 126 rquadto +closepath +} def +/P$9 { +0 254 rlineto +107 12 rlineto +0 26 rlineto +-279 0 rlineto +0 -26 rlineto +76 -12 rlineto +0 -576 rlineto +-84 -14 rlineto +0 -25 rlineto +492 0 rlineto +0 156 rlineto +-32 0 rlineto +-15 -106 rlineto +-54 -6 -157 -6 rquadto +-106 0 rlineto +0 273 rlineto +192 0 rlineto +15 -78 rlineto +29 0 rlineto +0 200 rlineto +-29 0 rlineto +-15 -78 rlineto +-192 0 rlineto +} def +/P$1x { +31 -57 75 -84 rquadto +43 -26 110 -26 rquadto +93 0 139 46 rquadto +45 46 45 157 rquadto +0 387 rlineto +-96 0 rlineto +0 -368 rlineto +0 -60 -12 -90 rquadto +-10 -29 -37 -43 rquadto +-25 -14 -70 -14 rquadto +-68 0 -109 46 rquadto +-40 46 -40 128 rquadto +0 342 rlineto +-96 0 rlineto +0 -796 rlineto +96 0 rlineto +0 207 rlineto +0 32 -3 67 rquadto +-1 34 -1 40 rquadto +1 0 rlineto +} def +/P$1c { +-56 -14 rlineto +0 -37 rlineto +225 0 rlineto +0 201 rlineto +0 54 -6 110 rquadto +23 -18 67 -31 rquadto +45 -14 87 -14 rquadto +120 0 175 65 rquadto +54 65 54 209 rquadto +0 142 -70 223 rquadto +-70 79 -198 79 rquadto +-95 0 -278 -40 rquadto +0 -753 rlineto +} def +/P$36 { +48 -28 103 -45 rquadto +56 -18 92 -18 rquadto +78 0 117 45 rquadto +39 45 39 129 rquadto +0 393 rlineto +71 15 rlineto +0 28 rlineto +-256 0 rlineto +0 -28 rlineto +79 -15 rlineto +0 -381 rlineto +0 -53 -26 -82 rquadto +-25 -31 -79 -31 rquadto +-56 0 -140 18 rquadto +0 476 rlineto +81 15 rlineto +0 28 rlineto +-257 0 rlineto +0 -28 rlineto +71 -15 rlineto +0 -507 rlineto +-71 -17 rlineto +0 -28 rlineto +170 0 rlineto +6 48 rlineto +} def +/P$3s { +0 -137 -40 -198 rquadto +-39 -62 -123 -62 rquadto +-84 0 -121 59 rquadto +-35 59 -35 201 rquadto +0 143 37 204 rquadto +37 59 120 59 rquadto +82 0 123 -62 rquadto +40 -62 40 -201 rquadto +closepath +} def +/P$13 { +-220 -515 rlineto +-37 -14 rlineto +0 -39 rlineto +281 0 rlineto +0 39 rlineto +-65 15 rlineto +129 304 rlineto +115 -306 rlineto +-65 -14 rlineto +0 -39 rlineto +181 0 rlineto +0 39 rlineto +-40 12 rlineto +-217 534 rlineto +-37 95 -65 137 rquadto +-28 43 -62 65 rquadto +-34 21 -78 21 rquadto +-46 0 -96 -10 rquadto +0 -142 rlineto +35 0 rlineto +25 73 rlineto +17 14 42 14 rquadto +23 0 39 -10 rquadto +17 -10 32 -31 rquadto +15 -18 28 -48 rquadto +14 -28 39 -85 rquadto +} def +/P$2d { +0 510 rlineto +-96 0 rlineto +0 -510 rlineto +-81 0 rlineto +0 -70 rlineto +81 0 rlineto +0 -65 rlineto +0 -79 34 -114 rquadto +35 -34 107 -34 rquadto +40 0 68 6 rquadto +0 73 rlineto +-25 -4 -43 -4 rquadto +-37 0 -54 18 rquadto +-15 18 -15 68 rquadto +0 51 rlineto +114 0 rlineto +0 70 rlineto +-114 0 rlineto +} def +/P$o { +57 0 84 -39 rquadto +26 -39 26 -126 rquadto +0 -79 -25 -115 rquadto +-25 -35 -79 -35 rquadto +-67 0 -142 25 rquadto +0 148 32 220 rquadto +34 71 103 71 rquadto +closepath +} def +/P$19 { +112 0 162 59 rquadto +50 59 50 185 rquadto +0 48 rlineto +-289 0 rlineto +0 9 rlineto +0 87 14 125 rquadto +14 35 45 56 rquadto +32 18 87 18 rquadto +51 0 129 -17 rquadto +0 45 rlineto +-31 18 -82 31 rquadto +-51 12 -100 12 rquadto +-135 0 -201 -70 rquadto +-64 -70 -64 -218 rquadto +0 -143 60 -214 rquadto +62 -71 187 -71 rquadto +closepath +} def +/P$u { +-121 0 -121 170 rquadto +0 75 29 110 rquadto +29 34 90 34 rquadto +62 0 126 -25 rquadto +0 -150 -29 -220 rquadto +-29 -70 -95 -70 rquadto +closepath +} def +/P$2t { +0 -70 -20 -121 rquadto +-18 -51 -54 -78 rquadto +-34 -28 -79 -28 rquadto +-73 0 -107 54 rquadto +-32 53 -32 173 rquadto +0 118 31 171 rquadto +31 51 107 51 rquadto +45 0 81 -26 rquadto +35 -26 54 -76 rquadto +20 -51 20 -120 rquadto +} def +/P$3e { +0 -142 -26 -204 rquadto +-26 -62 -85 -62 rquadto +-56 0 -81 59 rquadto +-25 59 -25 207 rquadto +0 148 25 209 rquadto +25 60 81 60 rquadto +57 0 84 -62 rquadto +28 -64 28 -207 rquadto +closepath +} def +/P$g { +0 -157 -29 -226 rquadto +-29 -70 -95 -70 rquadto +-62 0 -90 65 rquadto +-28 65 -28 231 rquadto +0 165 28 234 rquadto +28 67 90 67 rquadto +64 0 93 -70 rquadto +31 -71 31 -231 rquadto +closepath +} def +/P$20 { +-67 0 -104 -42 rquadto +-35 -40 -35 -115 rquadto +0 -193 rlineto +0 -62 -28 -92 rquadto +-28 -31 -87 -34 rquadto +0 -68 rlineto +57 -1 85 -32 rquadto +29 -31 29 -93 rquadto +0 -193 rlineto +0 -76 34 -117 rquadto +35 -40 106 -40 rquadto +73 0 rlineto +0 68 rlineto +-34 0 rlineto +-48 0 -70 29 rquadto +-20 28 -20 85 rquadto +0 190 rlineto +0 51 -28 89 rquadto +-28 35 -75 46 rquadto +0 1 rlineto +46 10 75 48 rquadto +28 35 28 87 rquadto +0 192 rlineto +0 56 20 85 rquadto +21 29 70 29 rquadto +34 0 rlineto +0 68 rlineto +-73 0 rlineto +} def +/P$p { +-32 0 rlineto +0 -154 rlineto +406 0 rlineto +0 37 rlineto +-292 617 rlineto +-64 0 rlineto +287 -579 rlineto +-287 0 rlineto +-17 79 rlineto +closepath +} def +/P$3p { +-73 23 -153 40 rquadto +-79 15 -171 15 rquadto +-206 0 -321 -110 rquadto +-115 -112 -115 -317 rquadto +0 -223 112 -334 rquadto +112 -110 328 -110 rquadto +154 0 298 37 rquadto +0 182 rlineto +-42 0 rlineto +-17 -104 rlineto +-43 -31 -104 -46 rquadto +-60 -17 -129 -17 rquadto +-162 0 -237 96 rquadto +-75 96 -75 295 rquadto +0 187 76 284 rquadto +78 96 229 96 rquadto +53 0 110 -12 rquadto +59 -12 90 -31 rquadto +0 -242 rlineto +-109 -15 rlineto +0 -34 rlineto +314 0 rlineto +0 34 rlineto +-82 15 rlineto +0 278 rlineto +} def +/P$2l { +50 0 70 -29 rquadto +21 -29 21 -85 rquadto +0 -192 rlineto +0 -53 28 -89 rquadto +28 -35 75 -46 rquadto +0 -1 rlineto +-45 -10 -75 -46 rquadto +-28 -35 -28 -89 rquadto +0 -190 rlineto +0 -57 -21 -85 rquadto +-20 -29 -70 -29 rquadto +-31 0 rlineto +0 -68 rlineto +70 0 rlineto +70 0 106 40 rquadto +35 40 35 117 rquadto +0 193 rlineto +0 62 28 93 rquadto +28 31 87 32 rquadto +0 68 rlineto +-59 1 -87 32 rquadto +-28 31 -28 93 rquadto +0 193 rlineto +0 75 -37 115 rquadto +-35 42 -104 42 rquadto +-70 0 rlineto +0 -68 rlineto +31 0 rlineto +} def +/P$2w { +0 -184 98 -285 rquadto +100 -101 278 -101 rquadto +126 0 204 43 rquadto +78 42 120 135 rquadto +-96 28 rlineto +-32 -64 -89 -93 rquadto +-56 -29 -140 -29 rquadto +-131 0 -201 79 rquadto +-68 78 -68 223 rquadto +0 142 73 226 rquadto +73 82 203 82 rquadto +75 0 139 -21 rquadto +64 -23 104 -62 rquadto +0 -135 rlineto +-226 0 rlineto +0 -85 rlineto +320 0 rlineto +0 260 rlineto +-59 60 -146 95 rquadto +-87 32 -190 32 rquadto +-117 0 -203 -46 rquadto +-85 -48 -132 -135 rquadto +-45 -89 -45 -209 rquadto +} def +/P$2u { +-114 0 rlineto +-212 -581 rlineto +103 0 rlineto +128 378 rlineto +7 21 37 128 rquadto +18 -64 rlineto +20 -62 rlineto +132 -379 rlineto +103 0 rlineto +-217 581 rlineto +} def +/P$2z { +0 304 -214 304 rquadto +-134 0 -179 -101 rquadto +-3 0 rlineto +1 4 1 92 rquadto +0 226 rlineto +-96 0 rlineto +0 -690 rlineto +0 -89 -3 -118 rquadto +93 0 rlineto +1 1 1 15 rquadto +1 12 3 40 rquadto +1 26 1 37 rquadto +1 0 rlineto +26 -54 68 -78 rquadto +42 -25 110 -25 rquadto +107 0 160 71 rquadto +53 71 53 225 rquadto +closepath +} def +/P$39 { +-65 0 -101 54 rquadto +-35 53 -35 156 rquadto +256 0 rlineto +0 -112 -29 -160 rquadto +-29 -50 -89 -50 rquadto +} def +/P$12 { +62 -70 112 -101 rquadto +51 -31 92 -31 rquadto +31 0 rlineto +0 201 rlineto +-32 0 rlineto +-34 -73 rlineto +-35 0 -82 15 rquadto +-46 15 -82 37 rquadto +0 334 rlineto +87 14 rlineto +0 39 rlineto +-328 0 rlineto +0 -39 rlineto +70 -14 rlineto +0 -445 rlineto +-70 -14 rlineto +0 -39 rlineto +231 0 rlineto +6 115 rlineto +} def +/P$2v { +0 -756 rlineto +573 0 rlineto +0 82 rlineto +-471 0 rlineto +0 243 rlineto +440 0 rlineto +0 82 rlineto +-440 0 rlineto +0 262 rlineto +493 0 rlineto +0 84 rlineto +-595 0 rlineto +} def +/P$3f { +0 -178 -96 -270 rquadto +-95 -92 -275 -92 rquadto +-114 0 rlineto +0 734 rlineto +76 4 181 4 rquadto +156 0 229 -92 rquadto +75 -92 75 -284 rquadto +closepath +} def +/P$2g { +-92 0 -162 -32 rquadto +-68 -34 -107 -98 rquadto +-37 -65 -37 -154 rquadto +0 -481 rlineto +103 0 rlineto +0 471 rlineto +0 104 51 159 rquadto +53 53 153 53 rquadto +101 0 157 -56 rquadto +57 -56 57 -162 rquadto +0 -465 rlineto +101 0 rlineto +0 471 rlineto +0 92 -39 159 rquadto +-39 65 -110 101 rquadto +-70 34 -167 34 rquadto +} def +/P$i { +-401 0 rlineto +0 -71 rlineto +90 -82 rlineto +87 -76 128 -123 rquadto +42 -46 59 -96 rquadto +18 -51 18 -115 rquadto +0 -64 -29 -96 rquadto +-28 -34 -93 -34 rquadto +-26 0 -54 7 rquadto +-26 7 -46 18 rquadto +-17 79 rlineto +-32 0 rlineto +0 -125 rlineto +89 -21 151 -21 rquadto +107 0 160 45 rquadto +54 43 54 126 rquadto +0 54 -21 103 rquadto +-21 48 -65 96 rquadto +-43 46 -145 134 rquadto +-43 35 -92 81 rquadto +337 0 rlineto +0 75 rlineto +closepath +} def +/P$1i { +0 117 35 173 rquadto +35 54 109 54 rquadto +51 0 85 -28 rquadto +35 -28 43 -85 rquadto +96 6 rlineto +-10 84 -71 134 rquadto +-59 50 -151 50 rquadto +-121 0 -185 -76 rquadto +-64 -78 -64 -225 rquadto +0 -146 64 -223 rquadto +64 -78 184 -78 rquadto +89 0 148 46 rquadto +59 45 73 126 rquadto +-98 7 rlineto +-7 -48 -39 -76 rquadto +-29 -28 -85 -28 rquadto +-76 0 -110 51 rquadto +-34 50 -34 170 rquadto +} def +/P$2y { +-301 -365 rlineto +-100 75 rlineto +0 290 rlineto +-101 0 rlineto +0 -756 rlineto +101 0 rlineto +0 378 rlineto +365 -378 rlineto +120 0 rlineto +-321 328 rlineto +365 428 rlineto +-128 0 rlineto +} def +/P$25 { +0 -504 rlineto +0 -84 4 -160 rquadto +-26 95 -48 150 rquadto +-195 515 rlineto +-71 0 rlineto +-198 -515 rlineto +-29 -90 rlineto +-17 -59 rlineto +1 59 rlineto +1 101 rlineto +0 504 rlineto +-90 0 rlineto +0 -756 rlineto +134 0 rlineto +201 523 rlineto +10 32 20 68 rquadto +10 35 14 51 rquadto +3 -20 17 -64 rquadto +14 -43 18 -56 rquadto +196 -523 rlineto +132 0 rlineto +0 756 rlineto +-92 0 rlineto +} def +/P$3b { +120 12 rlineto +0 23 rlineto +-315 0 rlineto +0 -23 rlineto +120 -12 rlineto +0 -479 rlineto +-118 42 rlineto +0 -23 rlineto +171 -96 rlineto +21 0 rlineto +0 557 rlineto +} def +/P$3c { +0 306 -193 306 rquadto +-92 0 -140 -78 rquadto +-46 -79 -46 -228 rquadto +0 -146 46 -223 rquadto +48 -78 145 -78 rquadto +92 0 140 76 rquadto +48 76 48 225 rquadto +closepath +} def +/P$3j { +-360 0 rlineto +0 -64 rlineto +82 -75 rlineto +78 -68 114 -110 rquadto +37 -43 53 -89 rquadto +17 -45 17 -103 rquadto +0 -57 -26 -87 rquadto +-25 -29 -84 -29 rquadto +-23 0 -48 6 rquadto +-25 6 -43 17 rquadto +-14 71 rlineto +-29 0 rlineto +0 -112 rlineto +79 -18 135 -18 rquadto +96 0 145 40 rquadto +48 39 48 112 rquadto +0 50 -20 93 rquadto +-18 43 -57 87 rquadto +-39 42 -131 120 rquadto +-39 32 -82 73 rquadto +303 0 rlineto +0 67 rlineto +} def +/P$16 { +0 -182 -20 -262 rquadto +-20 -79 -64 -79 rquadto +-43 0 -62 78 rquadto +-18 76 -18 264 rquadto +0 192 18 271 rquadto +18 78 62 78 rquadto +42 0 62 -81 rquadto +21 -81 21 -268 rquadto +} def +/P$d { +-64 3 rlineto +-65 1 -89 25 rquadto +-23 21 -23 76 rquadto +0 85 70 85 rquadto +32 0 56 -7 rquadto +25 -7 50 -18 rquadto +0 -164 rlineto +closepath +} def +/P$c { +75 0 110 31 rquadto +35 29 35 93 rquadto +0 309 rlineto +56 12 rlineto +0 21 rlineto +-125 0 rlineto +-9 -45 rlineto +-56 54 -142 54 rquadto +-117 0 -117 -135 rquadto +0 -46 17 -76 rquadto +17 -29 56 -45 rquadto +39 -15 114 -17 rquadto +68 -3 rlineto +0 -71 rlineto +0 -46 -17 -68 rquadto +-17 -23 -53 -23 rquadto +-50 0 -90 23 rquadto +-15 57 rlineto +-28 0 rlineto +0 -100 rlineto +79 -17 139 -17 rquadto +closepath +} def +/P$w { +-401 0 rlineto +0 -71 rlineto +90 -82 rlineto +87 -76 128 -123 rquadto +42 -46 59 -96 rquadto +18 -51 18 -115 rquadto +0 -64 -29 -96 rquadto +-28 -34 -93 -34 rquadto +-26 0 -54 7 rquadto +-26 7 -46 18 rquadto +-17 79 rlineto +-32 0 rlineto +0 -125 rlineto +89 -21 151 -21 rquadto +107 0 160 45 rquadto +54 43 54 126 rquadto +0 54 -21 103 rquadto +-21 48 -65 96 rquadto +-43 46 -145 134 rquadto +-43 35 -92 81 rquadto +337 0 rlineto +0 75 rlineto +} def +/P$1l { +-7 -92 -46 -134 rquadto +-37 -42 -110 -42 rquadto +-70 0 -110 46 rquadto +-40 46 -43 129 rquadto +312 0 rlineto +} def +/P$17 { +0 107 -76 167 rquadto +-76 59 -214 59 rquadto +-109 0 -217 -25 rquadto +-6 -189 rlineto +53 0 rlineto +31 125 rlineto +51 29 106 29 rquadto +71 0 110 -45 rquadto +40 -46 40 -128 rquadto +0 -70 -32 -107 rquadto +-31 -37 -103 -42 rquadto +-68 -4 rlineto +0 -70 rlineto +65 -4 rlineto +53 -4 78 -39 rquadto +25 -34 25 -104 rquadto +0 -65 -29 -103 rquadto +-29 -37 -84 -37 rquadto +-31 0 -51 9 rquadto +-20 9 -39 20 rquadto +-25 114 rlineto +-51 0 rlineto +0 -178 rlineto +60 -15 103 -20 rquadto +43 -6 85 -6 rquadto +264 0 264 193 rquadto +0 79 -42 129 rquadto +-42 48 -120 60 rquadto +198 23 198 196 rquadto +closepath +} def +/P$3m { +0 89 -56 134 rquadto +-56 45 -165 45 rquadto +-45 0 -100 -9 rquadto +-53 -9 -82 -20 rquadto +0 -146 rlineto +28 0 rlineto +31 82 rlineto +48 43 123 43 rquadto +123 0 123 -104 rquadto +0 -78 -96 -110 rquadto +-56 -18 rlineto +-64 -20 -93 -42 rquadto +-29 -21 -45 -53 rquadto +-15 -31 -15 -76 rquadto +0 -78 53 -123 rquadto +54 -45 145 -45 rquadto +65 0 164 20 rquadto +0 129 rlineto +-29 0 rlineto +-26 -68 rlineto +-34 -31 -106 -31 rquadto +-51 0 -78 26 rquadto +-26 25 -26 68 rquadto +0 35 23 60 rquadto +25 23 75 40 rquadto +92 31 120 46 rquadto +29 14 50 35 rquadto +20 20 31 48 rquadto +10 26 10 67 rquadto +closepath +} def +/P$r { +0 -78 -31 -112 rquadto +-29 -35 -95 -35 rquadto +-64 0 -92 34 rquadto +-28 32 -28 114 rquadto +0 82 28 115 rquadto +29 32 92 32 rquadto +65 0 95 -34 rquadto +31 -34 31 -114 rquadto +closepath +} def +/P$2q { +0 -142 -71 -221 rquadto +-70 -81 -198 -81 rquadto +-129 0 -201 79 rquadto +-70 79 -70 223 rquadto +0 142 71 226 rquadto +71 82 198 82 rquadto +131 0 201 -81 rquadto +70 -81 70 -228 rquadto +} def +/P$2o { +-4 15 rlineto +-12 43 -39 114 rquadto +-96 248 rlineto +282 0 rlineto +-96 -250 rlineto +-15 -35 -29 -82 rquadto +-15 -45 rlineto +} def +/P$2m { +0 -756 rlineto +101 0 rlineto +0 671 rlineto +382 0 rlineto +0 84 rlineto +-484 0 rlineto +} def +/P$3h { +0 28 -20 48 rquadto +-20 20 -48 20 rquadto +-28 0 -48 -20 rquadto +-20 -20 -20 -48 rquadto +0 -28 20 -48 rquadto +20 -20 48 -20 rquadto +28 0 48 20 rquadto +20 20 20 48 rquadto +closepath +} def +/P$e { +0 87 -60 137 rquadto +-59 50 -170 50 rquadto +-93 0 -176 -20 rquadto +-4 -137 rlineto +31 0 rlineto +21 90 rlineto +20 10 54 18 rquadto +34 7 65 7 rquadto +76 0 112 -34 rquadto +37 -35 37 -117 rquadto +0 -64 -34 -96 rquadto +-34 -34 -104 -37 rquadto +-70 -4 rlineto +0 -40 rlineto +70 -3 rlineto +54 -3 81 -34 rquadto +26 -31 26 -95 rquadto +0 -65 -28 -95 rquadto +-28 -31 -90 -31 rquadto +-26 0 -54 7 rquadto +-28 7 -50 18 rquadto +-17 79 rlineto +-32 0 rlineto +0 -125 rlineto +48 -12 82 -17 rquadto +35 -4 71 -4 rquadto +209 0 209 160 rquadto +0 68 -37 109 rquadto +-37 39 -106 50 rquadto +89 9 131 50 rquadto +42 40 42 114 rquadto +} def +/P$23 { +0 368 rlineto +0 57 10 89 rquadto +10 31 35 45 rquadto +25 14 73 14 rquadto +68 0 109 -46 rquadto +40 -48 40 -132 rquadto +0 -337 rlineto +96 0 rlineto +0 457 rlineto +0 101 3 123 rquadto +-92 0 rlineto +0 -3 -1 -14 rquadto +0 -12 -1 -26 rquadto +0 -15 0 -59 rquadto +-1 0 rlineto +-34 60 -78 85 rquadto +-43 25 -107 25 rquadto +-96 0 -140 -46 rquadto +-43 -48 -43 -157 rquadto +0 -387 rlineto +96 0 rlineto +} def +/P$5 { +-25 0 rlineto +-170 -451 rlineto +-173 451 rlineto +-26 0 rlineto +-217 -631 rlineto +-56 -14 rlineto +0 -25 rlineto +250 0 rlineto +0 25 rlineto +-96 14 rlineto +156 460 rlineto +176 -454 rlineto +21 0 rlineto +168 454 rlineto +148 -460 rlineto +-101 -14 rlineto +0 -25 rlineto +217 0 rlineto +0 25 rlineto +-57 14 rlineto +-214 631 rlineto +closepath +} def +/P$1n { +-26 56 -71 81 rquadto +-43 23 -109 23 rquadto +-109 0 -160 -73 rquadto +-51 -75 -51 -225 rquadto +0 -304 212 -304 rquadto +67 0 110 25 rquadto +43 23 70 76 rquadto +1 0 rlineto +-1 -65 rlineto +0 -240 rlineto +96 0 rlineto +0 676 rlineto +0 90 3 120 rquadto +-92 0 rlineto +-1 -9 -3 -39 rquadto +-1 -31 -1 -54 rquadto +-3 0 rlineto +closepath +} def +/P$3q { +0 160 rlineto +-28 0 rlineto +-35 -70 rlineto +-32 0 -76 9 rquadto +-42 7 -75 21 rquadto +0 446 rlineto +103 15 rlineto +0 28 rlineto +-282 0 rlineto +0 -28 rlineto +75 -15 rlineto +0 -507 rlineto +-75 -17 rlineto +0 -28 rlineto +173 0 rlineto +6 75 rlineto +37 -32 101 -60 rquadto +65 -29 104 -29 rquadto +9 0 rlineto +} def +/P$q { +0 53 -26 90 rquadto +-26 37 -70 57 rquadto +56 20 85 64 rquadto +31 43 31 106 rquadto +0 92 -53 139 rquadto +-51 46 -162 46 rquadto +-209 0 -209 -185 rquadto +0 -65 31 -107 rquadto +31 -42 84 -62 rquadto +-42 -20 -68 -56 rquadto +-26 -37 -26 -92 rquadto +0 -81 50 -125 rquadto +50 -45 143 -45 rquadto +90 0 140 45 rquadto +50 43 50 125 rquadto +closepath +} def +/P$1m { +0 -368 rlineto +0 -57 -12 -89 rquadto +-10 -31 -35 -45 rquadto +-23 -14 -71 -14 rquadto +-70 0 -110 48 rquadto +-39 46 -39 131 rquadto +0 337 rlineto +-96 0 rlineto +0 -457 rlineto +0 -101 -3 -123 rquadto +90 0 rlineto +1 3 1 15 rquadto +0 10 0 26 rquadto +1 14 3 57 rquadto +1 0 rlineto +32 -60 76 -85 rquadto +43 -25 109 -25 rquadto +95 0 139 48 rquadto +45 46 45 156 rquadto +0 387 rlineto +-96 0 rlineto +} def +/P$26 { +0 121 31 175 rquadto +32 51 104 51 rquadto +82 0 118 -56 rquadto +37 -57 37 -176 rquadto +0 -115 -37 -168 rquadto +-35 -54 -117 -54 rquadto +-73 0 -106 54 rquadto +-31 53 -31 175 rquadto +} def +/P$2r { +-192 0 -228 -198 rquadto +100 -17 rlineto +9 62 43 98 rquadto +34 34 84 34 rquadto +56 0 87 -39 rquadto +32 -39 32 -112 rquadto +0 -450 rlineto +-145 0 rlineto +0 -82 rlineto +248 0 rlineto +0 531 rlineto +0 109 -60 173 rquadto +-59 62 -162 62 rquadto +} def +/P$33 { +48 -26 101 -45 rquadto +53 -18 93 -18 rquadto +43 0 81 17 rquadto +37 15 56 51 rquadto +48 -26 114 -46 rquadto +65 -21 109 -21 rquadto +151 0 151 175 rquadto +0 393 rlineto +76 15 rlineto +0 28 rlineto +-270 0 rlineto +0 -28 rlineto +89 -15 rlineto +0 -381 rlineto +0 -109 -101 -109 rquadto +-17 0 -39 3 rquadto +-21 1 -43 4 rquadto +-21 3 -42 7 rquadto +-20 4 -32 6 rquadto +10 34 10 75 rquadto +0 393 rlineto +89 15 rlineto +0 28 rlineto +-282 0 rlineto +0 -28 rlineto +87 -15 rlineto +0 -381 rlineto +0 -53 -26 -81 rquadto +-26 -28 -81 -28 rquadto +-56 0 -139 18 rquadto +0 471 rlineto +90 15 rlineto +0 28 rlineto +-271 0 rlineto +0 -28 rlineto +76 -15 rlineto +0 -507 rlineto +-76 -17 rlineto +0 -28 rlineto +175 0 rlineto +4 48 rlineto +} def +/P$2 { +0 -106 -31 -153 rquadto +-29 -48 -95 -48 rquadto +-64 0 -92 46 rquadto +-28 45 -28 154 rquadto +0 109 28 156 rquadto +29 46 92 46 rquadto +64 0 95 -48 rquadto +31 -48 31 -154 rquadto +closepath +} def +/P$v { +134 12 rlineto +0 26 rlineto +-353 0 rlineto +0 -26 rlineto +134 -12 rlineto +0 -534 rlineto +-131 46 rlineto +0 -25 rlineto +190 -109 rlineto +25 0 rlineto +0 621 rlineto +} def +/P$x { +-101 -15 rlineto +0 -42 rlineto +375 0 rlineto +0 42 rlineto +-89 15 rlineto +0 475 rlineto +0 126 -70 196 rquadto +-70 68 -200 68 rquadto +-43 0 -87 -6 rquadto +-42 -4 -67 -12 rquadto +0 -178 rlineto +53 0 rlineto +17 104 rlineto +10 14 31 21 rquadto +20 7 45 7 rquadto +40 0 67 -28 rquadto +26 -28 26 -84 rquadto +0 -565 rlineto +} def +/P$29 { +0 117 -46 204 rquadto +-45 87 -129 134 rquadto +-82 46 -192 46 rquadto +-282 0 rlineto +0 -756 rlineto +250 0 rlineto +192 0 296 96 rquadto +104 95 104 273 rquadto +closepath +} def +/P$3l { +243 -264 rlineto +-62 -17 rlineto +0 -28 rlineto +210 0 rlineto +0 28 rlineto +-73 15 rlineto +-170 173 rlineto +218 335 rlineto +64 15 rlineto +0 28 rlineto +-243 0 rlineto +0 -28 rlineto +54 -15 rlineto +-164 -257 rlineto +-78 85 rlineto +0 171 rlineto +62 15 rlineto +0 28 rlineto +-243 0 rlineto +0 -28 rlineto +75 -15 rlineto +0 -814 rlineto +-87 -15 rlineto +0 -28 rlineto +193 0 rlineto +0 614 rlineto +} def +/P$18 { +0 276 rlineto +129 17 rlineto +0 42 rlineto +-407 0 rlineto +0 -42 rlineto +93 -17 rlineto +0 -668 rlineto +-101 -15 rlineto +0 -42 rlineto +654 0 rlineto +0 210 rlineto +-54 0 rlineto +-18 -137 rlineto +-28 -4 -95 -6 rquadto +-65 -3 -103 -3 rquadto +-96 0 rlineto +0 321 rlineto +190 0 rlineto +18 -100 rlineto +51 0 rlineto +0 265 rlineto +-51 0 rlineto +-18 -101 rlineto +-190 0 rlineto +} def +/P$2e { +0 82 -62 128 rquadto +-62 43 -173 43 rquadto +-109 0 -168 -35 rquadto +-57 -35 -75 -110 rquadto +84 -17 rlineto +12 46 51 68 rquadto +39 21 107 21 rquadto +73 0 106 -21 rquadto +34 -23 34 -68 rquadto +0 -34 -23 -54 rquadto +-23 -21 -76 -35 rquadto +-68 -18 rlineto +-82 -21 -118 -42 rquadto +-34 -20 -54 -50 rquadto +-20 -29 -20 -73 rquadto +0 -79 56 -120 rquadto +57 -42 165 -42 rquadto +96 0 153 34 rquadto +56 34 71 107 rquadto +-87 10 rlineto +-7 -39 -43 -59 rquadto +-34 -20 -93 -20 rquadto +-65 0 -96 20 rquadto +-29 18 -29 59 rquadto +0 25 12 42 rquadto +12 15 37 26 rquadto +25 10 106 31 rquadto +76 18 110 35 rquadto +34 15 53 35 rquadto +20 20 31 46 rquadto +10 25 10 57 rquadto +} def +/P$1u { +0 -796 rlineto +96 0 rlineto +0 796 rlineto +-96 0 rlineto +} def +/P$3t { +0 79 -54 125 rquadto +-54 45 -154 45 rquadto +-84 0 -157 -18 rquadto +-4 -125 rlineto +28 0 rlineto +20 82 rlineto +17 9 48 17 rquadto +31 6 57 6 rquadto +70 0 103 -31 rquadto +32 -31 32 -104 rquadto +0 -59 -31 -89 rquadto +-29 -29 -93 -32 rquadto +-62 -3 rlineto +0 -35 rlineto +62 -4 rlineto +50 -3 73 -31 rquadto +23 -28 23 -84 rquadto +0 -59 -26 -85 rquadto +-25 -28 -81 -28 rquadto +-21 0 -48 6 rquadto +-25 6 -43 17 rquadto +-15 71 rlineto +-29 0 rlineto +0 -112 rlineto +43 -12 75 -15 rquadto +31 -3 62 -3 rquadto +189 0 189 143 rquadto +0 62 -34 98 rquadto +-32 35 -93 45 rquadto +79 7 117 45 rquadto +39 35 39 101 rquadto +} def +/P$2a { +0 -140 -78 -214 rquadto +-76 -75 -221 -75 rquadto +-146 0 rlineto +0 592 rlineto +168 0 rlineto +84 0 146 -35 rquadto +62 -35 96 -104 rquadto +34 -68 34 -162 rquadto +} def +/P$3d { +0 -142 -26 -204 rquadto +-26 -62 -85 -62 rquadto +-56 0 -81 59 rquadto +-25 59 -25 207 rquadto +0 148 25 209 rquadto +25 60 81 60 rquadto +57 0 84 -62 rquadto +28 -64 28 -207 rquadto +} def +/P$2b { +0 304 -214 304 rquadto +-65 0 -109 -23 rquadto +-43 -25 -71 -78 rquadto +0 0 rlineto +0 17 -3 51 rquadto +-1 34 -3 39 rquadto +-93 0 rlineto +3 -29 3 -120 rquadto +0 -676 rlineto +96 0 rlineto +0 226 rlineto +0 35 -1 82 rquadto +1 0 rlineto +28 -56 71 -79 rquadto +43 -25 109 -25 rquadto +110 0 162 75 rquadto +51 73 51 223 rquadto +closepath +} def +/P$1h { +53 0 93 -23 rquadto +42 -23 65 -65 rquadto +25 -42 25 -87 rquadto +0 -48 rlineto +-106 3 rlineto +-67 0 -103 14 rquadto +-34 12 -53 39 rquadto +-18 26 -18 70 rquadto +0 46 25 73 rquadto +25 25 71 25 rquadto +} def +/P$2i { +-196 -314 rlineto +-235 0 rlineto +0 314 rlineto +-101 0 rlineto +0 -756 rlineto +356 0 rlineto +126 0 196 57 rquadto +70 56 70 157 rquadto +0 84 -50 142 rquadto +-48 57 -135 71 rquadto +215 326 rlineto +-118 0 rlineto +closepath +} def +/P$24 { +50 0 70 -29 rquadto +21 -29 21 -85 rquadto +0 -192 rlineto +0 -53 28 -89 rquadto +28 -35 75 -46 rquadto +0 -1 rlineto +-45 -10 -75 -46 rquadto +-28 -35 -28 -89 rquadto +0 -190 rlineto +0 -57 -21 -85 rquadto +-20 -29 -70 -29 rquadto +-31 0 rlineto +0 -68 rlineto +70 0 rlineto +70 0 106 40 rquadto +35 40 35 117 rquadto +0 193 rlineto +0 62 28 93 rquadto +28 31 87 32 rquadto +0 68 rlineto +-59 1 -87 32 rquadto +-28 31 -28 93 rquadto +0 193 rlineto +0 75 -37 115 rquadto +-35 42 -104 42 rquadto +-70 0 rlineto +0 -68 rlineto +31 0 rlineto +closepath +} def +/P$1r { +0 -120 -35 -175 rquadto +-35 -54 -120 -54 rquadto +-84 0 -121 56 rquadto +-37 54 -37 173 rquadto +0 114 35 171 rquadto +37 57 118 57 rquadto +85 0 123 -54 rquadto +37 -56 37 -175 rquadto +} def +/P$2p { +0 118 -45 207 rquadto +-45 89 -131 137 rquadto +-84 46 -200 46 rquadto +-115 0 -201 -46 rquadto +-84 -48 -129 -137 rquadto +-43 -89 -43 -207 rquadto +0 -182 100 -284 rquadto +100 -103 276 -103 rquadto +115 0 200 46 rquadto +85 45 129 132 rquadto +45 87 45 207 rquadto +closepath +} def +/P$10 { +39 -20 rlineto +82 -42 148 -42 rquadto +151 0 151 162 rquadto +0 350 rlineto +56 14 rlineto +0 39 rlineto +-275 0 rlineto +0 -39 rlineto +50 -14 rlineto +0 -326 rlineto +0 -50 -21 -76 rquadto +-20 -28 -57 -28 rquadto +-45 0 -89 20 rquadto +0 410 rlineto +50 14 rlineto +0 39 rlineto +-273 0 rlineto +0 -39 rlineto +53 -14 rlineto +0 -445 rlineto +-53 -14 rlineto +0 -39 rlineto +214 0 rlineto +7 48 rlineto +} def +/P$2h { +0 -154 48 -278 rquadto +48 -123 150 -232 rquadto +92 0 rlineto +-100 110 -146 237 rquadto +-46 125 -46 275 rquadto +0 148 45 273 rquadto +46 125 148 239 rquadto +-92 0 rlineto +-101 -109 -150 -232 rquadto +-48 -125 -48 -279 rquadto +0 -1 rlineto +} def +/P$3 { +0 -26 rlineto +104 -12 rlineto +0 -573 rlineto +-25 0 rlineto +-123 0 -168 9 rquadto +-12 101 rlineto +-32 0 rlineto +0 -153 rlineto +575 0 rlineto +0 153 rlineto +-32 0 rlineto +-12 -101 rlineto +-15 -3 -65 -6 rquadto +-48 -3 -106 -3 rquadto +-25 0 rlineto +0 573 rlineto +104 12 rlineto +0 26 rlineto +-303 0 rlineto +} def +/P$3i { +101 15 rlineto +0 28 rlineto +-309 0 rlineto +0 -28 rlineto +101 -15 rlineto +0 -507 rlineto +-84 -17 rlineto +0 -28 rlineto +190 0 rlineto +0 553 rlineto +} def +/P$t { +0 -98 54 -153 rquadto +54 -54 156 -54 rquadto +110 0 162 81 rquadto +53 79 53 251 rquadto +0 165 -67 253 rquadto +-67 85 -187 85 rquadto +-79 0 -146 -15 rquadto +0 -114 rlineto +32 0 rlineto +15 70 rlineto +15 7 42 14 rquadto +26 4 53 4 rquadto +78 0 120 -68 rquadto +42 -68 46 -201 rquadto +-75 42 -151 42 rquadto +-85 0 -135 -51 rquadto +-48 -51 -48 -143 rquadto +closepath +} def +/P$34 { +96 0 142 40 rquadto +46 39 46 121 rquadto +0 403 rlineto +75 15 rlineto +0 28 rlineto +-164 0 rlineto +-12 -59 rlineto +-71 71 -184 71 rquadto +-153 0 -153 -178 rquadto +0 -59 23 -98 rquadto +23 -39 73 -59 rquadto +51 -20 148 -21 rquadto +89 -3 rlineto +0 -93 rlineto +0 -60 -23 -90 rquadto +-21 -29 -68 -29 rquadto +-64 0 -115 31 rquadto +-21 73 rlineto +-35 0 rlineto +0 -129 rlineto +103 -21 181 -21 rquadto +closepath +} def +/P$1g { +-87 0 -131 -45 rquadto +-43 -46 -43 -128 rquadto +0 -90 59 -137 rquadto +59 -48 190 -53 rquadto +131 -1 rlineto +0 -31 rlineto +0 -71 -31 -101 rquadto +-29 -31 -93 -31 rquadto +-64 0 -93 21 rquadto +-29 21 -35 70 rquadto +-101 -7 rlineto +25 -157 234 -157 rquadto +109 0 164 50 rquadto +56 50 56 145 rquadto +0 250 rlineto +0 43 10 65 rquadto +10 21 42 21 rquadto +14 0 32 -4 rquadto +0 60 rlineto +-37 7 -75 7 rquadto +-54 0 -79 -28 rquadto +-23 -28 -26 -87 rquadto +-3 0 rlineto +-37 65 -87 93 rquadto +-48 28 -118 28 rquadto +closepath +} def +/P$31 { +0 -350 rlineto +-409 0 rlineto +0 350 rlineto +-101 0 rlineto +0 -756 rlineto +101 0 rlineto +0 320 rlineto +409 0 rlineto +0 -320 rlineto +103 0 rlineto +0 756 rlineto +-103 0 rlineto +} def +/P$15 { +0 409 -257 409 rquadto +-125 0 -189 -104 rquadto +-62 -104 -62 -304 rquadto +0 -193 62 -296 rquadto +64 -104 193 -104 rquadto +123 0 187 103 rquadto +65 101 65 298 rquadto +closepath +} def +/P$38 { +0 10 rlineto +0 87 18 135 rquadto +18 48 59 75 rquadto +40 25 106 25 rquadto +34 0 81 -4 rquadto +46 -6 76 -14 rquadto +0 35 rlineto +-29 18 -82 34 rquadto +-51 14 -106 14 rquadto +-139 0 -203 -75 rquadto +-64 -75 -64 -240 rquadto +0 -156 64 -232 rquadto +65 -76 187 -76 rquadto +228 0 228 260 rquadto +0 51 rlineto +-365 0 rlineto +closepath +} def +/P$z { +-50 1 rlineto +-56 3 -78 31 rquadto +-21 26 -21 87 rquadto +0 50 17 73 rquadto +17 23 45 23 rquadto +40 0 87 -20 rquadto +0 -196 rlineto +} def +/P$1y { +0 -92 rlineto +96 0 rlineto +0 92 rlineto +-96 0 rlineto +closepath +} def +/P$3r { +0 314 -278 314 rquadto +-135 0 -204 -79 rquadto +-67 -81 -67 -234 rquadto +0 -151 67 -231 rquadto +68 -79 209 -79 rquadto +135 0 204 78 rquadto +68 78 68 232 rquadto +closepath +} def +/P$22 { +0 -368 rlineto +0 -84 -23 -115 rquadto +-23 -32 -82 -32 rquadto +-62 0 -98 46 rquadto +-35 46 -35 132 rquadto +0 337 rlineto +-95 0 rlineto +0 -457 rlineto +0 -101 -3 -123 rquadto +90 0 rlineto +1 3 1 15 rquadto +0 10 0 26 rquadto +1 14 3 57 rquadto +1 0 rlineto +31 -62 70 -85 rquadto +40 -25 100 -25 rquadto +65 0 103 26 rquadto +39 26 54 84 rquadto +1 0 rlineto +29 -59 71 -84 rquadto +43 -26 103 -26 rquadto +89 0 128 48 rquadto +40 46 40 156 rquadto +0 387 rlineto +-95 0 rlineto +0 -368 rlineto +0 -84 -23 -115 rquadto +-23 -32 -82 -32 rquadto +-64 0 -100 46 rquadto +-34 46 -34 132 rquadto +0 337 rlineto +-95 0 rlineto +} def +/P$1a { +-34 0 -51 37 rquadto +-17 37 -17 134 rquadto +126 0 rlineto +0 -78 -4 -109 rquadto +-4 -32 -18 -46 rquadto +-12 -15 -34 -15 rquadto +} def +/P$3o { +103 15 rlineto +0 28 rlineto +-309 0 rlineto +0 -28 rlineto +101 -15 rlineto +0 -814 rlineto +-101 -15 rlineto +0 -28 rlineto +206 0 rlineto +0 857 rlineto +} def +/P$1s { +-46 14 -96 14 rquadto +-115 0 -115 -132 rquadto +0 -387 rlineto +-67 0 rlineto +0 -70 rlineto +70 0 rlineto +28 -129 rlineto +65 0 rlineto +0 129 rlineto +106 0 rlineto +0 70 rlineto +-106 0 rlineto +0 367 rlineto +0 42 12 59 rquadto +14 15 48 15 rquadto +18 0 54 -6 rquadto +0 70 rlineto +} def +/P$1p { +-125 0 -195 81 rquadto +-70 81 -70 221 rquadto +0 139 73 223 rquadto +73 84 196 84 rquadto +159 0 239 -157 rquadto +84 42 rlineto +-46 98 -132 150 rquadto +-84 50 -195 50 rquadto +-114 0 -198 -46 rquadto +-82 -48 -126 -135 rquadto +-43 -89 -43 -209 rquadto +0 -181 96 -284 rquadto +98 -103 271 -103 rquadto +120 0 201 48 rquadto +81 46 118 139 rquadto +-96 32 rlineto +-26 -65 -85 -100 rquadto +-57 -35 -137 -35 rquadto +} def +/P$30 { +0 -121 -32 -173 rquadto +-32 -53 -104 -53 rquadto +-56 0 -89 25 rquadto +-32 23 -50 75 rquadto +-17 51 -17 132 rquadto +0 115 35 170 rquadto +37 53 120 53 rquadto +71 0 104 -53 rquadto +32 -53 32 -176 rquadto +} def +/P$6 { +0 9 rlineto +0 67 14 104 rquadto +15 37 46 57 rquadto +31 18 81 18 rquadto +26 0 62 -4 rquadto +35 -4 59 -9 rquadto +0 26 rlineto +-23 15 -64 26 rquadto +-39 10 -81 10 rquadto +-107 0 -157 -57 rquadto +-48 -57 -48 -184 rquadto +0 -120 50 -179 rquadto +50 -59 143 -59 rquadto +176 0 176 201 rquadto +0 39 rlineto +-282 0 rlineto +closepath +} def +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3720 2533 moveto +P$0 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4662 2302 moveto +P$1 +4573 2302 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11603 2533 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12203 2402 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20020 2549 moveto +P$5 +20376 2302 moveto +P$6 +20482 2100 moveto +P$7 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27603 2533 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28209 2038 moveto +P$8 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +35757 2239 moveto +P$9 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36475 2061 moveto +P$a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +43567 2357 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44326 2064 moveto +P$c +44392 2299 moveto +P$d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +51517 2357 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52203 2402 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +59720 2533 moveto +P$0 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60662 2302 moveto +P$1 +60573 2302 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +67603 2533 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +68203 2402 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76020 2549 moveto +P$5 +76376 2302 moveto +P$6 +76482 2100 moveto +P$7 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83603 2533 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84209 2038 moveto +P$8 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91757 2239 moveto +P$9 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92475 2061 moveto +P$a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +99567 2357 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100326 2064 moveto +P$c +100392 2299 moveto +P$d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +107517 2357 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +108203 2402 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +115720 2533 moveto +P$0 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +116662 2302 moveto +P$1 +116573 2302 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +123603 2533 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +124203 2402 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +132020 2549 moveto +P$5 +132376 2302 moveto +P$6 +132482 2100 moveto +P$7 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +139603 2533 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +140209 2038 moveto +P$8 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +147757 2239 moveto +P$9 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +148475 2061 moveto +P$a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +155567 2357 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +156326 2064 moveto +P$c +156392 2299 moveto +P$d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +163517 2357 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +164203 2402 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +171720 2533 moveto +P$0 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +172662 2302 moveto +P$1 +172573 2302 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +179603 2533 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +180203 2402 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +188020 2549 moveto +P$5 +188376 2302 moveto +P$6 +188482 2100 moveto +P$7 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +195603 2533 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +196209 2038 moveto +P$8 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +203757 2239 moveto +P$9 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +204475 2061 moveto +P$a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3960 3555 moveto +P$e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4462 3403 moveto +P$f +4371 3403 moveto +P$g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11960 3555 moveto +P$e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12306 3694 moveto +P$h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20056 3694 moveto +P$h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28195 3733 moveto +P$i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36210 3555 moveto +P$j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44145 3589 moveto +P$k +44060 3189 moveto +P$l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +51987 3350 moveto +P$m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60220 3530 moveto +P$n +60018 3705 moveto +P$o +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +67848 3233 moveto +P$p +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76192 3238 moveto +P$q +76123 3557 moveto +P$r +76104 3238 moveto +P$s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83782 3278 moveto +P$t +83993 3110 moveto +P$u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91806 3694 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92462 3403 moveto +P$f +92371 3403 moveto +P$g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +99806 3694 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100306 3694 moveto +P$h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +107806 3694 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +108445 3733 moveto +P$i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +115806 3694 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +116460 3555 moveto +P$j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +123806 3694 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +124395 3589 moveto +P$k +124310 3189 moveto +P$l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +131806 3694 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +132237 3350 moveto +P$m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +139806 3694 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +140470 3530 moveto +P$n +140268 3705 moveto +P$o +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +147806 3694 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +148098 3233 moveto +P$p +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +155806 3694 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +156442 3238 moveto +P$q +156373 3557 moveto +P$r +156354 3238 moveto +P$s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +163806 3694 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +164032 3278 moveto +P$t +164243 3110 moveto +P$u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +171945 3733 moveto +P$w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +172462 3403 moveto +P$f +172371 3403 moveto +P$g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +179945 3733 moveto +P$w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +180306 3694 moveto +P$h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +187945 3733 moveto +P$w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +188445 3733 moveto +P$i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +195945 3733 moveto +P$w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +196460 3555 moveto +P$j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +203945 3733 moveto +P$w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +204395 3589 moveto +P$k +204310 3189 moveto +P$l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4793 392 moveto +P$x +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5420 557 moveto +P$y +5457 843 moveto +P$z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5954 617 moveto +P$10 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +6812 1071 moveto +P$11 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7420 557 moveto +P$y +7457 843 moveto +P$z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7970 684 moveto +P$12 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +8470 1137 moveto +P$13 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +9648 1120 moveto +P$14 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10254 723 moveto +P$15 +10082 723 moveto +P$16 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10848 1120 moveto +P$14 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11459 906 moveto +P$17 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +108556 784 moveto +P$18 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +109239 556 moveto +P$19 +109232 615 moveto +P$1a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +109896 829 moveto +P$1b +109521 339 moveto +P$1c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +110420 684 moveto +P$12 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +111062 1071 moveto +P$11 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +111670 557 moveto +P$y +111707 843 moveto +P$z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +112220 684 moveto +P$12 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +112720 1137 moveto +P$13 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +113898 1120 moveto +P$14 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +114504 723 moveto +P$15 +114332 723 moveto +P$16 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +115098 1120 moveto +P$14 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +115709 906 moveto +P$17 +fill +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +0 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +8000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +16000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +24000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +32000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +40000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +48000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +56000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +64000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +72000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +80000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +88000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +96000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +104000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +112000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +120000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +128000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +136000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +144000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +152000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +160000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +168000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +176000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +184000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +192000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +200000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +208000 4100 moveto +0 47503 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +0 4100 moveto +208000 0 rlineto +stroke +100 setlinewidth +0.75 0.75 0.75 setrgbcolor +newpath +0 51603 moveto +208000 0 rlineto +stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +20000 10494 moveto +0 1032 rlineto +stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +20000 11527 moveto +3900 0 rlineto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +23500 11127 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +23500 11127 lineto +closepath eofill +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +23500 11127 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +23500 11127 lineto +closepath stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +68000 12159 moveto +0 1032 rlineto +stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +68000 13192 moveto +3900 0 rlineto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +71500 12792 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +71500 12792 lineto +closepath eofill +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +71500 12792 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +71500 12792 lineto +closepath stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +68000 12159 moveto +0 2697 rlineto +stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +68000 14856 moveto +3900 0 rlineto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +71500 14456 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +71500 14456 lineto +closepath eofill +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +71500 14456 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +71500 14456 lineto +closepath stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +92000 15489 moveto +0 1032 rlineto +stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +92000 16521 moveto +3900 0 rlineto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +95500 16121 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +95500 16121 lineto +closepath eofill +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +95500 16121 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +95500 16121 lineto +closepath stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +92000 15489 moveto +0 2697 rlineto +stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +92000 18186 moveto +3900 0 rlineto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +95500 17786 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +95500 17786 lineto +closepath eofill +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +95500 17786 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +95500 17786 lineto +closepath stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +92000 15489 moveto +0 4362 rlineto +stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +92000 19851 moveto +3900 0 rlineto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +95500 19451 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +95500 19451 lineto +closepath eofill +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +95500 19451 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +95500 19451 lineto +closepath stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +108000 20484 moveto +0 1032 rlineto +stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +108000 21516 moveto +3900 0 rlineto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +111500 21116 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +111500 21116 lineto +closepath eofill +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +111500 21116 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +111500 21116 lineto +closepath stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +52000 30408 moveto +0 1032 rlineto +stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +52000 31440 moveto +3900 0 rlineto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +55500 31040 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +55500 31040 lineto +closepath eofill +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +55500 31040 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +55500 31040 lineto +closepath stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +60000 32073 moveto +0 1032 rlineto +stroke +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +60000 33105 moveto +3900 0 rlineto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +63500 32705 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +63500 32705 lineto +closepath eofill +150 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +63500 32705 moveto +0 400 rlineto +0 400 rlineto +400 -400 rlineto +63500 32705 lineto +closepath stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +0 5732 moveto +500 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +5800 5732 moveto +202100 0 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +23600 1264 200 7564 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +200 7564 moveto +23600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +200 8829 moveto +23600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +200 7564 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +23800 7564 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +23600 1264 200 9229 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +200 9229 moveto +23600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +200 10494 moveto +23600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +200 9229 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +23800 9229 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +47600 1264 24200 10894 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +24200 10894 moveto +47600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +24200 12159 moveto +47600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +24200 10894 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +71800 10894 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +127600 1264 72200 12559 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +72200 12559 moveto +127600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +72200 13824 moveto +127600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +72200 12559 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +199800 12559 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +23600 1264 72200 14224 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +72200 14224 moveto +23600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +72200 15489 moveto +23600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +72200 14224 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +95800 14224 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +103600 1264 96200 15889 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +96200 15889 moveto +103600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +96200 17154 moveto +103600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +96200 15889 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +199800 15889 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +111600 1264 96200 17554 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +96200 17554 moveto +111600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +96200 18819 moveto +111600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +96200 17554 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +207800 17554 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +15600 1264 96200 19219 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +96200 19219 moveto +15600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +96200 20484 moveto +15600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +96200 19219 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +111800 19219 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +95600 1264 112200 20884 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +112200 20884 moveto +95600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +112200 22148 moveto +95600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +112200 20884 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +207800 20884 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +7600 1264 120200 22548 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +120200 22548 moveto +7600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +120200 23813 moveto +7600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +120200 22548 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +127800 22548 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +0 25646 moveto +500 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +5900 25646 moveto +202000 0 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +63600 1264 200 27478 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +200 27478 moveto +63600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +200 28743 moveto +63600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +200 27478 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +63800 27478 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +39600 1264 16200 29143 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +16200 29143 moveto +39600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +16200 30408 moveto +39600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +16200 29143 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +55800 29143 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +7600 1264 56200 30808 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +56200 30808 moveto +7600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +56200 32073 moveto +7600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +56200 30808 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +63800 30808 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +111600 1264 64200 32473 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +64200 32473 moveto +111600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +64200 33738 moveto +111600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +64200 32473 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +175800 32473 moveto +0 1264 rlineto +stroke +0.89 0.89 0.94 setrgbcolor +39600 1264 48200 34138 simplerect +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +48200 34138 moveto +39600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +48200 35403 moveto +39600 0 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +48200 34138 moveto +0 1264 rlineto +stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +87800 34138 moveto +0 1264 rlineto +stroke +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1675 5919 moveto +P$1d +1528 5570 moveto +P$1e +1571 5909 moveto +P$1f +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1921 6142 moveto +P$1g +1943 6069 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2448 5838 moveto +P$1i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3339 6131 moveto +P$1j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3648 5861 moveto +P$1k +3962 5788 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4543 6131 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5140 6038 moveto +P$1n +4848 5841 moveto +P$1o +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1025 7912 moveto +P$1p +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1965 8306 moveto +P$1q +1864 8306 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2443 8596 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2896 8591 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2976 8596 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3865 8306 moveto +P$1q +3764 8306 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3973 8596 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4173 8596 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4448 8326 moveto +P$1k +4762 8252 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4976 8596 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5348 8346 moveto +P$1v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +6382 8387 moveto +P$1w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +6548 8302 moveto +P$1i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7170 8115 moveto +P$1x +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7673 7891 moveto +P$1y +7673 8596 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7948 8302 moveto +P$1i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +8570 8115 moveto +P$1x +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +9296 8591 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +9875 8824 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10101 8596 moveto +P$21 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10712 8596 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11612 8596 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12321 8607 moveto +P$1g +12343 8534 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +13143 8596 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +13468 8015 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +14048 8326 moveto +P$1k +14362 8252 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +14573 8596 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +14750 8756 moveto +P$24 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1334 10261 moveto +P$25 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2065 9970 moveto +P$1q +1964 9970 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2540 10167 moveto +P$1n +2248 9970 moveto +P$26 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2848 9991 moveto +P$1k +3162 9917 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3373 10261 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3548 10011 moveto +P$1v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4575 9731 moveto +P$27 +4471 9733 moveto +P$28 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4821 10272 moveto +P$1g +4843 10199 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5639 10261 moveto +P$1j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5948 9991 moveto +P$1k +6262 9917 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +6696 10256 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7275 10489 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +8142 9875 moveto +P$29 +8039 9875 moveto +P$2a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +8421 10272 moveto +P$1g +8443 10199 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +9243 10261 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +9473 9556 moveto +P$1y +9473 10261 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +9748 9991 moveto +P$1k +10062 9917 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10273 10261 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10450 10420 moveto +P$24 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +25342 11540 moveto +P$29 +25239 11540 moveto +P$2a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +25621 11937 moveto +P$1g +25643 11863 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +26296 11921 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +26448 11656 moveto +P$1k +26762 11582 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27343 11926 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28065 11632 moveto +P$2b +27964 11635 moveto +P$2c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28321 11937 moveto +P$1g +28343 11863 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +29143 11926 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +29739 11926 moveto +P$1j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +30421 11937 moveto +P$1g +30443 11863 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +30968 11345 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +31593 11415 moveto +P$2d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +32210 11765 moveto +P$2e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +32448 11656 moveto +P$1k +32762 11582 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +33196 11921 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +33245 11926 moveto +P$2f +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +33948 11656 moveto +P$1k +34262 11582 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +34843 11926 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +35575 12154 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +35801 11926 moveto +P$21 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36412 11926 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +37312 11926 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +38021 11937 moveto +P$1g +38043 11863 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +38843 11926 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +39168 11345 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +39748 11656 moveto +P$1k +40062 11582 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +40273 11926 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +40450 12085 moveto +P$24 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +72992 13602 moveto +P$2g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +73696 13586 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +73773 12886 moveto +P$1y +73773 13591 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +73973 13591 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +74148 13341 moveto +P$1v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +75175 13061 moveto +P$27 +75071 13063 moveto +P$28 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +75421 13602 moveto +P$1g +75443 13528 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76239 13591 moveto +P$1j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76548 13321 moveto +P$1k +76862 13247 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +77296 13586 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +77668 13305 moveto +P$2h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +78625 13591 moveto +P$2i +78610 13052 moveto +P$2j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +79482 13381 moveto +P$1w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +80182 13381 moveto +P$1w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +80875 13061 moveto +P$27 +80771 13063 moveto +P$28 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +81121 13602 moveto +P$1g +81143 13528 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +81576 13591 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +82410 13430 moveto +P$2e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +82648 13321 moveto +P$1k +82962 13247 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83176 13591 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83798 13306 moveto +P$2k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84475 13819 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +85342 13205 moveto +P$29 +85239 13205 moveto +P$2a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +85621 13602 moveto +P$1g +85643 13528 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +86443 13591 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +86673 12886 moveto +P$1y +86673 13591 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +86948 13321 moveto +P$1k +87262 13247 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +87473 13591 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +87650 13750 moveto +P$2l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +88575 13819 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +88790 13591 moveto +P$2m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +89468 13010 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +90339 13591 moveto +P$1j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +90721 13602 moveto +P$1g +90743 13528 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91610 13430 moveto +P$2e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91750 13750 moveto +P$24 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +73342 14870 moveto +P$29 +73239 14870 moveto +P$2a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +74026 15256 moveto +P$2n +73767 14576 moveto +P$2o +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +74903 14875 moveto +P$2p +74798 14875 moveto +P$2q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +75048 15006 moveto +P$1v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +75501 15256 moveto +P$21 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76143 15256 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76596 15251 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76748 14985 moveto +P$1k +77062 14912 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +77276 15256 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +77793 14745 moveto +P$2d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +78121 15267 moveto +P$1g +78143 15193 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +78648 14962 moveto +P$1i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +79248 14985 moveto +P$1k +79562 14912 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +80210 15095 moveto +P$2e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +80875 15484 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +81245 15267 moveto +P$2r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +81768 14675 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +82273 15256 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +82473 14551 moveto +P$1y +82473 15256 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +82768 14675 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83710 15095 moveto +P$2e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83850 15415 moveto +P$2l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84775 15484 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +85001 15256 moveto +P$21 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +85612 15256 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +86512 15256 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +87221 15267 moveto +P$1g +87243 15193 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +88043 15256 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +88368 14675 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +88948 14985 moveto +P$1k +89262 14912 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +89473 15256 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +89650 15415 moveto +P$24 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +97226 16921 moveto +P$2n +96967 16241 moveto +P$2o +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +97468 16339 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +98196 16916 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +98370 16439 moveto +P$1x +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +98948 16650 moveto +P$1k +99262 16577 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +99843 16921 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100296 16916 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100373 16216 moveto +P$1y +100373 16921 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100693 16410 moveto +P$2d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100873 16216 moveto +P$1y +100873 16921 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +101045 16921 moveto +P$2f +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +101673 16216 moveto +P$1y +101673 16921 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +101948 16650 moveto +P$1k +102262 16577 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +102476 16921 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +102968 16339 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +103843 16921 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +104293 17149 moveto +P$2s +104442 16630 moveto +P$2t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +105175 17149 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +105401 16921 moveto +P$21 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +106012 16921 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +106912 16921 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +107621 16932 moveto +P$1g +107643 16858 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +108443 16921 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +108768 16339 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +109348 16650 moveto +P$1k +109662 16577 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +109873 16921 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +110050 17080 moveto +P$24 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +97282 18376 moveto +P$1w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +97448 18315 moveto +P$1k +97762 18242 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +97976 18586 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +98629 18586 moveto +P$2u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +98973 17881 moveto +P$1y +98973 18586 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +99248 18292 moveto +P$1i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +99848 18315 moveto +P$1k +100162 18242 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100348 18336 moveto +P$1v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +101382 18376 moveto +P$1w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +101548 18292 moveto +P$1i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +102170 18104 moveto +P$1x +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +102673 17881 moveto +P$1y +102673 18586 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +102948 18292 moveto +P$1i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +103570 18104 moveto +P$1x +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +104296 18581 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +105012 18586 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +105573 17881 moveto +P$1y +105573 18586 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +105996 18581 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +107042 18200 moveto +P$29 +106939 18200 moveto +P$2a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +107321 18596 moveto +P$1g +107343 18523 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +107996 18581 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +108148 18315 moveto +P$1k +108462 18242 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +109043 18586 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +109245 18586 moveto +P$2f +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +109968 18004 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +110693 18814 moveto +P$2s +110842 18295 moveto +P$2t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +111076 18586 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +111473 17881 moveto +P$1y +111473 18586 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +111793 18075 moveto +P$2d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +112093 18075 moveto +P$2d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +112775 18814 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +113145 18596 moveto +P$2r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +113668 18004 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +114173 18586 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +114373 17881 moveto +P$1y +114373 18586 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +114668 18004 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +115610 18425 moveto +P$2e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +115750 18745 moveto +P$24 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +112592 20261 moveto +P$2g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +113296 20246 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +113373 19546 moveto +P$1y +113373 20250 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +113573 20250 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +113748 20000 moveto +P$1v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +114775 19721 moveto +P$27 +114671 19722 moveto +P$28 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +115021 20261 moveto +P$1g +115043 20188 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +115839 20250 moveto +P$1j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +116148 19980 moveto +P$1k +116462 19907 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +116896 20246 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +117268 19964 moveto +P$2h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +118025 19566 moveto +P$1p +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +118473 20250 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +118748 19980 moveto +P$1k +119062 19907 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +119421 20261 moveto +P$1g +119443 20188 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +120243 20250 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +120825 19566 moveto +P$1p +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +121276 20250 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +122165 19960 moveto +P$1q +122064 19960 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +122643 20250 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +123045 20261 moveto +P$2r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +123965 19960 moveto +P$1q +123864 19960 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +124565 19957 moveto +P$2b +124464 19960 moveto +P$2c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +124898 19966 moveto +P$2k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +125575 20479 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +126442 19864 moveto +P$29 +126339 19864 moveto +P$2a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +126721 20261 moveto +P$1g +126743 20188 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +127543 20250 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +127773 19546 moveto +P$1y +127773 20250 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +128048 19980 moveto +P$1k +128362 19907 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +128573 20250 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +128750 20410 moveto +P$24 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +113342 21529 moveto +P$29 +113239 21529 moveto +P$2a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +113965 21625 moveto +P$1q +113864 21625 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +114148 21622 moveto +P$1i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +115039 21915 moveto +P$1j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +115348 21645 moveto +P$1k +115662 21572 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +115876 21915 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +116775 22143 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +117642 21529 moveto +P$29 +117539 21529 moveto +P$2a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +117921 21926 moveto +P$1g +117943 21853 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +118743 21915 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +118973 21211 moveto +P$1y +118973 21915 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +119248 21645 moveto +P$1k +119562 21572 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +119773 21915 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +119950 22075 moveto +P$24 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +128290 23580 moveto +P$2v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +129634 23580 moveto +P$25 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +130021 23591 moveto +P$1g +130043 23518 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +130473 22876 moveto +P$1y +130473 23580 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +130673 23580 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +131482 23371 moveto +P$1w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +131648 23310 moveto +P$1k +131962 23236 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +132176 23580 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +132829 23580 moveto +P$2u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +133173 22876 moveto +P$1y +133173 23580 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +133448 23286 moveto +P$1i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +134048 23310 moveto +P$1k +134362 23236 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +135075 23808 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +135254 23199 moveto +P$2w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +136248 23310 moveto +P$1k +136562 23236 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +136776 23580 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +137665 23290 moveto +P$1q +137564 23290 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +137750 23740 moveto +P$24 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1192 25372 moveto +P$2x +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1776 26045 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2665 25754 moveto +P$1q +2564 25754 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3143 26045 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3596 26040 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3748 25775 moveto +P$1k +4062 25701 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4643 26045 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5240 25951 moveto +P$1n +4948 25754 moveto +P$1o +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1193 28510 moveto +P$2y +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1865 28219 moveto +P$1q +1764 28219 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2312 28510 moveto +P$22 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3365 28216 moveto +P$2z +3264 28219 moveto +P$30 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3965 28219 moveto +P$1q +3864 28219 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4443 28510 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4748 28240 moveto +P$1k +5062 28166 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5643 28510 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +6096 28505 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +6248 28240 moveto +P$1k +6562 28166 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7143 28510 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7875 28738 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +8054 28129 moveto +P$2w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +9048 28240 moveto +P$1k +9362 28166 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +9576 28510 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10465 28219 moveto +P$1q +10364 28219 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10550 28669 moveto +P$2l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11475 28738 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11845 28521 moveto +P$2r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12368 27929 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12873 28510 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +13073 27805 moveto +P$1y +13073 28510 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +13368 27929 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +14310 28349 moveto +P$2e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +14450 28669 moveto +P$24 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +17334 30175 moveto +P$25 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +17648 29905 moveto +P$1k +17962 29831 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +18270 29694 moveto +P$1x +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +18776 30175 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +19610 30014 moveto +P$2e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20265 29881 moveto +P$2z +20164 29884 moveto +P$30 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20376 30175 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20921 30186 moveto +P$1g +20943 30112 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +21448 29881 moveto +P$1i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +22070 29694 moveto +P$1x +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +22573 29470 moveto +P$1y +22573 30175 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +22993 30403 moveto +P$2s +23142 29884 moveto +P$2t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +23739 30175 moveto +P$1j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +24048 29905 moveto +P$1k +24362 29831 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +24573 29470 moveto +P$1y +24573 30175 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +24996 30170 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +25575 30403 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +25790 30175 moveto +P$2m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +26468 29594 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27339 30175 moveto +P$1j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27721 30186 moveto +P$1g +27743 30112 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28610 30014 moveto +P$2e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28750 30334 moveto +P$24 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +64825 31840 moveto +P$2i +64810 31301 moveto +P$2j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +65565 31549 moveto +P$1q +65464 31549 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +65768 31259 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +66496 31835 moveto +P$1s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +66648 31569 moveto +P$1k +66962 31496 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +67176 31840 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +68075 32068 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +68254 31459 moveto +P$2w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +69248 31569 moveto +P$1k +69562 31496 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +69776 31840 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +70665 31549 moveto +P$1q +70564 31549 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +70750 31999 moveto +P$24 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +65226 33505 moveto +P$2n +64967 32825 moveto +P$2o +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +65975 32975 moveto +P$27 +65871 32977 moveto +P$28 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +66101 33505 moveto +P$21 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +66348 33255 moveto +P$1v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +67326 33505 moveto +P$2n +67067 32825 moveto +P$2o +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +67843 33505 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +68565 33211 moveto +P$2b +68464 33214 moveto +P$2c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +68673 32800 moveto +P$1y +68673 33505 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +69243 33505 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +69840 33411 moveto +P$1n +69548 33214 moveto +P$26 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +70168 32923 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +71043 33505 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +71493 33733 moveto +P$2s +71642 33214 moveto +P$2t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +72375 33733 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +72554 33123 moveto +P$2w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +73548 33234 moveto +P$1k +73862 33161 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +74076 33505 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +74965 33214 moveto +P$1q +74864 33214 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +75050 33664 moveto +P$2l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +75975 33733 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76190 33505 moveto +P$2m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76868 32923 moveto +P$23 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +77739 33505 moveto +P$1j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +78121 33516 moveto +P$1g +78143 33442 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +79010 33344 moveto +P$2e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +79150 33664 moveto +P$24 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +48690 35170 moveto +P$2v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +49376 35170 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +49776 35170 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +50665 34879 moveto +P$1q +50564 34879 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +50776 35170 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +51148 34920 moveto +P$1v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52101 35170 moveto +P$31 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52521 35181 moveto +P$1g +52543 35107 moveto +P$1h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +53343 35170 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +53940 35076 moveto +P$1n +53648 34879 moveto +P$26 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +54173 35170 moveto +P$1u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +54373 34465 moveto +P$1y +54373 35170 moveto +P$1z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +54943 35170 moveto +P$1m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +55393 35398 moveto +P$2s +55542 34879 moveto +P$2t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +56275 35398 moveto +P$20 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +56454 34788 moveto +P$2w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +57448 34899 moveto +P$1k +57762 34826 moveto +P$1l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +57976 35170 moveto +P$1t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +58865 34879 moveto +P$1q +58764 34879 moveto +P$1r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +58950 35329 moveto +P$24 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +278 36765 moveto +P$32 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +606 36268 moveto +P$33 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1606 36268 moveto +P$33 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2695 36207 moveto +P$34 +2779 36512 moveto +P$35 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3206 36268 moveto +P$36 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3898 36646 moveto +P$37 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4565 36516 moveto +P$38 +4703 36254 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5232 36773 moveto +P$3a +fill +100 setlinewidth +0 0 0 setrgbcolor +newpath +0 37098 moveto +208000 0 rlineto +stroke +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4165 37746 moveto +P$3c +4084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4665 37746 moveto +P$3c +4584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12165 37746 moveto +P$3c +12084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12665 37746 moveto +P$3c +12584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +19525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20165 37746 moveto +P$3c +20084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20665 37746 moveto +P$3c +20584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28165 37746 moveto +P$3c +28084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28665 37746 moveto +P$3c +28584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +35525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36165 37746 moveto +P$3c +36084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36665 37746 moveto +P$3c +36584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +43525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44165 37746 moveto +P$3c +44084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44665 37746 moveto +P$3c +44584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +51525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52165 37746 moveto +P$3c +52084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52665 37746 moveto +P$3c +52584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +59525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60165 37746 moveto +P$3c +60084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60665 37746 moveto +P$3c +60584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +67525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +68165 37746 moveto +P$3c +68084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +68665 37746 moveto +P$3c +68584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +75525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76165 37746 moveto +P$3c +76084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76665 37746 moveto +P$3c +76584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84165 37746 moveto +P$3c +84084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84665 37746 moveto +P$3c +84584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92165 37746 moveto +P$3c +92084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92665 37746 moveto +P$3c +92584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +99525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100165 37746 moveto +P$3c +100084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100665 37746 moveto +P$3c +100584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +107525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +108165 37746 moveto +P$3c +108084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +108665 37746 moveto +P$3c +108584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +115525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +116165 37746 moveto +P$3c +116084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +116665 37746 moveto +P$3c +116584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +123525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +124165 37746 moveto +P$3c +124084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +124665 37746 moveto +P$3c +124584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +131525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +132165 37746 moveto +P$3c +132084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +132665 37746 moveto +P$3c +132584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +139525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +140165 37746 moveto +P$3c +140084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +140665 37746 moveto +P$3c +140584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +147525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +148165 37746 moveto +P$3c +148084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +148665 37746 moveto +P$3c +148584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +155525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +156165 37746 moveto +P$3c +156084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +156665 37746 moveto +P$3c +156584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +163525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +164165 37746 moveto +P$3c +164084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +164665 37746 moveto +P$3c +164584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +171525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +172165 37746 moveto +P$3c +172084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +172665 37746 moveto +P$3c +172584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +179525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +180165 37746 moveto +P$3c +180084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +180665 37746 moveto +P$3c +180584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +187525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +188165 37746 moveto +P$3c +188084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +188665 37746 moveto +P$3c +188584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +195525 38007 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +196165 37746 moveto +P$3c +196084 37746 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +196665 37746 moveto +P$3c +196584 37746 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +754 39585 moveto +P$3f +423 39165 moveto +P$3g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1195 39407 moveto +P$34 +1279 39712 moveto +P$35 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1706 39468 moveto +P$36 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2440 39224 moveto +P$3h +2434 39973 moveto +P$3i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2765 39716 moveto +P$38 +2903 39454 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3432 39973 moveto +P$3a +fill +100 setlinewidth +0 0 0 setrgbcolor +newpath +0 40298 moveto +208000 0 rlineto +stroke +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3525 41207 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4165 40946 moveto +P$3c +4084 40946 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4665 40946 moveto +P$3c +4584 40946 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11525 41207 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12165 40946 moveto +P$3c +12084 40946 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12665 40946 moveto +P$3c +12584 40946 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +19525 41207 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20165 40946 moveto +P$3c +20084 40946 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20665 40946 moveto +P$3c +20584 40946 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +75525 41207 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76165 40946 moveto +P$3c +76084 40946 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76665 40946 moveto +P$3c +76584 40946 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83525 41207 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84165 40946 moveto +P$3c +84084 40946 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84665 40946 moveto +P$3c +84584 40946 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91525 41207 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92165 40946 moveto +P$3c +92084 40946 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92665 40946 moveto +P$3c +92584 40946 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +99650 41243 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +100165 40946 moveto +P$3c +100084 40946 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +100665 40946 moveto +P$3c +100584 40946 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +107650 41243 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +108165 40946 moveto +P$3c +108084 40946 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +108665 40946 moveto +P$3c +108584 40946 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +115650 41243 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +116165 40946 moveto +P$3c +116084 40946 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +116665 40946 moveto +P$3c +116584 40946 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +123650 41243 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +124165 40946 moveto +P$3c +124084 40946 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +124665 40946 moveto +P$3c +124584 40946 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +131650 41243 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +132165 40946 moveto +P$3c +132084 40946 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +132665 40946 moveto +P$3c +132584 40946 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +139650 41243 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +140165 40946 moveto +P$3c +140084 40946 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +140665 40946 moveto +P$3c +140584 40946 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +147650 41243 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +148165 40946 moveto +P$3c +148084 40946 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +148665 40946 moveto +P$3c +148584 40946 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +155650 41243 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +156165 40946 moveto +P$3c +156084 40946 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +156665 40946 moveto +P$3c +156584 40946 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +163650 41243 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +164165 40946 moveto +P$3c +164084 40946 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +164665 40946 moveto +P$3c +164584 40946 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +171650 41243 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +172165 40946 moveto +P$3c +172084 40946 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +172665 40946 moveto +P$3c +172584 40946 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +179650 41243 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +180165 40946 moveto +P$3c +180084 40946 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +180665 40946 moveto +P$3c +180584 40946 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +187650 41243 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +188165 40946 moveto +P$3c +188084 40946 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +188665 40946 moveto +P$3c +188584 40946 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +195650 41243 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +196165 40946 moveto +P$3c +196084 40946 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +196665 40946 moveto +P$3c +196584 40946 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +203525 41207 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +204165 40946 moveto +P$3c +204084 40946 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +204665 40946 moveto +P$3c +204584 40946 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +400 42399 moveto +P$3k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +998 43046 moveto +P$37 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1718 42929 moveto +P$3l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2495 42607 moveto +P$34 +2579 42912 moveto +P$35 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3259 43049 moveto +P$3m +fill +100 setlinewidth +0 0 0 setrgbcolor +newpath +0 43498 moveto +208000 0 rlineto +stroke +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +19525 44407 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20165 44146 moveto +P$3c +20084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20665 44146 moveto +P$3c +20584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27525 44407 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28165 44146 moveto +P$3c +28084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28665 44146 moveto +P$3c +28584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +35525 44407 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36165 44146 moveto +P$3c +36084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36665 44146 moveto +P$3c +36584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +43525 44407 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44165 44146 moveto +P$3c +44084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44665 44146 moveto +P$3c +44584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +51525 44407 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52165 44146 moveto +P$3c +52084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52665 44146 moveto +P$3c +52584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +67525 44407 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +68165 44146 moveto +P$3c +68084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +68665 44146 moveto +P$3c +68584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +75650 44443 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +76165 44146 moveto +P$3c +76084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +76665 44146 moveto +P$3c +76584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +83650 44443 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +84165 44146 moveto +P$3c +84084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +84665 44146 moveto +P$3c +84584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +91650 44443 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +92165 44146 moveto +P$3c +92084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +92665 44146 moveto +P$3c +92584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +99650 44443 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +100165 44146 moveto +P$3c +100084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +100665 44146 moveto +P$3c +100584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +107650 44443 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +108165 44146 moveto +P$3c +108084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +108665 44146 moveto +P$3c +108584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +115650 44443 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +116165 44146 moveto +P$3c +116084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +116665 44146 moveto +P$3c +116584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +123650 44443 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +124165 44146 moveto +P$3c +124084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +124665 44146 moveto +P$3c +124584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +131650 44443 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +132165 44146 moveto +P$3c +132084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +132665 44146 moveto +P$3c +132584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +139650 44443 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +140165 44146 moveto +P$3c +140084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +140665 44146 moveto +P$3c +140584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +147650 44443 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +148165 44146 moveto +P$3c +148084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +148665 44146 moveto +P$3c +148584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +155650 44443 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +156165 44146 moveto +P$3c +156084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +156665 44146 moveto +P$3c +156584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +163650 44443 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +164165 44146 moveto +P$3c +164084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +164665 44146 moveto +P$3c +164584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +171650 44443 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +172165 44146 moveto +P$3c +172084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +172665 44146 moveto +P$3c +172584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +179525 44407 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +180165 44146 moveto +P$3c +180084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +180665 44146 moveto +P$3c +180584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +187525 44407 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +188165 44146 moveto +P$3c +188084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +188665 44146 moveto +P$3c +188584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +195525 44407 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +196165 44146 moveto +P$3c +196084 44146 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +196665 44146 moveto +P$3c +196584 44146 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +260 45615 moveto +P$3n +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +698 46246 moveto +P$37 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1432 46373 moveto +P$3o +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1840 45624 moveto +P$3h +1834 46373 moveto +P$3i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2198 46246 moveto +P$37 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3159 46249 moveto +P$3m +fill +100 setlinewidth +0 0 0 setrgbcolor +newpath +0 46698 moveto +208000 0 rlineto +stroke +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4165 47346 moveto +P$3c +4084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4665 47346 moveto +P$3c +4584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12165 47346 moveto +P$3c +12084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12665 47346 moveto +P$3c +12584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +19525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20165 47346 moveto +P$3c +20084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20665 47346 moveto +P$3c +20584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28165 47346 moveto +P$3c +28084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28665 47346 moveto +P$3c +28584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +35525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36165 47346 moveto +P$3c +36084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36665 47346 moveto +P$3c +36584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +43525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44165 47346 moveto +P$3c +44084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44665 47346 moveto +P$3c +44584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +51525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52165 47346 moveto +P$3c +52084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52665 47346 moveto +P$3c +52584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +59525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60165 47346 moveto +P$3c +60084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60665 47346 moveto +P$3c +60584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +75525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76165 47346 moveto +P$3c +76084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76665 47346 moveto +P$3c +76584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84165 47346 moveto +P$3c +84084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84665 47346 moveto +P$3c +84584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92165 47346 moveto +P$3c +92084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92665 47346 moveto +P$3c +92584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +99525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100165 47346 moveto +P$3c +100084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100665 47346 moveto +P$3c +100584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +107525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +108165 47346 moveto +P$3c +108084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +108665 47346 moveto +P$3c +108584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +115525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +116165 47346 moveto +P$3c +116084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +116665 47346 moveto +P$3c +116584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +123525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +124165 47346 moveto +P$3c +124084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +124665 47346 moveto +P$3c +124584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +131525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +132165 47346 moveto +P$3c +132084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +132665 47346 moveto +P$3c +132584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +139525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +140165 47346 moveto +P$3c +140084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +140665 47346 moveto +P$3c +140584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +147525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +148165 47346 moveto +P$3c +148084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +148665 47346 moveto +P$3c +148584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +155525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +156165 47346 moveto +P$3c +156084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +156665 47346 moveto +P$3c +156584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +163525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +164165 47346 moveto +P$3c +164084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +164665 47346 moveto +P$3c +164584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +171525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +172165 47346 moveto +P$3c +172084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +172665 47346 moveto +P$3c +172584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +179525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +180165 47346 moveto +P$3c +180084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +180665 47346 moveto +P$3c +180584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +187525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +188165 47346 moveto +P$3c +188084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +188665 47346 moveto +P$3c +188584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +195525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +196165 47346 moveto +P$3c +196084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +196665 47346 moveto +P$3c +196584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +203525 47607 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +204165 47346 moveto +P$3c +204084 47346 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +204665 47346 moveto +P$3c +204584 47346 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +815 49573 moveto +P$3p +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1065 49316 moveto +P$38 +1203 49054 moveto +P$39 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1921 49004 moveto +P$3q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2500 49315 moveto +P$3r +2385 49315 moveto +P$3s +fill +100 setlinewidth +0 0 0 setrgbcolor +newpath +0 49898 moveto +208000 0 rlineto +stroke +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3525 50807 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4165 50546 moveto +P$3c +4084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4665 50546 moveto +P$3c +4584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11525 50807 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12165 50546 moveto +P$3c +12084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12665 50546 moveto +P$3c +12584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +19525 50807 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20165 50546 moveto +P$3c +20084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20665 50546 moveto +P$3c +20584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27525 50807 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28165 50546 moveto +P$3c +28084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28665 50546 moveto +P$3c +28584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +35525 50807 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36165 50546 moveto +P$3c +36084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36665 50546 moveto +P$3c +36584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +43525 50807 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44165 50546 moveto +P$3c +44084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44665 50546 moveto +P$3c +44584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +51650 50843 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +52165 50546 moveto +P$3c +52084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +52665 50546 moveto +P$3c +52584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +59665 50682 moveto +P$3t +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +60165 50546 moveto +P$3c +60084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +60665 50546 moveto +P$3c +60584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +67650 50843 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +68165 50546 moveto +P$3c +68084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +68665 50546 moveto +P$3c +68584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +75650 50843 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +76165 50546 moveto +P$3c +76084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +76665 50546 moveto +P$3c +76584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +83650 50843 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +84165 50546 moveto +P$3c +84084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +84665 50546 moveto +P$3c +84584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91525 50807 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92165 50546 moveto +P$3c +92084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92665 50546 moveto +P$3c +92584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +99525 50807 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100165 50546 moveto +P$3c +100084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100665 50546 moveto +P$3c +100584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +107525 50807 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +108165 50546 moveto +P$3c +108084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +108665 50546 moveto +P$3c +108584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +115525 50807 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +116165 50546 moveto +P$3c +116084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +116665 50546 moveto +P$3c +116584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +123650 50843 moveto +P$3j +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +124165 50546 moveto +P$3c +124084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +1 0 0 setrgbcolor +newpath +124665 50546 moveto +P$3c +124584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +131525 50807 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +132165 50546 moveto +P$3c +132084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +132665 50546 moveto +P$3c +132584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +139525 50807 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +140165 50546 moveto +P$3c +140084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +140665 50546 moveto +P$3c +140584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +147525 50807 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +148165 50546 moveto +P$3c +148084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +148665 50546 moveto +P$3c +148584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +155525 50807 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +156165 50546 moveto +P$3c +156084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +156665 50546 moveto +P$3c +156584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +163525 50807 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +164165 50546 moveto +P$3c +164084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +164665 50546 moveto +P$3c +164584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +171525 50807 moveto +P$3b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +172165 50546 moveto +P$3c +172084 50546 moveto +P$3d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +172665 50546 moveto +P$3c +172584 50546 moveto +P$3e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3960 53558 moveto +P$e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4462 53407 moveto +P$f +4371 53407 moveto +P$g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11960 53558 moveto +P$e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12306 53697 moveto +P$h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20056 53697 moveto +P$h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28195 53736 moveto +P$i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36210 53558 moveto +P$j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44145 53593 moveto +P$k +44060 53193 moveto +P$l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +51987 53353 moveto +P$m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60220 53533 moveto +P$n +60018 53708 moveto +P$o +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +67848 53236 moveto +P$p +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76192 53241 moveto +P$q +76123 53560 moveto +P$r +76104 53241 moveto +P$s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83782 53282 moveto +P$t +83993 53113 moveto +P$u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91806 53697 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92462 53407 moveto +P$f +92371 53407 moveto +P$g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +99806 53697 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100306 53697 moveto +P$h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +107806 53697 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +108445 53736 moveto +P$i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +115806 53697 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +116460 53558 moveto +P$j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +123806 53697 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +124395 53593 moveto +P$k +124310 53193 moveto +P$l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +131806 53697 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +132237 53353 moveto +P$m +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +139806 53697 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +140470 53533 moveto +P$n +140268 53708 moveto +P$o +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +147806 53697 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +148098 53236 moveto +P$p +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +155806 53697 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +156442 53241 moveto +P$q +156373 53560 moveto +P$r +156354 53241 moveto +P$s +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +163806 53697 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +164032 53282 moveto +P$t +164243 53113 moveto +P$u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +171945 53736 moveto +P$w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +172462 53407 moveto +P$f +172371 53407 moveto +P$g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +179945 53736 moveto +P$w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +180306 53697 moveto +P$h +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +187945 53736 moveto +P$w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +188445 53736 moveto +P$i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +195945 53736 moveto +P$w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +196460 53558 moveto +P$j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +203945 53736 moveto +P$w +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +204395 53593 moveto +P$k +204310 53193 moveto +P$l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3720 52536 moveto +P$0 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4662 52305 moveto +P$1 +4573 52305 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11603 52536 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12203 52405 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20020 52552 moveto +P$5 +20376 52305 moveto +P$6 +20482 52103 moveto +P$7 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27603 52536 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28209 52041 moveto +P$8 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +35757 52243 moveto +P$9 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36475 52064 moveto +P$a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +43567 52360 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44326 52068 moveto +P$c +44392 52302 moveto +P$d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +51517 52360 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +52203 52405 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +59720 52536 moveto +P$0 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +60662 52305 moveto +P$1 +60573 52305 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +67603 52536 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +68203 52405 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +76020 52552 moveto +P$5 +76376 52305 moveto +P$6 +76482 52103 moveto +P$7 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +83603 52536 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +84209 52041 moveto +P$8 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +91757 52243 moveto +P$9 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +92475 52064 moveto +P$a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +99567 52360 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +100326 52068 moveto +P$c +100392 52302 moveto +P$d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +107517 52360 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +108203 52405 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +115720 52536 moveto +P$0 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +116662 52305 moveto +P$1 +116573 52305 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +123603 52536 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +124203 52405 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +132020 52552 moveto +P$5 +132376 52305 moveto +P$6 +132482 52103 moveto +P$7 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +139603 52536 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +140209 52041 moveto +P$8 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +147757 52243 moveto +P$9 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +148475 52064 moveto +P$a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +155567 52360 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +156326 52068 moveto +P$c +156392 52302 moveto +P$d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +163517 52360 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +164203 52405 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +171720 52536 moveto +P$0 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +172662 52305 moveto +P$1 +172573 52305 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +179603 52536 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +180203 52405 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +188020 52552 moveto +P$5 +188376 52305 moveto +P$6 +188482 52103 moveto +P$7 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +195603 52536 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +196209 52041 moveto +P$8 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +203757 52243 moveto +P$9 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +204475 52064 moveto +P$a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4793 54395 moveto +P$x +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5420 54560 moveto +P$y +5457 54846 moveto +P$z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5954 54620 moveto +P$10 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +6812 55075 moveto +P$11 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7420 54560 moveto +P$y +7457 54846 moveto +P$z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7970 54687 moveto +P$12 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +8470 55140 moveto +P$13 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +9648 55123 moveto +P$14 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10254 54726 moveto +P$15 +10082 54726 moveto +P$16 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10848 55123 moveto +P$14 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11459 54909 moveto +P$17 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +108556 54787 moveto +P$18 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +109239 54559 moveto +P$19 +109232 54618 moveto +P$1a +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +109896 54832 moveto +P$1b +109521 54342 moveto +P$1c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +110420 54687 moveto +P$12 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +111062 55075 moveto +P$11 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +111670 54560 moveto +P$y +111707 54846 moveto +P$z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +112220 54687 moveto +P$12 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +112720 55140 moveto +P$13 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +113898 55123 moveto +P$14 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +114504 54726 moveto +P$15 +114332 54726 moveto +P$16 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +115098 55123 moveto +P$14 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +115709 54909 moveto +P$17 +fill +grestore +showpage +%plantuml done +%%EOF diff --git a/20-implementierungsheft/assets/gantt.png b/20-implementierungsheft/assets/gantt.png new file mode 100644 index 0000000..b1b7e17 Binary files /dev/null and b/20-implementierungsheft/assets/gantt.png differ diff --git a/20-implementierungsheft/assets/help.png b/20-implementierungsheft/assets/help.png new file mode 100644 index 0000000..39a1b84 Binary files /dev/null and b/20-implementierungsheft/assets/help.png differ diff --git a/20-implementierungsheft/assets/lastupdate.png b/20-implementierungsheft/assets/lastupdate.png new file mode 100644 index 0000000..e9b7f5c Binary files /dev/null and b/20-implementierungsheft/assets/lastupdate.png differ diff --git a/20-implementierungsheft/assets/loading.png b/20-implementierungsheft/assets/loading.png new file mode 100644 index 0000000..cc95763 Binary files /dev/null and b/20-implementierungsheft/assets/loading.png differ diff --git a/20-implementierungsheft/assets/logo.pdf b/20-implementierungsheft/assets/logo.pdf new file mode 100644 index 0000000..91fd334 Binary files /dev/null and b/20-implementierungsheft/assets/logo.pdf differ diff --git a/20-implementierungsheft/assets/logo.svg b/20-implementierungsheft/assets/logo.svg new file mode 100644 index 0000000..1609066 --- /dev/null +++ b/20-implementierungsheft/assets/logo.svg @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Podcast Synchronisation made Efficient + + + + diff --git a/20-implementierungsheft/assets/navbar.png b/20-implementierungsheft/assets/navbar.png new file mode 100644 index 0000000..dd9f8e8 Binary files /dev/null and b/20-implementierungsheft/assets/navbar.png differ diff --git a/20-implementierungsheft/assets/password-margin.png b/20-implementierungsheft/assets/password-margin.png new file mode 100644 index 0000000..d9d4fa3 Binary files /dev/null and b/20-implementierungsheft/assets/password-margin.png differ diff --git a/20-implementierungsheft/assets/password.png b/20-implementierungsheft/assets/password.png new file mode 100644 index 0000000..68248a0 Binary files /dev/null and b/20-implementierungsheft/assets/password.png differ diff --git a/20-implementierungsheft/assets/passwordinput.png b/20-implementierungsheft/assets/passwordinput.png new file mode 100644 index 0000000..2419828 Binary files /dev/null and b/20-implementierungsheft/assets/passwordinput.png differ diff --git a/20-implementierungsheft/assets/passwordvalidator.png b/20-implementierungsheft/assets/passwordvalidator.png new file mode 100644 index 0000000..b089f7c Binary files /dev/null and b/20-implementierungsheft/assets/passwordvalidator.png differ diff --git a/20-implementierungsheft/assets/progresstime.png b/20-implementierungsheft/assets/progresstime.png new file mode 100644 index 0000000..6877a97 Binary files /dev/null and b/20-implementierungsheft/assets/progresstime.png differ diff --git a/20-implementierungsheft/assets/subscription.png b/20-implementierungsheft/assets/subscription.png new file mode 100644 index 0000000..58a84f9 Binary files /dev/null and b/20-implementierungsheft/assets/subscription.png differ diff --git a/20-implementierungsheft/implementierungsheft.tex b/20-implementierungsheft/implementierungsheft.tex new file mode 100644 index 0000000..ed54d59 --- /dev/null +++ b/20-implementierungsheft/implementierungsheft.tex @@ -0,0 +1,98 @@ +% \documentclass[a4paper, UTF8, 12pt]{article} +% \documentclass[a4paper, UTF8, 12pt]{scrbook} +\documentclass[parskip=half, a4paper, 12pt]{scrartcl} + +\usepackage[german]{babel} +\usepackage[dvipsnames]{xcolor} +% \usepackage{tikz} +% \usetikzlibrary{positioning} +% \usetikzlibrary{calc} +% \usetikzlibrary{arrows} +% \usetikzlibrary{intersections} +% \usepackage{tikz-uml} +% \usepackage{pgf-umlsd} +% \usepgflibrary{arrows} % for pgf-umlsd +% \tikzumlset{fill usecase=white} +\usepackage[margin=2.5cm]{geometry} +\usepackage{csquotes} +\usepackage[T1]{fontenc} +\usepackage{amsmath} +\usepackage{pdflscape} +\usepackage{graphicx} +\usepackage{caption} +\usepackage{subcaption} +\usepackage{float} +\usepackage{enumitem} +% \usepackage{textpos} +\usepackage{hyperref} +\usepackage{fancyhdr} +% \usepackage{multicol} +\usepackage{rest-api} +\usepackage{wrapfig} +\usepackage{textcomp} +\usepackage{ulem} +\usepackage{fourier} +\usepackage{array} +\usepackage{makecell} + + +\hypersetup{ +% ‘texdoc hyperref‘ for options + pdftitle={ + PSE\textsuperscript{2} + - Podcast Synchronisation made Efficient Pflichtenheft + }, + bookmarks=true, +} +\usepackage{csquotes} +\usepackage[toc]{glossaries} +\usepackage{lastpage} + +\renewcommand\theadalign{bc} +\renewcommand\theadfont{\bfseries} +\renewcommand\theadgape{\Gape[4pt]} +\renewcommand\cellgape{\Gape[4pt]} + +\include{sections/glossar} + +\title{Pflichtenheft} +\author{KIT Students et al} +\date{2.12.2022} + +\pagestyle{fancy} +\setkomafont{pageheadfoot}{\footnotesize\scshape} +\fancyhead{} % clear all header fields +% \fancyhead[L]{Pflichtenheft} +\fancyhead[L]{PSE\textsuperscript{2} - Podcast Synchronisation made Efficient} +% \fancyhead[R]{2.12.2022} +\fancyfoot{} % clear all footer fields +\fancyfoot[R]{\thepage{} / \pageref{LastPage}} +\fancyfoot[L]{Praxis der Softwareentwicklung} +\fancyfoot[C]{} + +\begin{document} + +\include{titlepage} +\setcounter{page}{1} + +\tableofcontents + +\include{sections/einleitung} + +\include{sections/methodology} + +\include{sections/frontend} +\newpage + +\include{sections/changes} + +\include{sections/timeline} + +\include{sections/features} + +\include{sections/tests} + +\printglossaries +% \glsaddall + +\end{document} diff --git a/20-implementierungsheft/sections/anforderungsanalyse.tex b/20-implementierungsheft/sections/anforderungsanalyse.tex new file mode 100644 index 0000000..9af8d4d --- /dev/null +++ b/20-implementierungsheft/sections/anforderungsanalyse.tex @@ -0,0 +1,185 @@ +\newcommand{\newrequirementlist}[1]{ + % https://www.overleaf.com/learn/latex/Lists#Creating_a_new_list_with_enumitem + \newlist{#1list}{enumerate}{1} + \setlist[#1list, 1] + { + before=\leavevmode, + label=\upshape\textlangle #1\arabic*\textrangle, + ref=\upshape\textlangle #1\arabic*\textrangle, + resume=#1list + } +} + +\newrequirementlist{RM} +\newrequirementlist{RS} +\newrequirementlist{RC} +\newrequirementlist{RW} + +\section{Anforderungsanalyse} + +\subsection{ Musskriterien }\label{r:musskriterien} + +Musskriterien: unabdingbare Leistungen der Software. + +\subsubsection*{ Funktionale Anforderungen } + +\begin{RMlist} + \item\label{r:login} Der Benutzer kann sich im Webfrontend mit einer + E-Mail-Adresse und einem Pass\-wort erstmalig registrieren und bei + abgeschlossener Registrierung fortan mit denselben Informationen + anmelden. + Für eine erfolgreiche Registrierung muss die angegebene + E-Mail-Adresse zuerst verifiziert werden.\\ + \item\label{r:store} Die Liste der \Glspl{abo} eines Benutzers sowie + der zeitliche Fortschritt beim Anhören(/Ansehen) von jeder begonnen + \Gls{episode} werden für jeden Benutzer gespeichert. + \item\label{r:sync} Die Liste der \Glspl{abo} eines Benutzers + sowie der zeitliche Fortschritt beim Anhören(/Ansehen) von jeder + begonnenen \Gls{episode} wird automatisch über alle von einem Benutzer + verknüpften \Gls{podcatcher} aktualisiert. + Dabei sind der zu synchronisierende Stand der \Glspl{abo} und der + zeitliche Fortschritt jeweils definiert als derjenige Stand, der + zeitlich am kürzesten zurückliegt.\\ + \item\label{r:ui} Das Webfrontend bietet dem Benutzer eine graphische + Benutzeroberfläche zur Navigation und zur Ansteuerung einzelner + Funktionalitäten.\\ + \item\label{r:reset-pw} Der Benutzer kann sein Passwort ändern und es + gibt eine ,,Passwort vergessen''-Funktion. + So kann ein angemeldeter Benutzer sein Passwort direkt im Webfrontend + ändern. + Im nicht angemeldeten Zustand kann der Benutzer sein Passwort über + die registrierte E-Mail-Adresse zurücksetzen.\\ + \item\label{r:show-podcasts} Das Webfrontend bietet dem Benutzer die + Möglichkeit, sich die Liste seiner \Glspl{abo} anzeigen zu + lassen. + Die dabei dargestellten Informationen beinhalten den Namen des + \Glspl{abo} und eine gerundete Angabe darüber, wie lange es her ist, + dass der Benutzer das letzte Mal eine \Gls{episode} dieses \Glspl{abo} + konsumiert hat.\\ +\end{RMlist} + +\subsubsection*{ Nicht-funktionale Anforderungen } + +\begin{RMlist} + \item\label{r:requests} Der Synchronisations-Server kann mindestens + 50 Anfragen pro Sekunde verarbeiten.\\ + \item\label{r:desktop-first} Das Webfrontend ist primär für + Desktop-Benutzer ausgelegt. + \item\label{r:gpodder} Der Datenaustausch erfolgt über die Gpodder + \Gls{rest-api} unter Verwendung des Datenformats \Gls{json}. + \item\label{r:persistent-storage} Die Speicherung der Daten eines + Benutzers \ref{r:store} über den Synchronisations-Server erfolgt + persistent in einer \Gls{db}. Diese Daten des Benutzers sind die + Liste seiner \Glspl{abo} und der zeitliche Fortschritt beim Anhören + (/Ansehen) aller begonnenen \Glspl{episode}. + \item\label{r:api-extension} Die \Gls{gpodder} wird um Funktionalitäten + zur verbesserten Kommunikation zwischen Front- und Backend erweitert + (siehe \ref{r:login}).\\ +\end{RMlist} + + +\subsection{ Sollkriterien }\label{r:sollkriterien} + +Sollkriterien: erstrebenswerte Leistungen. + +\subsubsection*{ Funktionale Anforderungen } + +\begin{RSlist} + \item\label{r:man} Das Webfrontend bietet die Möglichkeit eine nicht + ausgefüllte Benutzeranleitung für das Synchronisieren von \Glspl{podcast} + anzuzeigen.\\ + \item\label{r:delete-acc} Der Benutzer kann seinen Account löschen. + Daraufhin werden alle auf diesen Benutzer bezogenen Daten gelöscht.\\ +\end{RSlist} + +\subsubsection*{ Nicht-funktionale Anforderungen } + +\begin{RSlist} + \item\label{r:backend-libs} Das Backend wird in \Gls{java} unter Verwendung des + quelloffenen Frameworks \Gls{spring} implementiert. Weiter wird für die + \Gls{db} das relationale Open-Source Datenbankverwaltungssystem MariaDB + eingesetzt. + \item\label{r:ui-libs} Die Weboberfläche wird mithilfe der + \Gls{ui-lib} React oder des Webframeworks Vue in JavaScript und + mit dem Frontend-CSS-Framework Bootstrap entwickelt. + \item\label{r:ui-source} + Verwendete \Glspl{ui-lib} werden von einem \Gls{packagemanager}, wie dem Node + Package Manager (npm) bezogen. Ein \Gls{bundler}, wie vite oder Webpack, + stellt ein minimiertes Skript von den Teilen der Bibliotheken zusammen, + die vom Code verwendet werden. Das minimierte Skript wird dann auf einem + eigenen Server für die Weboberfläche bereitgestellt. + \item\label{r:spa} Die Weboberfläche wird als \Gls{spa} + entworfen und aktualisiert dynamisch ihren Inhalt, sobald es eine + Antwort auf eine Anfrage an die \Gls{gpodder} \ref{r:api-compat} erhält. + \item\label{r:parse-metadata} Das Backend kann die Metadaten von + \Gls{podcast} aus + deren \Gls{rss}-Feeds (XML-Dateien) für die Anzeige im Webfrontend + \ref{r:show-podcasts} parsen. + \item\label{r:pw-requirements} Verwendete Passwörter müssen mindestens 8 Zeichen, + ein Sonderzeichen, eine Zahl sowie einen Klein- und einen Großbuchstaben + enthalten. + Diese Anforderungen gelten also insbesondere für über die Funktionen + \ref{r:login} und \ref{r:reset-pw} neu gewählte Passwörter.\\ + \item\label{r:save-pw} Passwörter werden sicher mittels \Gls{salt-hash} + gespeichert. + \item\label{r:session} Im Webfrontend angemeldete Benutzer bleiben dort + angemeldet. Hierfür wird eine Kombination aus einem \Gls{session-token} und + einem \Gls{cookie} verwendet.\\ +\end{RSlist} + +\subsection{ Kannkriterien } + +Kannkriterien: Leistungen, die enthalten sein können. + +\subsubsection*{ Funktionale Anforderungen } + +\begin{RClist} + \item\label{r:subscribe} Ein Benutzer kann über die Weboberfläche einen + abonnierten \Gls{podcast} über einen generierten Link teilen. + Öffnet nun ein anderer Nutzer den Link wird dieser zur Weboberfläche + weitergeleitet und mit einem Pop-up gefragt, ob dieser den + \Gls{podcast} abonnieren + möchte, falls noch nicht geschehen. + Akzeptiert der Nutzer, so wird der \Gls{podcast} zur Liste der + \Glspl{abo} des + Nutzers hinzugefügt. + Gegebenenfalls muss sich der Benutzer dafür zuerst anmelden. + Der Link setzt sich dabei unter anderem aus der URL des Webfrontends oder + einem \Gls{pseudoprotocol} und dem \Gls{podcast}-Link des Providers zusammen. + \item\label{r:unsubscribe} Das Webfrontend bietet dem Benutzer die Möglichkeit, + \Glspl{abo} zu entfernen beziehungsweise \Glspl{podcast} zu deabonnieren. + \item\label{r:import} Das Importieren und Exportieren aller benutzerbezogenen + Daten wird unterstützt (siehe \ref{r:dsgvo}). + \item\label{r:import-other} Das Umsiedeln von anderen \Gls{gpodder}-Plattformen und + damit insbesondere der damit verbundene Datenimport wird unterstützt. + \item\label{r:api-compat} Die Weboberfläche ist kompatibel mit beliebigen + \Glspl{gpodder}. + \item\label{r:responsive} Die Weboberfläche ist \gls{responsive}. + \item\label{r:admin} Es gibt Administrator Benutzerkonten. Eine angestrebte + Funktionalität dieser privilegierten Konten ist das Einsehen von Statistiken, + wie der Anzahl von Benutzern, und dem Abruf der Metadaten eines + \Glspl{abo}. +\end{RClist} + +\subsubsection*{ Nicht-funktionale Anforderungen } + +\begin{RClist} + \item\label{r:login-provider} Die Anmeldung im Webfrontend kann mit dem + offenen Protokoll \Gls{oauth} 2.0 über Google, Apple oder Facebook erfolgen. + Die bei der Verknüpfung eines \Gls{podcatcher}s mit dem Synchronisationsserver + geforderten Anmeldedaten werden dann automatisch für den betreffenden + Benutzer generiert. + Diese kann er im Webfrontend einsehen. + \item\label{r:live-update} Im Webfrontend angemeldete Benutzer bleiben dort + angemeldet, wenn das Backend ein Update bekommt. + \item\label{r:language} Die Benutzeroberfläche kann in mehreren Sprachen + angezeigt werden, wobei neben der standardmäßig deutschen + Benutzeroberfläche die zusätzliche Bereitstellung einer englischen + Version gegenüber anderen Fremdsprachen priorisiert angestrebt wird. + \item\label{r:dsgvo} Der Umgang mit personenbezogenen Daten ist konform mit + der \\\Gls{dsgvo} der Europäischen Union. + \item\label{r:docker} Die Benutzung von \Gls{docker} vereinfacht das Deployment auf + einen Server, da Abhängigkeiten bereits im \Gls{docker}-Image enthalten sind. + Außerdem bleibt bei einer Kompromittierung der Software das Host-System + durch Virtualisierung der Container sicher.\\ +\end{RClist} diff --git a/20-implementierungsheft/sections/apidoc.tex b/20-implementierungsheft/sections/apidoc.tex new file mode 100644 index 0000000..0cce48c --- /dev/null +++ b/20-implementierungsheft/sections/apidoc.tex @@ -0,0 +1,191 @@ +\newenvironment{urlParameter} +{ + \newcommand{\urlParamItem}[2] + { + \rowcolor{\methodLightColor} ##1 & ##2 \\ + } + \newcommand{\noUrlParameter}[1] + { + \small{\textit{##1}} + } + %\vspace{-0.61em} + + \arrayrulecolor{\methodColor} + + \begin{tabularx}{\textwidth}{X} + \rowcolor{\methodLightColor!20} + \textbf{URL-Parameter} \\ \hline + \end{tabularx} + + \tabularx{\textwidth}{l X} +} + +\newenvironment{pathParameter} +{ + \newcommand{\pathParamItem}[2] + { + \rowcolor{\methodLightColor} ##1 & ##2 \\ + } + \newcommand{\noPathParameter}[1] + { + \small{\textit{##1}} + } + %\vspace{-0.61em} + + \arrayrulecolor{\methodColor} + + \begin{tabularx}{\textwidth}{X} + \rowcolor{\methodLightColor!20} + \textbf{Pfad-Parameter} \\ \hline + \end{tabularx} + + \tabularx{\textwidth}{l X} +} + +\newenvironment{jsonKeys} +{ + \newcommand{\jsonKeyItem}[2] + { + \rowcolor{\methodLightColor} ##1 & ##2 \\ + } + \newcommand{\nojsonKeys}[1] + { + \small{\textit{##1}} + } + %\vspace{-0.61em} + + \arrayrulecolor{\methodColor} + + \begin{tabularx}{\textwidth}{X} + \rowcolor{\methodLightColor!20} + \textbf{Json-Keys} \\ \hline + \end{tabularx} + + \tabularx{\textwidth}{l X} +} + +\section{\Gls{api}} + +\subsection{Authentication API}\label{a:auth} + +\subsubsection{Registrierung}\label{a:register} + +\begin{apiRoute}{post}{/api/2/auth/register.json} + {Registriert einen Nutzer mit einer E-Mail-Adresse und Passwort. + + Versendet E-Mail mit Bestätigungslink an die angegebene E-Mail-Adresse.} + \begin{routeRequest}{application/json} + \begin{routeRequestBody} +{ + username: "jeff" + email: "jeff@example.com", + password: "MyNameIsJeff" +} + \end{routeRequestBody} + \end{routeRequest} + \begin{routeResponse}{application/json} + \begin{routeResponseItem}{200} + {OK: Nutzer wurde erfolgreich angelegt und E-Mail versendet.} + \end{routeResponseItem} + + \begin{routeResponseItem}{400} + {Bad Request: Fehler beim Parsen oder Eingabe nicht anforderungsgemäß.} + \end{routeResponseItem} + \end{routeResponse} +\end{apiRoute} + +Es wird nun sowohl ein Benutzername als auch eine E-Mail-Adresse für einen Nutzer gespeichert. +Der Benutzername wird in der Folge für die Authentifizierung und die Zuordnung der Anfragen verwendet. +Die E-Mail-Adresse wird vor dem Speichern mit einem festen Geheimschlüssel gesalted und gehashed. +Sie ist zum Ableich der bei der bei (ref an forgot) anzugebenden E-Mail-Adresse + +\newpage +\subsubsection{E-Mail verifizieren}\label{a:resetpassword} + +\begin{apiRoute}{get}{/api/2/auth/\{username\}/verify.json} + {Verifiziere die bei der Registrierung angegebene E-Mail-Adresse durch diese, per E-Mail versendete, URL.} + \begin{pathParameter} + \pathParamItem{username}{Nutzername des betreffenden Nutzers} + \end{pathParameter} + \begin{urlParameter} + \urlParamItem{token}{JSON-Web-Token (24h gültig)} + \end{urlParameter} + \begin{routeResponse}{application/json} + \begin{routeResponseItem}{200} + {OK: Der Benutzer wurde erfolgreich aktiviert und kann sich nun anmelden.} + \end{routeResponseItem} + + \begin{routeResponseItem}{400} + {Bad Request: Der Nutzer mit dem angegebenen Namen ist bereits verifiziert. } + \end{routeResponseItem} + + \begin{routeResponseItem}{401} + {Unauthorized: Der JWT ist ungültig. } + \end{routeResponseItem} + + \begin{routeResponseItem}{404} + {Not Found: Es exisitiert kein Nutzer mit dem angegebenen Benutzernamen. } + \end{routeResponseItem} + \end{routeResponse} +\end{apiRoute} + +Dieser Endpunkt wurde zur Verifizierung der bei der Registrierung angegebenen E-Mail-Adresse hinzugefügt. +Nach der Registrierung wird dem Benutzer eine E-Mail mit der URL dieses Endpunkts (inklusive Benutzernamen und JWT) +zugesendet. Klickt der Benutzer auf den Link wird die Anfrage im Backend verarbeitet und der Nutzer automatisch +zum Webfrontend weitergeleitet. Erst nach der Verifizierung der E-Mail-Adresse ist die Registrierung vollständig +abgeschlossen und der Account aktiviert - nun kann sich der Nutzer anmelden. + +\newpage +\subsubsection{Passwort vergessen}\label{a:forgot} + +\begin{apiRoute}{post}{/api/2/auth/\{email\}/forgot.json} + {Sende eine E-Mail zum Zurücksetzen des Passworts.} + \begin{pathParameter} + \pathParamItem{email}{E-Mail-Adresse des betreffenden Nutzers} + \end{pathParameter} + \begin{routeResponse}{application/json} + \begin{routeResponseItem}{200} + {OK: E-Mail wurde erfolgreich versendet.} + \end{routeResponseItem} + + \begin{routeResponseItem}{404} + {Not Found: Es exisitiert kein Nutzer mit der angegeben E-Mail-Adresse.} + \end{routeResponseItem} + \end{routeResponse} +\end{apiRoute} + +Die E-Mail-Adresse des Benutzers, der sein Passwort vergessen hat, wird nicht mehr im Request-Body +als \GLS{json}-Payload, sondern als Pfadvariable in der URL übergeben. + +\subsubsection{Passwort zurücksetzen}\label{a:resetpassword} + +\begin{apiRoute}{put}{/api/2/auth/\{username\}/resetpassword.json} + {Passwort des gegebenen Nutzers ändern nachdem dieser sein Passwort + vergessen hat. } + \begin{pathParameter} + \pathParamItem{username}{Nutzername des betreffenden Nutzers} + \end{pathParameter} + \begin{urlParameter} + \urlParamItem{token}{JSON-Web-Token} + \end{urlParameter} + \begin{routeRequest}{application/json} + \begin{routeRequestBody} +{ + password: "APasswordIWontForgetAgain" +} + \end{routeRequestBody} + \end{routeRequest} + \begin{routeResponse}{application/json} + \begin{routeResponseItem}{200} + {OK: Das Passwort wurde erfolgreich geändert.} + \end{routeResponseItem} + + \begin{routeResponseItem}{400} + {Bad Request: Fehler beim Parsen der Anfragen. } + \end{routeResponseItem} + + \begin{routeResponseItem}{401} + {Unauthorized: JWT ist ungültig. } + \end{routeResponseItem} + \end{routeResponse} +\end{apiRoute} \ No newline at end of file diff --git a/20-implementierungsheft/sections/aufbau.tex b/20-implementierungsheft/sections/aufbau.tex new file mode 100644 index 0000000..41a5839 --- /dev/null +++ b/20-implementierungsheft/sections/aufbau.tex @@ -0,0 +1,47 @@ +\section{Aufbau} + +\begin{landscape} + +\subsection{Klassendiagramm Backend} +Das Klassendiagramm zeigt alle für den Entwurf relevanten Klassen des Backends mit ihren öffentlichen Methoden. +Weiter zeigt das Diagramm die Aufteilung der Klassen in Pakete sowie schemenhaft dargestellte Verbindungen zu \Gls{db} und Webserver. + +% \input{assets/diagrams/classdiagram.latex} +\includegraphics[width=\linewidth]{assets/diagrams/classdiagram} +\end{landscape} + +\subsection{Sequenzdiagramme} + +\subsubsection{Authentication \Gls{api}} +\subsubsection*{Registrierung \scriptsize{(\ref{a:register})}} +\includegraphics[width=\textwidth]{assets/diagrams/sequencediagram-register} +\subsubsection*{Passwort vergessen und zurücksetzen \scriptsize{(\ref{a:forgot}, \ref{a:resetpassword})}} +\includegraphics[width=\textwidth]{assets/diagrams/sequencediagram-forgotAndResetPW} + +\subsubsection{Subscriptions \Gls{api}} +\subsubsection*{Abonnements hochladen \scriptsize{(\ref{a:uploadSubs})}} +\includegraphics[width=\textwidth]{assets/diagrams/sequencediagram-uploadSubscriptions} + +\subsubsection*{Abrufen aller Abonnements \scriptsize{(\ref{a:getSubs})}} +\includegraphics[width=\textwidth]{assets/diagrams/sequencediagram-getSubscriptions} + +\subsubsection{Episode Actions \Gls{api}} +\subsubsection*{Episode Actions hochladen \scriptsize{(\ref{a:uploadEpisodeActions})}} +\includegraphics[width=\textwidth]{assets/diagrams/sequencediagram-uploadEpisodeActions} + +\subsubsection*{Abrufen aller Episode Actions seit einem Zeitpunkt \scriptsize{(\ref{a:getEpisodeActions})}} +\includegraphics[width=\textwidth]{assets/diagrams/sequencediagram-getEpisodeActionsOfPodcastSince} + +\subsubsection*{Abrufen aller Episode Actions \scriptsize{(\ref{a:getEpisodeActions})}} +\includegraphics[width=\textwidth]{assets/diagrams/sequencediagram-getEpisodeActions} + +\subsection{Komponentendiagramm Backend} +\includegraphics[width=\textwidth]{assets/diagrams/backendComponentDiagram} + +\subsection{Verteilungsdiagram} +\includegraphics[width=\textwidth]{assets/diagrams/deployment} + +\subsection{\Gls{db}-Modell} + +\includegraphics[width=\textwidth]{assets/diagrams/db} + diff --git a/20-implementierungsheft/sections/backend.tex b/20-implementierungsheft/sections/backend.tex new file mode 100644 index 0000000..19efd65 --- /dev/null +++ b/20-implementierungsheft/sections/backend.tex @@ -0,0 +1,28 @@ +\section{Backend} + +Für das Backend wird das \Gls{java}-Framework \Gls{spring} verwendet. Neben seiner Modularität, +bietet es viele Funktionen, die unter +anderem die Entwicklung von Backend-Anwendungen vereinfachen. +Darunter fällt zum Beispiel die Unterstützung von Dependency Injection, dessen +Vorteile bereits beschrieben wurden. +Außerdem unterstützt \Gls{java} \Gls{spring} intern eine Verwaltung von \Glspl{db}, sodass +sich nicht mit dem \Gls{SQL}-Code an sich befasst werden muss. +Auch bezüglich Authentifizierung und Sicherheit bietet \Gls{spring} eigene Funktionalitäten. + +Zusätzlich dazu wird als Build-System für das \Gls{java}-\Gls{spring}-Backend Maven verwendet. +Maven hilft dabei alle Abhängigkeiten des Projekts zu verwalten und automatisiert +den Build Prozess. +Durch die zusätzliche Unterstützung von Versionskontrollsystemen und der Kompatibilität +zu vielen Continuous Integration-Tools wird außerdem die Entwicklung in einem Team erleichtert +und optimiert. Denn dadurch können Build- und Deployment-Prozesse automatisiert werden. +Außerdem bietet Maven Bibliotheken zum Testen sowie zur Generierung von Dokumentationen an. + +Vom Backend benötigte Abhängigkeiten: +\begin{itemize} + \item \Gls{spring} Web + \item \Gls{spring} Security + \item \Gls{spring} Mail Sender + \item \Gls{spring} Data JPA + \item Lombok + \item Rome (\Gls{rss} parsing/fetching) +\end{itemize} \ No newline at end of file diff --git a/20-implementierungsheft/sections/changes.tex b/20-implementierungsheft/sections/changes.tex new file mode 100644 index 0000000..20df017 --- /dev/null +++ b/20-implementierungsheft/sections/changes.tex @@ -0,0 +1,241 @@ +\newenvironment{urlParameter} +{ + \newcommand{\urlParamItem}[2] + { + \rowcolor{\methodLightColor} ##1 & ##2 \\ + } + \newcommand{\noUrlParameter}[1] + { + \small{\textit{##1}} + } + %\vspace{-0.61em} + + \arrayrulecolor{\methodColor} + + \begin{tabularx}{\textwidth}{X} + \rowcolor{\methodLightColor!20} + \textbf{URL-Parameter} \\ \hline + \end{tabularx} + + \tabularx{\textwidth}{l X} +} + +\newenvironment{pathParameter} +{ + \newcommand{\pathParamItem}[2] + { + \rowcolor{\methodLightColor} ##1 & ##2 \\ + } + \newcommand{\noPathParameter}[1] + { + \small{\textit{##1}} + } + %\vspace{-0.61em} + + \arrayrulecolor{\methodColor} + + \begin{tabularx}{\textwidth}{X} + \rowcolor{\methodLightColor!20} + \textbf{Pfad-Parameter} \\ \hline + \end{tabularx} + + \tabularx{\textwidth}{l X} +} + +\newenvironment{jsonKeys} +{ + \newcommand{\jsonKeyItem}[2] + { + \rowcolor{\methodLightColor} ##1 & ##2 \\ + } + \newcommand{\nojsonKeys}[1] + { + \small{\textit{##1}} + } + %\vspace{-0.61em} + + \arrayrulecolor{\methodColor} + + \begin{tabularx}{\textwidth}{X} + \rowcolor{\methodLightColor!20} + \textbf{Json-Keys} \\ \hline + \end{tabularx} + + \tabularx{\textwidth}{l X} +} + + +\section{Änderungen zum Entwurfsheft} + +Im Folgenden werden die Änderungen zum Entwurfsheft aufgelistet und erläutert warum diese +Änderungen gemacht wurden. + + +\subsection{Kompatibilität mit \Glspl{podcatcher}} + +Um die Kompatibilität mit \Glspl{podcatcher} - insbesondere AntennaPod und Kasts - sicherzustellen, mussten einige Änderungen vorgenommen werden. + +\subsubsection*{Speicherung von Benutzernamen und E-Mail-Adressen} + +AntennaPod erlaubt bei der Verknüpfung mit einem Synchronisations-Server nur die Anmeldung mit einem Benutzername, der keine E-Mail-Adresse ist. +Deshalb werden nun sowohl ein Benutzername als auch eine E-Mail-Adresse für jeden Nutzer gespeichert. +Der Benutzername wird dabei unverschlüsselt gespeichert. +Er wird zur Authentifizierung sowie für die Zuordnung der Anfragen verwendet. +Die E-Mail-Adresse hingegen, wird vor der Speicherung mit einem festen Geheimschlüssel gesalted und anschließend gehashed. +Sie existiert lediglich um bei einer Passwort-vergessen-Anfrage denjenigen Nutzer zu finden, zu dem die übergebene E-Mail-Adresse gehört, beziehungsweise dessen Existenz zu überprüfen. +Diese Änderung impliziert eine Anpassung des Formats, in dem Registrierungsanfragen als \GLS{json}-Payload übergeben werden. +Wie in der folgenden aktualisierten Spezifikation zu sehen existiert nun ein zusätzliches \GLS{json}-Attribut namens \enquote{username}. +\newline + +\begin{apiRoute}{post}{/api/2/auth/register.json} + {Registriert einen Nutzer mit einer E-Mail-Adresse und Passwort. + + Versendet E-Mail mit Bestätigungslink an die angegebene E-Mail-Adresse.} + \begin{routeRequest}{application/json} + \begin{routeRequestBody} +{ + "username": "jeff", + "email": "jeff@example.com", + "password": "MyNameIsJeff" +} + \end{routeRequestBody} + \end{routeRequest} + \begin{routeResponse}{application/json} + \begin{routeResponseItem}{200} + {OK: Nutzer wurde erfolgreich angelegt und E-Mail versendet.} + \end{routeResponseItem} + + \begin{routeResponseItem}{400} + {Bad Request: Fehler beim Parsen oder Eingabe nicht anforderungsgemäß.} + \end{routeResponseItem} + \end{routeResponse} +\end{apiRoute} + +\subsubsection*{Device API} + +Beim Einrichten eines Synchronisations-Servers rufen sowohl AntennaPod als auch Kasts statt einem anfänglichen Login sofort den List-Devices-Endpunkt der \gls{gpodder}.net API auf. +Dieser Endpunkt wurde entsprechend hinzugefügt. +Da jedoch explizit keine Unterscheidung von Geräten bei der Synchronisation unterstützt wird, wird dieser intern wie ein Login-Aufruf behandelt. +\newline + +\begin{apiRoute}{get}{/api/2/devices/\{username\}.json} + {Gegebenen Nutzer des gegebenen Geräts mithilfe HTTP Basic Auth einloggen oder Gültigkeit des im \enquote{sessionid} \Gls{cookie} gespeicherten JWTs bestätigen. + + Gibt außerdem eine Liste mit einem Dummy-Device zurück, damit die Einrichtung der Synchronisation mit AntennaPod und Kasts möglich ist.} + \begin{pathParameter} + \pathParamItem{username}{Nutzername des einzuloggenden Nutzers} + \end{pathParameter} + \begin{routeResponse}{application/json} + \begin{routeResponseItem}{200} + {OK: Der Benutzer wurde erfolgreich mittles HTTP Basic Auth oder JWT eingeloggt und das \enquote{sessionid} Cookie wurde auf ein gültiges JWT gesetzt.} + \newline + \begin{routeResponseItemBody} +[ + { + "id": "dummy", + "caption": "device", + "type": "other", + "subscriptions": 0 + } +] + \end{routeResponseItemBody} + \end{routeResponseItem} + + \begin{routeResponseItem}{401} + {Unauthorized: Es liegen falsche Anmeldedaten oder ein ungültiges JWT vor.} + \end{routeResponseItem} + \end{routeResponse} + \begin{jsonKeys} + \jsonKeyItem{id}{Geräte-ID} + \jsonKeyItem{caption}{Ein für Menschen lesbarer Name für das Gerät} + \jsonKeyItem{type}{Typ des Geräts - mögliche Typen: desktop, laptop, mobile, server, other} + \jsonKeyItem{subscriptions}{Anzahl der Subscriptions auf dem Gerät} + \end{jsonKeys} +\end{apiRoute} + +\newpage +\subsection{Verifizierung der E-Mail-Adresse} + +Dieser Endpunkt wurde zur Verifizierung der bei der Registrierung angegebenen E-Mail-Adresse hinzugefügt. +Nach der Registrierung wird dem Benutzer eine E-Mail mit der URL dieses Endpunkts (inklusive Benutzernamen und JWT) +zugesendet. Klickt der Benutzer auf den Link wird die Anfrage im Backend verarbeitet und der Nutzer automatisch +zum Webfrontend weitergeleitet. Erst nach der Verifizierung der E-Mail-Adresse ist die Registrierung vollständig +abgeschlossen und der Account aktiviert - nun kann sich der Nutzer anmelden. +\newline + +\begin{apiRoute}{get}{/api/2/auth/\{username\}/verify.json} + {Verifiziere die bei der Registrierung angegebene E-Mail-Adresse durch diese, per E-Mail versendete, URL.} + \begin{pathParameter} + \pathParamItem{username}{Nutzername des betreffenden Nutzers} + \end{pathParameter} + \begin{urlParameter} + \urlParamItem{token}{JSON-Web-Token (24h gültig)} + \end{urlParameter} + \begin{routeResponse}{application/json} + \begin{routeResponseItem}{200} + {OK: Der Benutzer wurde erfolgreich aktiviert und kann sich nun anmelden.} + \end{routeResponseItem} + + \begin{routeResponseItem}{400} + {Bad Request: Der Nutzer mit dem angegebenen Namen ist bereits verifiziert. } + \end{routeResponseItem} + + \begin{routeResponseItem}{401} + {Unauthorized: Der JWT ist ungültig. } + \end{routeResponseItem} + + \begin{routeResponseItem}{404} + {Not Found: Es exisitiert kein Nutzer mit dem angegebenen Benutzernamen. } + \end{routeResponseItem} + \end{routeResponse} +\end{apiRoute} + + +\newpage +\subsection{RSSParser} + +Das primäre Ziel beim Entwurf des RSSParsers war es den Rest der Anwendung nicht +aufzuhalten, da das fetchen und parsen länger dauert. Daher soll der RSSParser asynchron +ausgeführt werden. +Damit das für die Implementierung verwendete Framework \Gls{spring} dies unterstützt müssen +mehr Bedingungen erfüllt sein als im Entwurf berücksichtigt wurden, weshalb dieser abgeändert werden musste. + +Unter anderem können nur Komponenten die von \Gls{spring} verwaltet werden asynchron ausgeführt werden. +Weiter können nur öffentliche Methoden von \Gls{spring} als asynchron erkannt werden und bei +dem Aufruf einer asynchronen Methode muss die Klasse gewechselt werden damit diese asynchron +ausgeführt wird. + +Um diese Bedingungen zu erfüllen ruft der SubscriptionService oder der EpisodeActionService +die Validate Methode des RSSParsers mit der Subscription die überprüft werden +soll auf. Dies geschieht asynchron nach dem \enquote{Fire and Forget} Prinzip. Daher können +die Services unmittelbar weiter arbeiten und dem Nutzer so möglichst schnell eine Antwort +liefern. + +Die Validate Methode fragt den aktuellen \GLS{rss}-Feed der Subscription ab und parsed diesen. +Erfüllt der Feed die von Apple und Google für \Glspl{podcast} definierten Anforderungen +werden die Informationen aus dem Feed gespeichert. Dabei werden nur die \Glspl{episode} gespeichert, +die von mindestens einem Nutzer gehört wurden. Ist der Feed der Subscription nicht +valide wird die Subscription gelöscht. Um das Löschen und Speichern ausführen zu können +hält der Parser Referenzen auf das SubscriptionDao und EpisodeDao. + +Die im Entwurfsheft definierten Getter werden nicht mehr oder nur +noch als private Hilfsmethoden benötigt. + +\subsection{Reduzierte Datenzugriffsschicht} + +Mithilfe von JPA Repositories können Datenbankzugriffe und Abfragen ohne weitere Logik in den DAO-Schnittstellen einfach implementiert werden. +Wird beispielsweise nach einem \Gls{abo} anhand einer URL gesucht, so wird eine Methode der Form \textit{Optional findByUrl(String url)} in der SubscriptionDao deklariert. +Um die Implementierung dieser Abfrage kümmert sich JPA. + +Damit fallen alle ursprünglich geplanten DAO-Implementierungen weg, was für eine bessere Übersicht in der Datenzugriffsschicht sorgt. +\newpage + +\begin{landscape} + +\subsection{Überarbeitetes Klassendiagramm des Backends} +Das Klassendiagramm zeigt alle den überarbeiteten Entwurf des Backends. +Weiter zeigt das Diagramm die Aufteilung der Klassen in Pakete sowie schemenhaft dargestellte Verbindungen zu \Gls{db} und Webserver. + +% \input{assets/diagrams/classdiagram.latex} +\includegraphics[width=\linewidth]{assets/diagrams/class_after} +\end{landscape} \ No newline at end of file diff --git a/20-implementierungsheft/sections/einleitung.tex b/20-implementierungsheft/sections/einleitung.tex new file mode 100644 index 0000000..5f6080d --- /dev/null +++ b/20-implementierungsheft/sections/einleitung.tex @@ -0,0 +1,11 @@ +\section{Einleitung} + +Im vorangegangenen Pflichtenheft und Entwurfsheft wurde zuerst abstrahiert +die Idee des Podcast Synchronisationsservers beschrieben und die Ziele in Form von +Anforderungen definiert. Dabei soll sowohl ein Backend mit \Gls{db} als auch ein Frontend +zur Dateneinsicht und Verwaltung entstehen. Dann wurde die Implementierung diese Projekts +mittels eines Entwurfs geplant. + +In diesem Dokument wird die Implementierung des entworfenen Produkts dokumentiert. +Dabei wird auf Probleme und Änderungen gegenüber dem Pflichtenheft und Entwurfsheft eingegangen, +die Testfälle erläutert und der geplante und tatsächliche zeitliche Ablauf der Implementierung dokumentiert. \ No newline at end of file diff --git a/20-implementierungsheft/sections/features.tex b/20-implementierungsheft/sections/features.tex new file mode 100644 index 0000000..0ccf47e --- /dev/null +++ b/20-implementierungsheft/sections/features.tex @@ -0,0 +1,43 @@ +\section{Implementierte Muss-, Soll- und Kannkriterien} + +Nachdem nun die vorgenommenen Änderungen des Entwurfs behandelt wurden, geht es nun zu der eigentlichen Frage: +Was wurde umgesetzt? + +In der folgenden Tabelle werden alle im Pflichtenheft vorgestellten und im Entwurfsheft überarbeiteten Kriterien mit der Kriterienbezeichnung, einer kleinen Zusammenfassung und einer Info, ob die Kriterien implementiert wurden, aufgelistet. + +\begin{tabular}{l|c|c} + Bezeichner & Zusammenfassung & Implementiert\\\hline + RM1 & \makecell{Registrierung, Bestätigung und Anmeldung\\ eines Accounts über das Frontend} & Ja\\ + RM2 & Speichern von \Glspl{abo} und \Glspl{episode} auf dem Server & Ja\\ + RM3 & Synchronisierung zwischen \Glspl{podcatcher} & Ja\\ + RM4 & Eine Weboberfläche & Ja\\ + RM5 & Möglichkeit das eigene Passwort zu ändern / zurückzusetzen & Ja\\ + RM6 & \Gls{abo}liste in der Weboberfläche & Ja\\ + RM7 & 50 Anfragen / Sekunde bearbeiten & Zu testen\\ + RM8 & Primäre Auslegung des Webfrontends für Desktop-Nutzer & Ja\\ + RM9 & Unterstützung der \gls{gpodder}.net \Gls{rest-api} & Ja\\ + RM10 & Das Nutzen einer \Gls{db} zur Speicherung von Daten & Ja\\ + RM11 & Erweiterte \GLS{api} für Kommunikation zwischen Front- und Backend & Ja\\\hline + RS1 & Eine Anleitung (Platzhalter) & Ja\\ + RS2 & Die Möglichkeit einen Account zu löschen & Ja\\ + RS3 & \Gls{spring} für das Backend und MariaDB als \Gls{db} & Ja\\ + RS4 & Vue.js und Bootstrap für das Frontend & Ja\\ + RS5 & npm und vite für das Frontend & Ja\\ + RS6 & \makecell{Eine \Gls{spa} als Frontend\\mit dynamischer Aktualisierung} & Ja\\ + RS7 & Ein \GLS{rss}-Parser um Daten aus einem \GLS{rss}-Feed zu lesen & Ja\\ + RS8 & Mindestanforderungen an ein Passwort & Ja\\ + RS9 & \Gls{salt-hash} für Verschlüsselung der Personenbezogenen Daten & Ja\\ + RS10 & Nutzer bleibt über JWT angemeldet und authentifiziert & Ja\\\hline + RC1 & Abonnierten \Gls{podcast} in Weboberfläche über Link teilen und hinzufügen & Ja\\ + RC2 & \Glspl{abo} in Weboberfläche deabonnieren & Nein\\ + RC3 & Importieren und Exportieren aller benutzerbezogenen Daten & Ja\\ + RC4 & Umsiedeln von anderen \Gls{gpodder}-Plattformen & Ja\\ + RC5 & Kompatible Weboberfläche für beliebige \gls{gpodder}.net APIs & Entfernt\\ + RC6 & \Gls{responsive} designte Weboberfläche & Ja\\ + RC7 & Administratorkonten mit privilegierten Funktionen & Nein\\ + RC8 & \Gls{oauth} 2.0 im Webfrontend & Nein\\ + RC9 & Bei Ausfall des Backends im Frontend angemeldet bleiben & Ja\\ + RC10 & Mehrsprachige Weboberfläche & Ja\\ + RC11 & Erfüllung der DSGVO & Teils\\ + RC12 & \Gls{docker} für einfaches Deployment und Sicherheit & Ja +\end{tabular} \ No newline at end of file diff --git a/20-implementierungsheft/sections/features.tex.orig b/20-implementierungsheft/sections/features.tex.orig new file mode 100644 index 0000000..78839cf --- /dev/null +++ b/20-implementierungsheft/sections/features.tex.orig @@ -0,0 +1,82 @@ +\section{Implementierte Muss-, Soll- und Kannkriterien} + +Nachdem nun die vorgenommenen Änderungen des Entwurfs behandelt wurden, geht es nun zu der eigentlichen Frage: +Was wurde umgesetzt? + +In der folgenden Tabelle werden alle im Pflichtenheft vorgestellten und im Entwurfsheft überarbeiteten Kriterien mit der Kriterienbezeichnung, einer kleinen Zusammenfassung und einer Info, ob die Kriterien implementiert wurden, aufgelistet. + +\hspace{-1cm} +\begin{tabular}{l|c|c} +<<<<<<< HEAD + Bezeichner & Zusammenfassung & Implementiert\\\hline + \textlangle RM1 \textrangle & \makecell{Registrierung, Bestätigung und Anmeldung\\ eines Accounts über das Frontend} & Ja\\ + \textlangle RM2 \textrangle & Speichern von Abonnements und Episoden auf dem Server & Ja\\ + \textlangle RM3 \textrangle & Synchronisierung zwischen Podcatchern & Ja\\ + \textlangle RM4 \textrangle & Eine Weboberfläche & Ja\\ + \textlangle RM5 \textrangle & Möglichkeit das eigene Passwort zu ändern / zurückzusetzen & Ja\\ + \textlangle RM6 \textrangle & Abonnementliste in der Weboberfläche & Ja\\ + \textlangle RM7 \textrangle & 50 Anfragen / Sekunde bearbeiten & Zu testen\\ + \textlangle RM8 \textrangle & Primäre Auslegung des Webfrontends für Desktop-Nutzer & Ja\\ + \textlangle RM9 \textrangle & Unterstützung der gpodder.net RESTful-API & Ja\\ + \textlangle RM10\textrangle & Das Nutzen einer Datenbank zur Speicherung von Daten & Ja\\ + \textlangle RM11\textrangle & Erweiterte API für Kommunikation zwischen Front- und Backend & Ja\\\hline\hline + \textlangle RS1 \textrangle & Eine Anleitung (Platzhalter) & Ja\\ + \textlangle RS2 \textrangle & Die Möglichkeit einen Account zu löschen & Ja\\ + \textlangle RS3 \textrangle & Spring für das Backend und MariaDB als Datenbank & Ja\\ + \textlangle RS4 \textrangle & Vue.js und Bootstrap für das Frontend & Ja\\ + \textlangle RS5 \textrangle & npm und vite für das Frontend & Ja\\ + \textlangle RS6 \textrangle & \makecell{Eine Single-Page-Application als Frontend\\mit dynamischer Aktualisierung} & Ja\\ + \textlangle RS7 \textrangle & Ein RSS-Parser um Daten aus einem RSS-Feed zu lesen & Ja\\ + \textlangle RS8 \textrangle & Mindestanforderungen an ein Passwort & Ja\\ + \textlangle RS9 \textrangle & Salting und Hashing für Verschlüsselung der Personenbezogenen Daten & Ja\\ + \textlangle RS10\textrangle & Nutzer bleibt über JWT angemeldet und authentifiziert & Ja\\\hline\hline + \textlangle RC1 \textrangle & Abonnierten Podcast in Weboberfläche über Link teilen und hinzufügen & Ja\\ + \textlangle RC2 \textrangle & Abonnements in Weboberfläche deabonnieren & Nein\\ + \textlangle RC3 \textrangle & Importieren und Exportieren aller benutzerbezogenen Daten & Ja\\ + \textlangle RC4 \textrangle & Umsiedeln von anderen Gpodder-Plattformen & Ja\\ + \textlangle RC5 \textrangle & Kompatible Weboberfläche für beliebige gpodder.net APIs & Entfernt\\ + \textlangle RC6 \textrangle & Responsive designte Weboberfläche & Ja\\ + \textlangle RC7 \textrangle & Administratorkonten mit privilegierten Funktionen & Nein\\ + \textlangle RC8 \textrangle & OAuth 2.0 im Webfrontend & Nein\\ + \textlangle RC9 \textrangle & Bei Ausfall des Backends im Frontend angemeldet bleiben & Ja\\ + \textlangle RC10\textrangle & Mehrsprachige Weboberfläche & Ja\\ + \textlangle RC11\textrangle & Erfüllung der DSGVO & Teils\\ + \textlangle RC12\textrangle & Docker für einfaches Deployment und Sicherheit & Ja +\end{tabular} +======= + Bezeichner & Zusammenfassung & Implementiert\\\hline + RM1 & \makecell{Registrierung, Bestätigung und Anmeldung\\ eines Accounts über das Frontend} & Ja\\ + RM2 & Speichern von \Glspl{abo} und \Glspl{episode} auf dem Server & Ja\\ + RM3 & Synchronisierung zwischen \Glspl{podcatcher} & Ja\\ + RM4 & Eine Weboberfläche & Ja\\ + RM5 & Möglichkeit das eigene Passwort zu ändern / zurückzusetzen & Ja\\ + RM6 & \Gls{abo}liste in der Weboberfläche & Ja\\ + RM7 & 50 Anfragen / Sekunde bearbeiten & Zu testen\\ + RM8 & Primäre Auslegung des Webfrontends für Desktop-Nutzer & Ja\\ + RM9 & Unterstützung der \gls{gpodder}.net \Gls{rest-api} & Ja\\ + RM10 & Das Nutzen einer \Gls{db} zur Speicherung von Daten & Ja\\ + RM11 & Erweiterte \GLS{api} für Kommunikation zwischen Front- und Backend & Ja\\\hline + RS1 & Eine Anleitung (Platzhalter) & Ja\\ + RS2 & Die Möglichkeit einen Account zu löschen & Ja\\ + RS3 & \Gls{spring} für das Backend und MariaDB als \Gls{db} & Ja\\ + RS4 & Vue.js und Bootstrap für das Frontend & Ja\\ + RS5 & npm und vite für das Frontend & Ja\\ + RS6 & \makecell{Eine \Gls{spa} als Frontend\\mit dynamischer Aktualisierung} & Ja\\ + RS7 & Ein \GLS{rss}-Parser um Daten aus einem \GLS{rss}-Feed zu lesen & Ja\\ + RS8 & Mindestanforderungen an ein Passwort & Ja\\ + RS9 & \Gls{salt-hash} für Verschlüsselung der Personenbezogenen Daten & Ja\\ + RS10 & Nutzer bleibt über JWT angemeldet und authentifiziert & Ja\\\hline + RC1 & Abonnierten \Gls{podcast} in Weboberfläche über Link teilen und hinzufügen & Ja\\ + RC2 & \Glspl{abo} in Weboberfläche deabonnieren & Nein\\ + RC3 & Importieren und Exportieren aller benutzerbezogenen Daten & Ja\\ + RC4 & Umsiedeln von anderen \Gls{gpodder}-Plattformen & Ja\\ + RC5 & Kompatible Weboberfläche für beliebige \gls{gpodder}.net APIs & Entfernt\\ + RC6 & \Gls{responsive} designte Weboberfläche & Ja\\ + RC7 & Administratorkonten mit privilegierten Funktionen & Nein\\ + RC8 & \Gls{oauth} 2.0 im Webfrontend & Nein\\ + RC9 & Bei Ausfall des Backends im Frontend angemeldet bleiben & Ja\\ + RC10 & Mehrsprachige Weboberfläche & Ja\\ + RC11 & Erfüllung der DSGVO & Teils\\ + RC12 & \Gls{docker} für einfaches Deployment und Sicherheit & Ja +\end{tabular} +>>>>>>> main diff --git a/20-implementierungsheft/sections/frontend.tex b/20-implementierungsheft/sections/frontend.tex new file mode 100644 index 0000000..ae5be0e --- /dev/null +++ b/20-implementierungsheft/sections/frontend.tex @@ -0,0 +1,196 @@ +\section{Weboberfläche} + +Die Weboberfläche wird mit dem Frontend-Web-Framework Vue.js erstellt. Mit Vue +werden wiederverwendbare, auf Datenänderungen reagierende Komponenten erstellt. +Die Komponenten nutzen ein fertiges Aussehen von dem Frontend-CSS-Framework +Bootstrap. Außerdem werden Icons der freien Schriftart fontawesome +verwendet. + +An der generellen Struktur und wichtigen Komponenten hat sich in der +Implementierung nichts großes zum Entwurf geändert. Einige Komponenten konnten +in der Implementierung allerdings abstrahiert werden, sodass weniger Code +dupliziert werden musste. Dazu gehören zum Beispiel die Komponenten, welche ein +Eingabefeld bereit stellen. + +Durch eine gute Arbeitsteilung blieb genug Zeit, um auch einige Kann-Kriterien +zu implementieren, weshalb ein paar Abhängigkeiten hinzugekommen sind. So werden +jszip und file-saver benötigt, um das Kann-Kriterium RC3 umzusetzen, durch +welches man Nutzerdaten im- und exportieren kann. + +Pinia konnten wir als Abhängigkeit entfernen, weil Vue von sich aus genügend +Funktionalität bietet die Nutzerdaten global allen Komponenten bereit zu +stellen. + +Anfangs überlegten wir den Wrapper \texttt{bootstrap-vue} zu verwenden, welcher +Bootstrap-HTML-Strukturen als Vue-Komponenten bereit stellt. Dies hätte des +Vorteil, dass man nur jene Komponenten importieren müsste, die man auch +benötigt. Es stellte sich heraus, dass \texttt{vue-bootstrap} nicht mit neusten +Version Vue3 kompatibel ist, weshalb wir uns entschieden Bootstrap wie gewohnt +komplett einzubinden. + +Während der Implementierung sind wir auf die Bibliothek \texttt{VueUse} +gestoßen, mit der man die Abhängigkeit \texttt{file-saver} und mehrere eigene +Wrapper für Browser-\Gls{api}s ersetzen könnte. So kann man das \Gls{dashboard} auch in +Zukunft noch weiter verbessern. + +Vom Frontend benötigte Abhängigkeiten: +\begin{itemize} + \item vite + \item vue + \item vue-router + \item \textcolor{red}{\sout{Pinia} wird durch globale Vue-Interne \texttt{ref} ersetzt} + \item bootstrap + \item fontawesome + \item vue-i18n (Support für mehrere Sprachen) + \item \textcolor{Green}{dayjs (Rechnen und formatieren von Zeiten)} + \item \textcolor{Green}{jszip (erstellen von Im-/Exports)} + \item \textcolor{Green}{file-saver (Abstraktion für Datei-Speichern-Dialog)} +\end{itemize} + +\subsection{Komponentendiagramm Web-Frontend} +\includegraphics[width=\textwidth]{assets/diagrams/componentdiagram} + +\subsection{Hinzugefügte Komponenten} + +% PasswordInput +% PasswordValidator +% FloatingLabelInput +% Loading +% ErrorLog +% ProgressTime + +\begin{minipage}{.7\linewidth} + +\subsubsection*{FloatingLabelInput} + +\begin{description} +\item[Tag] \texttt{} +\item[Props] \mbox{} \\ + \emph{type} \mbox{} Beschreibt den Inhalt des Eingabefelder. Handelt es sich + um eine E-Mail, ein Passwort oder nur Text? \\ + \emph{label} \mbox{} Das Label wird als Platzhalter und kleine Überschrift + angezeigt. +\item[Beschreibung] Abstrahiert eine HTML-Struktur von Bootstrap, um ein schönes + Eingabefeld anzuzeigen. +\end{description} +\end{minipage} +\begin{minipage}{.3\linewidth} + \begin{figure}[H] + \includegraphics[width=\textwidth]{assets/floatinglabelinput.png} + \end{figure} +\end{minipage} + + +\vspace{.5cm} + +\begin{minipage}{.7\linewidth} + +\subsubsection*{PasswordInput} + +\begin{description} +\item[Tag] \texttt{} +\item[Props] \mbox{} \\ + \emph{label} \mbox{} Das Label wird als Platzhalter und kleine Überschrift + angezeigt. +\item[Beschreibung] Erweitert den FloatingLabelInput um einen Knopf mit dem die + Sichtbarkeit des Eingabefeldes gewechselt werden kann. Dabei wird intern der + Typ des Eingabefeldes zwischen Text and Passwort gewechselt. +\end{description} +\end{minipage} +\begin{minipage}{.3\linewidth} + \begin{figure}[H] + \includegraphics[width=\textwidth]{assets/passwordinput.png} + \end{figure} +\end{minipage} + + +\vspace{.5cm} + +\begin{minipage}{.7\linewidth} + +\subsubsection*{PasswordValidator} + +\begin{description} +\item[Tag] \texttt{} +\item[Beschreibung] Besteht aus zwei PasswordInputs und überprüft diese auf + Gleichheit und Kriterien für eine gutes Passwort. +\end{description} +\end{minipage} +\begin{minipage}{.3\linewidth} + \begin{figure}[H] + \includegraphics[width=\textwidth]{assets/passwordvalidator.png} + \end{figure} +\end{minipage} + + +\vspace{.5cm} + +\begin{minipage}{.7\linewidth} + +\subsubsection*{Loading} + +\begin{description} +\item[Tag] \texttt{...} +\item[Props] \mbox{} \\ + \emph{waitingFor} \mbox{} Eine Referenz auf eine Bedingung wann die Kinder + der Komponente gezeigt werden sollen. +\item[Beschreibung] Zeigt solange ein Ladesymbol an, bis die Bedingung in + \texttt{waitingFor} erfüllt ist und stattdessen die Kinder der Komponente + gezeigt werden. +\end{description} +\end{minipage} +\begin{minipage}{.3\linewidth} + \begin{figure}[H] + \includegraphics[width=\textwidth]{assets/loading.png} + \end{figure} +\end{minipage} + + +\vspace{.5cm} + +\begin{minipage}{.7\linewidth} + +\subsubsection*{ProgressTime} + +\begin{description} +\item[Tag] \texttt{} +\item[Props] \mbox{} \\ + \emph{unix} \mbox{} Anzahl an Sekunden. +\item[Beschreibung] Nimmt eine Anzahl an Sekunden und gibt an wie viele Stunden, + Minuten und Sekunden die Anzahl entspricht. +\end{description} +\end{minipage} +\begin{minipage}{.3\linewidth} + \begin{figure}[H] + \includegraphics[width=\textwidth]{assets/progresstime.png} + \end{figure} +\end{minipage} + + +\vspace{.5cm} + +\begin{minipage}{.7\linewidth} + +\subsubsection*{ErrorLog} + +\begin{description} +\item[Tag] \texttt{} +\item[Beschreibung] Zeigt eine Liste von Warnungen an, welche aus einem globalen + Zustandsspeicher geladen werden. +\end{description} +\end{minipage} +\begin{minipage}{.3\linewidth} + \begin{figure}[H] + \includegraphics[width=\textwidth]{assets/errorlog.png} + \end{figure} +\end{minipage} + + +\vspace{.5cm} + +\subsubsection*{Dashboard/FormLayout} + +\begin{description} +\item[Tag] \texttt{ } +\item[Beschreibung] Fügt den Kindern einen Seitenabstand hinzu. +\end{description} diff --git a/20-implementierungsheft/sections/glossar.tex b/20-implementierungsheft/sections/glossar.tex new file mode 100644 index 0000000..9caad87 --- /dev/null +++ b/20-implementierungsheft/sections/glossar.tex @@ -0,0 +1,371 @@ +\makeglossaries + +\newglossaryentry{spa} +{ + name=Single-Page-Application, + description={ + ist ein Webseiten-Modell, bei welchem dem Nutzer nur ein Webdokument + bereitgestellt wird. Mit einem Skript wird der Inhalt der Seite + dynamisch mit Daten einer API befüllt. Außerdem verwaltet die Seite + (nicht der Server), welcher Inhalt bei welchem Pfad angezeigt wird. Dies + erzeugt geringere Serverlast und eine bessere Nutzererfahrung, da die + Seitenstruktur beim Laden von neuen Inhalten erhalten bleibt} +} + +\newglossaryentry{packagemanager} +{ + name=Paketmanager, + description={ + ist ein Programm, welches Pakete und dessen Abhängigkeiten verwaltet, + installiert, entfernt und aktualisiert. Pakete können andere Programme, + Plugins oder Software-Bibliotheken sein} +} + +\newglossaryentry{bundler} +{ + name=Bundler, + description={ + ist ein Programm, welches genutzte Teile von Abhängigkeiten eines + Software-Projekts in passender Reihenfolge zusammensucht und daraus + Dateien erstellt, die für den Nutzer bereitgestellt werden können. Dabei + kann der Bundler mit zusätzlichen Modulen Dateien erzeugen, die + rückwärtskompatibel oder für den Nutzer schwerer einsehbar sind} +} + +\newglossaryentry{java} +{ + name=Java, + description={ + ist eine objekt-orientierte interpretierte kompilierte + Programmiersprache, welche plattformunabhängig auf einer virtuellen + Maschine ausgeführt wird} +} + +\newglossaryentry{db} +{ + name=Datenbank, + plural=Datenbanken, + description={ + ist ein System um Daten persistent zu speichern und effizient zu + verwalten. Am meisten verbreitet sind relationale Datenbanken, welche + Daten in Tabellen mit Referenzen zu Einträgen anderer Tabellen + speichern. Programme können dann über eine Anfragesprache (Structured + Query Language - \Gls{SQL}) komplexe Operationen auf den Daten ausführen} +} + +\newglossaryentry{docker} +{ + name=Docker, + description={ + ist ein Programm, das virtualisierte Container ausführt. Ein Programm in + so einem Container läuft in seiner eigenen virtuellen Umgebung, wodurch + das Host-System sicher bleibt. Zudem lassen sich die Container leicht + auf andere Systeme verteilen} +} + +% RESTfull-API, JSON, RSS-Feed, Salting and Hasing, OAuth, Cookie, Garbage +% Collection, DSGVO, Podcast, Podcatcher, Episode, Gpodder, + +\newglossaryentry{podcatcher} +{ + name=Podcatcher, + plural=Podcatchern, + description={ + ist ein Programm, über welches man Podcasts entdecken, abonnieren und + Episoden von Podcasts hören kann. Mit einem Account auf einer Plattform, + welche eine Gpodder-API zur Verfügung stellt, können Ereignisse, die von + einem Nutzer ausgehen, auf anderen Podcatchern des Nutzers + synchronisiert werden} +} + +\newglossaryentry{podcast} +{ + name=Podcast, + description={ + ist ein RSS-Feed, dessen Einträge die Episoden darstellen} +} + +\newglossaryentry{episode} +{ + name=Episode, + plural=Episoden, + description={ + ist ein Eintrag in einem Podcast. Eine URL in dem Eintrag zeigt auf eine + Medien-Datei, welche vom Podcatcher abgespielt werden kann} +} + +\newglossaryentry{rest-api} +{ + name=RESTful-API, + description={ + ist ein Schnittstellenentwurf über das Hypertext Transfer Protocol + (HTTP), bei dem die Schnittstellen strukturiert als Pfad an einem + Endpunkt erreichbar sind. Mittels verschiedener HTTP-Methoden können an + der Schnittstelle Daten abgefragt (GET), gesendet (PUT), gelöscht + (DELETE) oder geändert (POST) werden. Die Daten, die über die + Schnittstelle gesendet werden liegen meist im JSON-Format vor} +} + + +\newglossaryentry{gpodder} +{ + name=Gpodder-API, + description={ + wird von gpodder.net benutzt und entwickelt. Die API wird als + Schnittstelle zwischen Podcatchern und Podcast Synchronisationsservern + verwendet. Weitere Details sind unter + "https://gpoddernet.readthedocs.io/en/latest/api/" zu finden} +} + +\newglossaryentry{json} +{ + name=JSON, + description={ + (JavaScript Object Notation) ist ein Datenformat und wird zur + Übertragung von Strukturen und Daten eingesetzt. JSON besteht dabei aus + grundlegenden Datentypen sowie Objekten mit Schlüssel-Wert Paaren und + Listen} +} + +\newglossaryentry{oauth} +{ + name=OAuth, + description={ + (Open Authorization) ist ein offenes Protokoll, welches es Nutzern + ermöglicht, sich mit bereits bestehenden Accounts bei anderen Diensten + zu registrieren. Dabei werden benötigte Daten für die Registrierung über + die bereitgestellte Schnittstelle zur Verfügung gestellt} +} + +\newglossaryentry{garbage-collection} +{ + name=Garbage Collection, + description={ + ist eine automatische Speicherbereinigung, welche nicht mehr benötigten + Speicherplatz wieder freigibt. Die Bereinigung kann dabei in determinierten + Zeitintervallen erfolgen oder durch bestimmte Ereignisse ausgelöst + werden} +} + +\newglossaryentry{salt-hash} +{ + name=Salting und Hashing, + description={ + ist eine Methode um Passwörter so zu kodieren, dass sie nicht als + Klartext gespeichert werden und auch sicher vor Hash-Wörterbüchern sind. + Dafür wird dem Passwort ein bekanntes Wort, der Salt, angefügt, bevor + aus dem kompletten Wort eine Prüfsumme, ein Hash, generiert wird. Beim + Anmelden wird die Prüfsumme der Anmeldung mit der bekannten + Prüfsumme des Passworts verglichen} +} + +\newglossaryentry{rss} +{ + name=RSS, + description={ + (Really Simple Syndication) zeigt strukturiert Listen von Nachrichten + an. Die Änderungen werden im XML-Format in sogenannte RSS-Dateien + geschrieben, welche über einen Link abgerufen werden können} +} + +\newglossaryentry{dsgvo} +{ + name=Datenschutz-Grundverordnung, + description={ + (DSGVO) ist eine im europäischen Wirtschaftsraum + geltende Verordnung. Sie sorgt für eine Reglementierung bei der + Verarbeitung personenbezogener Daten. Unter anderem muss einsehbar sein, + welche Daten von Nutzern erhoben werden. Außerdem muss für einen Nutzer + die Möglichkeit bestehen, seine erhobenen Daten abrufen zu können} +} + +\newglossaryentry{push-pull} +{ + name=Push und Pull, + description={ + sind Methoden, um Daten auszutauschen. Bei der Pull-Methode + stellt Akteur A einem Akteur B eine Anfrage auf Daten und erhält diese + als Antwort. Damit Akteur A und B immer auf dem selben Stand sind, muss + Akteur A chronisch Anfragen an Akteur B stellen. Im Gegensatz dazu steht + die Push-Methode, bei der Akteur B den Akteuren mitteilt, dass er neue + Änderungen hat. Dafür muss Akteur B allerdings wissen mit welchen + anderen Akteuren er in Verbindung steht und diese Verbindung aufrecht + erhalten} +} + +\newglossaryentry{ui-lib} +{ + name=UI-Bibliothek, + plural=UI-Bibliotheken, + description={ + kümmert sich um das Layout einer Webseite. Dabei unterscheidet man + zwischen Design-Bibliotheken (wie Bootstrap), welche fertige + UI-Komponenten bereitstellen, und Layout-Bibliotheken (wie Vue oder + React.js), welche die Komponenten basierend auf Daten dynamisch + anzeigen} +} + +\newglossaryentry{responsive} +{ + name=Responsive, + description={ + Design ist ein Design-Prinzip für Webseiten, bei dem die selbe Webseite ihre + Komponenten dynamisch der Bildschirmbreite anpasst} +} + +\newglossaryentry{pseudoprotocol} +{ + name=Pseudoprotokoll, + description={ + ist ein URL-Schema, auf das Webseiten hören können, wenn sie sich das + URL-Schema im Browser anmelden. Bekannt Pseudoprotokolle sind: + ,,mailto:'', ,,tel:'' oder ,,irc:''} +} + +\newglossaryentry{dashboard} +{ + name=Dashboard, + description={ + ist die erste Seite auf der man landet, wenn man angemeldet ist} +} + +\newglossaryentry{abo} +{ + name=Abonnement, + description={ + ist ein abonnierter Podcast} +} + +\newglossaryentry{discovery} +{ + name=Discovery, + description={ + ist ein Feature der Gpodder-API, welches dem Nutzer eine Reihe von + Podcasts zum abonnieren anbietet} +} + +\newglossaryentry{session-token} +{ + name=Session-Token, + description={ + ist ein Wort, dass vom Client gespeichert wird solange der Nutzer + eingeloggt ist und bei jeder Anfrage an den Server mitgeschickt wird. + Der Server kann den Session-Token einem Nutzer zuordnen und so mit + nutzerspezifischen Daten antworten} +} + +\newglossaryentry{cookie} +{ + name=Cookie, + description={ + ist ein kleiner webseitenspezifischer Speicher im Browser, welcher vom + Server und von der Webseite gesetzt werden kann und bei jeder weiteren + Anfrage an den Server mitgesendet wird. Cookies bleiben entweder + temporär im Browserspeicher, bis der Browser geschlossen wird oder + permanent, bis ein optionales Verfallsdatum erreicht ist} +} + +\newglossaryentry{uiComponent} +{ + name=UI-Komponente, + plural=UI-Komponenten, + description={ + In Vue.js werden die grafischen Elemente einer Webseite in einzelne + Komponenten zerteilt. + Diese reagieren automatisch auf Änderungen und können ohne Neuladen + der Seite ihr Aussehen verändern und somit Änderungen direkt anzeigen} +} + +\newglossaryentry{spring} +{ + name=Spring, + description={ + Ein Java-Framework, welches die Entwicklung von Web-Applikationen erleichtert. + Dazu wird eine Reihe von Werkzeugsets zur Verfügung gestellt. + Unter anderem sind das Spring Web für das Erstellen von Webanwendungen, + Spring Security für die Verwaltung von Benutzerauthentifizierungen und + Spring Data JPA für die Arbeit mit relationalen Datenbanken + } +} + +\newglossaryentry{api} +{ + name=API, + plural=APIs, + description={ + Eine Schnittstelle, welche es ermöglicht auf Funktionalitäten einer Anwendung + zuzugreifen. APIs für Webanwendungen heißen WebAPIs. + Ein Beispiel für eine WebAPI ist die REST-API + } +} + +\newglossaryentry{business} +{ + name=Geschäftslogik, + description={ + Eine Schicht in der Anwendungsentwicklung, in der die Art und Weise, wie das + Programm auf Eingaben reagiert, wie Daten verarbeitet und wie sie gespeichert + werden sollen, festgelegt ist + } +} + +\newglossaryentry{solid} +{ + name=SOLID, + description={ + Eine Sammlung an Prinzipien, welche zu gutem objektorientierten Design führen soll. + Jedes Prinzip steht für einen Buchstaben in SOLID: + \textbf{S}ingle-Responsibility Prinzip, + \textbf{O}pen-Closed Prinzip, + \textbf{L}iskovsches Substitutionsprinzip, + \textbf{I}nterface Segregation Prinzip und + \textbf{D}ependency Inversion Prinzip + } +} + +\newglossaryentry{crud} +{ + name=CRUD, + description={ + CRUD steht für \textbf{C}reate, \textbf{R}ead, \textbf{U}pdate und \textbf{D}elete. + Hierbei handelt es sich um die grundlegenden Funktionen einer Anwendung, + die mit einer Datenbank arbeitet. + Hierbei können Daten angelegt, abgerufen, aktualisiert und gelöscht werden. + Auch in Web-Applikationen ist CRUD mit HTTP über die Anfragen POST, GET, PUT und DELETE + vertreten + } +} + +\newglossaryentry{SQL} +{ + name=SQL, + description={ + SQL (Structured Query Language) ist eine Sprache, die einen strukturierten Zugriff auf Datenbanken ermöglicht. + Daten können hierbei hinzugefügt, abgefragt, geändert und gelöscht werden. + Das besondere hierbei ist der strukturierte Zugriff auf Daten, indem explizit Daten mit bestimmten Kriterien und + Relationen ausgewählt und bearbeitet werden können. + SQL wird fast von allen verbreiteten Datenbanksystemen unterstützt + } +} + +\newglossaryentry{Base64} +{ + name=Base64, + description={ + Mithilfe von Base64 können 8-Bit-Binärdaten in eine ASCII-Zeichenkette + kodiert werden. So werden zum Beispiel E-Mail-Anhänge versendet + } +} + +\newglossaryentry{JSONP} +{ + name=JSONP, + description={ + JSONP ermöglicht die Übertragung von JSON-Daten zwischen verschiedenen Domains. + Dies wäre durch die Same-Origin-Policy nicht möglich. + JSONP nutzt allerdings die Tatsache aus, + dass sich Skripte domainübergreifend übertragen lassen. + Dazu werden die JSON-Daten als Argument einer übergebenen Funktion über + ein Skript-Element eingebunden + } +} diff --git a/20-implementierungsheft/sections/methodology.tex b/20-implementierungsheft/sections/methodology.tex new file mode 100644 index 0000000..87b8176 --- /dev/null +++ b/20-implementierungsheft/sections/methodology.tex @@ -0,0 +1,16 @@ +\section{Integrationsstrategie} + +Bei der Implementierung wurde nach dem Outside-In Prinzip vorangegangenen. +Dabei handelt es sich um eine inkrementelle und vorgehensorientierte Integrationsstrategie. +Sie versucht die Vorteile des Top-Down und des Bottom-Up Prinzips zu vereinen und die jeweiligen +Nachteile zu mindern. + +Bei der Outside-In Integration wird gleichzeitig auf höchster und niedrigster logischer +Ebene mit der Implementation begonnen. Das passt gut zu der gewählten Systemarchitektur. +Es wird sowohl frühzeitig die \Gls{db} eingebunden als auch das Frontend und die +Controller implementiert. Dafür wird erst später an der Service-Schicht gearbeitet. +Dieses Vorgehen wurde gewählt um die frühe Verfügbarkeit von testbaren Endpunkten zu haben. +Somit können das Front- und Backend schon nach kurzer Zeit miteinander Integriert werden, +wenn auch ohne funktionierende Serviceschicht. Außerdem wird für lange Zeit an verschiedenen +Punkten gearbeitet, sodass der Prozess dank des vorrausgegangenen Entwurfs gut auf das ganze +Team parallelisierbar ist. diff --git a/20-implementierungsheft/sections/tests.tex b/20-implementierungsheft/sections/tests.tex new file mode 100644 index 0000000..cdbf163 --- /dev/null +++ b/20-implementierungsheft/sections/tests.tex @@ -0,0 +1,21 @@ +\section{Testfälle} + +Für die Erstellung der Testfälle wurde die SpringBoot Testumgebung verwendet und +diese durch JUnit Testfälle ergänzt. + +Für das Testen wurde eine BaseTest Klasse erstellt, die grundlegende Funktionalität +einiger Kern Komponenten sicherstellt. Weiter Initialisiert sie die Anwendungsumgebung auf +der alle weiteren Tests aufbauen. + +Die Unit Tests erweitern diese BaseTest Klasse und können daher von gewisser Grundfunktionalität +ausgehen, die durch den BaseTest abgedeckt ist. Dadurch müssen nicht große Teile der +Anwendung durch Mock Objekte simuliert werden. + +Grundsätzlich wurde beim Entwurf der Testfälle nach dem Inside-Out-Prinzip vorangegangenen. +Die bisher geschriebenen Testfälle haben dabei nicht das Ziel Korrektheit zu garantieren, +sondern einen gewissen Qualitätsstandart zu sichern und gleichzeitig genug +Arbeitspunkte bereit zu stellen um im ganzen Team an diesem Projekt parallel arbeite zu können. + +Zusätzlich wurden bei der Implementierung auf ausgiebig getestete Annotationen von Spring und +Lombok zurückgegriffen die helfen die Anzahl an Fehlern bei standardisierten +\enquote{Boilerplater-Code} Aufgaben zu vermeiden. \ No newline at end of file diff --git a/20-implementierungsheft/sections/timeline.tex b/20-implementierungsheft/sections/timeline.tex new file mode 100644 index 0000000..7fa084d --- /dev/null +++ b/20-implementierungsheft/sections/timeline.tex @@ -0,0 +1,7 @@ +\section{Zeitlicher Verlauf} + +\subsection{Plan} +\includegraphics[width=\textwidth]{assets/diagrams/gantt-plan} + +\subsection{Realität} +\includegraphics[width=\textwidth]{assets/diagrams/gantt-reality} diff --git a/20-implementierungsheft/titlepage.tex b/20-implementierungsheft/titlepage.tex new file mode 100644 index 0000000..4e7e707 --- /dev/null +++ b/20-implementierungsheft/titlepage.tex @@ -0,0 +1,75 @@ +%% Encoding: UTF-8 %% + +%% titlepage.tex + +\def\usesf{} +\let\usesf\sffamily % diese Zeile auskommentieren für normalen TeX Font + +\begin{titlepage} + +\setlength{\unitlength}{1pt} +\begin{picture}(00,0)(70,770) + \includegraphics[width=\paperwidth]{assets/KIT_Deckblatt.pdf} +\end{picture} + +\thispagestyle{empty} + +\begin{center} +\hbox{} +\vfill +\includegraphics[width=.5\textwidth]{assets/logo.pdf} +\vskip 1cm +{\usesf + {\huge\bfseries PSE\textsuperscript{2} - Podcast Synchronisation \\ + made Efficient\\ + Implementierungsheft \par} +\vskip 1.8cm +{\Large Wintersemester 2022/2023\\} +%von\\[2mm] +\vskip 1.5cm + +% {\large\bfseries Vorname Nachname\\} +% \vskip 1.2cm +Praxis der Softwareentwicklung \\ +Prof. Dr.-Ing. Gregor Snelting \\ +Fakultät für Informatik\\ +Karlsruher Institut für Technologie\\ +\vskip 1.5cm +\begin{tabular}{p{20mm}l} +Autoren: +& Daniel Hönlinger \\ +& Gero Beckmann \\ +& Immanuel Reitz \\ +& Julius Friesen \\ +& Lukas Schmidheissler \\ +\\ +Betreuer: & M.Sc. Hans-Peter Lehmann \\ + & M.Sc. Daniel Seemaier +\end{tabular} +} +\end{center} +\vfill + +%\begin{textblock}{10}[0,0](4,15) +% \includegraphics[width=.3\textwidth]{logos/logo.pdf} +%\end{textblock} + +% \begin{textblock}{8}[0,0](14,14) +% \includegraphics[width=.3\textwidth]{logos/KASTEL_logo.pdf} +% \end{textblock} + +\end{titlepage} + +% \thispagestyle{empty} +% \ \vfill +% \begin{flushleft} +% Copyright $\copyright$ ITI und Verfasser 201?\\ +% \ \\ +% Institut für Theoretische Informatik +% Fakultät für Informatik\\ +% Karlsruher Institut für Technologie\\ +% Am Fasanengarten 5\\ +% 76131 Karlsruhe +% \end{flushleft} +% \newpage + -- cgit v1.2.3