diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..3030c1a
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,30 @@
+# Line endings: LF everywhere, on every OS, whatever core.autocrlf says.
+* text=auto eol=lf
+
+# cmd.exe misreads labels and goto in LF batch files, so they stay CRLF.
+*.bat text eol=crlf
+*.cmd text eol=crlf
+
+# Binaries: never converted, never diffed as text.
+*.png binary
+*.jpg binary
+*.jpeg binary
+*.webp binary
+*.svg text
+*.ogg binary
+*.wav binary
+*.mp3 binary
+*.ttf binary
+*.otf binary
+*.woff binary
+*.woff2 binary
+*.dll binary
+*.so binary
+*.dylib binary
+*.pdb binary
+*.exe binary
+*.zip binary
+*.pck binary
+*.moc3 binary
+*.res binary
+*.scn binary
diff --git a/src/Services/ScenarioGraphData.cs b/src/Services/ScenarioGraphData.cs
index 82c11f1..2b5f65b 100644
--- a/src/Services/ScenarioGraphData.cs
+++ b/src/Services/ScenarioGraphData.cs
@@ -1,38 +1,38 @@
-using System.Collections.Generic;
-
-namespace Cthangover.Tools.Services
-{
- /// One scenario attached to a scene node (shown on the graph node and in its detail links).
- public sealed class ScenarioGraphLink
- {
- public string Name { get; set; }
- public int Priority { get; set; }
- public string Key { get; set; }
- }
-
- /// One scene of the cross-scenario graph: owning mod, background list, start-scene flag and its scenarios.
- public sealed class SceneGraphNode
- {
- public string SceneName { get; set; }
- public string ModId { get; set; }
- public int ScenarioCount { get; set; }
- public List Backgrounds { get; set; } = new();
- public bool IsStartScene { get; set; }
- public List Scenarios { get; set; } = new();
- public bool HasErrors { get; set; }
- }
-
- /// Directed switch-target link between two scenes of the graph.
- public sealed class SceneGraphEdge
- {
- public string FromScene { get; set; }
- public string ToScene { get; set; }
- }
-
- /// Complete graph model consumed by ScenarioGraphView.
- public sealed class SceneGraphData
- {
- public List Nodes { get; set; } = new();
- public List Edges { get; set; } = new();
- }
-}
+using System.Collections.Generic;
+
+namespace Cthangover.Tools.Services
+{
+ /// One scenario attached to a scene node (shown on the graph node and in its detail links).
+ public sealed class ScenarioGraphLink
+ {
+ public string Name { get; set; }
+ public int Priority { get; set; }
+ public string Key { get; set; }
+ }
+
+ /// One scene of the cross-scenario graph: owning mod, background list, start-scene flag and its scenarios.
+ public sealed class SceneGraphNode
+ {
+ public string SceneName { get; set; }
+ public string ModId { get; set; }
+ public int ScenarioCount { get; set; }
+ public List Backgrounds { get; set; } = new();
+ public bool IsStartScene { get; set; }
+ public List Scenarios { get; set; } = new();
+ public bool HasErrors { get; set; }
+ }
+
+ /// Directed switch-target link between two scenes of the graph.
+ public sealed class SceneGraphEdge
+ {
+ public string FromScene { get; set; }
+ public string ToScene { get; set; }
+ }
+
+ /// Complete graph model consumed by ScenarioGraphView.
+ public sealed class SceneGraphData
+ {
+ public List Nodes { get; set; } = new();
+ public List Edges { get; set; } = new();
+ }
+}