diff --git a/.env.example.complete b/.env.example.complete index d243f2c1f..71fe66bca 100644 --- a/.env.example.complete +++ b/.env.example.complete @@ -222,6 +222,7 @@ SAML2_IDP_x509=null SAML2_ONELOGIN_OVERRIDES=null SAML2_DUMP_USER_DETAILS=false SAML2_AUTOLOAD_METADATA=false +SAML2_IDP_AUTHNCONTEXT=true # SAML group sync configuration # Refer to https://www.bookstackapp.com/docs/admin/saml2-auth/ diff --git a/.github/translators.txt b/.github/translators.txt index 663dcf6da..b6a92744b 100644 --- a/.github/translators.txt +++ b/.github/translators.txt @@ -54,6 +54,7 @@ Name :: Languages @benediktvolke :: German @Baptistou :: French @arcoai :: Spanish +@Jokuna :: Korean cipi1965 :: Italian Mykola Ronik (Mantikor) :: Ukrainian furkanoyk :: Turkish @@ -161,3 +162,5 @@ Gerwin de Keijzer (gdekeijzer) :: Dutch; German Informal; German kometchtech :: Japanese Auri (Atalonica) :: Catalan Francesco Franchina (ffranchina) :: Italian +Aimrane Kds (aimrane.kds) :: Arabic +whenwesober :: Indonesian diff --git a/app/Config/saml2.php b/app/Config/saml2.php index d695abf32..8ba969549 100644 --- a/app/Config/saml2.php +++ b/app/Config/saml2.php @@ -1,5 +1,7 @@ [ + // SAML2 Authn context + // When set to false no AuthContext will be sent in the AuthNRequest, + // When set to true (Default) you will get an AuthContext 'exact' 'urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport'. + // Multiple forced values can be passed via a space separated array, For example: + // SAML2_IDP_AUTHNCONTEXT="urn:federation:authentication:windows urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport" + 'requestedAuthnContext' => is_string($SAML2_IDP_AUTHNCONTEXT) ? explode(' ', $SAML2_IDP_AUTHNCONTEXT) : $SAML2_IDP_AUTHNCONTEXT, + ], ], ]; diff --git a/app/Entities/Tools/PageContent.php b/app/Entities/Tools/PageContent.php index 82499cdf2..ff502d164 100644 --- a/app/Entities/Tools/PageContent.php +++ b/app/Entities/Tools/PageContent.php @@ -4,6 +4,7 @@ use BookStack\Entities\Models\Page; use BookStack\Entities\Tools\Markdown\CustomStrikeThroughExtension; use BookStack\Facades\Theme; use BookStack\Theming\ThemeEvents; +use BookStack\Util\HtmlContentFilter; use DOMDocument; use DOMNodeList; use DOMXPath; @@ -169,7 +170,7 @@ class PageContent $content = $this->page->html; if (!config('app.allow_content_scripts')) { - $content = $this->escapeScripts($content); + $content = HtmlContentFilter::removeScripts($content); } if ($blankIncludes) { @@ -308,65 +309,4 @@ class PageContent return $innerContent; } - - /** - * Escape script tags within HTML content. - */ - protected function escapeScripts(string $html) : string - { - if (empty($html)) { - return $html; - } - - libxml_use_internal_errors(true); - $doc = new DOMDocument(); - $doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); - $xPath = new DOMXPath($doc); - - // Remove standard script tags - $scriptElems = $xPath->query('//script'); - foreach ($scriptElems as $scriptElem) { - $scriptElem->parentNode->removeChild($scriptElem); - } - - // Remove clickable links to JavaScript URI - $badLinks = $xPath->query('//*[contains(@href, \'javascript:\')]'); - foreach ($badLinks as $badLink) { - $badLink->parentNode->removeChild($badLink); - } - - // Remove forms with calls to JavaScript URI - $badForms = $xPath->query('//*[contains(@action, \'javascript:\')] | //*[contains(@formaction, \'javascript:\')]'); - foreach ($badForms as $badForm) { - $badForm->parentNode->removeChild($badForm); - } - - // Remove meta tag to prevent external redirects - $metaTags = $xPath->query('//meta[contains(@content, \'url\')]'); - foreach ($metaTags as $metaTag) { - $metaTag->parentNode->removeChild($metaTag); - } - - // Remove data or JavaScript iFrames - $badIframes = $xPath->query('//*[contains(@src, \'data:\')] | //*[contains(@src, \'javascript:\')] | //*[@srcdoc]'); - foreach ($badIframes as $badIframe) { - $badIframe->parentNode->removeChild($badIframe); - } - - // Remove 'on*' attributes - $onAttributes = $xPath->query('//@*[starts-with(name(), \'on\')]'); - foreach ($onAttributes as $attr) { - /** @var \DOMAttr $attr*/ - $attrName = $attr->nodeName; - $attr->parentNode->removeAttribute($attrName); - } - - $html = ''; - $topElems = $doc->documentElement->childNodes->item(0)->childNodes; - foreach ($topElems as $child) { - $html .= $doc->saveHTML($child); - } - - return $html; - } } diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 196897164..a06c0fdbc 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -9,7 +9,6 @@ use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Validation\ValidationException; use Symfony\Component\HttpKernel\Exception\HttpException; -use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; class Handler extends ExceptionHandler { @@ -58,29 +57,6 @@ class Handler extends ExceptionHandler return $this->renderApiException($e); } - // Handle notify exceptions which will redirect to the - // specified location then show a notification message. - if ($this->isExceptionType($e, NotifyException::class)) { - $message = $this->getOriginalMessage($e); - if (!empty($message)) { - session()->flash('error', $message); - } - return redirect($e->redirectLocation); - } - - // Handle pretty exceptions which will show a friendly application-fitting page - // Which will include the basic message to point the user roughly to the cause. - if ($this->isExceptionType($e, PrettyException::class) && !config('app.debug')) { - $message = $this->getOriginalMessage($e); - $code = ($e->getCode() === 0) ? 500 : $e->getCode(); - return response()->view('errors/' . $code, ['message' => $message], $code); - } - - // Handle 404 errors with a loaded session to enable showing user-specific information - if ($this->isExceptionType($e, NotFoundHttpException::class)) { - return \Route::respondWithRoute('fallback'); - } - return parent::render($request, $e); } @@ -119,30 +95,6 @@ class Handler extends ExceptionHandler return new JsonResponse($responseData, $code, $headers); } - /** - * Check the exception chain to compare against the original exception type. - */ - protected function isExceptionType(Exception $e, string $type): bool - { - do { - if (is_a($e, $type)) { - return true; - } - } while ($e = $e->getPrevious()); - return false; - } - - /** - * Get original exception message. - */ - protected function getOriginalMessage(Exception $e): string - { - do { - $message = $e->getMessage(); - } while ($e = $e->getPrevious()); - return $message; - } - /** * Convert an authentication exception into an unauthenticated response. * diff --git a/app/Exceptions/NotifyException.php b/app/Exceptions/NotifyException.php index 4f8105960..efca62570 100644 --- a/app/Exceptions/NotifyException.php +++ b/app/Exceptions/NotifyException.php @@ -1,8 +1,10 @@ redirectLocation = $redirectLocation; parent::__construct(); } + + /** + * Send the response for this type of exception. + * @inheritdoc + */ + public function toResponse($request) + { + $message = $this->getMessage(); + + if (!empty($message)) { + session()->flash('error', $message); + } + + return redirect($this->redirectLocation); + } } diff --git a/app/Exceptions/PrettyException.php b/app/Exceptions/PrettyException.php index 7fad7df45..8ed135de7 100644 --- a/app/Exceptions/PrettyException.php +++ b/app/Exceptions/PrettyException.php @@ -1,6 +1,43 @@ getCode() === 0) ? 500 : $this->getCode(); + return response()->view('errors.' . $code, [ + 'message' => $this->getMessage(), + 'subtitle' => $this->subtitle, + 'details' => $this->details, + ], $code); + } + + public function setSubtitle(string $subtitle): self + { + $this->subtitle = $subtitle; + return $this; + } + + public function setDetails(string $details): self + { + $this->details = $details; + return $this; + } } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 31736e1b0..1ffb99f8d 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -105,7 +105,7 @@ class HomeController extends Controller */ public function customHeadContent() { - return view('partials.custom-head-content'); + return view('partials.custom-head'); } /** diff --git a/app/Http/Controllers/Images/ImageController.php b/app/Http/Controllers/Images/ImageController.php index ecc36bf67..1eb8917b3 100644 --- a/app/Http/Controllers/Images/ImageController.php +++ b/app/Http/Controllers/Images/ImageController.php @@ -1,6 +1,7 @@ setSubtitle(trans('errors.image_not_found_subtitle')) + ->setDetails(trans('errors.image_not_found_details')); } return response()->file($path); diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php index 7d8e54382..30d33ad48 100644 --- a/app/Http/Controllers/PageController.php +++ b/app/Http/Controllers/PageController.php @@ -7,7 +7,6 @@ use BookStack\Entities\Models\Page; use BookStack\Entities\Repos\PageRepo; use BookStack\Entities\Tools\PermissionsUpdater; use BookStack\Exceptions\NotFoundException; -use BookStack\Exceptions\NotifyException; use BookStack\Exceptions\PermissionsException; use Exception; use Illuminate\Http\Request; @@ -295,7 +294,6 @@ class PageController extends Controller * Remove the specified page from storage. * @throws NotFoundException * @throws Throwable - * @throws NotifyException */ public function destroy(string $bookSlug, string $pageSlug) { @@ -311,7 +309,6 @@ class PageController extends Controller /** * Remove the specified draft page from storage. * @throws NotFoundException - * @throws NotifyException * @throws Throwable */ public function destroyDraft(string $bookSlug, int $pageId) diff --git a/app/Util/HtmlContentFilter.php b/app/Util/HtmlContentFilter.php new file mode 100644 index 000000000..cec927a3c --- /dev/null +++ b/app/Util/HtmlContentFilter.php @@ -0,0 +1,71 @@ +loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); + $xPath = new DOMXPath($doc); + + // Remove standard script tags + $scriptElems = $xPath->query('//script'); + static::removeNodes($scriptElems); + + // Remove clickable links to JavaScript URI + $badLinks = $xPath->query('//*[contains(@href, \'javascript:\')]'); + static::removeNodes($badLinks); + + // Remove forms with calls to JavaScript URI + $badForms = $xPath->query('//*[contains(@action, \'javascript:\')] | //*[contains(@formaction, \'javascript:\')]'); + static::removeNodes($badForms); + + // Remove meta tag to prevent external redirects + $metaTags = $xPath->query('//meta[contains(@content, \'url\')]'); + static::removeNodes($metaTags); + + // Remove data or JavaScript iFrames + $badIframes = $xPath->query('//*[contains(@src, \'data:\')] | //*[contains(@src, \'javascript:\')] | //*[@srcdoc]'); + static::removeNodes($badIframes); + + // Remove 'on*' attributes + $onAttributes = $xPath->query('//@*[starts-with(name(), \'on\')]'); + foreach ($onAttributes as $attr) { + /** @var \DOMAttr $attr*/ + $attrName = $attr->nodeName; + $attr->parentNode->removeAttribute($attrName); + } + + $html = ''; + $topElems = $doc->documentElement->childNodes->item(0)->childNodes; + foreach ($topElems as $child) { + $html .= $doc->saveHTML($child); + } + + return $html; + } + + /** + * Removed all of the given DOMNodes. + */ + static protected function removeNodes(DOMNodeList $nodes): void + { + foreach ($nodes as $node) { + $node->parentNode->removeChild($node); + } + } + +} \ No newline at end of file diff --git a/composer.lock b/composer.lock index 52e0aab74..b458a1b59 100644 --- a/composer.lock +++ b/composer.lock @@ -8,16 +8,16 @@ "packages": [ { "name": "aws/aws-sdk-php", - "version": "3.178.6", + "version": "3.180.5", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "0aa83b522d5ffa794c02e7411af87a0e241a3082" + "reference": "948a4defbe2a571cc4460725015b8e98b7060f2d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/0aa83b522d5ffa794c02e7411af87a0e241a3082", - "reference": "0aa83b522d5ffa794c02e7411af87a0e241a3082", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/948a4defbe2a571cc4460725015b8e98b7060f2d", + "reference": "948a4defbe2a571cc4460725015b8e98b7060f2d", "shasum": "" }, "require": { @@ -92,9 +92,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.178.6" + "source": "https://github.com/aws/aws-sdk-php/tree/3.180.5" }, - "time": "2021-04-19T18:13:17+00:00" + "time": "2021-05-07T18:12:43+00:00" }, { "name": "barryvdh/laravel-dompdf", @@ -229,40 +229,39 @@ }, { "name": "doctrine/cache", - "version": "1.10.2", + "version": "1.11.0", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "13e3381b25847283a91948d04640543941309727" + "reference": "a9c1b59eba5a08ca2770a76eddb88922f504e8e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/13e3381b25847283a91948d04640543941309727", - "reference": "13e3381b25847283a91948d04640543941309727", + "url": "https://api.github.com/repos/doctrine/cache/zipball/a9c1b59eba5a08ca2770a76eddb88922f504e8e0", + "reference": "a9c1b59eba5a08ca2770a76eddb88922f504e8e0", "shasum": "" }, "require": { "php": "~7.1 || ^8.0" }, "conflict": { - "doctrine/common": ">2.2,<2.4" + "doctrine/common": ">2.2,<2.4", + "psr/cache": ">=3" }, "require-dev": { "alcaeus/mongo-php-adapter": "^1.1", - "doctrine/coding-standard": "^6.0", + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^8.0", "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0", - "predis/predis": "~1.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "predis/predis": "~1.0", + "psr/cache": "^1.0 || ^2.0", + "symfony/cache": "^4.4 || ^5.2" }, "suggest": { "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" @@ -309,7 +308,7 @@ ], "support": { "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/1.10.x" + "source": "https://github.com/doctrine/cache/tree/1.11.0" }, "funding": [ { @@ -325,7 +324,7 @@ "type": "tidelift" } ], - "time": "2020-07-07T18:54:01+00:00" + "time": "2021-04-13T14:46:17+00:00" }, { "name": "doctrine/dbal", @@ -952,16 +951,16 @@ }, { "name": "facade/flare-client-php", - "version": "1.7.0", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/facade/flare-client-php.git", - "reference": "6bf380035890cb0a09b9628c491ae3866b858522" + "reference": "69742118c037f34ee1ef86dc605be4a105d9e984" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facade/flare-client-php/zipball/6bf380035890cb0a09b9628c491ae3866b858522", - "reference": "6bf380035890cb0a09b9628c491ae3866b858522", + "url": "https://api.github.com/repos/facade/flare-client-php/zipball/69742118c037f34ee1ef86dc605be4a105d9e984", + "reference": "69742118c037f34ee1ef86dc605be4a105d9e984", "shasum": "" }, "require": { @@ -1005,7 +1004,7 @@ ], "support": { "issues": "https://github.com/facade/flare-client-php/issues", - "source": "https://github.com/facade/flare-client-php/tree/1.7.0" + "source": "https://github.com/facade/flare-client-php/tree/1.8.0" }, "funding": [ { @@ -1013,7 +1012,7 @@ "type": "github" } ], - "time": "2021-04-12T09:30:36+00:00" + "time": "2021-04-30T11:11:50+00:00" }, { "name": "facade/ignition", @@ -1204,16 +1203,16 @@ }, { "name": "filp/whoops", - "version": "2.12.0", + "version": "2.12.1", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "d501fd2658d55491a2295ff600ae5978eaad7403" + "reference": "c13c0be93cff50f88bbd70827d993026821914dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/d501fd2658d55491a2295ff600ae5978eaad7403", - "reference": "d501fd2658d55491a2295ff600ae5978eaad7403", + "url": "https://api.github.com/repos/filp/whoops/zipball/c13c0be93cff50f88bbd70827d993026821914dd", + "reference": "c13c0be93cff50f88bbd70827d993026821914dd", "shasum": "" }, "require": { @@ -1263,7 +1262,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.12.0" + "source": "https://github.com/filp/whoops/tree/2.12.1" }, "funding": [ { @@ -1271,7 +1270,7 @@ "type": "github" } ], - "time": "2021-03-30T12:00:00+00:00" + "time": "2021-04-25T12:00:00+00:00" }, { "name": "guzzlehttp/guzzle", @@ -1433,16 +1432,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "1.8.1", + "version": "1.8.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "35ea11d335fd638b5882ff1725228b3d35496ab1" + "reference": "dc960a912984efb74d0a90222870c72c87f10c91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/35ea11d335fd638b5882ff1725228b3d35496ab1", - "reference": "35ea11d335fd638b5882ff1725228b3d35496ab1", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/dc960a912984efb74d0a90222870c72c87f10c91", + "reference": "dc960a912984efb74d0a90222870c72c87f10c91", "shasum": "" }, "require": { @@ -1502,9 +1501,9 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.8.1" + "source": "https://github.com/guzzle/psr7/tree/1.8.2" }, - "time": "2021-03-21T16:25:00+00:00" + "time": "2021-04-26T09:17:50+00:00" }, { "name": "intervention/image", @@ -1652,16 +1651,16 @@ }, { "name": "laravel/framework", - "version": "v6.20.23", + "version": "v6.20.26", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "d94c07d72c14f07e7d2027458e7f0a76f9ceb0d9" + "reference": "0117d797dc1ab64b1f88d4f6b966380ea7def091" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/d94c07d72c14f07e7d2027458e7f0a76f9ceb0d9", - "reference": "d94c07d72c14f07e7d2027458e7f0a76f9ceb0d9", + "url": "https://api.github.com/repos/laravel/framework/zipball/0117d797dc1ab64b1f88d4f6b966380ea7def091", + "reference": "0117d797dc1ab64b1f88d4f6b966380ea7def091", "shasum": "" }, "require": { @@ -1801,7 +1800,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-04-13T13:49:28+00:00" + "time": "2021-04-28T14:38:32+00:00" }, { "name": "laravel/socialite", @@ -1874,16 +1873,16 @@ }, { "name": "league/commonmark", - "version": "1.5.8", + "version": "1.6.1", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "08fa59b8e4e34ea8a773d55139ae9ac0e0aecbaf" + "reference": "2651c497f005de305c7ba3f232cbd87b8c00ee8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/08fa59b8e4e34ea8a773d55139ae9ac0e0aecbaf", - "reference": "08fa59b8e4e34ea8a773d55139ae9ac0e0aecbaf", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/2651c497f005de305c7ba3f232cbd87b8c00ee8c", + "reference": "2651c497f005de305c7ba3f232cbd87b8c00ee8c", "shasum": "" }, "require": { @@ -1971,7 +1970,7 @@ "type": "tidelift" } ], - "time": "2021-03-28T18:51:39+00:00" + "time": "2021-05-08T16:08:00+00:00" }, { "name": "league/flysystem", @@ -2409,16 +2408,16 @@ }, { "name": "nesbot/carbon", - "version": "2.46.0", + "version": "2.47.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "2fd2c4a77d58a4e95234c8a61c5df1f157a91bf4" + "reference": "606262fd8888b75317ba9461825a24fc34001e1e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/2fd2c4a77d58a4e95234c8a61c5df1f157a91bf4", - "reference": "2fd2c4a77d58a4e95234c8a61c5df1f157a91bf4", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/606262fd8888b75317ba9461825a24fc34001e1e", + "reference": "606262fd8888b75317ba9461825a24fc34001e1e", "shasum": "" }, "require": { @@ -2498,7 +2497,7 @@ "type": "tidelift" } ], - "time": "2021-02-24T17:30:44+00:00" + "time": "2021-04-13T21:54:02+00:00" }, { "name": "nunomaduro/collision", @@ -3228,16 +3227,16 @@ }, { "name": "psr/log", - "version": "1.1.3", + "version": "1.1.4", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", "shasum": "" }, "require": { @@ -3261,7 +3260,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for logging libraries", @@ -3272,9 +3271,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.3" + "source": "https://github.com/php-fig/log/tree/1.1.4" }, - "time": "2020-03-23T09:12:05+00:00" + "time": "2021-05-03T11:20:27+00:00" }, { "name": "psr/simple-cache", @@ -4073,16 +4072,16 @@ }, { "name": "symfony/console", - "version": "v4.4.21", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "1ba4560dbbb9fcf5ae28b61f71f49c678086cf23" + "reference": "36bbd079b69b94bcc9c9c9e1e37ca3b1e7971625" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/1ba4560dbbb9fcf5ae28b61f71f49c678086cf23", - "reference": "1ba4560dbbb9fcf5ae28b61f71f49c678086cf23", + "url": "https://api.github.com/repos/symfony/console/zipball/36bbd079b69b94bcc9c9c9e1e37ca3b1e7971625", + "reference": "36bbd079b69b94bcc9c9c9e1e37ca3b1e7971625", "shasum": "" }, "require": { @@ -4142,7 +4141,7 @@ "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/console/tree/v4.4.21" + "source": "https://github.com/symfony/console/tree/v4.4.22" }, "funding": [ { @@ -4158,20 +4157,20 @@ "type": "tidelift" } ], - "time": "2021-03-26T09:23:24+00:00" + "time": "2021-04-16T17:32:19+00:00" }, { "name": "symfony/css-selector", - "version": "v4.4.20", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "f907d3e53ecb2a5fad8609eb2f30525287a734c8" + "reference": "01c77324d1d47efbfd7891f62a7c256c69330115" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/f907d3e53ecb2a5fad8609eb2f30525287a734c8", - "reference": "f907d3e53ecb2a5fad8609eb2f30525287a734c8", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/01c77324d1d47efbfd7891f62a7c256c69330115", + "reference": "01c77324d1d47efbfd7891f62a7c256c69330115", "shasum": "" }, "require": { @@ -4207,7 +4206,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v4.4.20" + "source": "https://github.com/symfony/css-selector/tree/v4.4.22" }, "funding": [ { @@ -4223,20 +4222,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T09:09:26+00:00" + "time": "2021-04-07T15:47:03+00:00" }, { "name": "symfony/debug", - "version": "v4.4.20", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "157bbec4fd773bae53c5483c50951a5530a2cc16" + "reference": "45b2136377cca5f10af858968d6079a482bca473" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/157bbec4fd773bae53c5483c50951a5530a2cc16", - "reference": "157bbec4fd773bae53c5483c50951a5530a2cc16", + "url": "https://api.github.com/repos/symfony/debug/zipball/45b2136377cca5f10af858968d6079a482bca473", + "reference": "45b2136377cca5f10af858968d6079a482bca473", "shasum": "" }, "require": { @@ -4276,7 +4275,7 @@ "description": "Provides tools to ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/debug/tree/v4.4.20" + "source": "https://github.com/symfony/debug/tree/v4.4.22" }, "funding": [ { @@ -4292,7 +4291,7 @@ "type": "tidelift" } ], - "time": "2021-01-28T16:54:48+00:00" + "time": "2021-04-02T07:50:12+00:00" }, { "name": "symfony/deprecation-contracts", @@ -4363,16 +4362,16 @@ }, { "name": "symfony/error-handler", - "version": "v4.4.21", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "48e81a375525872e788c2418430f54150d935810" + "reference": "76603a8df8e001436df80758eb03a8baa5324175" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/48e81a375525872e788c2418430f54150d935810", - "reference": "48e81a375525872e788c2418430f54150d935810", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/76603a8df8e001436df80758eb03a8baa5324175", + "reference": "76603a8df8e001436df80758eb03a8baa5324175", "shasum": "" }, "require": { @@ -4412,7 +4411,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v4.4.21" + "source": "https://github.com/symfony/error-handler/tree/v4.4.22" }, "funding": [ { @@ -4428,7 +4427,7 @@ "type": "tidelift" } ], - "time": "2021-03-08T10:28:40+00:00" + "time": "2021-04-02T07:50:12+00:00" }, { "name": "symfony/event-dispatcher", @@ -4733,16 +4732,16 @@ }, { "name": "symfony/http-foundation", - "version": "v4.4.20", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "02d968647fe61b2f419a8dc70c468a9d30a48d3a" + "reference": "1a6f87ef99d05b1bf5c865b4ef7992263e1cb081" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/02d968647fe61b2f419a8dc70c468a9d30a48d3a", - "reference": "02d968647fe61b2f419a8dc70c468a9d30a48d3a", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/1a6f87ef99d05b1bf5c865b4ef7992263e1cb081", + "reference": "1a6f87ef99d05b1bf5c865b4ef7992263e1cb081", "shasum": "" }, "require": { @@ -4781,7 +4780,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v4.4.20" + "source": "https://github.com/symfony/http-foundation/tree/v4.4.22" }, "funding": [ { @@ -4797,20 +4796,20 @@ "type": "tidelift" } ], - "time": "2021-02-25T17:11:33+00:00" + "time": "2021-04-30T12:05:50+00:00" }, { "name": "symfony/http-kernel", - "version": "v4.4.21", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "0248214120d00c5f44f1cd5d9ad65f0b38459333" + "reference": "cd2e325fc34a4a5bbec91eecf69dda8ee8c5ea4f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/0248214120d00c5f44f1cd5d9ad65f0b38459333", - "reference": "0248214120d00c5f44f1cd5d9ad65f0b38459333", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/cd2e325fc34a4a5bbec91eecf69dda8ee8c5ea4f", + "reference": "cd2e325fc34a4a5bbec91eecf69dda8ee8c5ea4f", "shasum": "" }, "require": { @@ -4885,7 +4884,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v4.4.21" + "source": "https://github.com/symfony/http-kernel/tree/v4.4.22" }, "funding": [ { @@ -4901,20 +4900,20 @@ "type": "tidelift" } ], - "time": "2021-03-29T05:11:04+00:00" + "time": "2021-05-01T14:38:48+00:00" }, { "name": "symfony/mime", - "version": "v5.2.6", + "version": "v5.2.7", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "1b2092244374cbe48ae733673f2ca0818b37197b" + "reference": "7af452bf51c46f18da00feb32e1ad36db9426515" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/1b2092244374cbe48ae733673f2ca0818b37197b", - "reference": "1b2092244374cbe48ae733673f2ca0818b37197b", + "url": "https://api.github.com/repos/symfony/mime/zipball/7af452bf51c46f18da00feb32e1ad36db9426515", + "reference": "7af452bf51c46f18da00feb32e1ad36db9426515", "shasum": "" }, "require": { @@ -4968,7 +4967,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.2.6" + "source": "https://github.com/symfony/mime/tree/v5.2.7" }, "funding": [ { @@ -4984,7 +4983,7 @@ "type": "tidelift" } ], - "time": "2021-03-12T13:18:39+00:00" + "time": "2021-04-29T20:47:09+00:00" }, { "name": "symfony/polyfill-ctype", @@ -5636,16 +5635,16 @@ }, { "name": "symfony/process", - "version": "v4.4.20", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "7e950b6366d4da90292c2e7fa820b3c1842b965a" + "reference": "f5481b22729d465acb1cea3455fc04ce84b0148b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/7e950b6366d4da90292c2e7fa820b3c1842b965a", - "reference": "7e950b6366d4da90292c2e7fa820b3c1842b965a", + "url": "https://api.github.com/repos/symfony/process/zipball/f5481b22729d465acb1cea3455fc04ce84b0148b", + "reference": "f5481b22729d465acb1cea3455fc04ce84b0148b", "shasum": "" }, "require": { @@ -5677,7 +5676,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v4.4.20" + "source": "https://github.com/symfony/process/tree/v4.4.22" }, "funding": [ { @@ -5693,20 +5692,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T09:09:26+00:00" + "time": "2021-04-07T16:22:29+00:00" }, { "name": "symfony/routing", - "version": "v4.4.20", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "69919991c845b34626664ddc9b3aef9d09d2a5df" + "reference": "049e7c5c41f98511959668791b4adc0898a821b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/69919991c845b34626664ddc9b3aef9d09d2a5df", - "reference": "69919991c845b34626664ddc9b3aef9d09d2a5df", + "url": "https://api.github.com/repos/symfony/routing/zipball/049e7c5c41f98511959668791b4adc0898a821b3", + "reference": "049e7c5c41f98511959668791b4adc0898a821b3", "shasum": "" }, "require": { @@ -5765,7 +5764,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v4.4.20" + "source": "https://github.com/symfony/routing/tree/v4.4.22" }, "funding": [ { @@ -5781,7 +5780,7 @@ "type": "tidelift" } ], - "time": "2021-02-22T15:37:04+00:00" + "time": "2021-04-11T12:59:39+00:00" }, { "name": "symfony/service-contracts", @@ -6030,16 +6029,16 @@ }, { "name": "symfony/var-dumper", - "version": "v4.4.21", + "version": "v4.4.22", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "0da0e174f728996f5d5072d6a9f0a42259dbc806" + "reference": "c194bcedde6295f3ec3e9eba1f5d484ea97c41a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0da0e174f728996f5d5072d6a9f0a42259dbc806", - "reference": "0da0e174f728996f5d5072d6a9f0a42259dbc806", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c194bcedde6295f3ec3e9eba1f5d484ea97c41a7", + "reference": "c194bcedde6295f3ec3e9eba1f5d484ea97c41a7", "shasum": "" }, "require": { @@ -6099,7 +6098,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v4.4.21" + "source": "https://github.com/symfony/var-dumper/tree/v4.4.22" }, "funding": [ { @@ -6115,7 +6114,7 @@ "type": "tidelift" } ], - "time": "2021-03-27T19:49:03+00:00" + "time": "2021-04-19T13:36:17+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -6546,20 +6545,21 @@ }, { "name": "composer/composer", - "version": "2.0.12", + "version": "2.0.13", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "6c12ce263da71641903e399c3ce8ecb08fd375fb" + "reference": "986e8b86b7b570632ad0a905c3726c33dd4c0efb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/6c12ce263da71641903e399c3ce8ecb08fd375fb", - "reference": "6c12ce263da71641903e399c3ce8ecb08fd375fb", + "url": "https://api.github.com/repos/composer/composer/zipball/986e8b86b7b570632ad0a905c3726c33dd4c0efb", + "reference": "986e8b86b7b570632ad0a905c3726c33dd4c0efb", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", + "composer/metadata-minifier": "^1.0", "composer/semver": "^3.0", "composer/spdx-licenses": "^1.2", "composer/xdebug-handler": "^1.1", @@ -6623,7 +6623,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.0.12" + "source": "https://github.com/composer/composer/tree/2.0.13" }, "funding": [ { @@ -6639,7 +6639,76 @@ "type": "tidelift" } ], - "time": "2021-04-01T08:14:59+00:00" + "time": "2021-04-27T11:11:08+00:00" + }, + { + "name": "composer/metadata-minifier", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/metadata-minifier.git", + "reference": "c549d23829536f0d0e984aaabbf02af91f443207" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/metadata-minifier/zipball/c549d23829536f0d0e984aaabbf02af91f443207", + "reference": "c549d23829536f0d0e984aaabbf02af91f443207", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "composer/composer": "^2", + "phpstan/phpstan": "^0.12.55", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\MetadataMinifier\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Small utility library that handles metadata minification and expansion.", + "keywords": [ + "composer", + "compression" + ], + "support": { + "issues": "https://github.com/composer/metadata-minifier/issues", + "source": "https://github.com/composer/metadata-minifier/tree/1.0.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2021-04-07T13:37:33+00:00" }, { "name": "composer/semver", @@ -7382,16 +7451,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.10.4", + "version": "v4.10.5", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e" + "reference": "4432ba399e47c66624bc73c8c0f811e5c109576f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c6d052fc58cb876152f89f532b95a8d7907e7f0e", - "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4432ba399e47c66624bc73c8c0f811e5c109576f", + "reference": "4432ba399e47c66624bc73c8c0f811e5c109576f", "shasum": "" }, "require": { @@ -7432,9 +7501,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.4" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.5" }, - "time": "2020-12-20T10:01:03+00:00" + "time": "2021-05-03T19:11:20+00:00" }, { "name": "phar-io/manifest", @@ -9449,16 +9518,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.2.6", + "version": "v5.2.7", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "8c86a82f51658188119e62cff0a050a12d09836f" + "reference": "056e92acc21d977c37e6ea8e97374b2a6c8551b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/8c86a82f51658188119e62cff0a050a12d09836f", - "reference": "8c86a82f51658188119e62cff0a050a12d09836f", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/056e92acc21d977c37e6ea8e97374b2a6c8551b0", + "reference": "056e92acc21d977c37e6ea8e97374b2a6c8551b0", "shasum": "" }, "require": { @@ -9491,7 +9560,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.2.6" + "source": "https://github.com/symfony/filesystem/tree/v5.2.7" }, "funding": [ { @@ -9507,7 +9576,7 @@ "type": "tidelift" } ], - "time": "2021-03-28T14:30:26+00:00" + "time": "2021-04-01T10:42:13+00:00" }, { "name": "theseer/tokenizer", diff --git a/package-lock.json b/package-lock.json index 7f83f7160..d25aae4da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,1275 @@ { + "name": "bookstack", + "lockfileVersion": 2, "requires": true, - "lockfileVersion": 1, + "packages": { + "": { + "dependencies": { + "clipboard": "^2.0.8", + "codemirror": "^5.60.0", + "dropzone": "^5.9.2", + "markdown-it": "^11.0.1", + "markdown-it-task-lists": "^2.1.1", + "sortablejs": "^1.13.0" + }, + "devDependencies": { + "chokidar-cli": "^2.1.0", + "esbuild": "0.7.8", + "livereload": "^0.9.3", + "npm-run-all": "^4.1.5", + "punycode": "^2.1.1", + "sass": "^1.32.8" + } + }, + "node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" + } + }, + "node_modules/chokidar-cli": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chokidar-cli/-/chokidar-cli-2.1.0.tgz", + "integrity": "sha512-6n21AVpW6ywuEPoxJcLXMA2p4T+SLjWsXKny/9yTWFz0kKxESI3eUylpeV97LylING/27T/RVTY0f2/0QaWq9Q==", + "dev": true, + "dependencies": { + "chokidar": "^3.2.3", + "lodash.debounce": "^4.0.8", + "lodash.throttle": "^4.1.1", + "yargs": "^13.3.0" + }, + "bin": { + "chokidar": "index.js" + }, + "engines": { + "node": ">= 8.10.0" + } + }, + "node_modules/clipboard": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz", + "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==", + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/codemirror": { + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.60.0.tgz", + "integrity": "sha512-AEL7LhFOlxPlCL8IdTcJDblJm8yrAGib7I+DErJPdZd4l6imx8IMgKK3RblVgBQqz3TZJR4oknQ03bz+uNjBYA==" + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, + "node_modules/dropzone": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/dropzone/-/dropzone-5.9.2.tgz", + "integrity": "sha512-5t2z51DzIsWDbTpwcJIvUlwxBbvcwdCApz0yb9ecKJwG155Xm92KMEZmHW1B0MzoXOKvFwdd0nPu5cpeVcvPHQ==" + }, + "node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.7.8.tgz", + "integrity": "sha512-6UT1nZB+8ja5avctUC6d3kGOUAhy6/ZYHljL4nk3++1ipadghBhUCAcwsTHsmUvdu04CcGKzo13mE+ZQ2O3zrA==", + "dev": true, + "bin": { + "esbuild": "bin/esbuild" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "dependencies": { + "delegate": "^3.1.2" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/linkify-it": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/livereload": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.3.tgz", + "integrity": "sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.0", + "livereload-js": "^3.3.1", + "opts": ">= 1.2.0", + "ws": "^7.4.3" + }, + "bin": { + "livereload": "bin/livereload.js" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/livereload-js": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.3.2.tgz", + "integrity": "sha512-w677WnINxFkuixAoUEXOStewzLYGI76XVag+0JWMMEyjJQKs0ibWZMxkTlB96Lm3EjZ7IeOxVziBEbtxVQqQZA==", + "dev": true + }, + "node_modules/livereload/node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/livereload/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/livereload/node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=", + "dev": true + }, + "node_modules/markdown-it": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-11.0.1.tgz", + "integrity": "sha512-aU1TzmBKcWNNYvH9pjq6u92BML+Hz3h5S/QpfTFwiQF852pLT+9qHsrhM9JYipkOXZxGn+sGH8oyJE9FD9WezQ==", + "dependencies": { + "argparse": "^1.0.7", + "entities": "~2.0.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-task-lists": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/markdown-it-task-lists/-/markdown-it-task-lists-2.1.1.tgz", + "integrity": "sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/opts": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", + "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==", + "dev": true + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + } + }, + "node_modules/sass": { + "version": "1.32.8", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.8.tgz", + "integrity": "sha512-Sl6mIeGpzjIUZqvKnKETfMf0iDAswD9TNlv13A7aAF3XZlRPMq4VvJWBC2N2DXbp94MQVdNSFG6LfF/iOXrPHQ==", + "dev": true, + "dependencies": { + "chokidar": ">=2.0.0 <4.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true + }, + "node_modules/sortablejs": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.13.0.tgz", + "integrity": "sha512-RBJirPY0spWCrU5yCmWM1eFs/XgX2J5c6b275/YyxFRgnzPhKl/TDeU2hNR8Dt7ITq66NRPM4UlOt+e5O4CFHg==" + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz", + "integrity": "sha512-3aIv8Ffdp8EZj8iLwREGpQaUZiPyrWrpzMBHvkiSW/bK/EGve9np07Vwy7IJ5waydpGXzQZu/F8Oze2/IWkBaA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ws": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", + "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==", + "dev": true, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "dev": true + }, + "node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + }, "dependencies": { "ansi-regex": { "version": "4.1.0", @@ -340,9 +1609,9 @@ "dev": true }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "is-arrayish": { diff --git a/resources/lang/ar/common.php b/resources/lang/ar/common.php index 130f23655..485326f14 100644 --- a/resources/lang/ar/common.php +++ b/resources/lang/ar/common.php @@ -42,20 +42,20 @@ return [ 'fullscreen' => 'شاشة كاملة', // Sort Options - 'sort_options' => 'خيارات الترتيب', - 'sort_direction_toggle' => 'الترتيب وفق الإتجاه', + 'sort_options' => 'خيارات الفرز', + 'sort_direction_toggle' => 'الفرز وفق الاتجاه', 'sort_ascending' => 'فرز تصاعدي', 'sort_descending' => 'فرز تنازلي', 'sort_name' => 'الاسم', - 'sort_default' => 'Default', + 'sort_default' => 'افتراضي', 'sort_created_at' => 'تاريخ الإنشاء', 'sort_updated_at' => 'تاريخ التحديث', // Misc - 'deleted_user' => 'حذف مستخدم', + 'deleted_user' => 'المستخدم المحذوف', 'no_activity' => 'لا يوجد نشاط لعرضه', 'no_items' => 'لا توجد عناصر متوفرة', - 'back_to_top' => 'العودة للبداية', + 'back_to_top' => 'العودة إلى الأعلى', 'toggle_details' => 'عرض / إخفاء التفاصيل', 'toggle_thumbnails' => 'عرض / إخفاء الصور المصغرة', 'details' => 'التفاصيل', @@ -65,7 +65,7 @@ return [ 'breadcrumb' => 'شريط التنقل', // Header - 'header_menu_expand' => 'Expand Header Menu', + 'header_menu_expand' => 'عرض القائمة', 'profile_menu' => 'قائمة ملف التعريف', 'view_profile' => 'عرض الملف الشخصي', 'edit_profile' => 'تعديل الملف الشخصي', @@ -74,16 +74,16 @@ return [ // Layout tabs 'tab_info' => 'معلومات', - 'tab_info_label' => 'Tab: Show Secondary Information', + 'tab_info_label' => 'تبويب: إظهار المعلومات الثانوية', 'tab_content' => 'المحتوى', - 'tab_content_label' => 'Tab: Show Primary Content', + 'tab_content_label' => 'تبويب: إظهار المحتوى الأساسي', // Email Content - 'email_action_help' => 'إذا واجهتكم مشكلة بضغط زر ":actionText" فبإمكانكم نسخ الرابط أدناه ولصقه بالمتصفح:', + 'email_action_help' => 'إذا واجهتكم مشكلة عند ضغط زر ":actionText" فبإمكانكم نسخ الرابط أدناه ولصقه بالمتصفح:', 'email_rights' => 'جميع الحقوق محفوظة', // Footer Link Options // Not directly used but available for convenience to users. - 'privacy_policy' => 'Privacy Policy', - 'terms_of_service' => 'Terms of Service', + 'privacy_policy' => 'سياسة الخصوصية', + 'terms_of_service' => 'اتفاقية شروط الخدمة', ]; diff --git a/resources/lang/ar/entities.php b/resources/lang/ar/entities.php index 8771f64ee..2469e78f3 100644 --- a/resources/lang/ar/entities.php +++ b/resources/lang/ar/entities.php @@ -11,7 +11,7 @@ return [ 'recently_updated_pages' => 'صفحات حُدثت مؤخراً', 'recently_created_chapters' => 'فصول أنشئت مؤخراً', 'recently_created_books' => 'كتب أنشئت مؤخراً', - 'recently_created_shelves' => 'الأرفف المنشأة مؤخراً', + 'recently_created_shelves' => 'أرفف أنشئت مؤخراً', 'recently_update' => 'حُدثت مؤخراً', 'recently_viewed' => 'عُرضت مؤخراً', 'recent_activity' => 'نشاطات حديثة', @@ -28,8 +28,8 @@ return [ 'my_recent_drafts' => 'مسوداتي الحديثة', 'my_recently_viewed' => 'ما عرضته مؤخراً', 'no_pages_viewed' => 'لم تستعرض أي صفحات', - 'no_pages_recently_created' => 'لم يتم إنشاء أي صفحات مؤخراً', - 'no_pages_recently_updated' => 'لم يتم تحديث أي صفحات مؤخراً', + 'no_pages_recently_created' => 'لم تنشأ أي صفحات مؤخراً', + 'no_pages_recently_updated' => 'لم تُحدّث أي صفحات مؤخراً', 'export' => 'تصدير', 'export_html' => 'صفحة ويب', 'export_pdf' => 'ملف PDF', @@ -37,7 +37,7 @@ return [ // Permissions and restrictions 'permissions' => 'الأذونات', - 'permissions_intro' => 'في حال التفعيل, ستتم تبدية هذه الأذونات على أذونات الأدوار.', + 'permissions_intro' => 'عند التفعيل، سوف تأخذ هذه الأذونات أولوية على أي صلاحية أخرى للدور.', 'permissions_enable' => 'تفعيل الأذونات المخصصة', 'permissions_save' => 'حفظ الأذونات', 'permissions_owner' => 'Owner', @@ -55,8 +55,8 @@ return [ 'search_exact_matches' => 'نتائج مطابقة تماماً', 'search_tags' => 'بحث الوسوم', 'search_options' => 'الخيارات', - 'search_viewed_by_me' => 'تم استعراضها من قبلي', - 'search_not_viewed_by_me' => 'لم يتم استعراضها من قبلي', + 'search_viewed_by_me' => 'استعرضت من قبلي', + 'search_not_viewed_by_me' => 'لم تستعرض من قبلي', 'search_permissions_set' => 'حزمة الأذونات', 'search_created_by_me' => 'أنشئت بواسطتي', 'search_updated_by_me' => 'حُدثت بواسطتي', @@ -74,24 +74,24 @@ return [ 'shelves' => 'الأرفف', 'x_shelves' => ':count رف|:count أرفف', 'shelves_long' => 'أرفف الكتب', - 'shelves_empty' => 'لم يتم إنشاء أي أرفف', + 'shelves_empty' => 'لم ينشأ أي رف', 'shelves_create' => 'إنشاء رف جديد', - 'shelves_popular' => 'أرفف شعبية', + 'shelves_popular' => 'أرفف رائجة', 'shelves_new' => 'أرفف جديدة', 'shelves_new_action' => 'رف جديد', 'shelves_popular_empty' => 'ستظهر هنا الأرفف الأكثر رواجًا.', - 'shelves_new_empty' => 'ستظهر هنا الأرفف التي تم إنشاؤها مؤخرًا.', + 'shelves_new_empty' => 'ستظهر هنا الأرفف التي أنشئت مؤخرًا.', 'shelves_save' => 'حفظ الرف', 'shelves_books' => 'كتب على هذا الرف', 'shelves_add_books' => 'إضافة كتب لهذا الرف', - 'shelves_drag_books' => 'اسحب الكتب هنا لإضافتها لهذا الرف', + 'shelves_drag_books' => 'اسحب الكتب هنا لإضافتها في هذا الرف', 'shelves_empty_contents' => 'لا توجد كتب مخصصة لهذا الرف', 'shelves_edit_and_assign' => 'تحرير الرف لإدراج كتب', - 'shelves_edit_named' => 'تحرير رف الكتب: الاسم', + 'shelves_edit_named' => 'تحرير رف الكتب :name', 'shelves_edit' => 'تحرير رف الكتب', 'shelves_delete' => 'حذف رف الكتب', - 'shelves_delete_named' => 'حذف رف الكتب: الاسم', - 'shelves_delete_explain' => "سيؤدي هذا إلى حذف رف الكتب مع الاسم ':المُسمى به'. لن يتم حذف الكتب المتضمنة.", + 'shelves_delete_named' => 'حذف رف الكتب :name', + 'shelves_delete_explain' => "سيؤدي هذا إلى حذف رف الكتب المسمى ':name'، ولن تحذف الكتب المتضمنة.", 'shelves_delete_confirmation' => 'هل أنت متأكد من أنك تريد حذف هذا الرف؟', 'shelves_permissions' => 'أذونات رف الكتب', 'shelves_permissions_updated' => 'تم تحديث أذونات رف الكتب', diff --git a/resources/lang/en/errors.php b/resources/lang/en/errors.php index 79024e482..eb8ba54ea 100644 --- a/resources/lang/en/errors.php +++ b/resources/lang/en/errors.php @@ -83,6 +83,9 @@ return [ '404_page_not_found' => 'Page Not Found', 'sorry_page_not_found' => 'Sorry, The page you were looking for could not be found.', 'sorry_page_not_found_permission_warning' => 'If you expected this page to exist, you might not have permission to view it.', + 'image_not_found' => 'Image Not Found', + 'image_not_found_subtitle' => 'Sorry, The image file you were looking for could not be found.', + 'image_not_found_details' => 'If you expected this image to exist it might have been deleted.', 'return_home' => 'Return to home', 'error_occurred' => 'An Error Occurred', 'app_down' => ':appName is down right now', diff --git a/resources/lang/id/common.php b/resources/lang/id/common.php index c3cc8977d..da8138176 100644 --- a/resources/lang/id/common.php +++ b/resources/lang/id/common.php @@ -65,7 +65,7 @@ return [ 'breadcrumb' => 'Breadcrumb', // Header - 'header_menu_expand' => 'Expand Header Menu', + 'header_menu_expand' => 'Perluas Menu Tajuk', 'profile_menu' => 'Profile Menu', 'view_profile' => 'Tampilkan profil', 'edit_profile' => 'Sunting Profil', @@ -74,9 +74,9 @@ return [ // Layout tabs 'tab_info' => 'Informasi', - 'tab_info_label' => 'Tab: Show Secondary Information', + 'tab_info_label' => 'Tab Menampilkan Informasi Sekunder', 'tab_content' => 'Konten', - 'tab_content_label' => 'Tab: Show Primary Content', + 'tab_content_label' => 'Tab Menampilkan Informasi Utama', // Email Content 'email_action_help' => 'Jika Anda mengalami masalah saat mengklik tombol ":actionText", salin dan tempel URL di bawah ini ke browser web Anda:', diff --git a/resources/lang/it/components.php b/resources/lang/it/components.php index aa1c8f4a6..63637aa48 100755 --- a/resources/lang/it/components.php +++ b/resources/lang/it/components.php @@ -15,7 +15,7 @@ return [ 'image_load_more' => 'Carica Altre', 'image_image_name' => 'Nome Immagine', 'image_delete_used' => 'Questa immagine è usata nelle pagine elencate.', - 'image_delete_confirm_text' => 'Are you sure you want to delete this image?', + 'image_delete_confirm_text' => 'Sei sicuro di voler eliminare questa immagine?', 'image_select_image' => 'Seleziona Immagine', 'image_dropzone' => 'Rilascia immagini o clicca qui per caricarle', 'images_deleted' => 'Immagini Eliminate', diff --git a/resources/lang/it/entities.php b/resources/lang/it/entities.php index a567936da..bf954c950 100755 --- a/resources/lang/it/entities.php +++ b/resources/lang/it/entities.php @@ -22,7 +22,7 @@ return [ 'meta_created_name' => 'Creato :timeLength da :user', 'meta_updated' => 'Aggiornato :timeLength', 'meta_updated_name' => 'Aggiornato :timeLength da :user', - 'meta_owned_name' => 'Owned by :user', + 'meta_owned_name' => 'Creati da :user', 'entity_select' => 'Selezione Entità', 'images' => 'Immagini', 'my_recent_drafts' => 'Bozze Recenti', @@ -40,7 +40,7 @@ return [ 'permissions_intro' => 'Una volta abilitati, questi permessi avranno la priorità su tutti gli altri.', 'permissions_enable' => 'Abilita Permessi Custom', 'permissions_save' => 'Salva Permessi', - 'permissions_owner' => 'Owner', + 'permissions_owner' => 'Proprietario', // Search 'search_results' => 'Risultati Ricerca', @@ -60,7 +60,7 @@ return [ 'search_permissions_set' => 'Permessi impostati', 'search_created_by_me' => 'Creati da me', 'search_updated_by_me' => 'Aggiornati da me', - 'search_owned_by_me' => 'Owned by me', + 'search_owned_by_me' => 'Creati da me', 'search_date_options' => 'Opzioni Data', 'search_updated_before' => 'Aggiornati prima del', 'search_updated_after' => 'Aggiornati dopo il', @@ -149,7 +149,7 @@ return [ 'chapters_create' => 'Crea un nuovo capitolo', 'chapters_delete' => 'Elimina Capitolo', 'chapters_delete_named' => 'Elimina il capitolo :chapterName', - 'chapters_delete_explain' => 'This will delete the chapter with the name \':chapterName\'. All pages that exist within this chapter will also be deleted.', + 'chapters_delete_explain' => 'Procedendo si eliminerà il capitolo denominato \':chapterName\'. Anche le pagine in esso contenute saranno eliminate.', 'chapters_delete_confirm' => 'Sei sicuro di voler eliminare questo capitolo?', 'chapters_edit' => 'Elimina Capitolo', 'chapters_edit_named' => 'Modifica il capitolo :chapterName', @@ -211,7 +211,7 @@ return [ 'pages_revisions' => 'Versioni Pagina', 'pages_revisions_named' => 'Versioni della pagina :pageName', 'pages_revision_named' => 'Versione della pagina :pageName', - 'pages_revision_restored_from' => 'Restored from #:id; :summary', + 'pages_revision_restored_from' => 'Ripristinato da #:id; :summary', 'pages_revisions_created_by' => 'Creata Da', 'pages_revisions_date' => 'Data Versione', 'pages_revisions_number' => '#', @@ -269,7 +269,7 @@ return [ 'attachments_link_url' => 'Link al file', 'attachments_link_url_hint' => 'Url del sito o del file', 'attach' => 'Allega', - 'attachments_insert_link' => 'Add Attachment Link to Page', + 'attachments_insert_link' => 'Aggiungi Link Allegato alla Pagina', 'attachments_edit_file' => 'Modifica File', 'attachments_edit_file_name' => 'Nome File', 'attachments_edit_drop_upload' => 'Rilascia file o clicca qui per caricare e sovrascrivere', diff --git a/resources/lang/it/errors.php b/resources/lang/it/errors.php index 3e48ad762..728e34eba 100755 --- a/resources/lang/it/errors.php +++ b/resources/lang/it/errors.php @@ -89,14 +89,14 @@ return [ 'back_soon' => 'Ritornerà presto.', // API errors - 'api_no_authorization_found' => 'No authorization token found on the request', + 'api_no_authorization_found' => 'Nessun token di autorizzazione trovato nella richiesta', 'api_bad_authorization_format' => 'Un token di autorizzazione è stato trovato nella richiesta, ma il formato sembra non corretto', - 'api_user_token_not_found' => 'No matching API token was found for the provided authorization token', - 'api_incorrect_token_secret' => 'The secret provided for the given used API token is incorrect', + 'api_user_token_not_found' => 'Nessun token API valido è stato trovato nel token di autorizzazione fornito', + 'api_incorrect_token_secret' => 'Il token segreto fornito per il token API utilizzato non è corretto', 'api_user_no_api_permission' => 'Il proprietario del token API utilizzato non ha il permesso di effettuare chiamate API', - 'api_user_token_expired' => 'The authorization token used has expired', + 'api_user_token_expired' => 'Il token di autorizzazione utilizzato è scaduto', // Settings & Maintenance - 'maintenance_test_email_failure' => 'Error thrown when sending a test email:', + 'maintenance_test_email_failure' => 'Si è verificato un errore durante l\'invio di una e-mail di prova:', ]; diff --git a/resources/lang/it/passwords.php b/resources/lang/it/passwords.php index 604e02fe2..7099d54f3 100755 --- a/resources/lang/it/passwords.php +++ b/resources/lang/it/passwords.php @@ -8,8 +8,8 @@ return [ 'password' => 'La password deve avere almeno sei caratteri e corrispondere alla conferma.', 'user' => "Non possiamo trovare un utente per quella mail.", - 'token' => 'The password reset token is invalid for this email address.', + 'token' => 'Il token per reimpostare la password non è valido per questo indirizzo email.', 'sent' => 'Ti abbiamo inviato via mail il link per reimpostare la password!', - 'reset' => 'La tua password è stata resettata!', + 'reset' => 'La tua password è stata reimpostata!', ]; diff --git a/resources/lang/it/settings.php b/resources/lang/it/settings.php index 4f0414baf..64118a032 100755 --- a/resources/lang/it/settings.php +++ b/resources/lang/it/settings.php @@ -37,11 +37,11 @@ return [ 'app_homepage' => 'Homepage Applicazione', 'app_homepage_desc' => 'Seleziona una pagina da mostrare nella home anzichè quella di default. I permessi della pagina sono ignorati per quella selezionata.', 'app_homepage_select' => 'Seleziona una pagina', - 'app_footer_links' => 'Footer Links', - 'app_footer_links_desc' => 'Add links to show within the site footer. These will be displayed at the bottom of most pages, including those that do not require login. You can use a label of "trans::" to use system-defined translations. For example: Using "trans::common.privacy_policy" will provide the translated text "Privacy Policy" and "trans::common.terms_of_service" will provide the translated text "Terms of Service".', - 'app_footer_links_label' => 'Link Label', - 'app_footer_links_url' => 'Link URL', - 'app_footer_links_add' => 'Add Footer Link', + 'app_footer_links' => 'Link in basso', + 'app_footer_links_desc' => 'Aggiungi link da mostrare in basso nel sito. Questi saranno visibili in fondo alla maggior parte delle pagine, incluse quelle che non richiedono un autenticazione. Puoi usare l\'etichetta "trans::" per utilizzare le traduzioni implementate nella piattaforma. Esempio: usando "trans::common.privacy_policy" mostrerà il testo tradotto "Norme sulla privacy" e "trans::common.terms_of_service" mostrerà il testo tradotto "Condizioni del Servizio".', + 'app_footer_links_label' => 'Etichetta del Link', + 'app_footer_links_url' => 'URL del Link', + 'app_footer_links_add' => 'Aggiungi Link in basso', 'app_disable_comments' => 'Disattiva commenti', 'app_disable_comments_toggle' => 'Disabilita commenti', 'app_disable_comments_desc' => 'Disabilita i commenti su tutte le pagine nell\'applicazione. I commenti esistenti non sono mostrati. ', @@ -49,7 +49,7 @@ return [ // Color settings 'content_colors' => 'Colori del contenuto', 'content_colors_desc' => 'Imposta i colori per tutti gli elementi nella gerarchia della pagina. È raccomandato scegliere colori con una luminosità simile a quelli di default per una maggiore leggibilità.', - 'bookshelf_color' => 'Colore delle libreria', + 'bookshelf_color' => 'Colore della libreria', 'book_color' => 'Colore del libro', 'chapter_color' => 'Colore del capitolo', 'page_color' => 'Colore della Pagina', @@ -61,7 +61,7 @@ return [ 'reg_enable_toggle' => 'Abilita registrazione', 'reg_enable_desc' => 'Quando la registrazione è abilitata, l\utente sarà in grado di registrarsi all\'applicazione. Al momento della registrazione gli verrà associato un ruolo utente predefinito.', 'reg_default_role' => 'Ruolo predefinito dopo la registrazione', - 'reg_enable_external_warning' => 'The option above is ignored while external LDAP or SAML authentication is active. User accounts for non-existing members will be auto-created if authentication, against the external system in use, is successful.', + 'reg_enable_external_warning' => 'L\'opzione precedente viene ignorata se l\'autenticazione esterna tramite LDAP o SAML è attiva. Se l\'autenticazione (effettuata sul sistema esterno) sarà valida, gli account di eventuali membri non registrati saranno creati in automatico.', 'reg_email_confirmation' => 'Conferma Email', 'reg_email_confirmation_toggle' => 'Richiedi conferma email', 'reg_confirm_email_desc' => 'Se la restrizione per dominio è usata la conferma della mail sarà richiesta e la scelta ignorata.', @@ -73,7 +73,7 @@ return [ 'maint' => 'Manutenzione', 'maint_image_cleanup' => 'Pulizia Immagini', 'maint_image_cleanup_desc' => "Esegue la scansione del contenuto delle pagine e delle revisioni per verificare quali immagini e disegni sono attualmente in uso e quali immagini sono ridondanti. Assicurati di creare backup completo del database e delle immagini prima di eseguire la pulizia.", - 'maint_delete_images_only_in_revisions' => 'Also delete images that only exist in old page revisions', + 'maint_delete_images_only_in_revisions' => 'Elimina anche le immagini che esistono solo nelle vecchie revisioni della pagina', 'maint_image_cleanup_run' => 'Esegui Pulizia', 'maint_image_cleanup_warning' => ':count immagini potenzialmente inutilizzate sono state trovate. Sei sicuro di voler eliminare queste immagini?', 'maint_image_cleanup_success' => ':count immagini potenzialmente inutilizzate trovate e eliminate!', @@ -91,35 +91,35 @@ return [ // Recycle Bin 'recycle_bin' => 'Cestino', 'recycle_bin_desc' => 'Here you can restore items that have been deleted or choose to permanently remove them from the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', - 'recycle_bin_deleted_item' => 'Deleted Item', + 'recycle_bin_deleted_item' => 'Elimina Elemento', 'recycle_bin_deleted_by' => 'Cancellato da', 'recycle_bin_deleted_at' => 'Orario Cancellazione', 'recycle_bin_permanently_delete' => 'Elimina Definitivamente', 'recycle_bin_restore' => 'Ripristina', - 'recycle_bin_contents_empty' => 'The recycle bin is currently empty', + 'recycle_bin_contents_empty' => 'Al momento il cestino è vuoto', 'recycle_bin_empty' => 'Svuota Cestino', - 'recycle_bin_empty_confirm' => 'This will permanently destroy all items in the recycle bin including content contained within each item. Are you sure you want to empty the recycle bin?', - 'recycle_bin_destroy_confirm' => 'This action will permanently delete this item, along with any child elements listed below, from the system and you will not be able to restore this content. Are you sure you want to permanently delete this item?', - 'recycle_bin_destroy_list' => 'Items to be Destroyed', - 'recycle_bin_restore_list' => 'Items to be Restored', + 'recycle_bin_empty_confirm' => 'Questa operazione cancellerà definitivamente tutti gli elementi presenti nel cestino, inclusi i contenuti relativi a ciascun elemento. Sei sicuro di voler svuotare il cestino?', + 'recycle_bin_destroy_confirm' => 'Questa operazione eliminerà permanentemente questo elemento (insieme a tutti i relativi elementi elencati qui sotto) dal sistema e non sarà più possibile recuperarlo. Sei sicuro di voler eliminare permanentemente questo elemento?', + 'recycle_bin_destroy_list' => 'Elementi da Eliminare definitivamente', + 'recycle_bin_restore_list' => 'Elementi da Ripristinare', 'recycle_bin_restore_confirm' => 'This action will restore the deleted item, including any child elements, to their original location. If the original location has since been deleted, and is now in the recycle bin, the parent item will also need to be restored.', - 'recycle_bin_restore_deleted_parent' => 'The parent of this item has also been deleted. These will remain deleted until that parent is also restored.', - 'recycle_bin_destroy_notification' => 'Deleted :count total items from the recycle bin.', - 'recycle_bin_restore_notification' => 'Restored :count total items from the recycle bin.', + 'recycle_bin_restore_deleted_parent' => 'L\'elemento padre di questo elemento è stato eliminato. Questo elemento rimarrà eliminato fino a che l\'elemento padre non sarà ripristinato.', + 'recycle_bin_destroy_notification' => 'Eliminati :count elementi dal cestino.', + 'recycle_bin_restore_notification' => 'Ripristinati :count elementi dal cestino.', // Audit Log - 'audit' => 'Audit Log', - 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', - 'audit_event_filter' => 'Event Filter', - 'audit_event_filter_no_filter' => 'No Filter', - 'audit_deleted_item' => 'Deleted Item', - 'audit_deleted_item_name' => 'Name: :name', + 'audit' => 'Registro di Controllo', + 'audit_desc' => 'Questo registro di controllo mostra la lista delle attività registrate dal sistema. Questa lista, a differenza di altre liste del sistema a cui vengono applicate dei filtri, è integrale.', + 'audit_event_filter' => 'Filtra Eventi', + 'audit_event_filter_no_filter' => 'Nessun Filtro', + 'audit_deleted_item' => 'Elimina Elemento', + 'audit_deleted_item_name' => 'Nome: :name', 'audit_table_user' => 'Utente', 'audit_table_event' => 'Evento', - 'audit_table_related' => 'Related Item or Detail', - 'audit_table_date' => 'Activity Date', - 'audit_date_from' => 'Date Range From', - 'audit_date_to' => 'Date Range To', + 'audit_table_related' => 'Elemento o Dettaglio correlato', + 'audit_table_date' => 'Data attività', + 'audit_date_from' => 'Dalla data', + 'audit_date_to' => 'Alla data', // Role Settings 'roles' => 'Ruoli', @@ -143,7 +143,7 @@ return [ 'role_manage_entity_permissions' => 'Gestire tutti i permessi di libri, capitoli e pagine', 'role_manage_own_entity_permissions' => 'Gestire i permessi sui propri libri, capitoli e pagine', 'role_manage_page_templates' => 'Gestisci template pagine', - 'role_access_api' => 'Access system API', + 'role_access_api' => 'API sistema d\'accesso', 'role_manage_settings' => 'Gestire impostazioni app', 'role_asset' => 'Permessi Entità', 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', @@ -162,7 +162,7 @@ return [ 'user_profile' => 'Profilo Utente', 'users_add_new' => 'Aggiungi Nuovo Utente', 'users_search' => 'Cerca Utenti', - 'users_latest_activity' => 'Latest Activity', + 'users_latest_activity' => 'Ultima Attività', 'users_details' => 'Dettagli Utente', 'users_details_desc' => 'Imposta un nome e un indirizzo email per questo utente. L\'indirizzo email verrà utilizzato per accedere all\'applicazione.', 'users_details_desc_no_email' => 'Imposta un nome per questo utente così gli altri possono riconoscerlo.', @@ -180,7 +180,7 @@ return [ 'users_delete_named' => 'Elimina l\'utente :userName', 'users_delete_warning' => 'Questo eliminerà completamente l\'utente \':userName\' dal sistema.', 'users_delete_confirm' => 'Sei sicuro di voler eliminare questo utente?', - 'users_migrate_ownership' => 'Migrate Ownership', + 'users_migrate_ownership' => 'Cambia Proprietario', 'users_migrate_ownership_desc' => 'Select a user here if you want another user to become the owner of all items currently owned by this user.', 'users_none_selected' => 'Nessun utente selezionato', 'users_delete_success' => 'Utente rimosso con successo', @@ -197,11 +197,11 @@ return [ 'users_social_disconnect' => 'Disconnetti Account', 'users_social_connected' => 'L\'account :socialAccount è stato connesso correttamente al tuo profilo.', 'users_social_disconnected' => 'L\'account :socialAccount è stato disconnesso correttamente dal tuo profilo.', - 'users_api_tokens' => 'API Tokens', + 'users_api_tokens' => 'Token API', 'users_api_tokens_none' => 'No API tokens have been created for this user', 'users_api_tokens_create' => 'Crea Token', 'users_api_tokens_expires' => 'Scade', - 'users_api_tokens_docs' => 'API Documentation', + 'users_api_tokens_docs' => 'Documentazione API', // API Tokens 'user_api_token_create' => 'Crea Token API', @@ -210,17 +210,17 @@ return [ 'user_api_token_expiry' => 'Data di scadenza', 'user_api_token_expiry_desc' => 'Set a date at which this token expires. After this date, requests made using this token will no longer work. Leaving this field blank will set an expiry 100 years into the future.', 'user_api_token_create_secret_message' => 'Immediately after creating this token a "Token ID" & "Token Secret" will be generated and displayed. The secret will only be shown a single time so be sure to copy the value to somewhere safe and secure before proceeding.', - 'user_api_token_create_success' => 'API token successfully created', - 'user_api_token_update_success' => 'API token successfully updated', + 'user_api_token_create_success' => 'Token API creato correttamente', + 'user_api_token_update_success' => 'Token API aggiornato correttamente', 'user_api_token' => 'Token API', 'user_api_token_id' => 'Token ID', 'user_api_token_id_desc' => 'This is a non-editable system generated identifier for this token which will need to be provided in API requests.', - 'user_api_token_secret' => 'Token Secret', + 'user_api_token_secret' => 'Token Segreto', 'user_api_token_secret_desc' => 'This is a system generated secret for this token which will need to be provided in API requests. This will only be displayed this one time so copy this value to somewhere safe and secure.', 'user_api_token_created' => 'Token Aggiornato :timeAgo', 'user_api_token_updated' => 'Token Aggiornato :timeAgo', 'user_api_token_delete' => 'Elimina Token', - 'user_api_token_delete_warning' => 'This will fully delete this API token with the name \':tokenName\' from the system.', + 'user_api_token_delete_warning' => 'Questa operazione eliminerà irreversibilmente dal sistema il token API denominato \':tokenName\'.', 'user_api_token_delete_confirm' => 'Sei sicuri di voler eliminare questo token API?', 'user_api_token_delete_success' => 'Token API eliminato correttamente', @@ -232,7 +232,7 @@ return [ 'ar' => 'العربية', 'bg' => 'Bǎlgarski', 'bs' => 'Bosanski', - 'ca' => 'Català', + 'ca' => 'Catalano', 'cs' => 'Česky', 'da' => 'Danese', 'de' => 'Deutsch (Sie)', diff --git a/resources/lang/it/validation.php b/resources/lang/it/validation.php index bb602619c..69d023688 100755 --- a/resources/lang/it/validation.php +++ b/resources/lang/it/validation.php @@ -89,7 +89,7 @@ return [ 'required_without' => 'Il campo :attribute è richiesto quando :values non è presente.', 'required_without_all' => 'Il campo :attribute è richiesto quando nessuno dei :values sono presenti.', 'same' => ':attribute e :other devono corrispondere.', - 'safe_url' => 'The provided link may not be safe.', + 'safe_url' => 'Il link inserito potrebbe non essere sicuro.', 'size' => [ 'numeric' => 'Il campo :attribute deve essere :size.', 'file' => 'Il campo :attribute deve essere :size kilobytes.', diff --git a/resources/lang/ko/activities.php b/resources/lang/ko/activities.php index fda7e4ef3..2762c7eb4 100644 --- a/resources/lang/ko/activities.php +++ b/resources/lang/ko/activities.php @@ -45,5 +45,5 @@ return [ // Other 'commented_on' => '댓글 쓰기', - 'permissions_update' => 'updated permissions', + 'permissions_update' => '업데이트된 권한', ]; diff --git a/resources/lang/ko/common.php b/resources/lang/ko/common.php index bb304bea1..3c40f12e2 100644 --- a/resources/lang/ko/common.php +++ b/resources/lang/ko/common.php @@ -74,9 +74,9 @@ return [ // Layout tabs 'tab_info' => '정보', - 'tab_info_label' => 'Tab: Show Secondary Information', + 'tab_info_label' => '탭: 보조 정보 표시', 'tab_content' => '내용', - 'tab_content_label' => 'Tab: Show Primary Content', + 'tab_content_label' => '탭: 주요 내용 표시', // Email Content 'email_action_help' => ':actionText를 클릭할 수 없을 때는 웹 브라우저에서 다음 링크로 접속할 수 있습니다.', @@ -84,6 +84,6 @@ return [ // Footer Link Options // Not directly used but available for convenience to users. - 'privacy_policy' => 'Privacy Policy', - 'terms_of_service' => 'Terms of Service', + 'privacy_policy' => '개인정보처리방침', + 'terms_of_service' => '이용약관', ]; diff --git a/resources/lang/ko/entities.php b/resources/lang/ko/entities.php index e2fa0c7ae..94a62c67a 100644 --- a/resources/lang/ko/entities.php +++ b/resources/lang/ko/entities.php @@ -149,7 +149,7 @@ return [ 'chapters_create' => '챕터 만들기', 'chapters_delete' => '챕터 삭제하기', 'chapters_delete_named' => ':chapterName(을)를 지웁니다.', - 'chapters_delete_explain' => 'This will delete the chapter with the name \':chapterName\'. All pages that exist within this chapter will also be deleted.', + 'chapters_delete_explain' => '\':chapterName\'(을)를 지웁니다. 해당 챕터에 있는 모든 문서도 삭제됩니다.', 'chapters_delete_confirm' => '이 챕터를 지울 건가요?', 'chapters_edit' => '챕터 바꾸기', 'chapters_edit_named' => ':chapterName 바꾸기', @@ -211,7 +211,7 @@ return [ 'pages_revisions' => '문서 수정본', 'pages_revisions_named' => ':pageName 수정본', 'pages_revision_named' => ':pageName 수정본', - 'pages_revision_restored_from' => 'Restored from #:id; :summary', + 'pages_revision_restored_from' => '#:id 에서; :summary 복원', 'pages_revisions_created_by' => '만든 사용자', 'pages_revisions_date' => '수정한 날짜', 'pages_revisions_number' => 'No.', diff --git a/resources/lang/ko/settings.php b/resources/lang/ko/settings.php index 920ce0450..923d9e126 100755 --- a/resources/lang/ko/settings.php +++ b/resources/lang/ko/settings.php @@ -37,11 +37,11 @@ return [ 'app_homepage' => '처음 페이지', 'app_homepage_desc' => '고른 페이지에 설정한 권한은 무시합니다.', 'app_homepage_select' => '문서 고르기', - 'app_footer_links' => 'Footer Links', - 'app_footer_links_desc' => 'Add links to show within the site footer. These will be displayed at the bottom of most pages, including those that do not require login. You can use a label of "trans::" to use system-defined translations. For example: Using "trans::common.privacy_policy" will provide the translated text "Privacy Policy" and "trans::common.terms_of_service" will provide the translated text "Terms of Service".', - 'app_footer_links_label' => 'Link Label', - 'app_footer_links_url' => 'Link URL', - 'app_footer_links_add' => 'Add Footer Link', + 'app_footer_links' => '푸터 링크', + 'app_footer_links_desc' => '사이트 푸터에 표시할 링크들을 추가합니다. 로그인이 필요하지 않은 페이지들을 포함하여 대부분의 페이지 하단에 표시됩니다. 시스템 정의 번역을 사용하기 위해 "trans::"를 사용할 수 있습니다. 예를 들어: "trans::common.privacy_policy"를 사용하면 번역된 "개인정보처리방침"이 제공되며, "trans::common.terms_of_service"는 번역된 "이용약관"를 제공합니다.', + 'app_footer_links_label' => '링크 라벨', + 'app_footer_links_url' => '링크 URL', + 'app_footer_links_add' => '푸터 링크 추가', 'app_disable_comments' => '댓글 사용 안 함', 'app_disable_comments_toggle' => '댓글 사용 안 함', 'app_disable_comments_desc' => '모든 페이지에서 댓글을 숨깁니다.', @@ -73,7 +73,7 @@ return [ 'maint' => '데이터', 'maint_image_cleanup' => '이미지 정리', 'maint_image_cleanup_desc' => "중복한 이미지를 찾습니다. 실행하기 전에 이미지를 백업하세요.", - 'maint_delete_images_only_in_revisions' => 'Also delete images that only exist in old page revisions', + 'maint_delete_images_only_in_revisions' => '오래된 문서 수정본에만 있는 이미지도 삭제하기', 'maint_image_cleanup_run' => '실행', 'maint_image_cleanup_warning' => '이미지 :count개를 지울 건가요?', 'maint_image_cleanup_success' => '이미지 :count개 삭제함', @@ -85,38 +85,38 @@ return [ 'maint_send_test_email_mail_subject' => '테스트 메일', 'maint_send_test_email_mail_greeting' => '이메일 전송이 성공하였습니다.', 'maint_send_test_email_mail_text' => '축하합니다! 이 메일을 받음으로 이메일 설정이 정상적으로 되었음을 확인하였습니다.', - 'maint_recycle_bin_desc' => 'Deleted shelves, books, chapters & pages are sent to the recycle bin so they can be restored or permanently deleted. Older items in the recycle bin may be automatically removed after a while depending on system configuration.', - 'maint_recycle_bin_open' => 'Open Recycle Bin', + 'maint_recycle_bin_desc' => '삭제된 서가, 책자, 챕터 & 문서들을 휴지통으로 보내져 복구하거나 또는 영구적으로 삭제할 수 있습니다. 휴지통의 오래된 항목은 시스템 구성에 따라 잠시 후 자동으로 삭제될 수 있습니다.', + 'maint_recycle_bin_open' => '휴지통 열기', // Recycle Bin - 'recycle_bin' => 'Recycle Bin', - 'recycle_bin_desc' => 'Here you can restore items that have been deleted or choose to permanently remove them from the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', - 'recycle_bin_deleted_item' => 'Deleted Item', - 'recycle_bin_deleted_by' => 'Deleted By', - 'recycle_bin_deleted_at' => 'Deletion Time', - 'recycle_bin_permanently_delete' => 'Permanently Delete', - 'recycle_bin_restore' => 'Restore', - 'recycle_bin_contents_empty' => 'The recycle bin is currently empty', - 'recycle_bin_empty' => 'Empty Recycle Bin', - 'recycle_bin_empty_confirm' => 'This will permanently destroy all items in the recycle bin including content contained within each item. Are you sure you want to empty the recycle bin?', - 'recycle_bin_destroy_confirm' => 'This action will permanently delete this item, along with any child elements listed below, from the system and you will not be able to restore this content. Are you sure you want to permanently delete this item?', - 'recycle_bin_destroy_list' => 'Items to be Destroyed', - 'recycle_bin_restore_list' => 'Items to be Restored', - 'recycle_bin_restore_confirm' => 'This action will restore the deleted item, including any child elements, to their original location. If the original location has since been deleted, and is now in the recycle bin, the parent item will also need to be restored.', - 'recycle_bin_restore_deleted_parent' => 'The parent of this item has also been deleted. These will remain deleted until that parent is also restored.', - 'recycle_bin_destroy_notification' => 'Deleted :count total items from the recycle bin.', - 'recycle_bin_restore_notification' => 'Restored :count total items from the recycle bin.', + 'recycle_bin' => '휴지통', + 'recycle_bin_desc' => '여기서 삭제된 항목을 복원하거나 시스템에서 영구적으로 제거하도록 선택할 수 있습니다. 이 목록은 권한 필터가 적용되는 시스템의 유사한 활동 목록과 달리 필터링되지 않습니다.', + 'recycle_bin_deleted_item' => '삭제된 항목', + 'recycle_bin_deleted_by' => '삭제자', + 'recycle_bin_deleted_at' => '삭제 시간', + 'recycle_bin_permanently_delete' => '영구적으로 삭제하기', + 'recycle_bin_restore' => '복원하기', + 'recycle_bin_contents_empty' => '휴지통은 현재 비어있습니다.', + 'recycle_bin_empty' => '휴지통 비우기', + 'recycle_bin_empty_confirm' => '각 항목에 포함된 내용을 포함하여 휴지통의 모든 항목이 영구히 삭제됩니다. 휴지통을 비우시겠습니까?', + 'recycle_bin_destroy_confirm' => '이 작업을 수행하면 아래 나열된 하위 요소와 함께 이 항목이 시스템에서 영구적으로 삭제되고 이 내용을 복원할 수 없습니다. 이 항목을 완전히 삭제하시겠습니까?', + 'recycle_bin_destroy_list' => '삭제할 항목들', + 'recycle_bin_restore_list' => '복원할 항목들', + 'recycle_bin_restore_confirm' => '이 작업을 수행하면 하위 요소를 포함하여 삭제된 항목이 원래 위치로 복원됩니다. 원래 위치가 삭제되고 현재 휴지통에 있는 경우 상위 항목도 복원해야 합니다.', + 'recycle_bin_restore_deleted_parent' => '이 항목의 상위 항목도 삭제되었습니다. 상위 항목도 복원될 때까지 삭제된 상태로 유지됩니다.', + 'recycle_bin_destroy_notification' => '휴지통에서 총 :count 개의 항목들이 삭제되었습니다.', + 'recycle_bin_restore_notification' => '휴지통에서 총 :count 개의 항목들이 복원되었습니다.', // Audit Log 'audit' => '감사 기록', - 'audit_desc' => 'This audit log displays a list of activities tracked in the system. This list is unfiltered unlike similar activity lists in the system where permission filters are applied.', + 'audit_desc' => '이 감사 로그는 시스템에서 추적한 활동 목록을 표시합니다. 이 목록은 권한 필터가 적용되는 시스템의 유사한 활동 목록과 달리 필터링되지 않습니다.', 'audit_event_filter' => '이벤트 필터', 'audit_event_filter_no_filter' => '필터 없음', 'audit_deleted_item' => '삭제된 항목', 'audit_deleted_item_name' => '이름: :name', 'audit_table_user' => '사용자', 'audit_table_event' => '이벤트', - 'audit_table_related' => 'Related Item or Detail', + 'audit_table_related' => '관련 항목 또는 세부 정보', 'audit_table_date' => '활동 날짜', 'audit_date_from' => '날짜 범위 시작', 'audit_date_to' => '날짜 범위 끝', @@ -146,7 +146,7 @@ return [ 'role_access_api' => '시스템 접근 API', 'role_manage_settings' => '사이트 설정 관리', 'role_asset' => '권한 항목', - 'roles_system_warning' => 'Be aware that access to any of the above three permissions can allow a user to alter their own privileges or the privileges of others in the system. Only assign roles with these permissions to trusted users.', + 'roles_system_warning' => '위의 세 가지 권한 중 하나에 액세스하면 사용자가 자신의 권한이나 시스템 내 다른 사용자의 권한을 변경할 수 있습니다. 이러한 권한이 있는 역할만 신뢰할 수 있는 사용자에게 할당합니다.', 'role_asset_desc' => '책자, 챕터, 문서별 권한은 이 설정에 우선합니다.', 'role_asset_admins' => 'Admin 권한은 어디든 접근할 수 있지만 이 설정은 사용자 인터페이스에서 해당 활동을 표시할지 결정합니다.', 'role_all' => '모든 항목', @@ -162,7 +162,7 @@ return [ 'user_profile' => '사용자 프로필', 'users_add_new' => '사용자 만들기', 'users_search' => '사용자 검색', - 'users_latest_activity' => 'Latest Activity', + 'users_latest_activity' => '최근 활동', 'users_details' => '사용자 정보', 'users_details_desc' => '메일 주소로 로그인합니다.', 'users_details_desc_no_email' => '사용자 이름을 바꿉니다.', @@ -180,10 +180,10 @@ return [ 'users_delete_named' => ':userName 삭제', 'users_delete_warning' => ':userName에 관한 데이터를 지웁니다.', 'users_delete_confirm' => '이 사용자를 지울 건가요?', - 'users_migrate_ownership' => 'Migrate Ownership', - 'users_migrate_ownership_desc' => 'Select a user here if you want another user to become the owner of all items currently owned by this user.', - 'users_none_selected' => 'No user selected', - 'users_delete_success' => 'User successfully removed', + 'users_migrate_ownership' => '소유권 이전', + 'users_migrate_ownership_desc' => '다른 사용자가 현재 이 사용자가 소유하고 있는 모든 항목의 소유자가 되려면 여기서 사용자를 선택하십시오.', + 'users_none_selected' => '선택된 사용자가 없습니다.', + 'users_delete_success' => '사용자가 성공적으로 삭제되었습니다.', 'users_edit' => '사용자 수정', 'users_edit_profile' => '프로필 바꾸기', 'users_edit_success' => '프로필 바꿈', diff --git a/resources/lang/ko/validation.php b/resources/lang/ko/validation.php index 6754d9620..78b17a1d2 100644 --- a/resources/lang/ko/validation.php +++ b/resources/lang/ko/validation.php @@ -89,7 +89,7 @@ return [ 'required_without' => ':values(이)가 없을 때 :attribute(을)를 구성해야 합니다.', 'required_without_all' => ':values(이)가 모두 없을 때 :attribute(을)를 구성해야 합니다.', 'same' => ':attribute(와)과 :other(을)를 똑같이 구성하세요.', - 'safe_url' => 'The provided link may not be safe.', + 'safe_url' => '제공된 링크가 안전하지 않을 수 있습니다.', 'size' => [ 'numeric' => ':attribute(을)를 :size(으)로 구성하세요.', 'file' => ':attribute(을)를 :size킬로바이트로 구성하세요.', diff --git a/resources/lang/nl/entities.php b/resources/lang/nl/entities.php index d0c93700b..aac4863cb 100644 --- a/resources/lang/nl/entities.php +++ b/resources/lang/nl/entities.php @@ -6,7 +6,7 @@ return [ // Shared - 'recently_created' => 'Recent Aangemaakt', + 'recently_created' => 'Recent aangemaakt', 'recently_created_pages' => 'Recent Aangemaakte Pagina\'s', 'recently_updated_pages' => 'Recent Bijgewerkte Pagina\'s', 'recently_created_chapters' => 'Recent Aangemaakte Hoofdstukken', @@ -75,10 +75,10 @@ return [ 'x_shelves' => ':count Boekenplank|:count Boekenplanken', 'shelves_long' => 'Boekenplanken', 'shelves_empty' => 'Er zijn geen boekenplanken aangemaakt', - 'shelves_create' => 'Nieuwe Boekenplank Aanmaken', + 'shelves_create' => 'Nieuwe boekenplank maken', 'shelves_popular' => 'Populaire Boekenplanken', - 'shelves_new' => 'Nieuwe Boekenplanken', - 'shelves_new_action' => 'Nieuwe Boekplank', + 'shelves_new' => 'Nieuwe boekenplanken', + 'shelves_new_action' => 'Nieuwe boekenplank', 'shelves_popular_empty' => 'De meest populaire boekenplanken worden hier weergegeven.', 'shelves_new_empty' => 'De meest recent aangemaakt boekenplanken worden hier weergeven.', 'shelves_save' => 'Boekenplanken Opslaan', @@ -108,11 +108,11 @@ return [ 'books_empty' => 'Er zijn geen boeken aangemaakt', 'books_popular' => 'Populaire Boeken', 'books_recent' => 'Recente Boeken', - 'books_new' => 'Nieuwe Boeken', - 'books_new_action' => 'Nieuw Boek', + 'books_new' => 'Nieuwe boeken', + 'books_new_action' => 'Nieuw boek', 'books_popular_empty' => 'De meest populaire boeken worden hier weergegeven.', 'books_new_empty' => 'De meest recent aangemaakte boeken verschijnen hier.', - 'books_create' => 'Nieuw Boek Aanmaken', + 'books_create' => 'Nieuw boek maken', 'books_delete' => 'Boek Verwijderen', 'books_delete_named' => 'Verwijder Boek :bookName', 'books_delete_explain' => 'Deze actie verwijdert het boek \':bookName\', Alle pagina\'s en hoofdstukken worden verwijderd.', @@ -124,7 +124,7 @@ return [ 'books_permissions' => 'Boek Permissies', 'books_permissions_updated' => 'Boek Permissies Opgeslagen', 'books_empty_contents' => 'Er zijn nog een hoofdstukken en pagina\'s voor dit boek gemaakt.', - 'books_empty_create_page' => 'Pagina Toevoegen', + 'books_empty_create_page' => 'Nieuwe pagina maken', 'books_empty_sort_current_book' => 'Boek sorteren', 'books_empty_add_chapter' => 'Hoofdstuk Toevoegen', 'books_permissions_active' => 'Boek Permissies Actief', @@ -138,15 +138,15 @@ return [ 'books_sort_chapters_first' => 'Hoofdstukken eerst', 'books_sort_chapters_last' => 'Hoofdstukken Laatst', 'books_sort_show_other' => 'Bekijk Andere Boeken', - 'books_sort_save' => 'Nieuwe Order Opslaan', + 'books_sort_save' => 'Nieuwe volgorde opslaan', // Chapters 'chapter' => 'Hoofdstuk', 'chapters' => 'Hoofdstukken', 'x_chapters' => ':count Hoofdstuk|:count Hoofdstukken', 'chapters_popular' => 'Populaire Hoofdstukken', - 'chapters_new' => 'Nieuw Hoofdstuk', - 'chapters_create' => 'Hoofdstuk Toevoegen', + 'chapters_new' => 'Nieuw hoofdstuk', + 'chapters_create' => 'Nieuw hoofdstuk maken', 'chapters_delete' => 'Hoofdstuk Verwijderen', 'chapters_delete_named' => 'Verwijder Hoofdstuk :chapterName', 'chapters_delete_explain' => 'Dit verwijdert het hoofdstuk met de naam \':chapterName\'. Alle pagina\'s die binnen dit hoofdstuk staan, worden ook verwijderd.', @@ -168,7 +168,7 @@ return [ 'pages' => 'Pagina\'s', 'x_pages' => ':count Pagina|:count Pagina\'s', 'pages_popular' => 'Populaire Pagina\'s', - 'pages_new' => 'Nieuwe Pagina', + 'pages_new' => 'Nieuwe pagina', 'pages_attachments' => 'Bijlages', 'pages_navigation' => 'Pagina Navigatie', 'pages_delete' => 'Pagina Verwijderen', @@ -227,7 +227,7 @@ return [ 'pages_edit_content_link' => 'Bewerk inhoud', 'pages_permissions_active' => 'Pagina Permissies Actief', 'pages_initial_revision' => 'Eerste publicatie', - 'pages_initial_name' => 'Nieuwe Pagina', + 'pages_initial_name' => 'Nieuwe pagina', 'pages_editing_draft_notification' => 'U bewerkt momenteel een concept dat voor het laatst is opgeslagen op :timeDiff.', 'pages_draft_edited_notification' => 'Deze pagina is sindsdien bijgewerkt. Het wordt aanbevolen dat u dit concept verwijderd.', 'pages_draft_edit_active' => [ diff --git a/resources/lang/pt/common.php b/resources/lang/pt/common.php index bc76d7753..4b9687b5e 100644 --- a/resources/lang/pt/common.php +++ b/resources/lang/pt/common.php @@ -74,9 +74,9 @@ return [ // Layout tabs 'tab_info' => 'Informações', - 'tab_info_label' => 'Tab: Show Secondary Information', + 'tab_info_label' => 'Separador: Mostrar Informação Secundária', 'tab_content' => 'Conteúdo', - 'tab_content_label' => 'Tab: Show Primary Content', + 'tab_content_label' => 'Separador: Mostrar Conteúdo Primário', // Email Content 'email_action_help' => 'Se estiver com problemas ao carregar no botão ":actionText", copie e cole o URL abaixo no seu navegador:', diff --git a/resources/sass/_buttons.scss b/resources/sass/_buttons.scss index bd7609052..850443d9a 100644 --- a/resources/sass/_buttons.scss +++ b/resources/sass/_buttons.scss @@ -117,6 +117,7 @@ button { align-items: center; padding: $-s $-m; padding-bottom: ($-s - 2px); + width: 100%; svg { display: inline-block; width: 24px; diff --git a/resources/sass/_header.scss b/resources/sass/_header.scss index 12f098a1b..1a7015078 100644 --- a/resources/sass/_header.scss +++ b/resources/sass/_header.scss @@ -228,6 +228,7 @@ header .search-box { text-align: center; border-bottom: 3px solid #BBB; cursor: pointer; + margin: 0; @include lightDark(background-color, #FFF, #222); @include lightDark(border-bottom-color, #BBB, #333); &:first-child { diff --git a/resources/sass/export-styles.scss b/resources/sass/export-styles.scss index 278e5b6c5..b8682ed05 100644 --- a/resources/sass/export-styles.scss +++ b/resources/sass/export-styles.scss @@ -1,16 +1,13 @@ @import "variables"; @import "mixins"; -@import "spacing"; @import "html"; @import "text"; @import "layout"; @import "blocks"; @import "tables"; -@import "header"; @import "lists"; @import "pages"; - html, body { background-color: #FFF; } @@ -40,4 +37,25 @@ pre:after { } pre code { white-space: pre-wrap; +} + +.page-break { + page-break-after: always; +} +@media screen { + .page-break { + border-top: 1px solid #DDD; + } +} + +ul.contents ul li { + list-style: circle; +} + +.chapter-hint { + color: #888; + margin-top: 32px; +} +.chapter-hint + h1 { + margin-top: 0; } \ No newline at end of file diff --git a/resources/views/auth/forms/login/saml2.blade.php b/resources/views/auth/forms/login/saml2.blade.php index 7d6595894..1afd2d9bb 100644 --- a/resources/views/auth/forms/login/saml2.blade.php +++ b/resources/views/auth/forms/login/saml2.blade.php @@ -2,7 +2,7 @@ {!! csrf_field() !!}
- diff --git a/resources/views/books/export.blade.php b/resources/views/books/export.blade.php index f62b89582..9cd5618a5 100644 --- a/resources/views/books/export.blade.php +++ b/resources/views/books/export.blade.php @@ -1,38 +1,8 @@ - - - - - {{ $book->name }} +@extends('export-layout') - @include('partials.export-styles', ['format' => $format]) - - - @yield('head') - @include('partials.custom-head') - - - -
+@section('title', $book->name) +@section('content')

{{$book->name}}

{{ $book->description }}

@@ -73,8 +43,4 @@ @endif @endforeach - -
- - - +@endsection \ No newline at end of file diff --git a/resources/views/chapters/export.blade.php b/resources/views/chapters/export.blade.php index 506e8db3d..18f056f27 100644 --- a/resources/views/chapters/export.blade.php +++ b/resources/views/chapters/export.blade.php @@ -1,30 +1,8 @@ - - - - - {{ $chapter->name }} +@extends('export-layout') - @include('partials.export-styles', ['format' => $format]) - - - @include('partials.custom-head') - - - -
+@section('title', $chapter->name) +@section('content')

{{$chapter->name}}

{{ $chapter->description }}

@@ -42,8 +20,4 @@

{{ $page->name }}

{!! $page->html !!} @endforeach - -
- - - +@endsection \ No newline at end of file diff --git a/resources/views/errors/404.blade.php b/resources/views/errors/404.blade.php index 02f97fc54..b3325ba82 100644 --- a/resources/views/errors/404.blade.php +++ b/resources/views/errors/404.blade.php @@ -7,8 +7,8 @@

{{ $message ?? trans('errors.404_page_not_found') }}

-
{{ trans('errors.sorry_page_not_found') }}
-

{{ trans('errors.sorry_page_not_found_permission_warning') }}

+
{{ $subtitle ?? trans('errors.sorry_page_not_found') }}
+

{{ $details ?? trans('errors.sorry_page_not_found_permission_warning') }}

@if(!signedInUser()) diff --git a/resources/views/export-layout.blade.php b/resources/views/export-layout.blade.php new file mode 100644 index 000000000..f23b3cca5 --- /dev/null +++ b/resources/views/export-layout.blade.php @@ -0,0 +1,15 @@ + + + + + @yield('title') + + @include('partials.export-styles', ['format' => $format]) + @include('partials.export-custom-head') + + +
+ @yield('content') +
+ + \ No newline at end of file diff --git a/resources/views/pages/export.blade.php b/resources/views/pages/export.blade.php index 47a4d870a..74d17c128 100644 --- a/resources/views/pages/export.blade.php +++ b/resources/views/pages/export.blade.php @@ -1,51 +1,13 @@ - - - - - {{ $page->name }} +@extends('export-layout') - @include('partials.export-styles', ['format' => $format]) +@section('title', $page->name) - @if($format === 'pdf') - - @endif - - @include('partials.custom-head') - - - -
-
- - @include('pages.page-display') - -
- -
- @include('partials.entity-export-meta', ['entity' => $page]) -
+
+
+ @include('partials.entity-export-meta', ['entity' => $page])
-
- - - +@endsection \ No newline at end of file diff --git a/resources/views/partials/custom-head-content.blade.php b/resources/views/partials/custom-head-content.blade.php deleted file mode 100644 index b245b7ad6..000000000 --- a/resources/views/partials/custom-head-content.blade.php +++ /dev/null @@ -1,5 +0,0 @@ -@if(setting('app-custom-head', false)) - - {!! setting('app-custom-head') !!} - -@endif \ No newline at end of file diff --git a/resources/views/partials/custom-head.blade.php b/resources/views/partials/custom-head.blade.php index dd7cc41e4..fa5ba0cc4 100644 --- a/resources/views/partials/custom-head.blade.php +++ b/resources/views/partials/custom-head.blade.php @@ -1,5 +1,5 @@ @if(setting('app-custom-head') && \Route::currentRouteName() !== 'settings') - - {!! setting('app-custom-head') !!} - + +{!! setting('app-custom-head') !!} + @endif \ No newline at end of file diff --git a/resources/views/partials/entity-export-meta.blade.php b/resources/views/partials/entity-export-meta.blade.php index a84d0ae85..32b26750e 100644 --- a/resources/views/partials/entity-export-meta.blade.php +++ b/resources/views/partials/entity-export-meta.blade.php @@ -5,12 +5,12 @@ @icon('star'){!! trans('entities.meta_created' . ($entity->createdBy ? '_name' : ''), [ 'timeLength' => $entity->created_at->toDayDateTimeString(), - 'user' => htmlentities($entity->createdBy->name), + 'user' => e($entity->createdBy->name ?? ''), ]) !!}
@icon('edit'){!! trans('entities.meta_updated' . ($entity->updatedBy ? '_name' : ''), [ 'timeLength' => $entity->updated_at->toDayDateTimeString(), - 'user' => htmlentities($entity->updatedBy->name) + 'user' => e($entity->updatedBy->name ?? '') ]) !!}
\ No newline at end of file diff --git a/resources/views/partials/export-custom-head.blade.php b/resources/views/partials/export-custom-head.blade.php new file mode 100644 index 000000000..f428e9fe9 --- /dev/null +++ b/resources/views/partials/export-custom-head.blade.php @@ -0,0 +1,5 @@ +@if(setting('app-custom-head')) + +{!! \BookStack\Util\HtmlContentFilter::removeScripts(setting('app-custom-head')) !!} + +@endif \ No newline at end of file diff --git a/resources/views/partials/export-styles.blade.php b/resources/views/partials/export-styles.blade.php index 52bfda2a6..967dc19ec 100644 --- a/resources/views/partials/export-styles.blade.php +++ b/resources/views/partials/export-styles.blade.php @@ -6,6 +6,27 @@ @if ($format === 'pdf') '); + + foreach ($entities as $entity) { + $resp = $this->asEditor()->get($entity->getUrl('/export/html')); + $resp->assertDontSee('window.donkey'); + $resp->assertDontSee('script'); + $resp->assertSee('.my-test-class { color: red; }'); + } + } + + public function test_page_export_with_deleted_creator_and_updater() + { + $user = $this->getViewer(['name' => 'ExportWizardTheFifth']); + $page = Page::first(); + $page->created_by = $user->id; + $page->updated_by = $user->id; + $page->save(); + + $resp = $this->asEditor()->get($page->getUrl('/export/html')); + $resp->assertSee('ExportWizardTheFifth'); + + $user->delete(); + $resp = $this->get($page->getUrl('/export/html')); + $resp->assertStatus(200); + $resp->assertDontSee('ExportWizardTheFifth'); + } + } diff --git a/tests/ErrorTest.php b/tests/ErrorTest.php index 1558df78d..6b69355fc 100644 --- a/tests/ErrorTest.php +++ b/tests/ErrorTest.php @@ -38,4 +38,11 @@ class ErrorTest extends TestCase $this->assertCount(1, $handler->getRecords()); } + + public function test_access_to_non_existing_image_location_provides_404_response() + { + $resp = $this->actingAs($this->getViewer())->get('/uploads/images/gallery/2021-05/anonexistingimage.png'); + $resp->assertStatus(404); + $resp->assertSeeText('Image Not Found'); + } } \ No newline at end of file diff --git a/tests/Unit/ConfigTest.php b/tests/Unit/ConfigTest.php index 1d4decc2b..0833ffbd8 100644 --- a/tests/Unit/ConfigTest.php +++ b/tests/Unit/ConfigTest.php @@ -67,12 +67,23 @@ class ConfigTest extends TestCase $this->checkEnvConfigResult('APP_URL', '', 'session.path', '/'); } + public function test_saml2_idp_authn_context_string_parsed_as_space_separated_array() + { + $this->checkEnvConfigResult( + 'SAML2_IDP_AUTHNCONTEXT', + 'urn:federation:authentication:windows urn:federation:authentication:linux', + 'saml2.onelogin.security.requestedAuthnContext', + ['urn:federation:authentication:windows', 'urn:federation:authentication:linux'] + ); + } + /** * Set an environment variable of the given name and value * then check the given config key to see if it matches the given result. * Providing a null $envVal clears the variable. + * @param mixed $expectedResult */ - protected function checkEnvConfigResult(string $envName, ?string $envVal, string $configKey, string $expectedResult) + protected function checkEnvConfigResult(string $envName, ?string $envVal, string $configKey, $expectedResult) { $this->runWithEnv($envName, $envVal, function() use ($configKey, $expectedResult) { $this->assertEquals($expectedResult, config($configKey));