Commit 0cdab109 authored by Benni Mack's avatar Benni Mack Committed by Benjamin Franzke
Browse files

[TASK] Move PageRepository to EXT:core

Since Context API was introduced in TYPO3 v9, PageRepository is highly
decoupled from $TSFE->sys_page, and fully works standalone.

It is also used in various places where TSFE is not needed,
or required, but also in places of EXT:core.

Especially parts like RootlineUtility, which depends on PageRepository
very much, cannot live without it.

I propose to move this highly important PHP class into EXT:core,
in order to allow to decouple EXT:frontend even further from
EXT:core.

The FQCN is moved from
- \TYPO3\CMS\Frontend\Page\PageRepository
to
- TYPO3\CMS\Core\Domain\Repository\PageRepository

It can be assumed to use PageRepository for any use-case
and actually reduce usages towards BackendUtility::get...
by using this API more and more.

Further adaptions could be to reduce the logic
within PageRepository and move this into QueryBuilder
and assimilate especially the "versionOL" behavior.

Resolves: #88746
Releases: master
Change-Id: Id8225100ac60bd77fc7e1303efb4c46b741d3415
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/61166

Tested-by: default avatarTYPO3com <noreply@typo3.com>
Tested-by: Georg Ringer's avatarGeorg Ringer <georg.ringer@gmail.com>
Tested-by: Benjamin Franzke's avatarBenjamin Franzke <bfr@qbus.de>
Reviewed-by: Oliver Klee's avatarOliver Klee <typo3-coding@oliverklee.de>
Reviewed-by: Georg Ringer's avatarGeorg Ringer <georg.ringer@gmail.com>
Reviewed-by: Benjamin Franzke's avatarBenjamin Franzke <bfr@qbus.de>
parent 1d4613c1
......@@ -94,6 +94,9 @@
},
"extra": {
"typo3/class-alias-loader": {
"class-alias-maps": [
"typo3/sysext/core/Migrations/Code/ClassAliasMap.php"
],
"always-add-alias-loader": true
},
"branch-alias": {
......
......@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "d1380344a1f0aac44298b30b03cf311e",
"content-hash": "6b351613bd61be8bef920113cedfeeda",
"packages": [
{
"name": "cogpowered/finediff",
......
......@@ -34,6 +34,7 @@ use TYPO3\CMS\Core\Database\Query\Restriction\BackendWorkspaceRestriction;
use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
use TYPO3\CMS\Core\Database\ReferenceIndex;
use TYPO3\CMS\Core\DataHandling\DataHandler;
use TYPO3\CMS\Core\Domain\Repository\PageRepository;
use TYPO3\CMS\Core\Exception\SiteNotFoundException;
use TYPO3\CMS\Core\Http\HtmlResponse;
use TYPO3\CMS\Core\Http\RedirectResponse;
......@@ -51,7 +52,6 @@ use TYPO3\CMS\Core\Utility\HttpUtility;
use TYPO3\CMS\Core\Utility\MathUtility;
use TYPO3\CMS\Core\Utility\PathUtility;
use TYPO3\CMS\Extbase\SignalSlot\Dispatcher;
use TYPO3\CMS\Frontend\Page\PageRepository;
/**
* Main backend controller almost always used if some database record is edited in the backend.
......
......@@ -26,6 +26,7 @@ use TYPO3\CMS\Backend\Utility\BackendUtility;
use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
use TYPO3\CMS\Core\Domain\Repository\PageRepository;
use TYPO3\CMS\Core\Http\HtmlResponse;
use TYPO3\CMS\Core\Http\RedirectResponse;
use TYPO3\CMS\Core\Imaging\Icon;
......@@ -34,7 +35,6 @@ use TYPO3\CMS\Core\Type\Bitmask\Permission;
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Utility\PathUtility;
use TYPO3\CMS\Frontend\Page\PageRepository;
/**
* Script class for 'db_new'
......
......@@ -29,6 +29,7 @@ use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Query\QueryBuilder;
use TYPO3\CMS\Core\Database\Query\Restriction\BackendWorkspaceRestriction;
use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
use TYPO3\CMS\Core\Domain\Repository\PageRepository;
use TYPO3\CMS\Core\Http\HtmlResponse;
use TYPO3\CMS\Core\Imaging\Icon;
use TYPO3\CMS\Core\Imaging\IconFactory;
......@@ -41,7 +42,6 @@ use TYPO3\CMS\Core\Utility\MathUtility;
use TYPO3\CMS\Core\Versioning\VersionState;
use TYPO3\CMS\Fluid\View\StandaloneView;
use TYPO3\CMS\Fluid\ViewHelpers\Be\InfoboxViewHelper;
use TYPO3\CMS\Frontend\Page\PageRepository;
/**
* Script Class for Web > Layout module
......
......@@ -33,6 +33,7 @@ use TYPO3\CMS\Core\Core\Environment;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Query\Restriction\BackendWorkspaceRestriction;
use TYPO3\CMS\Core\Database\Query\Restriction\HiddenRestriction;
use TYPO3\CMS\Core\Domain\Repository\PageRepository;
use TYPO3\CMS\Core\Exception\SiteNotFoundException;
use TYPO3\CMS\Core\Http\HtmlResponse;
use TYPO3\CMS\Core\Http\RedirectResponse;
......@@ -44,7 +45,6 @@ use TYPO3\CMS\Core\Site\SiteFinder;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Utility\MathUtility;
use TYPO3\CMS\Fluid\View\StandaloneView;
use TYPO3\CMS\Frontend\Page\PageRepository;
use TYPO3Fluid\Fluid\View\ViewInterface;
/**
......
......@@ -14,10 +14,10 @@ namespace TYPO3\CMS\Backend\Tree\View;
* The TYPO3 project - inspiring people to share!
*/
use TYPO3\CMS\Core\Domain\Repository\PageRepository;
use TYPO3\CMS\Core\LinkHandling\LinkService;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Utility\HttpUtility;
use TYPO3\CMS\Frontend\Page\PageRepository;
use TYPO3\CMS\Recordlist\Tree\View\LinkParameterProviderInterface;
/**
......
......@@ -29,6 +29,7 @@ use TYPO3\CMS\Core\Database\Query\Restriction\BackendWorkspaceRestriction;
use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
use TYPO3\CMS\Core\Database\Query\Restriction\HiddenRestriction;
use TYPO3\CMS\Core\Database\RelationHandler;
use TYPO3\CMS\Core\Domain\Repository\PageRepository;
use TYPO3\CMS\Core\Exception\SiteNotFoundException;
use TYPO3\CMS\Core\Http\Uri;
use TYPO3\CMS\Core\Imaging\Icon;
......@@ -51,7 +52,6 @@ use TYPO3\CMS\Core\Utility\HttpUtility;
use TYPO3\CMS\Core\Utility\MathUtility;
use TYPO3\CMS\Core\Utility\PathUtility;
use TYPO3\CMS\Core\Versioning\VersionState;
use TYPO3\CMS\Frontend\Page\PageRepository;
/**
* Standard functions available for the TYPO3 backend.
......
......@@ -1797,7 +1797,7 @@ class PageLayoutView implements LoggerAwareInterface
break;
case 'shortcut':
case 'shortcut_mode':
if ((int)$row['doktype'] === \TYPO3\CMS\Frontend\Page\PageRepository::DOKTYPE_SHORTCUT) {
if ((int)$row['doktype'] === \TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_SHORTCUT) {
$theData[$field] = $this->getPagesTableFieldValue($field, $row);
}
break;
......
<?php
namespace TYPO3\CMS\Frontend\Page;
namespace TYPO3\CMS\Core\Domain\Repository;
/*
* This file is part of the TYPO3 CMS project.
......
<?php
namespace TYPO3\CMS\Frontend\Page;
namespace TYPO3\CMS\Core\Domain\Repository;
/*
* This file is part of the TYPO3 CMS project.
......@@ -24,7 +24,7 @@ interface PageRepositoryGetPageHookInterface
*
* @param int $uid The page ID
* @param bool $disableGroupAccessCheck If set, the check for group access is disabled. VERY rarely used
* @param \TYPO3\CMS\Frontend\Page\PageRepository $parentObject Parent object
* @param PageRepository $parentObject Parent object
*/
public function getPage_preProcess(&$uid, &$disableGroupAccessCheck, PageRepository $parentObject);
}
<?php
namespace TYPO3\CMS\Frontend\Page;
namespace TYPO3\CMS\Core\Domain\Repository;
/*
* This file is part of the TYPO3 CMS project.
......@@ -15,7 +15,7 @@ namespace TYPO3\CMS\Frontend\Page;
*/
/**
* Interface for classes which hook into \TYPO3\CMS\Frontend\Page\PageRepository
* Interface for classes which hook into \TYPO3\CMS\Core\Domain\Repository\PageRepository
*/
interface PageRepositoryGetPageOverlayHookInterface
{
......@@ -24,7 +24,7 @@ interface PageRepositoryGetPageOverlayHookInterface
*
* @param array $pageInput The page record
* @param int $lUid The overlay language
* @param \TYPO3\CMS\Frontend\Page\PageRepository $parent The calling parent object
* @param PageRepository $parent The calling parent object
*/
public function getPageOverlay_preProcess(&$pageInput, &$lUid, PageRepository $parent);
}
<?php
namespace TYPO3\CMS\Frontend\Page;
namespace TYPO3\CMS\Core\Domain\Repository;
/*
* This file is part of the TYPO3 CMS project.
......@@ -15,7 +15,7 @@ namespace TYPO3\CMS\Frontend\Page;
*/
/**
* Interface for classes which hook into \TYPO3\CMS\Frontend\Page\PageRepository
* Interface for classes which hook into \TYPO3\CMS\Core\Domain\Repository\PageRepository
*/
interface PageRepositoryGetRecordOverlayHookInterface
{
......@@ -26,7 +26,7 @@ interface PageRepositoryGetRecordOverlayHookInterface
* @param array $row
* @param int $sys_language_content
* @param string $OLmode
* @param \TYPO3\CMS\Frontend\Page\PageRepository $parent
* @param PageRepository $parent
*/
public function getRecordOverlay_preProcess($table, &$row, &$sys_language_content, $OLmode, PageRepository $parent);
......@@ -37,7 +37,7 @@ interface PageRepositoryGetRecordOverlayHookInterface
* @param array $row
* @param int $sys_language_content
* @param string $OLmode
* @param \TYPO3\CMS\Frontend\Page\PageRepository $parent
* @param PageRepository $parent
*/
public function getRecordOverlay_postProcess($table, &$row, &$sys_language_content, $OLmode, PageRepository $parent);
}
<?php
namespace TYPO3\CMS\Frontend\Page;
namespace TYPO3\CMS\Core\Domain\Repository;
/*
* This file is part of the TYPO3 CMS project.
......@@ -22,7 +22,7 @@ interface PageRepositoryInitHookInterface
/**
* Modifies the DB params
*
* @param \TYPO3\CMS\Frontend\Page\PageRepository $parentObject Parent object
* @param PageRepository $parentObject Parent object
*/
public function init_postProcess(PageRepository $parentObject);
}
......@@ -20,9 +20,9 @@ use TYPO3\CMS\Core\Context\Context;
use TYPO3\CMS\Core\Context\LanguageAspectFactory;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Query\QueryBuilder;
use TYPO3\CMS\Core\Domain\Repository\PageRepository;
use TYPO3\CMS\Core\Site\SiteLanguageAwareTrait;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Frontend\Page\PageRepository;
/**
* Classic usage when using a "URL segment" (e.g. slug) field within a database table.
......
......@@ -20,9 +20,9 @@ use TYPO3\CMS\Core\Context\Context;
use TYPO3\CMS\Core\Context\LanguageAspectFactory;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Query\QueryBuilder;
use TYPO3\CMS\Core\Domain\Repository\PageRepository;
use TYPO3\CMS\Core\Site\SiteLanguageAwareTrait;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Frontend\Page\PageRepository;
/**
* Very useful for building an a path segment from a combined value of the database.
......
......@@ -28,6 +28,7 @@ use TYPO3\CMS\Core\Context\LanguageAspectFactory;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
use TYPO3\CMS\Core\Database\Query\Restriction\FrontendWorkspaceRestriction;
use TYPO3\CMS\Core\Domain\Repository\PageRepository;
use TYPO3\CMS\Core\Exception\SiteNotFoundException;
use TYPO3\CMS\Core\Http\NormalizedParams;
use TYPO3\CMS\Core\Http\Uri;
......@@ -44,7 +45,6 @@ use TYPO3\CMS\Core\Site\Entity\SiteLanguage;
use TYPO3\CMS\Core\Site\SiteFinder;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Frontend\Page\CacheHashCalculator;
use TYPO3\CMS\Frontend\Page\PageRepository;
/**
* Page Router - responsible for a page based on a request, by looking up the slug of the page path.
......
......@@ -21,13 +21,13 @@ use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Query\Restriction\AbstractRestrictionContainer;
use TYPO3\CMS\Core\Database\Query\Restriction\DefaultRestrictionContainer;
use TYPO3\CMS\Core\Database\Query\Restriction\HiddenRestriction;
use TYPO3\CMS\Core\Domain\Repository\PageRepository;
use TYPO3\CMS\Core\Package\PackageManager;
use TYPO3\CMS\Core\TimeTracker\TimeTracker;
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Frontend\Configuration\TypoScript\ConditionMatching\ConditionMatcher;
use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController;
use TYPO3\CMS\Frontend\Page\PageRepository;
/**
* Template object that is responsible for generating the TypoScript template based on template records.
......
......@@ -21,13 +21,13 @@ use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Query\QueryBuilder;
use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
use TYPO3\CMS\Core\Database\Query\Restriction\HiddenRestriction;
use TYPO3\CMS\Core\Domain\Repository\PageRepository;
use TYPO3\CMS\Core\Exception\Page\BrokenRootLineException;
use TYPO3\CMS\Core\Exception\Page\CircularRootLineException;
use TYPO3\CMS\Core\Exception\Page\MountPointsDisabledException;
use TYPO3\CMS\Core\Exception\Page\PageNotFoundException;
use TYPO3\CMS\Core\Exception\Page\PagePropertyRelationNotFoundException;
use TYPO3\CMS\Core\Versioning\VersionState;
use TYPO3\CMS\Frontend\Page\PageRepository;
/**
* A utility resolving and Caching the Rootline generation
......
......@@ -82,12 +82,12 @@ return [
],
[
'LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:doktype.I.0',
(string)\TYPO3\CMS\Frontend\Page\PageRepository::DOKTYPE_DEFAULT,
(string)\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_DEFAULT,
'apps-pagetree-page-default'
],
[
'LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.doktype.I.4',
(string)\TYPO3\CMS\Frontend\Page\PageRepository::DOKTYPE_BE_USER_SECTION,
(string)\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_BE_USER_SECTION,
'apps-pagetree-page-backend-users'
],
[
......@@ -96,17 +96,17 @@ return [
],
[
'LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.doktype.I.2',
(string)\TYPO3\CMS\Frontend\Page\PageRepository::DOKTYPE_SHORTCUT,
(string)\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_SHORTCUT,
'apps-pagetree-page-shortcut'
],
[
'LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.doktype.I.5',
(string)\TYPO3\CMS\Frontend\Page\PageRepository::DOKTYPE_MOUNTPOINT,
(string)\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_MOUNTPOINT,
'apps-pagetree-page-mountpoint'
],
[
'LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.doktype.I.8',
(string)\TYPO3\CMS\Frontend\Page\PageRepository::DOKTYPE_LINK,
(string)\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_LINK,
'apps-pagetree-page-shortcut-external'
],
[
......@@ -115,21 +115,21 @@ return [
],
[
'LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:doktype.I.folder',
(string)\TYPO3\CMS\Frontend\Page\PageRepository::DOKTYPE_SYSFOLDER,
(string)\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_SYSFOLDER,
'apps-pagetree-folder-default'
],
[
'LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:doktype.I.2',
(string)\TYPO3\CMS\Frontend\Page\PageRepository::DOKTYPE_RECYCLER,
(string)\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_RECYCLER,
'apps-filetree-folder-recycler'
],
[
'LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.doktype.I.7',
(string)\TYPO3\CMS\Frontend\Page\PageRepository::DOKTYPE_SPACER,
(string)\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_SPACER,
'apps-pagetree-spacer'
]
],
'default' => (string)\TYPO3\CMS\Frontend\Page\PageRepository::DOKTYPE_DEFAULT,
'default' => (string)\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_DEFAULT,
]
],
'title' => [
......@@ -581,19 +581,19 @@ return [
'items' => [
[
'LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.shortcut_mode.I.0',
\TYPO3\CMS\Frontend\Page\PageRepository::SHORTCUT_MODE_NONE
\TYPO3\CMS\Core\Domain\Repository\PageRepository::SHORTCUT_MODE_NONE
],
[
'LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.shortcut_mode.I.1',
\TYPO3\CMS\Frontend\Page\PageRepository::SHORTCUT_MODE_FIRST_SUBPAGE
\TYPO3\CMS\Core\Domain\Repository\PageRepository::SHORTCUT_MODE_FIRST_SUBPAGE
],
[
'LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.shortcut_mode.I.2',
\TYPO3\CMS\Frontend\Page\PageRepository::SHORTCUT_MODE_RANDOM_SUBPAGE
\TYPO3\CMS\Core\Domain\Repository\PageRepository::SHORTCUT_MODE_RANDOM_SUBPAGE
],
[
'LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.shortcut_mode.I.3',
\TYPO3\CMS\Frontend\Page\PageRepository::SHORTCUT_MODE_PARENT_PAGE
\TYPO3\CMS\Core\Domain\Repository\PageRepository::SHORTCUT_MODE_PARENT_PAGE
]
],
'default' => 0,
......@@ -898,7 +898,7 @@ return [
],
'types' => [
// normal
(string)\TYPO3\CMS\Frontend\Page\PageRepository::DOKTYPE_DEFAULT => [
(string)\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_DEFAULT => [
'showitem' => '
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general,
--palette--;;standard,
......@@ -931,7 +931,7 @@ return [
'
],
// external URL
(string)\TYPO3\CMS\Frontend\Page\PageRepository::DOKTYPE_LINK => [
(string)\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_LINK => [
'showitem' => '
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general,
doktype,
......@@ -961,7 +961,7 @@ return [
'
],
// shortcut
(string)\TYPO3\CMS\Frontend\Page\PageRepository::DOKTYPE_SHORTCUT => [
(string)\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_SHORTCUT => [
'showitem' => '
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general,
doktype,
......@@ -992,7 +992,7 @@ return [
'
],
// mount page
(string)\TYPO3\CMS\Frontend\Page\PageRepository::DOKTYPE_MOUNTPOINT => [
(string)\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_MOUNTPOINT => [
'showitem' => '
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general,
doktype,
......@@ -1023,7 +1023,7 @@ return [
'
],
// spacer
(string)\TYPO3\CMS\Frontend\Page\PageRepository::DOKTYPE_SPACER => [
(string)\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_SPACER => [
'showitem' => '
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general,
--palette--;;standard,
......@@ -1043,7 +1043,7 @@ return [
'
],
// Folder
(string)\TYPO3\CMS\Frontend\Page\PageRepository::DOKTYPE_SYSFOLDER => [
(string)\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_SYSFOLDER => [
'showitem' => '
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general,
--palette--;;standard,
......@@ -1066,7 +1066,7 @@ return [
'
],
// Trash
(string)\TYPO3\CMS\Frontend\Page\PageRepository::DOKTYPE_RECYCLER => [
(string)\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_RECYCLER => [
'showitem' => '
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general,
--palette--;;standard,
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment