Start Practicing

Kotlin Developer Interview Questions & Answers (2026 Guide)

Kotlin interviews in 2026 test two things: whether you understand coroutines well enough to write correct concurrent code, and whether you use Kotlin's type system — null safety, sealed classes, data classes — to prevent bugs at compile time. This guide covers both Android and backend Kotlin tracks.

Start Free Practice Interview →
Coroutines, structured concurrency & Flow with code examples
Null safety, sealed classes & type system patterns
Android-specific & backend-specific Kotlin questions
Functional programming: lambdas, higher-order functions, sequences

AI-powered mock interviews tailored to Kotlin developer roles

Last updated: February 2026

Kotlin has become the default language for Android development and is gaining serious traction on the server side with Ktor and Spring Boot. Kotlin interviews have matured beyond syntax knowledge into deep questions about coroutines, type system design, and platform-specific patterns.

Coroutines are the centerpiece of most Kotlin interviews. Beyond coroutines, expect questions on null safety, sealed classes and algebraic data types, extension functions, scope functions, and functional programming patterns. Kotlin interviews split into two tracks: Android Kotlin (Jetpack Compose, ViewModel, StateFlow) and Backend Kotlin (Ktor, Spring Boot, kotlinx.serialization). This guide covers both — identify your track and focus accordingly.

What Kotlin Developer Interviews Cover in 2026

Coroutines and structured concurrency — the dominant topic. suspend functions, CoroutineScope, dispatchers, launch vs async, Flow, exception handling with SupervisorJob, and real-world patterns like debouncing and retry logic.

Null safety and the type system — nullable types (String?), safe call (?.), Elvis (?:), not-null assertion (!!), smart casts, data classes, sealed classes, object declarations, and platform types from Java interop.

Extension functions and scope functions — adding methods to existing classes, choosing between let, apply, run, also, and with.

Functional programming — lambdas, higher-order functions, collection operators (map/filter/fold/flatMap), sequences for lazy evaluation, and inline functions for zero-overhead lambdas.

Kotlin-Java interop — @JvmStatic, @JvmOverloads, @JvmField, SAM conversions, nullability annotations, and designing Kotlin APIs callable from Java.

Platform-specific knowledge — Android: Jetpack Compose, ViewModel, StateFlow/SharedFlow, Room, Hilt/Koin, Gradle Kotlin DSL. Backend: Ktor routing and plugins, Spring Boot with Kotlin, kotlinx.serialization, database access patterns.

Kotlin vs Java vs Dart vs Swift: What Changes in Interviews

If you're coming from another language — especially Java — understanding what Kotlin interviews emphasize differently helps focus preparation.

DimensionKotlin InterviewJava InterviewDart/Flutter InterviewSwift/iOS Interview
Null handlingNullable types (?), safe calls (?.), Elvis (?:), smart casts. Built into type system, always askedOptional<T>, null checks, annotations. Library concern, not language guaranteeSound null safety (Dart 2.12+). late keyword, required keywordOptionals (?), optional chaining, nil-coalescing (??), guard let
ConcurrencyCoroutines with structured concurrency. suspend, Flow, Dispatchers. Largest interview topicThreads, ExecutorService, CompletableFuture, virtual threads (Loom). More verboseasync/await with Futures, Isolates, Streams. Single-threaded event loopasync/await with Swift Concurrency, actors. Similar philosophy to Kotlin
Type systemData classes, sealed classes, extension functions, smart casts, delegation. Expressiveness + safetyClasses, interfaces, generics, records (16+), sealed classes (17+). More verboseClasses, mixins, extension methods, sealed classesStructs vs classes, protocols, enums with associated values, property wrappers
Functional featuresFirst-class lambdas, higher-order functions, collection operators, sequences, inline. Heavily testedStreams API, lambdas (Java 8+), method references. Bolted on, not built inFirst-class functions, collection operators, cascade notationClosures, map/filter/reduce, protocol-oriented programming
Platform focusAndroid (Compose, ViewModel, Room) or Backend (Ktor, Spring Boot). Varies by trackEnterprise (Spring, microservices, JVM tuning). Android increasingly prefers KotlinFlutter (widgets, state management, platform channels). Almost always FlutteriOS/macOS (SwiftUI/UIKit, Combine, Core Data). Always Apple-focused
InteropKotlin-Java interop (@JvmStatic, platform types, SAM). Always asked — codebases mix bothRarely asked — Java is the base languagePlatform channels, FFI for native featuresSwift-ObjC bridging headers. Less common as pure Swift grows

Kotlin Language Fundamentals Questions

These questions test whether you've internalized Kotlin's idioms or are still writing Java with Kotlin syntax. The difference is immediately obvious to interviewers.

Explain Kotlin's null safety system. How do nullable types, safe calls, and the Elvis operator work together?
Why They Ask It

Null safety is Kotlin's most visible feature and the most common interview opener. It immediately shows whether you think in Kotlin or still think in Java.

What They Evaluate
  • Understanding of nullable vs non-nullable types
  • Safe call chains, Elvis operator, smart casts
  • When !! is appropriate and platform types from Java interop
Answer Framework

Types are non-nullable by default. String can never be null; String? can. The compiler enforces this at compile time. Tools: ?. (safe call — returns null if receiver is null), ?: (Elvis — default when left side is null), !! (not-null assertion — use sparingly), let for scoped null checks, and smart casts (after null check, compiler narrows type automatically). Platform types: Java code returns String! — Kotlin doesn't know nullability. This is where NPEs sneak back in.

Sample Answer

Kotlin's null safety is built into the type system, not bolted on like Java's Optional. Every type is non-nullable by default — String means this value can never be null. If it might be null, you declare String?. The compiler enforces this statically, so NullPointerExceptions are essentially eliminated for pure Kotlin code. The three main tools are safe call ?. for chaining on nullable values, Elvis ?: for providing fallbacks, and smart casts that narrow the type after a null check. The let scope function is useful for performing actions only when non-null. The !! operator exists for cases where you know a value is non-null but the compiler can't prove it — but overusing it defeats the purpose of null safety. The one gap is Java interop: Java methods return platform types like String!, meaning Kotlin doesn't know nullability. This is where NPEs can still occur — adding @Nullable and @NonNull annotations to Java code matters.

What are sealed classes and sealed interfaces? How do they differ from enums?
Why They Ask It

Sealed classes are one of Kotlin's most powerful features for state modeling. Tests whether you use them effectively.

What They Evaluate
  • Understanding of sealed hierarchies as algebraic data types
  • Exhaustive when expressions
  • Comparison with enums and practical use cases
Answer Framework

Sealed classes restrict which classes can inherit — direct subclasses must be in the same package/module. The compiler knows all cases, enabling exhaustive when expressions. Unlike enums, each subclass can have its own properties and state. Use enums for simple fixed value sets; sealed classes when each variant carries different data. Sealed interfaces (Kotlin 1.5+) allow multiple inheritance. Idiomatic for: UI state, network results, navigation events, domain modeling.

Explain the five scope functions: let, apply, run, also, and with.
Why They Ask It

Scope functions are used constantly in idiomatic Kotlin. Choosing the wrong one shows you don't think in Kotlin yet.

What They Evaluate
  • Context object reference (this vs it)
  • Return value (lambda result vs context object)
  • Practical judgment about readability
Answer Framework

Differ on two axes: context reference (this or it) and return value (lambda result or context object). letit, returns lambda result. Null checks, transformations. applythis, returns context object. Object configuration (builder-like). runthis, returns lambda result. Computing a result with an object. alsoit, returns context object. Side effects (logging, validation). withthis, returns lambda result. Multiple operations on same object.

What are data classes? What do they generate and what are their limitations?
Why They Ask It

Data classes are one of Kotlin's most-used features. Tests whether you understand what the compiler generates and the gotchas.

What They Evaluate
  • Understanding of generated methods
  • Limitations (primary constructor only, no inheritance)
  • Comparison with Java records
Answer Framework

Auto-generate equals(), hashCode(), toString(), copy(), and componentN() — all based on primary constructor properties ONLY. Properties in class body are NOT included in equality or toString. Limitations: can't be abstract, open, sealed, or inner. copy() is shallow. Destructuring via component1(), etc. Gotcha: a property declared in the class body doesn't participate in equality — a common source of bugs.

Explain extension functions. How do they work under the hood?
Why They Ask It

Extension functions are a core Kotlin idiom that doesn't exist in Java. Tests whether you understand both the power and constraints.

What They Evaluate
  • Static dispatch (compile-time type resolution)
  • No access to private members
  • Member function always wins over extension
Answer Framework

Add methods to existing classes without modifying them. Compiled to static methods — receiver passed as first argument. Implications: (1) resolved statically, not dynamically (compile-time type determines call), (2) can't access private/protected members, (3) member function with same signature always wins. Best practices: use for utility functions that logically belong to a type, not for everything.

What is the difference between val, var, and const val? What about lateinit?
Why They Ask It

Fundamentals question testing understanding of Kotlin's approach to immutability and initialization.

What They Evaluate
  • val (read-only) vs var (mutable)
  • const val (compile-time constant)
  • lateinit for deferred initialization
Answer Framework

val is read-only reference (object itself can still be mutable). var is fully mutable. const val is compile-time constant — must be primitive or String, top-level or in object/companion. lateinit for non-null var that can't be initialized in constructor (common in Android with DI). Check with ::property.isInitialized.

Coroutines & Concurrency Questions

Coroutines are the most important section for Kotlin interviews. Expect at least two or three coroutine questions, and in senior interviews, significantly more.

What are coroutines and how do they differ from threads? Explain structured concurrency.
Why They Ask It

The most common coroutines question. Tests whether you understand the model at a fundamental level, not just the API.

What They Evaluate
  • Coroutines as lightweight suspendable computations
  • Structured concurrency and scope-based lifecycle
  • Why structured concurrency prevents resource leaks
Answer Framework

Coroutines are lightweight, suspendable computations. Unlike threads, they don't map 1:1 to OS threads — thousands share a small pool. suspend functions pause without blocking the thread. Structured concurrency: every coroutine runs in a CoroutineScope. The scope doesn't complete until all children complete. If cancelled, all children cancel. Prevents fire-and-forget leaks. Key difference: creating a coroutine is free (object allocation), suspending doesn't block, cancellation propagates through scope hierarchy.

Sample Answer

Coroutines are lightweight, suspendable computations managed by the Kotlin runtime rather than the OS. You can launch hundreds of thousands because they don't each consume an OS thread. When a coroutine suspends — say, waiting for a network response — the thread goes back to the pool for other work. But the really important concept is structured concurrency. Every coroutine runs inside a CoroutineScope, creating a parent-child relationship. The parent doesn't complete until all children complete. If the parent is cancelled, all children cancel. This prevents resource leaks — in Android, coroutines in a ViewModel's scope auto-cancel when the ViewModel clears. No manual cleanup. GlobalScope.launch breaks this — it's unstructured and should be avoided in production.

Explain the difference between launch and async. When do you use each?
Why They Ask It

Direct practical question. Getting it wrong signals surface-level coroutine knowledge.

What They Evaluate
  • Job vs Deferred<T> return types
  • Fire-and-forget vs result-returning
  • Exception propagation differences
Answer Framework

launch returns a Job — fire-and-forget (no result). Use for: UI updates, DB writes, analytics. async returns Deferred<T> — a future with a value. Use for: parallel decomposition where you need results. Critical difference: launch propagates exceptions to parent immediately; async stores the exception and throws on await(). Anti-pattern: async { ... }.await() with immediate await gains no concurrency — same as calling directly.

What are Dispatchers and how do you choose the right one?
Why They Ask It

Dispatcher choice affects performance and correctness. Tests whether you know which work goes on which thread pool.

What They Evaluate
  • Dispatchers.Main, IO, Default, Unconfined
  • Practical thread pool selection
  • withContext for switching dispatchers
Answer Framework

Dispatchers.Main — UI thread (Android). Dispatchers.IO — blocking I/O (network, disk, DB), elastic thread pool. Dispatchers.Default — CPU-intensive (parsing, sorting), sized to CPU cores. Dispatchers.Unconfined — runs on caller's thread until first suspension, rarely used in production. Use withContext to switch dispatchers. Best practice: suspend functions should be main-safe — internally switch with withContext so callers don't need to know.

What is Flow and how does it compare to LiveData and RxJava?
Why They Ask It

Flow is Kotlin's reactive streams solution. Tests understanding of cold vs hot streams and modern data flow patterns.

What They Evaluate
  • Cold Flows vs hot StateFlow/SharedFlow
  • Comparison with LiveData and RxJava
  • Practical use in data pipelines
Answer Framework

Flow is a cold, asynchronous stream on coroutines. Cold: doesn't produce values until collected. StateFlow is hot with a current value (replaces LiveData). SharedFlow is hot, broadcasts to multiple collectors. Advantages over LiveData: operators (map, filter, debounce, combine), works on any dispatcher, usable in non-Android code. Advantages over RxJava: smaller API, no Disposable management, built on coroutines. Use stateIn() to convert cold Flow to StateFlow in ViewModels.

How does exception handling work in coroutines? Explain SupervisorJob.
Why They Ask It

Exception handling is the trickiest part of coroutines. Separates real coroutine experience from tutorial knowledge.

What They Evaluate
  • Exception propagation in structured concurrency
  • SupervisorJob behavior
  • CoroutineExceptionHandler and try/catch placement
Answer Framework

Default: child failure cancels parent, which cancels all siblings. SupervisorJob changes this — child failure doesn't cancel parent or siblings. Use supervisorScope when independent tasks shouldn't affect each other. CoroutineExceptionHandler is a last-resort handler. Important: try/catch around launch does NOT catch launched coroutine exceptions — they propagate through the Job hierarchy. For async, exception is stored and rethrown on await().

Write a suspend function that implements retry with exponential backoff.
Why They Ask It

Practical coroutine pattern combining suspend functions, delay, and exception handling.

What They Evaluate
  • Practical coroutine utility writing
  • Understanding of delay vs Thread.sleep
  • Clean generic API design
Answer Framework

Loop with delay() (non-blocking) and exponential calculation. Generic to work with any suspend function. Each retry doubles the delay, capped at a maximum. Last attempt lets exception propagate. Use coerceAtMost for delay cap.

Practice Coroutine & Language Questions with AI

Coroutine questions generate the deepest follow-ups in Kotlin interviews. Our AI simulator generates follow-up questions based on your answers and scores your technical depth, code correctness, and communication clarity.

Start Free Practice Interview →

Tailored to Kotlin developer roles. No credit card required.

Functional Programming & Collections Questions

Kotlin's functional features are used in virtually every codebase. Interviewers test whether you write idiomatic functional code and understand performance implications.

What is the difference between sequences and collections? When use each?
Why They Ask It

Tests understanding of lazy vs eager evaluation and performance optimization — a key practical skill.

What They Evaluate
  • Eager (collection) vs lazy (sequence) evaluation
  • Intermediate object creation awareness
  • When laziness helps performance
Answer Framework

Collection operations are eager — each step creates an intermediate list. Sequences are lazy — elements processed one at a time through the entire chain. Sequences for: large collections, long chains, short-circuiting with take/first. Collections for: small collections where sequence overhead isn't worth it, or when random access is needed. Key: sequences enable short-circuiting — .take(10) on a sequence stops after 10 matches, collections process everything.

Explain inline functions. Why do they matter for lambdas and performance?
Why They Ask It

Intermediate concept that directly affects performance. Tests understanding of compiler optimizations.

What They Evaluate
  • Lambda overhead and how inline eliminates it
  • Reified type parameters
  • noinline and crossinline
Answer Framework

Without inline, every lambda creates an object (and closure). inline inlines both function body AND lambda at call site — zero allocation. This is why let, apply, map, filter are all inline. Also enables reified type parameters — type available at runtime (normally erased by JVM). noinline prevents inlining a specific parameter (needed to store lambdas). crossinline prevents non-local returns.

Write a chain of collection operations to solve a data transformation problem.
Why They Ask It

Practical coding question testing fluency with Kotlin's collection API and functional thinking.

What They Evaluate
  • Composing collection operations
  • Readability of functional chains
  • Knowledge of less common operators (groupBy, associate, partition, fold)
Answer Framework

Demonstrate multi-step transformation using map, filter, groupBy, flatMap, associate, partition, fold. Show concise, readable chains. Key operators: groupBy for categorization, flatMap for flattening nested collections, associate for creating maps, partition for splitting by predicate, fold for accumulation.

Android & Backend Kotlin Questions

Kotlin interviews split into two tracks. Android roles focus on Jetpack, lifecycle, and UI patterns. Backend roles focus on Ktor/Spring, serialization, and server-side concurrency.

How do you manage UI state in a Jetpack Compose application?
Why They Ask It

State management is the core architectural question for Compose. Tests whether you understand the reactive model.

What They Evaluate
  • State hoisting and unidirectional data flow
  • ViewModel + StateFlow pattern
  • remember vs rememberSaveable, derivedStateOf
Answer Framework

Unidirectional data flow: ViewModel holds state as StateFlow, Compose observes with collectAsStateWithLifecycle(), user events flow up to ViewModel. State hoisting lifts state into ViewModel for testability. remember { mutableStateOf() } for ephemeral UI state (dropdown open, animation). rememberSaveable survives configuration changes. derivedStateOf for computed state. Key distinction: Compose state for ephemeral UI state, StateFlow in ViewModel for business data.

Explain Kotlin-Java interop. What are platform types and what annotations matter?
Why They Ask It

Almost every Kotlin codebase interacts with Java. Tests practical mixed-codebase experience.

What They Evaluate
  • Platform types (String!) understanding
  • Nullability annotations
  • @JvmStatic, @JvmOverloads, @JvmField, SAM conversions
Answer Framework

Java types appear as platform types (String!) — Kotlin doesn't know nullability. Treat as nullable to be safe. @JvmStatic exposes companion members as Java statics. @JvmOverloads generates Java overloads for default parameters. @JvmField exposes property as a field (no getter/setter). SAM conversion: Kotlin lambdas auto-convert to Java functional interfaces.

How would you structure a backend service in Kotlin with Ktor?
Why They Ask It

Tests backend Kotlin knowledge. Ktor is Kotlin-native and coroutine-first.

What They Evaluate
  • Ktor's plugin-based architecture
  • Routing DSL
  • Coroutine-based request handling
Answer Framework

Ktor uses plugins for capabilities (content negotiation, auth, CORS). Routing is a coroutine-aware DSL — every handler is a suspend function. Use kotlinx.serialization for JSON with @Serializable data classes. Ktor vs Spring Boot: Ktor is lighter, coroutine-first, Kotlin DSLs. Spring has larger ecosystem, more enterprise features. Spring Boot's Kotlin support is excellent — controllers work with suspend functions.

Coding Questions

Kotlin coding questions test whether you write idiomatic Kotlin — using the language's features for concise, readable code. Interviewers notice Java-style code in Kotlin syntax.

Implement a sealed class hierarchy for form validation with accumulating errors.
Why They Ask It

Tests practical use of sealed classes, extension functions, and functional error handling.

What They Evaluate
  • State modeling with sealed classes
  • Composing validators functionally
  • Clean API design
Answer Framework

Sealed class for ValidationResult (Valid, Invalid with error list). Type alias Validator<T> as a function type. Compose validators with a validateAll extension that accumulates errors from all validators. Individual validators are functions returning ValidationResult. Exhaustive when on result.

Implement a coroutine-safe in-memory cache with expiration.
Why They Ask It

Combines coroutines (Mutex for thread safety), generics, and practical API design.

What They Evaluate
  • Mutex for coroutine-safe shared state
  • Clean generic API
  • Time-based expiration logic
Answer Framework

Use Mutex (coroutine-aware, non-blocking) instead of synchronized (blocks thread). Store entries with timestamps, check expiration on read. getOrPut method prevents duplicate computation. Use kotlin.time.Duration and TimeSource.Monotonic for reliable timing.

Implement a type-safe builder DSL for creating HTML elements.
Why They Ask It

DSL building is a uniquely Kotlin skill combining extension functions, lambdas with receivers, and @DslMarker. Senior-level question.

What They Evaluate
  • Lambdas with receivers
  • Extension functions in DSL context
  • @DslMarker annotation for scope control
Answer Framework

Use lambdas with receivers (block: HtmlElement.() -> Unit) so builder methods are available inside the lambda. @DslMarker annotation prevents accidental access to outer scope receivers. apply to configure elements. Result: a DSL that reads like a custom language for building HTML trees.

Behavioral Questions

Kotlin behavioral questions focus on migration decisions (Java to Kotlin), working in mixed-language codebases, and choosing between Android and backend patterns.

Tell me about a time you migrated Java code to Kotlin.
Why They Ask It

Almost every Kotlin team has dealt with Java-to-Kotlin migration. Tests practical experience and incremental adoption.

What They Evaluate
  • Pragmatic migration approach
  • Balancing refactoring with delivery
  • Interop concerns and testing
Answer Framework

STAR format. Typical strategy: new files in Kotlin, convert utility classes first (low risk), gradually migrate core classes. IntelliJ auto-converter as starting point (needs manual cleanup). Add nullability annotations to Java code that Kotlin calls. Discuss what improved (null safety, conciseness, coroutines) and challenges (build time, team ramp-up, mixed-language debugging).

How do you decide between coroutines, callbacks, or RxJava?
Why They Ask It

Tests architectural judgment and practical trade-off reasoning in real Kotlin projects.

What They Evaluate
  • Technical decision-making
  • Different async paradigm understanding
  • Pragmatic migration reasoning
Answer Framework

Prefer coroutines for new Kotlin code (native, structured concurrency, simpler). Keep RxJava if heavily used and migration cost is high (bridge with Flow.asObservable() and Observable.asFlow()). Callbacks only for simple one-shot operations. Trade-offs: coroutines have simpler error handling/cancellation, RxJava has more operators, callbacks are simplest but lead to callback hell.

How do you handle team members with varying Kotlin experience levels?
Why They Ask It

Kotlin teams often have mixed experience (especially during Java transitions). Tests collaboration and mentoring.

What They Evaluate
  • Communication and empathy
  • Practical knowledge-sharing strategies
  • Code review practices
Answer Framework

Establish team Kotlin style guide (scope function conventions, coroutine patterns). Pair programming for complex features (especially coroutines). Code reviews that explain WHY something is more idiomatic. Gradual adoption: start with null safety and data classes, add coroutines, then sealed classes and DSLs.

Frequently Asked Questions

Is this guide for Android Kotlin or backend Kotlin interviews?

Both. The guide covers core Kotlin topics (coroutines, null safety, sealed classes, functional programming) that apply to all roles, plus dedicated sections for each track. Android interviews focus on Jetpack Compose, ViewModel, StateFlow, lifecycle-aware coroutines, and Hilt/Koin. Backend interviews focus on Ktor or Spring Boot, server-side coroutines, kotlinx.serialization, and database access patterns.

How important are coroutines in Kotlin interviews?

Coroutines are the single most important topic. Expect at least two to three coroutine questions covering structured concurrency, suspend functions, dispatchers, Flow, and exception handling. For Android roles, lifecycle-aware scopes and StateFlow are particularly important. For backend roles, server-side coroutine patterns and concurrent request handling come up frequently.

Do I need to know Java for a Kotlin developer interview?

You need to understand Kotlin-Java interop — platform types, nullability annotations, @JvmStatic, @JvmOverloads, and SAM conversions. You should identify potential NPE risks when calling Java from Kotlin. Deeper Java knowledge helps for backend roles but isn't mandatory for Android-first positions. See our Java developer interview guide for Java-specific preparation.

Will there be live coding in a Kotlin interview?

Most Kotlin interviews include at least one coding problem in a shared editor. Interviewers want to see idiomatic Kotlin — data classes, sealed classes, extension functions, collection operators, and coroutines rather than Java-style code. Practice writing without IDE auto-complete and know common standard library functions from memory.

How do Kotlin interviews compare to Java interviews?

Kotlin interviews focus on language features absent in Java — coroutines, null safety, sealed classes with exhaustive when, extension functions, scope functions, and DSL building. Java interviews emphasize OOP design patterns, Spring, JVM tuning, and threading. Kotlin interviews tend to be more practical — interviewers want working code, not design pattern taxonomy.

Should I learn Jetpack Compose or the traditional View system?

For Android Kotlin roles in 2026, Jetpack Compose is the expected default. Understand Compose's declarative model, state hoisting, recomposition, side effects (LaunchedEffect, DisposableEffect), and navigation. Traditional View system knowledge is still valuable for legacy code, but Compose is what interviewers prioritize. See our Android developer interview guide for more.

Ready to Practice Kotlin Interview Questions?

Upload your resume and the job description. Our AI generates Kotlin-specific questions based on the role — covering coroutines, null safety, sealed classes, functional programming, and platform-specific patterns for both Android and backend tracks. Practice with timed responses, camera on, and detailed scoring on technical accuracy and communication. No video is recorded or stored.

Start Free Practice Interview →

Personalized Kotlin developer interview prep. No credit card required.