package info.mechyrdia
-import info.mechyrdia.auth.Argon2Hasher
-import info.mechyrdia.data.Id
-import info.mechyrdia.data.NationData
-import info.mechyrdia.data.NationUrlSlug
-import kotlinx.serialization.ExperimentalSerializationApi
-import kotlinx.serialization.InternalSerializationApi
-import kotlinx.serialization.KSerializer
-import kotlinx.serialization.SerialName
+import info.mechyrdia.auth.*
+import info.mechyrdia.data.*
+import kotlinx.serialization.*
import kotlinx.serialization.Serializable
-import kotlinx.serialization.descriptors.PolymorphicKind
-import kotlinx.serialization.descriptors.SerialDescriptor
-import kotlinx.serialization.descriptors.buildSerialDescriptor
-import kotlinx.serialization.encoding.Decoder
-import kotlinx.serialization.encoding.Encoder
-import kotlinx.serialization.json.JsonDecoder
-import kotlinx.serialization.json.JsonEncoder
-import kotlinx.serialization.json.JsonPrimitive
-import java.io.File
-import java.nio.charset.Charset
+import kotlinx.serialization.descriptors.*
+import kotlinx.serialization.encoding.*
+import kotlinx.serialization.json.*
+import java.io.*
+import java.nio.charset.*
@Serializable
sealed class FileStorageConfig {
package info.mechyrdia
-import info.mechyrdia.auth.ForbiddenException
-import info.mechyrdia.auth.PageDoNotCacheAttributeKey
-import info.mechyrdia.auth.SessionStorageMongoDB
-import info.mechyrdia.auth.UserSession
-import info.mechyrdia.data.ConnectionHolder
-import info.mechyrdia.data.FileStorage
-import info.mechyrdia.data.Id
-import info.mechyrdia.lore.HttpRedirectException
-import info.mechyrdia.lore.error400
-import info.mechyrdia.lore.error403
-import info.mechyrdia.lore.error403PageExpired
-import info.mechyrdia.lore.error404
-import info.mechyrdia.lore.error409
-import info.mechyrdia.lore.error500
-import info.mechyrdia.lore.getVersionHeaders
-import info.mechyrdia.robot.JsonRobotCodec
-import info.mechyrdia.robot.RobotService
-import info.mechyrdia.route.CsrfFailedException
-import info.mechyrdia.route.FormUrlEncodedFormat
-import info.mechyrdia.route.Root
-import info.mechyrdia.route.WebDavAuthRequired
-import info.mechyrdia.route.get
-import info.mechyrdia.route.installWebDav
-import info.mechyrdia.route.isWebDav
-import info.mechyrdia.route.post
-import info.mechyrdia.route.postMultipart
-import info.mechyrdia.route.ws
-import io.ktor.http.CacheControl
-import io.ktor.http.ContentType
-import io.ktor.http.HttpHeaders
-import io.ktor.http.HttpStatusCode
-import io.ktor.http.content.CachingOptions
-import io.ktor.serialization.kotlinx.KotlinxSerializationConverter
-import io.ktor.serialization.kotlinx.KotlinxWebsocketSerializationConverter
-import io.ktor.server.application.Application
-import io.ktor.server.application.install
-import io.ktor.server.application.log
-import io.ktor.server.cio.CIO
-import io.ktor.server.engine.embeddedServer
-import io.ktor.server.html.respondHtml
-import io.ktor.server.http.content.CompressedFileType
-import io.ktor.server.http.content.JarFileContent
-import io.ktor.server.http.content.staticResources
-import io.ktor.server.plugins.MissingRequestParameterException
-import io.ktor.server.plugins.autohead.AutoHeadResponse
-import io.ktor.server.plugins.cachingheaders.CachingHeaders
-import io.ktor.server.plugins.callid.CallId
-import io.ktor.server.plugins.callid.callId
-import io.ktor.server.plugins.callid.callIdMdc
-import io.ktor.server.plugins.calllogging.CallLogging
-import io.ktor.server.plugins.conditionalheaders.ConditionalHeaders
-import io.ktor.server.plugins.contentnegotiation.ContentNegotiation
-import io.ktor.server.plugins.defaultheaders.DefaultHeaders
-import io.ktor.server.plugins.forwardedheaders.XForwardedHeaders
-import io.ktor.server.plugins.origin
-import io.ktor.server.plugins.statuspages.StatusPages
+import info.mechyrdia.auth.*
+import info.mechyrdia.data.*
+import info.mechyrdia.lore.*
+import info.mechyrdia.robot.*
+import info.mechyrdia.route.*
+import io.ktor.http.*
+import io.ktor.http.content.*
+import io.ktor.serialization.kotlinx.*
+import io.ktor.server.application.*
+import io.ktor.server.cio.*
+import io.ktor.server.engine.*
+import io.ktor.server.html.*
+import io.ktor.server.http.content.*
+import io.ktor.server.plugins.*
+import io.ktor.server.plugins.autohead.*
+import io.ktor.server.plugins.cachingheaders.*
+import io.ktor.server.plugins.callid.*
+import io.ktor.server.plugins.calllogging.*
+import io.ktor.server.plugins.conditionalheaders.*
+import io.ktor.server.plugins.contentnegotiation.*
+import io.ktor.server.plugins.defaultheaders.*
+import io.ktor.server.plugins.forwardedheaders.*
+import io.ktor.server.plugins.statuspages.*
import io.ktor.server.request.*
import io.ktor.server.resources.*
import io.ktor.server.response.*
import io.ktor.server.sessions.*
import io.ktor.server.sessions.serialization.*
import io.ktor.server.websocket.*
-import kotlinx.serialization.json.buildJsonObject
-import kotlinx.serialization.json.put
-import org.slf4j.event.Level
-import java.io.IOException
-import java.util.concurrent.atomic.AtomicLong
-import kotlin.random.Random
+import kotlinx.serialization.json.*
+import org.slf4j.event.*
+import java.io.*
+import java.util.concurrent.atomic.*
+import kotlin.random.*
import kotlin.time.Duration.Companion.hours
fun main() {
package info.mechyrdia
-import kotlinx.serialization.ExperimentalSerializationApi
-import kotlinx.serialization.json.Json
+import kotlinx.serialization.*
+import kotlinx.serialization.json.*
val JsonFileCodec = Json {
prettyPrint = true
package info.mechyrdia.auth
-import com.github.agadar.nationstates.DefaultNationStatesImpl
-import com.github.agadar.nationstates.NationStates
-import com.github.agadar.nationstates.exception.NationStatesResourceNotFoundException
-import com.github.agadar.nationstates.query.APIQuery
-import info.mechyrdia.data.NationUrlSlug
-import info.mechyrdia.data.nanoId
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.runInterruptible
+import com.github.agadar.nationstates.*
+import com.github.agadar.nationstates.exception.*
+import com.github.agadar.nationstates.query.*
+import info.mechyrdia.data.*
+import kotlinx.coroutines.*
val NSAPI: NationStates = DefaultNationStatesImpl("Mechyrdia Factbooks <samfrancis00@gmail.com>")
package info.mechyrdia.auth
-import de.mkammerer.argon2.Argon2
-import de.mkammerer.argon2.Argon2Advanced
-import de.mkammerer.argon2.Argon2Factory
-import info.mechyrdia.Utf8
+import de.mkammerer.argon2.*
+import info.mechyrdia.*
private val argon2Instance = Argon2Factory.createAdvanced()
package info.mechyrdia.auth
-import info.mechyrdia.JsonStorageCodec
-import info.mechyrdia.data.DataDocument
-import info.mechyrdia.data.DocumentTable
-import info.mechyrdia.data.Id
-import info.mechyrdia.data.InstantSerializer
-import info.mechyrdia.data.MONGODB_ID_KEY
-import info.mechyrdia.data.TableHolder
-import io.ktor.server.sessions.SessionStorage
-import kotlinx.serialization.SerialName
-import kotlinx.serialization.Serializable
-import java.time.Instant
+import info.mechyrdia.*
+import info.mechyrdia.data.*
+import io.ktor.server.sessions.*
+import kotlinx.serialization.*
+import java.time.*
object SessionStorageMongoDB : SessionStorage {
override suspend fun invalidate(id: String) {
package info.mechyrdia.auth
-import info.mechyrdia.data.Id
-import info.mechyrdia.data.InstantSerializer
-import info.mechyrdia.data.NationData
-import io.ktor.server.application.ApplicationCall
-import io.ktor.server.plugins.origin
-import io.ktor.server.sessions.TooLateSessionSetException
-import io.ktor.server.sessions.get
-import io.ktor.server.sessions.sessionId
-import io.ktor.server.sessions.sessions
-import io.ktor.server.sessions.set
-import kotlinx.serialization.Serializable
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
-import java.time.Instant
+import info.mechyrdia.data.*
+import io.ktor.server.application.*
+import io.ktor.server.plugins.*
+import io.ktor.server.sessions.*
+import kotlinx.serialization.*
+import org.slf4j.*
+import java.time.*
private val SessionsLogger: Logger = LoggerFactory.getLogger("info.mechyrdia.auth.SessionsKt")
package info.mechyrdia.auth
-import info.mechyrdia.data.DataDocument
-import info.mechyrdia.data.DocumentTable
-import info.mechyrdia.data.Id
-import info.mechyrdia.data.InstantSerializer
-import info.mechyrdia.data.MONGODB_ID_KEY
-import info.mechyrdia.data.NationData
-import info.mechyrdia.data.NationVerifyResult
-import info.mechyrdia.data.TableHolder
-import info.mechyrdia.lore.page
-import info.mechyrdia.lore.redirectHref
-import info.mechyrdia.lore.redirectHrefWithError
-import info.mechyrdia.lore.standardNavBar
-import info.mechyrdia.route.Root
-import info.mechyrdia.route.href
-import info.mechyrdia.route.installCsrfToken
-import io.ktor.http.HttpStatusCode
-import io.ktor.server.application.ApplicationCall
-import io.ktor.server.plugins.MissingRequestParameterException
-import io.ktor.server.sessions.clear
-import io.ktor.server.sessions.sessions
-import io.ktor.server.sessions.set
-import io.ktor.util.AttributeKey
-import kotlinx.html.FormMethod
-import kotlinx.html.HTML
-import kotlinx.html.br
-import kotlinx.html.button
-import kotlinx.html.form
-import kotlinx.html.h1
-import kotlinx.html.hiddenInput
-import kotlinx.html.label
-import kotlinx.html.p
-import kotlinx.html.section
-import kotlinx.html.style
-import kotlinx.html.submitInput
-import kotlinx.html.textInput
-import kotlinx.serialization.SerialName
-import kotlinx.serialization.Serializable
-import java.time.Instant
-import kotlin.collections.set
+import info.mechyrdia.data.*
+import info.mechyrdia.lore.*
+import info.mechyrdia.route.*
+import io.ktor.http.*
+import io.ktor.server.application.*
+import io.ktor.server.plugins.*
+import io.ktor.server.sessions.*
+import io.ktor.util.*
+import kotlinx.html.*
+import kotlinx.serialization.*
+import java.time.*
val PageDoNotCacheAttributeKey = AttributeKey<Boolean>("Mechyrdia.PageDoNotCache")
package info.mechyrdia.auth
-import com.mongodb.client.model.Filters
-import info.mechyrdia.data.DataDocument
-import info.mechyrdia.data.DocumentTable
-import info.mechyrdia.data.Id
-import info.mechyrdia.data.InstantSerializer
-import info.mechyrdia.data.MONGODB_ID_KEY
-import info.mechyrdia.data.NationData
-import info.mechyrdia.data.TableHolder
-import info.mechyrdia.data.ascending
-import info.mechyrdia.data.currentNation
-import info.mechyrdia.data.serialName
-import info.mechyrdia.lore.adminPage
-import info.mechyrdia.lore.dateTime
-import info.mechyrdia.lore.redirectHref
-import info.mechyrdia.lore.redirectHrefWithError
-import info.mechyrdia.route.Root
-import info.mechyrdia.route.href
-import info.mechyrdia.route.installCsrfToken
-import io.ktor.http.HttpStatusCode
-import io.ktor.server.application.ApplicationCall
-import kotlinx.coroutines.flow.toList
+import com.mongodb.client.model.*
+import info.mechyrdia.data.*
+import info.mechyrdia.lore.*
+import info.mechyrdia.route.*
+import io.ktor.http.*
+import io.ktor.server.application.*
+import kotlinx.coroutines.flow.*
import kotlinx.html.*
-import kotlinx.serialization.SerialName
-import kotlinx.serialization.Serializable
-import java.time.Instant
+import kotlinx.serialization.*
+import java.time.*
@Serializable
data class WebDavToken(
package info.mechyrdia.data
-import kotlinx.serialization.ExperimentalSerializationApi
-import kotlinx.serialization.KSerializer
-import kotlinx.serialization.SerializationException
-import kotlinx.serialization.builtins.nullable
-import kotlinx.serialization.descriptors.PrimitiveKind
-import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
-import kotlinx.serialization.descriptors.SerialDescriptor
+import kotlinx.serialization.*
+import kotlinx.serialization.builtins.*
+import kotlinx.serialization.descriptors.*
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
-import org.bson.BsonDateTime
-import org.bson.BsonReader
-import org.bson.BsonWriter
-import org.bson.codecs.Codec
-import org.bson.codecs.DecoderContext
-import org.bson.codecs.EncoderContext
-import org.bson.codecs.configuration.CodecProvider
-import org.bson.codecs.configuration.CodecRegistry
-import org.bson.codecs.kotlinx.BsonDecoder
-import org.bson.codecs.kotlinx.BsonEncoder
-import org.bson.types.ObjectId
-import java.time.Instant
-import kotlin.math.absoluteValue
+import org.bson.*
+import org.bson.codecs.*
+import org.bson.codecs.configuration.*
+import org.bson.codecs.kotlinx.*
+import org.bson.types.*
+import java.time.*
+import kotlin.math.*
object IdCodec : Codec<Id<*>> {
override fun getEncoderClass(): Class<Id<*>> {
package info.mechyrdia.data
-import com.mongodb.client.model.Filters
-import com.mongodb.client.model.Sorts
-import com.mongodb.client.model.UpdateOneModel
-import com.mongodb.client.model.UpdateOptions
-import com.mongodb.client.model.Updates
-import info.mechyrdia.concat
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.toList
-import kotlinx.serialization.SerialName
-import kotlinx.serialization.Serializable
-import java.time.Instant
+import com.mongodb.client.model.*
+import info.mechyrdia.*
+import kotlinx.coroutines.flow.*
+import kotlinx.serialization.*
+import java.time.*
@Serializable
data class Comment(
package info.mechyrdia.data
-import com.aventrix.jnanoid.jnanoid.NanoIdUtils
-import com.mongodb.ConnectionString
-import com.mongodb.MongoClientSettings
-import com.mongodb.MongoDriverInformation
-import com.mongodb.client.model.BulkWriteOptions
-import com.mongodb.client.model.Filters
-import com.mongodb.client.model.IndexOptions
-import com.mongodb.client.model.Indexes
-import com.mongodb.client.model.ReplaceOneModel
-import com.mongodb.client.model.ReplaceOptions
-import com.mongodb.client.model.UpdateOptions
-import com.mongodb.client.model.WriteModel
+import com.aventrix.jnanoid.jnanoid.*
+import com.mongodb.*
+import com.mongodb.client.model.*
+import com.mongodb.kotlin.client.coroutine.*
import com.mongodb.kotlin.client.coroutine.MongoDatabase
-import com.mongodb.kotlin.client.coroutine.expireAfter
-import com.mongodb.reactivestreams.client.MongoClients
-import com.mongodb.reactivestreams.client.gridfs.GridFSBucket
-import com.mongodb.reactivestreams.client.gridfs.GridFSBuckets
-import info.mechyrdia.auth.NsStoredToken
-import info.mechyrdia.auth.SessionStorageDoc
-import info.mechyrdia.auth.WebDavToken
-import info.mechyrdia.robot.RobotGlobals
-import kotlinx.coroutines.CompletableDeferred
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.singleOrNull
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.runBlocking
-import kotlinx.serialization.KSerializer
-import kotlinx.serialization.SerialName
-import kotlinx.serialization.Serializable
-import kotlinx.serialization.descriptors.PrimitiveKind
-import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
-import kotlinx.serialization.descriptors.SerialDescriptor
-import kotlinx.serialization.encoding.Decoder
-import kotlinx.serialization.encoding.Encoder
-import org.bson.codecs.configuration.CodecRegistries
-import org.bson.codecs.kotlinx.KotlinSerializerCodecProvider
-import org.bson.conversions.Bson
-import java.security.SecureRandom
-import java.time.Instant
-import kotlin.reflect.KClass
-import kotlin.reflect.KProperty
-import kotlin.reflect.KProperty1
-import kotlin.reflect.full.findAnnotations
+import com.mongodb.reactivestreams.client.*
+import com.mongodb.reactivestreams.client.gridfs.*
+import info.mechyrdia.auth.*
+import info.mechyrdia.robot.*
+import kotlinx.coroutines.*
+import kotlinx.coroutines.flow.*
+import kotlinx.serialization.*
+import kotlinx.serialization.descriptors.*
+import kotlinx.serialization.encoding.*
+import org.bson.codecs.configuration.*
+import org.bson.codecs.kotlinx.*
+import org.bson.conversions.*
+import java.security.*
+import java.time.*
+import kotlin.reflect.*
+import kotlin.reflect.full.*
import com.mongodb.reactivestreams.client.MongoDatabase as JMongoDatabase
@Serializable(IdSerializer::class)
package info.mechyrdia.data
-import com.mongodb.client.model.Filters
-import com.mongodb.client.model.Updates
-import com.mongodb.reactivestreams.client.gridfs.GridFSBucket
-import info.mechyrdia.Configuration
-import info.mechyrdia.FileStorageConfig
-import info.mechyrdia.concat
-import info.mechyrdia.lore.StoragePathAttributeKey
-import info.mechyrdia.lore.forEachSuspend
-import io.ktor.http.ContentType
-import io.ktor.http.HttpStatusCode
-import io.ktor.http.defaultForFileExtension
-import io.ktor.server.application.ApplicationCall
-import io.ktor.server.response.respond
-import io.ktor.server.response.respondBytes
-import io.ktor.util.combineSafe
-import io.ktor.util.moveToByteArray
-import kotlinx.coroutines.CoroutineName
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.SupervisorJob
-import kotlinx.coroutines.currentCoroutineContext
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.flow.flow
-import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.flow.toList
-import kotlinx.coroutines.flow.toSet
-import kotlinx.coroutines.job
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.reactive.asFlow
-import kotlinx.coroutines.reactive.asPublisher
-import kotlinx.coroutines.reactive.awaitFirst
-import kotlinx.coroutines.reactive.awaitFirstOrNull
-import kotlinx.coroutines.runBlocking
-import kotlinx.coroutines.runInterruptible
-import kotlinx.coroutines.withContext
-import kotlinx.serialization.SerialName
+import com.mongodb.client.model.*
+import com.mongodb.reactivestreams.client.gridfs.*
+import info.mechyrdia.*
+import info.mechyrdia.lore.*
+import io.ktor.http.*
+import io.ktor.server.application.*
+import io.ktor.server.response.*
+import io.ktor.util.*
+import kotlinx.coroutines.*
+import kotlinx.coroutines.flow.*
+import kotlinx.coroutines.reactive.*
+import kotlinx.serialization.*
import kotlinx.serialization.Serializable
-import org.bson.types.ObjectId
-import java.io.ByteArrayOutputStream
-import java.io.File
-import java.nio.ByteBuffer
-import java.nio.file.FileAlreadyExistsException
-import java.nio.file.Files
-import java.nio.file.attribute.BasicFileAttributes
-import java.time.Instant
-import kotlin.String
+import org.bson.types.*
+import java.io.*
+import java.nio.*
+import java.nio.file.*
+import java.nio.file.attribute.*
+import java.time.*
import kotlin.time.Duration.Companion.hours
val StoragePath.contentType: ContentType
package info.mechyrdia.data
-import info.mechyrdia.Configuration
-import info.mechyrdia.FileStorageConfig
-import info.mechyrdia.lore.mapSuspend
-import kotlinx.coroutines.runBlocking
-import kotlin.system.exitProcess
+import info.mechyrdia.*
+import info.mechyrdia.lore.*
+import kotlinx.coroutines.*
+import kotlin.system.*
fun printUsage(): Nothing {
println("Usage: <FROM> <TO>")
package info.mechyrdia.data
-import com.github.agadar.nationstates.domain.nation.Nation
-import com.github.agadar.nationstates.domain.nation.NationVerification
-import com.github.agadar.nationstates.query.ShardQuery
-import com.github.agadar.nationstates.shard.NationShard
-import com.mongodb.client.model.Filters
-import info.mechyrdia.Configuration
-import info.mechyrdia.OwnerNationId
-import info.mechyrdia.auth.NSAPI
-import info.mechyrdia.auth.UserSession
-import info.mechyrdia.auth.executeSuspend
-import io.ktor.server.application.ApplicationCall
-import io.ktor.server.sessions.get
-import io.ktor.server.sessions.sessions
-import io.ktor.util.AttributeKey
-import kotlinx.serialization.SerialName
-import kotlinx.serialization.Serializable
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
-import java.util.concurrent.ConcurrentHashMap
+import com.github.agadar.nationstates.domain.nation.*
+import com.github.agadar.nationstates.query.*
+import com.github.agadar.nationstates.shard.*
+import com.mongodb.client.model.*
+import info.mechyrdia.*
+import info.mechyrdia.auth.*
+import io.ktor.server.application.*
+import io.ktor.server.sessions.*
+import io.ktor.util.*
+import kotlinx.serialization.*
+import org.slf4j.*
+import java.util.concurrent.*
private val NationsLogger: Logger = LoggerFactory.getLogger("info.mechyrdia.data.NationsKt")
package info.mechyrdia.data
-import info.mechyrdia.MainDomainName
-import info.mechyrdia.OwnerNationId
-import info.mechyrdia.lore.ParserTree
-import info.mechyrdia.lore.append
-import info.mechyrdia.lore.dateTime
-import info.mechyrdia.lore.mapSuspend
-import info.mechyrdia.lore.parseAs
-import info.mechyrdia.lore.toCommentHtml
-import info.mechyrdia.lore.toFriendlyPathTitle
-import info.mechyrdia.route.Root
-import info.mechyrdia.route.href
-import info.mechyrdia.route.installCsrfToken
-import io.ktor.server.application.ApplicationCall
-import kotlinx.coroutines.async
-import kotlinx.coroutines.coroutineScope
+import info.mechyrdia.*
+import info.mechyrdia.lore.*
+import info.mechyrdia.route.*
+import io.ktor.server.application.*
+import kotlinx.coroutines.*
import kotlinx.html.*
-import java.time.Instant
+import java.time.*
data class CommentRenderData(
val id: Id<Comment>,
package info.mechyrdia.data
-import com.mongodb.client.model.Sorts
-import info.mechyrdia.OwnerNationId
-import info.mechyrdia.auth.ForbiddenException
-import info.mechyrdia.concat
-import info.mechyrdia.lore.ParserTree
-import info.mechyrdia.lore.PokhwalishAlphabetFont
-import info.mechyrdia.lore.TylanAlphabetFont
-import info.mechyrdia.lore.append
-import info.mechyrdia.lore.getImageSizeStyleValue
-import info.mechyrdia.lore.getReplies
-import info.mechyrdia.lore.page
-import info.mechyrdia.lore.parseAs
-import info.mechyrdia.lore.redirectHref
-import info.mechyrdia.lore.redirectHrefWithError
-import info.mechyrdia.lore.standardNavBar
-import info.mechyrdia.lore.toCommentHtml
-import info.mechyrdia.route.Root
-import info.mechyrdia.route.href
-import info.mechyrdia.route.installCsrfToken
-import io.ktor.http.HttpStatusCode
-import io.ktor.server.application.ApplicationCall
-import kotlinx.coroutines.flow.filterNot
-import kotlinx.coroutines.flow.take
-import kotlinx.coroutines.flow.toList
+import com.mongodb.client.model.*
+import info.mechyrdia.*
+import info.mechyrdia.auth.*
+import info.mechyrdia.lore.*
+import info.mechyrdia.route.*
+import io.ktor.http.*
+import io.ktor.server.application.*
+import kotlinx.coroutines.flow.*
import kotlinx.html.*
-import java.time.Instant
+import java.time.*
suspend fun ApplicationCall.recentCommentsPage(limit: Int?): HTML.() -> Unit {
limit ?: redirectHref(Root.Comments.RecentPage(10), HttpStatusCode.Found)
package info.mechyrdia.data
-import info.mechyrdia.auth.PageDoNotCacheAttributeKey
-import info.mechyrdia.lore.adminPage
-import info.mechyrdia.lore.dateTime
-import info.mechyrdia.lore.mapSuspend
-import info.mechyrdia.lore.redirectHref
-import info.mechyrdia.route.MultiPartPayloadPart
-import info.mechyrdia.route.Root
-import info.mechyrdia.route.href
-import info.mechyrdia.route.installCsrfToken
-import io.ktor.http.ContentType
-import io.ktor.http.HttpStatusCode
-import io.ktor.http.defaultForFileExtension
-import io.ktor.server.application.ApplicationCall
-import io.ktor.server.html.respondHtml
-import io.ktor.server.plugins.MissingRequestParameterException
-import io.ktor.server.response.respond
-import io.ktor.server.response.respondBytes
+import info.mechyrdia.auth.*
+import info.mechyrdia.lore.*
+import info.mechyrdia.route.*
+import io.ktor.http.*
+import io.ktor.server.application.*
+import io.ktor.server.html.*
+import io.ktor.server.plugins.*
+import io.ktor.server.response.*
import kotlinx.html.*
fun Map<String, StoredFileType>.sortedAsFiles() = toList()
package info.mechyrdia.data
-import com.mongodb.client.model.Updates
-import info.mechyrdia.OwnerNationId
-import info.mechyrdia.lore.NationProfileSidebar
-import info.mechyrdia.lore.page
-import info.mechyrdia.lore.redirectHref
-import info.mechyrdia.lore.standardNavBar
-import info.mechyrdia.route.Root
-import info.mechyrdia.route.href
-import info.mechyrdia.route.installCsrfToken
-import io.ktor.http.HttpStatusCode
-import io.ktor.server.application.ApplicationCall
-import kotlinx.coroutines.flow.toList
-import kotlinx.html.HTML
-import kotlinx.html.a
-import kotlinx.html.h1
-import kotlinx.html.id
-import kotlinx.html.p
-import kotlinx.html.section
+import com.mongodb.client.model.*
+import info.mechyrdia.*
+import info.mechyrdia.lore.*
+import info.mechyrdia.route.*
+import io.ktor.http.*
+import io.ktor.server.application.*
+import kotlinx.coroutines.flow.*
+import kotlinx.html.*
suspend fun ApplicationCall.currentUserPage(): Nothing {
val currNation = currentNation()
package info.mechyrdia.data
-import com.mongodb.client.model.Accumulators
-import com.mongodb.client.model.Aggregates
-import com.mongodb.client.model.Filters
-import com.mongodb.client.model.Updates
-import info.mechyrdia.auth.UserSession
-import info.mechyrdia.lore.dateTime
-import io.ktor.server.application.ApplicationCall
-import io.ktor.server.request.path
-import io.ktor.server.request.userAgent
-import io.ktor.server.sessions.sessionId
-import kotlinx.coroutines.flow.firstOrNull
+import com.mongodb.client.model.*
+import info.mechyrdia.auth.*
+import info.mechyrdia.lore.*
+import io.ktor.server.application.*
+import io.ktor.server.request.*
+import io.ktor.server.sessions.*
+import kotlinx.coroutines.flow.*
import kotlinx.html.*
-import kotlinx.serialization.SerialName
-import kotlinx.serialization.Serializable
-import org.intellij.lang.annotations.Language
-import java.time.Instant
+import kotlinx.serialization.*
+import org.intellij.lang.annotations.*
+import java.time.*
@Serializable
data class PageVisitTotals(
package info.mechyrdia.data
-import info.mechyrdia.Utf8
-import io.ktor.http.ContentType
-import io.ktor.http.HttpStatusCode
-import io.ktor.http.withCharsetIfNeeded
-import io.ktor.server.application.ApplicationCall
-import io.ktor.server.response.respondText
+import info.mechyrdia.*
+import io.ktor.http.*
+import io.ktor.server.application.*
+import io.ktor.server.response.*
import kotlinx.html.*
import kotlinx.html.consumers.*
import kotlinx.html.dom.*
import kotlinx.html.impl.*
import kotlinx.html.org.w3c.dom.events.*
import kotlinx.html.stream.*
-import org.w3c.dom.Document
+import org.w3c.dom.*
@DslMarker
annotation class XmlTagMarker
package info.mechyrdia.lore
-import info.mechyrdia.data.FileStorage
-import info.mechyrdia.data.StoragePath
-import io.ktor.server.application.ApplicationCall
-import java.time.Instant
-import java.time.Month
-import java.time.ZoneId
+import info.mechyrdia.data.*
+import io.ktor.server.application.*
+import java.time.*
val MyTimeZone: ZoneId = ZoneId.of("America/New_York")
package info.mechyrdia.lore
-import info.mechyrdia.Configuration
-import info.mechyrdia.OwnerNationId
-import info.mechyrdia.auth.UserSession
-import info.mechyrdia.concat
-import info.mechyrdia.data.FileStorage
-import info.mechyrdia.data.StoragePath
-import info.mechyrdia.route.Root
-import info.mechyrdia.route.href
-import io.ktor.server.application.ApplicationCall
-import io.ktor.server.sessions.get
-import io.ktor.server.sessions.sessions
+import info.mechyrdia.*
+import info.mechyrdia.auth.*
+import info.mechyrdia.data.*
+import info.mechyrdia.route.*
+import io.ktor.server.application.*
+import io.ktor.server.sessions.*
import kotlinx.html.*
-import java.text.Collator
-import java.util.Locale
+import java.text.*
+import java.util.*
data class ArticleNode(val name: String, val title: ArticleTitle, val subNodes: List<ArticleNode>?)
package info.mechyrdia.lore
-import info.mechyrdia.concat
-import info.mechyrdia.data.StoragePath
+import info.mechyrdia.*
+import info.mechyrdia.data.*
data class ArticleTitle(val title: String, val css: String = "")
package info.mechyrdia.lore
-import info.mechyrdia.data.FileStorage
-import info.mechyrdia.data.StoragePath
-import io.ktor.util.AttributeKey
-import kotlinx.coroutines.sync.Mutex
-import kotlinx.coroutines.sync.withLock
-import java.time.Instant
-import java.util.concurrent.ConcurrentHashMap
+import info.mechyrdia.data.*
+import io.ktor.util.*
+import kotlinx.coroutines.sync.*
+import java.time.*
+import java.util.concurrent.*
val StoragePathAttributeKey = AttributeKey<StoragePath>("Mechyrdia.StoragePath")
package info.mechyrdia.lore
-import info.mechyrdia.data.FileStorage
-import info.mechyrdia.data.StoragePath
-import info.mechyrdia.data.respondStoredFile
-import io.ktor.http.HttpHeaders
-import io.ktor.http.HttpStatusCode
-import io.ktor.server.application.ApplicationCall
-import io.ktor.server.request.acceptEncodingItems
-import io.ktor.server.response.header
-import io.ktor.server.response.respond
-import io.ktor.server.response.respondBytes
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.withContext
-import java.io.ByteArrayOutputStream
-import java.io.FilterOutputStream
-import java.io.OutputStream
-import java.util.zip.DeflaterOutputStream
-import java.util.zip.GZIPOutputStream
+import info.mechyrdia.data.*
+import io.ktor.http.*
+import io.ktor.server.application.*
+import io.ktor.server.request.*
+import io.ktor.server.response.*
+import kotlinx.coroutines.*
+import java.io.*
+import java.util.zip.*
private val gzippedCache = CompressedCache("gzip", ::GZIPOutputStream)
private val deflatedCache = CompressedCache("deflate", ::DeflaterOutputStream)
package info.mechyrdia.lore
-import info.mechyrdia.data.FileStorage
-import info.mechyrdia.data.StoragePath
-import io.ktor.http.content.EntityTagVersion
-import io.ktor.http.content.Version
-import io.ktor.server.application.ApplicationCall
-import io.ktor.server.http.content.LastModifiedVersion
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.async
-import kotlinx.coroutines.awaitAll
-import kotlinx.coroutines.coroutineScope
-import kotlinx.coroutines.withContext
-import java.io.IOException
-import java.io.OutputStream
-import java.security.MessageDigest
-import java.util.Base64
+import info.mechyrdia.data.*
+import io.ktor.http.content.*
+import io.ktor.server.application.*
+import io.ktor.server.http.content.*
+import kotlinx.coroutines.*
+import java.io.*
+import java.security.*
+import java.util.*
private class DigestingOutputStream(stomach: MessageDigest) : OutputStream() {
private var stomachStore: MessageDigest? = stomach
package info.mechyrdia.lore
-import info.mechyrdia.data.FileStorage
-import info.mechyrdia.data.StoragePath
-import kotlinx.coroutines.sync.Mutex
-import kotlinx.coroutines.sync.withLock
-import java.time.Instant
-import kotlin.properties.ReadOnlyProperty
-import kotlin.reflect.KProperty
+import info.mechyrdia.data.*
+import kotlinx.coroutines.sync.*
+import java.time.*
+import kotlin.properties.*
+import kotlin.reflect.*
fun <T : Any> storedData(path: StoragePath, loader: suspend (StoragePath) -> T?): ReadOnlyProperty<Any?, suspend () -> T?> = object : ReadOnlyProperty<Any?, suspend () -> T?> {
private var loadedValue: T? = null
package info.mechyrdia.lore
-import info.mechyrdia.JsonFileCodec
-import info.mechyrdia.Utf8
-import info.mechyrdia.concatenated
-import info.mechyrdia.data.FileStorage
-import info.mechyrdia.data.StoragePath
-import kotlinx.serialization.Serializable
-import kotlinx.serialization.builtins.MapSerializer
-import kotlinx.serialization.builtins.serializer
+import info.mechyrdia.*
+import info.mechyrdia.data.*
+import kotlinx.serialization.*
+import kotlinx.serialization.builtins.*
@Serializable
data class FontAssetSrc(
package info.mechyrdia.lore
-import com.jaredrummler.fontreader.truetype.FontFileReader
-import com.jaredrummler.fontreader.truetype.TTFFile
-import com.jaredrummler.fontreader.util.GlyphSequence
-import info.mechyrdia.data.FileStorage
-import info.mechyrdia.data.StoragePath
-import info.mechyrdia.route.KeyedEnumSerializer
-import info.mechyrdia.yieldThread
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.runInterruptible
-import kotlinx.coroutines.withContext
+import com.jaredrummler.fontreader.truetype.*
+import com.jaredrummler.fontreader.util.*
+import info.mechyrdia.*
+import info.mechyrdia.data.*
+import info.mechyrdia.route.*
+import kotlinx.coroutines.*
import kotlinx.serialization.Serializable
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
-import java.awt.AlphaComposite
-import java.awt.Color
-import java.awt.Font
-import java.awt.RenderingHints
-import java.awt.geom.AffineTransform
-import java.awt.geom.GeneralPath
-import java.awt.image.BufferedImage
-import java.io.ByteArrayInputStream
-import java.io.ByteArrayOutputStream
-import java.io.IOException
-import java.nio.IntBuffer
-import javax.imageio.ImageIO
-import kotlin.math.ceil
-import kotlin.math.roundToInt
-import kotlin.properties.ReadOnlyProperty
+import org.slf4j.*
+import java.awt.*
+import java.awt.geom.*
+import java.awt.image.*
+import java.io.*
+import java.nio.*
+import javax.imageio.*
+import kotlin.math.*
+import kotlin.properties.*
private val FontsLogger: Logger = LoggerFactory.getLogger("info.mechyrdia.lore.FontsKt")
package info.mechyrdia.lore
-import info.mechyrdia.route.ErrorMessageCookieName
-import info.mechyrdia.route.href
-import io.ktor.http.HttpStatusCode
-import io.ktor.server.application.ApplicationCall
+import info.mechyrdia.route.*
+import io.ktor.http.*
+import io.ktor.server.application.*
data class HttpRedirectException(val url: String, val status: HttpStatusCode) : RuntimeException()
package info.mechyrdia.lore
-import info.mechyrdia.MainDomainName
-import info.mechyrdia.concat
-import info.mechyrdia.data.Comment
-import info.mechyrdia.data.Id
+import info.mechyrdia.*
+import info.mechyrdia.data.*
abstract class BuilderLexerProcessor<TContext> : LexerTagFallback<TContext, Unit>, LexerTextProcessor<TContext, Unit>, LexerLineBreakProcessor<TContext, Unit>, LexerCombiner<TContext, Unit> {
override fun processInvalidTag(env: LexerTagEnvironment<TContext, Unit>, tag: String, param: String?, subNodes: ParserTree) {
package info.mechyrdia.lore
-import info.mechyrdia.JsonStorageCodec
-import info.mechyrdia.concat
+import info.mechyrdia.*
import kotlinx.html.*
import kotlinx.html.org.w3c.dom.events.*
import kotlinx.html.stream.*
-import java.time.Instant
+import java.time.*
typealias HtmlBuilderContext = Unit
typealias HtmlBuilderSubject = TagConsumer<*>.() -> Any?
package info.mechyrdia.lore
-import info.mechyrdia.concat
+import info.mechyrdia.*
typealias PlainTextBuilderContext = Unit
typealias PlainTextBuilderSubject = String
package info.mechyrdia.lore
-import info.mechyrdia.JsonStorageCodec
-import info.mechyrdia.concat
-import info.mechyrdia.data.StoragePath
-import kotlinx.coroutines.async
-import kotlinx.coroutines.awaitAll
-import kotlinx.coroutines.coroutineScope
-import kotlinx.coroutines.joinAll
-import kotlinx.coroutines.launch
-import java.time.Instant
-import kotlin.math.roundToInt
+import info.mechyrdia.*
+import info.mechyrdia.data.*
+import kotlinx.coroutines.*
+import java.time.*
+import kotlin.math.*
class PreProcessorContext private constructor(
val variables: MutableMap<String, ParserTree>,
package info.mechyrdia.lore
-import info.mechyrdia.JsonStorageCodec
-import info.mechyrdia.Utf8
-import info.mechyrdia.data.FileStorage
-import info.mechyrdia.data.StoragePath
-import io.ktor.util.hex
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.runInterruptible
-import kotlinx.coroutines.suspendCancellableCoroutine
-import kotlinx.serialization.json.JsonArray
-import kotlinx.serialization.json.JsonElement
-import kotlinx.serialization.json.JsonNull
-import kotlinx.serialization.json.JsonObject
-import kotlinx.serialization.json.JsonPrimitive
-import kotlinx.serialization.json.booleanOrNull
-import kotlinx.serialization.json.double
-import kotlinx.serialization.json.intOrNull
-import java.security.MessageDigest
-import java.util.concurrent.ConcurrentHashMap
-import java.util.concurrent.locks.ReentrantLock
-import java.util.function.Consumer
-import javax.script.Compilable
-import javax.script.CompiledScript
-import javax.script.ScriptEngineManager
-import javax.script.SimpleBindings
-import kotlin.concurrent.withLock
-import kotlin.coroutines.Continuation
-import kotlin.coroutines.CoroutineContext
-import kotlin.coroutines.resume
-import kotlin.coroutines.resumeWithException
-import kotlin.coroutines.startCoroutine
+import info.mechyrdia.*
+import info.mechyrdia.data.*
+import io.ktor.util.*
+import kotlinx.coroutines.*
+import kotlinx.serialization.json.*
+import java.security.*
+import java.util.concurrent.*
+import java.util.concurrent.locks.*
+import java.util.function.*
+import javax.script.*
+import kotlin.concurrent.*
+import kotlin.coroutines.*
object PreProcessorTemplateLoader {
suspend fun loadTemplate(name: String): ParserTree {
package info.mechyrdia.lore
-import info.mechyrdia.JsonStorageCodec
-import info.mechyrdia.Utf8
-import info.mechyrdia.concat
-import info.mechyrdia.data.FileStorage
-import info.mechyrdia.data.StoragePath
-import kotlinx.serialization.json.JsonArray
-import kotlinx.serialization.json.JsonElement
-import kotlinx.serialization.json.JsonNull
-import kotlinx.serialization.json.JsonObject
-import kotlinx.serialization.json.JsonPrimitive
+import info.mechyrdia.*
+import info.mechyrdia.data.*
+import kotlinx.serialization.json.*
fun JsonElement.toPreProcessTree(): ParserTree = when (this) {
JsonNull -> emptyList()
package info.mechyrdia.lore
-import java.time.Instant
-import kotlin.math.acos
-import kotlin.math.asin
-import kotlin.math.atan
-import kotlin.math.atan2
-import kotlin.math.cbrt
-import kotlin.math.ceil
-import kotlin.math.cos
-import kotlin.math.floor
-import kotlin.math.hypot
-import kotlin.math.log
-import kotlin.math.max
-import kotlin.math.min
-import kotlin.math.pow
-import kotlin.math.round
-import kotlin.math.sin
-import kotlin.math.sqrt
-import kotlin.math.tan
-import kotlin.math.truncate
+import java.time.*
+import kotlin.math.*
fun <T : Number> ParserTree.treeToNumberOrNull(convert: String.() -> T?) = treeToText().convert()
package info.mechyrdia.lore
-import info.mechyrdia.JsonStorageCodec
-import kotlinx.html.div
-import kotlinx.html.form
-import kotlinx.html.span
-import kotlinx.serialization.DeserializationStrategy
-import kotlinx.serialization.Serializable
-import kotlinx.serialization.json.JsonContentPolymorphicSerializer
-import kotlinx.serialization.json.JsonElement
-import kotlinx.serialization.json.JsonPrimitive
+import info.mechyrdia.*
+import kotlinx.html.*
+import kotlinx.serialization.*
+import kotlinx.serialization.json.*
@Serializable
data class LangVocabInputWordType(
package info.mechyrdia.lore
import kotlinx.html.*
-import java.time.Instant
+import java.time.*
fun String.toRawLink() = substringBeforeLast('#').sanitizeLink().toInternalUrl() + "?format=raw"
package info.mechyrdia.lore
-import info.mechyrdia.concat
-import info.mechyrdia.robot.toOpenAiName
-import java.time.Instant
+import info.mechyrdia.*
+import info.mechyrdia.robot.*
+import java.time.*
fun String.toRobotUrl(context: RobotTextContext): String {
val filePath = if (startsWith("/"))
package info.mechyrdia.lore
-import info.mechyrdia.data.NationData
+import info.mechyrdia.data.*
import kotlinx.html.*
abstract class Sidebar {
package info.mechyrdia.lore
-import info.mechyrdia.data.StoragePath
+import info.mechyrdia.data.*
import io.ktor.server.application.*
fun ApplicationCall.galaxyMapPage(): StoragePath {
package info.mechyrdia.lore
-import info.mechyrdia.JsonFileCodec
-import info.mechyrdia.OwnerNationId
-import info.mechyrdia.Utf8
-import info.mechyrdia.auth.createCsrfToken
-import info.mechyrdia.data.FileStorage
-import info.mechyrdia.data.StoragePath
-import info.mechyrdia.data.currentNation
-import info.mechyrdia.robot.RobotService
-import info.mechyrdia.robot.RobotServiceStatus
-import info.mechyrdia.route.Root
-import info.mechyrdia.route.href
-import io.ktor.server.application.ApplicationCall
+import info.mechyrdia.*
+import info.mechyrdia.auth.*
+import info.mechyrdia.data.*
+import info.mechyrdia.robot.*
+import info.mechyrdia.route.*
+import io.ktor.server.application.*
import kotlinx.html.*
-import kotlinx.serialization.Serializable
-import kotlinx.serialization.builtins.ListSerializer
-import kotlin.collections.component1
-import kotlin.collections.component2
-import kotlin.collections.set
+import kotlinx.serialization.*
+import kotlinx.serialization.builtins.*
@Serializable
private data class ExternalLink(
package info.mechyrdia.lore
-import info.mechyrdia.MainDomainName
-import io.ktor.server.application.ApplicationCall
-import io.ktor.server.request.path
+import info.mechyrdia.*
+import io.ktor.server.application.*
+import io.ktor.server.request.*
import kotlinx.html.*
-import kotlinx.serialization.Serializable
+import kotlinx.serialization.*
@Serializable
data class OpenGraphData(
package info.mechyrdia.lore
-import io.ktor.server.application.ApplicationCall
+import io.ktor.server.application.*
import kotlinx.html.*
-import java.time.Instant
-import kotlin.collections.List
-import kotlin.collections.listOf
-import kotlin.collections.set
+import java.time.*
private val preloadFonts = listOf(
"DejaVuSans-Bold.woff",
package info.mechyrdia.lore
-import info.mechyrdia.OwnerNationId
-import info.mechyrdia.data.currentNation
-import info.mechyrdia.route.CsrfProtectedResourcePayload
-import info.mechyrdia.route.Root
-import info.mechyrdia.route.href
-import io.ktor.http.HttpHeaders
-import io.ktor.server.application.ApplicationCall
-import io.ktor.server.request.header
-import io.ktor.server.request.uri
+import info.mechyrdia.*
+import info.mechyrdia.data.*
+import info.mechyrdia.route.*
+import io.ktor.http.*
+import io.ktor.server.application.*
+import io.ktor.server.request.*
import kotlinx.html.*
suspend fun ApplicationCall.errorPage(title: String, body: FlowContent.() -> Unit): HTML.() -> Unit {
package info.mechyrdia.lore
-import info.mechyrdia.JsonFileCodec
-import info.mechyrdia.data.Comment
-import info.mechyrdia.data.CommentRenderData
-import info.mechyrdia.data.FileStorage
-import info.mechyrdia.data.NationData
-import info.mechyrdia.data.PageVisitTotals
-import info.mechyrdia.data.StoragePath
-import info.mechyrdia.data.commentBox
-import info.mechyrdia.data.commentInput
-import info.mechyrdia.data.currentNation
-import info.mechyrdia.data.guestbook
-import info.mechyrdia.data.nationCache
-import info.mechyrdia.data.processGuestbook
-import info.mechyrdia.route.KeyedEnumSerializer
-import info.mechyrdia.route.Root
-import info.mechyrdia.route.href
-import io.ktor.server.application.ApplicationCall
-import kotlinx.coroutines.async
-import kotlinx.coroutines.coroutineScope
-import kotlinx.coroutines.flow.toList
+import info.mechyrdia.*
+import info.mechyrdia.data.*
+import info.mechyrdia.route.*
+import io.ktor.server.application.*
+import kotlinx.coroutines.*
+import kotlinx.coroutines.flow.*
import kotlinx.html.*
-import kotlinx.serialization.Serializable
+import kotlinx.serialization.*
@Serializable
data class IntroMetaData(
package info.mechyrdia.lore
-import info.mechyrdia.MainDomainName
-import info.mechyrdia.Utf8
-import info.mechyrdia.data.FileStorage
-import info.mechyrdia.data.StoragePath
-import io.ktor.server.application.ApplicationCall
-import io.ktor.server.request.path
+import info.mechyrdia.*
+import info.mechyrdia.data.*
+import io.ktor.server.application.*
+import io.ktor.server.request.*
import kotlinx.html.*
private val meshDir = StoragePath.assetDir / "meshes"
package info.mechyrdia.lore
-import info.mechyrdia.auth.PageDoNotCacheAttributeKey
-import info.mechyrdia.route.KeyedEnumSerializer
-import io.ktor.server.application.ApplicationCall
+import info.mechyrdia.auth.*
+import info.mechyrdia.route.*
+import io.ktor.server.application.*
import kotlinx.html.*
-import kotlinx.serialization.Serializable
-import kotlinx.serialization.serializer
+import kotlinx.serialization.*
@Serializable(PageThemeSerializer::class)
enum class PageTheme(val attributeValue: String?) {
package info.mechyrdia.lore
-import info.mechyrdia.JsonFileCodec
-import info.mechyrdia.MainDomainName
-import info.mechyrdia.Utf8
-import info.mechyrdia.data.FileStorage
-import info.mechyrdia.data.StoragePath
-import info.mechyrdia.data.XmlTagConsumer
-import info.mechyrdia.data.declaration
-import info.mechyrdia.data.respondXml
-import info.mechyrdia.data.root
-import info.mechyrdia.route.KeyedEnumSerializer
-import io.ktor.http.ContentType
-import io.ktor.server.application.ApplicationCall
-import io.ktor.server.html.respondHtml
-import io.ktor.server.response.respondText
-import kotlinx.html.Entities
-import kotlinx.html.FlowContent
-import kotlinx.html.HTML
-import kotlinx.html.a
-import kotlinx.html.blockQuote
-import kotlinx.html.h1
-import kotlinx.html.id
-import kotlinx.html.img
-import kotlinx.html.p
-import kotlinx.html.section
-import kotlinx.html.style
-import kotlinx.html.unsafe
-import kotlinx.serialization.Serializable
-import kotlinx.serialization.builtins.ListSerializer
-import kotlinx.serialization.json.buildJsonObject
-import kotlinx.serialization.json.put
+import info.mechyrdia.*
+import info.mechyrdia.data.*
+import info.mechyrdia.route.*
+import io.ktor.http.*
+import io.ktor.server.application.*
+import io.ktor.server.html.*
+import io.ktor.server.response.*
+import kotlinx.html.*
+import kotlinx.serialization.*
+import kotlinx.serialization.builtins.*
+import kotlinx.serialization.json.*
@Serializable
data class Quote(
package info.mechyrdia.lore
-import info.mechyrdia.MainDomainName
-import info.mechyrdia.data.FileStorage
-import info.mechyrdia.data.StoragePath
-import info.mechyrdia.data.XmlInsertable
-import info.mechyrdia.data.XmlTag
-import info.mechyrdia.data.XmlTagConsumer
-import info.mechyrdia.data.declaration
-import info.mechyrdia.data.root
-import io.ktor.server.application.ApplicationCall
-import java.time.Instant
-import java.time.ZoneId
-import java.time.format.DateTimeFormatter
+import info.mechyrdia.*
+import info.mechyrdia.data.*
+import io.ktor.server.application.*
+import java.time.*
+import java.time.format.*
private val AVERAGE_FACTBOOK_INTRO_CHANGEFREQ = SitemapChangeFrequency.DAILY
private val AVERAGE_FACTBOOK_PAGE_CHANGEFREQ = SitemapChangeFrequency.HOURLY
package info.mechyrdia.lore
-import com.mongodb.client.model.Sorts
-import info.mechyrdia.MainDomainName
-import info.mechyrdia.OwnerNationId
-import info.mechyrdia.concat
-import info.mechyrdia.data.Comment
-import info.mechyrdia.data.CommentRenderData
-import info.mechyrdia.data.FileStorage
-import info.mechyrdia.data.StoragePath
-import info.mechyrdia.data.StoredFileStats
-import info.mechyrdia.data.XmlInsertable
-import info.mechyrdia.data.XmlTag
-import info.mechyrdia.data.XmlTagConsumer
-import info.mechyrdia.data.currentNation
-import info.mechyrdia.data.declaration
-import info.mechyrdia.data.nationCache
-import info.mechyrdia.data.respondXml
-import info.mechyrdia.data.root
-import info.mechyrdia.data.serialName
-import io.ktor.http.ContentType
-import io.ktor.http.HttpStatusCode
-import io.ktor.http.defaultForFileExtension
-import io.ktor.server.application.ApplicationCall
-import kotlinx.coroutines.flow.filterNot
-import kotlinx.coroutines.flow.take
-import kotlinx.coroutines.flow.toList
-import java.time.Instant
-import java.time.ZoneOffset
-import java.time.format.DateTimeFormatter
+import com.mongodb.client.model.*
+import info.mechyrdia.*
+import info.mechyrdia.data.*
+import io.ktor.http.*
+import io.ktor.server.application.*
+import kotlinx.coroutines.flow.*
+import java.time.*
+import java.time.format.*
suspend fun ApplicationCall.respondRss(rss: RssChannel) {
respondXml(contentType = ContentType.Application.Rss) { rss(rss) }
package info.mechyrdia.robot
-import io.ktor.client.HttpClient
-import io.ktor.client.call.body
-import io.ktor.client.plugins.sse.sse
-import io.ktor.client.request.HttpRequestBuilder
-import io.ktor.client.request.delete
-import io.ktor.client.request.forms.formData
-import io.ktor.client.request.forms.submitFormWithBinaryData
-import io.ktor.client.request.get
-import io.ktor.client.request.post
-import io.ktor.client.request.setBody
-import io.ktor.http.ContentType
-import io.ktor.http.contentType
-import io.ktor.http.parameters
-import io.ktor.sse.ServerSentEvent
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.currentCoroutineContext
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.SharingStarted
-import kotlinx.coroutines.flow.flow
-import kotlinx.coroutines.flow.shareIn
+import io.ktor.client.*
+import io.ktor.client.call.*
+import io.ktor.client.plugins.sse.*
+import io.ktor.client.request.*
+import io.ktor.client.request.forms.*
+import io.ktor.http.*
+import io.ktor.sse.*
+import kotlinx.coroutines.*
+import kotlinx.coroutines.flow.*
@JvmInline
value class RobotClient(
package info.mechyrdia.robot
-import io.ktor.http.Parameters
-import io.ktor.http.formUrlEncode
-import kotlinx.serialization.ExperimentalSerializationApi
-import kotlinx.serialization.json.Json
+import io.ktor.http.*
+import kotlinx.serialization.*
+import kotlinx.serialization.json.*
@OptIn(ExperimentalSerializationApi::class)
val JsonRobotCodec = Json {
package info.mechyrdia.robot
-import info.mechyrdia.Utf8
-import io.ktor.client.request.forms.FormBuilder
-import io.ktor.http.ContentType
-import io.ktor.http.Headers
-import io.ktor.http.HttpHeaders
-import io.ktor.http.append
+import info.mechyrdia.*
+import io.ktor.client.request.forms.*
+import io.ktor.http.*
class FileUpload(
val content: ByteArray,
package info.mechyrdia.robot
-import io.ktor.client.plugins.api.createClientPlugin
-import io.ktor.util.AttributeKey
-import io.ktor.util.Attributes
-import kotlinx.coroutines.delay
-import java.time.Instant
-import java.util.concurrent.atomic.AtomicInteger
-import java.util.concurrent.atomic.AtomicLong
-import kotlin.random.Random
+import io.ktor.client.plugins.api.*
+import io.ktor.util.*
+import kotlinx.coroutines.*
+import java.time.*
+import java.util.concurrent.atomic.*
+import kotlin.random.*
import kotlin.time.Duration.Companion.seconds
private val DurationRegex = Regex("([0-9]+h)?([0-9]+m)?([0-9]+s)?")
package info.mechyrdia.robot
-import kotlinx.serialization.SerialName
-import kotlinx.serialization.Serializable
+import kotlinx.serialization.*
@Serializable
@JvmInline
package info.mechyrdia.robot
-import com.aallam.ktoken.Encoding
-import com.aallam.ktoken.Tokenizer
-import info.mechyrdia.Configuration
-import info.mechyrdia.MainDomainName
-import info.mechyrdia.OpenAiConfig
-import info.mechyrdia.Utf8
-import info.mechyrdia.concat
-import info.mechyrdia.data.DataDocument
-import info.mechyrdia.data.DocumentTable
-import info.mechyrdia.data.Id
-import info.mechyrdia.data.InstantNullableSerializer
-import info.mechyrdia.data.MONGODB_ID_KEY
-import info.mechyrdia.data.NationData
-import info.mechyrdia.data.TableHolder
-import info.mechyrdia.lore.RobotFactbookLoader
-import io.ktor.client.HttpClient
-import io.ktor.client.engine.java.Java
-import io.ktor.client.plugins.ClientRequestException
-import io.ktor.client.plugins.HttpRequestRetry
-import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
-import io.ktor.client.plugins.defaultRequest
-import io.ktor.client.plugins.logging.LogLevel
-import io.ktor.client.plugins.logging.Logging
-import io.ktor.client.plugins.sse.SSE
-import io.ktor.client.request.header
-import io.ktor.http.ContentType
-import io.ktor.http.HttpHeaders
-import io.ktor.http.withCharset
-import io.ktor.serialization.kotlinx.json.json
-import kotlinx.coroutines.CoroutineName
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Deferred
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.SupervisorJob
-import kotlinx.coroutines.async
-import kotlinx.coroutines.awaitAll
-import kotlinx.coroutines.currentCoroutineContext
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.filter
-import kotlinx.coroutines.flow.flow
-import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.flow.mapNotNull
-import kotlinx.coroutines.flow.onCompletion
-import kotlinx.coroutines.flow.onEach
-import kotlinx.coroutines.job
-import kotlinx.coroutines.launch
-import kotlinx.serialization.SerialName
-import kotlinx.serialization.Serializable
+import com.aallam.ktoken.*
+import info.mechyrdia.*
+import info.mechyrdia.data.*
+import info.mechyrdia.lore.*
+import io.ktor.client.*
+import io.ktor.client.engine.java.*
+import io.ktor.client.plugins.*
+import io.ktor.client.plugins.contentnegotiation.*
+import io.ktor.client.plugins.logging.*
+import io.ktor.client.plugins.sse.*
+import io.ktor.client.request.*
+import io.ktor.http.*
+import io.ktor.serialization.kotlinx.json.*
+import kotlinx.coroutines.*
+import kotlinx.coroutines.flow.*
+import kotlinx.serialization.*
+import org.slf4j.*
import org.slf4j.Logger
-import org.slf4j.LoggerFactory
-import java.time.Instant
-import kotlin.collections.component1
-import kotlin.collections.component2
-import kotlin.collections.set
-import kotlin.random.Random
+import java.time.*
+import kotlin.random.*
import kotlin.time.Duration.Companion.minutes
private val RobotServiceLogger: Logger = LoggerFactory.getLogger("info.mechyrdia.robot.RobotServiceKt")
package info.mechyrdia.robot
-import com.mongodb.client.model.Filters
-import com.mongodb.client.model.Updates
-import info.mechyrdia.OwnerNationId
-import info.mechyrdia.data.DataDocument
-import info.mechyrdia.data.DocumentTable
-import info.mechyrdia.data.Id
-import info.mechyrdia.data.MONGODB_ID_KEY
-import info.mechyrdia.data.NationData
-import info.mechyrdia.data.TableHolder
-import info.mechyrdia.data.ascending
-import info.mechyrdia.data.serialName
-import info.mechyrdia.lore.MyTimeZone
-import kotlinx.serialization.SerialName
-import kotlinx.serialization.Serializable
-import java.time.Instant
+import com.mongodb.client.model.*
+import info.mechyrdia.*
+import info.mechyrdia.data.*
+import info.mechyrdia.lore.*
+import kotlinx.serialization.*
+import java.time.*
@Serializable
data class RobotUser(
package info.mechyrdia.robot
-import info.mechyrdia.auth.createCsrfToken
-import info.mechyrdia.data.currentNation
-import info.mechyrdia.lore.adminPage
-import info.mechyrdia.lore.page
-import info.mechyrdia.lore.redirectHrefWithError
-import info.mechyrdia.lore.standardNavBar
-import info.mechyrdia.route.Root
-import info.mechyrdia.route.checkCsrfToken
-import info.mechyrdia.route.href
-import info.mechyrdia.route.installCsrfToken
-import io.ktor.server.application.ApplicationCall
-import io.ktor.server.websocket.DefaultWebSocketServerSession
-import io.ktor.server.websocket.sendSerialized
-import io.ktor.websocket.CloseReason
-import io.ktor.websocket.CloseReason.Codes
-import io.ktor.websocket.Frame
-import io.ktor.websocket.WebSocketSession
-import io.ktor.websocket.close
-import io.ktor.websocket.readText
+import info.mechyrdia.auth.*
+import info.mechyrdia.data.*
+import info.mechyrdia.lore.*
+import info.mechyrdia.route.*
+import io.ktor.server.application.*
+import io.ktor.server.websocket.*
+import io.ktor.websocket.*
+import io.ktor.websocket.CloseReason.*
import kotlinx.html.*
suspend fun ApplicationCall.robotPage(): HTML.() -> Unit {
package info.mechyrdia.route
-import info.mechyrdia.auth.WebDavToken
-import info.mechyrdia.data.Id
-import info.mechyrdia.lore.TextAlignment
+import info.mechyrdia.auth.*
+import info.mechyrdia.data.*
+import info.mechyrdia.lore.*
import kotlinx.html.*
-import kotlinx.serialization.Serializable
+import kotlinx.serialization.*
@Serializable
class LoginPayload(override val csrfToken: String? = null, val nation: String, val checksum: String, val tokenId: String) : CsrfProtectedResourcePayload
package info.mechyrdia.route
-import info.mechyrdia.auth.createCsrfToken
-import info.mechyrdia.auth.retrieveCsrfToken
-import io.ktor.server.application.ApplicationCall
-import io.ktor.server.request.uri
+import info.mechyrdia.auth.*
+import io.ktor.server.application.*
+import io.ktor.server.request.*
import kotlinx.html.*
-import java.time.Instant
-import kotlin.collections.set
+import java.time.*
data class CsrfFailedException(override val message: String, val payload: CsrfProtectedResourcePayload?) : RuntimeException(message)
package info.mechyrdia.route
-import io.ktor.http.URLBuilder
-import io.ktor.http.formUrlEncode
-import io.ktor.http.fullPath
-import io.ktor.http.parseUrlEncodedParameters
-import io.ktor.resources.serialization.ResourcesFormat
-import io.ktor.server.application.Application
-import io.ktor.server.application.ApplicationCall
-import io.ktor.server.application.ApplicationCallPipeline
-import io.ktor.server.application.application
+import io.ktor.http.*
+import io.ktor.resources.serialization.*
+import io.ktor.server.application.*
import io.ktor.server.application.call
-import io.ktor.server.application.createRouteScopedPlugin
-import io.ktor.server.application.hooks.CallSetup
-import io.ktor.server.application.plugin
-import io.ktor.server.plugins.BadRequestException
-import io.ktor.server.request.receiveMultipart
-import io.ktor.server.request.uri
-import io.ktor.server.resources.Resources
-import io.ktor.server.resources.get
-import io.ktor.server.resources.href
+import io.ktor.server.application.hooks.*
+import io.ktor.server.plugins.*
+import io.ktor.server.request.*
+import io.ktor.server.resources.*
import io.ktor.server.resources.post
-import io.ktor.server.resources.resource
import io.ktor.server.routing.Route
import io.ktor.server.routing.RoutingContext
-import io.ktor.server.routing.application
-import io.ktor.server.routing.intercept
-import io.ktor.server.websocket.DefaultWebSocketServerSession
-import io.ktor.server.websocket.WebSocketServerSession
-import io.ktor.server.websocket.application
-import io.ktor.server.websocket.webSocket
-import io.ktor.util.AttributeKey
-import io.ktor.util.pipeline.PipelineContext
-import kotlinx.serialization.DeserializationStrategy
-import kotlinx.serialization.KSerializer
-import kotlinx.serialization.SerializationStrategy
-import kotlinx.serialization.StringFormat
-import kotlinx.serialization.builtins.nullable
-import kotlinx.serialization.builtins.serializer
-import kotlinx.serialization.descriptors.PrimitiveKind
-import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
-import kotlinx.serialization.descriptors.SerialDescriptor
-import kotlinx.serialization.encoding.Decoder
+import io.ktor.server.websocket.*
+import io.ktor.util.*
+import kotlinx.serialization.*
+import kotlinx.serialization.builtins.*
+import kotlinx.serialization.descriptors.*
+import kotlinx.serialization.encoding.*
import kotlinx.serialization.encoding.Encoder
-import kotlinx.serialization.modules.SerializersModule
-import kotlinx.serialization.serializer
-import kotlin.enums.EnumEntries
+import kotlinx.serialization.modules.*
+import kotlin.enums.*
interface ResourceHandler {
suspend fun RoutingContext.handleCall()
package info.mechyrdia.route
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.DelicateCoroutinesApi
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.GlobalScope
-import kotlinx.coroutines.channels.Channel
-import kotlinx.coroutines.channels.produce
-import kotlinx.coroutines.currentCoroutineContext
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.isActive
-import kotlin.time.Duration
+import kotlinx.coroutines.*
+import kotlinx.coroutines.channels.*
+import kotlin.time.*
import kotlin.time.Duration.Companion.milliseconds
class TickingLimiter @OptIn(DelicateCoroutinesApi::class) constructor(interval: Duration, scope: CoroutineScope = GlobalScope) {
package info.mechyrdia.route
-import io.ktor.http.ContentDisposition
-import io.ktor.http.ContentType
-import io.ktor.http.Headers
-import io.ktor.http.HttpHeaders
-import io.ktor.http.content.MultiPartData
-import io.ktor.http.content.PartData
-import io.ktor.http.content.forEachPart
-import io.ktor.utils.io.toByteArray
-import kotlin.reflect.full.companionObjectInstance
+import io.ktor.http.*
+import io.ktor.http.content.*
+import io.ktor.utils.io.*
+import kotlin.reflect.full.*
interface MultiPartPayload : AutoCloseable {
val payload: List<MultiPartPayloadPart>
package info.mechyrdia.route
-import info.mechyrdia.auth.adminDeleteWebDavToken
-import info.mechyrdia.auth.adminObtainWebDavToken
-import info.mechyrdia.auth.adminRequestWebDavToken
-import info.mechyrdia.auth.loginPage
-import info.mechyrdia.auth.loginRoute
-import info.mechyrdia.auth.logoutRoute
-import info.mechyrdia.concat
-import info.mechyrdia.data.Comment
-import info.mechyrdia.data.Id
-import info.mechyrdia.data.NationUrlSlug
-import info.mechyrdia.data.StoragePath
-import info.mechyrdia.data.adminBanUserRoute
-import info.mechyrdia.data.adminConfirmDeleteFile
-import info.mechyrdia.data.adminConfirmRemoveDirectory
-import info.mechyrdia.data.adminDeleteFile
-import info.mechyrdia.data.adminDoCopyFile
-import info.mechyrdia.data.adminMakeDirectory
-import info.mechyrdia.data.adminNationOnly
-import info.mechyrdia.data.adminOverwriteFile
-import info.mechyrdia.data.adminPreviewFile
-import info.mechyrdia.data.adminRemoveDirectory
-import info.mechyrdia.data.adminShowCopyFile
-import info.mechyrdia.data.adminUnbanUserRoute
-import info.mechyrdia.data.adminUploadFile
-import info.mechyrdia.data.adminViewVfs
-import info.mechyrdia.data.commentHelpPage
-import info.mechyrdia.data.currentUserPage
-import info.mechyrdia.data.deleteCommentPage
-import info.mechyrdia.data.deleteCommentRoute
-import info.mechyrdia.data.editCommentRoute
-import info.mechyrdia.data.newCommentRoute
-import info.mechyrdia.data.recentCommentsPage
-import info.mechyrdia.data.respondStoredFile
-import info.mechyrdia.data.respondXml
-import info.mechyrdia.data.userPage
-import info.mechyrdia.data.viewCommentRoute
-import info.mechyrdia.lore.LoreArticleFormat
-import info.mechyrdia.lore.MechyrdiaSansFont
-import info.mechyrdia.lore.ParserTree
-import info.mechyrdia.lore.PokhwalishAlphabetFont
-import info.mechyrdia.lore.QuoteFormat
-import info.mechyrdia.lore.TylanAlphabetFont
-import info.mechyrdia.lore.buildSitemap
-import info.mechyrdia.lore.clientSettingsPage
-import info.mechyrdia.lore.galaxyMapPage
-import info.mechyrdia.lore.generateRecentPageEdits
-import info.mechyrdia.lore.loadFontsJson
-import info.mechyrdia.lore.loreArticlePage
-import info.mechyrdia.lore.loreIntroPage
-import info.mechyrdia.lore.meshView
-import info.mechyrdia.lore.parseAs
-import info.mechyrdia.lore.randomQuote
-import info.mechyrdia.lore.recentCommentsRssFeedGenerator
-import info.mechyrdia.lore.redirectHref
-import info.mechyrdia.lore.respondAsset
-import info.mechyrdia.lore.respondQuote
-import info.mechyrdia.lore.respondRss
-import info.mechyrdia.lore.sitemap
-import info.mechyrdia.lore.toCommentHtml
-import info.mechyrdia.lore.toFragmentString
-import info.mechyrdia.robot.RobotService
-import info.mechyrdia.robot.robotConversation
-import info.mechyrdia.robot.robotManagementPage
-import info.mechyrdia.robot.robotPage
-import io.ktor.http.ContentType
-import io.ktor.http.HttpHeaders
-import io.ktor.http.HttpStatusCode
-import io.ktor.resources.Resource
-import io.ktor.server.application.ApplicationCall
-import io.ktor.server.html.respondHtml
-import io.ktor.server.plugins.MissingRequestParameterException
-import io.ktor.server.response.header
-import io.ktor.server.response.respondBytes
-import io.ktor.server.response.respondText
-import io.ktor.server.response.respondTextWriter
-import io.ktor.server.routing.RoutingContext
-import io.ktor.server.websocket.DefaultWebSocketServerSession
-import io.ktor.util.AttributeKey
+import info.mechyrdia.*
+import info.mechyrdia.auth.*
+import info.mechyrdia.data.*
+import info.mechyrdia.lore.*
+import info.mechyrdia.robot.*
+import io.ktor.http.*
+import io.ktor.resources.*
+import io.ktor.server.application.*
+import io.ktor.server.html.*
+import io.ktor.server.plugins.*
+import io.ktor.server.response.*
+import io.ktor.server.routing.*
+import io.ktor.server.websocket.*
+import io.ktor.util.*
const val ErrorMessageCookieName = "ERROR_MSG"
package info.mechyrdia.route
-import info.mechyrdia.Utf8
-import info.mechyrdia.auth.Argon2Hasher
-import info.mechyrdia.auth.WebDavToken
-import info.mechyrdia.concat
-import info.mechyrdia.data.FileStorage
-import info.mechyrdia.data.Id
-import info.mechyrdia.data.StoragePath
-import info.mechyrdia.data.StoredFileType
-import info.mechyrdia.data.XmlInsertable
-import info.mechyrdia.data.XmlTag
-import info.mechyrdia.data.XmlTagConsumer
-import info.mechyrdia.data.contentType
-import info.mechyrdia.data.declaration
-import info.mechyrdia.data.respondXml
-import info.mechyrdia.data.root
-import info.mechyrdia.data.sortedAsFiles
-import info.mechyrdia.lore.mapSuspend
-import io.ktor.http.ContentType
-import io.ktor.http.HttpHeaders
-import io.ktor.http.HttpMethod
-import io.ktor.http.HttpStatusCode
-import io.ktor.server.application.ApplicationCall
-import io.ktor.server.html.respondHtml
-import io.ktor.server.request.ApplicationRequest
-import io.ktor.server.request.authorization
-import io.ktor.server.request.header
-import io.ktor.server.request.receive
-import io.ktor.server.request.receiveText
-import io.ktor.server.response.header
-import io.ktor.server.response.respond
-import io.ktor.server.response.respondBytes
-import io.ktor.server.routing.Route
-import io.ktor.server.routing.method
-import io.ktor.server.routing.route
-import io.ktor.util.AttributeKey
+import info.mechyrdia.*
+import info.mechyrdia.auth.*
+import info.mechyrdia.data.*
+import info.mechyrdia.lore.*
+import io.ktor.http.*
+import io.ktor.server.application.*
+import io.ktor.server.html.*
+import io.ktor.server.request.*
+import io.ktor.server.response.*
+import io.ktor.server.routing.*
+import io.ktor.util.*
import kotlinx.html.*
-import java.net.URI
-import java.time.Instant
-import java.time.ZoneOffset
-import java.time.ZonedDateTime
-import java.time.format.DateTimeFormatter
-import java.util.Base64
+import java.net.*
+import java.time.*
+import java.time.format.*
+import java.util.*
const val WebDavDomainName = "https://dav.mechyrdia.info"