Repository: gradio-app/gradio

Issue:
Gradio starting with 3.36 is extremely slow
### Describe the bug

I just upgraded my app from Gradio 3.32.0 to 3.36.1 (I cannot use versions in-between due to breaking change that was fixed post 3.35.2) and browser page load time grew from 5sec to 15sec.

Yes, its a highly complex app with too many controls, but 300% performance degradation is not what I would expect.

Once page load completes, actual functionality is on-par and I don't see any errors.
Note that assets download is not an issue, they all complete fast (seen in browser inspector network tab), its actual building of the UI, for example JS code  inside `http://127.0.0.1:7860/assets/Blocks-7b1f1558.js` takes 5sec to execute alone.

### Have you searched existing issues?  🔎

- [X] I have searched and found no existing issues

### Reproduction

1. Install [SD.Next](https://github.com/vladmandic/automatic) and start it using `webui.sh/webui.bat`  
  (first start will install a lot of dependencies so it may take long)
2. Change `requirements.txt` to use new Gradio and start again

### Screenshot

_No response_

### Logs

```shell
No error messages in console or browser console
```


### System Info

```shell
Server Gradio 3.36.1 on Ubuntu 22.04
Client Chrome 114 on Windows 11
```


### Severity

Blocking usage of gradio


Discussion:
Nothing major has changed recently so this is somewhat surprising, although I do have a slight suspicion about what this might be. I'll investigate and report back!
I know what this is now and I'll fix it as part of #3261. 

The issue is two-fold.

1. Complex apps with large numbers of components are all processed at app startup, regardless of how many are on view at any time.
2. We programatically attach events. For 'normal' events we know which ones the user has applied (`btn.click()` etc) so the impact in minimal (though not zero) but we also use events to handle errors dispatched from components, we almost always need to know about these events so we need to attach the listeners. Attaching listeners to hundreds or thousands of components is very expensive.

1\. is a multi-faceted issue and involves substantial changes to fix entirely. 
  - The first step is to ensure we only render things if they are visible (inactive tabs, `visible=false` should not be rendered). This _used_ to be the behaviour but we changed it because we only store the props (i.e. state as gradio-python understands it) in memory, we do not store the state necessary to rehydrate all components exactly as they are currently. This mean switching tabs resets state, for example, and we don't have sufficient data to recreate it exactly as it was. This will be taken care of at some point soon and can be done independently of gradio python and requires no breaking changes (although it isn't trivial). 
  - The ideal scenario is that the config is fully dynamic and can be updated at any time, rerendering the UI. This is a more substantial change because it will introduce a number of new challenges, none of which are insurmountable. This will probably involved breaking changes, or a significant enough internal refactor that it makes sense to release it as part of 4.0, if we decide to do it.
  
2\. This can be resolved fair simply by changing how we listen for events. I have a few ideas that I think will work but will need some testing. I will also look at refactoring other similar code to improve performance across the board. This _should_ result in a significant improvement to startup time for _all_ apps but especially complex ones with many components. It will also simplify some of our  initialisation code, although there are tradeoffs.

I'll take care of this as I'm working on the refactors over the next few weeks.



any update on this issue? its open without any updates for over a month.
gradio 3.40 was just released and page load is so slow that brower reports "page is not responding" and asks to kill it.
in the meantime i'm stuck on gradio 3.32 since other blocking issue i had was only resolved in >=3.36.

also note its confirmed it has same impact on multiple apps, so this is turning into a big thing - i don't think this can be burried any longer under "technical debt" - its a massive regression.

cc @pngwn @abidlabs 

![image](https://github.com/gradio-app/gradio/assets/57876960/90c55cb6-e693-4663-8055-ca56eb2695c0)

pngwn mentioned here it would be worked on this week. https://github.com/gradio-app/gradio/pull/4651#issuecomment-1668483459
> I know what this is now and I'll fix it as part of #3261.
> 
> The issue is two-fold.
> 
> 1. Complex apps with large numbers of components are all processed at app startup, regardless of how many are on view at any time.
> 2. We programatically attach events. For 'normal' events we know which ones the user has applied (`btn.click()` etc) so the impact in minimal (though not zero) but we also use events to handle errors dispatched from components, we almost always need to know about these events so we need to attach the listeners. Attaching listeners to hundreds or thousands of components is very expensive.
> 
> 1. is a multi-faceted issue and involves substantial changes to fix entirely.
> 
> * The first step is to ensure we only render things if they are visible (inactive tabs, `visible=false` should not be rendered). This _used_ to be the behaviour but we changed it because we only store the props (i.e. state as gradio-python understands it) in memory, we do not store the state necessary to rehydrate all components exactly as they are currently. This mean switching tabs resets state, for example, and we don't have sufficient data to recreate it exactly as it was. This will be taken care of at some point soon and can be done independently of gradio python and requires no breaking changes (although it isn't trivial).
> * The ideal scenario is that the config is fully dynamic and can be updated at any time, rerendering the UI. This is a more substantial change because it will introduce a number of new challenges, none of which are insurmountable. This will probably involved breaking changes, or a significant enough internal refactor that it makes sense to release it as part of 4.0, if we decide to do it.
> 
> 2. This can be resolved fair simply by changing how we listen for events. I have a few ideas that I think will work but will need some testing. I will also look at refactoring other similar code to improve performance across the board. This _should_ result in a significant improvement to startup time for _all_ apps but especially complex ones with many components. It will also simplify some of our initialisation code, although there are tradeoffs.
> 
> I'll take care of this as I'm working on the refactors over the next few weeks.

for some ideas please have a look here https://web.dev/content-visibility/
it is not a good idea to destroy and recreate the components when visible this has been an issue with accordion, dropdown components. Performance issues related to view can be addressed  with `content-visibility` I hope firefox will have it enabled by default in the next few months, all other modern browsers except safari support this feature
about the normal listeners optimization maybe a good idea is to attach them when the component gets focused or when pointer is over a component remove them when it loses the focus I have done this in the past and is very performant 
the SD gradio-config json file has 68513 lines [2342] components [903] dependencies and it is hard to optimize with current gradio architecture 

> any update on this issue? its open without any updates for over a month. gradio 3.40 was just released and page load is so slow that brower reports "page is not responding" and asks to kill it. in the meantime i'm stuck on gradio 3.32 since other blocking issue i had was only resolved in >=3.36.
> 
> also note its confirmed it has same impact on multiple apps, so this is turning into a big thing - i don't think this can be burried any longer under "technical debt" - its a massive regression.
> 
> cc @pngwn @abidlabs
> 
> ![image](https://user-images.githubusercontent.com/57876960/259954734-90c55cb6-e693-4663-8055-ca56eb2695c0.png)

Same problems can be observed in [SD web UI](https://github.com/AUTOMATIC1111/stable-diffusion-webui) (when you add multiple extensions, and UI size grows). It's kinda ridiculous for UI framework to initialize still relatively small number of components in time like minute - it's longer than whole OS boot time...

@pngwn Please make it top priority, and/or involve more people who could help solve this problem. It's kinda blocker for bigger Gradio apps.
Sorry for the delay! This is literally the the first thing I'll be taking care of tomorrow. 

Content visibility would not help in this case. 
> Sorry for the delay! This is literally the the first thing I'll be taking care of tomorrow.
> 
> Content visibility would not help in this case.

https://svelte.dev/repl/2a0f3556497a43f1aaf88f9219dfc6a2?version=4.2.0
maybe event delegation can help reduce the amount of the event listeners 

Resolving patch:
diff --git a/demo/event_trigger/run.py b/demo/event_trigger/run.py
--- a/demo/event_trigger/run.py
+++ b/demo/event_trigger/run.py
@@ -69,9 +69,13 @@ def video_pause():
         def video_stop():
             print("video_stop")
 
+        def video_end():
+            print("video_end")
+
         video1.play(fn=video_play)
         video1.pause(fn=video_pause)
         video1.stop(fn=video_stop)
+        video1.end(fn=video_end)
 
         radio1.change(fn=change_video, inputs=radio1, outputs=video1)
         video1.change(fn=alert_change, inputs=[gr.State("Video"), video1])
diff --git a/demo/latex/run.py b/demo/latex/run.py
--- a/demo/latex/run.py
+++ b/demo/latex/run.py
@@ -13,8 +13,7 @@
     
     the first is $\gamma^2 + \theta^2 = \omega^2$
     
-    $\sqrt{x^2+1}
-    $ is next
+    $\sqrt{x^2+1}$ is next
     
     Integral $\int_{a}^{b} x^2 \,dx$ is last
 
diff --git a/demo/markdown_example/run.py b/demo/markdown_example/run.py
--- a/demo/markdown_example/run.py
+++ b/demo/markdown_example/run.py
@@ -168,6 +168,23 @@
 127.0.0.1:8000
 ```
 
+```python
+import gradio as gr
+
+gr.Blocks() as demo:
+    gr.Markdown(value=md)
+
+demo.launch()
+```
+
+```js
+function fancyAlert(arg) {
+    if(arg) {
+        $.facebox({div:'#foo'})
+    }
+}
+```
+
 ## License
 
 MIT


Test patch:
diff --git a/js/app/test/components.test.ts b/js/app/test/components.test.ts
--- a/js/app/test/components.test.ts
+++ b/js/app/test/components.test.ts
@@ -240,11 +240,9 @@ describe("all components should have the appropriate label when set via the `lab
 });
 
 describe("all components should hide their label when `show_label=false`", () => {
-	components
-		.filter(([name]) => name !== "Markdown" && name !== "HTML")
-		.forEach(([name, component, props]) => {
-			test.todo(name);
-		});
+	components.forEach(([name, component, props]) => {
+		test.todo(name);
+	});
 
 	["Button", "Code", "Image", "Plot"].forEach((name) => {
 		test.todo(name);
@@ -252,11 +250,9 @@ describe("all components should hide their label when `show_label=false`", () =>
 });
 
 describe("all components should show their label when `show_label=true`", () => {
-	components
-		.filter(([name]) => name !== "Markdown" && name !== "HTML")
-		.forEach(([name, component, props]) => {
-			test.todo(name);
-		});
+	components.forEach(([name, component, props]) => {
+		test.todo(name);
+	});
 
 	["Button", "Code", "Image", "Plot"].forEach((name) => {
 		test.todo(name);
@@ -264,11 +260,9 @@ describe("all components should show their label when `show_label=true`", () =>
 });
 
 describe("all components should hide their container when `container=false`", () => {
-	components
-		.filter(([name]) => name !== "Markdown" && name !== "HTML")
-		.forEach(([name, component, props]) => {
-			test.todo(name);
-		});
+	components.forEach(([name, component, props]) => {
+		test.todo(name);
+	});
 
 	["Button", "Code", "Image", "Plot"].forEach((name) => {
 		test.todo(name);
diff --git a/js/image/Image.test.ts b/js/image/Image.test.ts
--- a/js/image/Image.test.ts
+++ b/js/image/Image.test.ts
@@ -34,21 +34,25 @@ describe("Image", () => {
 	afterEach(() => cleanup());
 
 	test("image change event trigger fires when value is changed and only fires once", async () => {
-		const { component } = await render(Image, {
+		const { component, listen } = await render(Image, {
 			show_label: true,
 			loading_status,
-			mode: "dynamic",
 			value:
 				"https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png",
-			root: "foo",
-			root_url: null,
 			streaming: false,
 			pending: false,
-			source: "upload"
+			source: "upload",
+			label: "Test Label",
+			width: 224,
+			height: 224,
+			mirror_webcam: false,
+			shape: [224, 224],
+			brush_color: "#000000",
+			brush_radius: 5,
+			mask_opacity: 0.5
 		});
 
-		const mock = spy();
-		component.$on("change", mock);
+		const mock = listen("change");
 
 		component.value =
 			"https://github.com/gradio-app/gradio/blob/main/test/test_files/cheetah1.jpg";
diff --git a/js/textbox/Textbox.test.ts b/js/textbox/Textbox.test.ts
--- a/js/textbox/Textbox.test.ts
+++ b/js/textbox/Textbox.test.ts
@@ -6,14 +6,15 @@ import event from "@testing-library/user-event";
 import Textbox from "./interactive";
 import type { LoadingStatus } from "@gradio/statustracker";
 
-const loading_status = {
+const loading_status: LoadingStatus = {
 	eta: 0,
 	queue_position: 1,
 	queue_size: 1,
 	status: "complete" as LoadingStatus["status"],
 	scroll_to_output: false,
 	visible: true,
-	fn_index: 0
+	fn_index: 0,
+	show_progress: "full"
 };
 
 describe("Textbox", () => {
@@ -25,7 +26,6 @@ describe("Textbox", () => {
 			max_lines: 1,
 			loading_status,
 			lines: 1,
-			mode: "dynamic",
 			value: "hello world",
 			label: "Textbox"
 		});
@@ -37,20 +37,18 @@ describe("Textbox", () => {
 	});
 
 	test("changing the text should update the value", async () => {
-		const { component, getByDisplayValue } = await render(Textbox, {
+		const { component, getByDisplayValue, listen } = await render(Textbox, {
 			show_label: true,
 			max_lines: 10,
 			loading_status,
 			lines: 1,
-			mode: "dynamic",
 			value: "hi ",
 			label: "Textbox"
 		});
 
 		const item: HTMLInputElement = getByDisplayValue("hi") as HTMLInputElement;
 
-		const mock = spy();
-		component.$on("change", mock);
+		const mock = listen("change");
 
 		item.focus();
 		await event.keyboard("some text");
@@ -58,6 +56,6 @@ describe("Textbox", () => {
 		assert.equal(item.value, "hi some text");
 		assert.equal(component.value, "hi some text");
 		assert.equal(mock.callCount, 9);
-		assert.equal(mock.calls[8][0].detail, "hi some text");
+		assert.equal(mock.calls[8][0].detail.data, "hi some text");
 	});
 });
diff --git a/js/uploadbutton/UploadButton.test.ts b/js/uploadbutton/UploadButton.test.ts
--- a/js/uploadbutton/UploadButton.test.ts
+++ b/js/uploadbutton/UploadButton.test.ts
@@ -25,7 +25,6 @@ describe("UploadButton", () => {
 		const { getByTestId } = await render(UploadButton, {
 			label: "file",
 			value: null,
-			mode: "dynamic",
 			root: "http://localhost:7860",
 			file_count: "1"
 		});
@@ -47,18 +46,20 @@ describe("UploadButton", () => {
 
 		await import("@gradio/client");
 		setupi18n();
-		const { component, getByTestId } = await render(UploadButton, {
-			label: "file",
-			value: null,
-			mode: "dynamic",
-			root: "http://localhost:7860",
-			file_count: "1"
-		});
+		const { component, getByTestId, wait_for_event } = await render(
+			UploadButton,
+			{
+				label: "file",
+				value: null,
+				root: "http://localhost:7860",
+				file_count: "1"
+			}
+		);
 
 		const item = getByTestId("file-upload-button"); //container.querySelectorAll("input")[0];
 		const file = new File(["hello"], "my-audio.wav", { type: "audio/wav" });
 		event.upload(item, file);
-		const mock = await wait_for_event(component, "change");
+		const mock = await wait_for_event("change");
 		expect(mock.callCount).toBe(1);
 		const [data] = component.$capture_state().value;
 		expect(data).toBeTruthy();
diff --git a/js/video/Video.test.ts b/js/video/Video.test.ts
--- a/js/video/Video.test.ts
+++ b/js/video/Video.test.ts
@@ -55,7 +55,7 @@ describe("Video", () => {
 			name: "bar",
 			source: "upload"
 		});
-		let vid = getByTestId("Test Label-player") as HTMLVideoElement
+		let vid = getByTestId("Test Label-player") as HTMLVideoElement;
 		assert.equal(
 			vid.src,
 			"https://gradio-builds.s3.amazonaws.com/demo-files/audio_sample.wav"
@@ -101,7 +101,7 @@ describe("Video", () => {
 			name: "bar",
 			source: "upload"
 		});
-		let vid = getByTestId("test-player") as HTMLVideoElement
+		let vid = getByTestId("test-player") as HTMLVideoElement;
 		assert.equal(
 			vid.src,
 			"https://gradio-builds.s3.amazonaws.com/demo-files/audio_sample.wav"
@@ -252,7 +252,7 @@ describe("Video", () => {
 	});
 
 	test("video change event trigger fires when value is changed and only fires once", async () => {
-		const { component } = await render(InteractiveVideo, {
+		const { component, listen } = await render(InteractiveVideo, {
 			show_label: true,
 			loading_status,
 			mode: "dynamic",
@@ -271,8 +271,7 @@ describe("Video", () => {
 			autoplay: true
 		});
 
-		const mock = spy();
-		component.$on("change", mock);
+		const mock = listen("change");
 
 		(component.value = [
 			{
diff --git a/test/test_files/xray_config.json b/test/test_files/xray_config.json
--- a/test/test_files/xray_config.json
+++ b/test/test_files/xray_config.json
@@ -1,476 +1,449 @@
 {
-  "version": "3.40.1",
-  "mode": "blocks",
-  "dev_mode": true,
-  "analytics_enabled": true,
-  "components": [
-    {
-      "id": 1,
-      "type": "markdown",
-      "props": {
-        "value": "# Detect Disease From Scan\nWith this model you can lorem ipsum\n- ipsum 1\n- ipsum 2",
-        "rtl": false,
-        "latex_delimiters": [
-          {
-            "left": "$",
-            "right": "$",
-            "display": false
-          }
-        ],
-        "name": "markdown",
-        "visible": true
-      },
-      "serializer": "StringSerializable",
-      "api_info": {
-        "info": {
-          "type": "string"
-        },
-        "serialized_info": false
-      },
-      "example_inputs": {
-        "raw": "Howdy!",
-        "serialized": "Howdy!"
-      }
-    },
-    {
-      "id": 2,
-      "type": "checkboxgroup",
-      "props": {
-        "choices": [
-          [
-            "Covid",
-            "Covid"
-          ],
-          [
-            "Malaria",
-            "Malaria"
-          ],
-          [
-            "Lung Cancer",
-            "Lung Cancer"
-          ]
-        ],
-        "value": [],
-        "label": "Disease to Scan For",
-        "show_label": true,
-        "container": true,
-        "min_width": 160,
-        "name": "checkboxgroup",
-        "visible": true
-      },
-      "serializer": "ListStringSerializable",
-      "api_info": {
-        "info": {
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "serialized_info": false
-      },
-      "example_inputs": {
-        "raw": [
-          "Covid"
-        ],
-        "serialized": [
-          "Covid"
-        ]
-      }
-    },
-    {
-      "id": 3,
-      "type": "tabs",
-      "props": {
-        "visible": true
-      }
-    },
-    {
-      "id": 4,
-      "type": "tabitem",
-      "props": {
-        "label": "X-ray",
-        "visible": true
-      }
-    },
-    {
-      "id": 5,
-      "type": "row",
-      "props": {
-        "type": "row",
-        "variant": "default",
-        "equal_height": true,
-        "visible": true
-      }
-    },
-    {
-      "id": 6,
-      "type": "image",
-      "props": {
-        "image_mode": "RGB",
-        "source": "upload",
-        "tool": "editor",
-        "streaming": false,
-        "mirror_webcam": true,
-        "brush_color": "#000000",
-        "mask_opacity": 0.7,
-        "selectable": false,
-        "show_share_button": false,
-        "show_download_button": true,
-        "show_label": true,
-        "container": true,
-        "min_width": 160,
-        "name": "image",
-        "visible": true
-      },
-      "serializer": "ImgSerializable",
-      "api_info": {
-        "info": {
-          "type": "string",
-          "description": "base64 representation of an image"
-        },
-        "serialized_info": true
-      },
-      "example_inputs": {
-        "raw": "data:image/png;base64,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",
-        "serialized": "https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png"
-      }
-    },
-    {
-      "id": 7,
-      "type": "json",
-      "props": {
-        "show_label": true,
-        "container": true,
-        "min_width": 160,
-        "name": "json",
-        "visible": true
-      },
-      "serializer": "JSONSerializable",
-      "api_info": {
-        "info": {
-          "type": {},
-          "description": "any valid json"
-        },
-        "serialized_info": true
-      },
-      "example_inputs": {
-        "raw": {
-          "a": 1,
-          "b": 2
-        },
-        "serialized": null
-      }
-    },
-    {
-      "id": 8,
-      "type": "button",
-      "props": {
-        "value": "Run",
-        "variant": "secondary",
-        "interactive": true,
-        "name": "button",
-        "visible": true
-      },
-      "serializer": "StringSerializable",
-      "api_info": {
-        "info": {
-          "type": "string"
-        },
-        "serialized_info": false
-      },
-      "example_inputs": {
-        "raw": "Howdy!",
-        "serialized": "Howdy!"
-      }
-    },
-    {
-      "id": 9,
-      "type": "tabitem",
-      "props": {
-        "label": "CT Scan",
-        "visible": true
-      }
-    },
-    {
-      "id": 10,
-      "type": "row",
-      "props": {
-        "type": "row",
-        "variant": "default",
-        "equal_height": true,
-        "visible": true
-      }
-    },
-    {
-      "id": 11,
-      "type": "image",
-      "props": {
-        "image_mode": "RGB",
-        "source": "upload",
-        "tool": "editor",
-        "streaming": false,
-        "mirror_webcam": true,
-        "brush_color": "#000000",
-        "mask_opacity": 0.7,
-        "selectable": false,
-        "show_share_button": false,
-        "show_download_button": true,
-        "show_label": true,
-        "container": true,
-        "min_width": 160,
-        "name": "image",
-        "visible": true
-      },
-      "serializer": "ImgSerializable",
-      "api_info": {
-        "info": {
-          "type": "string",
-          "description": "base64 representation of an image"
-        },
-        "serialized_info": true
-      },
-      "example_inputs": {
-        "raw": "data:image/png;base64,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",
-        "serialized": "https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png"
-      }
-    },
-    {
-      "id": 12,
-      "type": "json",
-      "props": {
-        "show_label": true,
-        "container": true,
-        "min_width": 160,
-        "name": "json",
-        "visible": true
-      },
-      "serializer": "JSONSerializable",
-      "api_info": {
-        "info": {
-          "type": {},
-          "description": "any valid json"
-        },
-        "serialized_info": true
-      },
-      "example_inputs": {
-        "raw": {
-          "a": 1,
-          "b": 2
-        },
-        "serialized": null
-      }
-    },
-    {
-      "id": 13,
-      "type": "button",
-      "props": {
-        "value": "Run",
-        "variant": "secondary",
-        "interactive": true,
-        "name": "button",
-        "visible": true
-      },
-      "serializer": "StringSerializable",
-      "api_info": {
-        "info": {
-          "type": "string"
-        },
-        "serialized_info": false
-      },
-      "example_inputs": {
-        "raw": "Howdy!",
-        "serialized": "Howdy!"
-      }
-    },
-    {
-      "id": 14,
-      "type": "textbox",
-      "props": {
-        "lines": 1,
-        "max_lines": 20,
-        "value": "",
-        "type": "text",
-        "autofocus": false,
-        "show_copy_button": false,
-        "container": true,
-        "rtl": false,
-        "show_label": true,
-        "min_width": 160,
-        "name": "textbox",
-        "visible": true
-      },
-      "serializer": "StringSerializable",
-      "api_info": {
-        "info": {
-          "type": "string"
-        },
-        "serialized_info": false
-      },
-      "example_inputs": {
-        "raw": "Howdy!",
-        "serialized": "Howdy!"
-      }
-    },
-    {
-      "id": 15,
-      "type": "form",
-      "props": {
-        "type": "form",
-        "scale": 0,
-        "min_width": 0,
-        "visible": true
-      }
-    },
-    {
-      "id": 16,
-      "type": "form",
-      "props": {
-        "type": "form",
-        "scale": 0,
-        "min_width": 0,
-        "visible": true
-      }
-    }
-  ],
-  "css": null,
-  "title": "Gradio",
-  "space_id": null,
-  "enable_queue": null,
-  "show_error": true,
-  "show_api": true,
-  "is_colab": false,
-  "stylesheets": [
-    "https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600&display=swap",
-    "https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&display=swap"
-  ],
-  "theme": "default",
-  "layout": {
-    "id": 0,
-    "children": [
-      {
-        "id": 1
-      },
-      {
-        "id": 15,
-        "children": [
-          {
-            "id": 2
-          }
-        ]
-      },
-      {
-        "id": 3,
-        "children": [
-          {
-            "id": 4,
-            "children": [
-              {
-                "id": 5,
-                "children": [
-                  {
-                    "id": 6
-                  },
-                  {
-                    "id": 7
-                  }
-                ]
-              },
-              {
-                "id": 8
-              }
-            ]
-          },
-          {
-            "id": 9,
-            "children": [
-              {
-                "id": 10,
-                "children": [
-                  {
-                    "id": 11
-                  },
-                  {
-                    "id": 12
-                  }
-                ]
-              },
-              {
-                "id": 13
-              }
-            ]
-          }
-        ]
-      },
-      {
-        "id": 16,
-        "children": [
-          {
-            "id": 14
-          }
-        ]
-      }
-    ]
-  },
-  "dependencies": [
-    {
-      "targets": [
-        8
-      ],
-      "trigger": "click",
-      "inputs": [
-        2,
-        6
-      ],
-      "outputs": [
-        7
-      ],
-      "backend_fn": true,
-      "js": null,
-      "queue": null,
-      "api_name": null,
-      "scroll_to_output": false,
-      "show_progress": "full",
-      "every": null,
-      "batch": false,
-      "max_batch_size": 4,
-      "cancels": [],
-      "types": {
-        "continuous": false,
-        "generator": false
-      },
-      "collects_event_data": false,
-      "trigger_after": null,
-      "trigger_only_on_success": false
-    },
-    {
-      "targets": [
-        13
-      ],
-      "trigger": "click",
-      "inputs": [
-        2,
-        11
-      ],
-      "outputs": [
-        12
-      ],
-      "backend_fn": true,
-      "js": null,
-      "queue": null,
-      "api_name": null,
-      "scroll_to_output": false,
-      "show_progress": "full",
-      "every": null,
-      "batch": false,
-      "max_batch_size": 4,
-      "cancels": [],
-      "types": {
-        "continuous": false,
-        "generator": false
-      },
-      "collects_event_data": false,
-      "trigger_after": null,
-      "trigger_only_on_success": false
-    }
-  ]
-}
\ No newline at end of file
+	"version": "3.40.1",
+	"mode": "blocks",
+	"dev_mode": true,
+	"analytics_enabled": true,
+	"components": [
+		{
+			"id": 1,
+			"type": "markdown",
+			"props": {
+				"value": "# Detect Disease From Scan\nWith this model you can lorem ipsum\n- ipsum 1\n- ipsum 2",
+				"rtl": false,
+				"latex_delimiters": [
+					{
+						"left": "$",
+						"right": "$",
+						"display": false
+					}
+				],
+				"name": "markdown",
+				"visible": true
+			},
+			"serializer": "StringSerializable",
+			"api_info": {
+				"info": {
+					"type": "string"
+				},
+				"serialized_info": false
+			},
+			"example_inputs": {
+				"raw": "Howdy!",
+				"serialized": "Howdy!"
+			}
+		},
+		{
+			"id": 2,
+			"type": "checkboxgroup",
+			"props": {
+				"choices": [
+					["Covid", "Covid"],
+					["Malaria", "Malaria"],
+					["Lung Cancer", "Lung Cancer"]
+				],
+				"value": [],
+				"label": "Disease to Scan For",
+				"show_label": true,
+				"container": true,
+				"min_width": 160,
+				"name": "checkboxgroup",
+				"visible": true
+			},
+			"serializer": "ListStringSerializable",
+			"api_info": {
+				"info": {
+					"type": "array",
+					"items": {
+						"type": "string"
+					}
+				},
+				"serialized_info": false
+			},
+			"example_inputs": {
+				"raw": ["Covid"],
+				"serialized": ["Covid"]
+			}
+		},
+		{
+			"id": 3,
+			"type": "tabs",
+			"props": {
+				"visible": true
+			}
+		},
+		{
+			"id": 4,
+			"type": "tabitem",
+			"props": {
+				"label": "X-ray",
+				"visible": true
+			}
+		},
+		{
+			"id": 5,
+			"type": "row",
+			"props": {
+				"type": "row",
+				"variant": "default",
+				"equal_height": true,
+				"visible": true
+			}
+		},
+		{
+			"id": 6,
+			"type": "image",
+			"props": {
+				"image_mode": "RGB",
+				"source": "upload",
+				"tool": "editor",
+				"streaming": false,
+				"mirror_webcam": true,
+				"brush_color": "#000000",
+				"mask_opacity": 0.7,
+				"selectable": false,
+				"show_share_button": false,
+				"show_download_button": true,
+				"show_label": true,
+				"container": true,
+				"min_width": 160,
+				"name": "image",
+				"visible": true
+			},
+			"serializer": "ImgSerializable",
+			"api_info": {
+				"info": {
+					"type": "string",
+					"description": "base64 representation of an image"
+				},
+				"serialized_info": true
+			},
+			"example_inputs": {
+				"raw": "data:image/png;base64,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",
+				"serialized": "https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png"
+			}
+		},
+		{
+			"id": 7,
+			"type": "json",
+			"props": {
+				"show_label": true,
+				"container": true,
+				"min_width": 160,
+				"name": "json",
+				"visible": true
+			},
+			"serializer": "JSONSerializable",
+			"api_info": {
+				"info": {
+					"type": {},
+					"description": "any valid json"
+				},
+				"serialized_info": true
+			},
+			"example_inputs": {
+				"raw": {
+					"a": 1,
+					"b": 2
+				},
+				"serialized": null
+			}
+		},
+		{
+			"id": 8,
+			"type": "button",
+			"props": {
+				"value": "Run",
+				"variant": "secondary",
+				"interactive": true,
+				"name": "button",
+				"visible": true
+			},
+			"serializer": "StringSerializable",
+			"api_info": {
+				"info": {
+					"type": "string"
+				},
+				"serialized_info": false
+			},
+			"example_inputs": {
+				"raw": "Howdy!",
+				"serialized": "Howdy!"
+			}
+		},
+		{
+			"id": 9,
+			"type": "tabitem",
+			"props": {
+				"label": "CT Scan",
+				"visible": true
+			}
+		},
+		{
+			"id": 10,
+			"type": "row",
+			"props": {
+				"type": "row",
+				"variant": "default",
+				"equal_height": true,
+				"visible": true
+			}
+		},
+		{
+			"id": 11,
+			"type": "image",
+			"props": {
+				"image_mode": "RGB",
+				"source": "upload",
+				"tool": "editor",
+				"streaming": false,
+				"mirror_webcam": true,
+				"brush_color": "#000000",
+				"mask_opacity": 0.7,
+				"selectable": false,
+				"show_share_button": false,
+				"show_download_button": true,
+				"show_label": true,
+				"container": true,
+				"min_width": 160,
+				"name": "image",
+				"visible": true
+			},
+			"serializer": "ImgSerializable",
+			"api_info": {
+				"info": {
+					"type": "string",
+					"description": "base64 representation of an image"
+				},
+				"serialized_info": true
+			},
+			"example_inputs": {
+				"raw": "data:image/png;base64,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",
+				"serialized": "https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png"
+			}
+		},
+		{
+			"id": 12,
+			"type": "json",
+			"props": {
+				"show_label": true,
+				"container": true,
+				"min_width": 160,
+				"name": "json",
+				"visible": true
+			},
+			"serializer": "JSONSerializable",
+			"api_info": {
+				"info": {
+					"type": {},
+					"description": "any valid json"
+				},
+				"serialized_info": true
+			},
+			"example_inputs": {
+				"raw": {
+					"a": 1,
+					"b": 2
+				},
+				"serialized": null
+			}
+		},
+		{
+			"id": 13,
+			"type": "button",
+			"props": {
+				"value": "Run",
+				"variant": "secondary",
+				"interactive": true,
+				"name": "button",
+				"visible": true
+			},
+			"serializer": "StringSerializable",
+			"api_info": {
+				"info": {
+					"type": "string"
+				},
+				"serialized_info": false
+			},
+			"example_inputs": {
+				"raw": "Howdy!",
+				"serialized": "Howdy!"
+			}
+		},
+		{
+			"id": 14,
+			"type": "textbox",
+			"props": {
+				"lines": 1,
+				"max_lines": 20,
+				"value": "",
+				"type": "text",
+				"autofocus": false,
+				"show_copy_button": false,
+				"container": true,
+				"rtl": false,
+				"show_label": true,
+				"min_width": 160,
+				"name": "textbox",
+				"visible": true
+			},
+			"serializer": "StringSerializable",
+			"api_info": {
+				"info": {
+					"type": "string"
+				},
+				"serialized_info": false
+			},
+			"example_inputs": {
+				"raw": "Howdy!",
+				"serialized": "Howdy!"
+			}
+		},
+		{
+			"id": 15,
+			"type": "form",
+			"props": {
+				"type": "form",
+				"scale": 0,
+				"min_width": 0,
+				"visible": true
+			}
+		},
+		{
+			"id": 16,
+			"type": "form",
+			"props": {
+				"type": "form",
+				"scale": 0,
+				"min_width": 0,
+				"visible": true
+			}
+		}
+	],
+	"css": null,
+	"title": "Gradio",
+	"space_id": null,
+	"enable_queue": null,
+	"show_error": true,
+	"show_api": true,
+	"is_colab": false,
+	"stylesheets": [
+		"https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600&display=swap",
+		"https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&display=swap"
+	],
+	"theme": "default",
+	"layout": {
+		"id": 0,
+		"children": [
+			{
+				"id": 1
+			},
+			{
+				"id": 15,
+				"children": [
+					{
+						"id": 2
+					}
+				]
+			},
+			{
+				"id": 3,
+				"children": [
+					{
+						"id": 4,
+						"children": [
+							{
+								"id": 5,
+								"children": [
+									{
+										"id": 6
+									},
+									{
+										"id": 7
+									}
+								]
+							},
+							{
+								"id": 8
+							}
+						]
+					},
+					{
+						"id": 9,
+						"children": [
+							{
+								"id": 10,
+								"children": [
+									{
+										"id": 11
+									},
+									{
+										"id": 12
+									}
+								]
+							},
+							{
+								"id": 13
+							}
+						]
+					}
+				]
+			},
+			{
+				"id": 16,
+				"children": [
+					{
+						"id": 14
+					}
+				]
+			}
+		]
+	},
+	"dependencies": [
+		{
+			"targets": [8],
+			"trigger": "click",
+			"inputs": [2, 6],
+			"outputs": [7],
+			"backend_fn": true,
+			"js": null,
+			"queue": null,
+			"api_name": null,
+			"scroll_to_output": false,
+			"show_progress": "full",
+			"every": null,
+			"batch": false,
+			"max_batch_size": 4,
+			"cancels": [],
+			"types": {
+				"continuous": false,
+				"generator": false
+			},
+			"collects_event_data": false,
+			"trigger_after": null,
+			"trigger_only_on_success": false
+		},
+		{
+			"targets": [13],
+			"trigger": "click",
+			"inputs": [2, 11],
+			"outputs": [12],
+			"backend_fn": true,
+			"js": null,
+			"queue": null,
+			"api_name": null,
+			"scroll_to_output": false,
+			"show_progress": "full",
+			"every": null,
+			"batch": false,
+			"max_batch_size": 4,
+			"cancels": [],
+			"types": {
+				"continuous": false,
+				"generator": false
+			},
+			"collects_event_data": false,
+			"trigger_after": null,
+			"trigger_only_on_success": false
+		}
+	]
+}
diff --git a/test/test_files/xray_config_diff_ids.json b/test/test_files/xray_config_diff_ids.json
--- a/test/test_files/xray_config_diff_ids.json
+++ b/test/test_files/xray_config_diff_ids.json
@@ -1,476 +1,449 @@
 {
-  "version": "3.40.1",
-  "mode": "blocks",
-  "dev_mode": true,
-  "analytics_enabled": true,
-  "components": [
-    {
-      "id": 101,
-      "type": "markdown",
-      "props": {
-        "value": "# Detect Disease From Scan\nWith this model you can lorem ipsum\n- ipsum 1\n- ipsum 2",
-        "rtl": false,
-        "latex_delimiters": [
-          {
-            "left": "$",
-            "right": "$",
-            "display": false
-          }
-        ],
-        "name": "markdown",
-        "visible": true
-      },
-      "serializer": "StringSerializable",
-      "api_info": {
-        "info": {
-          "type": "string"
-        },
-        "serialized_info": false
-      },
-      "example_inputs": {
-        "raw": "Howdy!",
-        "serialized": "Howdy!"
-      }
-    },
-    {
-      "id": 102,
-      "type": "checkboxgroup",
-      "props": {
-        "choices": [
-          [
-            "Covid",
-            "Covid"
-          ],
-          [
-            "Malaria",
-            "Malaria"
-          ],
-          [
-            "Lung Cancer",
-            "Lung Cancer"
-          ]
-        ],
-        "value": [],
-        "label": "Disease to Scan For",
-        "show_label": true,
-        "container": true,
-        "min_width": 160,
-        "name": "checkboxgroup",
-        "visible": true
-      },
-      "serializer": "ListStringSerializable",
-      "api_info": {
-        "info": {
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "serialized_info": false
-      },
-      "example_inputs": {
-        "raw": [
-          "Covid"
-        ],
-        "serialized": [
-          "Covid"
-        ]
-      }
-    },
-    {
-      "id": 103,
-      "type": "tabs",
-      "props": {
-        "visible": true
-      }
-    },
-    {
-      "id": 104,
-      "type": "tabitem",
-      "props": {
-        "label": "X-ray",
-        "visible": true
-      }
-    },
-    {
-      "id": 105,
-      "type": "row",
-      "props": {
-        "type": "row",
-        "variant": "default",
-        "equal_height": true,
-        "visible": true
-      }
-    },
-    {
-      "id": 106,
-      "type": "image",
-      "props": {
-        "image_mode": "RGB",
-        "source": "upload",
-        "tool": "editor",
-        "streaming": false,
-        "mirror_webcam": true,
-        "brush_color": "#000000",
-        "mask_opacity": 0.7,
-        "selectable": false,
-        "show_share_button": false,
-        "show_download_button": true,
-        "show_label": true,
-        "container": true,
-        "min_width": 160,
-        "name": "image",
-        "visible": true
-      },
-      "serializer": "ImgSerializable",
-      "api_info": {
-        "info": {
-          "type": "string",
-          "description": "base64 representation of an image"
-        },
-        "serialized_info": true
-      },
-      "example_inputs": {
-        "raw": "data:image/png;base64,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",
-        "serialized": "https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png"
-      }
-    },
-    {
-      "id": 107,
-      "type": "json",
-      "props": {
-        "show_label": true,
-        "container": true,
-        "min_width": 160,
-        "name": "json",
-        "visible": true
-      },
-      "serializer": "JSONSerializable",
-      "api_info": {
-        "info": {
-          "type": {},
-          "description": "any valid json"
-        },
-        "serialized_info": true
-      },
-      "example_inputs": {
-        "raw": {
-          "a": 1,
-          "b": 2
-        },
-        "serialized": null
-      }
-    },
-    {
-      "id": 108,
-      "type": "button",
-      "props": {
-        "value": "Run",
-        "variant": "secondary",
-        "interactive": true,
-        "name": "button",
-        "visible": true
-      },
-      "serializer": "StringSerializable",
-      "api_info": {
-        "info": {
-          "type": "string"
-        },
-        "serialized_info": false
-      },
-      "example_inputs": {
-        "raw": "Howdy!",
-        "serialized": "Howdy!"
-      }
-    },
-    {
-      "id": 109,
-      "type": "tabitem",
-      "props": {
-        "label": "CT Scan",
-        "visible": true
-      }
-    },
-    {
-      "id": 110,
-      "type": "row",
-      "props": {
-        "type": "row",
-        "variant": "default",
-        "equal_height": true,
-        "visible": true
-      }
-    },
-    {
-      "id": 111,
-      "type": "image",
-      "props": {
-        "image_mode": "RGB",
-        "source": "upload",
-        "tool": "editor",
-        "streaming": false,
-        "mirror_webcam": true,
-        "brush_color": "#000000",
-        "mask_opacity": 0.7,
-        "selectable": false,
-        "show_share_button": false,
-        "show_download_button": true,
-        "show_label": true,
-        "container": true,
-        "min_width": 160,
-        "name": "image",
-        "visible": true
-      },
-      "serializer": "ImgSerializable",
-      "api_info": {
-        "info": {
-          "type": "string",
-          "description": "base64 representation of an image"
-        },
-        "serialized_info": true
-      },
-      "example_inputs": {
-        "raw": "data:image/png;base64,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",
-        "serialized": "https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png"
-      }
-    },
-    {
-      "id": 112,
-      "type": "json",
-      "props": {
-        "show_label": true,
-        "container": true,
-        "min_width": 160,
-        "name": "json",
-        "visible": true
-      },
-      "serializer": "JSONSerializable",
-      "api_info": {
-        "info": {
-          "type": {},
-          "description": "any valid json"
-        },
-        "serialized_info": true
-      },
-      "example_inputs": {
-        "raw": {
-          "a": 1,
-          "b": 2
-        },
-        "serialized": null
-      }
-    },
-    {
-      "id": 113,
-      "type": "button",
-      "props": {
-        "value": "Run",
-        "variant": "secondary",
-        "interactive": true,
-        "name": "button",
-        "visible": true
-      },
-      "serializer": "StringSerializable",
-      "api_info": {
-        "info": {
-          "type": "string"
-        },
-        "serialized_info": false
-      },
-      "example_inputs": {
-        "raw": "Howdy!",
-        "serialized": "Howdy!"
-      }
-    },
-    {
-      "id": 114,
-      "type": "textbox",
-      "props": {
-        "lines": 1,
-        "max_lines": 20,
-        "value": "",
-        "type": "text",
-        "autofocus": false,
-        "show_copy_button": false,
-        "container": true,
-        "rtl": false,
-        "show_label": true,
-        "min_width": 160,
-        "name": "textbox",
-        "visible": true
-      },
-      "serializer": "StringSerializable",
-      "api_info": {
-        "info": {
-          "type": "string"
-        },
-        "serialized_info": false
-      },
-      "example_inputs": {
-        "raw": "Howdy!",
-        "serialized": "Howdy!"
-      }
-    },
-    {
-      "id": 115,
-      "type": "form",
-      "props": {
-        "type": "form",
-        "scale": 0,
-        "min_width": 0,
-        "visible": true
-      }
-    },
-    {
-      "id": 116,
-      "type": "form",
-      "props": {
-        "type": "form",
-        "scale": 0,
-        "min_width": 0,
-        "visible": true
-      }
-    }
-  ],
-  "css": null,
-  "title": "Gradio",
-  "space_id": null,
-  "enable_queue": null,
-  "show_error": true,
-  "show_api": true,
-  "is_colab": false,
-  "stylesheets": [
-    "https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600&display=swap",
-    "https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&display=swap"
-  ],
-  "theme": "default",
-  "layout": {
-    "id": 100,
-    "children": [
-      {
-        "id": 101
-      },
-      {
-        "id": 115,
-        "children": [
-          {
-            "id": 102
-          }
-        ]
-      },
-      {
-        "id": 103,
-        "children": [
-          {
-            "id": 104,
-            "children": [
-              {
-                "id": 105,
-                "children": [
-                  {
-                    "id": 106
-                  },
-                  {
-                    "id": 107
-                  }
-                ]
-              },
-              {
-                "id": 108
-              }
-            ]
-          },
-          {
-            "id": 109,
-            "children": [
-              {
-                "id": 110,
-                "children": [
-                  {
-                    "id": 111
-                  },
-                  {
-                    "id": 112
-                  }
-                ]
-              },
-              {
-                "id": 113
-              }
-            ]
-          }
-        ]
-      },
-      {
-        "id": 116,
-        "children": [
-          {
-            "id": 114
-          }
-        ]
-      }
-    ]
-  },
-  "dependencies": [
-    {
-      "targets": [
-        108
-      ],
-      "trigger": "click",
-      "inputs": [
-        102,
-        106
-      ],
-      "outputs": [
-        107
-      ],
-      "backend_fn": true,
-      "js": null,
-      "queue": null,
-      "api_name": null,
-      "scroll_to_output": false,
-      "show_progress": "full",
-      "every": null,
-      "batch": false,
-      "max_batch_size": 4,
-      "cancels": [],
-      "types": {
-        "continuous": false,
-        "generator": false
-      },
-      "collects_event_data": false,
-      "trigger_after": null,
-      "trigger_only_on_success": false
-    },
-    {
-      "targets": [
-        113
-      ],
-      "trigger": "click",
-      "inputs": [
-        102,
-        111
-      ],
-      "outputs": [
-        112
-      ],
-      "backend_fn": true,
-      "js": null,
-      "queue": null,
-      "api_name": null,
-      "scroll_to_output": false,
-      "show_progress": "full",
-      "every": null,
-      "batch": false,
-      "max_batch_size": 4,
-      "cancels": [],
-      "types": {
-        "continuous": false,
-        "generator": false
-      },
-      "collects_event_data": false,
-      "trigger_after": null,
-      "trigger_only_on_success": false
-    }
-  ]
-}
\ No newline at end of file
+	"version": "3.40.1",
+	"mode": "blocks",
+	"dev_mode": true,
+	"analytics_enabled": true,
+	"components": [
+		{
+			"id": 101,
+			"type": "markdown",
+			"props": {
+				"value": "# Detect Disease From Scan\nWith this model you can lorem ipsum\n- ipsum 1\n- ipsum 2",
+				"rtl": false,
+				"latex_delimiters": [
+					{
+						"left": "$",
+						"right": "$",
+						"display": false
+					}
+				],
+				"name": "markdown",
+				"visible": true
+			},
+			"serializer": "StringSerializable",
+			"api_info": {
+				"info": {
+					"type": "string"
+				},
+				"serialized_info": false
+			},
+			"example_inputs": {
+				"raw": "Howdy!",
+				"serialized": "Howdy!"
+			}
+		},
+		{
+			"id": 102,
+			"type": "checkboxgroup",
+			"props": {
+				"choices": [
+					["Covid", "Covid"],
+					["Malaria", "Malaria"],
+					["Lung Cancer", "Lung Cancer"]
+				],
+				"value": [],
+				"label": "Disease to Scan For",
+				"show_label": true,
+				"container": true,
+				"min_width": 160,
+				"name": "checkboxgroup",
+				"visible": true
+			},
+			"serializer": "ListStringSerializable",
+			"api_info": {
+				"info": {
+					"type": "array",
+					"items": {
+						"type": "string"
+					}
+				},
+				"serialized_info": false
+			},
+			"example_inputs": {
+				"raw": ["Covid"],
+				"serialized": ["Covid"]
+			}
+		},
+		{
+			"id": 103,
+			"type": "tabs",
+			"props": {
+				"visible": true
+			}
+		},
+		{
+			"id": 104,
+			"type": "tabitem",
+			"props": {
+				"label": "X-ray",
+				"visible": true
+			}
+		},
+		{
+			"id": 105,
+			"type": "row",
+			"props": {
+				"type": "row",
+				"variant": "default",
+				"equal_height": true,
+				"visible": true
+			}
+		},
+		{
+			"id": 106,
+			"type": "image",
+			"props": {
+				"image_mode": "RGB",
+				"source": "upload",
+				"tool": "editor",
+				"streaming": false,
+				"mirror_webcam": true,
+				"brush_color": "#000000",
+				"mask_opacity": 0.7,
+				"selectable": false,
+				"show_share_button": false,
+				"show_download_button": true,
+				"show_label": true,
+				"container": true,
+				"min_width": 160,
+				"name": "image",
+				"visible": true
+			},
+			"serializer": "ImgSerializable",
+			"api_info": {
+				"info": {
+					"type": "string",
+					"description": "base64 representation of an image"
+				},
+				"serialized_info": true
+			},
+			"example_inputs": {
+				"raw": "data:image/png;base64,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",
+				"serialized": "https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png"
+			}
+		},
+		{
+			"id": 107,
+			"type": "json",
+			"props": {
+				"show_label": true,
+				"container": true,
+				"min_width": 160,
+				"name": "json",
+				"visible": true
+			},
+			"serializer": "JSONSerializable",
+			"api_info": {
+				"info": {
+					"type": {},
+					"description": "any valid json"
+				},
+				"serialized_info": true
+			},
+			"example_inputs": {
+				"raw": {
+					"a": 1,
+					"b": 2
+				},
+				"serialized": null
+			}
+		},
+		{
+			"id": 108,
+			"type": "button",
+			"props": {
+				"value": "Run",
+				"variant": "secondary",
+				"interactive": true,
+				"name": "button",
+				"visible": true
+			},
+			"serializer": "StringSerializable",
+			"api_info": {
+				"info": {
+					"type": "string"
+				},
+				"serialized_info": false
+			},
+			"example_inputs": {
+				"raw": "Howdy!",
+				"serialized": "Howdy!"
+			}
+		},
+		{
+			"id": 109,
+			"type": "tabitem",
+			"props": {
+				"label": "CT Scan",
+				"visible": true
+			}
+		},
+		{
+			"id": 110,
+			"type": "row",
+			"props": {
+				"type": "row",
+				"variant": "default",
+				"equal_height": true,
+				"visible": true
+			}
+		},
+		{
+			"id": 111,
+			"type": "image",
+			"props": {
+				"image_mode": "RGB",
+				"source": "upload",
+				"tool": "editor",
+				"streaming": false,
+				"mirror_webcam": true,
+				"brush_color": "#000000",
+				"mask_opacity": 0.7,
+				"selectable": false,
+				"show_share_button": false,
+				"show_download_button": true,
+				"show_label": true,
+				"container": true,
+				"min_width": 160,
+				"name": "image",
+				"visible": true
+			},
+			"serializer": "ImgSerializable",
+			"api_info": {
+				"info": {
+					"type": "string",
+					"description": "base64 representation of an image"
+				},
+				"serialized_info": true
+			},
+			"example_inputs": {
+				"raw": "data:image/png;base64,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",
+				"serialized": "https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png"
+			}
+		},
+		{
+			"id": 112,
+			"type": "json",
+			"props": {
+				"show_label": true,
+				"container": true,
+				"min_width": 160,
+				"name": "json",
+				"visible": true
+			},
+			"serializer": "JSONSerializable",
+			"api_info": {
+				"info": {
+					"type": {},
+					"description": "any valid json"
+				},
+				"serialized_info": true
+			},
+			"example_inputs": {
+				"raw": {
+					"a": 1,
+					"b": 2
+				},
+				"serialized": null
+			}
+		},
+		{
+			"id": 113,
+			"type": "button",
+			"props": {
+				"value": "Run",
+				"variant": "secondary",
+				"interactive": true,
+				"name": "button",
+				"visible": true
+			},
+			"serializer": "StringSerializable",
+			"api_info": {
+				"info": {
+					"type": "string"
+				},
+				"serialized_info": false
+			},
+			"example_inputs": {
+				"raw": "Howdy!",
+				"serialized": "Howdy!"
+			}
+		},
+		{
+			"id": 114,
+			"type": "textbox",
+			"props": {
+				"lines": 1,
+				"max_lines": 20,
+				"value": "",
+				"type": "text",
+				"autofocus": false,
+				"show_copy_button": false,
+				"container": true,
+				"rtl": false,
+				"show_label": true,
+				"min_width": 160,
+				"name": "textbox",
+				"visible": true
+			},
+			"serializer": "StringSerializable",
+			"api_info": {
+				"info": {
+					"type": "string"
+				},
+				"serialized_info": false
+			},
+			"example_inputs": {
+				"raw": "Howdy!",
+				"serialized": "Howdy!"
+			}
+		},
+		{
+			"id": 115,
+			"type": "form",
+			"props": {
+				"type": "form",
+				"scale": 0,
+				"min_width": 0,
+				"visible": true
+			}
+		},
+		{
+			"id": 116,
+			"type": "form",
+			"props": {
+				"type": "form",
+				"scale": 0,
+				"min_width": 0,
+				"visible": true
+			}
+		}
+	],
+	"css": null,
+	"title": "Gradio",
+	"space_id": null,
+	"enable_queue": null,
+	"show_error": true,
+	"show_api": true,
+	"is_colab": false,
+	"stylesheets": [
+		"https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600&display=swap",
+		"https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&display=swap"
+	],
+	"theme": "default",
+	"layout": {
+		"id": 100,
+		"children": [
+			{
+				"id": 101
+			},
+			{
+				"id": 115,
+				"children": [
+					{
+						"id": 102
+					}
+				]
+			},
+			{
+				"id": 103,
+				"children": [
+					{
+						"id": 104,
+						"children": [
+							{
+								"id": 105,
+								"children": [
+									{
+										"id": 106
+									},
+									{
+										"id": 107
+									}
+								]
+							},
+							{
+								"id": 108
+							}
+						]
+					},
+					{
+						"id": 109,
+						"children": [
+							{
+								"id": 110,
+								"children": [
+									{
+										"id": 111
+									},
+									{
+										"id": 112
+									}
+								]
+							},
+							{
+								"id": 113
+							}
+						]
+					}
+				]
+			},
+			{
+				"id": 116,
+				"children": [
+					{
+						"id": 114
+					}
+				]
+			}
+		]
+	},
+	"dependencies": [
+		{
+			"targets": [108],
+			"trigger": "click",
+			"inputs": [102, 106],
+			"outputs": [107],
+			"backend_fn": true,
+			"js": null,
+			"queue": null,
+			"api_name": null,
+			"scroll_to_output": false,
+			"show_progress": "full",
+			"every": null,
+			"batch": false,
+			"max_batch_size": 4,
+			"cancels": [],
+			"types": {
+				"continuous": false,
+				"generator": false
+			},
+			"collects_event_data": false,
+			"trigger_after": null,
+			"trigger_only_on_success": false
+		},
+		{
+			"targets": [113],
+			"trigger": "click",
+			"inputs": [102, 111],
+			"outputs": [112],
+			"backend_fn": true,
+			"js": null,
+			"queue": null,
+			"api_name": null,
+			"scroll_to_output": false,
+			"show_progress": "full",
+			"every": null,
+			"batch": false,
+			"max_batch_size": 4,
+			"cancels": [],
+			"types": {
+				"continuous": false,
+				"generator": false
+			},
+			"collects_event_data": false,
+			"trigger_after": null,
+			"trigger_only_on_success": false
+		}
+	]
+}
diff --git a/test/test_files/xray_config_wrong.json b/test/test_files/xray_config_wrong.json
--- a/test/test_files/xray_config_wrong.json
+++ b/test/test_files/xray_config_wrong.json
@@ -1,548 +1,519 @@
 {
-  "version": "3.40.1",
-  "mode": "blocks",
-  "dev_mode": true,
-  "analytics_enabled": true,
-  "components": [
-    {
-      "id": 1,
-      "type": "markdown",
-      "props": {
-        "value": "# Detect Disease From Scan\nWith this model you can lorem ipsum\n- ipsum 1\n- ipsum 2",
-        "rtl": false,
-        "latex_delimiters": [
-          {
-            "left": "$",
-            "right": "$",
-            "display": false
-          }
-        ],
-        "name": "markdown",
-        "visible": true
-      },
-      "serializer": "StringSerializable",
-      "api_info": {
-        "info": {
-          "type": "string"
-        },
-        "serialized_info": false
-      },
-      "example_inputs": {
-        "raw": "Howdy!",
-        "serialized": "Howdy!"
-      }
-    },
-    {
-      "id": 2,
-      "type": "checkboxgroup",
-      "props": {
-        "choices": [
-          [
-            "Covid",
-            "Covid"
-          ],
-          [
-            "Malaria",
-            "Malaria"
-          ],
-          [
-            "Lung Cancer",
-            "Lung Cancer"
-          ]
-        ],
-        "value": [],
-        "label": "Disease to Scan For",
-        "show_label": true,
-        "container": true,
-        "min_width": 160,
-        "name": "checkboxgroup",
-        "visible": true
-      },
-      "serializer": "ListStringSerializable",
-      "api_info": {
-        "info": {
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "serialized_info": false
-      },
-      "example_inputs": {
-        "raw": [
-          "Covid"
-        ],
-        "serialized": [
-          "Covid"
-        ]
-      }
-    },
-    {
-      "id": 3,
-      "type": "tabs",
-      "props": {
-        "visible": true
-      }
-    },
-    {
-      "id": 4,
-      "type": "tabitem",
-      "props": {
-        "label": "X-ray",
-        "visible": true
-      }
-    },
-    {
-      "id": 5,
-      "type": "row",
-      "props": {
-        "type": "row",
-        "variant": "default",
-        "equal_height": true,
-        "visible": true
-      }
-    },
-    {
-      "id": 6,
-      "type": "image",
-      "props": {
-        "image_mode": "RGB",
-        "source": "upload",
-        "tool": "editor",
-        "streaming": false,
-        "mirror_webcam": true,
-        "brush_color": "#000000",
-        "mask_opacity": 0.7,
-        "selectable": false,
-        "show_share_button": false,
-        "show_download_button": true,
-        "show_label": true,
-        "container": true,
-        "min_width": 160,
-        "name": "image",
-        "visible": true
-      },
-      "serializer": "ImgSerializable",
-      "api_info": {
-        "info": {
-          "type": "string",
-          "description": "base64 representation of an image"
-        },
-        "serialized_info": true
-      },
-      "example_inputs": {
-        "raw": "data:image/png;base64,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",
-        "serialized": "https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png"
-      }
-    },
-    {
-      "id": 7,
-      "type": "json",
-      "props": {
-        "show_label": true,
-        "container": true,
-        "min_width": 160,
-        "name": "json",
-        "visible": true
-      },
-      "serializer": "JSONSerializable",
-      "api_info": {
-        "info": {
-          "type": {},
-          "description": "any valid json"
-        },
-        "serialized_info": true
-      },
-      "example_inputs": {
-        "raw": {
-          "a": 1,
-          "b": 2
-        },
-        "serialized": null
-      }
-    },
-    {
-      "id": 8,
-      "type": "button",
-      "props": {
-        "value": "Run",
-        "variant": "secondary",
-        "interactive": true,
-        "name": "button",
-        "visible": true
-      },
-      "serializer": "StringSerializable",
-      "api_info": {
-        "info": {
-          "type": "string"
-        },
-        "serialized_info": false
-      },
-      "example_inputs": {
-        "raw": "Howdy!",
-        "serialized": "Howdy!"
-      }
-    },
-    {
-      "id": 9,
-      "type": "tabitem",
-      "props": {
-        "label": "CT Scan",
-        "visible": true
-      }
-    },
-    {
-      "id": 10,
-      "type": "row",
-      "props": {
-        "type": "row",
-        "variant": "default",
-        "equal_height": true,
-        "visible": true
-      }
-    },
-    {
-      "id": 11,
-      "type": "image",
-      "props": {
-        "image_mode": "RGB",
-        "source": "upload",
-        "tool": "editor",
-        "streaming": false,
-        "mirror_webcam": true,
-        "brush_color": "#000000",
-        "mask_opacity": 0.7,
-        "selectable": false,
-        "show_share_button": false,
-        "show_download_button": true,
-        "show_label": true,
-        "container": true,
-        "min_width": 160,
-        "name": "image",
-        "visible": true
-      },
-      "serializer": "ImgSerializable",
-      "api_info": {
-        "info": {
-          "type": "string",
-          "description": "base64 representation of an image"
-        },
-        "serialized_info": true
-      },
-      "example_inputs": {
-        "raw": "data:image/png;base64,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",
-        "serialized": "https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png"
-      }
-    },
-    {
-      "id": 12,
-      "type": "json",
-      "props": {
-        "show_label": true,
-        "container": true,
-        "min_width": 160,
-        "name": "json",
-        "visible": true
-      },
-      "serializer": "JSONSerializable",
-      "api_info": {
-        "info": {
-          "type": {},
-          "description": "any valid json"
-        },
-        "serialized_info": true
-      },
-      "example_inputs": {
-        "raw": {
-          "a": 1,
-          "b": 2
-        },
-        "serialized": null
-      }
-    },
-    {
-      "id": 13,
-      "type": "button",
-      "props": {
-        "value": "Run",
-        "variant": "secondary",
-        "interactive": true,
-        "name": "button",
-        "visible": true
-      },
-      "serializer": "StringSerializable",
-      "api_info": {
-        "info": {
-          "type": "string"
-        },
-        "serialized_info": false
-      },
-      "example_inputs": {
-        "raw": "Howdy!",
-        "serialized": "Howdy!"
-      }
-    },
-    {
-      "id": 14,
-      "type": "textbox",
-      "props": {
-        "lines": 1,
-        "max_lines": 20,
-        "value": "",
-        "type": "text",
-        "autofocus": false,
-        "show_copy_button": false,
-        "container": true,
-        "rtl": false,
-        "show_label": true,
-        "min_width": 160,
-        "name": "textbox",
-        "visible": true
-      },
-      "serializer": "StringSerializable",
-      "api_info": {
-        "info": {
-          "type": "string"
-        },
-        "serialized_info": false
-      },
-      "example_inputs": {
-        "raw": "Howdy!",
-        "serialized": "Howdy!"
-      }
-    },
-    {
-      "id": 15,
-      "type": "form",
-      "props": {
-        "type": "form",
-        "scale": 0,
-        "min_width": 0,
-        "visible": true
-      }
-    },
-    {
-      "id": 16,
-      "type": "form",
-      "props": {
-        "type": "form",
-        "scale": 0,
-        "min_width": 0,
-        "visible": true
-      }
-    },
-    {
-      "id": 118,
-      "type": "textbox",
-      "props": {
-        "lines": 1,
-        "max_lines": 20,
-        "value": "",
-        "type": "text",
-        "autofocus": false,
-        "show_copy_button": false,
-        "container": true,
-        "rtl": false,
-        "show_label": true,
-        "min_width": 160,
-        "name": "textbox",
-        "visible": true
-      },
-      "serializer": "StringSerializable",
-      "api_info": {
-        "info": {
-          "type": "string"
-        },
-        "serialized_info": false
-      },
-      "example_inputs": {
-        "raw": "Howdy!",
-        "serialized": "Howdy!"
-      }
-    },
-    {
-      "id": 119,
-      "type": "form",
-      "props": {
-        "type": "form",
-        "scale": 0,
-        "min_width": 0,
-        "visible": true
-      }
-    }
-  ],
-  "css": null,
-  "title": "Gradio",
-  "space_id": null,
-  "enable_queue": null,
-  "show_error": true,
-  "show_api": true,
-  "is_colab": false,
-  "stylesheets": [
-    "https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600&display=swap",
-    "https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&display=swap"
-  ],
-  "theme": "default",
-  "layout": {
-    "id": 117,
-    "children": [
-      {
-        "id": 1
-      },
-      {
-        "id": 15,
-        "children": [
-          {
-            "id": 2
-          }
-        ]
-      },
-      {
-        "id": 3,
-        "children": [
-          {
-            "id": 4,
-            "children": [
-              {
-                "id": 5,
-                "children": [
-                  {
-                    "id": 6
-                  },
-                  {
-                    "id": 7
-                  }
-                ]
-              },
-              {
-                "id": 8
-              }
-            ]
-          },
-          {
-            "id": 9,
-            "children": [
-              {
-                "id": 10,
-                "children": [
-                  {
-                    "id": 11
-                  },
-                  {
-                    "id": 12
-                  }
-                ]
-              },
-              {
-                "id": 13
-              }
-            ]
-          }
-        ]
-      },
-      {
-        "id": 16,
-        "children": [
-          {
-            "id": 14
-          }
-        ]
-      },
-      {
-        "id": 119,
-        "children": [
-          {
-            "id": 118
-          }
-        ]
-      }
-    ]
-  },
-  "dependencies": [
-    {
-      "targets": [
-        8
-      ],
-      "trigger": "click",
-      "inputs": [
-        2,
-        6
-      ],
-      "outputs": [
-        7
-      ],
-      "backend_fn": true,
-      "js": null,
-      "queue": null,
-      "api_name": null,
-      "scroll_to_output": false,
-      "show_progress": "full",
-      "every": null,
-      "batch": false,
-      "max_batch_size": 4,
-      "cancels": [],
-      "types": {
-        "continuous": false,
-        "generator": false
-      },
-      "collects_event_data": false,
-      "trigger_after": null,
-      "trigger_only_on_success": false
-    },
-    {
-      "targets": [
-        13
-      ],
-      "trigger": "click",
-      "inputs": [
-        2,
-        11
-      ],
-      "outputs": [
-        12
-      ],
-      "backend_fn": true,
-      "js": null,
-      "queue": null,
-      "api_name": null,
-      "scroll_to_output": false,
-      "show_progress": "full",
-      "every": null,
-      "batch": false,
-      "max_batch_size": 4,
-      "cancels": [],
-      "types": {
-        "continuous": false,
-        "generator": false
-      },
-      "collects_event_data": false,
-      "trigger_after": null,
-      "trigger_only_on_success": false
-    },
-    {
-      "targets": [],
-      "trigger": "load",
-      "inputs": [],
-      "outputs": [
-        118
-      ],
-      "backend_fn": true,
-      "js": null,
-      "queue": null,
-      "api_name": null,
-      "scroll_to_output": false,
-      "show_progress": "full",
-      "every": null,
-      "batch": false,
-      "max_batch_size": 4,
-      "cancels": [],
-      "types": {
-        "continuous": false,
-        "generator": false
-      },
-      "collects_event_data": false,
-      "trigger_after": null,
-      "trigger_only_on_success": false
-    }
-  ]
-}
\ No newline at end of file
+	"version": "3.40.1",
+	"mode": "blocks",
+	"dev_mode": true,
+	"analytics_enabled": true,
+	"components": [
+		{
+			"id": 1,
+			"type": "markdown",
+			"props": {
+				"value": "# Detect Disease From Scan\nWith this model you can lorem ipsum\n- ipsum 1\n- ipsum 2",
+				"rtl": false,
+				"latex_delimiters": [
+					{
+						"left": "$",
+						"right": "$",
+						"display": false
+					}
+				],
+				"name": "markdown",
+				"visible": true
+			},
+			"serializer": "StringSerializable",
+			"api_info": {
+				"info": {
+					"type": "string"
+				},
+				"serialized_info": false
+			},
+			"example_inputs": {
+				"raw": "Howdy!",
+				"serialized": "Howdy!"
+			}
+		},
+		{
+			"id": 2,
+			"type": "checkboxgroup",
+			"props": {
+				"choices": [
+					["Covid", "Covid"],
+					["Malaria", "Malaria"],
+					["Lung Cancer", "Lung Cancer"]
+				],
+				"value": [],
+				"label": "Disease to Scan For",
+				"show_label": true,
+				"container": true,
+				"min_width": 160,
+				"name": "checkboxgroup",
+				"visible": true
+			},
+			"serializer": "ListStringSerializable",
+			"api_info": {
+				"info": {
+					"type": "array",
+					"items": {
+						"type": "string"
+					}
+				},
+				"serialized_info": false
+			},
+			"example_inputs": {
+				"raw": ["Covid"],
+				"serialized": ["Covid"]
+			}
+		},
+		{
+			"id": 3,
+			"type": "tabs",
+			"props": {
+				"visible": true
+			}
+		},
+		{
+			"id": 4,
+			"type": "tabitem",
+			"props": {
+				"label": "X-ray",
+				"visible": true
+			}
+		},
+		{
+			"id": 5,
+			"type": "row",
+			"props": {
+				"type": "row",
+				"variant": "default",
+				"equal_height": true,
+				"visible": true
+			}
+		},
+		{
+			"id": 6,
+			"type": "image",
+			"props": {
+				"image_mode": "RGB",
+				"source": "upload",
+				"tool": "editor",
+				"streaming": false,
+				"mirror_webcam": true,
+				"brush_color": "#000000",
+				"mask_opacity": 0.7,
+				"selectable": false,
+				"show_share_button": false,
+				"show_download_button": true,
+				"show_label": true,
+				"container": true,
+				"min_width": 160,
+				"name": "image",
+				"visible": true
+			},
+			"serializer": "ImgSerializable",
+			"api_info": {
+				"info": {
+					"type": "string",
+					"description": "base64 representation of an image"
+				},
+				"serialized_info": true
+			},
+			"example_inputs": {
+				"raw": "data:image/png;base64,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",
+				"serialized": "https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png"
+			}
+		},
+		{
+			"id": 7,
+			"type": "json",
+			"props": {
+				"show_label": true,
+				"container": true,
+				"min_width": 160,
+				"name": "json",
+				"visible": true
+			},
+			"serializer": "JSONSerializable",
+			"api_info": {
+				"info": {
+					"type": {},
+					"description": "any valid json"
+				},
+				"serialized_info": true
+			},
+			"example_inputs": {
+				"raw": {
+					"a": 1,
+					"b": 2
+				},
+				"serialized": null
+			}
+		},
+		{
+			"id": 8,
+			"type": "button",
+			"props": {
+				"value": "Run",
+				"variant": "secondary",
+				"interactive": true,
+				"name": "button",
+				"visible": true
+			},
+			"serializer": "StringSerializable",
+			"api_info": {
+				"info": {
+					"type": "string"
+				},
+				"serialized_info": false
+			},
+			"example_inputs": {
+				"raw": "Howdy!",
+				"serialized": "Howdy!"
+			}
+		},
+		{
+			"id": 9,
+			"type": "tabitem",
+			"props": {
+				"label": "CT Scan",
+				"visible": true
+			}
+		},
+		{
+			"id": 10,
+			"type": "row",
+			"props": {
+				"type": "row",
+				"variant": "default",
+				"equal_height": true,
+				"visible": true
+			}
+		},
+		{
+			"id": 11,
+			"type": "image",
+			"props": {
+				"image_mode": "RGB",
+				"source": "upload",
+				"tool": "editor",
+				"streaming": false,
+				"mirror_webcam": true,
+				"brush_color": "#000000",
+				"mask_opacity": 0.7,
+				"selectable": false,
+				"show_share_button": false,
+				"show_download_button": true,
+				"show_label": true,
+				"container": true,
+				"min_width": 160,
+				"name": "image",
+				"visible": true
+			},
+			"serializer": "ImgSerializable",
+			"api_info": {
+				"info": {
+					"type": "string",
+					"description": "base64 representation of an image"
+				},
+				"serialized_info": true
+			},
+			"example_inputs": {
+				"raw": "data:image/png;base64,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",
+				"serialized": "https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png"
+			}
+		},
+		{
+			"id": 12,
+			"type": "json",
+			"props": {
+				"show_label": true,
+				"container": true,
+				"min_width": 160,
+				"name": "json",
+				"visible": true
+			},
+			"serializer": "JSONSerializable",
+			"api_info": {
+				"info": {
+					"type": {},
+					"description": "any valid json"
+				},
+				"serialized_info": true
+			},
+			"example_inputs": {
+				"raw": {
+					"a": 1,
+					"b": 2
+				},
+				"serialized": null
+			}
+		},
+		{
+			"id": 13,
+			"type": "button",
+			"props": {
+				"value": "Run",
+				"variant": "secondary",
+				"interactive": true,
+				"name": "button",
+				"visible": true
+			},
+			"serializer": "StringSerializable",
+			"api_info": {
+				"info": {
+					"type": "string"
+				},
+				"serialized_info": false
+			},
+			"example_inputs": {
+				"raw": "Howdy!",
+				"serialized": "Howdy!"
+			}
+		},
+		{
+			"id": 14,
+			"type": "textbox",
+			"props": {
+				"lines": 1,
+				"max_lines": 20,
+				"value": "",
+				"type": "text",
+				"autofocus": false,
+				"show_copy_button": false,
+				"container": true,
+				"rtl": false,
+				"show_label": true,
+				"min_width": 160,
+				"name": "textbox",
+				"visible": true
+			},
+			"serializer": "StringSerializable",
+			"api_info": {
+				"info": {
+					"type": "string"
+				},
+				"serialized_info": false
+			},
+			"example_inputs": {
+				"raw": "Howdy!",
+				"serialized": "Howdy!"
+			}
+		},
+		{
+			"id": 15,
+			"type": "form",
+			"props": {
+				"type": "form",
+				"scale": 0,
+				"min_width": 0,
+				"visible": true
+			}
+		},
+		{
+			"id": 16,
+			"type": "form",
+			"props": {
+				"type": "form",
+				"scale": 0,
+				"min_width": 0,
+				"visible": true
+			}
+		},
+		{
+			"id": 118,
+			"type": "textbox",
+			"props": {
+				"lines": 1,
+				"max_lines": 20,
+				"value": "",
+				"type": "text",
+				"autofocus": false,
+				"show_copy_button": false,
+				"container": true,
+				"rtl": false,
+				"show_label": true,
+				"min_width": 160,
+				"name": "textbox",
+				"visible": true
+			},
+			"serializer": "StringSerializable",
+			"api_info": {
+				"info": {
+					"type": "string"
+				},
+				"serialized_info": false
+			},
+			"example_inputs": {
+				"raw": "Howdy!",
+				"serialized": "Howdy!"
+			}
+		},
+		{
+			"id": 119,
+			"type": "form",
+			"props": {
+				"type": "form",
+				"scale": 0,
+				"min_width": 0,
+				"visible": true
+			}
+		}
+	],
+	"css": null,
+	"title": "Gradio",
+	"space_id": null,
+	"enable_queue": null,
+	"show_error": true,
+	"show_api": true,
+	"is_colab": false,
+	"stylesheets": [
+		"https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600&display=swap",
+		"https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&display=swap"
+	],
+	"theme": "default",
+	"layout": {
+		"id": 117,
+		"children": [
+			{
+				"id": 1
+			},
+			{
+				"id": 15,
+				"children": [
+					{
+						"id": 2
+					}
+				]
+			},
+			{
+				"id": 3,
+				"children": [
+					{
+						"id": 4,
+						"children": [
+							{
+								"id": 5,
+								"children": [
+									{
+										"id": 6
+									},
+									{
+										"id": 7
+									}
+								]
+							},
+							{
+								"id": 8
+							}
+						]
+					},
+					{
+						"id": 9,
+						"children": [
+							{
+								"id": 10,
+								"children": [
+									{
+										"id": 11
+									},
+									{
+										"id": 12
+									}
+								]
+							},
+							{
+								"id": 13
+							}
+						]
+					}
+				]
+			},
+			{
+				"id": 16,
+				"children": [
+					{
+						"id": 14
+					}
+				]
+			},
+			{
+				"id": 119,
+				"children": [
+					{
+						"id": 118
+					}
+				]
+			}
+		]
+	},
+	"dependencies": [
+		{
+			"targets": [8],
+			"trigger": "click",
+			"inputs": [2, 6],
+			"outputs": [7],
+			"backend_fn": true,
+			"js": null,
+			"queue": null,
+			"api_name": null,
+			"scroll_to_output": false,
+			"show_progress": "full",
+			"every": null,
+			"batch": false,
+			"max_batch_size": 4,
+			"cancels": [],
+			"types": {
+				"continuous": false,
+				"generator": false
+			},
+			"collects_event_data": false,
+			"trigger_after": null,
+			"trigger_only_on_success": false
+		},
+		{
+			"targets": [13],
+			"trigger": "click",
+			"inputs": [2, 11],
+			"outputs": [12],
+			"backend_fn": true,
+			"js": null,
+			"queue": null,
+			"api_name": null,
+			"scroll_to_output": false,
+			"show_progress": "full",
+			"every": null,
+			"batch": false,
+			"max_batch_size": 4,
+			"cancels": [],
+			"types": {
+				"continuous": false,
+				"generator": false
+			},
+			"collects_event_data": false,
+			"trigger_after": null,
+			"trigger_only_on_success": false
+		},
+		{
+			"targets": [],
+			"trigger": "load",
+			"inputs": [],
+			"outputs": [118],
+			"backend_fn": true,
+			"js": null,
+			"queue": null,
+			"api_name": null,
+			"scroll_to_output": false,
+			"show_progress": "full",
+			"every": null,
+			"batch": false,
+			"max_batch_size": 4,
+			"cancels": [],
+			"types": {
+				"continuous": false,
+				"generator": false
+			},
+			"collects_event_data": false,
+			"trigger_after": null,
+			"trigger_only_on_success": false
+		}
+	]
+}