Mods / One-Roof

Category: #QoL #Simplification #Utility
Author: tui_smuggler
Side: Both
Created: Jan 6th at 12:49 AM
Last modified: 5 days ago
Downloads: 1970
Follow Unfollow 89

Latest file for v1.19.7:
oneroof_0.10.0.zip 1-click install


One roof is a 'single block' multi-roof mod, implementing up to four additional slopes including corners, ridges and eaves. This mod uses an intuitive system based on placement direction to infer the correct roof piece when placing. For ridge and eave block hold ctrl while placing.

In an effort to actually release something and get it out there I have opted to release in a 'beta' state. This essentially means there are known issues that will be addressed in time - though none should be game breaking.

1.0 Release Roadmap

  • Tweak eave sizes
  • Fix block breaking visuals
  • Tweak snow cover for ridges
  • Tweak ridge blocks when used in T junction.
  • Add thatch block
  • Remappable alternate (ctrl) key (If possible)
    • Implement additional alternate keys for better control overall (i.e. a seperate key for ridge and eaves allowing certain combinations to become possible).
  • Add support for eaves to form inner corners
  • Video/Gif showing how it works

Future intended mod support

  • BrickLayers

Beyond this I would like to eventually add additional roof types etc. Once the code side is stable enough its just a matter of making the models. Hoping to leverage off some existing models from older now abandoned roofing mods.

Version For Game version Downloads Release date Changelog Download 1-click mod install*
v0.10.0 143 5 days ago Show oneroof_0.10.0.zip Install now
v0.9.9 1402 Jan 15th at 10:38 PM Show oneroof_0.9.9.zip Install now
v0.9.8 86 Jan 15th at 7:35 AM Show oneroof_0.9.8.zip Install now
v0.9.7 181 Jan 10th at 11:12 PM Show oneroof_0.9.7.zip Install now

24 Comments (oldest first | newest first)

💬 VallenModerator, Apr 10th at 10:40 AM

Getting some errors on 1.19.7. See info posted here on Hastebin: https://hastebin.skyra.pw/ratawaxuqu.sql

💬 AuGrr, Apr 4th at 5:45 PM

Running 19.5 stable and I tried to place a two long roof piece from behind one that was placed next to one already placed beside the piece. It also locked me out of the server I used it in so I have to remove the mod entirely to use the server.

 

Running on 64 bit Windows 10.0.22631.0 with 31962 MB RAM
Game Version: v1.19.4 (Stable)
4/4/2024 1:41:11 PM: Critical error occurred
Loaded Mods: aculinaryartillery@1.1.3, betterdrifters@2.1.3, immersivecorpsedrop@1.0.2, millwright@1.1.4, MoreShingles@0.0.2, nailsmold@1.0.1, primitivesurvival@3.4.7, rooffix@0.0.1, rustcreatures@1.3.0, spedupseeling@1.2.1, translocatorengineeringredux@1.4.9, game@1.19.4, abcsreborn@0.2.0, animationmanagerlib@0.7.2, BedRespawning@1.0.1, beehivekiln@1.5.1, betterruins@0.3.3, carryon@1.7.4, commonlib@2.3.7, electricity@0.0.11, expandedfoods@1.6.8, herbarium@1.1.0, hudclock@3.4.0, sailboat@1.2.8, loreweapons@1.0.1, medievalexpansion@3.13.1, mcrate@1.2.1, nbcartographer@2.0.9, oneroof@0.9.9, petai@2.2.3, prospecttogether@1.3.0, rivers@2.7.0, scythemold@1.0.1, stablesurface@0.0.2, stonebakeoven@1.1.3, storageoptions@1.0.2, creative@1.19.4, vsimgui@1.1.1, survival@1.19.4, wildfarmingrevival@1.1.8, metalrecovery@0.1.19-pre.1, chemistrylib@1.1.5, configlib@1.0.2, electricityextensions@0.0.3, feverstonewilds@1.4.5, fsmlib@0.2.15, helvehammerext@1.6.0, koboldplayermodelport@1.2.6, playercorpse@1.9.0, stonequarry@3.2.1, wildcraftfruit@1.1.1, wildcraftherb@0.0.0, wildcrafttree@1.1.0, kosfire@1.1.3, maltiezfirearms@0.4.3
System.InvalidOperationException: Sequence contains no elements
at System.Linq.ThrowHelper.ThrowNoElementsException()
at System.Linq.Enumerable.MaxFloat[TSource,TResult](IEnumerable`1 source, Func`2 selector)
at Vintagestory.API.Common.EntityPlayer.canPlayEdgeSitAnim() in VintagestoryApi\Common\Entity\EntityPlayer.cs:line 995
at Vintagestory.API.Common.EntityPlayer.onAnimControls(AnimationMetaData anim, Boolean wasActive, Boolean nowActive) in VintagestoryApi\Common\Entity\EntityPlayer.cs:line 930
at Vintagestory.API.Common.EntityAgent.OnGameTick(Single dt) in VintagestoryApi\Common\Entity\EntityAgent.cs:line 491
at Vintagestory.API.Common.EntityPlayer.OnGameTick(Single dt) in VintagestoryApi\Common\Entity\EntityPlayer.cs:line 678
at Vintagestory.Client.NoObf.ClientSystemEntities.OnGameTick(Single dt) in VintagestoryLib\Client\Systems\Entities.cs:line 95
at Vintagestory.Common.GameTickListener.OnTriggered(Int64 ellapsedMilliseconds) in VintagestoryLib\Common\Model\GameTickListener.cs:line 19
at Vintagestory.Common.EventManager.TriggerGameTick(Int64 ellapsedMilliseconds, IWorldAccessor world) in VintagestoryLib\Common\EventManager.cs:line 81
at Vintagestory.Client.NoObf.ClientMain.MainRenderLoop(Single dt) in VintagestoryLib\Client\ClientMain.cs:line 838
at Vintagestory.Client.NoObf.ClientMain.MainGaenManager.Render(Single dt) in VintagestoryLib\Client\ScreenManager.cs:line 676
at Vintagestory.Client.ScreenManager.OnNewFrame(Single dt) in VintagestoryLib\Client\ScreenManager.cs:line 651
at Vintagestory.Client.NoObf.ClientPlatformWindows.window_RenderFrame(FrameEventArgs e) in VintagestoryLib\Client\ClientPlatform\GameWindow.cs:line 88
at OpenTK.Windowing.Desktop.GameWindow.Run()
at Vintagestory.Client.ClientProgram.Start(ClientProgramArgs args, String[] rawArgs) in VintagestoryLib\Client\ClientProgram.cs:line 324
at Vintagestory.Client.ClientProgram.<>c__DisplayClass9_0.<.ctor>b__1() in VintagestoryLib\Client\ClientProgram.cs:line 128
at Vintagestory.ClientNative.CrashReporter.Start(ThreadStart start) in VintagestoryLib\Client\ClientPlatform\ClientNative\CrashReporter.cs:line 93

Event Log entries for Vintagestory.exe, the latest 3
==================================
{ TimeGenerated = 4/4/2024 1:40:32 PM, Site = , Source = Application Error, Message = Faulting application name: Vintagestory.exe, version: 1.19.4.0, time stamp: 0x65310000
Faulting module name: openal32.dll, version: 1.23.0.0, time stamp: 0x63dd31ad
Exception code: 0x40000015
Fault offset: 0x00000000000df046
Faulting process id: 0x0xb2c
Faulting application start time: 0x0x1da86b7182bdb60
Faulting application path: F:\Vintagestory\Vintagestory.exe
Faulting module path: F:\Vintagestory\Lib\openal32.dll
Report Id: 5eb513aa-305f-437d-86e5-a3ac57ae557e
Faulting package full name:
Faulting package-relative application ID: }
--------------
{ TimeGenerated = 3/28/2024 12:20:59 PM, Site = , Source = Application Error, Message = Faulting application name: Vintagestory.exe, version: 1.19.4.0, time stamp: 0x65310000
Faulting module name: KERNELBASE.dll, version: 10.0.22621.3235, time stamp: 0x2b72307b
Exception code: 0xe0434352
Fault offset: 0x0000000000065b0c
Faulting process id: 0x0x17c4
Faulting application start time: 0x0x1da812a79857452
Faulting application path: F:\Vintagestory\Vintagestory.exe
Faulting module path: C:\Windows\System32\KERNELBASE.dll
Report Id: c15e7cff-45b0-4978-af5e-1ac13bea8647
Faulting package full name:
Faulting package-relative application ID: }
--------------
{ TimeGenerated = 3/7/2024 7:39:16 PM, Site = , Source = Application Error, Message = Faulting application name: Vintagestory.exe, version: 1.19.4.0, time stamp: 0x65310000
Faulting module name: openal32.dll, version: 1.23.0.0, time stamp: 0x63dd31ad
Exception code: 0x40000015
Fault offset: 0x00000000000df046
Faulting process id: 0x0x376c
Faulting application start time: 0x0x1da70f0f2c6ecfd
Faulting application path: F:\Vintagestory\Vintagestory.exe
Faulting module path: F:\Vintagestory\Lib\openal32.dll
Report Id: 91a4bab8-b48e-44bc-8e8c-e733ccbb85d1
Faulting package full name:
Faulting package-relative application ID: }meLoop(Single deltaTime) in VintagestoryLib\Client\ClientMain.cs:line 730
at Vintagestory.Client.GuiScreenRunningGame.RenderToPrimary(Single dt) in VintagestoryLib\Client\MainMenu\Screens\GuiScreenRunningGame.cs:line 163
at Vintagestory.Client.Scre

💬 tui_smugglerAuthor, Feb 29th at 2:18 AM

Have been super busy lately with work and life. Haven't forgotten about this though.
Just wanted to say that I'd appreciate any crash reports so I can address them. Posting here is probably as good a place as any, if it becomes annoying I'll look at opening a github repo or something for it.

💬 Mega_Glub, Feb 18th at 9:02 AM

Been having an issue with rare crashes while placing some of the blocks. Looks like the game doesn't always perfectly switch between 1 tall and 2 tall roofs. Still a great mod tho, despite the annoying crashes.

💬 SaiDeer, Feb 8th at 8:00 PM

Would be really neat to add diagonal roofs to this. I know that that might be opening a whole other can of worms, but it would be just perfect for tower roofs.

That, as well as having slim roofs that aren't based on the vanilla block shape.

Great work though, it's by far the best roof mod around!

💬 W4RD0, Feb 7th at 1:22 PM

I dont know if it would be possible to make, but being able to change the texture of the "side" of the roof, like how you add another block to a chiseled one, would be amazing. and maybe a possibilty to make the roofs have or not have overhang would be cool.

💬 Mega_Glub, Jan 27th at 6:31 AM

Awesome work! Is the issue with the outer corner models on the roof blocks on your radar? The vanilla models for outer corner have a flat bottom but the ones in the mod seem to be missing the bottom plane. Pretty minor, but annoying sometimes.

💬 Cpt_C0nfus3d, Jan 23rd at 12:33 AM

Yes I use Bricklayers, no problem I just wanted to let you know all is well. Game version is 1.19.1

💬 tui_smugglerAuthor, Jan 22nd at 11:55 PM

Cpt_C0nfus3d I'm assuming you are using bricklayers or some mod that adds a whole bunch of extra colors. It shouldn't be too much trouble to add support but the other tasks will take precedence. 

💬 Cpt_C0nfus3d, Jan 22nd at 11:56 AM

22.1.2024 12:55:31 [Error] Grid Recipe 'oneroof:recipes/grid/roofing.json': Output Block code oneroof:oneroof-blackclay-free cannot be resolved
22.1.2024 12:55:31 [Error] Grid Recipe 'oneroof:recipes/grid/roofing.json': Output Block code oneroof:oneroof-blurpleclay-free cannot be resolved
22.1.2024 12:55:31 [Error] Grid Recipe 'oneroof:recipes/grid/roofing.json': Output Block code oneroof:oneroof-darkgreyclay-free cannot be resolved
22.1.2024 12:55:31 [Error] Grid Recipe 'oneroof:recipes/grid/roofing.json': Output Block code oneroof:oneroof-greenclay-free cannot be resolved
22.1.2024 12:55:31 [Error] Grid Recipe 'oneroof:recipes/grid/roofing.json': Output Block code oneroof:oneroof-lightclay-free cannot be resolved
22.1.2024 12:55:31 [Error] Grid Recipe 'oneroof:recipes/grid/roofing.json': Output Block code oneroof:oneroof-malachiteclay-free cannot be resolved
22.1.2024 12:55:31 [Error] Grid Recipe 'oneroof:recipes/grid/roofing.json': Output Block code oneroof:oneroof-orangeclay-free cannot be resolved
22.1.2024 12:55:31 [Error] Grid Recipe 'oneroof:recipes/grid/roofing.json': Output Block code oneroof:oneroof-pinkclay-free cannot be resolved
22.1.2024 12:55:31 [Error] Grid Recipe 'oneroof:recipes/grid/roofing.json': Output Block code oneroof:oneroof-purpleclay-free cannot be resolved
22.1.2024 12:55:31 [Error] Grid Recipe 'oneroof:recipes/grid/roofing.json': Output Block code oneroof:oneroof-yellowclay-free cannot be resolved

💬 AzuliBluespots, Jan 16th at 12:49 AM

I noticed the translation for this mod is simple, but I translated it on Crowdin anyway :3

By the way, how is the insulation on these? Or were the insulation issues on vanilla roof blocks fixed already?

💬 tui_smugglerAuthor, Jan 15th at 7:23 PM

VaelophisNyx  For low slopes it works somewhat, but standard + high slopes its not working. I'll add it to the to do list! 

edit: I have patched the high slopes. The mesh could use a tweak. But as it is it 'works'.

💬 VaelophisNyx, Jan 15th at 9:05 AM

Does this cover the situation where you need to T-junction with a roof ridge? vanilla's roofs don't have that bit

💬 Louskil, Jan 11th at 8:57 PM

tui_smuggler

Thanks for the fast response, the issue is totally fixed, no trace of it, but rather a funny visual "feature", Thanks for the work done in such a short span time, and here's the vid about that funny "feature" we found: https://youtube.com/live/B-_ZFCKFrE4

 

💬 tui_smugglerAuthor, Jan 10th at 11:13 PM

I have deleted all releases prior to 0.9.7 as they had major problems with multiplayer. Please let me know if you experience any performance (fps) issues. Note, a little delay on the roof building is to be expected with slow connections on MP games. Performance is very important to me and is the main reason I started this mod (compared to some other fancy roofing mods that ate up all my RAM and took minutes to load a game).

💬 tui_smugglerAuthor, Jan 9th at 11:27 PM

Louskil thanks for the video, very helpful! I will do some multiplayer/networking testing and bugfixing asap (after work when I have some spare time). I have a bit of an idea of what has gone wrong with the mod. Thanks again for posting the video.

💬 Louskil, Jan 9th at 10:27 PM

tui_smuggler

Thanks for the response! So we got the 9.5 version, and still the crash occurs at the moment the block is placed the log:

Running on 64 bit Windows with 16320 MB RAM
Game Version: v1.18.15 (Stable)
09.01.2024 23:36:22: Critical error occurred in the following mod: oneroof@0.9.5
Loaded Mods: aculinaryartillery@1.0.15, betterbalance@2.1.3, betterruins@0.2.4, immersivecorpsedrop@1.0.1, millwright@1.1.1, MoreShingles@0.0.2, nailsmold@1.0.1, primitivesurvival@3.3.0, rooffix@0.0.1, rpgitemrarity@1.0.4, rustcreatures@1.2.0, spedupseeling@1.2.1, translocatorengineeringredux@1.4.7, game@1.18.15, wildcraft@1.6.6, abcsreborn@0.1.4, animationmanagerlib@0.2.1, BedRespawning@1.0.1, canbeignited@1.1.0, carryon@1.6.1, commonlib@2.2.0, compatmaster@0.0.2, electricity@0.0.10, expandedfoods@1.6.8, fieldsofsalt@1.1.2, hudclock@3.3.0, immersivecrafting@1.1.1, sailboat@1.2.4, justanarrowheadmold@1.0.1, lavoisier@1.3.0, loreweapons@1.0.1, medievalexpansion@3.11.1, oneroof@0.9.5, petai@1.8.1, prospecttogether@1.2.4, rustyshell@0.0.11, scythemold@1.0.0, sharablewaypoints@1.3.2, stablesurface@0.0.2, stonebakeoven@1.0.5, storageoptions@1.0.1, temporalsmithing@0.2.2, creative@1.18.15, survival@1.18.15, wildfarmingrevival@1.1.6, metalrecovery@0.1.19-pre.1, chemistrylib@1.1.5, feverstonewilds@1.4.3, foxtaming@1.3.0, fsmlib@0.1.13, helvehammerext@1.5.2, linearpower@0.2.1, playercorpse@1.8.0, stonequarry@3.1.5, kosfire@1.1.3, maltiezfirearms@0.3.9
System.InvalidOperationException: Sequence contains no elements
at System.Linq.ThrowHelper.ThrowNoElementsException()
at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
at oneroof.src.OneRoofEntity.ConstructSecondaryElements() in C:\Users\Daniel\Documents\workspace\vs\version2\one-roof\one-roof\src\oneroofentity.cs:line 617
at oneroof.src.OneRoofEntity.BuildSecondaryStandard() in C:\Users\Daniel\Documents\workspace\vs\version2\one-roof\one-roof\src\oneroofentity.cs:line 283
at oneroof.src.OneRoofEntity.BuildSecondary() in C:\Users\Daniel\Documents\workspace\vs\version2\one-roof\one-roof\src\oneroofentity.cs:line 234
at Vintagestory.Client.NoObf.ClientMain.ExecuteMainThreadTasks(Single deltaTime) in VintagestoryLib\Client\ClientMain.cs:line 757
at Vintagestory.Client.GuiScreenRunningGame.RenderToPrimary(Single dt) in VintagestoryLib\Client\MainMenu\Screens\GuiScreenRunningGame.cs:line 200
at Vintagestory.Client.ScreenManager.Render(Single dt) in VintagestoryLib\Client\ScreenManager.cs:line 668
at Vintagestory.Client.ScreenManager.OnNewFrame(Single dt) in VintagestoryLib\Client\ScreenManager.cs:line 643
at Vintagestory.Client.NoObf.ClientPlatformWindows.window_RenderFrame(FrameEventArgs e) in VintagestoryLib\Client\ClientPlatform\GameWindow.cs:line 77
at OpenTK.Windowing.Desktop.GameWindow.Run()
at Vintagestory.Client.ClientProgram.Start(ClientProgramArgs args, String[] rawArgs) in VintagestoryLib\Client\ClientProgram.cs:line 313
at Vintagestory.Client.ClientProgram.<>c__DisplayClass9_0.<.ctor>b__1() in VintagestoryLib\Client\ClientProgram.cs:line 129
at Vintagestory.ClientNative.CrashReporter.Start(ThreadStart start) in VintagestoryLib\Client\ClientPlatform\ClientNative\CrashReporter.cs:line 93

I guess it's just not backwards compatible(for multiplayer at least, as the problem may just be on the networking), but i doubt it(it being not backwards compatible). Anyways, i wish you luck in that future endeavor of testing related stuff. All i can provide right now is probably a video of how we produced such a bug\crash to occur in our server. https://youtu.be/s6n8qw26y-A (Sorry for our constant rambling as we try our best to guess the source of the issue :D)

💬 Maltiez, Jan 9th at 11:31 AM

Would be a nice feature to be able to make not shingle part (like sides and other parts of the models) to have different texture, ideally one that player can choose to match surrounding blocks

Ruyeex

I hope it would rather become an extension for this mod that just adds more variation, cause the core mechanic here is a must-have one

💬 Ruyeex, Jan 9th at 3:13 AM

The mod more roofing isn't dead since it will include more types of roof soon.

But wow...
I might even wanted to have more roof types soon like the ones I wanted to ask Catasteroid to add more metal roofing tiles

💬 tui_smugglerAuthor, Jan 9th at 1:14 AM

Louskil thanks for bringing this to my attention. So if I understand correctly, a 2nd player placing a block caused your client to crash, but the 2nd player was unaffected? Sounds like some fun networking race condition. See 0.9.5, has a patch that should stop client crashing where it did (in theory).

It will be hard for me to reproduce however I plan to do some live dedicated server testing with a small group in the near future which will hopefully allow me to sort out any crashing edge cases. I have been testing almost exclusively in creative single player.

For everyone else, just beware this is still unstable for multiplayer.

💬 Guimoute, Jan 9th at 1:00 AM

Louskil Your game version doesn't match the mod version...

💬 Louskil, Jan 9th at 12:21 AM

Was running it with a friend of mine on 1.18.15, causes that crash log to appear once one of the crest blocks is used by the said friend:
Running on 64 bit Windows with 16320 MB RAM
Game Version: v1.18.15 (Stable)
09.01.2024 02:14:23: Critical error occurred in the following mod: oneroof@0.9.3
Loaded Mods: aculinaryartillery@1.0.15, betterbalance@2.1.3, betterruins@0.2.4, immersivecorpsedrop@1.0.1, millwright@1.1.1, nailsmold@1.0.1, primitivesurvival@3.3.0, rooffix@0.0.1, rpgitemrarity@1.0.4, rustcreatures@1.2.0, spedupseeling@1.2.1, translocatorengineeringredux@1.4.7, game@1.18.15, wildcraft@1.6.6, abcsreborn@0.1.4, animationmanagerlib@0.2.1, BedRespawning@1.0.1, canbeignited@1.1.0, carryon@1.6.1, commonlib@2.2.0, compatmaster@0.0.2, electricity@0.0.10, expandedfoods@1.6.8, fieldsofsalt@1.1.2, hudclock@3.3.0, immersivecrafting@1.1.1, sailboat@1.2.4, justanarrowheadmold@1.0.1, lavoisier@1.3.0, loreweapons@1.0.1, medievalexpansion@3.11.1, oneroof@0.9.3, petai@1.8.1, prospecttogether@1.2.4, rustyshell@0.0.11, scythemold@1.0.0, sharablewaypoints@1.3.2, stablesurface@0.0.2, stonebakeoven@1.0.5, storageoptions@1.0.1, temporalsmithing@0.2.2, creative@1.18.15, survival@1.18.15, wildfarmingrevival@1.1.6, metalrecovery@0.1.19-pre.1, chemistrylib@1.1.5, feverstonewilds@1.4.3, foxtaming@1.3.0, fsmlib@0.1.13, helvehammerext@1.5.2, linearpower@0.2.1, playercorpse@1.8.0, stonequarry@3.1.5, kosfire@1.1.3, maltiezfirearms@0.3.9
System.InvalidOperationException: Sequence contains no elements
at System.Linq.ThrowHelper.ThrowNoElementsException()
at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
at oneroof.src.OneRoofEntity.ConstructElementsStandard() in C:\Users\Daniel\Documents\workspace\vs\version2\one-roof\one-roof\src\oneroofentity.cs:line 407
at oneroof.src.OneRoofEntity.BuildStandard() in C:\Users\Daniel\Documents\workspace\vs\version2\one-roof\one-roof\src\oneroofentity.cs:line 242
at Vintagestory.Client.NoObf.ClientMain.ExecuteMainThreadTasks(Single deltaTime) in VintagestoryLib\Client\ClientMain.cs:line 757
at Vintagestory.Client.GuiScreenRunningGame.RenderToPrimary(Single dt) in VintagestoryLib\Client\MainMenu\Screens\GuiScreenRunningGame.cs:line 200
at Vintagestory.Client.ScreenManager.Render(Single dt) in VintagestoryLib\Client\ScreenManager.cs:line 668
at Vintagestory.Client.ScreenManager.OnNewFrame(Single dt) in VintagestoryLib\Client\ScreenManager.cs:line 643
at Vintagestory.Client.NoObf.ClientPlatformWindows.window_RenderFrame(FrameEventArgs e) in VintagestoryLib\Client\ClientPlatform\GameWindow.cs:line 77
at OpenTK.Windowing.Desktop.GameWindow.Run()
at Vintagestory.Client.ClientProgram.Start(ClientProgramArgs args, String[] rawArgs) in VintagestoryLib\Client\ClientProgram.cs:line 313
at Vintagestory.Client.ClientProgram.<>c__DisplayClass9_0.<.ctor>b__1() in VintagestoryLib\Client\ClientProgram.cs:line 129
at Vintagestory.ClientNative.CrashReporter.Start(ThreadStart start) in VintagestoryLib\Client\ClientPlatform\ClientNative\CrashReporter.cs:line 93

One thing to clarify, the server is a dedicated host on a rented server, but my friend doesn't crash himself in the process. Disregarding that, good job on that neat roof building option expansion!

💬 Guimoute, Jan 8th at 7:46 PM

I wonder if it would be simpler to place roof blocks it the single-block used "tool modes" instead of special hotkeys.

(edit comment delete)