Skip to content

Commit

Permalink
update ps2sdk
Browse files Browse the repository at this point in the history
  • Loading branch information
ThirteenAG committed Oct 13, 2024
1 parent 645c3c1 commit 4000b8d
Show file tree
Hide file tree
Showing 13 changed files with 52 additions and 51 deletions.
2 changes: 1 addition & 1 deletion external/modutils
Submodule modutils updated 2 files
+64 −9 HookEach.hpp
+1 −0 ModuleList.hpp
2 changes: 1 addition & 1 deletion external/ps2sdk
Submodule ps2sdk updated 3201 files
10 changes: 5 additions & 5 deletions includes/pcsx2/inireader.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

void SetIniPath(const char* szFileContent, size_t size)
{
inireader.iniBuf = szFileContent;
inireader.iniBuf = (int)szFileContent;
inireader.iniBufSize = size;
}

int ReadInteger(char* szSection, char* szKey, int iDefaultValue)
{
// hex numbers are not supported
int result = iDefaultValue;
if (rini_get_key(szSection, szKey, inireader.iniBuf, inireader.iniBufSize, &result, sizeof(result), INT_VAL))
if (rini_get_key(szSection, szKey, (char*)inireader.iniBuf, inireader.iniBufSize, &result, sizeof(result), INT_VAL))
{
return result;
}
Expand Down Expand Up @@ -55,7 +55,7 @@ float ratof(char* arr)
float ReadFloat(char* szSection, char* szKey, float fltDefaultValue)
{
static char Buffer[30];
if (rini_get_key(szSection, szKey, inireader.iniBuf, inireader.iniBufSize, &Buffer, sizeof(Buffer), STRING_VAL))
if (rini_get_key(szSection, szKey, (char*)inireader.iniBuf, inireader.iniBufSize, &Buffer, sizeof(Buffer), STRING_VAL))
{
return ratof(Buffer);
}
Expand All @@ -68,7 +68,7 @@ float ReadFloat(char* szSection, char* szKey, float fltDefaultValue)
bool ReadBoolean(char* szSection, char* szKey, bool bDefaultValue)
{
bool result = bDefaultValue;
if (rini_get_key(szSection, szKey, inireader.iniBuf, inireader.iniBufSize, &result, sizeof(result), BOOL_VAL))
if (rini_get_key(szSection, szKey, (char*)inireader.iniBuf, inireader.iniBufSize, &result, sizeof(result), BOOL_VAL))
{
return result;
}
Expand All @@ -80,7 +80,7 @@ bool ReadBoolean(char* szSection, char* szKey, bool bDefaultValue)

char* ReadString(char* szSection, char* szKey, char* szDefaultValue, char* Buffer, int BufferSize)
{
if (rini_get_key(szSection, szKey, inireader.iniBuf, inireader.iniBufSize, Buffer, BufferSize, STRING_VAL))
if (rini_get_key(szSection, szKey, (char*)inireader.iniBuf, inireader.iniBufSize, Buffer, BufferSize, STRING_VAL))
{
while (*Buffer == ' ')
*Buffer++;
Expand Down
16 changes: 8 additions & 8 deletions includes/pcsx2/injector.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ uint32_t parseCommand(uint32_t command, uint32_t from, uint32_t to)
return (command & mask) >> from;
}

void* GetGP()
void* _GetGP()
{
unsigned int gp;
void* gp;
asm(
"move %0, $gp\n"
: "=r"(gp)
Expand All @@ -26,17 +26,17 @@ uintptr_t adjustAddress(uintptr_t addr)

void WriteMemoryRaw(uintptr_t addr, void* value, size_t size)
{
memcpy(adjustAddress(addr), value, size);
memcpy((void*)adjustAddress(addr), value, size);
}

void ReadMemoryRaw(uintptr_t addr, void* ret, size_t size)
{
memcpy(ret, adjustAddress(addr), size);
memcpy((void*)ret, (void*)adjustAddress(addr), size);
}

void MemoryFill(uintptr_t addr, uint8_t value, size_t size)
{
unsigned char* p = adjustAddress(addr);
unsigned char* p = (unsigned char*)adjustAddress(addr);
while (size--)
{
*p++ = (unsigned char)value;
Expand Down Expand Up @@ -134,7 +134,7 @@ uintptr_t MakeJMPwNOP(uintptr_t at, uintptr_t dest)
{
uintptr_t bd = GetBranchDestination(at);
WriteMemory32(adjustAddress(at), (0x08000000 | ((adjustAddress(dest) & 0x0FFFFFFC) >> 2)));
MakeNOP(adjustAddress(at + 4));
injector.MakeNOP(adjustAddress(at + 4));
return bd;
}

Expand Down Expand Up @@ -182,7 +182,7 @@ uintptr_t MakeInline(size_t instrCount, uintptr_t at, ...)
}

uintptr_t MakeCallStub(uintptr_t numInstr) {
return AllocMemBlock(numInstr * sizeof(uintptr_t));
return (uintptr_t)AllocMemBlock(numInstr * sizeof(uintptr_t));
}

void MakeLUIORI(uintptr_t at, RegisterID reg, float imm)
Expand Down Expand Up @@ -291,7 +291,7 @@ void MakeInlineLI(uintptr_t at, int32_t imm)

struct injector_t injector =
{
.GetGP = GetGP,
.GetGP = _GetGP,
.WriteMemoryRaw = WriteMemoryRaw,
.ReadMemoryRaw = ReadMemoryRaw,
.MemoryFill = MemoryFill,
Expand Down
4 changes: 2 additions & 2 deletions includes/pcsx2/injector.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,6 @@ extern struct injector_t injector;
9,8,7,6,5,4,3,2,1,0
#endif

#define MakeInlineWrapper(at, ...) MakeInline(PP_NARG(__VA_ARGS__), at, __VA_ARGS__)
#define MakeInlineWrapperWithNOP(at, ...) MakeNOP(at + 4); MakeInline(PP_NARG(__VA_ARGS__), at, __VA_ARGS__)
#define MakeInlineWrapper(at, ...) injector.MakeInline(PP_NARG(__VA_ARGS__), at, __VA_ARGS__)
#define MakeInlineWrapperWithNOP(at, ...) injector.MakeNOP(at + 4); injector.MakeInline(PP_NARG(__VA_ARGS__), at, __VA_ARGS__)
#endif
2 changes: 1 addition & 1 deletion includes/pcsx2/memalloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#endif

int mem_custom_initialized = 0;
char mem_custom[MEM_CUSTOM_TOTAL_SIZE] = { 0 };
char mem_custom[MEM_CUSTOM_TOTAL_SIZE] = { 1 };
struct mem_block* mem_freeList = (struct mem_block*)mem_custom;

void mem_initialize() {
Expand Down
1 change: 1 addition & 0 deletions includes/pcsx2/memalloc.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define H_MEMALLOC
#include <stdio.h>
#include <stddef.h>
#include <string.h>

struct mem_block {
size_t size;
Expand Down
4 changes: 2 additions & 2 deletions includes/pcsx2/patterns.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,9 @@ uintptr_t range_get(size_t count, uintptr_t range_start, size_t range_size, cons
size_t len = strlen(pattern_str);
static uint8_t buf[buf_size/*len*/];
uint8_t size = hextobin(pattern_str, buf, len, wc);
uint8_t* result = bytes_find_nth(count, range_start, range_size, buf, size, wc);
uint8_t* result = bytes_find_nth(count, (uint8_t*)range_start, range_size, buf, size, wc);
if (result)
return result + offset;
return (uintptr_t)(result + offset);
else
return 0;
}
Expand Down
12 changes: 6 additions & 6 deletions source/GTALCS.PCSX2F.WidescreenFix/lodl.c
Original file line number Diff line number Diff line change
Expand Up @@ -4831,7 +4831,7 @@ void RegisterLODLights()
{
if (!aLodLights[i].nCoronaShowMode)
{
CCoronas__RegisterCorona(&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0);
CCoronas__RegisterCorona((int)&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0);
}
//else
//{
Expand All @@ -4850,7 +4850,7 @@ void RegisterLODLights()
{
if ((aLodLights[i].r >= 250 && aLodLights[i].g >= 100 && aLodLights[i].b <= 100) && ((curMin == 9 || curMin == 19 || curMin == 29 || curMin == 39 || curMin == 49 || curMin == 59))) //yellow
{
CCoronas__RegisterCorona(&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0);
CCoronas__RegisterCorona((int)&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0);
}
else
{
Expand All @@ -4859,27 +4859,27 @@ void RegisterLODLights()
{
if ((aLodLights[i].r >= 250 && aLodLights[i].g < 100 && aLodLights[i].b == 0) && (((curMin >= 0 && curMin < 9) || (curMin >= 20 && curMin < 29) || (curMin >= 40 && curMin < 49)))) //red
{
CCoronas__RegisterCorona(&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0);
CCoronas__RegisterCorona((int)&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0);
}
else
{
if ((aLodLights[i].r == 0 && aLodLights[i].g >= 250 && aLodLights[i].b == 0) && (((curMin > 9 && curMin < 19) || (curMin > 29 && curMin < 39) || (curMin > 49 && curMin < 59)))) //green
{
CCoronas__RegisterCorona(&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0);
CCoronas__RegisterCorona((int)&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0);
}
}
}
else
{
if ((aLodLights[i].r == 0 && aLodLights[i].g >= 250 && aLodLights[i].b == 0) && (((curMin >= 0 && curMin < 9) || (curMin >= 20 && curMin < 29) || (curMin >= 40 && curMin < 49)))) //red
{
CCoronas__RegisterCorona(&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0);
CCoronas__RegisterCorona((int)&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0);
}
else
{
if ((aLodLights[i].r >= 250 && aLodLights[i].g < 100 && aLodLights[i].b == 0) && (((curMin > 9 && curMin < 19) || (curMin > 29 && curMin < 39) || (curMin > 49 && curMin < 59)))) //green
{
CCoronas__RegisterCorona(&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0);
CCoronas__RegisterCorona((int)&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0);
}
}
}
Expand Down
10 changes: 5 additions & 5 deletions source/GTAVCS.PCSX2F.ImVehLM/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -538,7 +538,7 @@ struct VehicleLightsData
uint8_t align16 rasterBuffer[NUM_LIGHTS][16384];
};

struct VehicleLightsData align16 arrayofData[NUM_VEHICLES - _6ATV] = { 0 };
struct VehicleLightsData align16 arrayofData[NUM_VEHICLES - _6ATV] = { 1 };

struct RslTexture* DuplicateCarTexture(int arrI, int lightI, struct RslTexture* src)
{
Expand Down Expand Up @@ -670,19 +670,19 @@ int CEntity__Render(void* car)

#ifdef DUMPER_MODE
int (*FindPlayerVehicle)() = (void*)0x24A2D0;
if (FindPlayerVehicle() == (int)car)
if (FindPlayerVehicle() == (uintptr_t)car)
#endif
{
#ifdef DUMPER_MODE
if (gPVeh != (int)car)
if (gPVeh != (uintptr_t)car)
gCounter = 0;

gPVeh = (int)car;
gPVeh = (uintptr_t)car;
counter++;
#endif

// PreRender
struct RslElement* m_pRwClump = *(struct RslElement**)((int)car + 0x50);
struct RslElement* m_pRwClump = *(struct RslElement**)((uintptr_t)car + 0x50);
RslElementGroupForAllElements(m_pRwClump, SetElementRendererCB_ImVehLM, car);
// Render
res = CEntityRender(car);
Expand Down
12 changes: 6 additions & 6 deletions source/GTAVCS.PCSX2F.Project2DFX/lodl.c
Original file line number Diff line number Diff line change
Expand Up @@ -4831,7 +4831,7 @@ void RegisterLODLights()
{
//if (!aLodLights[i].nCoronaShowMode)
{
CCoronas__RegisterCorona(&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0, 0);
CCoronas__RegisterCorona((int)&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0, 0);
}
//else //causes crashing for some reason
//{
Expand All @@ -4853,7 +4853,7 @@ void RegisterLODLights()
{
if ((aLodLights[i].r >= 250 && aLodLights[i].g >= 100 && aLodLights[i].b <= 100) && ((curMin == 9 || curMin == 19 || curMin == 29 || curMin == 39 || curMin == 49 || curMin == 59))) //yellow
{
CCoronas__RegisterCorona(&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0, 0);
CCoronas__RegisterCorona((int)&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0, 0);
}
else
{
Expand All @@ -4862,27 +4862,27 @@ void RegisterLODLights()
{
if ((aLodLights[i].r >= 250 && aLodLights[i].g < 100 && aLodLights[i].b == 0) && (((curMin >= 0 && curMin < 9) || (curMin >= 20 && curMin < 29) || (curMin >= 40 && curMin < 49)))) //red
{
CCoronas__RegisterCorona(&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0, 0);
CCoronas__RegisterCorona((int)&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0, 0);
}
else
{
if ((aLodLights[i].r == 0 && aLodLights[i].g >= 250 && aLodLights[i].b == 0) && (((curMin > 9 && curMin < 19) || (curMin > 29 && curMin < 39) || (curMin > 49 && curMin < 59)))) //green
{
CCoronas__RegisterCorona(&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0, 0);
CCoronas__RegisterCorona((int)&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0, 0);
}
}
}
else
{
if ((aLodLights[i].r == 0 && aLodLights[i].g >= 250 && aLodLights[i].b == 0) && (((curMin >= 0 && curMin < 9) || (curMin >= 20 && curMin < 29) || (curMin >= 40 && curMin < 49)))) //red
{
CCoronas__RegisterCorona(&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0, 0);
CCoronas__RegisterCorona((int)&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0, 0);
}
else
{
if ((aLodLights[i].r >= 250 && aLodLights[i].g < 100 && aLodLights[i].b == 0) && (((curMin > 9 && curMin < 19) || (curMin > 29 && curMin < 39) || (curMin > 49 && curMin < 59)))) //green
{
CCoronas__RegisterCorona(&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0, 0);
CCoronas__RegisterCorona((int)&aLodLights[i], aLodLights[i].r, aLodLights[i].g, aLodLights[i].b, alpha, pos, 0, 0, radius, fCoronaFarClip, fUnkDist1, fUnkDist2, 1, 0, 0, 0, 0);
}
}
}
Expand Down
24 changes: 12 additions & 12 deletions source/GTAVCS.PCSX2F.WidescreenFix/ckey.c
Original file line number Diff line number Diff line change
Expand Up @@ -184,10 +184,10 @@ void ReplacePadFuncsWithPCControls()
injector.MakeNOPWithSize(0x2955D8, 64);
MakeInlineWrapper(0x2955D8,
move(at, v0),
jal(CPad__KBLookAroundLeftRightNoTimeStamp),
jal((uintptr_t)CPad__KBLookAroundLeftRightNoTimeStamp),
move(a0, at),
movs(f20, f0),
jal(CPad__KBLookAroundUpDownNoTimeStamp),
jal((uintptr_t)CPad__KBLookAroundUpDownNoTimeStamp),
move(a0, at),
movs(f5, f0),
lui(at, 0x3F80),
Expand All @@ -205,10 +205,10 @@ void ReplacePadFuncsWithPCControls()
{
injector.MakeNOPWithSize(0x29EC9C, 44);
MakeInlineWrapper(0x29EC9C,
jal(CPad__KBLookAroundLeftRightNoTimeStamp),
jal((uintptr_t)CPad__KBLookAroundLeftRightNoTimeStamp),
lw(a0, sp, 0xBC),
movs(f20, f0),
jal(CPad__KBLookAroundUpDownNoTimeStamp),
jal((uintptr_t)CPad__KBLookAroundUpDownNoTimeStamp),
lw(a0, sp, 0xBC),
movs(f21, f0)
);
Expand Down Expand Up @@ -241,10 +241,10 @@ void ReplacePadFuncsWithPCControls()
{
injector.MakeNOPWithSize(0x2A0E94, 44);
MakeInlineWrapper(0x2A0E94,
jal(CPad__KBLookAroundLeftRightNoTimeStamp),
jal((uintptr_t)CPad__KBLookAroundLeftRightNoTimeStamp),
lw(a0, sp, 0xCC),
movs(f20, f0),
jal(CPad__KBLookAroundUpDownNoTimeStamp),
jal((uintptr_t)CPad__KBLookAroundUpDownNoTimeStamp),
lw(a0, sp, 0xCC),
movs(f21, f0)
);
Expand All @@ -263,10 +263,10 @@ void ReplacePadFuncsWithPCControls()
injector.MakeNOPWithSize(0x29804C, 52);
MakeInlineWrapper(0x29804C,
move(at, v0),
jal(CPad__KBLookAroundLeftRightNoTimeStamp),
jal((uintptr_t)CPad__KBLookAroundLeftRightNoTimeStamp),
move(a0, at),
movs(f21, f0),
jal(CPad__KBLookAroundUpDownNoTimeStamp),
jal((uintptr_t)CPad__KBLookAroundUpDownNoTimeStamp),
move(a0, at),
movs(f8, f0)
);
Expand Down Expand Up @@ -327,10 +327,10 @@ void ReplacePadFuncsWithPCControls()
injector.MakeNOPWithSize(0x29CD04, 56);
MakeInlineWrapper(0x29CD04,
move(at, v0),
jal(CPad__KBLookAroundLeftRightNoTimeStamp),
jal((uintptr_t)CPad__KBLookAroundLeftRightNoTimeStamp),
move(a0, at),
movs(f20, f0),
jal(CPad__KBLookAroundUpDownNoTimeStamp),
jal((uintptr_t)CPad__KBLookAroundUpDownNoTimeStamp),
move(a0, at)
//movs(f0, f0)
);
Expand All @@ -349,10 +349,10 @@ void ReplacePadFuncsWithPCControls()
mtc1(at, f23),
lui(at, 0x42DC),
mtc1(at, f24),
jal(CPad__KBLookAroundLeftRightNoTimeStamp),
jal((uintptr_t)CPad__KBLookAroundLeftRightNoTimeStamp),
move(a0, s0),
movs(f22, f0),
jal(CPad__KBLookAroundUpDownNoTimeStamp),
jal((uintptr_t)CPad__KBLookAroundUpDownNoTimeStamp),
move(a0, s0),
movs(f25, f0)
);
Expand Down
4 changes: 2 additions & 2 deletions source/GTAVCS.PCSX2F.WidescreenFix/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,7 @@ void init()
{
//logger.Write("Fixing FOV...");
uintptr_t ptr_44A648 = pattern.get(0, "90 FF BD 27 58 00 B5 E7 50 00 B4 E7 46 6D 00 46", 0);
game_atan2f = (float (*)(float))ptr_44A648;
game_atan2f = (float (*)(float, float))ptr_44A648;
uintptr_t ptr_21CD68 = pattern.get(0, "03 84 10 00 03 8C 11 00 03 94 12 00 03 9C 13 00 03 A4 14 00 03 AC 15 00", 0);
flt_487484 = (float*)GetAbsoluteAddress(ptr_21CD68, 32, 48);
temp_t = tan(fDefaultFOV / 2.0f * ((float)M_PI / 180.0f));
Expand Down Expand Up @@ -480,7 +480,7 @@ void init()
MakeInlineWrapper(0x37281C,
lui(at, 0x40A0),
move(a0, s0),
jal(isLittleWillie),
jal((uintptr_t)isLittleWillie),
nop()
);
}
Expand Down

0 comments on commit 4000b8d

Please sign in to comment.