package Ġio . github . war ri or zz . red ire kt . server čĊč Ċ import Ġfre emark er . cache . Class Template Loader č Ċ import Ġio . github . war ri or zz . red ire kt . config . Config č Ċ import Ġio . github . war ri or zz . red ire kt . io .* č Ċ import Ġio . github . war ri or zz . red ire kt . util .* č Ċ import Ġio . ktor . application .* č Ċ import Ġio . ktor . client .* č Ċ import Ġio . ktor . client . features . json .* č Ċ import Ġio . ktor . client . features . json . serializer .* č Ċ import Ġio . ktor . fre emark er .* č Ċ import Ġio . ktor . http . content .* č Ċ import Ġio . ktor . response .* č Ċ import Ġio . ktor . routing .* č Ċ import Ġio . ktor . server . c io .* č Ċ import Ġio . ktor . server . engine .* č Ċ import Ġkotlinx . serialization . Serializable č Ċ import Ġmu . Kotlin Logging č Ċ import Ġorg . lit ote . km ongo . eq č Ċ import Ġjava . io . File čĊč Ċ object ĠRed ire kt Server Ġ{ čĊčĊĠĠĠ Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} čĊĠĠĠ Ġval ĠhttpClient Ġ= ĠHttpClient Ġ{ čĊĠĠĠĠĠĠĠ Ġinstall ( Json Feature ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġserializer Ġ= ĠKotlin x Serializer ( kotlin x . serialization . json . Json Ġ{ Ġignore Unknown Keys Ġ= Ġtrue Ġ}) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġval Ġserver Ġ= Ġembedded Server ( C IO , Ġport Ġ= ĠConfig . PORT ) Ġ{ čĊĠĠĠĠĠĠĠ Ġinstall ( Free Marker ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Loader Ġ= ĠClass Template Loader ( this :: class . java . class Loader , Ġ" templates ") čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġif Ġ(! Config . DASH BOARD _ MODE ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Authorization () čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġrouting Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Config . DASH BOARD _ MODE ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Dashboard () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/ ${ if Ġ( Config . DASH BOARD _ MODE ) Ġ"" Ġelse Ġ" r /" }{ name }") Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġcall . parameters [" name "] čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġtranslate (" log . request . red ire kt ", ĠlistOf ( name Ġ?: Ġ"")) Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= ĠRe positories . entries . findOne ( Red ire kt Entry :: name Ġeq Ġname ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . value Ġis ĠRedirect Entry ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Redirect ( entry . value . url ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( entry . value Ġis ĠMarkdown Entry ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Markdown ( entry . value . markdown ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( entry . value Ġis ĠFile Entry ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond File ( File ( entry . value . path )) Ġ{} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error Ġ{ Ġtranslate (" log . red ire kt . invalid format ", ĠlistOf ( name Ġ?: Ġ"")) Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Markdown ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMarkdown Util . compute Markdown ("# Ġ${ translate (" respond . unsupported ")} "), čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Red ire kt " čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġtranslate (" log . red ire kt . error ", ĠlistOf ( name Ġ?: Ġ"")) Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Markdown ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMarkdown Util . compute Markdown ("# Ġ${ translate (" respond . error ")} "), čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Red ire kt Ġ- Ġ${ translate (" respond . error ") }" čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatic ("/ static ") Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources (" static ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoperator Ġfun Ġinvoke () Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( Config . DASH BOARD _ MODE ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdashboard Server Ġ= Ġembedded Server ( C IO , Ġport Ġ= ĠConfig . DASH BOARD _ PORT ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstall ( Free Marker ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Loader Ġ= ĠClass Template Loader ( this :: class . java . class Loader , Ġ" templates ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Authorization () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrouting Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Dashboard () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdashboard Server . start ( false ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġserver . start ( wait Ġ= Ġtrue ) čĊĠĠĠ Ġ} č Ċ } čĊč Ċ @ Serializable č Ċ data Ġclass ĠUser Session ( val ĠaccessToken : ĠString ) čĊ