diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/AbstractConfigCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/AbstractConfigCommand.php index fe0d60b555..c038133975 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/AbstractConfigCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/AbstractConfigCommand.php @@ -14,6 +14,7 @@ namespace Symfony\Bundle\FrameworkBundle\Command; use Symfony\Component\Config\Definition\ConfigurationInterface; use Symfony\Component\Console\Exception\LogicException; use Symfony\Component\Console\Helper\Table; +use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\StyleInterface; use Symfony\Component\DependencyInjection\Extension\ExtensionInterface; @@ -26,6 +27,9 @@ use Symfony\Component\DependencyInjection\Extension\ExtensionInterface; */ abstract class AbstractConfigCommand extends ContainerDebugCommand { + /** + * @param OutputInterface|StyleInterface $output + */ protected function listBundles($output) { $title = 'Available registered bundles with their extension alias if available'; diff --git a/src/Symfony/Component/BrowserKit/CookieJar.php b/src/Symfony/Component/BrowserKit/CookieJar.php index 76aeb680b3..4b64c702ae 100644 --- a/src/Symfony/Component/BrowserKit/CookieJar.php +++ b/src/Symfony/Component/BrowserKit/CookieJar.php @@ -111,8 +111,8 @@ class CookieJar /** * Updates the cookie jar from a response Set-Cookie headers. * - * @param array $setCookies Set-Cookie headers from an HTTP response - * @param string $uri The base URL + * @param string[] $setCookies Set-Cookie headers from an HTTP response + * @param string $uri The base URL */ public function updateFromSetCookie(array $setCookies, $uri = null) { diff --git a/src/Symfony/Component/Cache/Tests/Adapter/PredisAdapterTest.php b/src/Symfony/Component/Cache/Tests/Adapter/PredisAdapterTest.php index 1408e5eec7..9ced661bfb 100644 --- a/src/Symfony/Component/Cache/Tests/Adapter/PredisAdapterTest.php +++ b/src/Symfony/Component/Cache/Tests/Adapter/PredisAdapterTest.php @@ -34,7 +34,7 @@ class PredisAdapterTest extends AbstractRedisAdapterTest $params = [ 'scheme' => 'tcp', - 'host' => 'localhost', + 'host' => $redisHost, 'port' => 6379, 'persistent' => 0, 'timeout' => 3, diff --git a/src/Symfony/Component/Console/Tester/TesterTrait.php b/src/Symfony/Component/Console/Tester/TesterTrait.php index 5b7e993a83..c6bd6503a9 100644 --- a/src/Symfony/Component/Console/Tester/TesterTrait.php +++ b/src/Symfony/Component/Console/Tester/TesterTrait.php @@ -110,7 +110,7 @@ trait TesterTrait * @param array $inputs An array of strings representing each input * passed to the command input stream * - * @return self + * @return $this */ public function setInputs(array $inputs) { diff --git a/src/Symfony/Component/DependencyInjection/ChildDefinition.php b/src/Symfony/Component/DependencyInjection/ChildDefinition.php index f80fa3e8e3..e58620dcb5 100644 --- a/src/Symfony/Component/DependencyInjection/ChildDefinition.php +++ b/src/Symfony/Component/DependencyInjection/ChildDefinition.php @@ -89,7 +89,7 @@ class ChildDefinition extends Definition * @param int|string $index * @param mixed $value * - * @return self the current instance + * @return $this * * @throws InvalidArgumentException when $index isn't an integer */ diff --git a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php index d88d23c21a..dd1581dc04 100644 --- a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php +++ b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php @@ -1208,7 +1208,6 @@ EOF; if (!$id->isDeprecated()) { continue; } - $id = (string) $id; $code .= ' '.$this->doExport($alias).' => '.$this->doExport($this->generateMethodName($alias)).",\n"; } diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Http/Api/SendgridTransportTest.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Http/Api/SendgridTransportTest.php new file mode 100644 index 0000000000..e6cb1a9718 --- /dev/null +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Http/Api/SendgridTransportTest.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mailer\Bridge\Sendgrid\Tests\Http\Api; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Mailer\Bridge\Sendgrid\Http\Api\SendgridTransport; +use Symfony\Component\Mime\Email; +use Symfony\Contracts\HttpClient\HttpClientInterface; +use Symfony\Contracts\HttpClient\ResponseInterface; + +class SendgridTransportTest extends TestCase +{ + public function testSend() + { + $email = new Email(); + $email->from('foo@example.com') + ->to('bar@example.com') + ->bcc('baz@example.com'); + + $response = $this->createMock(ResponseInterface::class); + + $response + ->expects($this->once()) + ->method('getStatusCode') + ->willReturn(202); + + $httpClient = $this->createMock(HttpClientInterface::class); + + $httpClient + ->expects($this->once()) + ->method('request') + ->with('POST', 'https://api.sendgrid.com/v3/mail/send', [ + 'json' => [ + 'personalizations' => [ + [ + 'to' => [['email' => 'bar@example.com']], + 'subject' => null, + 'bcc' => [['email' => 'baz@example.com']], + ], + ], + 'from' => ['email' => 'foo@example.com'], + 'content' => [], + ], + 'auth_bearer' => 'foo', + ]) + ->willReturn($response); + + $mailer = new SendgridTransport('foo', $httpClient); + + $mailer->send($email); + } +} diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php index 0da12690fd..a881df3f84 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php @@ -73,7 +73,7 @@ class SendgridApiTransport extends AbstractApiTransport } $personalization = [ - 'to' => array_map($addressStringifier, $this->getRecipients($email, $envelope)), + 'to' => array_map($addressStringifier, $email->getTo()), 'subject' => $email->getSubject(), ]; if ($emails = array_map($addressStringifier, $email->getCc())) { diff --git a/src/Symfony/Component/Messenger/Middleware/DispatchAfterCurrentBusMiddleware.php b/src/Symfony/Component/Messenger/Middleware/DispatchAfterCurrentBusMiddleware.php index 19c714d1b8..05ee86ffeb 100644 --- a/src/Symfony/Component/Messenger/Middleware/DispatchAfterCurrentBusMiddleware.php +++ b/src/Symfony/Component/Messenger/Middleware/DispatchAfterCurrentBusMiddleware.php @@ -81,12 +81,16 @@ class DispatchAfterCurrentBusMiddleware implements MiddlewareInterface // "Root dispatch" call is finished, dispatch stored messages. $exceptions = []; while (null !== $queueItem = array_shift($this->queue)) { + // Save how many messages are left in queue before handling the message + $queueLengthBefore = \count($this->queue); try { // Execute the stored messages $queueItem->getStack()->next()->handle($queueItem->getEnvelope(), $queueItem->getStack()); } catch (\Exception $exception) { // Gather all exceptions $exceptions[] = $exception; + // Restore queue to previous state + $this->queue = \array_slice($this->queue, 0, $queueLengthBefore); } } diff --git a/src/Symfony/Component/Messenger/Tests/Middleware/DispatchAfterCurrentBusMiddlewareTest.php b/src/Symfony/Component/Messenger/Tests/Middleware/DispatchAfterCurrentBusMiddlewareTest.php index fe6d190c10..3054429e29 100644 --- a/src/Symfony/Component/Messenger/Tests/Middleware/DispatchAfterCurrentBusMiddlewareTest.php +++ b/src/Symfony/Component/Messenger/Tests/Middleware/DispatchAfterCurrentBusMiddlewareTest.php @@ -99,6 +99,86 @@ class DispatchAfterCurrentBusMiddlewareTest extends TestCase $messageBus->dispatch($message); } + public function testLongChainWithExceptions() + { + $command = new DummyMessage('Level 0'); + + $eventL1a = new DummyEvent('Event level 1A'); + $eventL1b = new DummyEvent('Event level 1B'); // will dispatch 2 more events + $eventL1c = new DummyEvent('Event level 1C'); + + $eventL2a = new DummyEvent('Event level 2A'); // Will dispatch 1 event and throw exception + $eventL2b = new DummyEvent('Event level 2B'); // Will dispatch 1 event + + $eventL3a = new DummyEvent('Event level 3A'); // This should never get handled. + $eventL3b = new DummyEvent('Event level 3B'); + + $middleware = new DispatchAfterCurrentBusMiddleware(); + $handlingMiddleware = $this->createMock(MiddlewareInterface::class); + + $eventBus = new MessageBus([ + $middleware, + $handlingMiddleware, + ]); + + // The command bus will dispatch 3 events. + $commandBus = new MessageBus([ + $middleware, + new DispatchingMiddleware($eventBus, [ + new Envelope($eventL1a, [new DispatchAfterCurrentBusStamp()]), + new Envelope($eventL1b, [new DispatchAfterCurrentBusStamp()]), + new Envelope($eventL1c, [new DispatchAfterCurrentBusStamp()]), + ]), + $handlingMiddleware, + ]); + + // Expect main dispatched message to be handled first: + $this->expectHandledMessage($handlingMiddleware, 0, $command); + + $this->expectHandledMessage($handlingMiddleware, 1, $eventL1a); + + // Handling $eventL1b will dispatch 2 more events + $handlingMiddleware->expects($this->at(2))->method('handle')->with($this->callback(function (Envelope $envelope) use ($eventL1b) { + return $envelope->getMessage() === $eventL1b; + }))->willReturnCallback(function ($envelope, StackInterface $stack) use ($eventBus, $eventL2a, $eventL2b) { + $envelope1 = new Envelope($eventL2a, [new DispatchAfterCurrentBusStamp()]); + $eventBus->dispatch($envelope1); + $eventBus->dispatch(new Envelope($eventL2b, [new DispatchAfterCurrentBusStamp()])); + + return $stack->next()->handle($envelope, $stack); + }); + + $this->expectHandledMessage($handlingMiddleware, 3, $eventL1c); + + // Handle $eventL2a will dispatch event and throw exception + $handlingMiddleware->expects($this->at(4))->method('handle')->with($this->callback(function (Envelope $envelope) use ($eventL2a) { + return $envelope->getMessage() === $eventL2a; + }))->willReturnCallback(function ($envelope, StackInterface $stack) use ($eventBus, $eventL3a) { + $eventBus->dispatch(new Envelope($eventL3a, [new DispatchAfterCurrentBusStamp()])); + + throw new \RuntimeException('Some exception while handling Event level 2a'); + }); + + // Make sure $eventL2b is handled, since it was dispatched from $eventL1b + $handlingMiddleware->expects($this->at(5))->method('handle')->with($this->callback(function (Envelope $envelope) use ($eventL2b) { + return $envelope->getMessage() === $eventL2b; + }))->willReturnCallback(function ($envelope, StackInterface $stack) use ($eventBus, $eventL3b) { + $eventBus->dispatch(new Envelope($eventL3b, [new DispatchAfterCurrentBusStamp()])); + + return $stack->next()->handle($envelope, $stack); + }); + + // We dont handle exception L3a since L2a threw an exception. + $this->expectHandledMessage($handlingMiddleware, 6, $eventL3b); + + // Note: $eventL3a should not be handled. + + $this->expectException(DelayedMessageHandlingException::class); + $this->expectExceptionMessage('RuntimeException: Some exception while handling Event level 2a'); + + $commandBus->dispatch($command); + } + public function testHandleDelayedEventFromQueue() { $message = new DummyMessage('Hello'); diff --git a/src/Symfony/Component/Messenger/Tests/Transport/AmqpExt/ConnectionTest.php b/src/Symfony/Component/Messenger/Tests/Transport/AmqpExt/ConnectionTest.php index 43cce8a740..867e5d4d94 100644 --- a/src/Symfony/Component/Messenger/Tests/Transport/AmqpExt/ConnectionTest.php +++ b/src/Symfony/Component/Messenger/Tests/Transport/AmqpExt/ConnectionTest.php @@ -364,7 +364,7 @@ class ConnectionTest extends TestCase $amqpQueue->expects($this->once())->method('setName')->with(self::DEFAULT_EXCHANGE_NAME); $amqpQueue->expects($this->once())->method('declareQueue'); - $delayExchange->expects($this->once())->method('setName')->with('delay'); + $delayExchange->expects($this->once())->method('setName')->with('delays'); $delayExchange->expects($this->once())->method('declareExchange'); $delayExchange->expects($this->once())->method('publish'); @@ -398,7 +398,7 @@ class ConnectionTest extends TestCase ]); $delayQueue->expects($this->once())->method('declareQueue'); - $delayQueue->expects($this->once())->method('bind')->with('delay', 'delay_messages__5000'); + $delayQueue->expects($this->once())->method('bind')->with('delays', 'delay_messages__5000'); $delayExchange->expects($this->once())->method('publish')->with('{}', 'delay_messages__5000', AMQP_NOPARAM, ['headers' => ['x-some-headers' => 'foo']]); @@ -440,7 +440,7 @@ class ConnectionTest extends TestCase ]); $delayQueue->expects($this->once())->method('declareQueue'); - $delayQueue->expects($this->once())->method('bind')->with('delay', 'delay_messages__120000'); + $delayQueue->expects($this->once())->method('bind')->with('delays', 'delay_messages__120000'); $delayExchange->expects($this->once())->method('publish')->with('{}', 'delay_messages__120000', AMQP_NOPARAM, ['headers' => []]); $connection->publish('{}', [], 120000); @@ -544,7 +544,7 @@ class ConnectionTest extends TestCase ]); $delayQueue->expects($this->once())->method('declareQueue'); - $delayQueue->expects($this->once())->method('bind')->with('delay', 'delay_messages_routing_key_120000'); + $delayQueue->expects($this->once())->method('bind')->with('delays', 'delay_messages_routing_key_120000'); $delayExchange->expects($this->once())->method('publish')->with('{}', 'delay_messages_routing_key_120000', AMQP_NOPARAM, ['headers' => []]); $connection->publish('{}', [], 120000, new AmqpStamp('routing_key')); diff --git a/src/Symfony/Component/Messenger/Transport/AmqpExt/Connection.php b/src/Symfony/Component/Messenger/Transport/AmqpExt/Connection.php index fb51b57cfc..6a37215242 100644 --- a/src/Symfony/Component/Messenger/Transport/AmqpExt/Connection.php +++ b/src/Symfony/Component/Messenger/Transport/AmqpExt/Connection.php @@ -60,7 +60,7 @@ class Connection { $this->connectionOptions = array_replace_recursive([ 'delay' => [ - 'exchange_name' => 'delay', + 'exchange_name' => 'delays', 'queue_name_pattern' => 'delay_%exchange_name%_%routing_key%_%delay%', ], ], $connectionOptions); @@ -92,7 +92,7 @@ class Connection * * arguments: Extra arguments * * delay: * * queue_name_pattern: Pattern to use to create the queues (Default: "delay_%exchange_name%_%routing_key%_%delay%") - * * exchange_name: Name of the exchange to be used for the delayed/retried messages (Default: "delay") + * * exchange_name: Name of the exchange to be used for the delayed/retried messages (Default: "delays") * * auto_setup: Enable or not the auto-setup of queues and exchanges (Default: true) * * prefetch_count: set channel prefetch count */ @@ -251,6 +251,11 @@ class Connection $this->amqpDelayExchange = $this->amqpFactory->createExchange($this->channel()); $this->amqpDelayExchange->setName($this->connectionOptions['delay']['exchange_name']); $this->amqpDelayExchange->setType(AMQP_EX_TYPE_DIRECT); + if ('delays' === $this->connectionOptions['delay']['exchange_name']) { + // only add the new flag when the name was not provided explicitly so we're using the new default name to prevent a redeclaration error + // the condition will be removed in 4.4 + $this->amqpDelayExchange->setFlags(AMQP_DURABLE); + } } return $this->amqpDelayExchange; @@ -273,16 +278,24 @@ class Connection [$delay, $this->exchangeOptions['name'], $routingKey ?? ''], $this->connectionOptions['delay']['queue_name_pattern'] )); + if ('delay_%exchange_name%_%routing_key%_%delay%' === $this->connectionOptions['delay']['queue_name_pattern']) { + // the condition will be removed in 4.4 + $queue->setFlags(AMQP_DURABLE); + $extraArguments = [ + // delete the delay queue 10 seconds after the message expires + // publishing another message redeclares the queue which renews the lease + 'x-expires' => $delay + 10000, + ]; + } else { + $extraArguments = []; + } $queue->setArguments([ 'x-message-ttl' => $delay, - // delete the delay queue 10 seconds after the message expires - // publishing another message redeclares the queue which renews the lease - 'x-expires' => $delay + 10000, 'x-dead-letter-exchange' => $this->exchangeOptions['name'], // after being released from to DLX, make sure the original routing key will be used // we must use an empty string instead of null for the argument to be picked up 'x-dead-letter-routing-key' => $routingKey ?? '', - ]); + ] + $extraArguments); return $queue; } diff --git a/src/Symfony/Component/Process/Process.php b/src/Symfony/Component/Process/Process.php index ca9d34424c..5a3cdd58b1 100644 --- a/src/Symfony/Component/Process/Process.php +++ b/src/Symfony/Component/Process/Process.php @@ -186,6 +186,8 @@ class Process implements \IteratorAggregate * @param mixed|null $input The input as stream resource, scalar or \Traversable, or null for no input * @param int|float|null $timeout The timeout in seconds or null to disable * + * @return static + * * @throws RuntimeException When proc_open is not installed */ public static function fromShellCommandline(string $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60) @@ -240,7 +242,7 @@ class Process implements \IteratorAggregate * This is identical to run() except that an exception is thrown if the process * exits with a non-zero exit code. * - * @return self + * @return $this * * @throws ProcessFailedException if the process didn't terminate successfully * @@ -967,7 +969,7 @@ class Process implements \IteratorAggregate * * @param string|array $commandline The command to execute * - * @return self The current Process instance + * @return $this * * @deprecated since Symfony 4.2. */ @@ -1001,13 +1003,13 @@ class Process implements \IteratorAggregate } /** - * Sets the process timeout (max. runtime). + * Sets the process timeout (max. runtime) in seconds. * * To disable the timeout, set this value to null. * * @param int|float|null $timeout The timeout in seconds * - * @return self The current Process instance + * @return $this * * @throws InvalidArgumentException if the timeout is negative */ @@ -1025,7 +1027,7 @@ class Process implements \IteratorAggregate * * @param int|float|null $timeout The timeout in seconds * - * @return self The current Process instance + * @return $this * * @throws LogicException if the output is disabled * @throws InvalidArgumentException if the timeout is negative @@ -1046,7 +1048,7 @@ class Process implements \IteratorAggregate * * @param bool $tty True to enabled and false to disable * - * @return self The current Process instance + * @return $this * * @throws RuntimeException In case the TTY mode is not supported */ @@ -1080,7 +1082,7 @@ class Process implements \IteratorAggregate * * @param bool $bool * - * @return self + * @return $this */ public function setPty($bool) { @@ -1120,7 +1122,7 @@ class Process implements \IteratorAggregate * * @param string $cwd The new working directory * - * @return self The current Process instance + * @return $this */ public function setWorkingDirectory($cwd) { @@ -1152,7 +1154,7 @@ class Process implements \IteratorAggregate * * @param array $env The new environment variables * - * @return self The current Process instance + * @return $this */ public function setEnv(array $env) { @@ -1183,7 +1185,7 @@ class Process implements \IteratorAggregate * * @param string|int|float|bool|resource|\Traversable|null $input The content * - * @return self The current Process instance + * @return $this * * @throws LogicException In case the process is running */ @@ -1203,7 +1205,7 @@ class Process implements \IteratorAggregate * * @param bool $inheritEnv * - * @return self The current Process instance + * @return $this * * @deprecated since Symfony 4.4, env variables are always inherited */ diff --git a/src/Symfony/Component/Routing/Loader/AnnotationClassLoader.php b/src/Symfony/Component/Routing/Loader/AnnotationClassLoader.php index ff8b2c08c3..6390a79f58 100644 --- a/src/Symfony/Component/Routing/Loader/AnnotationClassLoader.php +++ b/src/Symfony/Component/Routing/Loader/AnnotationClassLoader.php @@ -15,6 +15,7 @@ use Doctrine\Common\Annotations\Reader; use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\Config\Loader\LoaderResolverInterface; use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\Routing\Annotation\Route as RouteAnnotation; use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; @@ -129,6 +130,10 @@ abstract class AnnotationClassLoader implements LoaderInterface return $collection; } + /** + * @param RouteAnnotation $annot or an object that exposes a similar interface + * @param array $globals + */ protected function addRoute(RouteCollection $collection, $annot, $globals, \ReflectionClass $class, \ReflectionMethod $method) { $name = $annot->getName(); diff --git a/src/Symfony/Component/Security/Http/Logout/LogoutUrlGenerator.php b/src/Symfony/Component/Security/Http/Logout/LogoutUrlGenerator.php index f66f558ebe..2d032cf388 100644 --- a/src/Symfony/Component/Security/Http/Logout/LogoutUrlGenerator.php +++ b/src/Symfony/Component/Security/Http/Logout/LogoutUrlGenerator.php @@ -43,8 +43,8 @@ class LogoutUrlGenerator * * @param string $key The firewall key * @param string $logoutPath The path that starts the logout process - * @param string $csrfTokenId The ID of the CSRF token - * @param string $csrfParameter The CSRF token parameter name + * @param string|null $csrfTokenId The ID of the CSRF token + * @param string|null $csrfParameter The CSRF token parameter name * @param string|null $context The listener context */ public function registerListener($key, $logoutPath, $csrfTokenId, $csrfParameter, CsrfTokenManagerInterface $csrfTokenManager = null, string $context = null) diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.hy.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.hy.xlf index bc0daced86..b005518f35 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.hy.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.hy.xlf @@ -314,6 +314,58 @@ This is not a valid Business Identifier Code (BIC). Սա վավեր Business Identifier Code (BIC) չէ։ + + Error + Սխալ + + + This is not a valid UUID. + Սա վավեր UUID չէ: + + + This value should be a multiple of {{ compared_value }}. + Այս արժեքը պետք է լինի բազմակի {{ compared_value }}. + + + This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}. + Բիզնեսի նույնականացման կոդը (BIC) կապված չէ IBAN- ի հետ {{ iban }}. + + + This value should be valid JSON. + Այս արժեքը պետք է լինի վավեր JSON: + + + This collection should contain only unique elements. + Այս հավաքածուն պետք է պարունակի միայն եզակի տարրեր: + + + This value should be positive. + Այս արժեքը պետք է լինի դրական: + + + This value should be either positive or zero. + Այս արժեքը պետք է լինի դրական կամ զրոյական: + + + This value should be negative. + Այս արժեքը պետք է լինի բացասական: + + + This value should be either negative or zero. + Այս արժեքը պետք է լինի բացասական կամ զրոյական: + + + This value is not a valid timezone. + Այս արժեքը վավեր ժամանակի գոտի չէ: + + + This password has been leaked in a data breach, it must not be used. Please use another password. + Այս գաղտնաբառն արտահոսվել է տվյալների խախտման մեջ, այն չպետք է օգտագործվի: Խնդրում ենք օգտագործել մեկ այլ գաղտնաբառ: + + + This value should be between {{ min }} and {{ max }}. + Այս արժեքը պետք է լինի միջև {{ min }} և {{ max }}. +