mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 08:25:03 +00:00
Finish up float.c, hopfully the div and sub math is right.
svn path=/trunk/; revision=26799
This commit is contained in:
parent
0a44b61c7f
commit
12ccaa3207
1 changed files with 241 additions and 82 deletions
|
@ -70,7 +70,7 @@ EngRestoreFloatingPointState ( IN VOID *Buffer )
|
||||||
ULONG
|
ULONG
|
||||||
STDCALL
|
STDCALL
|
||||||
EngSaveFloatingPointState(OUT VOID *Buffer,
|
EngSaveFloatingPointState(OUT VOID *Buffer,
|
||||||
IN ULONG BufferSize)
|
IN ULONG BufferSize)
|
||||||
{
|
{
|
||||||
KFLOATING_SAVE TempBuffer;
|
KFLOATING_SAVE TempBuffer;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
@ -79,9 +79,9 @@ EngSaveFloatingPointState(OUT VOID *Buffer,
|
||||||
/* Check for floating point support. */
|
/* Check for floating point support. */
|
||||||
Status = KeSaveFloatingPointState(&TempBuffer);
|
Status = KeSaveFloatingPointState(&TempBuffer);
|
||||||
if (Status != STATUS_SUCCESS)
|
if (Status != STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
KeRestoreFloatingPointState(&TempBuffer);
|
KeRestoreFloatingPointState(&TempBuffer);
|
||||||
return(sizeof(KFLOATING_SAVE));
|
return(sizeof(KFLOATING_SAVE));
|
||||||
}
|
}
|
||||||
|
@ -153,90 +153,165 @@ FtoEF( EFLOAT_S * efp, FLOATL f)
|
||||||
VOID
|
VOID
|
||||||
STDCALL
|
STDCALL
|
||||||
FLOATOBJ_Add (
|
FLOATOBJ_Add (
|
||||||
IN OUT PFLOATOBJ pf,
|
IN OUT PFLOATOBJ pf,
|
||||||
IN PFLOATOBJ pf1
|
IN PFLOATOBJ pf1
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// www.osr.com/ddk/graphics/gdifncs_2i3r.htm
|
// www.osr.com/ddk/graphics/gdifncs_2i3r.htm
|
||||||
UNIMPLEMENTED;
|
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
||||||
|
EFLOAT_S * efp1 = (EFLOAT_S *)pf1;
|
||||||
|
gxf_long f;
|
||||||
|
gxf_long f1;
|
||||||
|
f.l = EFtoF(efp);
|
||||||
|
f1.l = EFtoF(efp1);
|
||||||
|
f.f = f.f + f1.f;
|
||||||
|
#ifdef _X86_
|
||||||
|
FtoEF( efp, f.l );
|
||||||
|
#else
|
||||||
|
FtoEF( efp, f.f );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
STDCALL
|
STDCALL
|
||||||
FLOATOBJ_AddFloat(
|
FLOATOBJ_AddFloat(
|
||||||
IN OUT PFLOATOBJ pf,
|
IN OUT PFLOATOBJ pf,
|
||||||
IN FLOATL f
|
IN FLOATL f
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// www.osr.com/ddk/graphics/gdifncs_0ip3.htm
|
// www.osr.com/ddk/graphics/gdifncs_0ip3.htm
|
||||||
UNIMPLEMENTED;
|
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
||||||
|
gxf_long fe;
|
||||||
|
gxf_long f1;
|
||||||
|
fe.l = EFtoF(efp);
|
||||||
|
#ifdef _X86_
|
||||||
|
f1.l = f;
|
||||||
|
#else
|
||||||
|
f1.f = f;
|
||||||
|
#endif
|
||||||
|
fe.f = fe.f + f1.f;
|
||||||
|
#ifdef _X86_
|
||||||
|
FtoEF( efp, fe.l );
|
||||||
|
#else
|
||||||
|
FtoEF( efp, fe.f );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
STDCALL
|
STDCALL
|
||||||
FLOATOBJ_AddLong(
|
FLOATOBJ_AddLong(
|
||||||
IN OUT PFLOATOBJ pf,
|
IN OUT PFLOATOBJ pf,
|
||||||
IN LONG l
|
IN LONG l
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// www.osr.com/ddk/graphics/gdifncs_12jr.htm
|
// www.osr.com/ddk/graphics/gdifncs_12jr.htm
|
||||||
UNIMPLEMENTED;
|
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
||||||
|
gxf_long f;
|
||||||
|
f.l = EFtoF(efp);
|
||||||
|
f.f = f.f + l;
|
||||||
|
#ifdef _X86_
|
||||||
|
FtoEF( efp, f.l );
|
||||||
|
#else
|
||||||
|
FtoEF( efp, f.f );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
STDCALL
|
STDCALL
|
||||||
FLOATOBJ_Div(
|
FLOATOBJ_Div(
|
||||||
IN OUT PFLOATOBJ pf,
|
IN OUT PFLOATOBJ pf,
|
||||||
IN PFLOATOBJ pf1
|
IN PFLOATOBJ pf1
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// www.osr.com/ddk/graphics/gdifncs_3ndz.htm
|
// www.osr.com/ddk/graphics/gdifncs_3ndz.htm
|
||||||
UNIMPLEMENTED;
|
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
||||||
|
EFLOAT_S * efp1 = (EFLOAT_S *)pf1;
|
||||||
|
gxf_long f;
|
||||||
|
gxf_long f1;
|
||||||
|
f.l = EFtoF(efp);
|
||||||
|
f1.l = EFtoF(efp1);
|
||||||
|
f.f = f.f / f1.f;
|
||||||
|
#ifdef _X86_
|
||||||
|
FtoEF( efp, f.l );
|
||||||
|
#else
|
||||||
|
FtoEF( efp, f.f );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
STDCALL
|
STDCALL
|
||||||
FLOATOBJ_DivFloat(
|
FLOATOBJ_DivFloat(
|
||||||
IN OUT PFLOATOBJ pf,
|
IN OUT PFLOATOBJ pf,
|
||||||
IN FLOATL f
|
IN FLOATL f
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// www.osr.com/ddk/graphics/gdifncs_0gfb.htm
|
// www.osr.com/ddk/graphics/gdifncs_0gfb.htm
|
||||||
UNIMPLEMENTED;
|
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
||||||
|
gxf_long fe;
|
||||||
|
gxf_long f1;
|
||||||
|
fe.l = EFtoF(efp);
|
||||||
|
#ifdef _X86_
|
||||||
|
f1.l = f;
|
||||||
|
#else
|
||||||
|
f1.f = f;
|
||||||
|
#endif
|
||||||
|
fe.f = fe.f / f1.f;
|
||||||
|
#ifdef _X86_
|
||||||
|
FtoEF( efp, fe.l );
|
||||||
|
#else
|
||||||
|
FtoEF( efp, fe.f );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
STDCALL
|
STDCALL
|
||||||
FLOATOBJ_DivLong(
|
FLOATOBJ_DivLong(
|
||||||
IN OUT PFLOATOBJ pf,
|
IN OUT PFLOATOBJ pf,
|
||||||
IN LONG l
|
IN LONG l
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// www.osr.com/ddk/graphics/gdifncs_6jdz.htm
|
// www.osr.com/ddk/graphics/gdifncs_6jdz.htm
|
||||||
UNIMPLEMENTED;
|
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
||||||
|
gxf_long f;
|
||||||
|
f.l = EFtoF(efp);
|
||||||
|
f.f = f.f / l;
|
||||||
|
#ifdef _X86_
|
||||||
|
FtoEF( efp, f.l );
|
||||||
|
#else
|
||||||
|
FtoEF( efp, f.f );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
STDCALL
|
STDCALL
|
||||||
FLOATOBJ_Equal(
|
FLOATOBJ_Equal(
|
||||||
IN PFLOATOBJ pf,
|
IN PFLOATOBJ pf,
|
||||||
IN PFLOATOBJ pf1
|
IN PFLOATOBJ pf1
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// www.osr.com/ddk/graphics/gdifncs_6ysn.htm
|
// www.osr.com/ddk/graphics/gdifncs_6ysn.htm
|
||||||
UNIMPLEMENTED;
|
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
||||||
|
EFLOAT_S * efp1 = (EFLOAT_S *)pf1;
|
||||||
|
gxf_long f;
|
||||||
|
gxf_long f1;
|
||||||
|
f.l = EFtoF(efp);
|
||||||
|
f1.l = EFtoF(efp1);
|
||||||
|
if (f.f == f1.f) return TRUE;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
STDCALL
|
STDCALL
|
||||||
FLOATOBJ_EqualLong(
|
FLOATOBJ_EqualLong(
|
||||||
IN PFLOATOBJ pf,
|
IN PFLOATOBJ pf,
|
||||||
IN LONG l
|
IN LONG l
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// www.osr.com/ddk/graphics/gdifncs_1pgn.htm
|
// www.osr.com/ddk/graphics/gdifncs_1pgn.htm
|
||||||
UNIMPLEMENTED;
|
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
||||||
|
gxf_long f;
|
||||||
|
f.l = EFtoF(efp);
|
||||||
|
if (f.f == l) return TRUE;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -267,82 +342,133 @@ FLOATOBJ_GetLong ( IN PFLOATOBJ pf )
|
||||||
BOOL
|
BOOL
|
||||||
STDCALL
|
STDCALL
|
||||||
FLOATOBJ_GreaterThan(
|
FLOATOBJ_GreaterThan(
|
||||||
IN PFLOATOBJ pf,
|
IN PFLOATOBJ pf,
|
||||||
IN PFLOATOBJ pf1
|
IN PFLOATOBJ pf1
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// www.osr.com/ddk/graphics/gdifncs_8n53.htm
|
// www.osr.com/ddk/graphics/gdifncs_8n53.htm
|
||||||
UNIMPLEMENTED;
|
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
||||||
|
EFLOAT_S * efp1 = (EFLOAT_S *)pf1;
|
||||||
|
gxf_long f;
|
||||||
|
gxf_long f1;
|
||||||
|
f.l = EFtoF(efp);
|
||||||
|
f1.l = EFtoF(efp1);
|
||||||
|
if(f.f > f1.f) return TRUE;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
STDCALL
|
STDCALL
|
||||||
FLOATOBJ_GreaterThanLong(
|
FLOATOBJ_GreaterThanLong(
|
||||||
IN PFLOATOBJ pf,
|
IN PFLOATOBJ pf,
|
||||||
IN LONG l
|
IN LONG l
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// www.osr.com/ddk/graphics/gdifncs_6gx3.htm
|
// www.osr.com/ddk/graphics/gdifncs_6gx3.htm
|
||||||
UNIMPLEMENTED;
|
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
||||||
|
gxf_long f;
|
||||||
|
f.l = EFtoF(efp);
|
||||||
|
if (f.f > l) return TRUE;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
STDCALL
|
STDCALL
|
||||||
FLOATOBJ_LessThan(
|
FLOATOBJ_LessThan(
|
||||||
IN PFLOATOBJ pf,
|
IN PFLOATOBJ pf,
|
||||||
IN PFLOATOBJ pf1
|
IN PFLOATOBJ pf1
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// www.osr.com/ddk/graphics/gdifncs_1ynb.htm
|
// www.osr.com/ddk/graphics/gdifncs_1ynb.htm
|
||||||
UNIMPLEMENTED;
|
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
||||||
|
EFLOAT_S * efp1 = (EFLOAT_S *)pf1;
|
||||||
|
gxf_long f;
|
||||||
|
gxf_long f1;
|
||||||
|
f.l = EFtoF(efp);
|
||||||
|
f1.l = EFtoF(efp1);
|
||||||
|
if(f.f < f1.f) return TRUE;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
STDCALL
|
STDCALL
|
||||||
FLOATOBJ_LessThanLong(
|
FLOATOBJ_LessThanLong(
|
||||||
IN PFLOATOBJ pf,
|
IN PFLOATOBJ pf,
|
||||||
IN LONG l
|
IN LONG l
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// www.osr.com/ddk/graphics/gdifncs_9nzb.htm
|
// www.osr.com/ddk/graphics/gdifncs_9nzb.htm
|
||||||
UNIMPLEMENTED;
|
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
||||||
|
gxf_long f;
|
||||||
|
f.l = EFtoF(efp);
|
||||||
|
if (f.f < l) return TRUE;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
STDCALL
|
STDCALL
|
||||||
FLOATOBJ_Mul(
|
FLOATOBJ_Mul(
|
||||||
IN OUT PFLOATOBJ pf,
|
IN OUT PFLOATOBJ pf,
|
||||||
IN PFLOATOBJ pf1
|
IN PFLOATOBJ pf1
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// www.osr.com/ddk/graphics/gdifncs_8ppj.htm
|
// www.osr.com/ddk/graphics/gdifncs_8ppj.htm
|
||||||
UNIMPLEMENTED;
|
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
||||||
|
EFLOAT_S * efp1 = (EFLOAT_S *)pf1;
|
||||||
|
gxf_long f;
|
||||||
|
gxf_long f1;
|
||||||
|
f.l = EFtoF(efp);
|
||||||
|
f1.l = EFtoF(efp1);
|
||||||
|
f.f = f1.f * f.f;
|
||||||
|
#ifdef _X86_
|
||||||
|
FtoEF( efp, f.l );
|
||||||
|
#else
|
||||||
|
FtoEF( efp, f.f );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
STDCALL
|
STDCALL
|
||||||
FLOATOBJ_MulFloat(
|
FLOATOBJ_MulFloat(
|
||||||
IN OUT PFLOATOBJ pf,
|
IN OUT PFLOATOBJ pf,
|
||||||
IN FLOATL f
|
IN FLOATL f
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// www.osr.com/ddk/graphics/gdifncs_3puv.htm
|
// www.osr.com/ddk/graphics/gdifncs_3puv.htm
|
||||||
UNIMPLEMENTED;
|
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
||||||
|
gxf_long fe;
|
||||||
|
gxf_long f1;
|
||||||
|
fe.l = EFtoF(efp);
|
||||||
|
#ifdef _X86_
|
||||||
|
f1.l = f;
|
||||||
|
#else
|
||||||
|
f1.f = f;
|
||||||
|
#endif
|
||||||
|
fe.f = f1.f * fe.f;
|
||||||
|
#ifdef _X86_
|
||||||
|
FtoEF( efp, fe.l );
|
||||||
|
#else
|
||||||
|
FtoEF( efp, fe.f );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
STDCALL
|
STDCALL
|
||||||
FLOATOBJ_MulLong(
|
FLOATOBJ_MulLong(
|
||||||
IN OUT PFLOATOBJ pf,
|
IN OUT PFLOATOBJ pf,
|
||||||
IN LONG l
|
IN LONG l
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// www.osr.com/ddk/graphics/gdifncs_56lj.htm
|
// www.osr.com/ddk/graphics/gdifncs_56lj.htm
|
||||||
UNIMPLEMENTED;
|
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
||||||
|
gxf_long f;
|
||||||
|
f.l = EFtoF(efp);
|
||||||
|
f.f = f.f * l;
|
||||||
|
#ifdef _X86_
|
||||||
|
FtoEF( efp, f.l );
|
||||||
|
#else
|
||||||
|
FtoEF( efp, f.f );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
@ -357,9 +483,9 @@ FLOATOBJ_Neg ( IN OUT PFLOATOBJ pf )
|
||||||
VOID
|
VOID
|
||||||
STDCALL
|
STDCALL
|
||||||
FLOATOBJ_SetFloat(
|
FLOATOBJ_SetFloat(
|
||||||
OUT PFLOATOBJ pf,
|
OUT PFLOATOBJ pf,
|
||||||
IN FLOATL f
|
IN FLOATL f
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// www.osr.com/ddk/graphics/gdifncs_1prb.htm
|
// www.osr.com/ddk/graphics/gdifncs_1prb.htm
|
||||||
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
||||||
|
@ -369,9 +495,9 @@ FLOATOBJ_SetFloat(
|
||||||
VOID
|
VOID
|
||||||
STDCALL
|
STDCALL
|
||||||
FLOATOBJ_SetLong(
|
FLOATOBJ_SetLong(
|
||||||
OUT PFLOATOBJ pf,
|
OUT PFLOATOBJ pf,
|
||||||
IN LONG l
|
IN LONG l
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// www.osr.com/ddk/graphics/gdifncs_0gpz.htm
|
// www.osr.com/ddk/graphics/gdifncs_0gpz.htm
|
||||||
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
||||||
|
@ -387,32 +513,65 @@ FLOATOBJ_SetLong(
|
||||||
VOID
|
VOID
|
||||||
STDCALL
|
STDCALL
|
||||||
FLOATOBJ_Sub(
|
FLOATOBJ_Sub(
|
||||||
IN OUT PFLOATOBJ pf,
|
IN OUT PFLOATOBJ pf,
|
||||||
IN PFLOATOBJ pf1
|
IN PFLOATOBJ pf1
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// www.osr.com/ddk/graphics/gdifncs_6lyf.htm
|
// www.osr.com/ddk/graphics/gdifncs_6lyf.htm
|
||||||
UNIMPLEMENTED;
|
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
||||||
|
EFLOAT_S * efp1 = (EFLOAT_S *)pf1;
|
||||||
|
gxf_long f;
|
||||||
|
gxf_long f1;
|
||||||
|
f.l = EFtoF(efp);
|
||||||
|
f1.l = EFtoF(efp1);
|
||||||
|
f.f = f.f - f1.f;
|
||||||
|
#ifdef _X86_
|
||||||
|
FtoEF( efp, f.l );
|
||||||
|
#else
|
||||||
|
FtoEF( efp, f.f );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
STDCALL
|
STDCALL
|
||||||
FLOATOBJ_SubFloat(
|
FLOATOBJ_SubFloat(
|
||||||
IN OUT PFLOATOBJ pf,
|
IN OUT PFLOATOBJ pf,
|
||||||
IN FLOATL f
|
IN FLOATL f
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// www.osr.com/ddk/graphics/gdifncs_2zvr.htm
|
// www.osr.com/ddk/graphics/gdifncs_2zvr.htm
|
||||||
UNIMPLEMENTED;
|
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
||||||
|
gxf_long fe;
|
||||||
|
gxf_long f1;
|
||||||
|
fe.l = EFtoF(efp);
|
||||||
|
#ifdef _X86_
|
||||||
|
f1.l = f;
|
||||||
|
#else
|
||||||
|
f1.f = f;
|
||||||
|
#endif
|
||||||
|
fe.f = fe.f - f1.f;
|
||||||
|
#ifdef _X86_
|
||||||
|
FtoEF( efp, fe.l );
|
||||||
|
#else
|
||||||
|
FtoEF( efp, fe.f );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
STDCALL
|
STDCALL
|
||||||
FLOATOBJ_SubLong(
|
FLOATOBJ_SubLong(
|
||||||
IN OUT PFLOATOBJ pf,
|
IN OUT PFLOATOBJ pf,
|
||||||
IN LONG l
|
IN LONG l
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// www.osr.com/ddk/graphics/gdifncs_852f.htm
|
// www.osr.com/ddk/graphics/gdifncs_852f.htm
|
||||||
UNIMPLEMENTED;
|
EFLOAT_S * efp = (EFLOAT_S *)pf;
|
||||||
|
gxf_long f;
|
||||||
|
f.l = EFtoF(efp);
|
||||||
|
f.f = f.f - l;
|
||||||
|
#ifdef _X86_
|
||||||
|
FtoEF( efp, f.l );
|
||||||
|
#else
|
||||||
|
FtoEF( efp, f.f );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue