diff --git a/src/AcDream.App/UI/Layout/LayoutImporter.cs b/src/AcDream.App/UI/Layout/LayoutImporter.cs
index 2b9c8411..0bf2b2bd 100644
--- a/src/AcDream.App/UI/Layout/LayoutImporter.cs
+++ b/src/AcDream.App/UI/Layout/LayoutImporter.cs
@@ -124,6 +124,25 @@ public static class LayoutImporter
// ── Dat shell ─────────────────────────────────────────────────────────────
+ ///
+ /// Dat shell, ElementInfo half: load the layout + resolve inheritance + build the
+ /// ElementInfo tree (no widgets). Exposed for fixture generation + conformance tests.
+ /// Returns null if the layout is missing.
+ ///
+ public static ElementInfo? ImportInfos(DatCollection dats, uint layoutId)
+ {
+ var ld = dats.Get(layoutId);
+ if (ld is null) return null;
+
+ var tops = new List();
+ foreach (var kv in ld.Elements)
+ tops.Add(Resolve(dats, kv.Value, new HashSet<(uint, uint)>()));
+
+ return tops.Count == 1
+ ? tops[0]
+ : new ElementInfo { Id = 0, Type = 3, Children = tops };
+ }
+
///
/// Dat shell: load the LayoutDesc, resolve inheritance for every top-level
/// element, and build the widget tree. Returns null if the layout is absent
@@ -135,20 +154,8 @@ public static class LayoutImporter
Func resolve,
UiDatFont? datFont)
{
- var ld = dats.Get(layoutId);
- if (ld is null) return null;
-
- // Build a resolved ElementInfo for every top-level element in the layout.
- var tops = new List();
- foreach (var kv in ld.Elements)
- tops.Add(Resolve(dats, kv.Value, new HashSet<(uint, uint)>()));
-
- // If there is exactly one top-level element use it directly as the root;
- // otherwise wrap the tops in a synthetic zero-id container.
- ElementInfo rootInfo = tops.Count == 1
- ? tops[0]
- : new ElementInfo { Id = 0, Type = 3, Children = tops };
-
+ var rootInfo = ImportInfos(dats, layoutId);
+ if (rootInfo is null) return null;
return Build(rootInfo, resolve, datFont);
}
diff --git a/tests/AcDream.App.Tests/AcDream.App.Tests.csproj b/tests/AcDream.App.Tests/AcDream.App.Tests.csproj
index 5ab79928..272953e3 100644
--- a/tests/AcDream.App.Tests/AcDream.App.Tests.csproj
+++ b/tests/AcDream.App.Tests/AcDream.App.Tests.csproj
@@ -22,4 +22,10 @@
+
+
+ PreserveNewest
+
+
+
diff --git a/tests/AcDream.App.Tests/UI/Layout/FixtureLoader.cs b/tests/AcDream.App.Tests/UI/Layout/FixtureLoader.cs
new file mode 100644
index 00000000..de0bd06a
--- /dev/null
+++ b/tests/AcDream.App.Tests/UI/Layout/FixtureLoader.cs
@@ -0,0 +1,38 @@
+using System.IO;
+using System.Text.Json;
+using AcDream.App.UI.Layout;
+
+namespace AcDream.App.Tests.UI.Layout;
+
+///
+/// Loads the committed vitals ElementInfo fixture and builds the widget tree —
+/// no dats required. The fixture was generated from layout 0x2100006C
+/// via the real portal.dat and serialized with .
+///
+public static class FixtureLoader
+{
+ private static readonly JsonSerializerOptions _opts = new()
+ {
+ IncludeFields = true,
+ };
+
+ ///
+ /// Deserializes the committed vitals_2100006C.json fixture (copied to
+ /// the test output directory via the csproj CopyToOutputDirectory item)
+ /// into an tree, then builds and returns the
+ /// using a null-returning sprite resolver and no
+ /// dat font — sufficient for conformance checks on tree structure and slice ids.
+ ///
+ public static ImportedLayout LoadVitals()
+ {
+ var fixturePath = Path.Combine(AppContext.BaseDirectory, "UI", "Layout", "fixtures", "vitals_2100006C.json");
+ if (!File.Exists(fixturePath))
+ throw new FileNotFoundException($"Vitals fixture not found at: {fixturePath}");
+
+ var json = File.ReadAllText(fixturePath, System.Text.Encoding.UTF8);
+ var root = JsonSerializer.Deserialize(json, _opts)
+ ?? throw new InvalidOperationException("Failed to deserialize vitals fixture.");
+
+ return LayoutImporter.Build(root, _ => (0u, 0, 0), null);
+ }
+}
diff --git a/tests/AcDream.App.Tests/UI/Layout/LayoutConformanceTests.cs b/tests/AcDream.App.Tests/UI/Layout/LayoutConformanceTests.cs
new file mode 100644
index 00000000..d1ec93e2
--- /dev/null
+++ b/tests/AcDream.App.Tests/UI/Layout/LayoutConformanceTests.cs
@@ -0,0 +1,115 @@
+using AcDream.App.UI;
+using AcDream.App.UI.Layout;
+
+namespace AcDream.App.Tests.UI.Layout;
+
+///
+/// Golden conformance tests for the vitals LayoutDesc importer.
+/// Uses the committed JSON fixture (vitals_2100006C.json) — no dats, no GL.
+///
+/// These tests lock the importer's tree-building (factory dispatch, meter slice
+/// extraction, rects) against the real portal.dat values captured when the
+/// fixture was generated. Any regression in ,
+/// , or will surface here.
+///
+/// Sprite ids sourced from docs/research/2026-06-15-layoutdesc-format.md §11.
+///
+public class LayoutConformanceTests
+{
+ // ── Test 1: Three meters at expected rects ────────────────────────────────
+
+ ///
+ /// The three vital bars must be UiMeters positioned at x=5, width=150, height=16,
+ /// at y=5 (health), y=21 (stamina), y=37 (mana).
+ ///
+ [Fact]
+ public void VitalsTree_HasThreeMetersAtExpectedRects()
+ {
+ var layout = FixtureLoader.LoadVitals();
+
+ (uint Id, float Y)[] expected =
+ [
+ (0x100000E6u, 5f), // health
+ (0x100000ECu, 21f), // stamina
+ (0x100000EEu, 37f), // mana
+ ];
+
+ foreach (var (id, y) in expected)
+ {
+ var elem = layout.FindElement(id);
+ Assert.NotNull(elem);
+ var meter = Assert.IsType(elem);
+ Assert.Equal(5f, meter.Left);
+ Assert.Equal(y, meter.Top);
+ Assert.Equal(150f, meter.Width);
+ Assert.Equal(16f, meter.Height);
+ }
+ }
+
+ // ── Test 2: All 18 slice ids ──────────────────────────────────────────────
+
+ ///
+ /// The six back+front 3-slice sprite ids for each of the three meters must
+ /// match the values confirmed from the dat dump (format doc §11).
+ /// This proves the factory's grandchild slice extraction against committed data.
+ ///
+ [Fact]
+ public void VitalsTree_MetersHaveExpectedSliceIds()
+ {
+ var layout = FixtureLoader.LoadVitals();
+
+ // Health bar
+ {
+ var elem = layout.FindElement(0x100000E6u);
+ var m = Assert.IsType(elem);
+ Assert.Equal(0x0600747Eu, m.BackLeft);
+ Assert.Equal(0x0600747Fu, m.BackTile);
+ Assert.Equal(0x06007480u, m.BackRight);
+ Assert.Equal(0x06007481u, m.FrontLeft);
+ Assert.Equal(0x06007482u, m.FrontTile);
+ Assert.Equal(0x06007483u, m.FrontRight);
+ }
+
+ // Stamina bar
+ {
+ var elem = layout.FindElement(0x100000ECu);
+ var m = Assert.IsType(elem);
+ Assert.Equal(0x06007484u, m.BackLeft);
+ Assert.Equal(0x06007485u, m.BackTile);
+ Assert.Equal(0x06007486u, m.BackRight);
+ Assert.Equal(0x06007487u, m.FrontLeft);
+ Assert.Equal(0x06007488u, m.FrontTile);
+ Assert.Equal(0x06007489u, m.FrontRight);
+ }
+
+ // Mana bar
+ {
+ var elem = layout.FindElement(0x100000EEu);
+ var m = Assert.IsType(elem);
+ Assert.Equal(0x0600748Au, m.BackLeft);
+ Assert.Equal(0x0600748Bu, m.BackTile);
+ Assert.Equal(0x0600748Cu, m.BackRight);
+ Assert.Equal(0x0600748Du, m.FrontLeft);
+ Assert.Equal(0x0600748Eu, m.FrontTile);
+ Assert.Equal(0x0600748Fu, m.FrontRight);
+ }
+ }
+
+ // ── Test 3: Chrome TL corner sprite ───────────────────────────────────────
+
+ ///
+ /// The top-left chrome corner element (id 0x10000633) must be a
+ /// whose active media file id is 0x060074C3.
+ ///
+ [Fact]
+ public void VitalsTree_ChromeCornerHasExpectedSprite()
+ {
+ var layout = FixtureLoader.LoadVitals();
+
+ var elem = layout.FindElement(0x10000633u);
+ Assert.NotNull(elem);
+ var datElem = Assert.IsType(elem);
+ var (file, _) = datElem.ActiveMedia();
+ Assert.Equal(0x060074C3u, file);
+ }
+}
diff --git a/tests/AcDream.App.Tests/UI/Layout/fixtures/vitals_2100006C.json b/tests/AcDream.App.Tests/UI/Layout/fixtures/vitals_2100006C.json
new file mode 100644
index 00000000..ff372638
--- /dev/null
+++ b/tests/AcDream.App.Tests/UI/Layout/fixtures/vitals_2100006C.json
@@ -0,0 +1,1058 @@
+{
+ "Id": 268436985,
+ "Type": 268435533,
+ "X": 0,
+ "Y": 0,
+ "Width": 160,
+ "Height": 58,
+ "Left": 1,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 2,
+ "ReadOrder": 0,
+ "FontDid": 0,
+ "StateMedia": {},
+ "Children": [
+ {
+ "Id": 268437048,
+ "Type": 3,
+ "X": 5,
+ "Y": 53,
+ "Width": 150,
+ "Height": 5,
+ "Left": 1,
+ "Top": 2,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 6,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693185,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268435692,
+ "Type": 7,
+ "X": 5,
+ "Y": 21,
+ "Width": 150,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 18,
+ "FontDid": 0,
+ "StateMedia": {},
+ "Children": [
+ {
+ "Id": 268435693,
+ "Type": 12,
+ "X": 0,
+ "Y": 0,
+ "Width": 150,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 3,
+ "FontDid": 1073741824,
+ "StateMedia": {},
+ "Children": []
+ },
+ {
+ "Id": 2,
+ "Type": 3,
+ "X": 0,
+ "Y": 0,
+ "Width": 150,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 2,
+ "FontDid": 0,
+ "StateMedia": {},
+ "Children": [
+ {
+ "Id": 268436649,
+ "Type": 3,
+ "X": 32,
+ "Y": 0,
+ "Width": 85,
+ "Height": 28,
+ "Left": 3,
+ "Top": 1,
+ "Right": 3,
+ "Bottom": 1,
+ "ReadOrder": 4,
+ "FontDid": 0,
+ "StateMedia": {
+ "ShowDetail": {
+ "Item1": 100693139,
+ "Item2": 3
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268435688,
+ "Type": 3,
+ "X": 0,
+ "Y": 0,
+ "Width": 10,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 2,
+ "Bottom": 1,
+ "ReadOrder": 1,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693127,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268435689,
+ "Type": 3,
+ "X": 10,
+ "Y": 0,
+ "Width": 130,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 2,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693128,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268435690,
+ "Type": 3,
+ "X": 140,
+ "Y": 0,
+ "Width": 10,
+ "Height": 16,
+ "Left": 2,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 3,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693129,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ }
+ ]
+ },
+ {
+ "Id": 268435687,
+ "Type": 3,
+ "X": 0,
+ "Y": 0,
+ "Width": 150,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 1,
+ "FontDid": 0,
+ "StateMedia": {},
+ "Children": [
+ {
+ "Id": 268436649,
+ "Type": 3,
+ "X": 32,
+ "Y": 0,
+ "Width": 85,
+ "Height": 16,
+ "Left": 3,
+ "Top": 1,
+ "Right": 3,
+ "Bottom": 1,
+ "ReadOrder": 4,
+ "FontDid": 0,
+ "StateMedia": {
+ "ShowDetail": {
+ "Item1": 100693138,
+ "Item2": 3
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268435688,
+ "Type": 3,
+ "X": 0,
+ "Y": 0,
+ "Width": 10,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 2,
+ "Bottom": 1,
+ "ReadOrder": 1,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693124,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268435689,
+ "Type": 3,
+ "X": 10,
+ "Y": 0,
+ "Width": 130,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 2,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693125,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268435690,
+ "Type": 3,
+ "X": 140,
+ "Y": 0,
+ "Width": 10,
+ "Height": 16,
+ "Left": 2,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 3,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693126,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "Id": 268437049,
+ "Type": 3,
+ "X": 155,
+ "Y": 53,
+ "Width": 5,
+ "Height": 5,
+ "Left": 2,
+ "Top": 2,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 7,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693190,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268437050,
+ "Type": 3,
+ "X": 155,
+ "Y": 5,
+ "Width": 5,
+ "Height": 48,
+ "Left": 2,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 8,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693186,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268435694,
+ "Type": 7,
+ "X": 5,
+ "Y": 37,
+ "Width": 150,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 19,
+ "FontDid": 0,
+ "StateMedia": {},
+ "Children": [
+ {
+ "Id": 2,
+ "Type": 3,
+ "X": 0,
+ "Y": 0,
+ "Width": 150,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 2,
+ "FontDid": 0,
+ "StateMedia": {},
+ "Children": [
+ {
+ "Id": 268436649,
+ "Type": 3,
+ "X": 25,
+ "Y": 0,
+ "Width": 100,
+ "Height": 16,
+ "Left": 3,
+ "Top": 1,
+ "Right": 3,
+ "Bottom": 1,
+ "ReadOrder": 4,
+ "FontDid": 0,
+ "StateMedia": {
+ "ShowDetail": {
+ "Item1": 100693141,
+ "Item2": 3
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268435688,
+ "Type": 3,
+ "X": 0,
+ "Y": 0,
+ "Width": 10,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 2,
+ "Bottom": 1,
+ "ReadOrder": 1,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693133,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268435689,
+ "Type": 3,
+ "X": 10,
+ "Y": 0,
+ "Width": 130,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 2,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693134,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268435690,
+ "Type": 3,
+ "X": 140,
+ "Y": 0,
+ "Width": 10,
+ "Height": 16,
+ "Left": 2,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 3,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693135,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ }
+ ]
+ },
+ {
+ "Id": 268435695,
+ "Type": 12,
+ "X": 0,
+ "Y": 0,
+ "Width": 150,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 3,
+ "FontDid": 1073741824,
+ "StateMedia": {},
+ "Children": []
+ },
+ {
+ "Id": 268435687,
+ "Type": 3,
+ "X": 0,
+ "Y": 0,
+ "Width": 150,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 1,
+ "FontDid": 0,
+ "StateMedia": {},
+ "Children": [
+ {
+ "Id": 268436649,
+ "Type": 3,
+ "X": 25,
+ "Y": 0,
+ "Width": 100,
+ "Height": 16,
+ "Left": 3,
+ "Top": 1,
+ "Right": 3,
+ "Bottom": 1,
+ "ReadOrder": 4,
+ "FontDid": 0,
+ "StateMedia": {
+ "ShowDetail": {
+ "Item1": 100693140,
+ "Item2": 3
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268435688,
+ "Type": 3,
+ "X": 0,
+ "Y": 0,
+ "Width": 10,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 2,
+ "Bottom": 1,
+ "ReadOrder": 1,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693130,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268435689,
+ "Type": 3,
+ "X": 10,
+ "Y": 0,
+ "Width": 130,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 2,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693131,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268435690,
+ "Type": 3,
+ "X": 140,
+ "Y": 0,
+ "Width": 10,
+ "Height": 16,
+ "Left": 2,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 3,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693132,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "Id": 268437051,
+ "Type": 9,
+ "X": 0,
+ "Y": 0,
+ "Width": 5,
+ "Height": 5,
+ "Left": 1,
+ "Top": 1,
+ "Right": 2,
+ "Bottom": 2,
+ "ReadOrder": 9,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100688169,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268437052,
+ "Type": 2,
+ "X": 5,
+ "Y": 0,
+ "Width": 150,
+ "Height": 5,
+ "Left": 1,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 2,
+ "ReadOrder": 10,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100688170,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268437053,
+ "Type": 9,
+ "X": 155,
+ "Y": 0,
+ "Width": 5,
+ "Height": 5,
+ "Left": 2,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 2,
+ "ReadOrder": 11,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100688169,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268437054,
+ "Type": 9,
+ "X": 0,
+ "Y": 5,
+ "Width": 5,
+ "Height": 48,
+ "Left": 1,
+ "Top": 1,
+ "Right": 2,
+ "Bottom": 1,
+ "ReadOrder": 12,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100688171,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268437055,
+ "Type": 9,
+ "X": 0,
+ "Y": 53,
+ "Width": 5,
+ "Height": 5,
+ "Left": 1,
+ "Top": 2,
+ "Right": 2,
+ "Bottom": 1,
+ "ReadOrder": 13,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100688169,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268437056,
+ "Type": 2,
+ "X": 5,
+ "Y": 53,
+ "Width": 150,
+ "Height": 5,
+ "Left": 1,
+ "Top": 2,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 14,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100688172,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268437057,
+ "Type": 9,
+ "X": 155,
+ "Y": 53,
+ "Width": 5,
+ "Height": 5,
+ "Left": 2,
+ "Top": 2,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 15,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100688169,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268437058,
+ "Type": 9,
+ "X": 155,
+ "Y": 5,
+ "Width": 5,
+ "Height": 48,
+ "Left": 2,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 16,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100688173,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268435686,
+ "Type": 7,
+ "X": 5,
+ "Y": 5,
+ "Width": 150,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 17,
+ "FontDid": 0,
+ "StateMedia": {},
+ "Children": [
+ {
+ "Id": 268435691,
+ "Type": 12,
+ "X": 0,
+ "Y": 0,
+ "Width": 150,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 3,
+ "FontDid": 1073741824,
+ "StateMedia": {},
+ "Children": []
+ },
+ {
+ "Id": 2,
+ "Type": 3,
+ "X": 0,
+ "Y": 0,
+ "Width": 150,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 2,
+ "FontDid": 0,
+ "StateMedia": {},
+ "Children": [
+ {
+ "Id": 268436649,
+ "Type": 3,
+ "X": 66,
+ "Y": 0,
+ "Width": 18,
+ "Height": 16,
+ "Left": 3,
+ "Top": 1,
+ "Right": 3,
+ "Bottom": 1,
+ "ReadOrder": 4,
+ "FontDid": 0,
+ "StateMedia": {
+ "ShowDetail": {
+ "Item1": 100693137,
+ "Item2": 3
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268435688,
+ "Type": 3,
+ "X": 0,
+ "Y": 0,
+ "Width": 10,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 2,
+ "Bottom": 1,
+ "ReadOrder": 1,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693121,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268435689,
+ "Type": 3,
+ "X": 10,
+ "Y": 0,
+ "Width": 130,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 2,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693122,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268435690,
+ "Type": 3,
+ "X": 140,
+ "Y": 0,
+ "Width": 10,
+ "Height": 16,
+ "Left": 2,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 3,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693123,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ }
+ ]
+ },
+ {
+ "Id": 268435687,
+ "Type": 3,
+ "X": 0,
+ "Y": 0,
+ "Width": 150,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 1,
+ "FontDid": 0,
+ "StateMedia": {},
+ "Children": [
+ {
+ "Id": 268436649,
+ "Type": 3,
+ "X": 66,
+ "Y": 0,
+ "Width": 18,
+ "Height": 16,
+ "Left": 3,
+ "Top": 1,
+ "Right": 3,
+ "Bottom": 1,
+ "ReadOrder": 4,
+ "FontDid": 0,
+ "StateMedia": {
+ "ShowDetail": {
+ "Item1": 100693136,
+ "Item2": 3
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268435688,
+ "Type": 3,
+ "X": 0,
+ "Y": 0,
+ "Width": 10,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 2,
+ "Bottom": 1,
+ "ReadOrder": 1,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693118,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268435689,
+ "Type": 3,
+ "X": 10,
+ "Y": 0,
+ "Width": 130,
+ "Height": 16,
+ "Left": 1,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 2,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693119,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268435690,
+ "Type": 3,
+ "X": 140,
+ "Y": 0,
+ "Width": 10,
+ "Height": 16,
+ "Left": 2,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 1,
+ "ReadOrder": 3,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693120,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "Id": 268437043,
+ "Type": 3,
+ "X": 0,
+ "Y": 0,
+ "Width": 5,
+ "Height": 5,
+ "Left": 1,
+ "Top": 1,
+ "Right": 2,
+ "Bottom": 2,
+ "ReadOrder": 1,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693187,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268437044,
+ "Type": 3,
+ "X": 5,
+ "Y": 0,
+ "Width": 150,
+ "Height": 5,
+ "Left": 1,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 2,
+ "ReadOrder": 2,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693183,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268437045,
+ "Type": 3,
+ "X": 155,
+ "Y": 0,
+ "Width": 5,
+ "Height": 5,
+ "Left": 2,
+ "Top": 1,
+ "Right": 1,
+ "Bottom": 2,
+ "ReadOrder": 3,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693188,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268437046,
+ "Type": 3,
+ "X": 0,
+ "Y": 5,
+ "Width": 5,
+ "Height": 48,
+ "Left": 1,
+ "Top": 1,
+ "Right": 2,
+ "Bottom": 1,
+ "ReadOrder": 4,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693184,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ },
+ {
+ "Id": 268437047,
+ "Type": 3,
+ "X": 0,
+ "Y": 53,
+ "Width": 5,
+ "Height": 5,
+ "Left": 1,
+ "Top": 2,
+ "Right": 2,
+ "Bottom": 1,
+ "ReadOrder": 5,
+ "FontDid": 0,
+ "StateMedia": {
+ "": {
+ "Item1": 100693189,
+ "Item2": 1
+ }
+ },
+ "Children": []
+ }
+ ]
+}
\ No newline at end of file