Composer Workspace global packages
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
#[Attribute(Attribute::TARGET_CLASS)]
|
||||
final class AllowDynamicProperties
|
||||
{
|
||||
public function __construct() {}
|
||||
}
|
||||
|
||||
#[Attribute(Attribute::TARGET_PARAMETER)]
|
||||
final class SensitiveParameter
|
||||
{
|
||||
public function __construct() {}
|
||||
}
|
||||
@@ -586,7 +586,6 @@ class DateInterval
|
||||
/**
|
||||
* Is 1 if the interval is inverted and 0 otherwise
|
||||
* @var int
|
||||
* @readonly
|
||||
*/
|
||||
public $invert;
|
||||
|
||||
|
||||
+113
-32
@@ -399,10 +399,10 @@ function array_fill_keys(array $keys, $value): array
|
||||
*
|
||||
* @psalm-template TKey
|
||||
*
|
||||
* @param string $pattern
|
||||
* @param array<TKey,string> $array
|
||||
* @param non-empty-string $pattern
|
||||
* @param array<TKey, string> $array
|
||||
* @param 0|1 $flags 1=PREG_GREP_INVERT
|
||||
* @return array<TKey,string>
|
||||
* @return array<TKey, string>
|
||||
*/
|
||||
function preg_grep($pattern, array $array, $flags = 0)
|
||||
{
|
||||
@@ -619,7 +619,7 @@ function strtoupper(string $string) : string {}
|
||||
* @param int|array<int> $offset
|
||||
* @param null|int|array<int> $length
|
||||
*
|
||||
* @return ($string is array<string> ? array<string> : string)
|
||||
* @return ($string is array ? array<string> : string)
|
||||
*
|
||||
* @psalm-flow ($string, $replace) -> return
|
||||
*/
|
||||
@@ -786,6 +786,8 @@ function explode(string $separator, string $string, int $limit = -1) : array {}
|
||||
/**
|
||||
* @psalm-pure
|
||||
*
|
||||
* @param non-empty-string $pattern
|
||||
*
|
||||
* @psalm-flow ($subject) -(array-assignment)-> return
|
||||
*
|
||||
* @template TFlags as int-mask<0, 1, 2, 4>
|
||||
@@ -998,11 +1000,13 @@ function strlen(string $string) : int {}
|
||||
/**
|
||||
* @psalm-pure
|
||||
*
|
||||
* @template TKey of array-key
|
||||
*
|
||||
* @param string|array<string|int|float> $search
|
||||
* @param string|array<string|int|float> $replace
|
||||
* @param string|array<string|int|float> $subject
|
||||
* @param int $count
|
||||
* @return ($subject is array ? array<string> : string)
|
||||
* @param string|array<TKey, string|int|float> $subject
|
||||
* @param int<0, max> $count
|
||||
* @return ($subject is array ? array<TKey, string> : string)
|
||||
*
|
||||
* @psalm-flow ($replace, $subject) -> return
|
||||
*/
|
||||
@@ -1011,11 +1015,13 @@ function str_replace($search, $replace, $subject, &$count = null) {}
|
||||
/**
|
||||
* @psalm-pure
|
||||
*
|
||||
* @template TKey of array-key
|
||||
*
|
||||
* @param string|array<string|int|float> $search
|
||||
* @param string|array<string|int|float> $replace
|
||||
* @param string|array<string|int|float> $subject
|
||||
* @param int $count
|
||||
* @return ($subject is array ? array<string> : string)
|
||||
* @param string|array<TKey, string|int|float> $subject
|
||||
* @param int<0, max> $count
|
||||
* @return ($subject is array ? array<TKey, string> : string)
|
||||
*
|
||||
* @psalm-flow ($replace, $subject) -> return
|
||||
*/
|
||||
@@ -1169,10 +1175,10 @@ function str_word_count(string $string, int $format = 0, string|null $characters
|
||||
/**
|
||||
* @psalm-pure
|
||||
*
|
||||
* @param string|string[] $pattern
|
||||
* @param non-empty-string|non-empty-string[] $pattern
|
||||
* @param string|array<string|int|float> $replacement
|
||||
* @param string|array<string|int|float> $subject
|
||||
* @param int $count
|
||||
* @param int<0, max> $count
|
||||
* @return ($subject is array ? array<string> : string|null)
|
||||
*
|
||||
* @psalm-flow ($replacement, $subject) -> return
|
||||
@@ -1182,22 +1188,30 @@ function preg_filter($pattern, $replacement, $subject, int $limit = -1, &$count
|
||||
/**
|
||||
* @psalm-pure
|
||||
*
|
||||
* @param string|string[] $pattern
|
||||
* @template TKey of array-key
|
||||
*
|
||||
* @param non-empty-string|non-empty-string[] $pattern
|
||||
* @param string|array<string|int|float> $replacement
|
||||
* @param string|array<string|int|float> $subject
|
||||
* @param int $count
|
||||
* @return ($subject is array ? array<string>|null : string|null)
|
||||
* @param string|array<TKey, string|int|float> $subject
|
||||
* @param int<0, max> $count
|
||||
* @return ($subject is array ? array<TKey, string>|null : string|null)
|
||||
*
|
||||
* @psalm-ignore-nullable-return
|
||||
*
|
||||
* @psalm-flow ($replacement, $subject) -> return
|
||||
*/
|
||||
function preg_replace($pattern, $replacement, $subject, int $limit = -1, &$count = null) {}
|
||||
|
||||
/**
|
||||
* @param string|string[] $pattern
|
||||
* @template TKey of array-key
|
||||
*
|
||||
* @param non-empty-string|non-empty-string[] $pattern
|
||||
* @param callable(string[]):string $callback
|
||||
* @param string|array<string|int|float> $subject
|
||||
* @param int $count
|
||||
* @return ($subject is array ? array<string>|null : string|null)
|
||||
* @param string|array<TKey, string|int|float> $subject
|
||||
* @param int<0, max> $count
|
||||
* @return ($subject is array ? array<TKey, string>|null : string|null)
|
||||
*
|
||||
* @psalm-ignore-nullable-return
|
||||
*
|
||||
* @psalm-taint-specialize
|
||||
* @psalm-flow ($subject) -> return
|
||||
@@ -1208,7 +1222,7 @@ function preg_replace_callback($pattern, $callback, $subject, int $limit = -1, &
|
||||
* @psalm-pure
|
||||
* @template TFlags as int
|
||||
*
|
||||
* @param string $pattern
|
||||
* @param non-empty-string $pattern
|
||||
* @param string $subject
|
||||
* @param mixed $matches
|
||||
* @param TFlags $flags
|
||||
@@ -1244,7 +1258,7 @@ function preg_match_all($pattern, $subject, &$matches = [], int $flags = 1, int
|
||||
* @psalm-pure
|
||||
* @template TFlags as int-mask<0, 256, 512>
|
||||
*
|
||||
* @param string $pattern
|
||||
* @param non-empty-string $pattern
|
||||
* @param string $subject
|
||||
* @param mixed $matches
|
||||
* @param TFlags $flags
|
||||
@@ -1279,17 +1293,17 @@ function preg_quote(string $str, ?string $delimiter = null) : string {}
|
||||
* @psalm-pure
|
||||
*
|
||||
* @param string|int|float $values
|
||||
* @return ($format is non-empty-string
|
||||
* ? ($values is non-empty-string|int|float ? non-empty-string : string)
|
||||
* : string)
|
||||
* @return (PHP_MAJOR_VERSION is 8 ? string : string|false)
|
||||
* @psalm-ignore-falsable-return
|
||||
*
|
||||
* @psalm-flow ($format, $values) -> return
|
||||
*/
|
||||
function sprintf(string $format, ...$values) : string {}
|
||||
function sprintf(string $format, ...$values) {}
|
||||
|
||||
/**
|
||||
* @psalm-pure
|
||||
* @return string|false
|
||||
* @param array<string|int|float> $values
|
||||
* @return (PHP_MAJOR_VERSION is 8 ? string : string|false)
|
||||
* @psalm-ignore-falsable-return
|
||||
*
|
||||
* @psalm-flow ($format, $values) -> return
|
||||
@@ -1308,20 +1322,27 @@ function wordwrap(string $string, int $width = 75, string $break = "\n", bool $c
|
||||
* @psalm-pure
|
||||
*
|
||||
* @param string|int|float $values
|
||||
* @return (PHP_MAJOR_VERSION is 8 ? int<0, max> : int<0, max>|false)
|
||||
* @psalm-ignore-falsable-return
|
||||
*
|
||||
* @psalm-taint-specialize
|
||||
* @psalm-flow ($format, $values) -> return
|
||||
* @psalm-taint-sink html $format
|
||||
* @psalm-taint-sink html $values
|
||||
*/
|
||||
function printf(string $format, ...$values) : string {}
|
||||
function printf(string $format, ...$values) {}
|
||||
|
||||
/**
|
||||
* @param array<string|int|float> $values
|
||||
* @return (PHP_MAJOR_VERSION is 8 ? int<0, max> : int<0, max>|false)
|
||||
* @psalm-ignore-falsable-return
|
||||
*
|
||||
* @psalm-pure
|
||||
* @psalm-taint-specialize
|
||||
* @psalm-taint-sink html $format
|
||||
* @psalm-taint-sink html $values
|
||||
*/
|
||||
function vprintf(string $format, array $values) : int {}
|
||||
function vprintf(string $format, array $values) {}
|
||||
|
||||
/**
|
||||
* @psalm-pure
|
||||
@@ -1364,11 +1385,11 @@ function str_getcsv(string $string, string $separator = ',', string $enclosure =
|
||||
|
||||
/**
|
||||
* @template TKey as array-key
|
||||
* @template TArray as array<mixed, TKey>
|
||||
* @template TArray as array<TKey>
|
||||
*
|
||||
* @param TArray $array
|
||||
*
|
||||
* @return (TArray is non-empty-array ? non-empty-array<TKey, positive-int> : array<TKey, positive-int>)
|
||||
* @return (TArray is non-empty-array ? non-empty-array<TKey, int<1, max>> : array<TKey, int<1, max>>)
|
||||
*
|
||||
* @psalm-pure
|
||||
*/
|
||||
@@ -1508,7 +1529,7 @@ function ldap_escape(string $value, string $ignore = "", int $flags = 0) : strin
|
||||
function json_decode(string $json, ?bool $associative = null, int $depth = 512, int $flags = 0) {}
|
||||
|
||||
/**
|
||||
* The conditional return type below relies on the fact that JSON_THROW_ON_ERROR is
|
||||
* The conditional return type below relies on the fact that JSON_THROW_ON_ERROR is
|
||||
* the highest-valued of JSON constants
|
||||
* @psalm-pure
|
||||
*
|
||||
@@ -1542,6 +1563,8 @@ function sapi_windows_cp_conv($in_codepage, $out_codepage, string $subject) : ?s
|
||||
/**
|
||||
* @psalm-pure
|
||||
*
|
||||
* @return non-empty-string
|
||||
*
|
||||
* @psalm-flow ($prefix) -> return
|
||||
*/
|
||||
function uniqid(string $prefix = "", bool $more_entropy = false) : string {}
|
||||
@@ -1559,7 +1582,10 @@ function unpack(string $format, string $string, int $offset = 0) {}
|
||||
/**
|
||||
* @psalm-pure
|
||||
*
|
||||
* @template T of bool
|
||||
* @param T $strict
|
||||
* @return string|false
|
||||
* @psalm-return (T is false ? string : string|false)
|
||||
*
|
||||
* @psalm-flow ($string) -> return
|
||||
* @psalm-ignore-falsable-return
|
||||
@@ -1704,3 +1730,58 @@ function pg_escape_literal($string1, $string2 = null) {}
|
||||
* @psalm-flow ($string1, $string2) -> return
|
||||
*/
|
||||
function pg_escape_string($string1, $string2 = null) {}
|
||||
|
||||
if (defined('GLOB_BRACE')) {
|
||||
/**
|
||||
* @psalm-template P of string
|
||||
* @psalm-template F of int-mask<GLOB_MARK, GLOB_NOSORT, GLOB_NOCHECK, GLOB_NOESCAPE, GLOB_BRACE, GLOB_ONLYDIR, GLOB_ERR>
|
||||
* @psalm-param P $pattern
|
||||
* @psalm-param F $flags
|
||||
* @psalm-return (
|
||||
* P is ''
|
||||
* ? (F is int-mask<GLOB_MARK, GLOB_NOSORT, GLOB_NOESCAPE, GLOB_BRACE, GLOB_ONLYDIR, GLOB_ERR>
|
||||
* ? false|list<never>
|
||||
* : (F is int-mask<GLOB_MARK, GLOB_NOSORT, GLOB_NOCHECK, GLOB_NOESCAPE, GLOB_BRACE, GLOB_ERR>
|
||||
* ? false|list{0:''}
|
||||
* : false|list<never>
|
||||
* )
|
||||
* )
|
||||
* : (F is int-mask<GLOB_MARK, GLOB_NOSORT, GLOB_NOESCAPE, GLOB_BRACE, GLOB_ONLYDIR, GLOB_ERR>
|
||||
* ? false|list<non-empty-string>
|
||||
* : (F is int-mask<GLOB_MARK, GLOB_NOSORT, GLOB_NOCHECK, GLOB_NOESCAPE, GLOB_BRACE, GLOB_ERR>
|
||||
* ? false|list{0:non-empty-string, ...<non-empty-string>}
|
||||
* : false|list<non-empty-string>
|
||||
* )
|
||||
* )
|
||||
* )
|
||||
* @psalm-ignore-falsable-return
|
||||
*/
|
||||
function glob (string $pattern, int $flags = 0): array|false {}
|
||||
} else {
|
||||
/**
|
||||
* @psalm-template P of string
|
||||
* @psalm-template F of int-mask<GLOB_MARK, GLOB_NOSORT, GLOB_NOCHECK, GLOB_NOESCAPE, GLOB_ONLYDIR, GLOB_ERR>
|
||||
* @psalm-param P $pattern
|
||||
* @psalm-param F $flags
|
||||
* @psalm-return (
|
||||
* P is ''
|
||||
* ? (F is int-mask<GLOB_MARK, GLOB_NOSORT, GLOB_NOESCAPE, GLOB_ONLYDIR, GLOB_ERR>
|
||||
* ? false|list<never>
|
||||
* : (F is int-mask<GLOB_MARK, GLOB_NOSORT, GLOB_NOCHECK, GLOB_NOESCAPE, GLOB_ERR>
|
||||
* ? false|list{0:''}
|
||||
* : false|list<never>
|
||||
* )
|
||||
* )
|
||||
* : (F is int-mask<GLOB_MARK, GLOB_NOSORT, GLOB_NOESCAPE, GLOB_ONLYDIR, GLOB_ERR>
|
||||
* ? false|list<non-empty-string>
|
||||
* : (F is int-mask<GLOB_MARK, GLOB_NOSORT, GLOB_NOCHECK, GLOB_NOESCAPE, GLOB_ERR>
|
||||
* ? false|list{0:non-empty-string, ...<non-empty-string>}
|
||||
* : false|list<non-empty-string>
|
||||
* )
|
||||
* )
|
||||
* )
|
||||
* @psalm-ignore-falsable-return
|
||||
*/
|
||||
function glob (string $pattern, int $flags = 0): array|false {}
|
||||
}
|
||||
|
||||
|
||||
-12
@@ -34,18 +34,6 @@ namespace {
|
||||
public function getIterator(): Iterator {}
|
||||
}
|
||||
|
||||
#[Attribute(Attribute::TARGET_PARAMETER)]
|
||||
final class SensitiveParameter
|
||||
{
|
||||
public function __construct() {}
|
||||
}
|
||||
|
||||
#[Attribute(Attribute::TARGET_CLASS)]
|
||||
final class AllowDynamicProperties
|
||||
{
|
||||
public function __construct() {}
|
||||
}
|
||||
|
||||
/**
|
||||
* @psalm-pure
|
||||
* @param positive-int $length
|
||||
|
||||
+233
-41
@@ -1,59 +1,251 @@
|
||||
<?php
|
||||
|
||||
namespace MongoDB\Driver;
|
||||
|
||||
use Iterator;
|
||||
use Traversable;
|
||||
|
||||
/**
|
||||
* @template-covariant TKey
|
||||
* @template-covariant TValue
|
||||
*
|
||||
* @template-extends Traversable<TKey, TValue>
|
||||
*/
|
||||
interface CursorInterface extends Traversable
|
||||
namespace MongoDB\BSON
|
||||
{
|
||||
use IteratorAggregate;
|
||||
use Serializable;
|
||||
|
||||
/**
|
||||
* @return array<TValue>
|
||||
* @template TValue
|
||||
* @template-implements IteratorAggregate<string, TValue>
|
||||
*/
|
||||
public function toArray();
|
||||
final class Document implements IteratorAggregate, Serializable
|
||||
{
|
||||
private function __construct()
|
||||
{
|
||||
}
|
||||
|
||||
final static public function fromBSON(string $bson): Document
|
||||
{
|
||||
}
|
||||
|
||||
final static public function fromJSON(string $json): Document
|
||||
{
|
||||
}
|
||||
|
||||
/** @param array|object $value */
|
||||
final static public function fromPHP($value): Document
|
||||
{
|
||||
}
|
||||
|
||||
/** @return TValue */
|
||||
final public function get(string $key)
|
||||
{
|
||||
}
|
||||
|
||||
/** @return Iterator<string, TValue> */
|
||||
final public function getIterator(): Iterator
|
||||
{
|
||||
}
|
||||
|
||||
final public function has(string $key): bool
|
||||
{
|
||||
}
|
||||
|
||||
/** @return array|object */
|
||||
final public function toPHP(?array $typeMap = null)
|
||||
{
|
||||
}
|
||||
|
||||
final public function toCanonicalExtendedJSON(): string
|
||||
{
|
||||
}
|
||||
|
||||
final public function toRelaxedExtendedJSON(): string
|
||||
{
|
||||
}
|
||||
|
||||
final public function __toString(): string
|
||||
{
|
||||
}
|
||||
|
||||
final public static function __set_state(array $properties): Document
|
||||
{
|
||||
}
|
||||
|
||||
final public function serialize(): string
|
||||
{
|
||||
}
|
||||
|
||||
/** @param string $serialized */
|
||||
final public function unserialize($serialized): void
|
||||
{
|
||||
}
|
||||
|
||||
final public function __unserialize(array $data): void
|
||||
{
|
||||
}
|
||||
|
||||
final public function __serialize(): array
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @psalm-template TKey of int|string
|
||||
* @psalm-template TValue
|
||||
* $psalm-implements \Iterator<TKey, TValue>
|
||||
*/
|
||||
final class Iterator implements \Iterator
|
||||
{
|
||||
final private function __construct()
|
||||
{
|
||||
}
|
||||
|
||||
/** @return TValue */
|
||||
final public function current()
|
||||
{
|
||||
}
|
||||
|
||||
/** @return TKey */
|
||||
final public function key()
|
||||
{
|
||||
}
|
||||
|
||||
final public function next(): void
|
||||
{
|
||||
}
|
||||
|
||||
final public function rewind(): void
|
||||
{
|
||||
}
|
||||
|
||||
final public function valid(): bool
|
||||
{
|
||||
}
|
||||
|
||||
final public function __wakeup(): void
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @template TValue
|
||||
* @template-implements IteratorAggregate<int, TValue>
|
||||
*/
|
||||
final class PackedArray implements IteratorAggregate, Serializable
|
||||
{
|
||||
private function __construct()
|
||||
{
|
||||
}
|
||||
|
||||
final static public function fromPHP(array $value): PackedArray
|
||||
{
|
||||
}
|
||||
|
||||
/** @return TValue */
|
||||
final public function get(int $index)
|
||||
{
|
||||
}
|
||||
|
||||
/** @return Iterator<int, TValue> */
|
||||
final public function getIterator(): Iterator
|
||||
{
|
||||
}
|
||||
|
||||
final public function has(int $index): bool
|
||||
{
|
||||
}
|
||||
|
||||
/** @return array|object */
|
||||
final public function toPHP(?array $typeMap = null)
|
||||
{
|
||||
}
|
||||
|
||||
final public function __toString(): string
|
||||
{
|
||||
}
|
||||
|
||||
final public static function __set_state(array $properties): PackedArray
|
||||
{
|
||||
}
|
||||
|
||||
final public function serialize(): string
|
||||
{
|
||||
}
|
||||
|
||||
/** @param string $serialized */
|
||||
final public function unserialize($serialized): void
|
||||
{
|
||||
}
|
||||
|
||||
final public function __unserialize(array $data): void
|
||||
{
|
||||
}
|
||||
|
||||
final public function __serialize(): array
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @template-covariant TValue of array|object
|
||||
*
|
||||
* @template-implements Iterator<int, TValue>
|
||||
* @template-implements CursorInterface<int, TValue>
|
||||
*/
|
||||
final class Cursor implements CursorInterface, Iterator
|
||||
namespace MongoDB\Driver
|
||||
{
|
||||
/**
|
||||
* @return TValue
|
||||
*/
|
||||
public function current() {}
|
||||
use Iterator;
|
||||
use Traversable;
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @template-covariant TKey
|
||||
* @template-covariant TValue
|
||||
*
|
||||
* @template-extends Traversable<TKey, TValue>
|
||||
*/
|
||||
public function next() {}
|
||||
interface CursorInterface extends Traversable
|
||||
{
|
||||
/**
|
||||
* @return array<TValue>
|
||||
*/
|
||||
public function toArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
* @template-covariant TValue of array|object
|
||||
*
|
||||
* @template-implements Iterator<int, TValue>
|
||||
* @template-implements CursorInterface<int, TValue>
|
||||
*/
|
||||
public function key() {}
|
||||
final class Cursor implements CursorInterface, Iterator
|
||||
{
|
||||
/**
|
||||
* @return TValue
|
||||
*/
|
||||
public function current()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function valid() {}
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function next()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function rewind() {}
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function key()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<TValue>
|
||||
*/
|
||||
public function toArray() {}
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function valid()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function rewind()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<TValue>
|
||||
*/
|
||||
public function toArray()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+10
@@ -150,6 +150,16 @@ class PDOStatement implements Traversable
|
||||
* @return false|T
|
||||
*/
|
||||
public function fetchObject($class = \stdclass::class, array $ctorArgs = array()) {}
|
||||
|
||||
/**
|
||||
* @psalm-taint-sink sql $value
|
||||
*/
|
||||
public function bindValue(string|int $param, mixed $value, int $type = PDO::PARAM_STR): bool {}
|
||||
|
||||
/**
|
||||
* @psalm-taint-sink sql $var
|
||||
*/
|
||||
public function bindParam(string|int $param, mixed &$var, int $type = PDO::PARAM_STR, int $maxLength = 0, mixed $driverOptions = null): bool {}
|
||||
}
|
||||
|
||||
class PDOException extends RuntimeException {
|
||||
|
||||
+18
@@ -20,3 +20,21 @@ abstract class CallLike extends Expr {
|
||||
*/
|
||||
public function getArgs(): array {}
|
||||
}
|
||||
|
||||
|
||||
namespace PhpParser\Node;
|
||||
|
||||
use PhpParser\NodeAbstract;
|
||||
|
||||
class Name extends NodeAbstract {
|
||||
/**
|
||||
* @param string|string[]|self $name
|
||||
* @param array $attributes
|
||||
*/
|
||||
public function __construct($name, array $attributes = []) {}
|
||||
|
||||
/**
|
||||
* @return non-empty-string
|
||||
*/
|
||||
public function toString(): string {}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user