{
  "id": "type-n13",
  "revision": "c989304765f93d738276c324e6f6780d1503c9f167847c18fb88849d7b0458db",
  "regions": [
    {
      "id": "web",
      "label": "Web",
      "parent": null
    },
    {
      "id": "common-logic",
      "label": "Common logic",
      "parent": null
    },
    {
      "id": "server",
      "label": "Server",
      "parent": null
    }
  ],
  "nodes": [
    {
      "id": "pointer",
      "label": "Pointer interaction source",
      "kind": "N13",
      "region": "web",
      "ports": [
        {
          "id": "move",
          "profile": "P04",
          "contract": "PointerSampleV1",
          "polarity": "Offer"
        },
        {
          "id": "up",
          "profile": "P04",
          "contract": "DragFinishedV1",
          "polarity": "Offer"
        }
      ]
    },
    {
      "id": "drag",
      "label": "Drag preview state",
      "kind": "N05",
      "region": "web",
      "ports": [
        {
          "id": "move",
          "profile": "P04",
          "contract": "PointerSampleV1",
          "polarity": "Require"
        },
        {
          "id": "position",
          "profile": "P01",
          "contract": "DraggedPositionAtRevisionV1",
          "polarity": "Offer"
        },
        {
          "id": "cancel",
          "profile": "P14",
          "contract": "CancelDragV1",
          "polarity": "Require"
        }
      ]
    },
    {
      "id": "proposal",
      "label": "Layout edit proposal",
      "kind": "N39",
      "region": "common-logic",
      "ports": [
        {
          "id": "finish",
          "profile": "P04",
          "contract": "DragFinishedV1",
          "polarity": "Require"
        },
        {
          "id": "position",
          "profile": "P01",
          "contract": "DraggedPositionAtRevisionV1",
          "polarity": "Require"
        },
        {
          "id": "save",
          "profile": "P09",
          "contract": "LayoutCompareRevisionReceiptV1",
          "polarity": "Require"
        }
      ]
    },
    {
      "id": "layout",
      "label": "Layout authority",
      "kind": "N21",
      "region": "server",
      "ports": [
        {
          "id": "save",
          "profile": "P09",
          "contract": "LayoutCompareRevisionReceiptV1",
          "polarity": "Offer"
        }
      ]
    },
    {
      "id": "cancel",
      "label": "Escape key interaction",
      "kind": "N13",
      "region": "web",
      "ports": [
        {
          "id": "escape",
          "profile": "P14",
          "contract": "CancelDragV1",
          "polarity": "Offer"
        }
      ]
    }
  ],
  "relations": [
    {
      "id": "move",
      "kind": "H04",
      "incidences": [
        {
          "node": "pointer",
          "port": "move",
          "role": "publisher",
          "ordinal": 0
        },
        {
          "node": "drag",
          "port": "move",
          "role": "subscriber",
          "ordinal": 0
        }
      ]
    },
    {
      "id": "commit",
      "kind": "H04",
      "incidences": [
        {
          "node": "pointer",
          "port": "up",
          "role": "publisher",
          "ordinal": 0
        },
        {
          "node": "proposal",
          "port": "finish",
          "role": "subscriber",
          "ordinal": 0
        }
      ]
    },
    {
      "id": "preview",
      "kind": "H02",
      "incidences": [
        {
          "node": "drag",
          "port": "position",
          "role": "source",
          "ordinal": 0
        },
        {
          "node": "proposal",
          "port": "position",
          "role": "target",
          "ordinal": 0
        }
      ]
    },
    {
      "id": "save",
      "kind": "H05",
      "incidences": [
        {
          "node": "proposal",
          "port": "save",
          "role": "caller",
          "ordinal": 0
        },
        {
          "node": "layout",
          "port": "save",
          "role": "callee",
          "ordinal": 0
        }
      ]
    },
    {
      "id": "cancel",
      "kind": "H03",
      "incidences": [
        {
          "node": "cancel",
          "port": "escape",
          "role": "source",
          "ordinal": 0
        },
        {
          "node": "drag",
          "port": "cancel",
          "role": "target",
          "ordinal": 0
        }
      ]
    }
  ]
}
