mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
REFACTOR: Member or type can be made internal.
This commit is contained in:
@@ -44,7 +44,7 @@ namespace DiscImageChef.Filesystems.CPM
|
||||
/// Loads all the known CP/M disk definitions from an XML stored as an embedded resource.
|
||||
/// </summary>
|
||||
/// <returns>The definitions.</returns>
|
||||
public bool LoadDefinitions()
|
||||
bool LoadDefinitions()
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -83,7 +83,7 @@ namespace DiscImageChef.Filesystems.CPM
|
||||
/// <summary>
|
||||
/// CP/M disk definitions
|
||||
/// </summary>
|
||||
public class CpmDefinitions
|
||||
class CpmDefinitions
|
||||
{
|
||||
/// <summary>
|
||||
/// List of all CP/M disk definitions
|
||||
@@ -98,7 +98,7 @@ namespace DiscImageChef.Filesystems.CPM
|
||||
/// <summary>
|
||||
/// CP/M disk definition
|
||||
/// </summary>
|
||||
public class CpmDefinition
|
||||
class CpmDefinition
|
||||
{
|
||||
/// <summary>
|
||||
/// Comment and description
|
||||
@@ -197,7 +197,7 @@ namespace DiscImageChef.Filesystems.CPM
|
||||
/// <summary>
|
||||
/// Side descriptions
|
||||
/// </summary>
|
||||
public class Side
|
||||
class Side
|
||||
{
|
||||
/// <summary>
|
||||
/// Side ID as found in each sector address mark
|
||||
|
||||
@@ -1403,7 +1403,7 @@ namespace DiscImageChef.Filesystems
|
||||
/// BIOS Parameter Block as used by Atari ST GEMDOS on FAT12 volumes.
|
||||
/// </summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct AtariParameterBlock
|
||||
struct AtariParameterBlock
|
||||
{
|
||||
/// <summary>68000 BRA.S jump or x86 loop</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] jump;
|
||||
@@ -1463,7 +1463,7 @@ namespace DiscImageChef.Filesystems
|
||||
/// BIOS Parameter Block as used by MSX-DOS 2.
|
||||
/// </summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct MSXParameterBlock
|
||||
struct MSXParameterBlock
|
||||
{
|
||||
/// <summary>x86 loop</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] jump;
|
||||
@@ -1511,7 +1511,7 @@ namespace DiscImageChef.Filesystems
|
||||
|
||||
/// <summary>DOS 2.0 BIOS Parameter Block.</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct BIOSParameterBlock2
|
||||
struct BIOSParameterBlock2
|
||||
{
|
||||
/// <summary>x86 jump</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] jump;
|
||||
@@ -1541,7 +1541,7 @@ namespace DiscImageChef.Filesystems
|
||||
|
||||
/// <summary>DOS 3.0 BIOS Parameter Block.</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct BIOSParameterBlock30
|
||||
struct BIOSParameterBlock30
|
||||
{
|
||||
/// <summary>x86 jump</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] jump;
|
||||
@@ -1577,7 +1577,7 @@ namespace DiscImageChef.Filesystems
|
||||
|
||||
/// <summary>DOS 3.2 BIOS Parameter Block.</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct BIOSParameterBlock32
|
||||
struct BIOSParameterBlock32
|
||||
{
|
||||
/// <summary>x86 jump</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] jump;
|
||||
@@ -1615,7 +1615,7 @@ namespace DiscImageChef.Filesystems
|
||||
|
||||
/// <summary>DOS 3.31 BIOS Parameter Block.</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct BIOSParameterBlock33
|
||||
struct BIOSParameterBlock33
|
||||
{
|
||||
/// <summary>x86 jump</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] jump;
|
||||
@@ -1653,7 +1653,7 @@ namespace DiscImageChef.Filesystems
|
||||
|
||||
/// <summary>DOS 3.4 BIOS Parameter Block.</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct BIOSParameterBlockShortEBPB
|
||||
struct BIOSParameterBlockShortEBPB
|
||||
{
|
||||
/// <summary>x86 jump</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] jump;
|
||||
@@ -1699,7 +1699,7 @@ namespace DiscImageChef.Filesystems
|
||||
|
||||
/// <summary>DOS 4.0 or higher BIOS Parameter Block.</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct BIOSParameterBlockEBPB
|
||||
struct BIOSParameterBlockEBPB
|
||||
{
|
||||
/// <summary>x86 jump</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] jump;
|
||||
@@ -1749,7 +1749,7 @@ namespace DiscImageChef.Filesystems
|
||||
|
||||
/// <summary>FAT32 Parameter Block</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct FAT32ParameterBlockShort
|
||||
struct FAT32ParameterBlockShort
|
||||
{
|
||||
/// <summary>x86 jump</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] jump;
|
||||
@@ -1813,7 +1813,7 @@ namespace DiscImageChef.Filesystems
|
||||
|
||||
/// <summary>FAT32 Parameter Block</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct FAT32ParameterBlock
|
||||
struct FAT32ParameterBlock
|
||||
{
|
||||
/// <summary>x86 jump</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] jump;
|
||||
@@ -1877,7 +1877,7 @@ namespace DiscImageChef.Filesystems
|
||||
|
||||
/// <summary>Apricot Label.</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct ApricotLabel
|
||||
struct ApricotLabel
|
||||
{
|
||||
/// <summary>Version of format which created disk</summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] version;
|
||||
@@ -2050,7 +2050,7 @@ namespace DiscImageChef.Filesystems
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct ApricotParameterBlock
|
||||
struct ApricotParameterBlock
|
||||
{
|
||||
/// <summary>Bytes per sector</summary>
|
||||
public ushort bps;
|
||||
@@ -2074,13 +2074,13 @@ namespace DiscImageChef.Filesystems
|
||||
public ushort startSector;
|
||||
}
|
||||
|
||||
public const uint fsinfo_signature1 = 0x41615252;
|
||||
public const uint fsinfo_signature2 = 0x61417272;
|
||||
public const uint fsinfo_signature3 = 0xAA550000;
|
||||
const uint fsinfo_signature1 = 0x41615252;
|
||||
const uint fsinfo_signature2 = 0x61417272;
|
||||
const uint fsinfo_signature3 = 0xAA550000;
|
||||
|
||||
/// <summary>FAT32 FS Information Sector</summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct FSInfoSector
|
||||
struct FSInfoSector
|
||||
{
|
||||
/// <summary>Signature must be <see cref="fsinfo_signature1"/></summary>
|
||||
public uint signature1;
|
||||
@@ -2099,7 +2099,7 @@ namespace DiscImageChef.Filesystems
|
||||
}
|
||||
|
||||
[Flags]
|
||||
public enum FatAttributes : byte
|
||||
enum FatAttributes : byte
|
||||
{
|
||||
ReadOnly = 0x01,
|
||||
Hidden = 0x02,
|
||||
@@ -2113,7 +2113,7 @@ namespace DiscImageChef.Filesystems
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct DirectoryEntry
|
||||
struct DirectoryEntry
|
||||
{
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] filename;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] extension;
|
||||
|
||||
@@ -321,7 +321,7 @@ namespace DiscImageChef.Filesystems
|
||||
/// Superblock for Minix v1 and V2 filesystems
|
||||
/// </summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct MinixSuperBlock
|
||||
struct MinixSuperBlock
|
||||
{
|
||||
/// <summary>0x00, inodes on volume</summary>
|
||||
public ushort s_ninodes;
|
||||
@@ -349,7 +349,7 @@ namespace DiscImageChef.Filesystems
|
||||
/// Superblock for Minix v3 filesystems
|
||||
/// </summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct Minix3SuperBlock
|
||||
struct Minix3SuperBlock
|
||||
{
|
||||
/// <summary>0x00, inodes on volume</summary>
|
||||
public uint s_ninodes;
|
||||
|
||||
@@ -178,7 +178,7 @@ namespace DiscImageChef.Filesystems
|
||||
information = sb.ToString();
|
||||
}
|
||||
|
||||
public struct SolarOSParameterBlock
|
||||
struct SolarOSParameterBlock
|
||||
{
|
||||
/// <summary>0x00, x86 jump (3 bytes), jumps to 0x60</summary>
|
||||
public byte[] x86_jump;
|
||||
|
||||
@@ -539,15 +539,15 @@ namespace DiscImageChef.Filesystems
|
||||
/// <summary>
|
||||
/// Same magic for ext2, ext3 and ext4
|
||||
/// </summary>
|
||||
public const ushort ext2FSMagic = 0xEF53;
|
||||
const ushort ext2FSMagic = 0xEF53;
|
||||
|
||||
public const ushort ext2OldFSMagic = 0xEF51;
|
||||
const ushort ext2OldFSMagic = 0xEF51;
|
||||
|
||||
/// <summary>
|
||||
/// ext2/3/4 superblock
|
||||
/// </summary>
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct ext2FSSuperBlock
|
||||
struct ext2FSSuperBlock
|
||||
{
|
||||
/// <summary>0x000, inodes on volume</summary>
|
||||
public uint inodes;
|
||||
@@ -765,112 +765,112 @@ namespace DiscImageChef.Filesystems
|
||||
|
||||
// ext? filesystem states
|
||||
/// <summary>Cleanly-unmounted volume</summary>
|
||||
public const ushort EXT2_VALID_FS = 0x0001;
|
||||
const ushort EXT2_VALID_FS = 0x0001;
|
||||
/// <summary>Dirty volume</summary>
|
||||
public const ushort EXT2_ERROR_FS = 0x0002;
|
||||
const ushort EXT2_ERROR_FS = 0x0002;
|
||||
/// <summary>Recovering orphan files</summary>
|
||||
public const ushort EXT3_ORPHAN_FS = 0x0004;
|
||||
const ushort EXT3_ORPHAN_FS = 0x0004;
|
||||
|
||||
// ext? default mount flags
|
||||
/// <summary>Enable debugging messages</summary>
|
||||
public const uint EXT2_DEFM_DEBUG = 0x000001;
|
||||
const uint EXT2_DEFM_DEBUG = 0x000001;
|
||||
/// <summary>Emulates BSD behaviour on new file creation</summary>
|
||||
public const uint EXT2_DEFM_BSDGROUPS = 0x000002;
|
||||
const uint EXT2_DEFM_BSDGROUPS = 0x000002;
|
||||
/// <summary>Enable user xattrs</summary>
|
||||
public const uint EXT2_DEFM_XATTR_USER = 0x000004;
|
||||
const uint EXT2_DEFM_XATTR_USER = 0x000004;
|
||||
/// <summary>Enable POSIX ACLs</summary>
|
||||
public const uint EXT2_DEFM_ACL = 0x000008;
|
||||
const uint EXT2_DEFM_ACL = 0x000008;
|
||||
/// <summary>Use 16bit UIDs</summary>
|
||||
public const uint EXT2_DEFM_UID16 = 0x000010;
|
||||
const uint EXT2_DEFM_UID16 = 0x000010;
|
||||
/// <summary>Journal data mode</summary>
|
||||
public const uint EXT3_DEFM_JMODE_DATA = 0x000040;
|
||||
const uint EXT3_DEFM_JMODE_DATA = 0x000040;
|
||||
/// <summary>Journal ordered mode</summary>
|
||||
public const uint EXT3_DEFM_JMODE_ORDERED = 0x000080;
|
||||
const uint EXT3_DEFM_JMODE_ORDERED = 0x000080;
|
||||
/// <summary>Journal writeback mode</summary>
|
||||
public const uint EXT3_DEFM_JMODE_WBACK = 0x000100;
|
||||
const uint EXT3_DEFM_JMODE_WBACK = 0x000100;
|
||||
|
||||
// Behaviour on errors
|
||||
/// <summary>Continue execution</summary>
|
||||
public const ushort EXT2_ERRORS_CONTINUE = 1;
|
||||
const ushort EXT2_ERRORS_CONTINUE = 1;
|
||||
/// <summary>Remount fs read-only</summary>
|
||||
public const ushort EXT2_ERRORS_RO = 2;
|
||||
const ushort EXT2_ERRORS_RO = 2;
|
||||
/// <summary>Panic</summary>
|
||||
public const ushort EXT2_ERRORS_PANIC = 3;
|
||||
const ushort EXT2_ERRORS_PANIC = 3;
|
||||
|
||||
// OS codes
|
||||
public const uint EXT2_OS_LINUX = 0;
|
||||
public const uint EXT2_OS_HURD = 1;
|
||||
public const uint EXT2_OS_MASIX = 2;
|
||||
public const uint EXT2_OS_FREEBSD = 3;
|
||||
public const uint EXT2_OS_LITES = 4;
|
||||
const uint EXT2_OS_LINUX = 0;
|
||||
const uint EXT2_OS_HURD = 1;
|
||||
const uint EXT2_OS_MASIX = 2;
|
||||
const uint EXT2_OS_FREEBSD = 3;
|
||||
const uint EXT2_OS_LITES = 4;
|
||||
|
||||
// Revision levels
|
||||
/// <summary>The good old (original) format</summary>
|
||||
public const uint EXT2_GOOD_OLD_REV = 0;
|
||||
const uint EXT2_GOOD_OLD_REV = 0;
|
||||
/// <summary>V2 format w/ dynamic inode sizes</summary>
|
||||
public const uint EXT2_DYNAMIC_REV = 1;
|
||||
const uint EXT2_DYNAMIC_REV = 1;
|
||||
|
||||
// Compatible features
|
||||
/// <summary>Pre-allocate directories</summary>
|
||||
public const uint EXT2_FEATURE_COMPAT_DIR_PREALLOC = 0x00000001;
|
||||
const uint EXT2_FEATURE_COMPAT_DIR_PREALLOC = 0x00000001;
|
||||
/// <summary>imagic inodes ?</summary>
|
||||
public const uint EXT2_FEATURE_COMPAT_IMAGIC_INODES = 0x00000002;
|
||||
const uint EXT2_FEATURE_COMPAT_IMAGIC_INODES = 0x00000002;
|
||||
/// <summary>Has journal (it's ext3)</summary>
|
||||
public const uint EXT3_FEATURE_COMPAT_HAS_JOURNAL = 0x00000004;
|
||||
const uint EXT3_FEATURE_COMPAT_HAS_JOURNAL = 0x00000004;
|
||||
/// <summary>EA blocks</summary>
|
||||
public const uint EXT2_FEATURE_COMPAT_EXT_ATTR = 0x00000008;
|
||||
const uint EXT2_FEATURE_COMPAT_EXT_ATTR = 0x00000008;
|
||||
/// <summary>Online filesystem resize reservations</summary>
|
||||
public const uint EXT2_FEATURE_COMPAT_RESIZE_INO = 0x00000010;
|
||||
const uint EXT2_FEATURE_COMPAT_RESIZE_INO = 0x00000010;
|
||||
/// <summary>Can use hashed indexes on directories</summary>
|
||||
public const uint EXT2_FEATURE_COMPAT_DIR_INDEX = 0x00000020;
|
||||
const uint EXT2_FEATURE_COMPAT_DIR_INDEX = 0x00000020;
|
||||
|
||||
// Read-only compatible features
|
||||
/// <summary>Reduced number of superblocks</summary>
|
||||
public const uint EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER = 0x00000001;
|
||||
const uint EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER = 0x00000001;
|
||||
/// <summary>Can have files bigger than 2GiB</summary>
|
||||
public const uint EXT2_FEATURE_RO_COMPAT_LARGE_FILE = 0x00000002;
|
||||
const uint EXT2_FEATURE_RO_COMPAT_LARGE_FILE = 0x00000002;
|
||||
/// <summary>Use B-Tree for directories</summary>
|
||||
public const uint EXT2_FEATURE_RO_COMPAT_BTREE_DIR = 0x00000004;
|
||||
const uint EXT2_FEATURE_RO_COMPAT_BTREE_DIR = 0x00000004;
|
||||
/// <summary>Can have files bigger than 2TiB *ext4*</summary>
|
||||
public const uint EXT4_FEATURE_RO_COMPAT_HUGE_FILE = 0x00000008;
|
||||
const uint EXT4_FEATURE_RO_COMPAT_HUGE_FILE = 0x00000008;
|
||||
/// <summary>Group descriptor checksums and sparse inode table *ext4*</summary>
|
||||
public const uint EXT4_FEATURE_RO_COMPAT_GDT_CSUM = 0x00000010;
|
||||
const uint EXT4_FEATURE_RO_COMPAT_GDT_CSUM = 0x00000010;
|
||||
/// <summary>More than 32000 directory entries *ext4*</summary>
|
||||
public const uint EXT4_FEATURE_RO_COMPAT_DIR_NLINK = 0x00000020;
|
||||
const uint EXT4_FEATURE_RO_COMPAT_DIR_NLINK = 0x00000020;
|
||||
/// <summary>Nanosecond timestamps and creation time *ext4*</summary>
|
||||
public const uint EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE = 0x00000040;
|
||||
const uint EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE = 0x00000040;
|
||||
|
||||
// Incompatible features
|
||||
/// <summary>Uses compression</summary>
|
||||
public const uint EXT2_FEATURE_INCOMPAT_COMPRESSION = 0x00000001;
|
||||
const uint EXT2_FEATURE_INCOMPAT_COMPRESSION = 0x00000001;
|
||||
/// <summary>Filetype in directory entries</summary>
|
||||
public const uint EXT2_FEATURE_INCOMPAT_FILETYPE = 0x00000002;
|
||||
const uint EXT2_FEATURE_INCOMPAT_FILETYPE = 0x00000002;
|
||||
/// <summary>Journal needs recovery *ext3*</summary>
|
||||
public const uint EXT3_FEATURE_INCOMPAT_RECOVER = 0x00000004;
|
||||
const uint EXT3_FEATURE_INCOMPAT_RECOVER = 0x00000004;
|
||||
/// <summary>Has journal on another device *ext3*</summary>
|
||||
public const uint EXT3_FEATURE_INCOMPAT_JOURNAL_DEV = 0x00000008;
|
||||
const uint EXT3_FEATURE_INCOMPAT_JOURNAL_DEV = 0x00000008;
|
||||
/// <summary>Reduced block group backups</summary>
|
||||
public const uint EXT2_FEATURE_INCOMPAT_META_BG = 0x00000010;
|
||||
const uint EXT2_FEATURE_INCOMPAT_META_BG = 0x00000010;
|
||||
/// <summary>Volume use extents *ext4*</summary>
|
||||
public const uint EXT4_FEATURE_INCOMPAT_EXTENTS = 0x00000040;
|
||||
const uint EXT4_FEATURE_INCOMPAT_EXTENTS = 0x00000040;
|
||||
/// <summary>Supports volumes bigger than 2^32 blocks *ext4*</summary>
|
||||
public const uint EXT4_FEATURE_INCOMPAT_64BIT = 0x00000080;
|
||||
const uint EXT4_FEATURE_INCOMPAT_64BIT = 0x00000080;
|
||||
/// <summary>Multi-mount protection *ext4*</summary>
|
||||
public const uint EXT4_FEATURE_INCOMPAT_MMP = 0x00000100;
|
||||
const uint EXT4_FEATURE_INCOMPAT_MMP = 0x00000100;
|
||||
/// <summary>Flexible block group metadata location *ext4*</summary>
|
||||
public const uint EXT4_FEATURE_INCOMPAT_FLEX_BG = 0x00000200;
|
||||
const uint EXT4_FEATURE_INCOMPAT_FLEX_BG = 0x00000200;
|
||||
/// <summary>EA in inode *ext4*</summary>
|
||||
public const uint EXT4_FEATURE_INCOMPAT_EA_INODE = 0x00000400;
|
||||
const uint EXT4_FEATURE_INCOMPAT_EA_INODE = 0x00000400;
|
||||
/// <summary>Data can reside in directory entry *ext4*</summary>
|
||||
public const uint EXT4_FEATURE_INCOMPAT_DIRDATA = 0x00001000;
|
||||
const uint EXT4_FEATURE_INCOMPAT_DIRDATA = 0x00001000;
|
||||
|
||||
// Miscellaneous filesystem flags
|
||||
/// <summary>Signed dirhash in use</summary>
|
||||
public const uint EXT2_FLAGS_SIGNED_HASH = 0x00000001;
|
||||
const uint EXT2_FLAGS_SIGNED_HASH = 0x00000001;
|
||||
/// <summary>Unsigned dirhash in use</summary>
|
||||
public const uint EXT2_FLAGS_UNSIGNED_HASH = 0x00000002;
|
||||
const uint EXT2_FLAGS_UNSIGNED_HASH = 0x00000002;
|
||||
/// <summary>Testing development code</summary>
|
||||
public const uint EXT2_FLAGS_TEST_FILESYS = 0x00000004;
|
||||
const uint EXT2_FLAGS_TEST_FILESYS = 0x00000004;
|
||||
|
||||
public override Errno Mount()
|
||||
{
|
||||
|
||||
@@ -137,12 +137,12 @@ namespace DiscImageChef.Filesystems
|
||||
/// <summary>
|
||||
/// ext superblock magic
|
||||
/// </summary>
|
||||
public const ushort extFSMagic = 0x137D;
|
||||
const ushort extFSMagic = 0x137D;
|
||||
|
||||
/// <summary>
|
||||
/// ext superblock
|
||||
/// </summary>
|
||||
public struct extFSSuperBlock
|
||||
struct extFSSuperBlock
|
||||
{
|
||||
/// <summary>0x000, inodes on volume</summary>
|
||||
public uint inodes;
|
||||
|
||||
Reference in New Issue
Block a user