Output Compression should be separated from the request handling, and is
now moved into a PSR-15 middleware.

This change also decouples Output Compression from Bootstrap, and the
Request Handler, so it can be re-used in other areas.

Intentionally omitted is a proper cleanup (ob_get_clean) and an explicit
write to the response object (in the middleware). That's up for later
patches. The idea of this patch is to keep functionality identical for
now.

In order to have the main request handler only deal with content creation,
and especially to move fe_user / be_user initialization out of the RequestHandler,
and to remove dependencies from Bootstrap of the RequestHandler,
TSFE is now instantiated in a PSR-15 compatible middleware.

The check if the frontend is in "maintenance mode",
set by $GLOBALS['TYPO3_CONF_VARS']['FE']['pageUnavailable_force'],
is moved into a custom PSR-15 based middleware,
effectively decoupling this logic from TSFE object.

To slowly substitute GeneralUtility::getIndpEnv() with a
better API, a new class is introduced that calculates all
normalized server parameters.
The object is added as PSR-7 request attribute in a frontend
and backend middleware.
For a transition phase, the request is made available
as $GLOBALS['TYPO3_REQUEST'] until enough core code has
been refactored to get rid of this again.

Since the session API has been adjusted it is no longer possible
to access the (now protected) sesData property of the fe_user object.
Using TSFE:fe_user|sesData|foo|bar in a TS condition will trigger
a deprecation log entry.

The two (internal) settings 'SYS/isInitialInstallationInProgress' and
'SYS/isInitialDatabaseImportDone' have been obsoleted with
the install tool rewrite in v9 and can be removed from
LocalConfiguration using the SilentConfigurationUpgradeService.

This patch provides a new "duplicate" button inside of the topbar of the
edit record form next to the close button. This button creates and opens
a new copy of the current element which is positioned right below the
existing one.
If there are unsaved changes in the currently open record, a modal
appears with options to cancel, dismiss the changes and clone or save
the changes and clone the changed record.

The frontend and backend Application and RequestHandler classes
are tightly coupled since the frontend eID request handler was
moved into a middleware and the backend ajax request handler
was merged with the regular request handler. (1:1 relationship)

There is no (longer) need to resolve the request handler in
Bootstap. For the install application we are still using two
request handlers but will dispatch them from within the
application now.

That allows us to deprecate all HTTP related code in Bootstrap (with
a separate commit) and instead implement that in an HTTP specific
ApplicationTrait.

This patch introduces a legacy RequestHandler dispatcher middleware
which ensures that registering custom request handlers using
Bootstrap::registerAdditionalRequestHandler() still works for the
frontend and backend.
(although it is marked @internal, there is interest to not just
drop this)

Can be drop-in replaced by VariableFrontend. There are no
occurrences in core code except for in tests and comments.
Configurations using this frontend can be automatically
migrated on-the-fly. Such auto-migration is not part of this
patch - this patch only touches the PHPDOC and documents
the deprecation.

The search results of the filelist access the property
`file.combinedIdentifier`. The property is not available anymore, so this
patch uses `file.identifier`, which maps to `FileFacade::identifier()`
and returns a handcrafted combined identifier.

For the default language it was possible to view the field, but on
translating the dataset, the following exception is thrown:
'PHP Warning: Invalid argument supplied for foreach() in
backend/Classes/Form/Element/SelectMultipleSideBySideElement.php line 66'

As the defaultLanguageRow keeps to be "unparsed", the $selectedItems
could be a comma separated string within the method
TYPO3\CMS\Backend\Form\Element\SelectMultipleSideBySideElement::renderReadOnly
if the TCA configuration of a field is set to 'defaultAsReadonly'.

When used with the Chrome browser, the RTE CKEditor misplaces the
position of its dropdowns/context menus (opened via right-click)
when the viewport is scrolled. CKEditor calculates the offset relative
to the <body> and assumes <body> is as long as the content and that
the scrollbar is placed on <html> (both browser defaults).
As the TYPO3 backend uses 'overflow:auto' on <body> and 'overflow: hidden'
on <html> these assumptions conflict: Once the calculated offset exceeds
the <body> height (due tue scrolling) the chrome browser scrols up.

We now move the vertical scollbar into .module-body which implicitly
fixes the CKEditor offset calculation: The calculated menu offsets are
now relative to <body> (as assumed by CKEditor) and the scroll issues
disappear as we removed the scroll bar from <body>.

The rootline for page view now depends on the webmounts of the workspace
the preview link was generated on and not the webmounts the beuser, who
generated the preview link, is at the moment of calling the preview
link.

With https://review.typo3.org/#/c/54068/ a lot of fluid classes
were changed and replaced by fluid standalone classes.
Some ViewHelpers still use the legacy classes.
This patch switches all usages to the fluid standlone classes.

Show the same warning in the page module as done in the list module,
except without the title and the table:uid combination, as this is
not needed in page module. It will always be tt_content records there.

This change deprecates the "buildQueryParameters" hook in three
different classes and adds two new hooks in DatabaseRecordList
and PageLayoutView to modify the current query.

With #82334 a cleanup of AbstractRecordList has introduced
the same hook into multiple classes, which breaks existing
hooks, because of the sixth parameter which can be one of three
different classes without a common parent class or interface.
This makes it impossible to use a type hint in the hook class.

Another problem is: an extension which implements the hook
for the list module and uses a type hint will break the page module.

The same query manipulation can be achieved with the two
new hooks, which have a separate identifier.

Correct middleware configuration to preserve the ordering
timetracker initialization and pre-process hook had prior
the re-implementation as middleware.
The timetracker initialization needs to be first, pre-process second.