All of lore.kernel.org
 help / color / mirror / Atom feed
From: Max Staudt <mstaudt@suse.de>
To: b.zolnierkie@samsung.com, linux-fbdev@vger.kernel.org,
	michal@markovi.net, sndirsch@suse.com, oneukum@suse.com,
	tiwai@suse.com, dri-devel@lists.freedesktop.org,
	linux-kernel@vger.kernel.org, bernhard.rosenkranzer@linaro.org,
	philm@manjaro.org
Subject: Re: [RFC PATCH v2 00/13] Kernel based bootsplash
Date: Tue, 19 Dec 2017 18:04:16 +0100	[thread overview]
Message-ID: <2f8a1a08-911d-a511-2968-4d89418ac212@suse.de> (raw)
In-Reply-To: <20171219161630.GI26573@phenom.ffwll.local>

On 12/19/2017 05:16 PM, Daniel Vetter wrote:
> On Wed, Dec 13, 2017 at 08:47:42PM +0100, Max Staudt wrote:
>> Dear fbdev and fbcon developers,
>>
>> Thank you very much for your input for the first patch series.
>>
>> I've included your feedback into this second roll, and kindly ask for
>> your opinion on the new patch series.
> 
> Ok I've realized that my assumptions about why you need this aren't
> holding up.
> 
> So from reading these patches it sounded like you want an in-kernel boot
> splash because that would be on the display faster than a userspace one
> like plymouth. That's the only reasons I can see for this (if there's
> another good justification, please bring it up).

Yep, that's one of the reasons.

You can find a lot more in the commit message for my first patch.


For example, having a userspace splash that starts as early as it can (thus on vesafb/efifb on a PC) will cause the KMS driver to fail reserving the entirety of video RAM, and thus fail loading. This cannot be fixed.

Reproducer:  https://bugzilla.opensuse.org/show_bug.cgi?id=980750


Furthermore, Plymouth is quite broken. For example, it may lock (via VT_SETMODE) the VT even though Plymouth is in "disabled" state and X has already taken control of the VT. This causes the kernel to throw away X's PID as the VT owner, and thus chvt and Ctrl-Alt-Fx no longer work because X can neither release the console (VT_RELDISP fails), nor does the kernel send it the signal to do so. This is hard to impossible to fix.


A third reason is that in practice, Plymouth's start is delayed for reasons such as the above. Yes, race conditions are being worked around with sleeps. It'd be nice to have a splash as early as possible, without having to worry about races.


So some issues are hard to fix, others are impossible to fix in userspace. I figured that rather than hacking back and forth and defining APIs in both the kernel and userspace (redoing a sizable part of Plymouth, or writing a replacement), I might as well put small and simple code in the kernel straight away.

And if it's hooked into fbcon, we get stuff for free:
 - It shows *really* early, even before userland is available.
 - There are no fights, no races for the device. Of any kind.
 - The code is small and simple.


Further reasoning so far, from the comments to my v1 patch series:

  https://lkml.org/lkml/2017/11/10/374
  https://lkml.org/lkml/2017/11/9/324


> I only know of very embedded setups (tv top boxes, in vehicle
> entertainment) where that kind of "time to first image" really matters,
> and those systems:
> - have a real hw kms driver
> - don't have fbcon or fbdev emulation enabled (except for some closed
>   source stacks that are a bit slow to adapt to the new world, and we
>   don't care about those in gfx).

Well, those could enable fbcon if they want the bootsplash. Shouldn't make a difference anyway if they're powerful enough to run Linux. As long as the bootsplash is shown, no fbcon drawing operations are executed, so there is no expensive scrolling or such to hog the system.


> But from discussions it sounds like you very much want to use this on
> servers, which makes 0 sense to me. On a server something like plymouth
> should do a perfectly reasonable job.

As I said in the other thread, every little helps.

For example, even on a server, a nice bootsplash makes a Linux system more attractive to novice users.

On desktops, it's basically mandatory, as users seem to be scared of text scrolling by.


> So, why exactly do we need this?

For the aforementioned reasons, and to have a nice, unified bootsplash code on *all* devices.


> (let's stop the other thread meanwhile, there's no point discussing
> implementation details if the why? question isn't answered yet)

Sure, I hope this helps.



Max

WARNING: multiple messages have this Message-ID (diff)
From: Max Staudt <mstaudt@suse.de>
To: b.zolnierkie@samsung.com, linux-fbdev@vger.kernel.org,
	michal@markovi.net, sndirsch@suse.com, oneukum@suse.com,
	tiwai@suse.com, dri-devel@lists.freedesktop.org,
	linux-kernel@vger.kernel.org, bernhard.rosenkranzer@linaro.org,
	philm@manjaro.org
Subject: Re: [RFC PATCH v2 00/13] Kernel based bootsplash
Date: Tue, 19 Dec 2017 17:04:16 +0000	[thread overview]
Message-ID: <2f8a1a08-911d-a511-2968-4d89418ac212@suse.de> (raw)
In-Reply-To: <20171219161630.GI26573@phenom.ffwll.local>

On 12/19/2017 05:16 PM, Daniel Vetter wrote:
> On Wed, Dec 13, 2017 at 08:47:42PM +0100, Max Staudt wrote:
>> Dear fbdev and fbcon developers,
>>
>> Thank you very much for your input for the first patch series.
>>
>> I've included your feedback into this second roll, and kindly ask for
>> your opinion on the new patch series.
> 
> Ok I've realized that my assumptions about why you need this aren't
> holding up.
> 
> So from reading these patches it sounded like you want an in-kernel boot
> splash because that would be on the display faster than a userspace one
> like plymouth. That's the only reasons I can see for this (if there's
> another good justification, please bring it up).

Yep, that's one of the reasons.

You can find a lot more in the commit message for my first patch.


For example, having a userspace splash that starts as early as it can (thus on vesafb/efifb on a PC) will cause the KMS driver to fail reserving the entirety of video RAM, and thus fail loading. This cannot be fixed.

Reproducer:  https://bugzilla.opensuse.org/show_bug.cgi?id˜0750


Furthermore, Plymouth is quite broken. For example, it may lock (via VT_SETMODE) the VT even though Plymouth is in "disabled" state and X has already taken control of the VT. This causes the kernel to throw away X's PID as the VT owner, and thus chvt and Ctrl-Alt-Fx no longer work because X can neither release the console (VT_RELDISP fails), nor does the kernel send it the signal to do so. This is hard to impossible to fix.


A third reason is that in practice, Plymouth's start is delayed for reasons such as the above. Yes, race conditions are being worked around with sleeps. It'd be nice to have a splash as early as possible, without having to worry about races.


So some issues are hard to fix, others are impossible to fix in userspace. I figured that rather than hacking back and forth and defining APIs in both the kernel and userspace (redoing a sizable part of Plymouth, or writing a replacement), I might as well put small and simple code in the kernel straight away.

And if it's hooked into fbcon, we get stuff for free:
 - It shows *really* early, even before userland is available.
 - There are no fights, no races for the device. Of any kind.
 - The code is small and simple.


Further reasoning so far, from the comments to my v1 patch series:

  https://lkml.org/lkml/2017/11/10/374
  https://lkml.org/lkml/2017/11/9/324


> I only know of very embedded setups (tv top boxes, in vehicle
> entertainment) where that kind of "time to first image" really matters,
> and those systems:
> - have a real hw kms driver
> - don't have fbcon or fbdev emulation enabled (except for some closed
>   source stacks that are a bit slow to adapt to the new world, and we
>   don't care about those in gfx).

Well, those could enable fbcon if they want the bootsplash. Shouldn't make a difference anyway if they're powerful enough to run Linux. As long as the bootsplash is shown, no fbcon drawing operations are executed, so there is no expensive scrolling or such to hog the system.


> But from discussions it sounds like you very much want to use this on
> servers, which makes 0 sense to me. On a server something like plymouth
> should do a perfectly reasonable job.

As I said in the other thread, every little helps.

For example, even on a server, a nice bootsplash makes a Linux system more attractive to novice users.

On desktops, it's basically mandatory, as users seem to be scared of text scrolling by.


> So, why exactly do we need this?

For the aforementioned reasons, and to have a nice, unified bootsplash code on *all* devices.


> (let's stop the other thread meanwhile, there's no point discussing
> implementation details if the why? question isn't answered yet)

Sure, I hope this helps.



Max

WARNING: multiple messages have this Message-ID (diff)
From: Max Staudt <mstaudt@suse.de>
To: b.zolnierkie@samsung.com, linux-fbdev@vger.kernel.org,
	michal@markovi.net, sndirsch@suse.com, oneukum@suse.com,
	tiwai@suse.com, dri-devel@lists.freedesktop.org,
	linux-kernel@vger.kernel.org, bernhard.rosenkranzer@linaro.org,
	philm@manjaro.org
Subject: Re: [RFC PATCH v2 00/13] Kernel based bootsplash
Date: Tue, 19 Dec 2017 18:04:16 +0100	[thread overview]
Message-ID: <2f8a1a08-911d-a511-2968-4d89418ac212@suse.de> (raw)
In-Reply-To: <20171219161630.GI26573@phenom.ffwll.local>

On 12/19/2017 05:16 PM, Daniel Vetter wrote:
> On Wed, Dec 13, 2017 at 08:47:42PM +0100, Max Staudt wrote:
>> Dear fbdev and fbcon developers,
>>
>> Thank you very much for your input for the first patch series.
>>
>> I've included your feedback into this second roll, and kindly ask for
>> your opinion on the new patch series.
> 
> Ok I've realized that my assumptions about why you need this aren't
> holding up.
> 
> So from reading these patches it sounded like you want an in-kernel boot
> splash because that would be on the display faster than a userspace one
> like plymouth. That's the only reasons I can see for this (if there's
> another good justification, please bring it up).

Yep, that's one of the reasons.

You can find a lot more in the commit message for my first patch.


For example, having a userspace splash that starts as early as it can (thus on vesafb/efifb on a PC) will cause the KMS driver to fail reserving the entirety of video RAM, and thus fail loading. This cannot be fixed.

Reproducer:  https://bugzilla.opensuse.org/show_bug.cgi?id=980750


Furthermore, Plymouth is quite broken. For example, it may lock (via VT_SETMODE) the VT even though Plymouth is in "disabled" state and X has already taken control of the VT. This causes the kernel to throw away X's PID as the VT owner, and thus chvt and Ctrl-Alt-Fx no longer work because X can neither release the console (VT_RELDISP fails), nor does the kernel send it the signal to do so. This is hard to impossible to fix.


A third reason is that in practice, Plymouth's start is delayed for reasons such as the above. Yes, race conditions are being worked around with sleeps. It'd be nice to have a splash as early as possible, without having to worry about races.


So some issues are hard to fix, others are impossible to fix in userspace. I figured that rather than hacking back and forth and defining APIs in both the kernel and userspace (redoing a sizable part of Plymouth, or writing a replacement), I might as well put small and simple code in the kernel straight away.

And if it's hooked into fbcon, we get stuff for free:
 - It shows *really* early, even before userland is available.
 - There are no fights, no races for the device. Of any kind.
 - The code is small and simple.


Further reasoning so far, from the comments to my v1 patch series:

  https://lkml.org/lkml/2017/11/10/374
  https://lkml.org/lkml/2017/11/9/324


> I only know of very embedded setups (tv top boxes, in vehicle
> entertainment) where that kind of "time to first image" really matters,
> and those systems:
> - have a real hw kms driver
> - don't have fbcon or fbdev emulation enabled (except for some closed
>   source stacks that are a bit slow to adapt to the new world, and we
>   don't care about those in gfx).

Well, those could enable fbcon if they want the bootsplash. Shouldn't make a difference anyway if they're powerful enough to run Linux. As long as the bootsplash is shown, no fbcon drawing operations are executed, so there is no expensive scrolling or such to hog the system.


> But from discussions it sounds like you very much want to use this on
> servers, which makes 0 sense to me. On a server something like plymouth
> should do a perfectly reasonable job.

As I said in the other thread, every little helps.

For example, even on a server, a nice bootsplash makes a Linux system more attractive to novice users.

On desktops, it's basically mandatory, as users seem to be scared of text scrolling by.


> So, why exactly do we need this?

For the aforementioned reasons, and to have a nice, unified bootsplash code on *all* devices.


> (let's stop the other thread meanwhile, there's no point discussing
> implementation details if the why? question isn't answered yet)

Sure, I hope this helps.



Max
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2017-12-19 17:04 UTC|newest]

Thread overview: 193+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-13 19:47 [RFC PATCH v2 00/13] Kernel based bootsplash Max Staudt
2017-12-13 19:47 ` Max Staudt
2017-12-13 19:47 ` Max Staudt
2017-12-13 19:47 ` [RFC PATCH v2 01/13] bootsplash: Initial implementation showing black screen Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 23:55   ` Randy Dunlap
2017-12-13 23:55     ` Randy Dunlap
2017-12-14 15:37     ` Max Staudt
2017-12-14 15:37       ` Max Staudt
2017-12-13 19:47 ` [RFC PATCH v2 02/13] bootsplash: Add file reading and picture rendering Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47 ` [RFC PATCH v2 03/13] bootsplash: Flush framebuffer after drawing Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 21:35   ` Daniel Vetter
2017-12-13 21:35     ` Daniel Vetter
2017-12-13 21:35     ` Daniel Vetter
2017-12-14 15:36     ` Max Staudt
2017-12-14 15:36       ` Max Staudt
2017-12-14 15:36       ` Max Staudt
2017-12-19 12:23       ` Daniel Vetter
2017-12-19 12:23         ` Daniel Vetter
2017-12-19 12:23         ` Daniel Vetter
2017-12-19 13:34         ` Max Staudt
2017-12-19 13:34           ` Max Staudt
2017-12-19 13:34           ` Max Staudt
2017-12-19 13:57           ` Daniel Vetter
2017-12-19 13:57             ` Daniel Vetter
2017-12-19 14:07             ` Oliver Neukum
2017-12-19 14:07               ` Oliver Neukum
2017-12-31 12:53               ` Alan Cox
2017-12-31 12:53                 ` Alan Cox
2017-12-31 12:53                 ` Alan Cox
2018-01-03 18:04                 ` Max Staudt
2018-01-03 18:04                   ` Max Staudt
2018-01-03 18:04                   ` Max Staudt
2017-12-19 15:41             ` Max Staudt
2017-12-19 15:41               ` Max Staudt
2017-12-19 15:41               ` Max Staudt
2017-12-19 16:02               ` Daniel Vetter
2017-12-19 16:02                 ` Daniel Vetter
2017-12-19 16:02                 ` Daniel Vetter
2017-12-19 16:23                 ` Max Staudt
2017-12-19 16:23                   ` Max Staudt
2017-12-19 16:23                   ` Max Staudt
2017-12-20  9:45                   ` Daniel Vetter
2017-12-20  9:45                     ` Daniel Vetter
2017-12-20  9:45                     ` Daniel Vetter
2017-12-19 16:09               ` Daniel Vetter
2017-12-19 16:09                 ` Daniel Vetter
2017-12-19 16:09                 ` Daniel Vetter
2017-12-19 16:26                 ` Max Staudt
2017-12-19 16:26                   ` Max Staudt
2017-12-19 16:26                   ` Max Staudt
2017-12-19 21:01               ` Ray Strode
2017-12-19 21:01                 ` Ray Strode
2017-12-19 21:01                 ` Ray Strode
2017-12-20 13:14                 ` Max Staudt
2017-12-20 13:14                   ` Max Staudt
2017-12-20 13:14                   ` Max Staudt
2017-12-20 15:35                   ` Ray Strode
2017-12-20 15:35                     ` Ray Strode
2017-12-20 15:35                     ` Ray Strode
2017-12-20 16:52                     ` Max Staudt
2017-12-20 16:52                       ` Max Staudt
2017-12-20 16:52                       ` Max Staudt
2017-12-13 19:47 ` [RFC PATCH v2 04/13] bootsplash: Add corner positioning Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47 ` [RFC PATCH v2 05/13] bootsplash: Add animation support Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47 ` [RFC PATCH v2 06/13] vt: Redraw bootsplash fully on console_unblank Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47 ` [RFC PATCH v2 07/13] vt: Add keyboard hook to disable bootsplash Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47 ` [RFC PATCH v2 08/13] sysrq: Disable bootsplash on SAK Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47 ` [RFC PATCH v2 09/13] fbcon: Disable bootsplash on oops Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47 ` [RFC PATCH v2 10/13] Documentation: Add bootsplash main documentation Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47 ` [RFC PATCH v2 11/13] bootsplash: sysfs entries to load and unload files Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47 ` [RFC PATCH v2 12/13] tools/bootsplash: Add a basic splash file creation tool Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47 ` [RFC PATCH v2 13/13] tools/bootsplash: Add script and data to create sample file Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:47   ` Max Staudt
2017-12-13 19:52 ` [RFC PATCH v2 00/13] Kernel based bootsplash Max Staudt
2017-12-13 19:52   ` Max Staudt
2017-12-13 19:52   ` Max Staudt
2017-12-19 16:16 ` Daniel Vetter
2017-12-19 16:16   ` Daniel Vetter
2017-12-19 16:16   ` Daniel Vetter
2017-12-19 17:04   ` Max Staudt [this message]
2017-12-19 17:04     ` Max Staudt
2017-12-19 17:04     ` Max Staudt
2017-12-19 17:26     ` Daniel Vetter
2017-12-19 17:26       ` Daniel Vetter
2017-12-19 17:26       ` Daniel Vetter
2017-12-19 18:40       ` Max Staudt
2017-12-19 18:40         ` Max Staudt
2017-12-19 18:40         ` Max Staudt
2017-12-20  9:43         ` Daniel Vetter
2017-12-20  9:43           ` Daniel Vetter
2017-12-20  9:43           ` Daniel Vetter
2017-12-20 10:06           ` Neil Armstrong
2017-12-20 10:06             ` Neil Armstrong
2017-12-20 10:06             ` Neil Armstrong
2017-12-20 10:14             ` Daniel Vetter
2017-12-20 10:14               ` Daniel Vetter
2017-12-20 10:14               ` Daniel Vetter
2017-12-20 14:55               ` Max Staudt
2017-12-20 14:55                 ` Max Staudt
2017-12-20 15:11                 ` Daniel Vetter
2017-12-20 15:11                   ` Daniel Vetter
2017-12-20 15:11                   ` Daniel Vetter
2017-12-20 15:19                   ` Daniel Vetter
2017-12-20 15:19                     ` Daniel Vetter
2017-12-20 15:19                     ` Daniel Vetter
2017-12-20 15:22                     ` Daniel Vetter
2017-12-20 15:22                       ` Daniel Vetter
2017-12-20 15:22                       ` Daniel Vetter
2017-12-20 16:23                     ` Max Staudt
2017-12-20 16:23                       ` Max Staudt
2017-12-20 16:23                       ` Max Staudt
2017-12-20 16:15                   ` Max Staudt
2017-12-20 16:15                     ` Max Staudt
2017-12-20 16:15                     ` Max Staudt
2017-12-31 12:44                   ` Alan Cox
2017-12-31 12:44                     ` Alan Cox
2017-12-31 12:44                     ` Alan Cox
2018-01-03 18:00                     ` Max Staudt
2018-01-03 18:00                       ` Max Staudt
2017-12-20 14:16             ` Max Staudt
2017-12-20 14:16               ` Max Staudt
2017-12-20 14:16               ` Max Staudt
2017-12-20 14:10           ` Max Staudt
2017-12-20 14:10             ` Max Staudt
2017-12-20 14:10             ` Max Staudt
2017-12-31 12:35         ` Alan Cox
2017-12-31 12:35           ` Alan Cox
2017-12-31 12:35           ` Alan Cox
2018-01-03 17:56           ` Max Staudt
2018-01-03 17:56             ` Max Staudt
2018-01-03 17:56             ` Max Staudt
2017-12-19 20:30     ` Ray Strode
2017-12-19 20:30       ` Ray Strode
2017-12-19 20:30       ` Ray Strode
2017-12-20 13:03       ` Max Staudt
2017-12-20 13:03         ` Max Staudt
2017-12-20 13:03         ` Max Staudt
2017-12-20 15:21         ` Ray Strode
2017-12-20 15:21           ` Ray Strode
2017-12-20 15:21           ` Ray Strode
2017-12-20 16:44           ` Max Staudt
2017-12-20 16:44             ` Max Staudt
2017-12-20 16:44             ` Max Staudt
2017-12-21 14:51             ` Ray Strode
2017-12-21 14:51               ` Ray Strode
2017-12-21 14:51               ` Ray Strode
2017-12-21 16:32               ` Max Staudt
2017-12-21 16:32                 ` Max Staudt
2017-12-20 11:08   ` Johannes Thumshirn
2017-12-20 11:08     ` Johannes Thumshirn
2017-12-20 11:22     ` Daniel Stone
2017-12-20 11:22       ` Daniel Stone
2017-12-20 11:22       ` Daniel Stone
2017-12-20 12:48       ` Johannes Thumshirn
2017-12-20 12:48         ` Johannes Thumshirn
2017-12-29 17:13   ` Jani Nikula
2017-12-29 17:13     ` Jani Nikula
2017-12-29 17:13     ` Jani Nikula
2018-01-03 17:38     ` Max Staudt
2018-01-03 17:38       ` Max Staudt
2017-12-21  9:48 ` Daniel Vetter
2017-12-21  9:48   ` Daniel Vetter
2017-12-21  9:48   ` Daniel Vetter
2017-12-21 16:52   ` Max Staudt
2017-12-21 16:52     ` Max Staudt
2017-12-21 16:52     ` Max Staudt
2017-12-21 15:00 ` Philip Müller
2017-12-21 15:00   ` Philip Müller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2f8a1a08-911d-a511-2968-4d89418ac212@suse.de \
    --to=mstaudt@suse.de \
    --cc=b.zolnierkie@samsung.com \
    --cc=bernhard.rosenkranzer@linaro.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=linux-fbdev@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=michal@markovi.net \
    --cc=oneukum@suse.com \
    --cc=philm@manjaro.org \
    --cc=sndirsch@suse.com \
    --cc=tiwai@suse.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.