### Run the application Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/tutorial-server-get-started-maven/README.md Command to run the application after building. ```Bash java -jar target/tutorial-server-get-started-maven-0.0.1-jar-with-dependencies.jar ``` -------------------------------- ### Build the application Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/tutorial-server-get-started-maven/README.md Command to build an assembly for the application. ```bash mvn package ``` -------------------------------- ### Install session authentication Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/server-session-auth.md Example of installing the `session` authentication provider within the `install` block. ```kotlin import io.ktor.server.application.* import io.ktor.server.auth.* import io.ktor.server.sessions.* //... install(Authentication) { session { // Configure session authentication } } ``` -------------------------------- ### Run Sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/tutorial-client-get-started/README.md Command to run the Ktor client sample project from the repository's root directory. ```bash ./gradlew :tutorial-client-get-started:run ``` -------------------------------- ### Install DefaultRequest with configuration Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/client-default-request.md Example showing how to install DefaultRequest and provide a configuration block. ```kotlin import io.ktor.client.* import io.ktor.client.engine.cio.* import io.ktor.client.plugins.* //... val client = HttpClient(CIO) { defaultRequest { // this: DefaultRequestBuilder } } ``` -------------------------------- ### Choose an authentication provider Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/server-auth.md Example of installing the basic authentication provider within the `install` block. ```kotlin import io.ktor.server.application.* import io.ktor.server.auth.* // ... install(Authentication) { basic { // [[[Configure basic authentication|server-basic-auth.md]]] } } ``` -------------------------------- ### Install DefaultRequest Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/client-default-request.md Example showing how to install the DefaultRequest plugin in a client configuration block. ```kotlin import io.ktor.client.* import io.ktor.client.engine.cio.* import io.ktor.client.plugins.* //... val client = HttpClient(CIO) { install(DefaultRequest) } ``` -------------------------------- ### Install Auth plugin Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/client-auth.md Example of installing the Auth plugin in a Ktor client configuration block. ```kotlin import io.ktor.client.* import io.ktor.client.engine.cio.* import io.ktor.client.plugins.auth.* //... val client = HttpClient(CIO) { install(Auth) { // Configure authentication } } ``` -------------------------------- ### Start the SSL server Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/client-ssl-config/README.md Command to run the ssl-engine-main example server, which is a prerequisite for this client sample. ```bash ./gradlew :ssl-engine-main:run ``` -------------------------------- ### Install or replace client plugin configuration Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/whats-new-340.md Example demonstrating how to use `installOrReplace()` to install or update a client plugin's configuration. ```kotlin val client = HttpClient { installOrReplace(ContentNegotiation) { json() } } ``` -------------------------------- ### Install HttpTimeout Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/client-timeout.md Example of installing the HttpTimeout plugin in a Ktor client configuration block. ```kotlin import io.ktor.client.* import io.ktor.client.engine.cio.* import io.ktor.client.plugins.* //... val client = HttpClient(CIO) { install(HttpTimeout) } ``` -------------------------------- ### Running the sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/static-zip/README.md Command to execute the sample Ktor project. ```bash ./gradlew :static-zip:run ``` -------------------------------- ### Multiple CachingHeaders installations on the same route Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/server-plugins.md Example demonstrating how multiple installations of the CachingHeaders plugin on the same route are merged, with the last installation winning. ```kotlin routing { route("index") { install(CachingHeaders) { /* First configuration */ } get("a") { // ... } } route("index") { install(CachingHeaders) { /* Second configuration */ } get("b") { // ... } } } ``` -------------------------------- ### Running the sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/client-download-file/README.md Command to execute the sample project. ```bash ./gradlew :client-download-file:run ``` -------------------------------- ### Install HttpRequestRetry with HttpTimeout Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/client-request-retry.md Example demonstrating the correct installation order when HttpRequestRetry is used with HttpTimeout, where HttpRequestRetry should be installed first. ```kotlin val client = HttpClient(CIO) { install(HttpRequestRetry) // Should be installed before HttpTimeout install(HttpTimeout) { // ... } } ``` -------------------------------- ### Running the sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/client-custom-plugin-auth/README.md Command to execute the sample Ktor project. ```bash ./gradlew :client-custom-plugin-auth:run ``` -------------------------------- ### Install HttpCallValidator Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/client-response-validation.md Example of installing the HttpCallValidator plugin in a Ktor HTTP client configuration. ```kotlin val client = HttpClient(CIO) { HttpResponseValidator { // ... } } ``` -------------------------------- ### Running the sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/client-default-request/README.md Command to execute the sample project. ```bash ./gradlew :client-default-request:run ``` -------------------------------- ### Install Resources plugin Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/client-resources.md Example of installing the Resources plugin in a Ktor client configuration. ```kotlin import io.ktor.client.* import io.ktor.client.engine.cio.* import io.ktor.client.plugins.resources.* //... val client = HttpClient(CIO) { install(Resources) } ``` -------------------------------- ### Run the sample project Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/client-custom-plugin/README.md Command to execute the sample Ktor project. ```bash ./gradlew :client-custom-plugin:run ``` -------------------------------- ### Install BOMRemover Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/client-bom-remover.md Example of installing the BOMRemover plugin in a Ktor HTTP client configuration. ```kotlin import io.ktor.client.* import io.ktor.client.engine.cio.* import io.ktor.client.plugins.bomremover.* //... val client = HttpClient(CIO) { install(BOMRemover) } ``` -------------------------------- ### Run the sample project Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/session-cookie-server/README.md Command to execute the sample project from the repository's root directory. ```bash ./gradlew :session-cookie-server:run ``` -------------------------------- ### Run the sample project Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/session-header-server/README.md Command to execute the sample project using Gradle. ```bash ./gradlew :session-header-server:run ``` -------------------------------- ### Install Plugins in a module Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/server-plugins.md Example of installing CORS and Compression plugins within an application module. ```kotlin import io.ktor.server.application.* import io.ktor.server.plugins.cors.* import io.ktor.server.plugins.compression.* // ... fun Application.module() { install(CORS) install(Compression) // ... } ``` -------------------------------- ### Install Plugins in embeddedServer Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/server-plugins.md Example of installing CORS and Compression plugins within the embeddedServer call. ```kotlin import io.ktor.server.application.* import io.ktor.server.plugins.cors.* import io.ktor.server.plugins.compression.* // ... fun main() { embeddedServer(Netty, port = 8080) { install(CORS) install(Compression) // ... }.start(wait = true) } ``` -------------------------------- ### Running the sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/static-resources/README.md Command to execute the static-resources sample project. ```bash ./gradlew :static-resources:run ``` -------------------------------- ### Install JWT authentication Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/server-jwt.md Example of installing the JWT authentication provider in a Ktor application. ```kotlin import io.ktor.server.application.* import io.ktor.server.auth.* import io.ktor.server.auth.jwt.* //... install(Authentication) { jwt { // Configure jwt authentication } } ``` -------------------------------- ### Running the sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/client-custom-plugin-data-transformation/README.md Command to execute the sample project. ```bash ./gradlew :client-custom-plugin-data-transformation:run ``` -------------------------------- ### Running the sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/client-configure-request/README.md Command to execute the sample project from the repository's root directory. ```bash ./gradlew :client-configure-request:run ``` -------------------------------- ### Nested Routes Example Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/server-routing.md This example demonstrates how to define nested routes to respond to GET and POST requests for '/order/shipment'. ```kotlin routing { route("/order") { route("/shipment") { get { } post { } } } } ``` -------------------------------- ### Run the sample project Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/post-form-parameters/README.md Command to run the Ktor sample project using Gradle. ```bash ./gradlew :post-form-parameters:run ``` -------------------------------- ### Install HttpRequestRetry Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/client-request-retry.md Example showing how to install the HttpRequestRetry plugin in a Ktor client configuration block. ```kotlin import io.ktor.client.* import io.ktor.client.engine.cio.* import io.ktor.client.plugins.* //... val client = HttpClient(CIO) { install(HttpRequestRetry) } ``` -------------------------------- ### Running the sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/client-http-send/README.md Command to execute the sample project from the repository's root directory. ```bash ./gradlew :client-http-send:run ``` -------------------------------- ### Running the Client I/O Interop Sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/client-io-interop/README.md Execute this Gradle command to run the sample project. The client downloads random bytes, wraps the response channel as a kotlinx-io RawSource, and prints the first byte read. ```bash ./gradlew :client-io-interop:run ``` -------------------------------- ### Running download-file server sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/client-download-file-range/README.md Command to start the download-file server sample. ```bash ./gradlew :download-file:run ``` -------------------------------- ### Retrieving all installed authentication providers Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/client-auth.md Example of retrieving all installed authentication providers using the `authProviders` property. ```kotlin val providers = client.authProviders ``` -------------------------------- ### Run server sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/client-upload-binary-data/README.md Command to run the server sample from the repository's root folder. ```bash ./gradlew :post-raw-data:run ``` -------------------------------- ### Run the sample project Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/css-dsl/README.md Command to execute the sample project from the repository's root directory. ```bash ./gradlew :css-dsl:run ``` -------------------------------- ### Installation Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/server-websocket-deflate.md Example showing how to install the WebSocket Deflate extension for both client and server, including basic configuration for compression level and minimum frame size. ```kotlin // For client and server install(WebSockets) { extensions { install(WebSocketDeflateExtension) { /** * Compression level to use for [java.util.zip.Deflater]. */ compressionLevel = Deflater.DEFAULT_COMPRESSION /** * Prevent compressing small outgoing frames. */ compressIfBiggerThan(bytes = 4 * 1024) } } } ``` -------------------------------- ### Install KtorClientTelemetry Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/client-opentelemetry.md Example showing how to install the KtorClientTelemetry plugin and set the OpenTelemetry instance within a Ktor client configuration block. ```kotlin import io.ktor.client.* import io.ktor.client.engine.cio.* import io.ktor.client.plugins.auth.* //... val client = HttpClient(CIO) { val openTelemetry = getOpenTelemetry(serviceName = "opentelemetry-ktor-client") install(KtorClientTelemetry) { setOpenTelemetry(openTelemetry) } } ``` -------------------------------- ### Running Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/json-kotlinx-openapi/README.md Command to run the sample project. ```bash ./gradlew :json-kotlinx-openapi:run ``` -------------------------------- ### Run the sample project Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/auth-basic/README.md Command to execute the Ktor basic authentication sample project using Gradle. ```bash ./gradlew :auth-basic:run ``` -------------------------------- ### Dokku deployment output Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/dokku.md Example output shown while Dokku builds and starts the application. ```text ... =====> Application deployed: http://. ``` -------------------------------- ### Running the sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/custom-plugin-authorization/README.md Command to run the Ktor sample project. ```bash ./gradlew :custom-plugin-authorization:run ``` -------------------------------- ### Run server sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/client-upload/README.md Command to run the server sample project. ```bash ./gradlew :upload-file:run ``` -------------------------------- ### Creating a Netty server instance without starting it Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/server-engines.md This example demonstrates how to create an EmbeddedServer instance using EngineMain.createServer() for Netty, allowing for additional initialization before starting the server manually. ```Kotlin // Example using Netty val server = io.ktor.server.netty.EngineMain.createServer(args) // perform additional initialization, logging, instrumentation, etc. server.start(wait = true) ``` -------------------------------- ### Running the sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/custom-plugin-base-api/README.md Command to execute the sample Ktor project. ```bash ./gradlew :custom-plugin-base-api:run ``` -------------------------------- ### Run the static website sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/tutorial-website-static/README.md Command to execute the sample Ktor project from the repository's root directory. ```bash ./gradlew :tutorial-website-static:run ``` -------------------------------- ### Install and Use DoubleReceive Plugin Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/server-double-receive.md Install the DoubleReceive plugin and then receive a request body multiple times within your application. This example shows how to enable logging of the request body and then access it again in a route handler. ```kotlin install(DoubleReceive) install(CallLogging) { level = Level.INFO filter { call -> call.request.path.startsWith("/") } } ``` ```kotlin post("/login") { val requestBody = call.receiveText() println("Received request body: $requestBody") call.respondText("Login successful") } ``` -------------------------------- ### Running the sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/events/README.md Command to execute the sample Ktor project. ```bash ./gradlew :events:run ``` -------------------------------- ### Add Velocity tools Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/server-velocity.md Example of installing `VelocityTools` and configuring it to add standard and custom Velocity tools. ```kotlin install(VelocityTools) { engine { // Engine configuration setProperty("resource.loader", "string") addProperty("resource.loader.string.name", "myRepo") addProperty("resource.loader.string.class", StringResourceLoader::class.java.name) addProperty("resource.loader.string.repository.name", "myRepo") } addDefaultTools() // Add a default tool tool("foo", MyCustomTool::class.java) // Add a custom tool } ``` -------------------------------- ### Configure Sessions Plugin with a cookie Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/server-plugins.md Example of installing and configuring the Sessions plugin to use a named cookie. ```kotlin install(Sessions) { cookie("MY_COOKIE") } ``` -------------------------------- ### Running the sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/json-kotlinx/README.md Command to run the sample project using Gradle. ```bash ./gradlew :json-kotlinx:run ``` -------------------------------- ### Running the sample project Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/auth-form-session/README.md Command to execute the sample project from the repository's root directory. ```bash ./gradlew :auth-form-session:run ``` -------------------------------- ### Enable HttpRequestLifecycle plugin Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/whats-new-340.md Example of installing the HttpRequestLifecycle plugin and handling a long-running request that can be cancelled. ```kotlin install(HttpRequestLifecycle) { cancelCallOnClose = true } routing { get("/long-process") { try { while (isActive) { delay(10_000) logger.info("Very important work.") } call.respond("Completed") } catch (e: CancellationException) { logger.info("Cleaning up resources.") } } } ``` -------------------------------- ### Running the sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/auth-form-html-dsl/README.md Command to execute the sample project using Gradle. ```bash ./gradlew :auth-form-html-dsl:run ``` -------------------------------- ### Specify a provider name Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/server-auth.md Example of installing basic and form authentication providers with specific names. ```kotlin install(Authentication) { basic("auth-basic") { // [[[Configure basic authentication|server-basic-auth.md]]] } form("auth-form") { // [[[Configure form authentication|server-form-based-auth.md]]] } // ... } ``` -------------------------------- ### Configure API Key authentication Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/whats-new-340.md Example of installing the Authentication plugin with an apiKey provider and protecting a route. ```kotlin install(Authentication) { apiKey("my-api-key") { validate { apiKey -> if (apiKey == "secret-key") { UserIdPrincipal(apiKey) } else { null } } } } routing { authenticate { get("/") { val principal = call.principal()!! call.respondText("Key: ${principal.key}") } } } ``` -------------------------------- ### Running the sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/json-kotlinx-method-override/README.md Command to run the sample project using Gradle. ```bash ./gradlew :json-kotlinx-method-override:run ``` -------------------------------- ### Running the sample project Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/auth-basic-hash-table/README.md Command to execute the sample project from the repository's root directory. ```bash ./gradlew :auth-basic-hash-table:run ``` -------------------------------- ### Determine uploaded file size Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/server-requests.md Example of how to get the Content-Length header value inside the post handler to determine the uploaded file size. ```kotlin post("/upload") { val contentLength = call.request.header(HttpHeaders.ContentLength) // ... } ``` -------------------------------- ### Running the Project Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/server-di/README.md Command to run the Ktor server-di project using Gradle. ```bash ./gradlew :server-di:run ``` -------------------------------- ### Customize Base Name for Metrics Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/server-metrics-dropwizard.md Example of customizing the base name for Ktor metrics using the `baseName` property when installing the DropwizardMetrics feature. ```kotlin install(DropwizardMetrics) { baseName = "my.prefix" } ``` -------------------------------- ### Replace existing DefaultRequest configuration using `replace` Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/client-default-request.md Example demonstrating how to replace an already installed DefaultRequest configuration using the `replace` parameter. ```kotlin val client = HttpClient(CIO) { defaultRequest(replace = true) { // this: DefaultRequestBuilder } } ``` -------------------------------- ### Running the sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/client-validate-non-2xx-response/README.md Command to execute the sample Ktor project. ```bash ./gradlew :client-validate-non-2xx-response:run ``` -------------------------------- ### Running the sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/client-download-streaming/README.md Command to execute the client-download-streaming sample. ```bash ./gradlew :client-download-streaming:run ``` -------------------------------- ### Configure Basic authentication provider Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/client-auth.md Example of configuring the basic authentication provider inside the Auth plugin installation block. ```kotlin install(Auth) { basic { // Configure basic authentication } } ``` -------------------------------- ### Configure Basic Authentication Provider Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/server-ldap.md Initial setup of the basic authentication provider within the Ktor `install` block, preparing for LDAP user validation. ```kotlin import io.ktor.server.application.* import io.ktor.server.auth.* import io.ktor.server.auth.ldap.* //... install(Authentication) { basic { validate { credentials -> // Authenticate an LDAP user } } } ``` -------------------------------- ### Running the sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/conditional-headers/README.md Command to execute the sample project. ```bash ./gradlew :conditional-headers:run ``` -------------------------------- ### Attach OpenAPI metadata to a route Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/whats-new-340.md Example of using the .describe {} extension function to add OpenAPI metadata to a GET route at runtime. ```kotlin @OptIn(ExperimentalKtorApi::class) get("/messages") { val query = call.parameters["q"]?.let(::parseQuery) call.respond(messageRepository.getMessages(query)) }.describe { parameters { query("q") { description = "An encoded query" required = false } } responses { HttpStatusCode.OK { description = "A list of messages" schema = jsonSchema>() extension("x-sample-message", testMessage) } HttpStatusCode.BadRequest { description = "Invalid query" ContentType.Text.Plain() } } summary = "get messages" description = "Retrieves a list of messages." } ``` -------------------------------- ### Running the sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/autohead/README.md Command to execute the sample project. ```bash ./gradlew :autohead:run ``` -------------------------------- ### Configure SSE response body buffer globally Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/whats-new-330.md Example of configuring the SSE diagnostic buffer globally when installing the SSE plugin. ```kotlin install(SSE) { bufferPolicy = SSEBufferPolicy.LastEvents(10) } ``` -------------------------------- ### Run the sample Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/server-http-request-lifecycle/README.md Command to run the sample Ktor project. ```bash ./gradlew :server-http-request-lifecycle:run ``` -------------------------------- ### Replace existing DefaultRequest configuration using `installOrReplace` Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/client-default-request.md Example demonstrating how to replace an already installed DefaultRequest configuration using the generic `installOrReplace()` function. ```kotlin val client = HttpClient(CIO) { installOrReplace(DefaultRequest) { // this: DefaultRequestBuilder } } ``` -------------------------------- ### Run the sample application Source: https://github.com/ktorio/ktor-documentation/blob/main/codeSnippets/snippets/auth-form-session-nested/README.md Command to execute the sample application from the repository's root directory. ```bash ./gradlew :auth-form-session-nested:run ``` -------------------------------- ### Serve static OpenAPI file Source: https://github.com/ktorio/ktor-documentation/blob/main/topics/server-swagger-ui.md The following example creates a GET endpoint at the swagger path and renders the Swagger UI from the provided OpenAPI specification file: ```kotlin import io.ktor.server.plugins.swagger.* // ... routing { swaggerUI(path = "swagger", swaggerFile = "openapi/documentation.yaml") } ```