diff --git a/Assets/Proxima.meta b/Assets/Proxima.meta
new file mode 100644
index 0000000..f62ed54
--- /dev/null
+++ b/Assets/Proxima.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 80f0b6beae6dbe2439b32c150bb07d47
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/CHANGELOG.md b/Assets/Proxima/CHANGELOG.md
new file mode 100644
index 0000000..7a4fd1e
--- /dev/null
+++ b/Assets/Proxima/CHANGELOG.md
@@ -0,0 +1,71 @@
+# Proxima Changelog
+
+## Version 1.3.1
+
+### Fixes
+
+ - Fix Unity 2023.2 warnings.
+ - Disable start screen in batch mode.
+ - Fix float parsing breaking in some cultures.
+ - Fix serialization of some non-english characters.
+ - Fix serialization of non-int enum types.
+
+## Version 1.3.0
+
+### New Features:
+
+- New inspector buttons to create, destroy, and duplicate GameObjects.
+- New inspector field to add a component to a GameObject.
+
+### Fixes:
+
+- Fix new deprecation warnings on Unity 2023.1
+- Fix compile error on Unity 2021.1 and 2021.2 for ParticleSystemForceField
+- Allow any URL to access proxima to support HTTP tunnels like ngrok
+- Fix an issue where Proxima would displaya no GameObjects if the first scene has no GameObjects.
+- Fix an exception if the browser provides an invalide timestamp.
+- Fix sharedMaterials property sending updates continuously, even when it doesn't change.
+- Fix deep link parameter parsing.
+
+## Version 1.2.1
+
+- Added IP address to connection log.
+- Improve version checking to display start screen.
+- Internal changes to support packaging features separately.
+- Removed stray debug log on viewing the start screen.
+
+## Version 1.2.0
+
+### New Features:
+- **WebGL Support**: You can now open Proxima Inspector from a WebGL build! From the Proxima Connect UI, click "Open in Browser" to open Proxima in a new tab. This implementation uses a BroadcastChannel in the browser to communicate with your app, so Proxima must be running in the same browser as the Unity app.
+- **Serializable Structs and Classes**: You can now view any struct or class marked as [Serializable] in the Proxima Inspector! Nested objects and arrays of objects are fully supported.
+- **ProximaButton Attribute**: Add the [ProximaButton("Button Name")] attribute to MonoBehaviour methods to add a buttons in the Proxima inspector. Instructions at https://www.unityproxima.com/docs/buttons.
+- **Deep Links**: New query parameters can be appended to the Proxima URL:
+  - 'pass' - Automatically connect with the provided password.
+  - 'page' - Navigate to page 'inspector', 'logs', or 'console' after connecting.
+  - 'go' - Select a gameObject by name after connecting.
+  - 's' - Set the search filter on the inspector page.
+  - 'collapsed' - Collapse the navigation menu.
+  - 'run' - Immediately run console command.
+  - For examples, see: https://www.unityproxima.com/docs/deeplinks
+- **Show Hidden Checkbox**: By default, Proxima respects hideFlags for GameObjects and Components. There is a new checkbox on the inspector page to show these hidden objects.
+- **Start Screen**: Added a new start screen where you can view the latest changes, access documentation, and provide feedback.
+
+### Changes and Fixes
+ - Arrays of enums, flags, and layers can now be viewed and edited.
+ - Fixed flag toggling for multi-flag values (e.g., Rigid Body Constraints).
+ - Fixed some missing properties for built-in components.
+
+## Version 1.1.0
+- Added support for non-english characters in gameObject names, logs, etc.
+  - Right-to-left languages are forced to display left-to-right in the browser pages to match Unity's behavior.
+- Add "Run Script" button to run a sequence of commands in the console. See https://www.unityproxima.com/docs/console
+- Added a button to collapse the navigation panel to just icons for smaller screens.
+- Added touch-drag support for modifying numbers and arrays in the proxima inspector.
+- Added an option "Set Run In Background" to Proxima Inspector to have Unity continue running when not in focus while
+  Proxima is running. This is useful if you are connecting to Proxima from a browser on the same device, since the
+  browser will cause Unity to lose focus.
+- Prevent messages from sending when the connection is closed to avoid logged exceptions.
+
+## Version 1.0.0
+ - Initial Release
\ No newline at end of file
diff --git a/Assets/Proxima/CHANGELOG.md.meta b/Assets/Proxima/CHANGELOG.md.meta
new file mode 100644
index 0000000..4719592
--- /dev/null
+++ b/Assets/Proxima/CHANGELOG.md.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 53c7cf36ddcf17b4da75df27231f866e
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation.meta b/Assets/Proxima/Documentation.meta
new file mode 100644
index 0000000..a116ed6
--- /dev/null
+++ b/Assets/Proxima/Documentation.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 40d1e8117a0bdd64e8737ad5997cc26c
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/_app.meta b/Assets/Proxima/Documentation/_app.meta
new file mode 100644
index 0000000..3b8638b
--- /dev/null
+++ b/Assets/Proxima/Documentation/_app.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: fc3ee7de55a7c57498409cbdb52efd97
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/_app/immutable.meta b/Assets/Proxima/Documentation/_app/immutable.meta
new file mode 100644
index 0000000..f478fda
--- /dev/null
+++ b/Assets/Proxima/Documentation/_app/immutable.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e1d8ee7003fc63447989710f28e566f0
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/_app/immutable/assets.meta b/Assets/Proxima/Documentation/_app/immutable/assets.meta
new file mode 100644
index 0000000..edf21d7
--- /dev/null
+++ b/Assets/Proxima/Documentation/_app/immutable/assets.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f34fe087e79999f46afaa980a2e5dbb8
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/_app/immutable/assets/_layout-1f0a7e97.css b/Assets/Proxima/Documentation/_app/immutable/assets/_layout-1f0a7e97.css
new file mode 100644
index 0000000..698fbe2
--- /dev/null
+++ b/Assets/Proxima/Documentation/_app/immutable/assets/_layout-1f0a7e97.css
@@ -0,0 +1 @@
+*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.top-0{top:0px}.right-0{right:0px}.bottom-5{bottom:1.25rem}.right-5{right:1.25rem}.z-20{z-index:20}.m-10{margin:2.5rem}.m-2{margin:.5rem}.m-5{margin:1.25rem}.mt-1{margin-top:.25rem}.mt-\[83px\]{margin-top:83px}.mt-5{margin-top:1.25rem}.mb-4{margin-bottom:1rem}.mt-2{margin-top:.5rem}.mt-16{margin-top:4rem}.mb-10{margin-bottom:2.5rem}.ml-2{margin-left:.5rem}.mt-10{margin-top:2.5rem}.mb-16{margin-bottom:4rem}.ml-5{margin-left:1.25rem}.ml-10{margin-left:2.5rem}.ml-8{margin-left:2rem}.mb-3{margin-bottom:.75rem}.mr-2{margin-right:.5rem}.inline{display:inline}.flex{display:flex}.table{display:table}.contents{display:contents}.hidden{display:none}.h-full{height:100%}.h-\[200px\]{height:200px}.h-0{height:0px}.min-h-screen{min-height:100vh}.min-h-full{min-height:100%}.min-h-0{min-height:0px}.w-full{width:100%}.w-\[150px\]{width:150px}.w-10{width:2.5rem}.w-1\/2{width:50%}.w-\[32px\]{width:32px}.w-\[450px\]{width:450px}.w-\[15px\]{width:15px}.w-\[300px\]{width:300px}.w-\[200px\]{width:200px}.w-\[25px\]{width:25px}.max-w-\[1000px\]{max-width:1000px}.max-w-\[1600px\]{max-width:1600px}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-10{gap:2.5rem}.gap-5{gap:1.25rem}.gap-8{gap:2rem}.gap-6{gap:1.5rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.whitespace-nowrap{white-space:nowrap}.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem}.rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.border-2{border-width:2px}.border{border-width:1px}.border-l-2{border-left-width:2px}.border-b-2{border-bottom-width:2px}.border-r-0{border-right-width:0px}.border-r-2{border-right-width:2px}.border-orange-400{--tw-border-opacity: 1;border-color:rgb(251 146 60 / var(--tw-border-opacity))}.border-green-500{--tw-border-opacity: 1;border-color:rgb(34 197 94 / var(--tw-border-opacity))}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity))}.border-white{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity))}.border-\[\#888\]{--tw-border-opacity: 1;border-color:rgb(136 136 136 / var(--tw-border-opacity))}.border-\[\#21a6f0\]{--tw-border-opacity: 1;border-color:rgb(33 166 240 / var(--tw-border-opacity))}.border-r-orange-400{--tw-border-opacity: 1;border-right-color:rgb(251 146 60 / var(--tw-border-opacity))}.bg-\[\#222\]{--tw-bg-opacity: 1;background-color:rgb(34 34 34 / var(--tw-bg-opacity))}.bg-\[\#111\]{--tw-bg-opacity: 1;background-color:rgb(17 17 17 / var(--tw-bg-opacity))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity))}.bg-\[\#1d1d1d\]{--tw-bg-opacity: 1;background-color:rgb(29 29 29 / var(--tw-bg-opacity))}.bg-blue-900{--tw-bg-opacity: 1;background-color:rgb(30 58 138 / var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity))}.bg-\[\#1D1D1D\]{--tw-bg-opacity: 1;background-color:rgb(29 29 29 / var(--tw-bg-opacity))}.bg-green-800{--tw-bg-opacity: 1;background-color:rgb(22 101 52 / var(--tw-bg-opacity))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-green-900{--tw-gradient-from: #14532d;--tw-gradient-to: rgb(20 83 45 / 0);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-blue-900{--tw-gradient-from: #1e3a8a;--tw-gradient-to: rgb(30 58 138 / 0);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-orange-900{--tw-gradient-from: #7c2d12;--tw-gradient-to: rgb(124 45 18 / 0);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-yellow-900{--tw-gradient-from: #713f12;--tw-gradient-to: rgb(113 63 18 / 0);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-\[\#00000033\]{--tw-gradient-to: #00000033}.to-blue-700{--tw-gradient-to: #1d4ed8}.to-orange-700{--tw-gradient-to: #c2410c}.to-green-700{--tw-gradient-to: #15803d}.to-yellow-700{--tw-gradient-to: #a16207}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-8{padding-left:2rem;padding-right:2rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.py-7{padding-top:1.75rem;padding-bottom:1.75rem}.py-16{padding-top:4rem;padding-bottom:4rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.pb-2{padding-bottom:.5rem}.pt-\[83px\]{padding-top:83px}.pb-\[56\.25\%\]{padding-bottom:56.25%}.pt-5{padding-top:1.25rem}.pt-10{padding-top:2.5rem}.text-left{text-align:left}.text-center{text-align:center}.font-logo{font-family:Varela Round}.font-body{font-family:Lato}.font-mono{font-family:monospace}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.font-semibold{font-weight:600}.font-bold{font-weight:700}.leading-normal{line-height:1.5}.leading-loose{line-height:2}.leading-10{line-height:2.5rem}.leading-8{line-height:2rem}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity))}.text-orange-400{--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity))}.text-zinc-300{--tw-text-opacity: 1;color:rgb(212 212 216 / var(--tw-text-opacity))}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity))}.text-blue-300{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity))}.text-yellow-200{--tw-text-opacity: 1;color:rgb(254 240 138 / var(--tw-text-opacity))}.text-zinc-100{--tw-text-opacity: 1;color:rgb(244 244 245 / var(--tw-text-opacity))}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity))}.text-pink-500{--tw-text-opacity: 1;color:rgb(236 72 153 / var(--tw-text-opacity))}.underline{text-decoration-line:underline}.placeholder-\[\#555\]::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(85 85 85 / var(--tw-placeholder-opacity))}.placeholder-\[\#555\]::placeholder{--tw-placeholder-opacity: 1;color:rgb(85 85 85 / var(--tw-placeholder-opacity))}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-black{--tw-shadow-color: #000;--tw-shadow: var(--tw-shadow-colored)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-green-700{--tw-ring-opacity: 1;--tw-ring-color: rgb(21 128 61 / var(--tw-ring-opacity))}.ring-blue-600{--tw-ring-opacity: 1;--tw-ring-color: rgb(37 99 235 / var(--tw-ring-opacity))}.ring-offset-2{--tw-ring-offset-width: 2px}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}@font-face{font-family:Lato;font-style:normal;font-weight:400;font-display:swap;src:url(../../../fonts/S6uyw4BMUTPHjxAwXjeu.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Lato;font-style:normal;font-weight:400;font-display:swap;src:url(../../../fonts/S6uyw4BMUTPHjx4wXg.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Varela Round;font-style:normal;font-weight:400;font-display:swap;src:url(../../../fonts/w8gdH283Tvk__Lua32TysjIfpcuPP9g.woff2) format("woff2");unicode-range:U+0590-05FF,U+200C-2010,U+20AA,U+25CC,U+FB1D-FB4F}@font-face{font-family:Varela Round;font-style:normal;font-weight:400;font-display:swap;src:url(../../../fonts/w8gdH283Tvk__Lua32TysjIfqMuPP9g.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Varela Round;font-style:normal;font-weight:400;font-display:swap;src:url(../../../fonts/w8gdH283Tvk__Lua32TysjIfqcuPP9g.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Varela Round;font-style:normal;font-weight:400;font-display:swap;src:url(../../../fonts/w8gdH283Tvk__Lua32TysjIfp8uP.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}html{scroll-padding-top:130px}.offline_show{display:none}.hover\:bg-green-700:hover{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity))}.hover\:bg-blue-600:hover{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity))}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity))}.hover\:underline:hover{text-decoration-line:underline}@media not all and (min-width: 1024px){.max-lg\:hidden{display:none}.max-lg\:flex-wrap{flex-wrap:wrap}.max-lg\:px-5{padding-left:1.25rem;padding-right:1.25rem}}@media not all and (min-width: 640px){.max-sm\:hidden{display:none}}@media (min-width: 640px){.sm\:px-5{padding-left:1.25rem;padding-right:1.25rem}}@media (min-width: 1024px){.lg\:mt-\[2vh\]{margin-top:2vh}.lg\:ml-\[300px\]{margin-left:300px}.lg\:hidden{display:none}.lg\:gap-\[2vh\]{gap:2vh}.lg\:pt-\[2vh\]{padding-top:2vh}.lg\:pl-10{padding-left:2.5rem}.lg\:text-5xl{font-size:3rem;line-height:1}.lg\:text-xl{font-size:1.25rem;line-height:1.75rem}}
diff --git a/Assets/Proxima/Documentation/_app/immutable/assets/_layout-1f0a7e97.css.meta b/Assets/Proxima/Documentation/_app/immutable/assets/_layout-1f0a7e97.css.meta
new file mode 100644
index 0000000..b4b6efe
--- /dev/null
+++ b/Assets/Proxima/Documentation/_app/immutable/assets/_layout-1f0a7e97.css.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: a11d997695a4c49a7b11e4aac0452e57
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/_app/immutable/assets/_layout-6847360b.css b/Assets/Proxima/Documentation/_app/immutable/assets/_layout-6847360b.css
new file mode 100644
index 0000000..cb0b004
--- /dev/null
+++ b/Assets/Proxima/Documentation/_app/immutable/assets/_layout-6847360b.css
@@ -0,0 +1 @@
+a.svelte-yue6wq{color:#c5c5cf}a.svelte-yue6wq:hover{color:#fff}.doc.svelte-yue6wq{color:#c5c5cf}.doc.svelte-yue6wq a{text-decoration:underline;color:#fb923c}.doc.svelte-yue6wq a:hover{color:#fff}.doc.svelte-yue6wq td{border:1px solid white;padding:10px;min-width:150px}.doc.svelte-yue6wq img{align-self:flex-start}.doc.svelte-yue6wq video{align-self:flex-start}.doc.svelte-yue6wq h1{color:#fff;font-size:1.875rem;line-height:2.25rem;font-weight:600}.doc.svelte-yue6wq h2{color:#fff;font-size:1.25rem;line-height:1.75rem;font-weight:600;margin-top:2rem}
diff --git a/Assets/Proxima/Documentation/_app/immutable/assets/_layout-6847360b.css.meta b/Assets/Proxima/Documentation/_app/immutable/assets/_layout-6847360b.css.meta
new file mode 100644
index 0000000..018713b
--- /dev/null
+++ b/Assets/Proxima/Documentation/_app/immutable/assets/_layout-6847360b.css.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: b5e0ef40ebe73442bb08e542d48be87e
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs.html b/Assets/Proxima/Documentation/docs.html
new file mode 100644
index 0000000..2f33fea
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs.html
@@ -0,0 +1,101 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>Proxima Inspector</title>
+		<link rel="icon" href="./icons/favicon.ico" />
+		<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1">
+		<meta property="og:type" content="website">
+		<meta name="description" property="og:description" content="Proxima Inspector lets you connect to your live game from a web browser to inspect and edit any property. Just like the Unity editor!">
+		<meta name="image" property="og:image" content="./images/proxima-1200x630.png">
+		<meta http-equiv="content-security-policy" content="">
+		<link href="./_app/immutable/assets/_layout-1f0a7e97.css" rel="stylesheet">
+		<link href="./_app/immutable/assets/_layout-6847360b.css" rel="stylesheet">
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	</head>
+	<body>
+		<div>
+
+
+<div class="flex flex-col items-center text-gray-300 w-full min-h-screen bg-[#222]"><div class="flex w-full justify-center items-start bg-[#111] text-white fixed z-20"><div class="flex grow justify-between items-center max-w-[1600px] p-4"><a href="https://www.unityproxima.com"><img src="./images/proxima_logo.png" class="w-[150px]" alt="Logo"></a>
+            <button class="lg:hidden"><img class="w-10" src="./icons/menu.png" alt="Menu"></button>
+            <div class="flex gap-10 items-center max-lg:hidden">
+<a href="https://assetstore.unity.com/publishers/72095?aid=1101lqSYn" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Store</a>
+                
+<a href="https://app.unityproxima.com/connection" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Demo</a>
+                
+                <a class="text-xl font-logo" href="./docs.html">Docs</a>
+                
+<a href="https://discord.gg/VM9cWJ9rjH" class="" referrerpolicy="origin" target="_blank" rel="external"><img width="100px" class="mt-1" src="./icons/discord.png" alt=""></a></div></div>
+        </div>
+
+    <div class="pt-[83px] w-full h-full flex flex-col items-center"><div class="w-full flex flex-col items-start min-h-screen max-w-[1600px] px-4"><button class="text-white font-body pt-5 lg:hidden">Go to page &gt;</button>
+    <div class="flex w-full min-h-full relative"><div class="h-full fixed border-r-orange-400 bg-[#222] border-r-2 max-lg:hidden"><div class="flex pt-10 flex-col w-[300px] gap-2 border-[#21a6f0] min-h-0 h-full overflow-auto"><b class="text-orange-400">Getting Started</b>
+                <a href="./docs.html" class="svelte-yue6wq">Installation</a>
+                <a href="./docs/features.html" class="svelte-yue6wq">Feature Overview</a>
+
+                <b class="text-orange-400 mt-5">Connection</b>
+                <a href="./docs/supported_platforms.html" class="svelte-yue6wq">Supported Platforms</a>
+                <a href="./docs/connect.html" class="svelte-yue6wq">Connect to Your Game</a>
+                <a href="./docs/security.html" class="svelte-yue6wq">Security Considerations</a>
+                <a href="./docs/all_config.html" class="svelte-yue6wq">All Configuration Options</a>
+
+                <b class="text-orange-400 mt-5">Inspector</b>
+                <a href="./docs/inspector.html" class="svelte-yue6wq">GameObject Inspector</a>
+                <a href="./docs/buttons.html" class="svelte-yue6wq">Adding Buttons</a>
+                <a href="./docs/faq.html" class="svelte-yue6wq">Frequently Asked Questions</a>
+
+                <b class="text-orange-400 mt-5">Logs</b>
+                <a href="./docs/logs.html" class="svelte-yue6wq">Log Viewer</a>
+                <a href="./docs/viewing_logs_offline.html" class="svelte-yue6wq">Viewing Logs Offline</a>
+
+                <b class="text-orange-400 mt-5">Console</b>
+                <a href="./docs/console.html" class="svelte-yue6wq">Console Window</a>
+                <a href="./docs/console_built_in.html" class="svelte-yue6wq">Built-in Commands</a>
+                <a href="./docs/console_custom.html" class="svelte-yue6wq">Custom Commands</a>
+
+                <b class="text-orange-400 mt-5">Extras</b>
+                <a href="./docs/deeplinks.html" class="svelte-yue6wq">Deep Links</a>
+
+                <div class="h-[200px] shrink-0"></div></div></div>
+
+        
+        <div class="flex flex-col w-full lg:pl-10 py-10 lg:ml-[300px]"><div class="doc flex flex-col gap-5 svelte-yue6wq"><h1>Welcome to Proxima Inspector!</h1>
+
+Proxima Inspector lets you connect to your Unity game using a web browser to view game objects, logs, and more.
+Proxima setup is easy, just follow these steps.
+
+<h2>Installation</h2>
+
+<ul class="list-decimal ml-10 leading-8"><li>Import the Proxima package to your project from the Unity Asset Store.
+        <a href="https://docs.unity3d.com/Manual/upm-ui-import.html" target="_blank" rel="noreferrer">How do I import an asset store package?
+        </a></li>
+    <li>Add an empty GameObject to your scene and add a <b>Proxima Inspector</b> component to it.</li>
+    <li>Enter a display name (optional).</li>
+    <li>Enter a super secret password (required).</li></ul>
+
+<p class="ml-5">Your component should now look like this:</p>
+<img src="./docs/basic-config.png" alt="Proxima Component Configuration">
+
+<p class="ml-5">5. Play your game in editor and navigate to http://127.0.0.1:7759. You should see Proxima Inspector pop up.</p>
+
+<img src="./docs/connect.png" alt="Proxima Connect Page">
+
+<p class="ml-5">6. Click <b>Connect</b> and enter your password. Now you can get familiar with <a href="./docs/features.html">Proxima&#39;s features</a> while connected to the editor.<br><br>When you&#39;re ready, learn how to <a href="./docs/connect.html">connect to your built game</a>.</p></div></div></div>
+</div>
+        <div class="h-[200px] flex flex-col"><p class="text-gray-400 m-10">© 2023 Virtual Maker Corporation</p></div></div></div>
+
+
+		
+	</div>
+	</body>
+</html>
diff --git a/Assets/Proxima/Documentation/docs.html.meta b/Assets/Proxima/Documentation/docs.html.meta
new file mode 100644
index 0000000..645dd93
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: b45089c0bd97cbb40ae999c94216a444
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs.meta b/Assets/Proxima/Documentation/docs.meta
new file mode 100644
index 0000000..20e3195
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 0076d36c6476caf4181b16aaad6edbba
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/all_config.html b/Assets/Proxima/Documentation/docs/all_config.html
new file mode 100644
index 0000000..5e95ce3
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/all_config.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>Proxima Inspector</title>
+		<link rel="icon" href="../icons/favicon.ico" />
+		<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1">
+		<meta property="og:type" content="website">
+		<meta name="description" property="og:description" content="Proxima Inspector lets you connect to your live game from a web browser to inspect and edit any property. Just like the Unity editor!">
+		<meta name="image" property="og:image" content="../images/proxima-1200x630.png">
+		<meta http-equiv="content-security-policy" content="">
+		<link href="../_app/immutable/assets/_layout-1f0a7e97.css" rel="stylesheet">
+		<link href="../_app/immutable/assets/_layout-6847360b.css" rel="stylesheet">
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	</head>
+	<body>
+		<div>
+
+
+<div class="flex flex-col items-center text-gray-300 w-full min-h-screen bg-[#222]"><div class="flex w-full justify-center items-start bg-[#111] text-white fixed z-20"><div class="flex grow justify-between items-center max-w-[1600px] p-4"><a href="https://www.unityproxima.com"><img src="../images/proxima_logo.png" class="w-[150px]" alt="Logo"></a>
+            <button class="lg:hidden"><img class="w-10" src="../icons/menu.png" alt="Menu"></button>
+            <div class="flex gap-10 items-center max-lg:hidden">
+<a href="https://assetstore.unity.com/publishers/72095?aid=1101lqSYn" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Store</a>
+                
+<a href="https://app.unityproxima.com/connection" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Demo</a>
+                
+                <a class="text-xl font-logo" href="../docs.html">Docs</a>
+                
+<a href="https://discord.gg/VM9cWJ9rjH" class="" referrerpolicy="origin" target="_blank" rel="external"><img width="100px" class="mt-1" src="../icons/discord.png" alt=""></a></div></div>
+        </div>
+
+    <div class="pt-[83px] w-full h-full flex flex-col items-center"><div class="w-full flex flex-col items-start min-h-screen max-w-[1600px] px-4"><button class="text-white font-body pt-5 lg:hidden">Go to page &gt;</button>
+    <div class="flex w-full min-h-full relative"><div class="h-full fixed border-r-orange-400 bg-[#222] border-r-2 max-lg:hidden"><div class="flex pt-10 flex-col w-[300px] gap-2 border-[#21a6f0] min-h-0 h-full overflow-auto"><b class="text-orange-400">Getting Started</b>
+                <a href="../docs.html" class="svelte-yue6wq">Installation</a>
+                <a href="../docs/features.html" class="svelte-yue6wq">Feature Overview</a>
+
+                <b class="text-orange-400 mt-5">Connection</b>
+                <a href="../docs/supported_platforms.html" class="svelte-yue6wq">Supported Platforms</a>
+                <a href="../docs/connect.html" class="svelte-yue6wq">Connect to Your Game</a>
+                <a href="../docs/security.html" class="svelte-yue6wq">Security Considerations</a>
+                <a href="../docs/all_config.html" class="svelte-yue6wq">All Configuration Options</a>
+
+                <b class="text-orange-400 mt-5">Inspector</b>
+                <a href="../docs/inspector.html" class="svelte-yue6wq">GameObject Inspector</a>
+                <a href="../docs/buttons.html" class="svelte-yue6wq">Adding Buttons</a>
+                <a href="../docs/faq.html" class="svelte-yue6wq">Frequently Asked Questions</a>
+
+                <b class="text-orange-400 mt-5">Logs</b>
+                <a href="../docs/logs.html" class="svelte-yue6wq">Log Viewer</a>
+                <a href="../docs/viewing_logs_offline.html" class="svelte-yue6wq">Viewing Logs Offline</a>
+
+                <b class="text-orange-400 mt-5">Console</b>
+                <a href="../docs/console.html" class="svelte-yue6wq">Console Window</a>
+                <a href="../docs/console_built_in.html" class="svelte-yue6wq">Built-in Commands</a>
+                <a href="../docs/console_custom.html" class="svelte-yue6wq">Custom Commands</a>
+
+                <b class="text-orange-400 mt-5">Extras</b>
+                <a href="../docs/deeplinks.html" class="svelte-yue6wq">Deep Links</a>
+
+                <div class="h-[200px] shrink-0"></div></div></div>
+
+        
+        <div class="flex flex-col w-full lg:pl-10 py-10 lg:ml-[300px]"><div class="doc flex flex-col gap-5 svelte-yue6wq"><h1 class="mb-10">All Configuration Options</h1>
+
+<img src="../docs/secure-config.png" alt="Proxima Secure Configuration">
+
+<table class="bg-[#1D1D1D] mt-10"><tr><td class="whitespace-nowrap text-white"><b>Property</b></td>
+        <td class="text-white"><b>Description</b></td></tr>
+    <tr><td class="whitespace-nowrap text-white">Display Name</td>
+        <td>The name displayed to show in the browser when connected</td></tr>
+    <tr><td class="whitespace-nowrap text-white">Port</td>
+        <td>The port number to host the embedded Proxima server. Not used in WebGL builds.</td></tr>
+    <tr><td class="whitespace-nowrap text-white">Password</td>
+        <td>The password required to connect to Proxima. See <a href="../docs/security.html">the security docs</a>.</td></tr>
+    <tr><td class="whitespace-nowrap text-white">Use Https</td>
+        <td>Enables and disables HTTPS for encryption. See <a href="../docs/security.html">the security docs</a>. Not used in WebGL builds.</td></tr>
+    <tr><td class="whitespace-nowrap text-white">Certificate</td>
+        <td>Optional TLS certificate. By default, Proxima uses Proxima/Resources/Proxima/ProximaEmbeddedCert.pfx. See <a href="../docs/security.html">the security docs</a>. Not used in WebGL builds.</td></tr>
+    <tr><td class="whitespace-nowrap text-white">Certificate Password</td>
+        <td>Password for the TLS certificate. Not used in WebGL builds.</td></tr>
+    <tr><td class="whitespace-nowrap text-white">Run On Enable</td>
+        <td>Automatically starts the Proxima server when this component is enabled.</td></tr>
+    <tr><td class="whitespace-nowrap text-white">Log Buffer Size</td>
+        <td>Maximum number of log messages to keep in memory. See <a href="../docs/logs.html">the logs docs</a>.</td></tr>
+    <tr><td class="whitespace-nowrap text-white">Instantiate Status UI</td>
+        <td>Instantiates Proxima/Resources/Proxima/ProximaStatusUI.prefab on startup. This UI lets you see the current status of Proxima at the bottom of your screen.</td></tr>
+    <tr><td class="whitespace-nowrap text-white">Instantiate Connect UI</td>
+        <td>Instantiates Proxima/Resources/Proxima/ProximaConnectUI.prefab on startup. This UI appears when the user presses F2 and allows the user to start and stop the server with a display name and password.</td></tr>
+    <tr><td class="whitespace-nowrap text-white">Dont Destroy On Load</td>
+        <td>Adds the gameObject with the Proxima Inspector to the DontDestroyOnLoad scene, which keeps connections alive when transitioning between scenes.</td></tr>
+    <tr><td class="whitespace-nowrap text-white">Set Run In Background</td>
+        <td>When Proxima starts, sets Application.runInBackground to true. When Proxima stops,
+            sets Application.runInBackground back to its previous value. This allows Proxima
+            to work when connecting from a browser on the same device, since otherwise Unity
+            will pause the app when focus is set to the browser.</td></tr></table></div></div></div>
+</div>
+        <div class="h-[200px] flex flex-col"><p class="text-gray-400 m-10">© 2023 Virtual Maker Corporation</p></div></div></div>
+
+
+		
+	</div>
+	</body>
+</html>
diff --git a/Assets/Proxima/Documentation/docs/all_config.html.meta b/Assets/Proxima/Documentation/docs/all_config.html.meta
new file mode 100644
index 0000000..ad963fa
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/all_config.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: deed7884a12e5b546acaba45aed60ea1
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/basic-config.png b/Assets/Proxima/Documentation/docs/basic-config.png
new file mode 100644
index 0000000..9b2cfeb
Binary files /dev/null and b/Assets/Proxima/Documentation/docs/basic-config.png differ
diff --git a/Assets/Proxima/Documentation/docs/basic-config.png.meta b/Assets/Proxima/Documentation/docs/basic-config.png.meta
new file mode 100644
index 0000000..2ae9941
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/basic-config.png.meta
@@ -0,0 +1,98 @@
+fileFormatVersion: 2
+guid: b9e1c30cb177425438b06dabf64f44a7
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/browser_warning.png b/Assets/Proxima/Documentation/docs/browser_warning.png
new file mode 100644
index 0000000..70b8de2
Binary files /dev/null and b/Assets/Proxima/Documentation/docs/browser_warning.png differ
diff --git a/Assets/Proxima/Documentation/docs/browser_warning.png.meta b/Assets/Proxima/Documentation/docs/browser_warning.png.meta
new file mode 100644
index 0000000..d8a078a
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/browser_warning.png.meta
@@ -0,0 +1,98 @@
+fileFormatVersion: 2
+guid: 128d6655c9b7beb409e7ff62fe4617c9
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/buttons.html b/Assets/Proxima/Documentation/docs/buttons.html
new file mode 100644
index 0000000..9ad1714
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/buttons.html
@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>Proxima Inspector</title>
+		<link rel="icon" href="../icons/favicon.ico" />
+		<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1">
+		<meta property="og:type" content="website">
+		<meta name="description" property="og:description" content="Proxima Inspector lets you connect to your live game from a web browser to inspect and edit any property. Just like the Unity editor!">
+		<meta name="image" property="og:image" content="../images/proxima-1200x630.png">
+		<meta http-equiv="content-security-policy" content="">
+		<link href="../_app/immutable/assets/_layout-1f0a7e97.css" rel="stylesheet">
+		<link href="../_app/immutable/assets/_layout-6847360b.css" rel="stylesheet">
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	</head>
+	<body>
+		<div>
+
+
+<div class="flex flex-col items-center text-gray-300 w-full min-h-screen bg-[#222]"><div class="flex w-full justify-center items-start bg-[#111] text-white fixed z-20"><div class="flex grow justify-between items-center max-w-[1600px] p-4"><a href="https://www.unityproxima.com"><img src="../images/proxima_logo.png" class="w-[150px]" alt="Logo"></a>
+            <button class="lg:hidden"><img class="w-10" src="../icons/menu.png" alt="Menu"></button>
+            <div class="flex gap-10 items-center max-lg:hidden">
+<a href="https://assetstore.unity.com/publishers/72095?aid=1101lqSYn" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Store</a>
+                
+<a href="https://app.unityproxima.com/connection" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Demo</a>
+                
+                <a class="text-xl font-logo" href="../docs.html">Docs</a>
+                
+<a href="https://discord.gg/VM9cWJ9rjH" class="" referrerpolicy="origin" target="_blank" rel="external"><img width="100px" class="mt-1" src="../icons/discord.png" alt=""></a></div></div>
+        </div>
+
+    <div class="pt-[83px] w-full h-full flex flex-col items-center"><div class="w-full flex flex-col items-start min-h-screen max-w-[1600px] px-4"><button class="text-white font-body pt-5 lg:hidden">Go to page &gt;</button>
+    <div class="flex w-full min-h-full relative"><div class="h-full fixed border-r-orange-400 bg-[#222] border-r-2 max-lg:hidden"><div class="flex pt-10 flex-col w-[300px] gap-2 border-[#21a6f0] min-h-0 h-full overflow-auto"><b class="text-orange-400">Getting Started</b>
+                <a href="../docs.html" class="svelte-yue6wq">Installation</a>
+                <a href="../docs/features.html" class="svelte-yue6wq">Feature Overview</a>
+
+                <b class="text-orange-400 mt-5">Connection</b>
+                <a href="../docs/supported_platforms.html" class="svelte-yue6wq">Supported Platforms</a>
+                <a href="../docs/connect.html" class="svelte-yue6wq">Connect to Your Game</a>
+                <a href="../docs/security.html" class="svelte-yue6wq">Security Considerations</a>
+                <a href="../docs/all_config.html" class="svelte-yue6wq">All Configuration Options</a>
+
+                <b class="text-orange-400 mt-5">Inspector</b>
+                <a href="../docs/inspector.html" class="svelte-yue6wq">GameObject Inspector</a>
+                <a href="../docs/buttons.html" class="svelte-yue6wq">Adding Buttons</a>
+                <a href="../docs/faq.html" class="svelte-yue6wq">Frequently Asked Questions</a>
+
+                <b class="text-orange-400 mt-5">Logs</b>
+                <a href="../docs/logs.html" class="svelte-yue6wq">Log Viewer</a>
+                <a href="../docs/viewing_logs_offline.html" class="svelte-yue6wq">Viewing Logs Offline</a>
+
+                <b class="text-orange-400 mt-5">Console</b>
+                <a href="../docs/console.html" class="svelte-yue6wq">Console Window</a>
+                <a href="../docs/console_built_in.html" class="svelte-yue6wq">Built-in Commands</a>
+                <a href="../docs/console_custom.html" class="svelte-yue6wq">Custom Commands</a>
+
+                <b class="text-orange-400 mt-5">Extras</b>
+                <a href="../docs/deeplinks.html" class="svelte-yue6wq">Deep Links</a>
+
+                <div class="h-[200px] shrink-0"></div></div></div>
+
+        
+        <div class="flex flex-col w-full lg:pl-10 py-10 lg:ml-[300px]"><div class="doc flex flex-col gap-5 svelte-yue6wq"><h1>Inspector Buttons</h1>
+
+<p>You can add buttons to your components that appear in the inspector and perform some action.</p>
+
+<video muted autoplay loop playsinline><source src="https://www.unityproxima.com/docs/buttons.mp4"></video>
+
+<h2>How to add a button</h2>
+
+<ul class="list-disc ml-8"><li>Create a method in your MonoBehaviour. It cannot be static.</li>
+    <li>Add the ProximaButton attribute, with the text that you want to appear.</li>
+    <li>Buttons will appear in order at the top of the component in the inspector.</li></ul>
+
+<div class="bg-[#1d1d1d] p-3 text-zinc-300 font-mono">[<span class="text-green-400">ProximaButton</span>(<span class="text-orange-400">&quot;Toggle Spin&quot;</span>)]<br>
+    <span class="text-blue-300">void</span> <span class="text-yellow-200">Toggle</span>()<br>
+    {<br>
+       <span class="text-blue-300">    _spin</span> = !<span class="text-blue-300">_spin</span>;<br>
+    }<br></div></div></div></div>
+</div>
+        <div class="h-[200px] flex flex-col"><p class="text-gray-400 m-10">© 2023 Virtual Maker Corporation</p></div></div></div>
+
+
+		
+	</div>
+	</body>
+</html>
diff --git a/Assets/Proxima/Documentation/docs/buttons.html.meta b/Assets/Proxima/Documentation/docs/buttons.html.meta
new file mode 100644
index 0000000..84cafa1
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/buttons.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 0ed34a30d500b449bb09bf8c165734d0
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/connect-ui.png b/Assets/Proxima/Documentation/docs/connect-ui.png
new file mode 100644
index 0000000..2918c58
Binary files /dev/null and b/Assets/Proxima/Documentation/docs/connect-ui.png differ
diff --git a/Assets/Proxima/Documentation/docs/connect-ui.png.meta b/Assets/Proxima/Documentation/docs/connect-ui.png.meta
new file mode 100644
index 0000000..958a393
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/connect-ui.png.meta
@@ -0,0 +1,98 @@
+fileFormatVersion: 2
+guid: ff21eba6381d51342b8e45ea028b8561
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/connect.html b/Assets/Proxima/Documentation/docs/connect.html
new file mode 100644
index 0000000..51fc374
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/connect.html
@@ -0,0 +1,125 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>Proxima Inspector</title>
+		<link rel="icon" href="../icons/favicon.ico" />
+		<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1">
+		<meta property="og:type" content="website">
+		<meta name="description" property="og:description" content="Proxima Inspector lets you connect to your live game from a web browser to inspect and edit any property. Just like the Unity editor!">
+		<meta name="image" property="og:image" content="../images/proxima-1200x630.png">
+		<meta http-equiv="content-security-policy" content="">
+		<link href="../_app/immutable/assets/_layout-1f0a7e97.css" rel="stylesheet">
+		<link href="../_app/immutable/assets/_layout-6847360b.css" rel="stylesheet">
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	</head>
+	<body>
+		<div>
+
+
+<div class="flex flex-col items-center text-gray-300 w-full min-h-screen bg-[#222]"><div class="flex w-full justify-center items-start bg-[#111] text-white fixed z-20"><div class="flex grow justify-between items-center max-w-[1600px] p-4"><a href="https://www.unityproxima.com"><img src="../images/proxima_logo.png" class="w-[150px]" alt="Logo"></a>
+            <button class="lg:hidden"><img class="w-10" src="../icons/menu.png" alt="Menu"></button>
+            <div class="flex gap-10 items-center max-lg:hidden">
+<a href="https://assetstore.unity.com/publishers/72095?aid=1101lqSYn" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Store</a>
+                
+<a href="https://app.unityproxima.com/connection" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Demo</a>
+                
+                <a class="text-xl font-logo" href="../docs.html">Docs</a>
+                
+<a href="https://discord.gg/VM9cWJ9rjH" class="" referrerpolicy="origin" target="_blank" rel="external"><img width="100px" class="mt-1" src="../icons/discord.png" alt=""></a></div></div>
+        </div>
+
+    <div class="pt-[83px] w-full h-full flex flex-col items-center"><div class="w-full flex flex-col items-start min-h-screen max-w-[1600px] px-4"><button class="text-white font-body pt-5 lg:hidden">Go to page &gt;</button>
+    <div class="flex w-full min-h-full relative"><div class="h-full fixed border-r-orange-400 bg-[#222] border-r-2 max-lg:hidden"><div class="flex pt-10 flex-col w-[300px] gap-2 border-[#21a6f0] min-h-0 h-full overflow-auto"><b class="text-orange-400">Getting Started</b>
+                <a href="../docs.html" class="svelte-yue6wq">Installation</a>
+                <a href="../docs/features.html" class="svelte-yue6wq">Feature Overview</a>
+
+                <b class="text-orange-400 mt-5">Connection</b>
+                <a href="../docs/supported_platforms.html" class="svelte-yue6wq">Supported Platforms</a>
+                <a href="../docs/connect.html" class="svelte-yue6wq">Connect to Your Game</a>
+                <a href="../docs/security.html" class="svelte-yue6wq">Security Considerations</a>
+                <a href="../docs/all_config.html" class="svelte-yue6wq">All Configuration Options</a>
+
+                <b class="text-orange-400 mt-5">Inspector</b>
+                <a href="../docs/inspector.html" class="svelte-yue6wq">GameObject Inspector</a>
+                <a href="../docs/buttons.html" class="svelte-yue6wq">Adding Buttons</a>
+                <a href="../docs/faq.html" class="svelte-yue6wq">Frequently Asked Questions</a>
+
+                <b class="text-orange-400 mt-5">Logs</b>
+                <a href="../docs/logs.html" class="svelte-yue6wq">Log Viewer</a>
+                <a href="../docs/viewing_logs_offline.html" class="svelte-yue6wq">Viewing Logs Offline</a>
+
+                <b class="text-orange-400 mt-5">Console</b>
+                <a href="../docs/console.html" class="svelte-yue6wq">Console Window</a>
+                <a href="../docs/console_built_in.html" class="svelte-yue6wq">Built-in Commands</a>
+                <a href="../docs/console_custom.html" class="svelte-yue6wq">Custom Commands</a>
+
+                <b class="text-orange-400 mt-5">Extras</b>
+                <a href="../docs/deeplinks.html" class="svelte-yue6wq">Deep Links</a>
+
+                <div class="h-[200px] shrink-0"></div></div></div>
+
+        
+        <div class="flex flex-col w-full lg:pl-10 py-10 lg:ml-[300px]"><div class="doc flex flex-col gap-5 svelte-yue6wq"><h1>Connect to Your Game</h1>
+
+<h2>Building your Game with Proxima (non-WebGL)</h2>
+
+<ul class="list-decimal ml-5 leading-8"><li>Add an empty GameObject to your scene and add a Proxima Inspector component.</li>
+    <li>Assign a 4 or 5 digit port number that is not already in use on your target device.</li>
+    <li>If you want your connection to be encrypted, <a href="../docs/security.html">enable HTTPS</a>. <b>This is required for Android and iOS.</b></li>
+    <li>Your Proxima Inspector component should look something like this:
+        <img class="p-5" src="../docs/device-config.png" alt="Proxima Component Configuration"></li>
+    <li>Build, deploy, and run your game.</li></ul>
+
+<h2 class="text-zinc-100 text-xl mt-5">Connecting to Your Game (non-WebGL)</h2>
+<ul class="list-decimal ml-5 leading-8"><li>Ensure that both the device running your game and the device running your browser are connected to the same local network.</li>
+    <li>If you&#39;ve enabled the &quot;Instantiate Connect UI&quot;, you can click the Proxima icon and click &quot;Open in Browser&quot;. Otherwise:</li>
+    <li>Navigate to <b>http://[your-ip-address]:[port]</b>. <a href="#ipaddress">How do I find my device&#39;s IP address?</a></li></ul>
+
+<div class="bg-gray-800 p-5 text-zinc-300">If you&#39;ve enabled HTTPS, your browser may warn you that Proxima&#39;s certificate is not trusted. It is ok to bypass this warning if you&#39;re connecting to your device&#39;s IP directly on your local network.
+    See the <a href="../docs/security.html">Security Considerations</a> page for more information.
+</div>
+
+<h2 class="text-zinc-100 text-xl mt-5">Building and Connecting to Your Game (WebGL)</h2>
+<ul class="list-decimal ml-5 leading-8"><li><b>WebGL</b> builds connect directly through a BroadcastChannel in the browser. The port and HTTPS options are not used.</li>
+    <li>This also means you cannot connect to WebGL builds remotely. You must connect in the same browser that is running the game,
+        and you must use the same URL origin.
+    </li>
+    <li>If you&#39;ve enabled the &quot;Instantiate Connect UI&quot;, you can click the Proxima icon and click &quot;Open in Browser&quot;. Otherwise:</li>
+    <li>Navigate to <b>http://your-game-address/path/to/game/<span class="text-yellow-600">StreamingAssets/Proxima/index.html</span></b></li></ul>
+
+<h2 id="ipaddress" class="text-zinc-100 text-xl mt-5">How do I find my device&#39;s IP address?</h2>
+<p>If you checked <b>Instantiate Status UI</b> on the Proxima Inspector component, your device IP will be displayed at the bottom of your game.</p>
+<img src="../docs/status-ui.png" alt="Proxima Status UI">
+<p>Alternatively, you can also find your device&#39;s IP address by:</p>
+<ul class="list-disc ml-10"><li>Windows: In the command line type: <div class="ml-5 text-orange-400 font-mono">ipconfig | findstr /C:&quot;IPv4 Address&quot;</div></li>
+    <li>macOS: In the terminal type: <div class="ml-5 text-orange-400 font-mono">ifconfig getifaddr en0</div></li>
+    <li>Android: Go to &quot;Settings &gt; Wi-Fi Settings &gt; ... &gt; Advanced&quot; and scroll to the bottom.</li>
+    <li>iOS: Go to &quot;Settings &gt; Wi-Fi &gt; Your Wi-Fi&quot; and scroll down.</li></ul>
+
+<h2 class="text-zinc-100 text-xl mt-5">Troubleshooting</h2>
+<p>If you&#39;re unable to connect to Proxima, check the following:</p>
+<ul class="list-disc ml-10"><li>Your game is running (not paused or in the background).</li>
+    <li>Both devices are on the same network.</li>
+    <li>The chosen port is open on the device.</li>
+    <li>Your device&#39;s firewall is not blocking the chosen port.</li>
+    <li>Your router&#39;s firewall is not blocking the chosen port.</li>
+    <li>For WebGL builds, you are using the same browser as the game and the same URL origin.</li></ul></div></div></div>
+</div>
+        <div class="h-[200px] flex flex-col"><p class="text-gray-400 m-10">© 2023 Virtual Maker Corporation</p></div></div></div>
+
+
+		
+	</div>
+	</body>
+</html>
diff --git a/Assets/Proxima/Documentation/docs/connect.html.meta b/Assets/Proxima/Documentation/docs/connect.html.meta
new file mode 100644
index 0000000..715dec5
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/connect.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: e02f0695fb5372343898f4bd4e0bf979
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/connect.png b/Assets/Proxima/Documentation/docs/connect.png
new file mode 100644
index 0000000..dbcbc1e
Binary files /dev/null and b/Assets/Proxima/Documentation/docs/connect.png differ
diff --git a/Assets/Proxima/Documentation/docs/connect.png.meta b/Assets/Proxima/Documentation/docs/connect.png.meta
new file mode 100644
index 0000000..30a9576
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/connect.png.meta
@@ -0,0 +1,98 @@
+fileFormatVersion: 2
+guid: d770431d82d1df24c8c236c81ad3d451
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/console.html b/Assets/Proxima/Documentation/docs/console.html
new file mode 100644
index 0000000..313b180
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/console.html
@@ -0,0 +1,163 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>Proxima Inspector</title>
+		<link rel="icon" href="../icons/favicon.ico" />
+		<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1">
+		<meta property="og:type" content="website">
+		<meta name="description" property="og:description" content="Proxima Inspector lets you connect to your live game from a web browser to inspect and edit any property. Just like the Unity editor!">
+		<meta name="image" property="og:image" content="../images/proxima-1200x630.png">
+		<meta http-equiv="content-security-policy" content="">
+		<link href="../_app/immutable/assets/_layout-1f0a7e97.css" rel="stylesheet">
+		<link href="../_app/immutable/assets/_layout-6847360b.css" rel="stylesheet">
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	</head>
+	<body>
+		<div>
+
+
+<div class="flex flex-col items-center text-gray-300 w-full min-h-screen bg-[#222]"><div class="flex w-full justify-center items-start bg-[#111] text-white fixed z-20"><div class="flex grow justify-between items-center max-w-[1600px] p-4"><a href="https://www.unityproxima.com"><img src="../images/proxima_logo.png" class="w-[150px]" alt="Logo"></a>
+            <button class="lg:hidden"><img class="w-10" src="../icons/menu.png" alt="Menu"></button>
+            <div class="flex gap-10 items-center max-lg:hidden">
+<a href="https://assetstore.unity.com/publishers/72095?aid=1101lqSYn" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Store</a>
+                
+<a href="https://app.unityproxima.com/connection" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Demo</a>
+                
+                <a class="text-xl font-logo" href="../docs.html">Docs</a>
+                
+<a href="https://discord.gg/VM9cWJ9rjH" class="" referrerpolicy="origin" target="_blank" rel="external"><img width="100px" class="mt-1" src="../icons/discord.png" alt=""></a></div></div>
+        </div>
+
+    <div class="pt-[83px] w-full h-full flex flex-col items-center"><div class="w-full flex flex-col items-start min-h-screen max-w-[1600px] px-4"><button class="text-white font-body pt-5 lg:hidden">Go to page &gt;</button>
+    <div class="flex w-full min-h-full relative"><div class="h-full fixed border-r-orange-400 bg-[#222] border-r-2 max-lg:hidden"><div class="flex pt-10 flex-col w-[300px] gap-2 border-[#21a6f0] min-h-0 h-full overflow-auto"><b class="text-orange-400">Getting Started</b>
+                <a href="../docs.html" class="svelte-yue6wq">Installation</a>
+                <a href="../docs/features.html" class="svelte-yue6wq">Feature Overview</a>
+
+                <b class="text-orange-400 mt-5">Connection</b>
+                <a href="../docs/supported_platforms.html" class="svelte-yue6wq">Supported Platforms</a>
+                <a href="../docs/connect.html" class="svelte-yue6wq">Connect to Your Game</a>
+                <a href="../docs/security.html" class="svelte-yue6wq">Security Considerations</a>
+                <a href="../docs/all_config.html" class="svelte-yue6wq">All Configuration Options</a>
+
+                <b class="text-orange-400 mt-5">Inspector</b>
+                <a href="../docs/inspector.html" class="svelte-yue6wq">GameObject Inspector</a>
+                <a href="../docs/buttons.html" class="svelte-yue6wq">Adding Buttons</a>
+                <a href="../docs/faq.html" class="svelte-yue6wq">Frequently Asked Questions</a>
+
+                <b class="text-orange-400 mt-5">Logs</b>
+                <a href="../docs/logs.html" class="svelte-yue6wq">Log Viewer</a>
+                <a href="../docs/viewing_logs_offline.html" class="svelte-yue6wq">Viewing Logs Offline</a>
+
+                <b class="text-orange-400 mt-5">Console</b>
+                <a href="../docs/console.html" class="svelte-yue6wq">Console Window</a>
+                <a href="../docs/console_built_in.html" class="svelte-yue6wq">Built-in Commands</a>
+                <a href="../docs/console_custom.html" class="svelte-yue6wq">Custom Commands</a>
+
+                <b class="text-orange-400 mt-5">Extras</b>
+                <a href="../docs/deeplinks.html" class="svelte-yue6wq">Deep Links</a>
+
+                <div class="h-[200px] shrink-0"></div></div></div>
+
+        
+        <div class="flex flex-col w-full lg:pl-10 py-10 lg:ml-[300px]"><div class="doc flex flex-col gap-5 svelte-yue6wq"><h1>Console</h1>
+
+<h2>Basic Usages</h2>
+<p>The Proxima Console gives you a powerful command line utility to remotely inspect and control your game.
+   The Console comes with several built-in commands, and you can
+   write your own commands with unlimited potential.</p>
+
+<img src="../docs/console.png" alt="Proxima Console">
+
+<h2 class="text-zing-100 text-xl mt-5">Using the Console</h2>
+<ul class="list-disc ml-5"><li>Type <b>&#39;?&#39;</b> to see a list of all commands.</li>
+   <li>Type <b>&#39;? &lt;command&gt;&#39;</b> to see more information about a command.</li>
+   <li>Type <b>&#39;h&#39;</b> to see your history of commands.</li>
+   <li>Press the <b>Up</b> and <b>Down</b> arrows to cycle through your history of commands.</li>
+   <li>Type some characters and press <b>Tab</b> to cycle through auto-completion options.</li></ul>
+
+<h2 class="text-zing-100 text-xl mt-5">Examples</h2>
+<div class="bg-[#1d1d1d] p-3 text-zinc-300 font-mono"><span class="text-gray-400">// List all gameObjects starting with cube</span><br>
+   &gt; list cube*<br>
+   Cube (1) [25654]<br>
+   Cube (2) [25664]<br>
+   Cube (3) [25634]<br>
+   <br>
+   <span class="text-gray-400">// Get the position of a specific cube</span><br>
+   &gt; get [25654].transform.position<br>
+   Cube (1) [25654] [1, 2, 3]<br>
+   <br>
+   <span class="text-gray-400">// Move the cube</span><br>
+   &gt; move [25654] [0, 3, 0]<br>
+   Moved Cube (1) [25654] to [0, 3, 0]<br>
+   <br>
+   <span class="text-gray-400">// Rotate the camera to look at the cube</span><br>
+   &gt; lookat &quot;Main Camera&quot; [25654].transform.position<br>
+   Rotated Main Camera [23438] to [0, 3, 0]<br>
+   <br>
+   <span class="text-gray-400">// Add a RigidBody component to the cube</span><br>
+   &gt; addcomponent [25654] rigidbody<br>
+   Added Rigidbody to Cube (1) [25654]<br>
+   <br>
+   <span class="text-gray-400">// Destroy all the cubes</span><br>
+   &gt; destroy cube*<br>
+   Destroyed Cube (1) [25654]<br>
+   Destroyed Cube (2) [25664]<br>
+   Destroyed Cube (3) [25634]<br>
+   <br>
+   <span class="text-gray-400">// Enter fullscreen</span><br>
+   &gt; set screen.fullscreen true<br>
+   Set Screen.fullScreen to true<br>
+   <br>
+   <span class="text-gray-400">// Slow down time by half</span><br>
+   &gt; set time.timescale 0.5<br>
+   Set Time.timeScale to 0.5<br>
+   <br>
+   <span class="text-gray-400">// Change TextMeshPro text</span><br>
+   &gt; set text1.textmeshpro.text &quot;banana phone&quot;<br>
+   Set Text1.TextMeshPro.Text to banana phone<br></div>
+
+<h2 class="text-zing-100 text-xl mt-5">Pattern Matching</h2>
+<p>Several built-in commands support pattern matching for gameObjects and properties:</p>
+<ul class="ml-5 list-disc"><li>Use asterisk (*) to as a wildcard to when specifying gameObjects. For example: cube* will match cube1 and cube23</li>
+   <li>Use dot notation to reference properties. For example: cube1.transform.position</li>
+   <li>Many commands print the gameObject&#39;s ID. You can use this ID instead of the name. For example: [25654].transform.position</li></ul>
+
+<h2 class="text-zing-100 text-xl mt-5">Types</h2>
+<p>Proxima Commands can process these types: bool, int, uint, float, string, Vector2, Vector2Int, Vector3, Vector3Int, Quaternion, Vector4, Rect, RectInt, Bounds, BoundsInt, Color, Enum, Array.</p>
+<ul class="list-disc ml-5"><li>To pass bool use <b>true</b> or <b>false</b></li>
+    <li>To pass string use quotes: <b>&quot;The quick brown fox&quot;</b>.</li>
+    <li>To pass Vector2, Vector3, or Vector4: <b>[1.1, 2.2, 3.3]</b> means <b>new Vector3(1.1, 2.2, 3.3)</b>.</li>
+    <li>To pass Quaternion: <b>[10, 20, 30]</b> means <b>Quaternion.Euler(10, 20, 30)</b>.</li>
+    <li>To pass Rect: <b>[1, 2, 3, 4]</b> means <b>new Rect(1, 2, 3, 4)</b>.</li>
+    <li>To pass Bounds: <b>[1, 2, 3, 4, 5, 6]</b> means <b>new Bounds(new Vector3(1, 2, 3), new Vector3(4, 5, 6))</b>.</li>
+    <li>To pass Color use hexidecimal format: <b>#FF0000</b> means red.</li>
+    <li>You can also pass an array of the same type to a List or Array C# parameter, for example, <b>[1, 2, 3, 4, 5]</b>.</li></ul>
+
+<h2 class="bg-gray-800 p-5 text-zing-100 text-xl mt-5">Learn more about the powerful <a href="../docs/console_built_in.html">built-in commands</a>.</h2>
+<h2 class="bg-gray-800 p-5 text-zing-100 text-zing-100 text-xl">Learn how to write your own <a href="../docs/console_custom.html">custom commands</a>.</h2>
+
+<h2 class="text-zing-100 text-xl mt-5">Running Scripts</h2>
+<p>You can automate the Proxima Console to run commands in sequence. This might be helpful if you need to read many values repeatedly or setup a scene in a predefined way.</p>
+<ul class="list-disc ml-5"><li>Create a text file with a list of commands, one per line. Blank lines are ignored.</li>
+   <li>Click &quot;Run Script&quot; in the console and select your file. The console will run each command in sequence.</li></ul>
+
+<img class="self-start" src="../docs/run-script.png" alt="Run Script button"></div></div></div>
+</div>
+        <div class="h-[200px] flex flex-col"><p class="text-gray-400 m-10">© 2023 Virtual Maker Corporation</p></div></div></div>
+
+
+		
+	</div>
+	</body>
+</html>
diff --git a/Assets/Proxima/Documentation/docs/console.html.meta b/Assets/Proxima/Documentation/docs/console.html.meta
new file mode 100644
index 0000000..fa9d975
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/console.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 8fcdf6627a00623469e8bbe57390f5fe
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/console.png b/Assets/Proxima/Documentation/docs/console.png
new file mode 100644
index 0000000..0bc4024
Binary files /dev/null and b/Assets/Proxima/Documentation/docs/console.png differ
diff --git a/Assets/Proxima/Documentation/docs/console.png.meta b/Assets/Proxima/Documentation/docs/console.png.meta
new file mode 100644
index 0000000..f4547af
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/console.png.meta
@@ -0,0 +1,98 @@
+fileFormatVersion: 2
+guid: 42a62eedd641c3e43af5e0d39886bc22
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/console_built_in.html b/Assets/Proxima/Documentation/docs/console_built_in.html
new file mode 100644
index 0000000..fd7cc21
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/console_built_in.html
@@ -0,0 +1,272 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>Proxima Inspector</title>
+		<link rel="icon" href="../icons/favicon.ico" />
+		<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1">
+		<meta property="og:type" content="website">
+		<meta name="description" property="og:description" content="Proxima Inspector lets you connect to your live game from a web browser to inspect and edit any property. Just like the Unity editor!">
+		<meta name="image" property="og:image" content="../images/proxima-1200x630.png">
+		<meta http-equiv="content-security-policy" content="">
+		<link href="../_app/immutable/assets/_layout-1f0a7e97.css" rel="stylesheet">
+		<link href="../_app/immutable/assets/_layout-6847360b.css" rel="stylesheet">
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	</head>
+	<body>
+		<div>
+
+
+<div class="flex flex-col items-center text-gray-300 w-full min-h-screen bg-[#222]"><div class="flex w-full justify-center items-start bg-[#111] text-white fixed z-20"><div class="flex grow justify-between items-center max-w-[1600px] p-4"><a href="https://www.unityproxima.com"><img src="../images/proxima_logo.png" class="w-[150px]" alt="Logo"></a>
+            <button class="lg:hidden"><img class="w-10" src="../icons/menu.png" alt="Menu"></button>
+            <div class="flex gap-10 items-center max-lg:hidden">
+<a href="https://assetstore.unity.com/publishers/72095?aid=1101lqSYn" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Store</a>
+                
+<a href="https://app.unityproxima.com/connection" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Demo</a>
+                
+                <a class="text-xl font-logo" href="../docs.html">Docs</a>
+                
+<a href="https://discord.gg/VM9cWJ9rjH" class="" referrerpolicy="origin" target="_blank" rel="external"><img width="100px" class="mt-1" src="../icons/discord.png" alt=""></a></div></div>
+        </div>
+
+    <div class="pt-[83px] w-full h-full flex flex-col items-center"><div class="w-full flex flex-col items-start min-h-screen max-w-[1600px] px-4"><button class="text-white font-body pt-5 lg:hidden">Go to page &gt;</button>
+    <div class="flex w-full min-h-full relative"><div class="h-full fixed border-r-orange-400 bg-[#222] border-r-2 max-lg:hidden"><div class="flex pt-10 flex-col w-[300px] gap-2 border-[#21a6f0] min-h-0 h-full overflow-auto"><b class="text-orange-400">Getting Started</b>
+                <a href="../docs.html" class="svelte-yue6wq">Installation</a>
+                <a href="../docs/features.html" class="svelte-yue6wq">Feature Overview</a>
+
+                <b class="text-orange-400 mt-5">Connection</b>
+                <a href="../docs/supported_platforms.html" class="svelte-yue6wq">Supported Platforms</a>
+                <a href="../docs/connect.html" class="svelte-yue6wq">Connect to Your Game</a>
+                <a href="../docs/security.html" class="svelte-yue6wq">Security Considerations</a>
+                <a href="../docs/all_config.html" class="svelte-yue6wq">All Configuration Options</a>
+
+                <b class="text-orange-400 mt-5">Inspector</b>
+                <a href="../docs/inspector.html" class="svelte-yue6wq">GameObject Inspector</a>
+                <a href="../docs/buttons.html" class="svelte-yue6wq">Adding Buttons</a>
+                <a href="../docs/faq.html" class="svelte-yue6wq">Frequently Asked Questions</a>
+
+                <b class="text-orange-400 mt-5">Logs</b>
+                <a href="../docs/logs.html" class="svelte-yue6wq">Log Viewer</a>
+                <a href="../docs/viewing_logs_offline.html" class="svelte-yue6wq">Viewing Logs Offline</a>
+
+                <b class="text-orange-400 mt-5">Console</b>
+                <a href="../docs/console.html" class="svelte-yue6wq">Console Window</a>
+                <a href="../docs/console_built_in.html" class="svelte-yue6wq">Built-in Commands</a>
+                <a href="../docs/console_custom.html" class="svelte-yue6wq">Custom Commands</a>
+
+                <b class="text-orange-400 mt-5">Extras</b>
+                <a href="../docs/deeplinks.html" class="svelte-yue6wq">Deep Links</a>
+
+                <div class="h-[200px] shrink-0"></div></div></div>
+
+        
+        <div class="flex flex-col w-full lg:pl-10 py-10 lg:ml-[300px]"><div class="doc flex flex-col gap-5 svelte-yue6wq"><h1>Built-in Commands</h1>
+
+<h2 class="text-2xl text-orange-400 font-bold">General Commands</h2>
+   <div class="bg-[#1d1d1d] p-3 shadow-lg flex flex-col gap-3 w-full text-left"><div class="flex gap-2 items-center font-mono text-lg"><button><img class="w-[15px]" src="../icons/arrow.png" alt=""></button>
+        <p class="">Get</p>
+        <div>(g)</div>
+        <div>pattern</div></div>
+    <div class="flex flex-col gap-2 "><p class="font-mono">Alias: g</p>
+        <p>Get the value of the given property. Can be used with most gameObject properties, component properties, and some statics including: Application, Time, Physics, Screen, AudioSettings, QualitySettings, Input, Physics2D.</p>
+        <p>Parameters:</p>
+        <div class="ml-5 font-mono"><p>pattern: String </p></div>
+        <p class="font-mono bg-[#222] p-3 mt-2 w-full">&gt; g cube*.transform.position
+            <br>Cube1 [123] [1, 2, 3]<br>Cube2 [456] [1, 2, 3]<br>Cube3 [789] [1, 2, 3]</p>
+        <p></p>
+        <p></p></div></div><div class="bg-[#1d1d1d] p-3 shadow-lg flex flex-col gap-3 w-full text-left"><div class="flex gap-2 items-center font-mono text-lg"><button><img class="w-[15px]" src="../icons/arrow.png" alt=""></button>
+        <p class="">Set</p>
+        <div>(s)</div>
+        <div>property</div><div>value</div></div>
+    <div class="flex flex-col gap-2 "><p class="font-mono">Alias: s</p>
+        <p>Set the value of the given property. Can be used with most gameObject properties, component properties, and some statics including: Application, Time, Physics, Screen, AudioSettings, QualitySettings, Input, Physics2D.</p>
+        <p>Parameters:</p>
+        <div class="ml-5 font-mono"><p>property: String </p><p>value: Object </p></div>
+        <p class="font-mono bg-[#222] p-3 mt-2 w-full">&gt; s cube*.transform.position [1, 2, 3]
+            <br>Set Cube1 [123] to [1, 2, 3]<br>Set Cube2 [456] to [1, 2, 3]<br>Set Cube3 [789] to [1, 2, 3]</p>
+        <p></p>
+        <p></p></div></div><h2 class="text-2xl text-orange-400 font-bold">Scene Commands</h2>
+   <div class="bg-[#1d1d1d] p-3 shadow-lg flex flex-col gap-3 w-full text-left"><div class="flex gap-2 items-center font-mono text-lg"><button><img class="w-[15px]" src="../icons/arrow.png" alt=""></button>
+        <p class="">Load</p>
+        <div>(ld)</div>
+        <div>sceneOrIndex</div><div>(additive)</div></div>
+    <div class="flex flex-col gap-2 "><p class="font-mono">Alias: ld</p>
+        <p>Load scene by name or build index. If additive is true, the scene is added to the current scene.</p>
+        <p>Parameters:</p>
+        <div class="ml-5 font-mono"><p>sceneOrIndex: String </p><p>additive: Boolean (Default: false)</p></div>
+        <p class="font-mono bg-[#222] p-3 mt-2 w-full">&gt; ld SampleScene
+            <br>Loading scene SampleScene.</p>
+        <p></p>
+        <p></p></div></div><div class="bg-[#1d1d1d] p-3 shadow-lg flex flex-col gap-3 w-full text-left"><div class="flex gap-2 items-center font-mono text-lg"><button><img class="w-[15px]" src="../icons/arrow.png" alt=""></button>
+        <p class="">Unload</p>
+        <div>(ul)</div>
+        <div>sceneOrIndex</div></div>
+    <div class="flex flex-col gap-2 "><p class="font-mono">Alias: ul</p>
+        <p>Unload scene by name or build index.</p>
+        <p>Parameters:</p>
+        <div class="ml-5 font-mono"><p>sceneOrIndex: String </p></div>
+        <p class="font-mono bg-[#222] p-3 mt-2 w-full">&gt; ul SampleScene
+            <br>Unloading scene SampleScene.</p>
+        <p></p>
+        <p></p></div></div><h2 class="text-2xl text-orange-400 font-bold">GameObject Commands</h2>
+   <div class="bg-[#1d1d1d] p-3 shadow-lg flex flex-col gap-3 w-full text-left"><div class="flex gap-2 items-center font-mono text-lg"><button><img class="w-[15px]" src="../icons/arrow.png" alt=""></button>
+        <p class="">AddComponent</p>
+        <div>(ac)</div>
+        <div>name</div><div>component</div></div>
+    <div class="flex flex-col gap-2 "><p class="font-mono">Alias: ac</p>
+        <p>Add the component to all gameObjects with the given name.</p>
+        <p>Parameters:</p>
+        <div class="ml-5 font-mono"><p>name: String </p><p>component: String </p></div>
+        <p class="font-mono bg-[#222] p-3 mt-2 w-full">&gt; ac cube* Rigidbody
+            <br>Added Rigidbody to Cube1 [123]<br>Added Rigidbody to Cube2 [456]<br>Added Rigidbody to Cube3 [789]</p>
+        <p></p>
+        <p></p></div></div><div class="bg-[#1d1d1d] p-3 shadow-lg flex flex-col gap-3 w-full text-left"><div class="flex gap-2 items-center font-mono text-lg"><button><img class="w-[15px]" src="../icons/arrow.png" alt=""></button>
+        <p class="">Destroy</p>
+        <div>(x)</div>
+        <div>name</div></div>
+    <div class="flex flex-col gap-2 "><p class="font-mono">Alias: x</p>
+        <p>Destroy all game objects with the given name.</p>
+        <p>Parameters:</p>
+        <div class="ml-5 font-mono"><p>name: String </p></div>
+        <p class="font-mono bg-[#222] p-3 mt-2 w-full">&gt; x cube*
+            <br>Destroyed Cube1 [123]<br>Destroyed Cube2 [456]<br>Destroyed Cube3 [789]</p>
+        <p></p>
+        <p></p></div></div><div class="bg-[#1d1d1d] p-3 shadow-lg flex flex-col gap-3 w-full text-left"><div class="flex gap-2 items-center font-mono text-lg"><button><img class="w-[15px]" src="../icons/arrow.png" alt=""></button>
+        <p class="">Disable</p>
+        <div>(d)</div>
+        <div>name</div></div>
+    <div class="flex flex-col gap-2 "><p class="font-mono">Alias: d</p>
+        <p>Disable the given gameObjects.</p>
+        <p>Parameters:</p>
+        <div class="ml-5 font-mono"><p>name: String </p></div>
+        <p class="font-mono bg-[#222] p-3 mt-2 w-full">&gt; d cube*
+            <br>Disabled Cube1 [123]<br>Disabled Cube2 [456]<br>Disabled Cube3 [789]</p>
+        <p></p>
+        <p></p></div></div><div class="bg-[#1d1d1d] p-3 shadow-lg flex flex-col gap-3 w-full text-left"><div class="flex gap-2 items-center font-mono text-lg"><button><img class="w-[15px]" src="../icons/arrow.png" alt=""></button>
+        <p class="">Enable</p>
+        <div>(e)</div>
+        <div>name</div></div>
+    <div class="flex flex-col gap-2 "><p class="font-mono">Alias: e</p>
+        <p>Enable the given gameObjects.</p>
+        <p>Parameters:</p>
+        <div class="ml-5 font-mono"><p>name: String </p></div>
+        <p class="font-mono bg-[#222] p-3 mt-2 w-full">&gt; e cube*
+            <br>Enabled Cube1 [123]<br>Enabled Cube2 [456]<br>Enabled Cube3 [789]</p>
+        <p></p>
+        <p></p></div></div><div class="bg-[#1d1d1d] p-3 shadow-lg flex flex-col gap-3 w-full text-left"><div class="flex gap-2 items-center font-mono text-lg"><button><img class="w-[15px]" src="../icons/arrow.png" alt=""></button>
+        <p class="">GetComponents</p>
+        <div>(comp)</div>
+        <div>name</div></div>
+    <div class="flex flex-col gap-2 "><p class="font-mono">Alias: comp</p>
+        <p>Get the components of the given gameObjects.</p>
+        <p>Parameters:</p>
+        <div class="ml-5 font-mono"><p>name: String </p></div>
+        <p class="font-mono bg-[#222] p-3 mt-2 w-full">&gt; comp cube1
+            <br>Cube1 [123] Components:<br>  Transform<br>  MeshFilter<br>  MeshRenderer</p>
+        <p></p>
+        <p></p></div></div><div class="bg-[#1d1d1d] p-3 shadow-lg flex flex-col gap-3 w-full text-left"><div class="flex gap-2 items-center font-mono text-lg"><button><img class="w-[15px]" src="../icons/arrow.png" alt=""></button>
+        <p class="">Instantiate</p>
+        <div>(i)</div>
+        <div>prefabName</div><div>(position)</div><div>(rotation)</div><div>(parent)</div></div>
+    <div class="flex flex-col gap-2 "><p class="font-mono">Alias: i</p>
+        <p>Instantiate a prefab by name with optional position, rotation, and parent transform.</p>
+        <p>Parameters:</p>
+        <div class="ml-5 font-mono"><p>prefabName: String </p><p>position: Vector3 (Default: [0,0,0])</p><p>rotation: Quaternion (Default: [0,0,0])</p><p>parent: Transform (Default: null)</p></div>
+        <p class="font-mono bg-[#222] p-3 mt-2 w-full">&gt; i SamplePrefab [0, 1, 0] [0, 45, 0] cube.transform
+            <br>Instantiated SamplePrefab(Clone) [123].</p>
+        <p></p>
+        <p></p></div></div><div class="bg-[#1d1d1d] p-3 shadow-lg flex flex-col gap-3 w-full text-left"><div class="flex gap-2 items-center font-mono text-lg"><button><img class="w-[15px]" src="../icons/arrow.png" alt=""></button>
+        <p class="">List</p>
+        <div>(ls)</div>
+        <div>(name)</div></div>
+    <div class="flex flex-col gap-2 "><p class="font-mono">Alias: ls</p>
+        <p>List all game objects with the given name.</p>
+        <p>Parameters:</p>
+        <div class="ml-5 font-mono"><p>name: String (Default: *)</p></div>
+        <p class="font-mono bg-[#222] p-3 mt-2 w-full">&gt; ls cube*
+            <br>Cube1 [123]<br>Cube2 [456]<br>Cube3 [789]</p>
+        <p></p>
+        <p></p></div></div><div class="bg-[#1d1d1d] p-3 shadow-lg flex flex-col gap-3 w-full text-left"><div class="flex gap-2 items-center font-mono text-lg"><button><img class="w-[15px]" src="../icons/arrow.png" alt=""></button>
+        <p class="">LookAt</p>
+        <div>(lk)</div>
+        <div>name</div><div>(target)</div><div>(worldUp)</div></div>
+    <div class="flex flex-col gap-2 "><p class="font-mono">Alias: lk</p>
+        <p>Look at the given target.</p>
+        <p>Parameters:</p>
+        <div class="ml-5 font-mono"><p>name: String </p><p>target: Vector3 (Default: [0,0,0])</p><p>worldUp: Vector3 (Default: [0,0,0])</p></div>
+        <p class="font-mono bg-[#222] p-3 mt-2 w-full">&gt; lk cube* player1.transform.position
+            <br>Rotated Cube1 [123] to [0, 1, 0]<br>Rotated Cube2 [456] to [0, 1, 0]<br>Rotated Cube3 [789] to [0, 1, 0]</p>
+        <p></p>
+        <p></p></div></div><div class="bg-[#1d1d1d] p-3 shadow-lg flex flex-col gap-3 w-full text-left"><div class="flex gap-2 items-center font-mono text-lg"><button><img class="w-[15px]" src="../icons/arrow.png" alt=""></button>
+        <p class="">Move</p>
+        <div>(mv)</div>
+        <div>name</div><div>(position)</div><div>(local)</div></div>
+    <div class="flex flex-col gap-2 "><p class="font-mono">Alias: mv</p>
+        <p>Move all game objects with the given name to the given position.</p>
+        <p>Parameters:</p>
+        <div class="ml-5 font-mono"><p>name: String </p><p>position: Vector3 (Default: [0,0,0])</p><p>local: Boolean (Default: false)</p></div>
+        <p class="font-mono bg-[#222] p-3 mt-2 w-full">&gt; mv cube* [0, 1, 0]
+            <br>Moved Cube1 [123] to [0, 1, 0]<br>Moved Cube2 [456] to [0, 1, 0]<br>Moved Cube3 [789] to [0, 1, 0]</p>
+        <p></p>
+        <p></p></div></div><div class="bg-[#1d1d1d] p-3 shadow-lg flex flex-col gap-3 w-full text-left"><div class="flex gap-2 items-center font-mono text-lg"><button><img class="w-[15px]" src="../icons/arrow.png" alt=""></button>
+        <p class="">RemoveComponent</p>
+        <div>(rc)</div>
+        <div>name</div><div>component</div></div>
+    <div class="flex flex-col gap-2 "><p class="font-mono">Alias: rc</p>
+        <p>Remove the component from all gameObjects with the given name.</p>
+        <p>Parameters:</p>
+        <div class="ml-5 font-mono"><p>name: String </p><p>component: String </p></div>
+        <p class="font-mono bg-[#222] p-3 mt-2 w-full">&gt; rc cube* Rigidbody
+            <br>Removed Rigidbody from Cube1 [123]<br>Removed Rigidbody from Cube2 [456]<br>Removed Rigidbody from Cube3 [789]</p>
+        <p></p>
+        <p></p></div></div><div class="bg-[#1d1d1d] p-3 shadow-lg flex flex-col gap-3 w-full text-left"><div class="flex gap-2 items-center font-mono text-lg"><button><img class="w-[15px]" src="../icons/arrow.png" alt=""></button>
+        <p class="">Rotate</p>
+        <div>(rt)</div>
+        <div>name</div><div>(rotation)</div><div>(local)</div></div>
+    <div class="flex flex-col gap-2 "><p class="font-mono">Alias: rt</p>
+        <p>Rotate all game objects with the given name to the given rotation.</p>
+        <p>Parameters:</p>
+        <div class="ml-5 font-mono"><p>name: String </p><p>rotation: Quaternion (Default: [0,0,0])</p><p>local: Boolean (Default: false)</p></div>
+        <p class="font-mono bg-[#222] p-3 mt-2 w-full">&gt; rt cube* [0, 45, 0]
+            <br>Rotated Cube1 [123] to [0, 45, 0]<br>Rotated Cube2 [456] to [0, 45, 0]<br>Rotated Cube3 [789] to [0, 45, 0]</p>
+        <p></p>
+        <p></p></div></div><div class="bg-[#1d1d1d] p-3 shadow-lg flex flex-col gap-3 w-full text-left"><div class="flex gap-2 items-center font-mono text-lg"><button><img class="w-[15px]" src="../icons/arrow.png" alt=""></button>
+        <p class="">Scale</p>
+        <div>(sc)</div>
+        <div>name</div><div>(scale)</div></div>
+    <div class="flex flex-col gap-2 "><p class="font-mono">Alias: sc</p>
+        <p>Scale all game objects with the given name to the given scale.</p>
+        <p>Parameters:</p>
+        <div class="ml-5 font-mono"><p>name: String </p><p>scale: Vector3 (Default: [0,0,0])</p></div>
+        <p class="font-mono bg-[#222] p-3 mt-2 w-full">&gt; sc cube* [2, 2, 2]
+            <br>Scaled Cube1 [123] to [2, 2, 2]<br>Scaled Cube2 [456] to [2, 2, 2]<br>Scaled Cube3 [789] to [2, 2, 2]</p>
+        <p></p>
+        <p></p></div></div><div class="bg-[#1d1d1d] p-3 shadow-lg flex flex-col gap-3 w-full text-left"><div class="flex gap-2 items-center font-mono text-lg"><button><img class="w-[15px]" src="../icons/arrow.png" alt=""></button>
+        <p class="">SendMessage</p>
+        <div>(sm)</div>
+        <div>name</div><div>method</div></div>
+    <div class="flex flex-col gap-2 "><p class="font-mono">Alias: sm</p>
+        <p>Call a method on all gameObjects with the given name using SendMessage.</p>
+        <p>Parameters:</p>
+        <div class="ml-5 font-mono"><p>name: String </p><p>method: String </p></div>
+        <p class="font-mono bg-[#222] p-3 mt-2 w-full">&gt; sm cube* OnHit
+            <br>Sent message OnHit to Cube1 [123]<br>Sent message OnHit to Cube2 [456]<br>Sent message OnHit to Cube3 [789]</p>
+        <p></p>
+        <p></p></div></div></div></div></div>
+</div>
+        <div class="h-[200px] flex flex-col"><p class="text-gray-400 m-10">© 2023 Virtual Maker Corporation</p></div></div></div>
+
+
+		
+	</div>
+	</body>
+</html>
diff --git a/Assets/Proxima/Documentation/docs/console_built_in.html.meta b/Assets/Proxima/Documentation/docs/console_built_in.html.meta
new file mode 100644
index 0000000..07d365b
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/console_built_in.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d956d92be1b02d44c8d87fa255b3e689
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/console_custom.html b/Assets/Proxima/Documentation/docs/console_custom.html
new file mode 100644
index 0000000..006979d
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/console_custom.html
@@ -0,0 +1,169 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>Proxima Inspector</title>
+		<link rel="icon" href="../icons/favicon.ico" />
+		<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1">
+		<meta property="og:type" content="website">
+		<meta name="description" property="og:description" content="Proxima Inspector lets you connect to your live game from a web browser to inspect and edit any property. Just like the Unity editor!">
+		<meta name="image" property="og:image" content="../images/proxima-1200x630.png">
+		<meta http-equiv="content-security-policy" content="">
+		<link href="../_app/immutable/assets/_layout-1f0a7e97.css" rel="stylesheet">
+		<link href="../_app/immutable/assets/_layout-6847360b.css" rel="stylesheet">
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	</head>
+	<body>
+		<div>
+
+
+<div class="flex flex-col items-center text-gray-300 w-full min-h-screen bg-[#222]"><div class="flex w-full justify-center items-start bg-[#111] text-white fixed z-20"><div class="flex grow justify-between items-center max-w-[1600px] p-4"><a href="https://www.unityproxima.com"><img src="../images/proxima_logo.png" class="w-[150px]" alt="Logo"></a>
+            <button class="lg:hidden"><img class="w-10" src="../icons/menu.png" alt="Menu"></button>
+            <div class="flex gap-10 items-center max-lg:hidden">
+<a href="https://assetstore.unity.com/publishers/72095?aid=1101lqSYn" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Store</a>
+                
+<a href="https://app.unityproxima.com/connection" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Demo</a>
+                
+                <a class="text-xl font-logo" href="../docs.html">Docs</a>
+                
+<a href="https://discord.gg/VM9cWJ9rjH" class="" referrerpolicy="origin" target="_blank" rel="external"><img width="100px" class="mt-1" src="../icons/discord.png" alt=""></a></div></div>
+        </div>
+
+    <div class="pt-[83px] w-full h-full flex flex-col items-center"><div class="w-full flex flex-col items-start min-h-screen max-w-[1600px] px-4"><button class="text-white font-body pt-5 lg:hidden">Go to page &gt;</button>
+    <div class="flex w-full min-h-full relative"><div class="h-full fixed border-r-orange-400 bg-[#222] border-r-2 max-lg:hidden"><div class="flex pt-10 flex-col w-[300px] gap-2 border-[#21a6f0] min-h-0 h-full overflow-auto"><b class="text-orange-400">Getting Started</b>
+                <a href="../docs.html" class="svelte-yue6wq">Installation</a>
+                <a href="../docs/features.html" class="svelte-yue6wq">Feature Overview</a>
+
+                <b class="text-orange-400 mt-5">Connection</b>
+                <a href="../docs/supported_platforms.html" class="svelte-yue6wq">Supported Platforms</a>
+                <a href="../docs/connect.html" class="svelte-yue6wq">Connect to Your Game</a>
+                <a href="../docs/security.html" class="svelte-yue6wq">Security Considerations</a>
+                <a href="../docs/all_config.html" class="svelte-yue6wq">All Configuration Options</a>
+
+                <b class="text-orange-400 mt-5">Inspector</b>
+                <a href="../docs/inspector.html" class="svelte-yue6wq">GameObject Inspector</a>
+                <a href="../docs/buttons.html" class="svelte-yue6wq">Adding Buttons</a>
+                <a href="../docs/faq.html" class="svelte-yue6wq">Frequently Asked Questions</a>
+
+                <b class="text-orange-400 mt-5">Logs</b>
+                <a href="../docs/logs.html" class="svelte-yue6wq">Log Viewer</a>
+                <a href="../docs/viewing_logs_offline.html" class="svelte-yue6wq">Viewing Logs Offline</a>
+
+                <b class="text-orange-400 mt-5">Console</b>
+                <a href="../docs/console.html" class="svelte-yue6wq">Console Window</a>
+                <a href="../docs/console_built_in.html" class="svelte-yue6wq">Built-in Commands</a>
+                <a href="../docs/console_custom.html" class="svelte-yue6wq">Custom Commands</a>
+
+                <b class="text-orange-400 mt-5">Extras</b>
+                <a href="../docs/deeplinks.html" class="svelte-yue6wq">Deep Links</a>
+
+                <div class="h-[200px] shrink-0"></div></div></div>
+
+        
+        <div class="flex flex-col w-full lg:pl-10 py-10 lg:ml-[300px]"><div class="doc flex flex-col gap-5 svelte-yue6wq"><h1>Custom Commands</h1>
+
+<h2 class="text-zing-100 text-xl mt-5">Simple Example: Get the position of a gameObject by name.</h2>
+
+<p>Define a new command GetPosition to take the name of the gameObject as an argument and return its position.</p>
+
+<div class="bg-[#1d1d1d] p-3 text-zinc-300 font-mono"><span class="text-blue-300">public static class</span> <span class="text-green-400">MyCommands</span><br>
+   {<br>
+          [<span class="text-green-400">ProximaCommand</span>(<span class="text-orange-400">&quot;My&quot;</span>, <span class="text-orange-400">&quot;gp&quot;</span>)]<br>
+      <span class="text-blue-300">    public static</span> <span class="text-green-400">Vector3</span> <span class="text-yellow-200">GetPosition</span>(<span class="text-blue-300">string</span> name)<br>
+          {<br>
+      <span class="text-blue-300">        var</span> go = <span class="text-green-400">GameObject</span>.<span class="text-yellow-200">Find</span>(name);<br>
+      <span class="text-pink-500">        if</span> (go == null) <span class="text-pink-500">throw new</span> <span class="text-green-400">Exception</span>(<span class="text-orange-400">&quot;GameObject not found.&quot;</span>);<br>
+      <span class="text-pink-500">        return</span> go.transform.position;<br>
+          }<br>
+   }<br></div>
+
+<p>The first argument to ProximaCommand is the category which will appear when the user types &quot;?&quot;.
+   The second argument is an alias, or shortcut you can use instead of the full command name.</p>
+
+<p>In order for Proxima to find your command, you need to register its class. For example, you can do this in Awake() of one of your components:</p>
+
+<div class="bg-[#1d1d1d] p-3 text-zinc-300 font-mono"><span class="text-blue-300">void</span> <span class="text-yellow-200">Awake</span>()<br>
+   {<br>
+      <span class="text-green-400">    ProximaInspector</span>.<span class="text-yellow-200">RegisterCommands</span>&lt;<span class="text-green-400">MyComands</span>&gt;();<br>
+   }<br></div>
+
+<p>Now you can invoke your command in the Console by typing:</p>
+
+<div class="bg-[#1d1d1d] p-3 text-zinc-300 font-mono">&gt; GetPosition &quot;Main Camera&quot;<br>
+   [0,1,-10]
+</div>
+<p>or</p>
+<div class="bg-[#1d1d1d] p-3 text-zinc-300 font-mono">&gt; gp &quot;Main Camera&quot;<br>
+   [0,1,-10]
+</div>
+
+<h2 class="text-zinc-100 text-xl mt-5">Pattern matching gameObjects</h2>
+<p>Often, scenes have multiple gameObjects with the same name. Sometimes, the user doesn&#39;t know or doesn&#39;t want to type the full name.
+   Instead of <b>GameObject.Find</b>, you can use <b>ProximaCommandHelpers.FindGameObject</b> to pattern match the user input.
+</p>
+<div class="bg-[#1d1d1d] p-3 text-zinc-300 font-mono">[<span class="text-green-400">ProximaCommand</span>(<span class="text-orange-400">&quot;My&quot;</span>, <span class="text-orange-400">&quot;gp&quot;</span>)]<br>
+   <span class="text-blue-300">public static string </span><span class="text-yellow-200">GetPosition</span>(<span class="text-blue-300">string</span> name)<br>
+   {<br>
+   <span class="text-blue-300">    var</span> gameObjects = <span class="text-green-400">ProximaCommandHelpers</span>.<span class="text-yellow-200">FindGameObjects</span>(name);<br>
+   <span class="text-pink-500">    if</span> (gameObjects.Count == 0)<br>
+   <span>    {</span><br>
+   <span class="text-pink-500">        throw new Exception</span>(<span class="text-orange-400">$&quot;No game object found with name &#39;{<span class="text-white">name</span>}&#39;&quot;</span>);<br>
+   <span>    }</span><br>
+   <br>
+   <span class="text-blue-300">    var </span>sb = <span class="text-blue-300">new</span> <span class="text-green-400">StringBuilder</span>();<br>
+   <span class="text-pink-500">    foreach</span> (<span class="text-blue-300">var</span> go <span class="text-blue-300">in</span> gameObjects)<br>
+   <span>    {</span><br>
+   <span>        </span>sb.<span class="text-yellow-200">AppendLine</span>(go.name + <span class="text-orange-400">&quot; [&quot;</span> + go.<span class="text-yellow-200">GetInstanceID</span>() + <span class="text-orange-400">&quot;] &quot;</span> +<br>
+      <span class="text-green-400">            ProximaSerialization</span>.<span class="text-yellow-200">Serialize</span>(go.transform.position, true));<br>
+   <span>    }</span><br><br>
+   <span class="text-pink-500">    return </span>sb.<span class="text-yellow-200">ToString</span>();<br>
+   }<br></div>
+
+<div class="bg-[#1d1d1d] p-3 text-zinc-300 font-mono">&gt; gp *camera<br>
+   Main Camera [23162] [0, 1, -10]
+</div>
+
+
+<h2 class="text-zinc-100 text-xl mt-5">Command Parameters</h2>
+<p>Add parameters to your command by adding arguments to your method.</p>
+
+<div class="bg-[#1d1d1d] p-3 text-zinc-300 font-mono">[<span class="text-green-400">ProximaCommand</span>(<span class="text-orange-400">&quot;My&quot;</span>, <span class="text-orange-400">&quot;addv&quot;</span>)]<br>
+   <span class="text-blue-300">public static</span> <span class="text-green-400">Vector3</span> <span class="text-yellow-200">AddVectors</span>(<span class="text-green-400">Vector3</span> lhs, <span class="text-green-400">Vector3</span> rhs)<br>
+   {<br>
+      <span class="text-pink-500">    return</span> lhs + rhs;<br>
+   }<br></div>
+
+<div class="bg-[#1d1d1d] p-3 text-zinc-300 font-mono">&gt; addv [1, 2, 3] [4, 5, 6]<br>
+   [5,7,9]
+</div>
+
+<h2 class="text-zinc-100 text-xl mt-5">Pattern matching parameters</h2>
+<p>Instead of explicitly taking a <b>Vector3</b> as an argument, you can use the <b>PropertyOrValue</b> wrapper to accept either a Vector3 or a property.</p>
+
+<div class="bg-[#1d1d1d] p-3 text-zinc-300 font-mono">[<span class="text-green-400">ProximaCommand</span>(<span class="text-orange-400">&quot;My&quot;</span>, <span class="text-orange-400">&quot;addv&quot;</span>)]<br>
+   <span class="text-blue-300">public static</span> <span class="text-green-400">Vector3</span> <span class="text-yellow-200">AddVectors</span>(<span class="text-green-400">PropertyOrValue</span>&lt;<span class="text-green-400">Vector3</span>&gt; lhs, <span class="text-green-400">PropertyOrValue</span>&lt;<span class="text-green-400">Vector3</span>&gt; rhs)<br>
+   {<br>
+      <span class="text-pink-500">    return</span> lhs.Get() + rhs.Get();<br>
+   }<br></div>
+
+<div class="bg-[#1d1d1d] p-3 text-zinc-300 font-mono">&gt; addv *camera.transform.position panel.transform.position<br>
+   [474.5,1,-10]
+</div></div></div></div>
+</div>
+        <div class="h-[200px] flex flex-col"><p class="text-gray-400 m-10">© 2023 Virtual Maker Corporation</p></div></div></div>
+
+
+		
+	</div>
+	</body>
+</html>
diff --git a/Assets/Proxima/Documentation/docs/console_custom.html.meta b/Assets/Proxima/Documentation/docs/console_custom.html.meta
new file mode 100644
index 0000000..b2b356d
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/console_custom.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 83c38fc2f0b168e489bb5118333ee97c
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/deeplinks.html b/Assets/Proxima/Documentation/docs/deeplinks.html
new file mode 100644
index 0000000..a2e44c9
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/deeplinks.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>Proxima Inspector</title>
+		<link rel="icon" href="../icons/favicon.ico" />
+		<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1">
+		<meta property="og:type" content="website">
+		<meta name="description" property="og:description" content="Proxima Inspector lets you connect to your live game from a web browser to inspect and edit any property. Just like the Unity editor!">
+		<meta name="image" property="og:image" content="../images/proxima-1200x630.png">
+		<meta http-equiv="content-security-policy" content="">
+		<link href="../_app/immutable/assets/_layout-1f0a7e97.css" rel="stylesheet">
+		<link href="../_app/immutable/assets/_layout-6847360b.css" rel="stylesheet">
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	</head>
+	<body>
+		<div>
+
+
+<div class="flex flex-col items-center text-gray-300 w-full min-h-screen bg-[#222]"><div class="flex w-full justify-center items-start bg-[#111] text-white fixed z-20"><div class="flex grow justify-between items-center max-w-[1600px] p-4"><a href="https://www.unityproxima.com"><img src="../images/proxima_logo.png" class="w-[150px]" alt="Logo"></a>
+            <button class="lg:hidden"><img class="w-10" src="../icons/menu.png" alt="Menu"></button>
+            <div class="flex gap-10 items-center max-lg:hidden">
+<a href="https://assetstore.unity.com/publishers/72095?aid=1101lqSYn" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Store</a>
+                
+<a href="https://app.unityproxima.com/connection" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Demo</a>
+                
+                <a class="text-xl font-logo" href="../docs.html">Docs</a>
+                
+<a href="https://discord.gg/VM9cWJ9rjH" class="" referrerpolicy="origin" target="_blank" rel="external"><img width="100px" class="mt-1" src="../icons/discord.png" alt=""></a></div></div>
+        </div>
+
+    <div class="pt-[83px] w-full h-full flex flex-col items-center"><div class="w-full flex flex-col items-start min-h-screen max-w-[1600px] px-4"><button class="text-white font-body pt-5 lg:hidden">Go to page &gt;</button>
+    <div class="flex w-full min-h-full relative"><div class="h-full fixed border-r-orange-400 bg-[#222] border-r-2 max-lg:hidden"><div class="flex pt-10 flex-col w-[300px] gap-2 border-[#21a6f0] min-h-0 h-full overflow-auto"><b class="text-orange-400">Getting Started</b>
+                <a href="../docs.html" class="svelte-yue6wq">Installation</a>
+                <a href="../docs/features.html" class="svelte-yue6wq">Feature Overview</a>
+
+                <b class="text-orange-400 mt-5">Connection</b>
+                <a href="../docs/supported_platforms.html" class="svelte-yue6wq">Supported Platforms</a>
+                <a href="../docs/connect.html" class="svelte-yue6wq">Connect to Your Game</a>
+                <a href="../docs/security.html" class="svelte-yue6wq">Security Considerations</a>
+                <a href="../docs/all_config.html" class="svelte-yue6wq">All Configuration Options</a>
+
+                <b class="text-orange-400 mt-5">Inspector</b>
+                <a href="../docs/inspector.html" class="svelte-yue6wq">GameObject Inspector</a>
+                <a href="../docs/buttons.html" class="svelte-yue6wq">Adding Buttons</a>
+                <a href="../docs/faq.html" class="svelte-yue6wq">Frequently Asked Questions</a>
+
+                <b class="text-orange-400 mt-5">Logs</b>
+                <a href="../docs/logs.html" class="svelte-yue6wq">Log Viewer</a>
+                <a href="../docs/viewing_logs_offline.html" class="svelte-yue6wq">Viewing Logs Offline</a>
+
+                <b class="text-orange-400 mt-5">Console</b>
+                <a href="../docs/console.html" class="svelte-yue6wq">Console Window</a>
+                <a href="../docs/console_built_in.html" class="svelte-yue6wq">Built-in Commands</a>
+                <a href="../docs/console_custom.html" class="svelte-yue6wq">Custom Commands</a>
+
+                <b class="text-orange-400 mt-5">Extras</b>
+                <a href="../docs/deeplinks.html" class="svelte-yue6wq">Deep Links</a>
+
+                <div class="h-[200px] shrink-0"></div></div></div>
+
+        
+        <div class="flex flex-col w-full lg:pl-10 py-10 lg:ml-[300px]"><div class="doc flex flex-col gap-5 svelte-yue6wq"><h1>Deep Links</h1>
+
+<p>You can use URL query parameters to automatically log in, navigate to a page, search for gameObject, and even run console commands.</p>
+
+<h2>Examples</h2>
+<div class="bg-[#1d1d1d] p-3 text-zinc-300 font-mono"><span class="text-gray-400">// Automatically log in, navigate to the inspector page, and search for &quot;player&quot;</span><br>
+    &gt; http://127.0.0.1:7759?pass=1234&amp;page=inspector&amp;s=player
+    <br><br>
+    <span class="text-gray-400">// Automatically log in, navigate to the inspector page, and select the gameObject with the name &quot;player&quot;</span><br>
+    &gt; http://127.0.0.1:7759?pass=1234&amp;page=inspector&amp;go=player
+    <br><br>
+    <span class="text-gray-400">// Automatically log in, navigate to the console page, and run &quot;ls player&quot;</span><br>
+    &gt; http://127.0.0.1:7759?pass=1234&amp;page=console&amp;run=ls%20player
+</div>
+
+<h2>General Parameters</h2>
+<table><tr><td class="w-[200px]"><b>Parameter</b></td>
+        <td><b>Description</b></td></tr>
+    <tr><td class="w-[200px]">pass</td>
+        <td>Automatically connects with the given password.</td></tr>
+    <tr><td class="w-[200px]">page</td>
+        <td>Navigates to the given page. Options are &quot;inspector&quot;, &quot;logs&quot;, and &quot;console&quot;</td></tr></table>
+
+<h2>Inspector Parameters</h2>
+<table><tr><td class="w-[200px]"><b>Parameter</b></td>
+        <td><b>Description</b></td></tr>
+    <tr><td class="w-[200px]">s</td>
+        <td>Sets the gameObject search filter</td></tr>
+    <tr><td class="w-[200px]">go</td>
+        <td>Automatically selects the gameObject with the given name</td></tr></table>
+
+<h2>Console Parameters</h2>
+<table><tr><td class="w-[200px]"><b>Parameter</b></td>
+        <td><b>Description</b></td></tr>
+    <tr><td class="w-[200px]">run</td>
+        <td>Runs the given console command</td></tr></table></div></div></div>
+</div>
+        <div class="h-[200px] flex flex-col"><p class="text-gray-400 m-10">© 2023 Virtual Maker Corporation</p></div></div></div>
+
+
+		
+	</div>
+	</body>
+</html>
diff --git a/Assets/Proxima/Documentation/docs/deeplinks.html.meta b/Assets/Proxima/Documentation/docs/deeplinks.html.meta
new file mode 100644
index 0000000..6c4a313
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/deeplinks.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 844576d597f144ae0a2184f9ef68b223
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/device-config.png b/Assets/Proxima/Documentation/docs/device-config.png
new file mode 100644
index 0000000..eedf961
Binary files /dev/null and b/Assets/Proxima/Documentation/docs/device-config.png differ
diff --git a/Assets/Proxima/Documentation/docs/device-config.png.meta b/Assets/Proxima/Documentation/docs/device-config.png.meta
new file mode 100644
index 0000000..0174d94
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/device-config.png.meta
@@ -0,0 +1,98 @@
+fileFormatVersion: 2
+guid: 3bdee37772784b44798feaccd4e13fcd
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/faq.html b/Assets/Proxima/Documentation/docs/faq.html
new file mode 100644
index 0000000..908021d
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/faq.html
@@ -0,0 +1,134 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>Proxima Inspector</title>
+		<link rel="icon" href="../icons/favicon.ico" />
+		<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1">
+		<meta property="og:type" content="website">
+		<meta name="description" property="og:description" content="Proxima Inspector lets you connect to your live game from a web browser to inspect and edit any property. Just like the Unity editor!">
+		<meta name="image" property="og:image" content="../images/proxima-1200x630.png">
+		<meta http-equiv="content-security-policy" content="">
+		<link href="../_app/immutable/assets/_layout-1f0a7e97.css" rel="stylesheet">
+		<link href="../_app/immutable/assets/_layout-6847360b.css" rel="stylesheet">
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	</head>
+	<body>
+		<div>
+
+
+<div class="flex flex-col items-center text-gray-300 w-full min-h-screen bg-[#222]"><div class="flex w-full justify-center items-start bg-[#111] text-white fixed z-20"><div class="flex grow justify-between items-center max-w-[1600px] p-4"><a href="https://www.unityproxima.com"><img src="../images/proxima_logo.png" class="w-[150px]" alt="Logo"></a>
+            <button class="lg:hidden"><img class="w-10" src="../icons/menu.png" alt="Menu"></button>
+            <div class="flex gap-10 items-center max-lg:hidden">
+<a href="https://assetstore.unity.com/publishers/72095?aid=1101lqSYn" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Store</a>
+                
+<a href="https://app.unityproxima.com/connection" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Demo</a>
+                
+                <a class="text-xl font-logo" href="../docs.html">Docs</a>
+                
+<a href="https://discord.gg/VM9cWJ9rjH" class="" referrerpolicy="origin" target="_blank" rel="external"><img width="100px" class="mt-1" src="../icons/discord.png" alt=""></a></div></div>
+        </div>
+
+    <div class="pt-[83px] w-full h-full flex flex-col items-center"><div class="w-full flex flex-col items-start min-h-screen max-w-[1600px] px-4"><button class="text-white font-body pt-5 lg:hidden">Go to page &gt;</button>
+    <div class="flex w-full min-h-full relative"><div class="h-full fixed border-r-orange-400 bg-[#222] border-r-2 max-lg:hidden"><div class="flex pt-10 flex-col w-[300px] gap-2 border-[#21a6f0] min-h-0 h-full overflow-auto"><b class="text-orange-400">Getting Started</b>
+                <a href="../docs.html" class="svelte-yue6wq">Installation</a>
+                <a href="../docs/features.html" class="svelte-yue6wq">Feature Overview</a>
+
+                <b class="text-orange-400 mt-5">Connection</b>
+                <a href="../docs/supported_platforms.html" class="svelte-yue6wq">Supported Platforms</a>
+                <a href="../docs/connect.html" class="svelte-yue6wq">Connect to Your Game</a>
+                <a href="../docs/security.html" class="svelte-yue6wq">Security Considerations</a>
+                <a href="../docs/all_config.html" class="svelte-yue6wq">All Configuration Options</a>
+
+                <b class="text-orange-400 mt-5">Inspector</b>
+                <a href="../docs/inspector.html" class="svelte-yue6wq">GameObject Inspector</a>
+                <a href="../docs/buttons.html" class="svelte-yue6wq">Adding Buttons</a>
+                <a href="../docs/faq.html" class="svelte-yue6wq">Frequently Asked Questions</a>
+
+                <b class="text-orange-400 mt-5">Logs</b>
+                <a href="../docs/logs.html" class="svelte-yue6wq">Log Viewer</a>
+                <a href="../docs/viewing_logs_offline.html" class="svelte-yue6wq">Viewing Logs Offline</a>
+
+                <b class="text-orange-400 mt-5">Console</b>
+                <a href="../docs/console.html" class="svelte-yue6wq">Console Window</a>
+                <a href="../docs/console_built_in.html" class="svelte-yue6wq">Built-in Commands</a>
+                <a href="../docs/console_custom.html" class="svelte-yue6wq">Custom Commands</a>
+
+                <b class="text-orange-400 mt-5">Extras</b>
+                <a href="../docs/deeplinks.html" class="svelte-yue6wq">Deep Links</a>
+
+                <div class="h-[200px] shrink-0"></div></div></div>
+
+        
+        <div class="flex flex-col w-full lg:pl-10 py-10 lg:ml-[300px]"><div class="doc flex flex-col gap-5 svelte-yue6wq"><h1>Proxima Inspector FAQ</h1>
+
+<div class="bg-[#1d1d1d] p-3 shadow-lg flex gap-2 flex-col text-left"><button><div class="flex gap-2 items-center font-bold"><img class="w-[15px] mt-1" src="../icons/arrow.png" alt="">
+            <div>Which property types does Proxima support?</div></div></button>
+    <div class=""><div slot="answer"><p>Proxima supports editing most types of properties:</p>
+        <div class="m-5"><div class="bg-gray-800 p-5 text-zinc-300"><div class="font-bold mb-3">Supported Property Types:</div>
+                <ul class="ml-5 list-disc"><li>All <a href="https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/built-in-types" target="_blank" rel="noreferrer">C# built-in value types</a>, except decimal.</li>
+                    <li>string, Vector2, Vector2Int, Vector3, Vector3Int, Quaternion, Vector4, Rect, RectInt, Bounds, BoundsInt, Color, LayerMask</li>
+                    <li>All enums and flags.</li>
+                    <li>Any struct or class marked as [Serializable] (since Update 1.2).</li>
+                    <li>View, but not edit, all Unity object references (GameObjects, Components, Assets, etc.)</li>
+                    <li>Arrays and Lists of any of the above.</li></ul></div></div>
+        <p>If you think Proxima is missing an important type, please post your suggestion on the Discord Server.</p></div></div></div>
+
+<div class="bg-[#1d1d1d] p-3 shadow-lg flex gap-2 flex-col text-left"><button><div class="flex gap-2 items-center font-bold"><img class="w-[15px] mt-1" src="../icons/arrow.png" alt="">
+            <div>Will Proxima Inspector affect my game performance?</div></div></button>
+    <div class=""><div class="flex flex-col gap-2" slot="answer"><p>Proxima Inspector is designed to have minimal impact on your game performance. It uses a WebSocket connection to send minimal changes to the browser, and will only performs work when the relevant browser page is open:</p>
+        <ul class="list-disc ml-5 flex flex-col gap-2"><li><b>Hierarchy Page</b>: To detect these updates, Proxima will scan up to 10 gameObjects per frame for changes. You can modify this number by changing &quot;ProximaInspector.MaxGameObjectUpdatesPerFrame&quot;.</li>
+            <li><b>Inspector Page</b>: Proxima will scan one component on the selected gameObject per frame for property changes. You can adjust the frequency each component is scanned by adjusting ProximaInspector.MaxComponentUpdateFrequency.</li>
+            <li><b>Logs Page</b>: Proxima records log messages in a circular list so that you can see what happened in the recent past when you visit the Logs page. You can change the size of this list by editing the <b>Log Buffer Size</b> property on the inspector component.</li>
+            <li><b>Console Page</b>: No performance impact until a command is issued.</li></ul></div></div></div>
+
+<div class="bg-[#1d1d1d] p-3 shadow-lg flex gap-2 flex-col text-left"><button><div class="flex gap-2 items-center font-bold"><img class="w-[15px] mt-1" src="../icons/arrow.png" alt="">
+            <div>Why are my root gameObjects out of order?</div></div></button>
+    <div class=""><p slot="answer">Unity does not preserve the order of gameObjects in the scene of a built game. Even assigning a sibling index to the transform component will have no effect. This is why you can&#39;t reorder root gameObjects.
+    </p></div></div>
+
+<div class="bg-[#1d1d1d] p-3 shadow-lg flex gap-2 flex-col text-left"><button><div class="flex gap-2 items-center font-bold"><img class="w-[15px] mt-1" src="../icons/arrow.png" alt="">
+            <div>Why do some component properties appear differently than in the Editor?</div></div></button>
+    <div class=""><p slot="answer">Proxima searches for serialized fields on components to display them in the inspector. This is the same as Unity&#39;s default behavior for MonoBehaviours.
+        However, some components have custom editors which control their appearance in the Unity inspector.
+        All custom editor code is stripped out of a built game, and so Proxima cannot access this information.
+    </p></div></div>
+
+<div class="bg-[#1d1d1d] p-3 shadow-lg flex gap-2 flex-col text-left"><button><div class="flex gap-2 items-center font-bold"><img class="w-[15px] mt-1" src="../icons/arrow.png" alt="">
+            <div>Why are some components missing properties?</div></div></button>
+    <div class=""><div slot="answer"><a target="_blank" href="https://docs.unity3d.com/Manual/ManagedCodeStripping.html" rel="noreferrer">Managed Code Stripping</a>
+        may be removing some fields or properties from a built game if they are not used by your game code. By default, this happens for built-in Unity component properties which are
+        configured in the editor, but not referenced in your code. You can control this setting under <div>&quot;Project Settings &gt; Player &gt; Optimization &gt; Managed Stripping Level&quot;</div><br>
+
+        <p>Proxima prevents code stripping for many Unity component properties like Transform&#39;s localPosition by explicitly referencing them
+            in <b>Proxima/Runtime/Generated/ProximaReflection.Generated.cs</b>. You can use one of the techniques described in the link above to prevent your components from being stripped.</p></div></div></div>
+
+<div class="bg-[#1d1d1d] p-3 shadow-lg flex gap-2 flex-col text-left"><button><div class="flex gap-2 items-center font-bold"><img class="w-[15px] mt-1" src="../icons/arrow.png" alt="">
+            <div>Why are tags not a dropdown list?</div></div></button>
+    <div class=""><p slot="answer">Unity does not preserve the list of tags in a built game. You can assign a tag to any string.
+    </p></div></div>
+
+<div class="bg-[#1d1d1d] p-3 shadow-lg flex gap-2 flex-col text-left"><button><div class="flex gap-2 items-center font-bold"><img class="w-[15px] mt-1" src="../icons/arrow.png" alt="">
+            <div>Why does Proxima stop updating when my game is not selected?</div></div></button>
+    <div class=""><p slot="answer">Proxima depends on Unity&#39;s update loop to detect gameObject and component updates.
+        When your game is not in focus, the update loop may be paused. You can configure this setting in Unity under:
+        &quot;Project Settings &gt; Player &gt; Resolution and Presentation &gt; Run In Background&quot;
+    </p></div></div></div></div></div>
+</div>
+        <div class="h-[200px] flex flex-col"><p class="text-gray-400 m-10">© 2023 Virtual Maker Corporation</p></div></div></div>
+
+
+		
+	</div>
+	</body>
+</html>
diff --git a/Assets/Proxima/Documentation/docs/faq.html.meta b/Assets/Proxima/Documentation/docs/faq.html.meta
new file mode 100644
index 0000000..c0cbc90
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/faq.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: a357ca48b25c5744f8a3e484b2d8cf16
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/features.html b/Assets/Proxima/Documentation/docs/features.html
new file mode 100644
index 0000000..cc03dae
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/features.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>Proxima Inspector</title>
+		<link rel="icon" href="../icons/favicon.ico" />
+		<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1">
+		<meta property="og:type" content="website">
+		<meta name="description" property="og:description" content="Proxima Inspector lets you connect to your live game from a web browser to inspect and edit any property. Just like the Unity editor!">
+		<meta name="image" property="og:image" content="../images/proxima-1200x630.png">
+		<meta http-equiv="content-security-policy" content="">
+		<link href="../_app/immutable/assets/_layout-1f0a7e97.css" rel="stylesheet">
+		<link href="../_app/immutable/assets/_layout-6847360b.css" rel="stylesheet">
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	</head>
+	<body>
+		<div>
+
+
+<div class="flex flex-col items-center text-gray-300 w-full min-h-screen bg-[#222]"><div class="flex w-full justify-center items-start bg-[#111] text-white fixed z-20"><div class="flex grow justify-between items-center max-w-[1600px] p-4"><a href="https://www.unityproxima.com"><img src="../images/proxima_logo.png" class="w-[150px]" alt="Logo"></a>
+            <button class="lg:hidden"><img class="w-10" src="../icons/menu.png" alt="Menu"></button>
+            <div class="flex gap-10 items-center max-lg:hidden">
+<a href="https://assetstore.unity.com/publishers/72095?aid=1101lqSYn" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Store</a>
+                
+<a href="https://app.unityproxima.com/connection" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Demo</a>
+                
+                <a class="text-xl font-logo" href="../docs.html">Docs</a>
+                
+<a href="https://discord.gg/VM9cWJ9rjH" class="" referrerpolicy="origin" target="_blank" rel="external"><img width="100px" class="mt-1" src="../icons/discord.png" alt=""></a></div></div>
+        </div>
+
+    <div class="pt-[83px] w-full h-full flex flex-col items-center"><div class="w-full flex flex-col items-start min-h-screen max-w-[1600px] px-4"><button class="text-white font-body pt-5 lg:hidden">Go to page &gt;</button>
+    <div class="flex w-full min-h-full relative"><div class="h-full fixed border-r-orange-400 bg-[#222] border-r-2 max-lg:hidden"><div class="flex pt-10 flex-col w-[300px] gap-2 border-[#21a6f0] min-h-0 h-full overflow-auto"><b class="text-orange-400">Getting Started</b>
+                <a href="../docs.html" class="svelte-yue6wq">Installation</a>
+                <a href="../docs/features.html" class="svelte-yue6wq">Feature Overview</a>
+
+                <b class="text-orange-400 mt-5">Connection</b>
+                <a href="../docs/supported_platforms.html" class="svelte-yue6wq">Supported Platforms</a>
+                <a href="../docs/connect.html" class="svelte-yue6wq">Connect to Your Game</a>
+                <a href="../docs/security.html" class="svelte-yue6wq">Security Considerations</a>
+                <a href="../docs/all_config.html" class="svelte-yue6wq">All Configuration Options</a>
+
+                <b class="text-orange-400 mt-5">Inspector</b>
+                <a href="../docs/inspector.html" class="svelte-yue6wq">GameObject Inspector</a>
+                <a href="../docs/buttons.html" class="svelte-yue6wq">Adding Buttons</a>
+                <a href="../docs/faq.html" class="svelte-yue6wq">Frequently Asked Questions</a>
+
+                <b class="text-orange-400 mt-5">Logs</b>
+                <a href="../docs/logs.html" class="svelte-yue6wq">Log Viewer</a>
+                <a href="../docs/viewing_logs_offline.html" class="svelte-yue6wq">Viewing Logs Offline</a>
+
+                <b class="text-orange-400 mt-5">Console</b>
+                <a href="../docs/console.html" class="svelte-yue6wq">Console Window</a>
+                <a href="../docs/console_built_in.html" class="svelte-yue6wq">Built-in Commands</a>
+                <a href="../docs/console_custom.html" class="svelte-yue6wq">Custom Commands</a>
+
+                <b class="text-orange-400 mt-5">Extras</b>
+                <a href="../docs/deeplinks.html" class="svelte-yue6wq">Deep Links</a>
+
+                <div class="h-[200px] shrink-0"></div></div></div>
+
+        
+        <div class="flex flex-col w-full lg:pl-10 py-10 lg:ml-[300px]"><div class="doc flex flex-col gap-5 svelte-yue6wq"><h1>Feature Overview</h1>
+
+<h2>GameObject Inspector</h2>
+<p>The <a href="../docs/inspector.html">GameObject Inspector</a> lets you view and edit any gameObject and component in your scene, just like the Unity inspector.</p>
+<a href="../docs/inspector.html"><img src="../docs/inspector.png" class="w-full" alt="Proxima Inspector Page"></a>
+
+<h2>Logs</h2>
+<p>The <a href="../docs/logs.html">Log Viewer</a> lets you see logs in real time or save logs for offline viewing.</p>
+<a href="../docs/logs.html"><img src="../docs/logs.png" class="w-full" alt="Proxima Inspector Page"></a>
+
+<h2>Console</h2>
+<p>The <a href="../docs/console.html">Console</a> is a powerful command line utility to remotely inspect and control your game.</p>
+<a href="../docs/console.html"><img src="../docs/console.png" class="w-full" alt="Proxima Inspector Page"></a></div></div></div>
+</div>
+        <div class="h-[200px] flex flex-col"><p class="text-gray-400 m-10">© 2023 Virtual Maker Corporation</p></div></div></div>
+
+
+		
+	</div>
+	</body>
+</html>
diff --git a/Assets/Proxima/Documentation/docs/features.html.meta b/Assets/Proxima/Documentation/docs/features.html.meta
new file mode 100644
index 0000000..b473f3d
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/features.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d129a0acfa95e2a468333fb7f3138c50
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/gameobjectsearch.png b/Assets/Proxima/Documentation/docs/gameobjectsearch.png
new file mode 100644
index 0000000..52f37c3
Binary files /dev/null and b/Assets/Proxima/Documentation/docs/gameobjectsearch.png differ
diff --git a/Assets/Proxima/Documentation/docs/gameobjectsearch.png.meta b/Assets/Proxima/Documentation/docs/gameobjectsearch.png.meta
new file mode 100644
index 0000000..92f8a20
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/gameobjectsearch.png.meta
@@ -0,0 +1,98 @@
+fileFormatVersion: 2
+guid: 3fafd92a98320374ba634c32bcd3df2b
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/inspector.html b/Assets/Proxima/Documentation/docs/inspector.html
new file mode 100644
index 0000000..627142f
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/inspector.html
@@ -0,0 +1,126 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>Proxima Inspector</title>
+		<link rel="icon" href="../icons/favicon.ico" />
+		<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1">
+		<meta property="og:type" content="website">
+		<meta name="description" property="og:description" content="Proxima Inspector lets you connect to your live game from a web browser to inspect and edit any property. Just like the Unity editor!">
+		<meta name="image" property="og:image" content="../images/proxima-1200x630.png">
+		<meta http-equiv="content-security-policy" content="">
+		<link href="../_app/immutable/assets/_layout-1f0a7e97.css" rel="stylesheet">
+		<link href="../_app/immutable/assets/_layout-6847360b.css" rel="stylesheet">
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	</head>
+	<body>
+		<div>
+
+
+<div class="flex flex-col items-center text-gray-300 w-full min-h-screen bg-[#222]"><div class="flex w-full justify-center items-start bg-[#111] text-white fixed z-20"><div class="flex grow justify-between items-center max-w-[1600px] p-4"><a href="https://www.unityproxima.com"><img src="../images/proxima_logo.png" class="w-[150px]" alt="Logo"></a>
+            <button class="lg:hidden"><img class="w-10" src="../icons/menu.png" alt="Menu"></button>
+            <div class="flex gap-10 items-center max-lg:hidden">
+<a href="https://assetstore.unity.com/publishers/72095?aid=1101lqSYn" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Store</a>
+                
+<a href="https://app.unityproxima.com/connection" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Demo</a>
+                
+                <a class="text-xl font-logo" href="../docs.html">Docs</a>
+                
+<a href="https://discord.gg/VM9cWJ9rjH" class="" referrerpolicy="origin" target="_blank" rel="external"><img width="100px" class="mt-1" src="../icons/discord.png" alt=""></a></div></div>
+        </div>
+
+    <div class="pt-[83px] w-full h-full flex flex-col items-center"><div class="w-full flex flex-col items-start min-h-screen max-w-[1600px] px-4"><button class="text-white font-body pt-5 lg:hidden">Go to page &gt;</button>
+    <div class="flex w-full min-h-full relative"><div class="h-full fixed border-r-orange-400 bg-[#222] border-r-2 max-lg:hidden"><div class="flex pt-10 flex-col w-[300px] gap-2 border-[#21a6f0] min-h-0 h-full overflow-auto"><b class="text-orange-400">Getting Started</b>
+                <a href="../docs.html" class="svelte-yue6wq">Installation</a>
+                <a href="../docs/features.html" class="svelte-yue6wq">Feature Overview</a>
+
+                <b class="text-orange-400 mt-5">Connection</b>
+                <a href="../docs/supported_platforms.html" class="svelte-yue6wq">Supported Platforms</a>
+                <a href="../docs/connect.html" class="svelte-yue6wq">Connect to Your Game</a>
+                <a href="../docs/security.html" class="svelte-yue6wq">Security Considerations</a>
+                <a href="../docs/all_config.html" class="svelte-yue6wq">All Configuration Options</a>
+
+                <b class="text-orange-400 mt-5">Inspector</b>
+                <a href="../docs/inspector.html" class="svelte-yue6wq">GameObject Inspector</a>
+                <a href="../docs/buttons.html" class="svelte-yue6wq">Adding Buttons</a>
+                <a href="../docs/faq.html" class="svelte-yue6wq">Frequently Asked Questions</a>
+
+                <b class="text-orange-400 mt-5">Logs</b>
+                <a href="../docs/logs.html" class="svelte-yue6wq">Log Viewer</a>
+                <a href="../docs/viewing_logs_offline.html" class="svelte-yue6wq">Viewing Logs Offline</a>
+
+                <b class="text-orange-400 mt-5">Console</b>
+                <a href="../docs/console.html" class="svelte-yue6wq">Console Window</a>
+                <a href="../docs/console_built_in.html" class="svelte-yue6wq">Built-in Commands</a>
+                <a href="../docs/console_custom.html" class="svelte-yue6wq">Custom Commands</a>
+
+                <b class="text-orange-400 mt-5">Extras</b>
+                <a href="../docs/deeplinks.html" class="svelte-yue6wq">Deep Links</a>
+
+                <div class="h-[200px] shrink-0"></div></div></div>
+
+        
+        <div class="flex flex-col w-full lg:pl-10 py-10 lg:ml-[300px]"><div class="doc flex flex-col gap-5 svelte-yue6wq"><h1>GameObject Inspector</h1>
+
+<h2>Basic Usage</h2>
+<p>The GameObject Inspector lets you view and edit any gameObject and component in your scene, just like the Unity inspector.</p>
+
+<img src="../docs/inspector.png" alt="Proxima Inspector Page">
+
+<p>The left side displays the gameObject hierarchy. Select a gameObject to view its properties and components in the inspector on the right side.</p>
+<div class="bg-gray-800 p-5 text-zinc-300">The inspector works just like the Unity inspector, but some properties may appear differently (see the <a href="../docs/faq.html">FAQ</a>).
+</div>
+
+<h2>Reordering and Reparenting GameObjects</h2>
+<p>You can reorder or reparent gameObjects by dragging them in the hierarchy.</p>
+<video muted autoplay loop playsinline><source src="https://www.unityproxima.com/docs/hierarchy-reorder.mp4"></video>
+
+<h2>Finding GameObjects</h2>
+<p>You can search for a gameObject by name in the <b>Search Box</b>.</p>
+<img src="../docs/gameobjectsearch.png" alt="GameObject Search">
+
+<h2>Showing Hidden GameObjects and Components</h2>
+<p>GameObjects and Components which are hidden with hideFlags can be made visible in Proxima by clicking the <b>Show Hidden</b> toggle.</p>
+
+<h2>Creating New GameObjects</h2>
+<p>You can create an empty gameObject and its children by pressing the &quot;New&quot; button.</p>
+
+<h2>Duplicating GameObjects</h2>
+<p>You can duplicate a gameObject and its children by pressing the &quot;Duplicate&quot; button or <b>Ctrl-D</b> key while the gameObject is selected.</p>
+
+<h2>Destroying GameObjects</h2>
+<p>You can destroy a gameObject and its children by pressing the &quot;Destroy&quot; button or the <b>delete</b> key while the gameObject is selected.</p>
+
+<h2>Changing Properties</h2>
+<p>Change a property value by entering a value or dragging left-right on its name.</p>
+
+<video muted autoplay loop playsinline><source src="https://www.unityproxima.com/docs/property-edit.mp4"></video>
+
+<div class="mt-5"></div>
+<div class="bg-gray-800 p-5 text-zinc-300">Proxima supports many different types of properties, including most primitives, structs, and arrays. For the full list of supported properties, see the <a href="../docs/faq.html">FAQ</a>.</div>
+
+<h2>Destroying Components</h2>
+<p>You can destroy a component the &quot;Destroy&quot; button next to the component name.</p>
+
+<h2>Adding Components</h2>
+<p>You can add a component by typing its class name without spaces in the input field at the bottom of the inspector. </p>
+
+<video muted autoplay loop playsinline><source src="https://www.unityproxima.com/docs/add-component.mp4"></video></div></div></div>
+</div>
+        <div class="h-[200px] flex flex-col"><p class="text-gray-400 m-10">© 2023 Virtual Maker Corporation</p></div></div></div>
+
+
+		
+	</div>
+	</body>
+</html>
diff --git a/Assets/Proxima/Documentation/docs/inspector.html.meta b/Assets/Proxima/Documentation/docs/inspector.html.meta
new file mode 100644
index 0000000..771f168
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/inspector.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d0ff2e8c5fe0494438e152f3b3e2eda6
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/inspector.png b/Assets/Proxima/Documentation/docs/inspector.png
new file mode 100644
index 0000000..c3f426f
Binary files /dev/null and b/Assets/Proxima/Documentation/docs/inspector.png differ
diff --git a/Assets/Proxima/Documentation/docs/inspector.png.meta b/Assets/Proxima/Documentation/docs/inspector.png.meta
new file mode 100644
index 0000000..ff256a3
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/inspector.png.meta
@@ -0,0 +1,98 @@
+fileFormatVersion: 2
+guid: 5a5da6e76a3e76245b1a980870652617
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/log-controls.png b/Assets/Proxima/Documentation/docs/log-controls.png
new file mode 100644
index 0000000..57ecebd
Binary files /dev/null and b/Assets/Proxima/Documentation/docs/log-controls.png differ
diff --git a/Assets/Proxima/Documentation/docs/log-controls.png.meta b/Assets/Proxima/Documentation/docs/log-controls.png.meta
new file mode 100644
index 0000000..2d7d238
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/log-controls.png.meta
@@ -0,0 +1,98 @@
+fileFormatVersion: 2
+guid: d47e5a200492f814289d5c7666c7c966
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/logs.html b/Assets/Proxima/Documentation/docs/logs.html
new file mode 100644
index 0000000..f60da2a
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/logs.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>Proxima Inspector</title>
+		<link rel="icon" href="../icons/favicon.ico" />
+		<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1">
+		<meta property="og:type" content="website">
+		<meta name="description" property="og:description" content="Proxima Inspector lets you connect to your live game from a web browser to inspect and edit any property. Just like the Unity editor!">
+		<meta name="image" property="og:image" content="../images/proxima-1200x630.png">
+		<meta http-equiv="content-security-policy" content="">
+		<link href="../_app/immutable/assets/_layout-1f0a7e97.css" rel="stylesheet">
+		<link href="../_app/immutable/assets/_layout-6847360b.css" rel="stylesheet">
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	</head>
+	<body>
+		<div>
+
+
+<div class="flex flex-col items-center text-gray-300 w-full min-h-screen bg-[#222]"><div class="flex w-full justify-center items-start bg-[#111] text-white fixed z-20"><div class="flex grow justify-between items-center max-w-[1600px] p-4"><a href="https://www.unityproxima.com"><img src="../images/proxima_logo.png" class="w-[150px]" alt="Logo"></a>
+            <button class="lg:hidden"><img class="w-10" src="../icons/menu.png" alt="Menu"></button>
+            <div class="flex gap-10 items-center max-lg:hidden">
+<a href="https://assetstore.unity.com/publishers/72095?aid=1101lqSYn" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Store</a>
+                
+<a href="https://app.unityproxima.com/connection" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Demo</a>
+                
+                <a class="text-xl font-logo" href="../docs.html">Docs</a>
+                
+<a href="https://discord.gg/VM9cWJ9rjH" class="" referrerpolicy="origin" target="_blank" rel="external"><img width="100px" class="mt-1" src="../icons/discord.png" alt=""></a></div></div>
+        </div>
+
+    <div class="pt-[83px] w-full h-full flex flex-col items-center"><div class="w-full flex flex-col items-start min-h-screen max-w-[1600px] px-4"><button class="text-white font-body pt-5 lg:hidden">Go to page &gt;</button>
+    <div class="flex w-full min-h-full relative"><div class="h-full fixed border-r-orange-400 bg-[#222] border-r-2 max-lg:hidden"><div class="flex pt-10 flex-col w-[300px] gap-2 border-[#21a6f0] min-h-0 h-full overflow-auto"><b class="text-orange-400">Getting Started</b>
+                <a href="../docs.html" class="svelte-yue6wq">Installation</a>
+                <a href="../docs/features.html" class="svelte-yue6wq">Feature Overview</a>
+
+                <b class="text-orange-400 mt-5">Connection</b>
+                <a href="../docs/supported_platforms.html" class="svelte-yue6wq">Supported Platforms</a>
+                <a href="../docs/connect.html" class="svelte-yue6wq">Connect to Your Game</a>
+                <a href="../docs/security.html" class="svelte-yue6wq">Security Considerations</a>
+                <a href="../docs/all_config.html" class="svelte-yue6wq">All Configuration Options</a>
+
+                <b class="text-orange-400 mt-5">Inspector</b>
+                <a href="../docs/inspector.html" class="svelte-yue6wq">GameObject Inspector</a>
+                <a href="../docs/buttons.html" class="svelte-yue6wq">Adding Buttons</a>
+                <a href="../docs/faq.html" class="svelte-yue6wq">Frequently Asked Questions</a>
+
+                <b class="text-orange-400 mt-5">Logs</b>
+                <a href="../docs/logs.html" class="svelte-yue6wq">Log Viewer</a>
+                <a href="../docs/viewing_logs_offline.html" class="svelte-yue6wq">Viewing Logs Offline</a>
+
+                <b class="text-orange-400 mt-5">Console</b>
+                <a href="../docs/console.html" class="svelte-yue6wq">Console Window</a>
+                <a href="../docs/console_built_in.html" class="svelte-yue6wq">Built-in Commands</a>
+                <a href="../docs/console_custom.html" class="svelte-yue6wq">Custom Commands</a>
+
+                <b class="text-orange-400 mt-5">Extras</b>
+                <a href="../docs/deeplinks.html" class="svelte-yue6wq">Deep Links</a>
+
+                <div class="h-[200px] shrink-0"></div></div></div>
+
+        
+        <div class="flex flex-col w-full lg:pl-10 py-10 lg:ml-[300px]"><div class="doc flex flex-col gap-5 svelte-yue6wq"><h1>Logs Viewer</h1>
+
+<h2>Basic Usage</h2>
+<p>Proxima lets you view logs from your game similarly to the Unity console.</p>
+<img src="../docs/logs.png" alt="Proxima Log Viewer">
+
+<h2>Options</h2>
+<p>Let&#39;s look at some of the options.</p>
+
+<img src="../docs/log-controls.png" alt="Log Controls">
+
+<ul class="ml-5 list-disc leading-8"><li><b>Clear</b>: clear the log window.</li>
+    <li><b>Collapse</b>: collapse similar logs together to a single line.</li>
+    <li><b>Pause</b>: temporarily stop receiving logs from the game.</li>
+    <li><b>Save</b>: options to save the log file for offline viewing. See <a href="../docs/viewing_logs_offline.html">Viewing Logs Offline</a>.</li>
+    <li><b>Load</b>: load a previously saved log file. See <a href="../docs/viewing_logs_offline.html">Viewing Logs Offline</a>.</li>
+    <li><b>Search</b>: Filter logs by a search term.</li>
+    <li><b>Info / Warning / Error Toggles</b>: Filter logs by info, warning, or error.</li></ul>
+
+<h2>Stack Traces</h2>
+<p>When a log is selected, you can see the full log message and stack trace at the bottom of the window.</p>
+
+<div class="bg-gray-800 p-5 text-zinc-300">Hint: You can enable or disable stack traces for different log types in Unity&#39;s project settings:
+    &quot;Project Settings &gt; Player &gt; Stack Trace&quot;
+</div></div></div></div>
+</div>
+        <div class="h-[200px] flex flex-col"><p class="text-gray-400 m-10">© 2023 Virtual Maker Corporation</p></div></div></div>
+
+
+		
+	</div>
+	</body>
+</html>
diff --git a/Assets/Proxima/Documentation/docs/logs.html.meta b/Assets/Proxima/Documentation/docs/logs.html.meta
new file mode 100644
index 0000000..5070c56
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/logs.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 87ce81e82190821459e35627e688930f
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/logs.png b/Assets/Proxima/Documentation/docs/logs.png
new file mode 100644
index 0000000..90ad0ff
Binary files /dev/null and b/Assets/Proxima/Documentation/docs/logs.png differ
diff --git a/Assets/Proxima/Documentation/docs/logs.png.meta b/Assets/Proxima/Documentation/docs/logs.png.meta
new file mode 100644
index 0000000..df747b2
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/logs.png.meta
@@ -0,0 +1,98 @@
+fileFormatVersion: 2
+guid: e782a82ba05af5a478d3072d84772ee5
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/password-warning.png b/Assets/Proxima/Documentation/docs/password-warning.png
new file mode 100644
index 0000000..f90405b
Binary files /dev/null and b/Assets/Proxima/Documentation/docs/password-warning.png differ
diff --git a/Assets/Proxima/Documentation/docs/password-warning.png.meta b/Assets/Proxima/Documentation/docs/password-warning.png.meta
new file mode 100644
index 0000000..9772571
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/password-warning.png.meta
@@ -0,0 +1,98 @@
+fileFormatVersion: 2
+guid: 8f9e2bbb4b83ffa4eb19aba1ee22bf34
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/run-script.png b/Assets/Proxima/Documentation/docs/run-script.png
new file mode 100644
index 0000000..3df5f00
Binary files /dev/null and b/Assets/Proxima/Documentation/docs/run-script.png differ
diff --git a/Assets/Proxima/Documentation/docs/run-script.png.meta b/Assets/Proxima/Documentation/docs/run-script.png.meta
new file mode 100644
index 0000000..58a544b
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/run-script.png.meta
@@ -0,0 +1,148 @@
+fileFormatVersion: 2
+guid: 060e78b3f414d2c499a081ebeddc8fbf
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 12
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+    flipGreenChannel: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMipmapLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  swizzle: 50462976
+  cookieLightType: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Server
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Windows Store Apps
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  mipmapLimitGroupName: 
+  pSDRemoveMatte: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/secure-config.png b/Assets/Proxima/Documentation/docs/secure-config.png
new file mode 100644
index 0000000..e78929d
Binary files /dev/null and b/Assets/Proxima/Documentation/docs/secure-config.png differ
diff --git a/Assets/Proxima/Documentation/docs/secure-config.png.meta b/Assets/Proxima/Documentation/docs/secure-config.png.meta
new file mode 100644
index 0000000..115c361
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/secure-config.png.meta
@@ -0,0 +1,98 @@
+fileFormatVersion: 2
+guid: 1f819dedfa86808429961506ceca924b
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/security.html b/Assets/Proxima/Documentation/docs/security.html
new file mode 100644
index 0000000..652339f
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/security.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>Proxima Inspector</title>
+		<link rel="icon" href="../icons/favicon.ico" />
+		<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1">
+		<meta property="og:type" content="website">
+		<meta name="description" property="og:description" content="Proxima Inspector lets you connect to your live game from a web browser to inspect and edit any property. Just like the Unity editor!">
+		<meta name="image" property="og:image" content="../images/proxima-1200x630.png">
+		<meta http-equiv="content-security-policy" content="">
+		<link href="../_app/immutable/assets/_layout-1f0a7e97.css" rel="stylesheet">
+		<link href="../_app/immutable/assets/_layout-6847360b.css" rel="stylesheet">
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	</head>
+	<body>
+		<div>
+
+
+<div class="flex flex-col items-center text-gray-300 w-full min-h-screen bg-[#222]"><div class="flex w-full justify-center items-start bg-[#111] text-white fixed z-20"><div class="flex grow justify-between items-center max-w-[1600px] p-4"><a href="https://www.unityproxima.com"><img src="../images/proxima_logo.png" class="w-[150px]" alt="Logo"></a>
+            <button class="lg:hidden"><img class="w-10" src="../icons/menu.png" alt="Menu"></button>
+            <div class="flex gap-10 items-center max-lg:hidden">
+<a href="https://assetstore.unity.com/publishers/72095?aid=1101lqSYn" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Store</a>
+                
+<a href="https://app.unityproxima.com/connection" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Demo</a>
+                
+                <a class="text-xl font-logo" href="../docs.html">Docs</a>
+                
+<a href="https://discord.gg/VM9cWJ9rjH" class="" referrerpolicy="origin" target="_blank" rel="external"><img width="100px" class="mt-1" src="../icons/discord.png" alt=""></a></div></div>
+        </div>
+
+    <div class="pt-[83px] w-full h-full flex flex-col items-center"><div class="w-full flex flex-col items-start min-h-screen max-w-[1600px] px-4"><button class="text-white font-body pt-5 lg:hidden">Go to page &gt;</button>
+    <div class="flex w-full min-h-full relative"><div class="h-full fixed border-r-orange-400 bg-[#222] border-r-2 max-lg:hidden"><div class="flex pt-10 flex-col w-[300px] gap-2 border-[#21a6f0] min-h-0 h-full overflow-auto"><b class="text-orange-400">Getting Started</b>
+                <a href="../docs.html" class="svelte-yue6wq">Installation</a>
+                <a href="../docs/features.html" class="svelte-yue6wq">Feature Overview</a>
+
+                <b class="text-orange-400 mt-5">Connection</b>
+                <a href="../docs/supported_platforms.html" class="svelte-yue6wq">Supported Platforms</a>
+                <a href="../docs/connect.html" class="svelte-yue6wq">Connect to Your Game</a>
+                <a href="../docs/security.html" class="svelte-yue6wq">Security Considerations</a>
+                <a href="../docs/all_config.html" class="svelte-yue6wq">All Configuration Options</a>
+
+                <b class="text-orange-400 mt-5">Inspector</b>
+                <a href="../docs/inspector.html" class="svelte-yue6wq">GameObject Inspector</a>
+                <a href="../docs/buttons.html" class="svelte-yue6wq">Adding Buttons</a>
+                <a href="../docs/faq.html" class="svelte-yue6wq">Frequently Asked Questions</a>
+
+                <b class="text-orange-400 mt-5">Logs</b>
+                <a href="../docs/logs.html" class="svelte-yue6wq">Log Viewer</a>
+                <a href="../docs/viewing_logs_offline.html" class="svelte-yue6wq">Viewing Logs Offline</a>
+
+                <b class="text-orange-400 mt-5">Console</b>
+                <a href="../docs/console.html" class="svelte-yue6wq">Console Window</a>
+                <a href="../docs/console_built_in.html" class="svelte-yue6wq">Built-in Commands</a>
+                <a href="../docs/console_custom.html" class="svelte-yue6wq">Custom Commands</a>
+
+                <b class="text-orange-400 mt-5">Extras</b>
+                <a href="../docs/deeplinks.html" class="svelte-yue6wq">Deep Links</a>
+
+                <div class="h-[200px] shrink-0"></div></div></div>
+
+        
+        <div class="flex flex-col w-full lg:pl-10 py-10 lg:ml-[300px]"><div class="doc flex flex-col gap-5 svelte-yue6wq"><h1>Security Considerations</h1>
+
+<p>Proxima Inspector is a powerful tool that can be used to control and debug your game. It is important to understand the security implications when using Proxima Inspector.
+    Potentially any information in your game can be read with Proxima, or by anyone eavesdropping on your connection if encryption is not enabled.</p>
+<p>To protect your game from unwanted access, follow the guidelines on this page.</p>
+
+<h2 class="text-zinc-100 text-xl mt-5">Secure Configuration</h2>
+<p>At a glance, this is what the most secure configuration of Proxima looks like:</p>
+
+<img src="../docs/secure-config.png" alt="Secure Proxima Component Configuration">
+
+<div class="bg-gray-800 p-5 text-zinc-300"><p class="font-bold">Notice that:</p>
+    <ul class="list-decimal ml-5 leading-8"><li>Use Https is checked.</li>
+        <li>No password is specified.</li>
+        <li>Run On Enable is disabled.</li>
+        <li>Instantiate Connect UI is enabled.</li></ul></div>
+
+<p>The rest of this page will go over each of these options.</p>
+
+<h2 class="text-zinc-100 text-xl mt-5">Use Https</h2>
+
+<p>HTTPS is a protocol for secure communication over a network. It is used to encrypt data sent between your game and Proxima Inspector.</p>
+
+<p>Enabling HTTPS is easy. Simply check the <b>Use HTTPS</b> box on the Proxima Inspector component.
+    You may also need to add a new rule to your firewall to allow HTTPS traffic on your configured port.</p>
+
+<h2 class="text-zinc-100 text-xl mt-5">(Optional) TLS Certificate</h2>
+
+<p>HTTPS requires a TLS certificate to encrypt data. Proxima Inspector uses a self-signed certificate by default, which is not trusted by most browsers.
+    The first time you try to access Proxima Inspector, you may see a warning like this that the certificate is not trusted.</p>
+
+<img src="../docs/browser_warning.png" alt="Chrome certificate warning">
+
+<p>This is normal, and you can safely bypass the warning by clicking &quot;Advanced -&gt; Proceed&quot;. Your browser is warning you that it cannot validate the identity of the server,
+    but if you are connecting directly to your device by IP address, then you can be sure that you are connecting to the correct server.
+</p>
+
+<p>If you want to use your own certificate, import the PFX file and assign it to the <b>Certificate</b> property of the Proxima Inspector component.
+</p>
+
+<h2 class="text-zinc-100 text-xl mt-5">Password Security</h2>
+
+<p>Proxima Inspector uses a password to authenticate your connection. If you type a password into the Proxima Inspector component, you will see this warning:</p>
+
+<img src="../docs/password-warning.png" alt="Password warning">
+
+<p>Unity assets, including your Proxima Inspector configuration <b>are not secured</b> and can be data mined by players easily. Instead of entering a password,
+    it is recommended to have a user interface in which the player can create a password for Proxima to use at runtime. Alternatively, you can
+    design an interface to display a random password on the screen.</p>
+
+<p>The Proxima package includes a Connect UI prefab that you can use. To use it:
+</p><ul class="list-decimal ml-5 leading-8"><li>Check <b>Instantiate Connect UI</b>.</li>
+    <li>Clear the <b>Password</b> field.</li>
+    <li>Uncheck <b>Run on Enable</b>. This will prevent Proxima from trying to start automatically.</li>
+    <li>Run the game and press Proxima logo <img class="w-[25px] ml-2 mr-2 inline" src="../icons/proxima_icon_32x32.png" alt=""> on the bottom-right to show and hide the Connect UI.</li></ul>
+
+<img src="../docs/connect-ui.png" alt="Proxima Connect UI"></div></div></div>
+</div>
+        <div class="h-[200px] flex flex-col"><p class="text-gray-400 m-10">© 2023 Virtual Maker Corporation</p></div></div></div>
+
+
+		
+	</div>
+	</body>
+</html>
diff --git a/Assets/Proxima/Documentation/docs/security.html.meta b/Assets/Proxima/Documentation/docs/security.html.meta
new file mode 100644
index 0000000..9a2665a
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/security.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: ff14e6eadcc72a9489ff77cdf43539c5
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/status-ui.png b/Assets/Proxima/Documentation/docs/status-ui.png
new file mode 100644
index 0000000..1144f24
Binary files /dev/null and b/Assets/Proxima/Documentation/docs/status-ui.png differ
diff --git a/Assets/Proxima/Documentation/docs/status-ui.png.meta b/Assets/Proxima/Documentation/docs/status-ui.png.meta
new file mode 100644
index 0000000..e2b4722
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/status-ui.png.meta
@@ -0,0 +1,98 @@
+fileFormatVersion: 2
+guid: a43070c5d120db04db1131b43874a843
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/supported_platforms.html b/Assets/Proxima/Documentation/docs/supported_platforms.html
new file mode 100644
index 0000000..936e056
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/supported_platforms.html
@@ -0,0 +1,244 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>Proxima Inspector</title>
+		<link rel="icon" href="../icons/favicon.ico" />
+		<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1">
+		<meta property="og:type" content="website">
+		<meta name="description" property="og:description" content="Proxima Inspector lets you connect to your live game from a web browser to inspect and edit any property. Just like the Unity editor!">
+		<meta name="image" property="og:image" content="../images/proxima-1200x630.png">
+		<meta http-equiv="content-security-policy" content="">
+		<link href="../_app/immutable/assets/_layout-1f0a7e97.css" rel="stylesheet">
+		<link href="../_app/immutable/assets/_layout-6847360b.css" rel="stylesheet">
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	</head>
+	<body>
+		<div>
+
+
+<div class="flex flex-col items-center text-gray-300 w-full min-h-screen bg-[#222]"><div class="flex w-full justify-center items-start bg-[#111] text-white fixed z-20"><div class="flex grow justify-between items-center max-w-[1600px] p-4"><a href="https://www.unityproxima.com"><img src="../images/proxima_logo.png" class="w-[150px]" alt="Logo"></a>
+            <button class="lg:hidden"><img class="w-10" src="../icons/menu.png" alt="Menu"></button>
+            <div class="flex gap-10 items-center max-lg:hidden">
+<a href="https://assetstore.unity.com/publishers/72095?aid=1101lqSYn" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Store</a>
+                
+<a href="https://app.unityproxima.com/connection" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Demo</a>
+                
+                <a class="text-xl font-logo" href="../docs.html">Docs</a>
+                
+<a href="https://discord.gg/VM9cWJ9rjH" class="" referrerpolicy="origin" target="_blank" rel="external"><img width="100px" class="mt-1" src="../icons/discord.png" alt=""></a></div></div>
+        </div>
+
+    <div class="pt-[83px] w-full h-full flex flex-col items-center"><div class="w-full flex flex-col items-start min-h-screen max-w-[1600px] px-4"><button class="text-white font-body pt-5 lg:hidden">Go to page &gt;</button>
+    <div class="flex w-full min-h-full relative"><div class="h-full fixed border-r-orange-400 bg-[#222] border-r-2 max-lg:hidden"><div class="flex pt-10 flex-col w-[300px] gap-2 border-[#21a6f0] min-h-0 h-full overflow-auto"><b class="text-orange-400">Getting Started</b>
+                <a href="../docs.html" class="svelte-yue6wq">Installation</a>
+                <a href="../docs/features.html" class="svelte-yue6wq">Feature Overview</a>
+
+                <b class="text-orange-400 mt-5">Connection</b>
+                <a href="../docs/supported_platforms.html" class="svelte-yue6wq">Supported Platforms</a>
+                <a href="../docs/connect.html" class="svelte-yue6wq">Connect to Your Game</a>
+                <a href="../docs/security.html" class="svelte-yue6wq">Security Considerations</a>
+                <a href="../docs/all_config.html" class="svelte-yue6wq">All Configuration Options</a>
+
+                <b class="text-orange-400 mt-5">Inspector</b>
+                <a href="../docs/inspector.html" class="svelte-yue6wq">GameObject Inspector</a>
+                <a href="../docs/buttons.html" class="svelte-yue6wq">Adding Buttons</a>
+                <a href="../docs/faq.html" class="svelte-yue6wq">Frequently Asked Questions</a>
+
+                <b class="text-orange-400 mt-5">Logs</b>
+                <a href="../docs/logs.html" class="svelte-yue6wq">Log Viewer</a>
+                <a href="../docs/viewing_logs_offline.html" class="svelte-yue6wq">Viewing Logs Offline</a>
+
+                <b class="text-orange-400 mt-5">Console</b>
+                <a href="../docs/console.html" class="svelte-yue6wq">Console Window</a>
+                <a href="../docs/console_built_in.html" class="svelte-yue6wq">Built-in Commands</a>
+                <a href="../docs/console_custom.html" class="svelte-yue6wq">Custom Commands</a>
+
+                <b class="text-orange-400 mt-5">Extras</b>
+                <a href="../docs/deeplinks.html" class="svelte-yue6wq">Deep Links</a>
+
+                <div class="h-[200px] shrink-0"></div></div></div>
+
+        
+        <div class="flex flex-col w-full lg:pl-10 py-10 lg:ml-[300px]"><div class="doc flex flex-col gap-5 svelte-yue6wq"><h1>Supported Platforms</h1>
+
+<p>Proxima Inspector works by running an HTTP and WebSocket server in your game, which you can connect to from a web browser.</p>
+
+<p>Proxima has been tested with different Unity versions on the following platforms. See the test matrix below.</p>
+
+<ul class="list-disc ml-10 flex flex-col gap-2"><li>Windows (Win32 and UWP)</li>
+    <li>OSX</li>
+    <li>Android (+Meta Quest)</li>
+    <li>iOS</li>
+    <li>WebGL</li></ul>
+
+<h2>Platform to Unity Version Test Results</h2>
+
+<div><table><tr class="font-bold"><th class="pb-2">Platform</th>
+            <th class="pb-2">API Compatibility</th>
+            <th class="pb-2">Scripting Backend</th>
+            <th class="pb-2">2019.4.13</th>
+            <th class="pb-2">2021.3.5</th>
+            <th class="pb-2">2022.2.3</th></tr>
+        <tr><td>Windows Editor</td>
+            <td>.NET Standard</td>
+            <td>N/A</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr>
+        <tr><td>Windows Editor</td>
+            <td>.NET Framework</td>
+            <td>N/A</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr>
+        <tr><td>Windows</td>
+            <td>.NET Standard</td>
+            <td>Mono</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr>
+        <tr><td>Windows</td>
+            <td>.NET Standard</td>
+            <td>IL2CPP</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr>
+        <tr><td>Windows</td>
+            <td>.NET Framework</td>
+            <td>Mono</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr>
+        <tr><td>Windows</td>
+            <td>.NET Framework</td>
+            <td>IL2CPP</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr>
+        <tr><td>OSX Editor</td>
+            <td>.NET Standard</td>
+            <td>N/A</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr>
+        <tr><td>OSX Editor</td>
+            <td>.NET Framework</td>
+            <td>N/A</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr>
+        <tr><td>OSX</td>
+            <td>.NET Standard</td>
+            <td>Mono</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr>
+        <tr><td>OSX</td>
+            <td>.NET Standard</td>
+            <td>IL2CPP</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr>
+        <tr><td>OSX</td>
+            <td>.NET Framework</td>
+            <td>Mono</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr>
+        <tr><td>OSX</td>
+            <td>.NET Framework</td>
+            <td>IL2CPP</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr>
+        <tr><td>Android [1]</td>
+            <td>.NET Standard</td>
+            <td>Mono</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr>
+        <tr><td>Android [1]</td>
+            <td>.NET Standard</td>
+            <td>IL2CPP</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr>
+        <tr><td>Android [1]</td>
+            <td>.NET Framework</td>
+            <td>Mono</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr>
+        <tr><td>Android [1]</td>
+            <td>.NET Framework</td>
+            <td>IL2CPP</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr>
+        <tr><td>iOS [1]</td>
+            <td>.NET Standard</td>
+            <td>IL2CPP</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr>
+        <tr><td>iOS [1]</td>
+            <td>.NET Framework</td>
+            <td>IL2CPP</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr>
+        <tr><td>UWP [2]</td>
+            <td>.NET Standard</td>
+            <td>IL2CPP</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr>
+        <tr><td>UWP [2]</td>
+            <td>.NET Framework</td>
+            <td>IL2CPP</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr>
+        <tr><td>WebGL [3]</td>
+            <td>.NET Standard</td>
+            <td>IL2CPP</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr>
+        <tr><td>WebGL [3]</td>
+            <td>.NET Framework</td>
+            <td>IL2CPP</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td>
+            <td class="bg-green-800 text-white">Pass</td></tr></table></div>
+
+<div class="bg-gray-800 p-5 text-zinc-300">[1] <b>Android</b> and <b>iOS</b> builds may require HTTPS to be enabled. Learn how to enable HTTPS on the <a href="../docs/security.html">Security Considerations</a> page.</div>
+
+<div class="bg-gray-800 p-5 text-zinc-300">[2] <b>UWP</b> apps need to enable InternetClientServer and PrivateNetworkClientServer capabilities in Player Settings > Publish Settings<br>
+    Loopback is disabled by default for UWP applications. See <a href="https://learn.microsoft.com/en-us/windows/uwp/communication/interprocess-communication#loopback" target="_blank" rel="noreferrer">https://learn.microsoft.com/en-us/windows/uwp/communication/interprocess-communication#loopback</a></div>
+
+<div class="bg-gray-800 p-5 text-zinc-300">[3] <b>WebGL</b> is supported as of version 1.2, but works differently than other platforms. Since a web browser cannot host a server.
+    Your app will communicate with Proxima using a <a href="https://developer.mozilla.org/en-US/docs/Web/API/BroadcastChannel" target="_blank" rel="noreferrer">BroadcastChannel</a> between windows in the browser. At the moment, it is not possible to connect to WebGL builds remotely.
+    <br><br>Ensure you deploy the StreamingAssets/Proxima directory with your WebGL build, which contains the Proxima inspector web app.
+</div>
+
+<div class="bg-gray-800 p-5 text-zinc-300">If you&#39;re having issues with your platform, please report issues on the <a href="https://discord.gg/VM9cWJ9rjH">Discord Server</a>.</div></div></div></div>
+</div>
+        <div class="h-[200px] flex flex-col"><p class="text-gray-400 m-10">© 2023 Virtual Maker Corporation</p></div></div></div>
+
+
+		
+	</div>
+	</body>
+</html>
diff --git a/Assets/Proxima/Documentation/docs/supported_platforms.html.meta b/Assets/Proxima/Documentation/docs/supported_platforms.html.meta
new file mode 100644
index 0000000..cfe6e58
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/supported_platforms.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 8be6fd4993b157444994cf1a979a101c
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/docs/viewing_logs_offline.html b/Assets/Proxima/Documentation/docs/viewing_logs_offline.html
new file mode 100644
index 0000000..1be9a81
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/viewing_logs_offline.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<title>Proxima Inspector</title>
+		<link rel="icon" href="../icons/favicon.ico" />
+		<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1">
+		<meta property="og:type" content="website">
+		<meta name="description" property="og:description" content="Proxima Inspector lets you connect to your live game from a web browser to inspect and edit any property. Just like the Unity editor!">
+		<meta name="image" property="og:image" content="../images/proxima-1200x630.png">
+		<meta http-equiv="content-security-policy" content="">
+		<link href="../_app/immutable/assets/_layout-1f0a7e97.css" rel="stylesheet">
+		<link href="../_app/immutable/assets/_layout-6847360b.css" rel="stylesheet">
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	</head>
+	<body>
+		<div>
+
+
+<div class="flex flex-col items-center text-gray-300 w-full min-h-screen bg-[#222]"><div class="flex w-full justify-center items-start bg-[#111] text-white fixed z-20"><div class="flex grow justify-between items-center max-w-[1600px] p-4"><a href="https://www.unityproxima.com"><img src="../images/proxima_logo.png" class="w-[150px]" alt="Logo"></a>
+            <button class="lg:hidden"><img class="w-10" src="../icons/menu.png" alt="Menu"></button>
+            <div class="flex gap-10 items-center max-lg:hidden">
+<a href="https://assetstore.unity.com/publishers/72095?aid=1101lqSYn" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Store</a>
+                
+<a href="https://app.unityproxima.com/connection" class="text-xl font-logo" referrerpolicy="origin" target="_blank" rel="external">Demo</a>
+                
+                <a class="text-xl font-logo" href="../docs.html">Docs</a>
+                
+<a href="https://discord.gg/VM9cWJ9rjH" class="" referrerpolicy="origin" target="_blank" rel="external"><img width="100px" class="mt-1" src="../icons/discord.png" alt=""></a></div></div>
+        </div>
+
+    <div class="pt-[83px] w-full h-full flex flex-col items-center"><div class="w-full flex flex-col items-start min-h-screen max-w-[1600px] px-4"><button class="text-white font-body pt-5 lg:hidden">Go to page &gt;</button>
+    <div class="flex w-full min-h-full relative"><div class="h-full fixed border-r-orange-400 bg-[#222] border-r-2 max-lg:hidden"><div class="flex pt-10 flex-col w-[300px] gap-2 border-[#21a6f0] min-h-0 h-full overflow-auto"><b class="text-orange-400">Getting Started</b>
+                <a href="../docs.html" class="svelte-yue6wq">Installation</a>
+                <a href="../docs/features.html" class="svelte-yue6wq">Feature Overview</a>
+
+                <b class="text-orange-400 mt-5">Connection</b>
+                <a href="../docs/supported_platforms.html" class="svelte-yue6wq">Supported Platforms</a>
+                <a href="../docs/connect.html" class="svelte-yue6wq">Connect to Your Game</a>
+                <a href="../docs/security.html" class="svelte-yue6wq">Security Considerations</a>
+                <a href="../docs/all_config.html" class="svelte-yue6wq">All Configuration Options</a>
+
+                <b class="text-orange-400 mt-5">Inspector</b>
+                <a href="../docs/inspector.html" class="svelte-yue6wq">GameObject Inspector</a>
+                <a href="../docs/buttons.html" class="svelte-yue6wq">Adding Buttons</a>
+                <a href="../docs/faq.html" class="svelte-yue6wq">Frequently Asked Questions</a>
+
+                <b class="text-orange-400 mt-5">Logs</b>
+                <a href="../docs/logs.html" class="svelte-yue6wq">Log Viewer</a>
+                <a href="../docs/viewing_logs_offline.html" class="svelte-yue6wq">Viewing Logs Offline</a>
+
+                <b class="text-orange-400 mt-5">Console</b>
+                <a href="../docs/console.html" class="svelte-yue6wq">Console Window</a>
+                <a href="../docs/console_built_in.html" class="svelte-yue6wq">Built-in Commands</a>
+                <a href="../docs/console_custom.html" class="svelte-yue6wq">Custom Commands</a>
+
+                <b class="text-orange-400 mt-5">Extras</b>
+                <a href="../docs/deeplinks.html" class="svelte-yue6wq">Deep Links</a>
+
+                <div class="h-[200px] shrink-0"></div></div></div>
+
+        
+        <div class="flex flex-col w-full lg:pl-10 py-10 lg:ml-[300px]"><div class="doc flex flex-col gap-5 svelte-yue6wq"><h1 class="mb-10">Viewing Logs Offline</h1>
+
+<p>Sometimes, it is impractical to debug issues live. Fortunately, Proxima provies a way to download your logs and view them later in your browser.</p>
+
+<h2 class="text-zinc-100 text-xl mt-5">Saving Logs</h2>
+
+<img src="../docs/log-controls.png" alt="Log Controls">
+
+<p>Clicking the <b>Save</b> dropdown reveals the following options:</p>
+
+<ul class="ml-5 list-disc leading-8"><li><b>Save Proxima Log</b>: saves the current log window contents.</li>
+    <li><b>Download Unity Log</b>: Downloads the standard Unity log file (if enabled).</li>
+    <li><b>Download Previous Unity Log</b>: Downloads the standard Unity log file (if enabled).</li></ul>
+
+<h2 class="text-zinc-100 text-xl mt-5">Viewing Log Files</h2>
+<p>If you have a Proxima connection open, you can easily view any log file by Proxima by clicking the <b>Load</b> button and selecting the file.
+</p>
+<div class="bg-gray-800 p-5 text-zinc-300">If you do  not have access to a device running Proxima, there&#39;s a no-cost online version of the Log Viewer at <a href="https://www.unityproxima.com">unityproxima.com/log</a>.<br><br>
+    <b>You do not need Proxima to use this viewer</b>, since it can parse any Unity log file. Support the project by sharing the availability of this complimentary tool with your network!
+</div>
+
+<h2 class="text-zinc-100 text-xl mt-5">Unity Log Files</h2>
+<p>If enabled, Unity saves two log files (a current and previous) to your device from the previous two runs that you can download by clicking &quot;Download Unity Log&quot; or &quot;Download Previous Unity Log&quot;. Learn how to configure
+these logs files on <a target="_blank" rel="noreferrer" href="https://docs.unity3d.com/Manual/LogFiles.html">Unity&#39;s Documentation</a>.</p>
+<p>Proxima can load these files, but they are missing the following information:</p>
+<ul class="ml-5 list-disc leading-8"><li>Unity&#39;s log files do not include the timestamp.</li>
+    <li>Unity&#39;s log files do not include the log type (info, warning, error). Proxima Log Viewer will do its best to detect the type of log from the stack trace, if enabled.</li></ul></div></div></div>
+</div>
+        <div class="h-[200px] flex flex-col"><p class="text-gray-400 m-10">© 2023 Virtual Maker Corporation</p></div></div></div>
+
+
+		
+	</div>
+	</body>
+</html>
diff --git a/Assets/Proxima/Documentation/docs/viewing_logs_offline.html.meta b/Assets/Proxima/Documentation/docs/viewing_logs_offline.html.meta
new file mode 100644
index 0000000..dcde51b
--- /dev/null
+++ b/Assets/Proxima/Documentation/docs/viewing_logs_offline.html.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 5c9b2406965117149b215540242658d0
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/fonts.meta b/Assets/Proxima/Documentation/fonts.meta
new file mode 100644
index 0000000..eb7a2f1
--- /dev/null
+++ b/Assets/Proxima/Documentation/fonts.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a20257740c4edae4e8f041fab6eda45d
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/fonts/S6uyw4BMUTPHjx4wXg.woff2 b/Assets/Proxima/Documentation/fonts/S6uyw4BMUTPHjx4wXg.woff2
new file mode 100644
index 0000000..ff60934
Binary files /dev/null and b/Assets/Proxima/Documentation/fonts/S6uyw4BMUTPHjx4wXg.woff2 differ
diff --git a/Assets/Proxima/Documentation/fonts/S6uyw4BMUTPHjx4wXg.woff2.meta b/Assets/Proxima/Documentation/fonts/S6uyw4BMUTPHjx4wXg.woff2.meta
new file mode 100644
index 0000000..d151e43
--- /dev/null
+++ b/Assets/Proxima/Documentation/fonts/S6uyw4BMUTPHjx4wXg.woff2.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: a065057dd605d614eabc28778c7351d1
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/fonts/S6uyw4BMUTPHjxAwXjeu.woff2 b/Assets/Proxima/Documentation/fonts/S6uyw4BMUTPHjxAwXjeu.woff2
new file mode 100644
index 0000000..edb9fa6
Binary files /dev/null and b/Assets/Proxima/Documentation/fonts/S6uyw4BMUTPHjxAwXjeu.woff2 differ
diff --git a/Assets/Proxima/Documentation/fonts/S6uyw4BMUTPHjxAwXjeu.woff2.meta b/Assets/Proxima/Documentation/fonts/S6uyw4BMUTPHjxAwXjeu.woff2.meta
new file mode 100644
index 0000000..adfd7bb
--- /dev/null
+++ b/Assets/Proxima/Documentation/fonts/S6uyw4BMUTPHjxAwXjeu.woff2.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 1679bafd2fb413a4da1ade76c5ee003c
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfp8uP.woff2 b/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfp8uP.woff2
new file mode 100644
index 0000000..06fe19f
Binary files /dev/null and b/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfp8uP.woff2 differ
diff --git a/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfp8uP.woff2.meta b/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfp8uP.woff2.meta
new file mode 100644
index 0000000..a4b86ce
--- /dev/null
+++ b/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfp8uP.woff2.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 60d0f14b7864c484f9c636bae1cb0f4f
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfpcuPP9g.woff2 b/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfpcuPP9g.woff2
new file mode 100644
index 0000000..ea62ab0
Binary files /dev/null and b/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfpcuPP9g.woff2 differ
diff --git a/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfpcuPP9g.woff2.meta b/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfpcuPP9g.woff2.meta
new file mode 100644
index 0000000..11ee076
--- /dev/null
+++ b/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfpcuPP9g.woff2.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: be3ef2326fe5c4c4a903f31b5a74ec40
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfqMuPP9g.woff2 b/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfqMuPP9g.woff2
new file mode 100644
index 0000000..31fe955
Binary files /dev/null and b/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfqMuPP9g.woff2 differ
diff --git a/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfqMuPP9g.woff2.meta b/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfqMuPP9g.woff2.meta
new file mode 100644
index 0000000..b4064a4
--- /dev/null
+++ b/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfqMuPP9g.woff2.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 41318e31369d9f04ea6fcca337249fa9
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfqcuPP9g.woff2 b/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfqcuPP9g.woff2
new file mode 100644
index 0000000..fa30e0b
Binary files /dev/null and b/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfqcuPP9g.woff2 differ
diff --git a/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfqcuPP9g.woff2.meta b/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfqcuPP9g.woff2.meta
new file mode 100644
index 0000000..14384cd
--- /dev/null
+++ b/Assets/Proxima/Documentation/fonts/w8gdH283Tvk__Lua32TysjIfqcuPP9g.woff2.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: a386a394812e3684d8b2b85e0f5bf43f
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/icons.meta b/Assets/Proxima/Documentation/icons.meta
new file mode 100644
index 0000000..6f7dc0f
--- /dev/null
+++ b/Assets/Proxima/Documentation/icons.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 295ce92b450e92e449db68e7d41ba181
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/icons/arrow.png b/Assets/Proxima/Documentation/icons/arrow.png
new file mode 100644
index 0000000..e4f0f6f
Binary files /dev/null and b/Assets/Proxima/Documentation/icons/arrow.png differ
diff --git a/Assets/Proxima/Documentation/icons/arrow.png.meta b/Assets/Proxima/Documentation/icons/arrow.png.meta
new file mode 100644
index 0000000..4ab33e5
--- /dev/null
+++ b/Assets/Proxima/Documentation/icons/arrow.png.meta
@@ -0,0 +1,98 @@
+fileFormatVersion: 2
+guid: 658f8cd9194dcdc418a571e983734c99
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/icons/discord.png b/Assets/Proxima/Documentation/icons/discord.png
new file mode 100644
index 0000000..3518047
Binary files /dev/null and b/Assets/Proxima/Documentation/icons/discord.png differ
diff --git a/Assets/Proxima/Documentation/icons/discord.png.meta b/Assets/Proxima/Documentation/icons/discord.png.meta
new file mode 100644
index 0000000..8cec63d
--- /dev/null
+++ b/Assets/Proxima/Documentation/icons/discord.png.meta
@@ -0,0 +1,98 @@
+fileFormatVersion: 2
+guid: ef8987d79a1a57c49810904c1334a1c2
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/icons/menu.png b/Assets/Proxima/Documentation/icons/menu.png
new file mode 100644
index 0000000..6c35db3
Binary files /dev/null and b/Assets/Proxima/Documentation/icons/menu.png differ
diff --git a/Assets/Proxima/Documentation/icons/menu.png.meta b/Assets/Proxima/Documentation/icons/menu.png.meta
new file mode 100644
index 0000000..0fc5142
--- /dev/null
+++ b/Assets/Proxima/Documentation/icons/menu.png.meta
@@ -0,0 +1,98 @@
+fileFormatVersion: 2
+guid: 0f3bffd932a3e1b4e875fa0bdbe4dd3f
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/icons/proxima_icon_32x32.png b/Assets/Proxima/Documentation/icons/proxima_icon_32x32.png
new file mode 100644
index 0000000..0e274fe
Binary files /dev/null and b/Assets/Proxima/Documentation/icons/proxima_icon_32x32.png differ
diff --git a/Assets/Proxima/Documentation/icons/proxima_icon_32x32.png.meta b/Assets/Proxima/Documentation/icons/proxima_icon_32x32.png.meta
new file mode 100644
index 0000000..9bd11da
--- /dev/null
+++ b/Assets/Proxima/Documentation/icons/proxima_icon_32x32.png.meta
@@ -0,0 +1,98 @@
+fileFormatVersion: 2
+guid: dc7068221cf34f149ab30e7b4e3f7566
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/images.meta b/Assets/Proxima/Documentation/images.meta
new file mode 100644
index 0000000..7181190
--- /dev/null
+++ b/Assets/Proxima/Documentation/images.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9c4da0d5e73af204382380f900628c56
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/images/proxima-1200x630.png b/Assets/Proxima/Documentation/images/proxima-1200x630.png
new file mode 100644
index 0000000..a3d07e4
Binary files /dev/null and b/Assets/Proxima/Documentation/images/proxima-1200x630.png differ
diff --git a/Assets/Proxima/Documentation/images/proxima-1200x630.png.meta b/Assets/Proxima/Documentation/images/proxima-1200x630.png.meta
new file mode 100644
index 0000000..1451894
--- /dev/null
+++ b/Assets/Proxima/Documentation/images/proxima-1200x630.png.meta
@@ -0,0 +1,92 @@
+fileFormatVersion: 2
+guid: 4375202eac2734388b077d0bd92995d4
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: -1
+    aniso: -1
+    mipBias: -100
+    wrapU: -1
+    wrapV: -1
+    wrapW: -1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Documentation/images/proxima_logo.png b/Assets/Proxima/Documentation/images/proxima_logo.png
new file mode 100644
index 0000000..ec7e00e
Binary files /dev/null and b/Assets/Proxima/Documentation/images/proxima_logo.png differ
diff --git a/Assets/Proxima/Documentation/images/proxima_logo.png.meta b/Assets/Proxima/Documentation/images/proxima_logo.png.meta
new file mode 100644
index 0000000..9cdd6f4
--- /dev/null
+++ b/Assets/Proxima/Documentation/images/proxima_logo.png.meta
@@ -0,0 +1,98 @@
+fileFormatVersion: 2
+guid: 189924640337d194095f06e2a09525ec
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Editor.meta b/Assets/Proxima/Editor.meta
new file mode 100644
index 0000000..06b004c
--- /dev/null
+++ b/Assets/Proxima/Editor.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 59a29e6d999c4bc4e8b634d54ba0e792
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Editor/PfxImporter.cs b/Assets/Proxima/Editor/PfxImporter.cs
new file mode 100644
index 0000000..139749d
--- /dev/null
+++ b/Assets/Proxima/Editor/PfxImporter.cs
@@ -0,0 +1,22 @@
+using UnityEngine;
+using UnityEditor.AssetImporters;
+using System.IO;
+
+#if !UNITY_2022_1_OR_NEWER
+    using UnityEditor.Experimental.AssetImporters;
+#endif
+
+namespace Proxima.Editor
+{
+    [ScriptedImporter(1, "pfx")]
+    internal class PfxImporter : ScriptedImporter
+    {
+        public override void OnImportAsset(AssetImportContext ctx)
+        {
+            var asset = ScriptableObject.CreateInstance<PfxAsset>();
+            asset.Bytes = File.ReadAllBytes(ctx.assetPath);
+            ctx.AddObjectToAsset("main obj", asset);
+            ctx.SetMainObject(asset);
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Editor/PfxImporter.cs.meta b/Assets/Proxima/Editor/PfxImporter.cs.meta
new file mode 100644
index 0000000..8ea2590
--- /dev/null
+++ b/Assets/Proxima/Editor/PfxImporter.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 1f0da27eff826494b99f5e680d9acda9
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Editor/ProxiaWebGLBuildStep.cs b/Assets/Proxima/Editor/ProxiaWebGLBuildStep.cs
new file mode 100644
index 0000000..e27abef
--- /dev/null
+++ b/Assets/Proxima/Editor/ProxiaWebGLBuildStep.cs
@@ -0,0 +1,36 @@
+using System.IO;
+using UnityEditor;
+using UnityEditor.Build;
+using UnityEditor.Build.Reporting;
+using UnityEngine;
+
+namespace Proxima
+{
+    public class ProxiaWebGLBuildStep : IPostprocessBuildWithReport
+    {
+        public int callbackOrder { get { return 0; } }
+
+        public void OnPostprocessBuild(BuildReport report)
+        {
+            if (report.summary.platform == BuildTarget.WebGL)
+            {
+                var staticFiles = Resources.Load<ProximaStatic>("Proxima/web");
+                string destinationPath = Path.Combine(report.summary.outputPath, "StreamingAssets", "proxima");
+
+                if (Directory.Exists(destinationPath))
+                {
+                    Directory.Delete(destinationPath, true);
+                }
+
+                foreach (var file in staticFiles.Files)
+                {
+                    if (file.Path.EndsWith("/")) continue;
+                    var filePath = Path.Combine(destinationPath, file.Path);
+                    var dirPath = Path.GetDirectoryName(filePath);
+                    Directory.CreateDirectory(dirPath);
+                    File.WriteAllBytes(filePath, file.Bytes);
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Editor/ProxiaWebGLBuildStep.cs.meta b/Assets/Proxima/Editor/ProxiaWebGLBuildStep.cs.meta
new file mode 100644
index 0000000..c29c782
--- /dev/null
+++ b/Assets/Proxima/Editor/ProxiaWebGLBuildStep.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 010050a2d18c3794e8e2eecb897114c0
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Editor/Proxima.Editor.asmdef b/Assets/Proxima/Editor/Proxima.Editor.asmdef
new file mode 100644
index 0000000..33655fa
--- /dev/null
+++ b/Assets/Proxima/Editor/Proxima.Editor.asmdef
@@ -0,0 +1,29 @@
+{
+    "name": "Proxima.Editor",
+    "rootNamespace": "",
+    "references": [
+        "Proxima"
+    ],
+    "includePlatforms": [
+        "Editor"
+    ],
+    "excludePlatforms": [],
+    "allowUnsafeCode": false,
+    "overrideReferences": true,
+    "precompiledReferences": [],
+    "autoReferenced": true,
+    "defineConstraints": [],
+    "versionDefines": [
+        {
+            "name": "com.unity.modules.unitywebrequest",
+            "expression": "",
+            "define": "UNITY_WEB_REQUEST"
+        },
+        {
+            "name": "com.unity.xr.management",
+            "expression": "",
+            "define": "UNITY_XR_MANAGEMENT"
+        }
+    ],
+    "noEngineReferences": false
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Editor/Proxima.Editor.asmdef.meta b/Assets/Proxima/Editor/Proxima.Editor.asmdef.meta
new file mode 100644
index 0000000..7b40f2b
--- /dev/null
+++ b/Assets/Proxima/Editor/Proxima.Editor.asmdef.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d9a53cfb75d04be4bba086eb50ffed06
+AssemblyDefinitionImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Editor/ProximaCodeGen.cs b/Assets/Proxima/Editor/ProximaCodeGen.cs
new file mode 100644
index 0000000..f08aec5
--- /dev/null
+++ b/Assets/Proxima/Editor/ProximaCodeGen.cs
@@ -0,0 +1,171 @@
+// Enable this to add editor menu items that can generate
+// ProximaReflection.Generated.cs based on the contents of UnityComponents.json.
+#if false
+
+using System;
+using System.Linq;
+using System.Collections.Generic;
+using UnityEditor;
+using UnityEngine;
+using System.Reflection;
+
+namespace Proxima
+{
+    internal static class ProximaCodeGen
+    {
+        private static Dictionary<string, string[]> GetUnityComponents()
+        {
+            var components = new Dictionary<string, string[]>();
+            var json = AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/Proxima/Runtime/UnityComponents.json");
+            var jsonText = json.text.Replace(" ", "").Replace("\r", "").Replace("\t", "").Replace("\n", "");
+            var index = 0;
+            while (true)
+            {
+                var q1 = jsonText.IndexOf('"', index);
+                var q2 = jsonText.IndexOf('"', q1 + 1);
+                var a1 = jsonText.IndexOf('[', q2 + 1);
+                var a2 = jsonText.IndexOf(']', a1 + 1);
+
+                if (q1 == -1 || q2 == -1 || a1 == -1 || a2 == -1)
+                {
+                    break;
+                }
+
+                var name = jsonText.Substring(q1 + 1, q2 - q1 - 1);
+                var properties = jsonText.Substring(a1 + 1, a2 - a1 - 1).Split(',').Select(x => x.Trim('"')).ToArray();
+                components.Add(name, properties);
+                index = a2 + 1;
+            }
+
+            return components;
+        }
+
+        private static Type GetType(string name)
+        {
+            foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
+            {
+                foreach (var type in a.GetTypes())
+                {
+                    if (type.IsSubclassOf(typeof(UnityEngine.Component)) &&
+                        (type.FullName == name || type.FullName.EndsWith("." + name)))
+                    {
+                        return type;
+                    }
+                }
+            }
+
+            throw new Exception("Unknown Type: " + name);
+        }
+
+        private static string GeneratePropertyInfo(Type componentType, string prop, string name)
+        {
+            string define = null;
+            var split = prop.Split(':');
+            if (split.Length > 1)
+            {
+                define = split[0];
+                prop = split[1];
+            }
+
+            var s = "";
+            if (define != null)
+            {
+                s += $"            #if {define}" + System.Environment.NewLine;
+            }
+
+            Debug.Log($"Generating {prop} for {name}");
+            var propertyInfo = componentType.GetProperty(prop);
+            var fieldInfo = componentType.GetField(prop);
+            var propertyType = propertyInfo?.PropertyType ?? fieldInfo.FieldType;
+            var propertyTypeName = propertyType.FullName;
+            if (propertyType.IsGenericType)
+            {
+                Type genericType = propertyType.GetGenericTypeDefinition();
+                string typeArgument = propertyType.GetGenericArguments()[0].FullName;
+                propertyTypeName = genericType.FullName.Split('`')[0] + "<" + typeArgument + ">";
+            }
+
+            propertyTypeName = propertyTypeName.Replace("+", ".");
+
+            s += $"                new UnityProperty {{ Name = \"{prop}\", PropertyType = typeof({propertyTypeName}), Setter = (o, v) => (({name})o).{prop} = ({propertyTypeName})v, Getter = (o) => (({name})o).{prop}, ";
+
+            if (propertyType.IsEnum)
+            {
+                s += $"Updater = (object o, ref object v) => {{ var x = (int)(({name})o).{prop}; if (!x.Equals((int)v)) {{ v = x; return true; }} return false; }} ";
+            }
+            else if (propertyType.IsValueType)
+            {
+                s += $"Updater = (object o, ref object v) => {{ var x = (({name})o).{prop}; if (!x.Equals(({propertyTypeName})v)) {{ v = x; return true; }} return false; }} ";
+            }
+            else if (prop == "sharedMaterials") // Unity always returns a copy, so we only care if the size changes.
+            {
+                s += $"Updater = (object o, ref object v) => {{ var x = (({name})o).{prop}; if (x.Length != (({propertyTypeName})v).Length) {{ v = x; return true; }} else {{ v = x; return false; }}}} ";
+            }
+
+            s += "}," + System.Environment.NewLine;
+
+            if (define != null)
+            {
+                s +=  $"            #endif" + System.Environment.NewLine;
+            }
+            return s;
+        }
+
+        [MenuItem("Proxima/Generate Reflection File")]
+        private static void GenerateReflectionFile()
+        {
+            var preserveTemplate = AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/Proxima/Runtime/Generated/ProximaReflection.Template.cs");
+            var text = preserveTemplate.text;
+            var components = GetUnityComponents();
+
+            var code = string.Join(System.Environment.NewLine + System.Environment.NewLine,
+                components.Select(kv => {
+                    var name = kv.Key;
+                    var split = name.Split(':');
+                    string define = null;
+                    if (split.Length > 1)
+                    {
+                        define = split[0];
+                        name = split[1];
+                    }
+
+                    var s = "";
+                    if (define != null)
+                    {
+                        s += $"        #if {define}" + System.Environment.NewLine;
+                    }
+
+                    var componentType = GetType(name);
+                    s += $"            {{ \"{componentType.FullName}\", new UnityProperty[] {{" + System.Environment.NewLine;
+                    var enabled = componentType.GetProperty("enabled");
+                    foreach (var prop in kv.Value)
+                    {
+                        if (prop.EndsWith(":enabled")) enabled = null; // Enabled added in some version
+                        s += GeneratePropertyInfo(componentType, prop, name);
+                    }
+
+                    if (enabled != null)
+                    {
+                        s += GeneratePropertyInfo(componentType, "enabled", name);
+                    }
+
+                    s += "            }}," + System.Environment.NewLine;
+
+                    if (define != null)
+                    {
+                        s += $"        #endif" + System.Environment.NewLine;
+                    }
+
+                    return s;
+                }));
+
+            text = text.Replace("_Template", "_Generated");
+            text = text.Replace("            // <Auto-generated>" + System.Environment.NewLine, code);
+            var preservePath = "Assets/Proxima/Runtime/Generated/ProximaReflection.Generated.cs";
+            System.IO.File.WriteAllText(preservePath, text);
+            AssetDatabase.Refresh();
+        }
+    }
+}
+
+#endif
\ No newline at end of file
diff --git a/Assets/Proxima/Editor/ProximaCodeGen.cs.meta b/Assets/Proxima/Editor/ProximaCodeGen.cs.meta
new file mode 100644
index 0000000..0366ce5
--- /dev/null
+++ b/Assets/Proxima/Editor/ProximaCodeGen.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 39ebdb5539d4c48449766b47ac62b913
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Editor/ProximaInspectorEditor.cs b/Assets/Proxima/Editor/ProximaInspectorEditor.cs
new file mode 100644
index 0000000..f78e663
--- /dev/null
+++ b/Assets/Proxima/Editor/ProximaInspectorEditor.cs
@@ -0,0 +1,105 @@
+// #define DISABLE_REMOTE
+
+using System;
+using System.Linq;
+using UnityEngine;
+using UnityEditor;
+
+namespace Proxima.Editor
+{
+    [CustomEditor(typeof(ProximaInspector))]
+    internal class ProximaInspectorEditor : UnityEditor.Editor
+    {
+        private SerializedProperty _serverType;
+        private SerializedProperty _serverUrl;
+        private SerializedProperty _port;
+        private SerializedProperty _password;
+        private SerializedProperty _displayName;
+        private SerializedProperty _useHttps;
+        private SerializedProperty _certificate;
+        private SerializedProperty _certificatePassword;
+        private SerializedProperty _runOnEnable;
+        private SerializedProperty _logBufferSize;
+        private SerializedProperty _instantiateStatusUI;
+        private SerializedProperty _instantiateConnectUI;
+        private SerializedProperty _dontDestroyOnLoad;
+        private SerializedProperty _setRunInBackground;
+        private bool _remoteAvailable;
+
+        void OnEnable()
+        {
+            _serverType = serializedObject.FindProperty("_serverType");
+            _serverUrl = serializedObject.FindProperty("_serverUrl");
+            _port = serializedObject.FindProperty("_port");
+            _displayName = serializedObject.FindProperty("_displayName");
+            _password = serializedObject.FindProperty("_password");
+            _useHttps = serializedObject.FindProperty("_useHttps");
+            _certificate = serializedObject.FindProperty("_certificate");
+            _certificatePassword = serializedObject.FindProperty("_certificatePassword");
+            _runOnEnable = serializedObject.FindProperty("_runOnEnable");
+            _logBufferSize = serializedObject.FindProperty("_logBufferSize");
+            _instantiateStatusUI = serializedObject.FindProperty("_instantiateStatusUI");
+            _instantiateConnectUI = serializedObject.FindProperty("_instantiateConnectUI");
+            _dontDestroyOnLoad = serializedObject.FindProperty("_dontDestroyOnLoad");
+            _setRunInBackground = serializedObject.FindProperty("_setRunInBackground");
+
+            #if !DISABLE_REMOTE
+                _remoteAvailable = AppDomain.CurrentDomain.GetAssemblies().First(
+                    assembly => assembly.GetName().Name == "Proxima").GetType("Proxima.ProximaRemoteServer") != null;
+            #endif
+        }
+
+        public override void OnInspectorGUI()
+        {
+            serializedObject.Update();
+
+            EditorGUILayout.PropertyField(_displayName);
+
+            if (_remoteAvailable)
+            {
+                EditorGUILayout.PropertyField(_serverType);
+                if (_serverType.enumValueIndex == (int)ProximaInspector.ServerTypes.Remote)
+                {
+                    EditorGUILayout.PropertyField(_serverUrl);
+                }
+            }
+
+            if (!_remoteAvailable || _serverType.enumValueIndex == (int)ProximaInspector.ServerTypes.Embedded)
+            {
+                EditorGUILayout.PropertyField(_port);
+                EditorGUILayout.PropertyField(_useHttps);
+                if (_useHttps.boolValue)
+                {
+                    EditorGUILayout.PropertyField(_certificate, new GUIContent("    Certificate"));
+                    if (_certificate.objectReferenceValue != null)
+                    {
+                        EditorGUILayout.PropertyField(_certificatePassword, new GUIContent("    Certificate Password"));
+                        if (!string.IsNullOrWhiteSpace(_certificatePassword.stringValue))
+                        {
+                            EditorGUILayout.HelpBox("Setting a password here is not recommended. " +
+                                "Create UI for the player to set the password, and then call ProximaInspector.Run(). See the ProximaConnectUI prefab.",
+                                MessageType.Warning);
+                        }
+                    }
+                }
+            }
+
+            EditorGUILayout.PropertyField(_password);
+            if (!Application.isPlaying && !string.IsNullOrWhiteSpace(_password.stringValue))
+            {
+                EditorGUILayout.HelpBox("Setting a password here is not recommended. " +
+                    "Create UI for the player to set the password, and then call ProximaInspector.Run(). See the ProximaConnectUI prefab.",
+                    MessageType.Warning);
+            }
+
+            EditorGUILayout.PropertyField(_runOnEnable);
+            EditorGUILayout.PropertyField(_logBufferSize);
+            EditorGUILayout.PropertyField(_instantiateStatusUI);
+            EditorGUILayout.PropertyField(_instantiateConnectUI);
+            EditorGUILayout.PropertyField(_dontDestroyOnLoad);
+            EditorGUILayout.PropertyField(_setRunInBackground);
+
+            serializedObject.ApplyModifiedProperties();
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Editor/ProximaInspectorEditor.cs.meta b/Assets/Proxima/Editor/ProximaInspectorEditor.cs.meta
new file mode 100644
index 0000000..3153e3f
--- /dev/null
+++ b/Assets/Proxima/Editor/ProximaInspectorEditor.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 67056c62379d7d2459900cf537f23666
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Editor/ProximaMenu.cs b/Assets/Proxima/Editor/ProximaMenu.cs
new file mode 100644
index 0000000..a70d961
--- /dev/null
+++ b/Assets/Proxima/Editor/ProximaMenu.cs
@@ -0,0 +1,359 @@
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+using UnityEditor;
+using System.Text.RegularExpressions;
+
+namespace Proxima.Editor
+{
+    [InitializeOnLoad]
+    internal class ProximaMenu : EditorWindow
+    {
+        private static readonly string _website = "https://www.unityproxima.com?utm_source=pxmenu";
+        public static readonly string StoreLink = "https://assetstore.unity.com/packages/tools/utilities/proxima-inspector-244788?aid=1101lqSYn";
+        private static readonly string _review = "https://assetstore.unity.com/packages/tools/utilities/proxima-inspector-244788#reviews";
+        private static readonly string _discord = "https://discord.gg/VM9cWJ9rjH";
+        private static readonly string _docs = "https://www.unityproxima.com/docs?utm_source=pxmenu";
+        private static readonly string _flexalon = "https://www.flexalon.com?utm_source=pxmenu";
+
+        private static readonly string _showOnStartKey = "ProximaMenu_ShowOnStart";
+        private static readonly string _versionKey = "ProximaMenu_Version";
+
+        private bool _allFeaturesInstalled = false;
+
+        private GUIStyle _errorStyle;
+        private GUIStyle _buttonStyle;
+        private GUIStyle _bodyStyle;
+        private GUIStyle _versionStyle;
+        private GUIStyle _boldStyle;
+        private GUIStyle _semiboldStyle;
+        private GUIStyle _flexalonButtonStyle;
+        private GUIStyle _proStyle;
+
+        private static ShowOnStart _showOnStart;
+        private static readonly string[] _showOnStartOptions = {
+            "Always", "On Update", "Never"
+        };
+
+        private Vector2 _scrollPosition;
+
+        private List<string> _changelog = new List<string>();
+
+        private enum ShowOnStart
+        {
+            Always,
+            OnUpdate,
+            Never
+        }
+
+        static ProximaMenu()
+        {
+            EditorApplication.update += OnEditorUpdate;
+        }
+
+        private static void OnEditorUpdate()
+        {
+            EditorApplication.update -= OnEditorUpdate;
+            Initialize();
+        }
+
+        internal static void Initialize()
+        {
+            var shownKey = "ProximaMenuShown";
+            bool alreadyShown = SessionState.GetBool(shownKey, false);
+            SessionState.SetBool(shownKey, true);
+
+            var version = WindowUtil.GetVersion();
+            var lastVersion = EditorPrefs.GetString(_versionKey, "0.0.0");
+            var newVersion = version.CompareTo(lastVersion) > 0;
+            if (newVersion)
+            {
+                EditorPrefs.SetString(_versionKey, version);
+                alreadyShown = false;
+            }
+
+            _showOnStart = (ShowOnStart)EditorPrefs.GetInt(_showOnStartKey, 0);
+            bool showPref = _showOnStart == ShowOnStart.Always ||
+                (_showOnStart == ShowOnStart.OnUpdate && newVersion);
+            if (!EditorApplication.isPlayingOrWillChangePlaymode && !alreadyShown && showPref && !Application.isBatchMode)
+            {
+                StartScreen();
+            }
+
+            if (!EditorApplication.isPlayingOrWillChangePlaymode && ProximaSurvey.ShouldAsk())
+            {
+                ProximaSurvey.ShowSurvey();
+            }
+        }
+
+        [MenuItem("Tools/Proxima/Start Screen")]
+        public static void StartScreen()
+        {
+            ProximaMenu window = GetWindow<ProximaMenu>(true, "Proxima Start Screen", true);
+            window.minSize = new Vector2(800, 600);
+            window.maxSize = window.minSize;
+            window.Show();
+        }
+
+        [MenuItem("Tools/Proxima/Website")]
+        public static void OpenStore()
+        {
+            Application.OpenURL(_website);
+        }
+
+        [MenuItem("Tools/Proxima/Write a Review")]
+        public static void OpenReview()
+        {
+            Application.OpenURL(_review);
+        }
+
+        [MenuItem("Tools/Proxima/Support (Discord)")]
+        public static void OpenSupport()
+        {
+            Application.OpenURL(_discord);
+        }
+
+        private void InitStyles()
+        {
+            if (_bodyStyle != null) return;
+
+            _bodyStyle = new GUIStyle(EditorStyles.label);
+            _bodyStyle.wordWrap = true;
+            _bodyStyle.fontSize = 14;
+            _bodyStyle.margin.left = 10;
+            _bodyStyle.margin.top = 10;
+            _bodyStyle.stretchWidth = false;
+            _bodyStyle.richText = true;
+
+            _boldStyle = new GUIStyle(_bodyStyle);
+            _boldStyle.fontStyle = FontStyle.Bold;
+            _boldStyle.fontSize = 16;
+
+            _semiboldStyle = new GUIStyle(_bodyStyle);
+            _semiboldStyle.fontStyle = FontStyle.Bold;
+
+            _errorStyle = new GUIStyle(_bodyStyle);
+            _errorStyle.fontStyle = FontStyle.Bold;
+            _errorStyle.margin.top = 10;
+            _errorStyle.normal.textColor = new Color(1, 0.2f, 0);
+
+            _buttonStyle = new GUIStyle(_bodyStyle);
+            _buttonStyle.fontSize = 14;
+            _buttonStyle.margin.bottom = 5;
+            _buttonStyle.padding.top = 5;
+            _buttonStyle.padding.left = 10;
+            _buttonStyle.padding.right = 10;
+            _buttonStyle.padding.bottom = 5;
+            _buttonStyle.hover.background = Texture2D.grayTexture;
+            _buttonStyle.hover.textColor = Color.white;
+            _buttonStyle.active.background = Texture2D.grayTexture;
+            _buttonStyle.active.textColor = Color.white;
+            _buttonStyle.focused.background = Texture2D.grayTexture;
+            _buttonStyle.focused.textColor = Color.white;
+            _buttonStyle.normal.background = Texture2D.grayTexture;
+            _buttonStyle.normal.textColor = Color.white;
+            _buttonStyle.wordWrap = false;
+            _buttonStyle.stretchWidth = false;
+
+            _versionStyle = new GUIStyle(EditorStyles.label);
+            _versionStyle.padding.right = 10;
+
+            _flexalonButtonStyle = new GUIStyle(_buttonStyle);
+            _flexalonButtonStyle.normal.background = Texture2D.blackTexture;
+            _flexalonButtonStyle.hover.background = Texture2D.blackTexture;
+            _flexalonButtonStyle.focused.background = Texture2D.blackTexture;
+            _flexalonButtonStyle.active.background = Texture2D.blackTexture;
+            _flexalonButtonStyle.padding.left = 0;
+            _flexalonButtonStyle.padding.right = 0;
+            _flexalonButtonStyle.padding.bottom = 0;
+            _flexalonButtonStyle.padding.top = 0;
+            _flexalonButtonStyle.margin.bottom = 10;
+
+            _proStyle = new GUIStyle(_buttonStyle);
+            _proStyle.normal.background = new Texture2D(1, 1);
+            _proStyle.normal.background.SetPixel(0, 0, new Color(.94f, .42f, .13f));
+            _proStyle.normal.background.Apply();
+            _proStyle.hover.background = _proStyle.normal.background;
+            _proStyle.focused.background = _proStyle.normal.background;
+            _proStyle.active.background = _proStyle.normal.background;
+            _proStyle.normal.textColor = Color.white;
+            _proStyle.fontStyle = FontStyle.Bold;
+
+            WindowUtil.CenterOnEditor(this);
+
+            ReadChangeLog();
+
+            _allFeaturesInstalled = ProximaFeatures.AllFeaturesInstalled();
+        }
+
+        private void ReadChangeLog()
+        {
+            _changelog.Clear();
+            var changelogPath = AssetDatabase.GUIDToAssetPath("53c7cf36ddcf17b4da75df27231f866e");
+            var changelogAsset = AssetDatabase.LoadAssetAtPath<TextAsset>(changelogPath);
+            _changelog = changelogAsset.text.Split('\n')
+                .Select(x => Regex.Replace(x.TrimEnd(), @"\*\*(.*?)\*\*", "<b>$1</b>"))
+                .Where(x => !string.IsNullOrEmpty(x))
+                .ToList();
+            var start = _changelog.FindIndex(l => l.StartsWith("## "));
+            _changelog = _changelog.GetRange(start, _changelog.Count - start);
+        }
+
+        private void LinkButton(string label, string url, GUIStyle style = null, int width = 170)
+        {
+            if (style == null) style = _buttonStyle;
+            var labelContent = new GUIContent(label);
+            var position = GUILayoutUtility.GetRect(width, 35, style);
+            EditorGUIUtility.AddCursorRect(position, MouseCursor.Link);
+            if (GUI.Button(position, labelContent, style))
+            {
+                Application.OpenURL(url);
+            }
+        }
+
+        private bool Button(string label, GUIStyle style = null, int width = 170)
+        {
+            if (style == null) style = _buttonStyle;
+            var labelContent = new GUIContent(label);
+            var position = GUILayoutUtility.GetRect(width, 35, style);
+            EditorGUIUtility.AddCursorRect(position, MouseCursor.Link);
+            return GUI.Button(position, labelContent, style);
+        }
+
+        private void Bullet(string text)
+        {
+            var ws = 1 + text.IndexOf('-');
+            EditorGUILayout.BeginHorizontal();
+            for (int i = 0; i < ws; i++)
+            {
+                GUILayout.Space(10);
+            }
+            GUILayout.Label("•", _bodyStyle);
+
+            GUILayout.Label(text.Substring(ws + 1), _bodyStyle, GUILayout.ExpandWidth(true));
+
+            EditorGUILayout.EndHorizontal();
+        }
+
+        private void WhatsNew()
+        {
+            EditorGUILayout.Space();
+            EditorGUILayout.Space();
+            GUILayout.Label("What's New in Proxima", _boldStyle);
+            EditorGUILayout.Space();
+
+            for (int i = 0; i < _changelog.Count; i++)
+            {
+                var line = _changelog[i];
+                if (line.StartsWith("###"))
+                {
+                    EditorGUILayout.Space();
+                    GUILayout.Label(line.Substring(4), _semiboldStyle);
+                    EditorGUILayout.Space();
+                }
+                else if (line.StartsWith("##"))
+                {
+                    EditorGUILayout.Space();
+                    GUILayout.Label(line.Substring(3), _boldStyle);
+                    EditorGUILayout.Space();
+                }
+                else
+                {
+                    Bullet(line);
+                    EditorGUILayout.Space();
+                }
+            }
+
+            EditorGUILayout.Space();
+        }
+
+        private void OnGUI()
+        {
+            InitStyles();
+
+            GUILayout.BeginHorizontal("In BigTitle", GUILayout.ExpandWidth(true));
+            {
+                WindowUtil.DrawProximaIcon(128);
+                GUILayout.FlexibleSpace();
+                GUILayout.Label("Version: " + WindowUtil.GetVersion(), _versionStyle, GUILayout.ExpandHeight(true));
+            }
+            GUILayout.EndHorizontal();
+
+            GUILayout.BeginHorizontal(GUILayout.ExpandHeight(true));
+            {
+                GUILayout.BeginVertical();
+                {
+                    GUILayout.Label("Resources", _boldStyle);
+                    LinkButton("Discord Invite", _discord);
+                    LinkButton("Documentation", _docs);
+                    LinkButton("Write a Review", _review);
+                    if (!_allFeaturesInstalled)
+                    {
+                        LinkButton("Upgrade to Pro", _website, _proStyle);
+                    }
+
+                    if (!ProximaSurvey.Completed)
+                    {
+                        if (Button("Feedback"))
+                        {
+                            ProximaSurvey.ShowSurvey();
+                        }
+                    }
+
+                    GUILayout.FlexibleSpace();
+                    GUILayout.Label("More Tools", _boldStyle);
+                    if (WindowUtil.DrawFlexalonButton(128, _flexalonButtonStyle))
+                    {
+                        Application.OpenURL(_flexalon);
+                    }
+
+                    EditorGUIUtility.AddCursorRect(GUILayoutUtility.GetLastRect(), MouseCursor.Link);
+                }
+                GUILayout.EndVertical();
+
+                EditorGUILayout.Separator();
+
+                GUILayout.BeginVertical();
+                {
+                    _scrollPosition = GUILayout.BeginScrollView(_scrollPosition);
+
+                    GUILayout.Label("Thank you for using Proxima Inspector!", _boldStyle);
+
+                    EditorGUILayout.Space();
+
+                    GUILayout.Label("You're invited to join the Discord community for support and feedback. Let me know how to make Proxima better for you!", _bodyStyle);
+
+                    EditorGUILayout.Space();
+                    EditorGUILayout.Space();
+                    GUILayout.BeginVertical(EditorStyles.helpBox);
+                    {
+                        GUILayout.Label("If you enjoy Proxima, please consider writing a review. It helps a ton!", _bodyStyle);
+                        EditorGUILayout.Space();
+                    }
+                    GUILayout.EndVertical();
+
+                    WhatsNew();
+
+                    EditorGUILayout.EndScrollView();
+                }
+                GUILayout.EndVertical();
+                EditorGUILayout.Space();
+            }
+            GUILayout.EndHorizontal();
+
+            GUILayout.BeginHorizontal("In BigTitle", GUILayout.ExpandHeight(true));
+            {
+                GUILayout.Label("Tools/Proxima/Start Screen");
+                GUILayout.FlexibleSpace();
+                GUILayout.Label("Show On Start: ");
+                var newShowOnStart = (ShowOnStart)EditorGUILayout.Popup((int)_showOnStart, _showOnStartOptions);
+                if (_showOnStart != newShowOnStart)
+                {
+                    _showOnStart = newShowOnStart;
+                    EditorPrefs.SetInt(_showOnStartKey, (int)_showOnStart);
+                }
+            }
+            GUILayout.EndHorizontal();
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Editor/ProximaMenu.cs.meta b/Assets/Proxima/Editor/ProximaMenu.cs.meta
new file mode 100644
index 0000000..b3efcba
--- /dev/null
+++ b/Assets/Proxima/Editor/ProximaMenu.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0adebfc0bc2e0894cb1c428bc9e0901b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Editor/ProximaStaticImporter.cs b/Assets/Proxima/Editor/ProximaStaticImporter.cs
new file mode 100644
index 0000000..cc03d7e
--- /dev/null
+++ b/Assets/Proxima/Editor/ProximaStaticImporter.cs
@@ -0,0 +1,77 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.IO.Compression;
+using UnityEngine;
+using UnityEditor.AssetImporters;
+
+#if !UNITY_2022_1_OR_NEWER
+    using UnityEditor.Experimental.AssetImporters;
+#endif
+
+namespace Proxima.Editor
+{
+    [ScriptedImporter(1, "proximastatic")]
+    internal class ProximaStaticImporter : ScriptedImporter
+    {
+        // Custom ZIP file importer because ZipFile isn't supported on older Unity versions.
+        public override void OnImportAsset(AssetImportContext ctx)
+        {
+            var asset = ScriptableObject.CreateInstance<ProximaStatic>();
+            asset.Files = new List<ProximaStatic.StaticFile>();
+            var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
+
+            var data = File.ReadAllBytes(ctx.assetPath);
+            var br = new BinaryReader(new MemoryStream(data));
+            br.ReadByte(); // extra byte
+
+            while (true)
+            {
+                var sig = br.ReadInt32(); // signature
+                if (sig != 0x04034b50)
+                {
+                    break;
+                }
+
+                br.ReadInt16(); // version
+                br.ReadInt16(); // flags
+                br.ReadInt16(); // compression
+                var lastModifiedTime = br.ReadUInt16(); // last modified time
+                var lastModifiedDate = br.ReadUInt16(); // last modified date
+                br.ReadInt32(); // crc32
+                var compressedSize = br.ReadInt32(); // compressed size
+                var uncompressedSize = br.ReadInt32(); // uncompressed size
+                var nameLength = br.ReadUInt16();
+                var extraLength = br.ReadUInt16();
+                var name = new string(br.ReadChars(nameLength));
+                var extra = br.ReadBytes(extraLength);
+
+                var compressedData = br.ReadBytes(compressedSize);
+                var uncompressedData = new byte[uncompressedSize];
+                using (var deflateStream = new DeflateStream(new MemoryStream(compressedData), CompressionMode.Decompress))
+                {
+                    deflateStream.Read(uncompressedData, 0, uncompressedSize);
+                }
+
+                var entry = new ProximaStatic.StaticFile();
+                entry.Path = name.Replace('\\', '/');
+                entry.Bytes = uncompressedData;
+
+                var lastModified = new DateTime(
+                    1980 + (lastModifiedDate >> 9),
+                    (lastModifiedDate >> 5) & 0xF,
+                    lastModifiedDate & 0x1F,
+                    lastModifiedTime >> 11,
+                    (lastModifiedTime >> 5) & 0x3F,
+                    (lastModifiedTime & 0x1F) << 1);
+
+                entry.LastModified = (long)(lastModified - epoch).TotalMilliseconds;
+
+                asset.Files.Add(entry);
+            }
+
+            ctx.AddObjectToAsset("main obj", asset);
+            ctx.SetMainObject(asset);
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Editor/ProximaStaticImporter.cs.meta b/Assets/Proxima/Editor/ProximaStaticImporter.cs.meta
new file mode 100644
index 0000000..142e168
--- /dev/null
+++ b/Assets/Proxima/Editor/ProximaStaticImporter.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 6516416497f676b4aba8328116af0c65
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Editor/ProximaSurvey.cs b/Assets/Proxima/Editor/ProximaSurvey.cs
new file mode 100644
index 0000000..4251133
--- /dev/null
+++ b/Assets/Proxima/Editor/ProximaSurvey.cs
@@ -0,0 +1,291 @@
+using System;
+using System.Linq;
+using UnityEditor;
+using UnityEngine;
+using UnityEngine.Networking;
+
+namespace Proxima.Editor
+{
+    internal class ProximaSurvey : EditorWindow
+    {
+        private struct SurveyData
+        {
+            public string version;
+            public string unityVersion;
+            public string buildTarget;
+            public string xr;
+            public int experience;
+            public string benefits;
+            public string improvements;
+            public string features;
+        }
+
+        private enum SurveyState
+        {
+            Ask,
+            DontAsk,
+            Completed
+        }
+
+        private enum XRType
+        {
+            None,
+            XRI,
+            Oculus
+        }
+
+        private static readonly string[] _options = new string[] { "Very Disappointed", "Somewhat Disappointed", "Not Disappointed" };
+        private static readonly Vector2 _initialSize = new Vector2(580, 220);
+        private static readonly Vector2 _expandedSize = new Vector2(580, 540);
+        private static readonly string _stateKey = "ProximaSurveyState";
+        private static readonly string _dateKey = "ProximaSurveyDate";
+        private static readonly string _attemptKey = "ProximaSurveyAttempt";
+        private static readonly TimeSpan _askFrequency = new TimeSpan(3, 0, 0, 0);
+
+        private GUIStyle _bodyStyle;
+        private GUIStyle _boldStyle;
+        private GUIStyle _toggleStyle;
+        private GUIStyle _buttonStyle;
+        private GUIStyle _dontAskButtonStyle;
+        private GUIStyle _textAreaStyle;
+        private SurveyData _surveyData;
+
+        public static bool Completed => EditorPrefs.GetInt(_stateKey, 0) == (int)SurveyState.Completed;
+
+        public static bool ShouldAsk()
+        {
+            if (SessionState.GetBool(_attemptKey, false))
+            {
+                return false;
+            }
+
+            SessionState.SetBool(_attemptKey, true);
+
+            if (EditorPrefs.GetInt(_stateKey, 0) != (int)SurveyState.Ask)
+            {
+                return false;
+            }
+
+            if (!EditorPrefs.HasKey(_dateKey))
+            {
+                EditorPrefs.SetString(_dateKey, DateTime.Now.ToBinary().ToString());
+                return false;
+            }
+
+            var lastAsked = DateTime.FromBinary(Convert.ToInt64(EditorPrefs.GetString(_dateKey, "0")));
+            if (DateTime.Now - lastAsked < _askFrequency)
+            {
+                return false;
+            }
+
+            return true;
+        }
+
+        public static void ShowSurvey()
+        {
+            var window = GetWindow<ProximaSurvey>(true, "Proxima Feedback", true);
+            window.Show();
+        }
+
+        private static string GetXRSettings()
+        {
+            #if UNITY_XR_MANAGEMENT
+                return "XR";
+            #else
+                return "none";
+            #endif
+        }
+
+        private void Init()
+        {
+            if (_surveyData.version != null) return;
+
+            _bodyStyle = new GUIStyle(EditorStyles.label);
+            _bodyStyle.wordWrap = true;
+            _bodyStyle.fontSize = 14;
+            _bodyStyle.margin.left = 10;
+            _bodyStyle.margin.bottom = 10;
+            _bodyStyle.stretchWidth = false;
+            _bodyStyle.alignment = TextAnchor.MiddleCenter;
+
+            _boldStyle = new GUIStyle(_bodyStyle);
+            _boldStyle.fontStyle = FontStyle.Bold;
+
+            _toggleStyle = new GUIStyle(EditorStyles.miniButton);
+            _toggleStyle.margin = new RectOffset(10, 10, 10, 10);
+            _toggleStyle.fixedHeight = 45;
+            _toggleStyle.fixedWidth = 180;
+            _toggleStyle.fontSize = 14;
+            _toggleStyle.alignment = TextAnchor.MiddleCenter;
+
+            _buttonStyle = new GUIStyle(EditorStyles.miniButton);
+            _buttonStyle.margin = new RectOffset(10, 10, 10, 10);
+            _buttonStyle.fixedHeight = 35;
+            _buttonStyle.fixedWidth = 170;
+            _buttonStyle.fontSize = 14;
+            _buttonStyle.alignment = TextAnchor.MiddleCenter;
+
+            _dontAskButtonStyle = new GUIStyle(EditorStyles.miniButton);
+            _dontAskButtonStyle.normal.background = null;
+            _dontAskButtonStyle.margin = new RectOffset(10, 10, 10, 10);
+            _dontAskButtonStyle.fixedWidth = 110;
+
+            _textAreaStyle = new GUIStyle(EditorStyles.textArea);
+            _textAreaStyle.margin.left = 10;
+            _textAreaStyle.margin.right = 10;
+
+            this.titleContent = new GUIContent("Proxima Feedback");
+
+            this.minSize = this.maxSize = _expandedSize;
+            WindowUtil.CenterOnEditor(this);
+
+            _surveyData = new SurveyData
+            {
+                version = WindowUtil.GetVersion(),
+                unityVersion = Application.unityVersion,
+                buildTarget = EditorUserBuildSettings.activeBuildTarget.ToString(),
+                xr = GetXRSettings(),
+                experience = -1,
+                benefits = "",
+                improvements = "",
+                features = string.Join(",", ProximaFeatures.GetInstalledFeatures())
+            };
+
+            EditorPrefs.SetString(_dateKey, DateTime.Now.ToBinary().ToString());
+        }
+
+        private int ToggleGroup(int selected, string[] options)
+        {
+            int newSelected = selected;
+            EditorGUILayout.BeginHorizontal();
+
+            for (int i = 0; i < options.Length; i++)
+            {
+                var option = options[i];
+                if (GUILayout.Toggle(selected == i, option, _toggleStyle))
+                {
+                    newSelected = i;
+                }
+
+                if (i < options.Length - 1)
+                {
+                    GUILayout.FlexibleSpace();
+                }
+            }
+
+            EditorGUILayout.EndHorizontal();
+            return newSelected;
+        }
+
+        private void OnGUI()
+        {
+            Init();
+
+            EditorGUILayout.BeginVertical();
+
+                GUILayout.FlexibleSpace();
+
+                EditorGUILayout.BeginHorizontal();
+                GUILayout.FlexibleSpace();
+                WindowUtil.DrawProximaIcon(128);
+                GUILayout.FlexibleSpace();
+                EditorGUILayout.EndHorizontal();
+
+                GUILayout.FlexibleSpace();
+
+                GUILayout.Label("Please help improve Proxima by answering 3 quick questions.", _boldStyle);
+
+                GUILayout.Label("How would you feel if you could no longer use Proxima Inspector?", _bodyStyle);
+
+                _surveyData.experience = ToggleGroup(_surveyData.experience, _options);
+
+                if (_surveyData.experience == -1)
+                {
+                    this.minSize = this.maxSize = _initialSize;
+
+                    GUILayout.FlexibleSpace();
+                    EditorGUILayout.BeginHorizontal();
+                        GUILayout.FlexibleSpace();
+                        if (GUILayout.Button("Ask me later", _dontAskButtonStyle))
+                        {
+                            Close();
+                        }
+                        if (GUILayout.Button("Don't ask again", _dontAskButtonStyle))
+                        {
+                            EditorPrefs.SetInt(_stateKey, (int)SurveyState.DontAsk);
+                            Close();
+                        }
+                    EditorGUILayout.EndHorizontal();
+                }
+                else if (_surveyData.experience == 0 || _surveyData.experience == 1)
+                {
+                    this.minSize = this.maxSize = _expandedSize;
+
+                    GUILayout.FlexibleSpace();
+
+                    GUILayout.Label("What is the main benefit you get from Proxima?", _bodyStyle);
+                    _surveyData.benefits = GUILayout.TextArea(_surveyData.benefits, _textAreaStyle, GUILayout.Height(100));
+
+                    GUILayout.FlexibleSpace();
+
+                    GUILayout.Label("How can Proxima be improved for you?", _bodyStyle);
+                    _surveyData.improvements = GUILayout.TextArea(_surveyData.improvements, _textAreaStyle, GUILayout.Height(100));
+
+                    GUILayout.FlexibleSpace();
+
+                    EditorGUILayout.BeginHorizontal();
+                        GUILayout.FlexibleSpace();
+                        if (GUILayout.Button("Send Feedback", _buttonStyle))
+                        {
+                            SendSurvey();
+                            Close();
+                        }
+                        GUILayout.FlexibleSpace();
+                    EditorGUILayout.EndHorizontal();
+                    GUILayout.FlexibleSpace();
+                }
+                else
+                {
+                    SendSurvey();
+                    Close();
+                }
+
+            EditorGUILayout.EndVertical();
+        }
+
+        private void SendSurvey()
+        {
+            #if UNITY_WEB_REQUEST
+                var request = new UnityWebRequest("https://www.unityproxima.com/api/survey", UnityWebRequest.kHttpVerbPOST);
+                request.SetRequestHeader("Content-Type", "application/json");
+                request.SetRequestHeader("Accept", "application/json");
+
+                var json = JsonUtility.ToJson(_surveyData);
+                var jsonData = System.Text.Encoding.UTF8.GetBytes(json);
+                request.uploadHandler = new UploadHandlerRaw(jsonData);
+                request.downloadHandler = new DownloadHandlerBuffer();
+
+                request.SendWebRequest().completed += op => {
+                    if (request.responseCode == 200)
+                    {
+                        Debug.Log("Proxima feedback sent successfully.");
+                        EditorPrefs.SetInt(_stateKey, (int)SurveyState.Completed);
+                    }
+                    else if (request.responseCode == 400)
+                    {
+                        Debug.LogError("Failed to send Proxima feedback: " + request.downloadHandler.text);
+                    }
+                    else
+                    {
+                        Debug.LogError("Failed to send Proxima feedback: " + request.error);
+
+                    }
+
+                    request.Dispose();
+                };
+            #else
+                EditorPrefs.SetInt(_stateKey, (int)SurveyState.Completed);
+            #endif
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Editor/ProximaSurvey.cs.meta b/Assets/Proxima/Editor/ProximaSurvey.cs.meta
new file mode 100644
index 0000000..b23669b
--- /dev/null
+++ b/Assets/Proxima/Editor/ProximaSurvey.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: a4f11a266676b874baaa1a04f3d9b57d
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Editor/WindowUtil.cs b/Assets/Proxima/Editor/WindowUtil.cs
new file mode 100644
index 0000000..0f6dc5d
--- /dev/null
+++ b/Assets/Proxima/Editor/WindowUtil.cs
@@ -0,0 +1,65 @@
+using System.IO;
+using System.Text.RegularExpressions;
+using UnityEditor;
+using UnityEngine;
+
+namespace Proxima.Editor
+{
+    internal static class WindowUtil
+    {
+        private static readonly string _projectMeta = "55a7fa332ffadb5489464312015b3ea8";
+
+        private static string _version;
+
+        private static Texture2D _flexalonIcon;
+        private static Texture2D _proximaIcon;
+
+        public static void CenterOnEditor(EditorWindow window)
+        {
+#if UNITY_2020_1_OR_NEWER
+            var main = EditorGUIUtility.GetMainWindowPosition();
+            var pos = window.position;
+            float w = (main.width - pos.width) * 0.5f;
+            float h = (main.height - pos.height) * 0.5f;
+            pos.x = main.x + w;
+            pos.y = main.y + h;
+            window.position = pos;
+#endif
+        }
+
+        public static string GetVersion()
+        {
+            if (_version == null)
+            {
+                var version = AssetDatabase.GUIDToAssetPath(_projectMeta);
+                var lines = File.ReadAllText(version);
+                var rx = new Regex("\"version\": \"(.*?)\"");
+                _version = rx.Match(lines).Groups[1].Value;
+            }
+
+            return _version;
+        }
+
+        public static void DrawProximaIcon(float width)
+        {
+            if (!_proximaIcon)
+            {
+                var proximaIconPath = AssetDatabase.GUIDToAssetPath("834e6e3f5b2f6fd479051cdddf01f4b1");
+                _proximaIcon = AssetDatabase.LoadAssetAtPath<Texture2D>(proximaIconPath);
+            }
+
+            GUILayout.Label(_proximaIcon, GUILayout.Width(width), GUILayout.Height(width * 0.361f));
+        }
+
+        public static bool DrawFlexalonButton(float width, GUIStyle style)
+        {
+            if (!_flexalonIcon)
+            {
+                var flexalonIconPath = AssetDatabase.GUIDToAssetPath("9c4086f38f8e37949978f4861eee5e47");
+                _flexalonIcon = AssetDatabase.LoadAssetAtPath<Texture2D>(flexalonIconPath);
+            }
+
+            return GUILayout.Button(_flexalonIcon, style, GUILayout.Width(width), GUILayout.Height(width * 0.337f));
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Editor/WindowUtil.cs.meta b/Assets/Proxima/Editor/WindowUtil.cs.meta
new file mode 100644
index 0000000..d85babf
--- /dev/null
+++ b/Assets/Proxima/Editor/WindowUtil.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: defbb05a48417014db7a3b648301589f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Resources.meta b/Assets/Proxima/Resources.meta
new file mode 100644
index 0000000..d3a5bc0
--- /dev/null
+++ b/Assets/Proxima/Resources.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 491cf33b47555d146a06fb469fa04ec4
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Resources/Proxima.meta b/Assets/Proxima/Resources/Proxima.meta
new file mode 100644
index 0000000..4b57e14
--- /dev/null
+++ b/Assets/Proxima/Resources/Proxima.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3670bf5fdf86dbd478e07e686609a9bb
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Resources/Proxima/ProximaConnectUI.prefab b/Assets/Proxima/Resources/Proxima/ProximaConnectUI.prefab
new file mode 100644
index 0000000..11a8f90
--- /dev/null
+++ b/Assets/Proxima/Resources/Proxima/ProximaConnectUI.prefab
@@ -0,0 +1,3652 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &569804905908000276
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5458769199638732725}
+  - component: {fileID: 735882090013019384}
+  - component: {fileID: 7728234179712220192}
+  m_Layer: 5
+  m_Name: ErrorLabel
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &5458769199638732725
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 569804905908000276}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 5730519545173937017}
+  m_RootOrder: 5
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 50, y: -197.8}
+  m_SizeDelta: {x: 200, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &735882090013019384
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 569804905908000276}
+  m_CullTransparentMesh: 1
+--- !u!114 &7728234179712220192
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 569804905908000276}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: ' This is an error message'
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4280463343
+  m_fontColor: {r: 1, g: 0.06321794, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 16
+  m_fontSizeBase: 16
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 20, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &1156726917020561994
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2134962388910284285}
+  - component: {fileID: 6019263774383728219}
+  - component: {fileID: 8356759652832176599}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &2134962388910284285
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1156726917020561994}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 8796051085852281885}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &6019263774383728219
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1156726917020561994}
+  m_CullTransparentMesh: 0
+--- !u!114 &8356759652832176599
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1156726917020561994}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: "http://127.0.0.1:1234\u200B"
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4281833205
+  m_fontColor: {r: 0.9607844, g: 0.5882353, b: 0.21568629, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 16
+  m_fontSizeBase: 16
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 0
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 1
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &1331971439159929485
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3932976921392369732}
+  - component: {fileID: 7462444496516620357}
+  - component: {fileID: 5267961878509552381}
+  - component: {fileID: 8225341106628767009}
+  m_Layer: 5
+  m_Name: ConnectInfo
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &3932976921392369732
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1331971439159929485}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 8796051085852281885}
+  m_Father: {fileID: 5730519545150539365}
+  m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 50, y: -175}
+  m_SizeDelta: {x: 1000, y: 30}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7462444496516620357
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1331971439159929485}
+  m_CullTransparentMesh: 0
+--- !u!114 &5267961878509552381
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1331971439159929485}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.21960786, g: 0.21960786, b: 0.21960786, a: 0}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &8225341106628767009
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1331971439159929485}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 5267961878509552381}
+  m_TextViewport: {fileID: 8796051085852281885}
+  m_TextComponent: {fileID: 8356759652832176599}
+  m_Placeholder: {fileID: 5967697969203925976}
+  m_VerticalScrollbar: {fileID: 0}
+  m_VerticalScrollbarEventHandler: {fileID: 0}
+  m_LayoutGroup: {fileID: 0}
+  m_ScrollSensitivity: 1
+  m_ContentType: 0
+  m_InputType: 0
+  m_AsteriskChar: 42
+  m_KeyboardType: 0
+  m_LineType: 0
+  m_HideMobileInput: 0
+  m_HideSoftKeyboard: 0
+  m_CharacterValidation: 0
+  m_RegexValue: 
+  m_GlobalPointSize: 16
+  m_CharacterLimit: 0
+  m_OnEndEdit:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnSubmit:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnSelect:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnDeselect:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnTextSelection:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnEndTextSelection:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnTouchScreenKeyboardStatusChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_CustomCaretColor: 0
+  m_SelectionColor: {r: 0, g: 0, b: 0, a: 0.7529412}
+  m_Text: http://127.0.0.1:1234
+  m_CaretBlinkRate: 0.85
+  m_CaretWidth: 1
+  m_ReadOnly: 1
+  m_RichText: 1
+  m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_OnFocusSelectAll: 1
+  m_ResetOnDeActivation: 1
+  m_RestoreOriginalTextOnEscape: 1
+  m_isRichTextEditingAllowed: 0
+  m_LineLimit: 0
+  m_InputValidator: {fileID: 0}
+--- !u!1 &3779389475628954029
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8796051085852281885}
+  - component: {fileID: 4755908764525431782}
+  m_Layer: 5
+  m_Name: Text Area
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &8796051085852281885
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3779389475628954029}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 5108289817526276615}
+  - {fileID: 2134962388910284285}
+  m_Father: {fileID: 3932976921392369732}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: -0.5}
+  m_SizeDelta: {x: -20, y: -13}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &4755908764525431782
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3779389475628954029}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Padding: {x: 0, y: 0, z: 0, w: 0}
+  m_Softness: {x: 0, y: 0}
+--- !u!1 &4116092740157814096
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5108289817526276615}
+  - component: {fileID: 7808802486986557843}
+  - component: {fileID: 5967697969203925976}
+  - component: {fileID: 5943097408013442455}
+  m_Layer: 5
+  m_Name: Placeholder
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5108289817526276615
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4116092740157814096}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 8796051085852281885}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7808802486986557843
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4116092740157814096}
+  m_CullTransparentMesh: 0
+--- !u!114 &5967697969203925976
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4116092740157814096}
+  m_Enabled: 0
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: Enter text...
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 2150773298
+  m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 16
+  m_fontSizeBase: 16
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 2
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 0
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 1
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!114 &5943097408013442455
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4116092740157814096}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_IgnoreLayout: 1
+  m_MinWidth: -1
+  m_MinHeight: -1
+  m_PreferredWidth: -1
+  m_PreferredHeight: -1
+  m_FlexibleWidth: -1
+  m_FlexibleHeight: -1
+  m_LayoutPriority: 1
+--- !u!1 &4257329452941458363
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 7320836924272747997}
+  m_Layer: 5
+  m_Name: Spacer (1)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &7320836924272747997
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4257329452941458363}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 5730519545150539365}
+  m_RootOrder: 6
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 50, y: -250}
+  m_SizeDelta: {x: 100, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &4311849153598347656
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 7988148174635410369}
+  - component: {fileID: 1661971290014550374}
+  - component: {fileID: 147797468522509480}
+  - component: {fileID: 3093772455502354858}
+  m_Layer: 5
+  m_Name: Button
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &7988148174635410369
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4311849153598347656}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 5730519545217509605}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 1, y: 0}
+  m_AnchorMax: {x: 1, y: 0}
+  m_AnchoredPosition: {x: -30, y: 60}
+  m_SizeDelta: {x: 32, y: 32}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &1661971290014550374
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4311849153598347656}
+  m_CullTransparentMesh: 1
+--- !u!114 &147797468522509480
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4311849153598347656}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: 84dd31c6b1180460789ddc5fc0620856, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &3093772455502354858
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4311849153598347656}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 147797468522509480}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls: []
+--- !u!1 &5730519544506166042
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519544506166041}
+  - component: {fileID: 5730519544506166047}
+  - component: {fileID: 5730519544506166040}
+  m_Layer: 5
+  m_Name: StatusLabel
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5730519544506166041
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544506166042}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 5730519545150539365}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 50, y: -125}
+  m_SizeDelta: {x: 280, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5730519544506166047
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544506166042}
+  m_CullTransparentMesh: 1
+--- !u!114 &5730519544506166040
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544506166042}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: Proxima is Running
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 16
+  m_fontSizeBase: 16
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 20, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &5730519544691981042
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519544691981041}
+  - component: {fileID: 5730519544691981047}
+  - component: {fileID: 5730519544691981040}
+  m_Layer: 5
+  m_Name: Panel
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &5730519544691981041
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544691981042}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 5730519545173937017}
+  - {fileID: 5730519545150539365}
+  m_Father: {fileID: 5730519545217509605}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 20, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5730519544691981047
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544691981042}
+  m_CullTransparentMesh: 1
+--- !u!114 &5730519544691981040
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544691981042}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.21698111, g: 0.21698111, b: 0.21698111, a: 0.9137255}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!1 &5730519544763499743
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519544763499742}
+  - component: {fileID: 5730519544763499731}
+  - component: {fileID: 5730519544763499740}
+  - component: {fileID: 5730519544763499741}
+  m_Layer: 5
+  m_Name: DisplayNameInput
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5730519544763499742
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544763499743}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 5730519544969120614}
+  m_Father: {fileID: 5730519545173937017}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 50, y: -157.8}
+  m_SizeDelta: {x: 280, y: 30}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5730519544763499731
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544763499743}
+  m_CullTransparentMesh: 1
+--- !u!114 &5730519544763499740
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544763499743}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.8584906, g: 0.8584906, b: 0.8584906, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &5730519544763499741
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544763499743}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 5730519544763499740}
+  m_TextViewport: {fileID: 5730519544969120614}
+  m_TextComponent: {fileID: 5730519545569659411}
+  m_Placeholder: {fileID: 5730519545977023131}
+  m_VerticalScrollbar: {fileID: 0}
+  m_VerticalScrollbarEventHandler: {fileID: 0}
+  m_LayoutGroup: {fileID: 0}
+  m_ScrollSensitivity: 1
+  m_ContentType: 0
+  m_InputType: 0
+  m_AsteriskChar: 42
+  m_KeyboardType: 0
+  m_LineType: 0
+  m_HideMobileInput: 0
+  m_HideSoftKeyboard: 0
+  m_CharacterValidation: 0
+  m_RegexValue: 
+  m_GlobalPointSize: 14
+  m_CharacterLimit: 0
+  m_OnEndEdit:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnSubmit:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnSelect:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnDeselect:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnTextSelection:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnEndTextSelection:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnTouchScreenKeyboardStatusChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_CustomCaretColor: 0
+  m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412}
+  m_Text: MyTestApp
+  m_CaretBlinkRate: 0.85
+  m_CaretWidth: 1
+  m_ReadOnly: 0
+  m_RichText: 1
+  m_GlobalFontAsset: {fileID: 0}
+  m_OnFocusSelectAll: 1
+  m_ResetOnDeActivation: 1
+  m_RestoreOriginalTextOnEscape: 1
+  m_isRichTextEditingAllowed: 0
+  m_LineLimit: 0
+  m_InputValidator: {fileID: 0}
+--- !u!1 &5730519544782553062
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519544782553061}
+  m_Layer: 5
+  m_Name: Spacer
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5730519544782553061
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544782553062}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 5730519545150539365}
+  m_RootOrder: 4
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 50, y: -200}
+  m_SizeDelta: {x: 100, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &5730519544870041898
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519544870041897}
+  - component: {fileID: 5730519544870041896}
+  m_Layer: 5
+  m_Name: Text Area
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5730519544870041897
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544870041898}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 5730519545248126254}
+  - {fileID: 5730519546101261994}
+  m_Father: {fileID: 5730519546039280235}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: -0.5}
+  m_SizeDelta: {x: -20, y: -13}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &5730519544870041896
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544870041898}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Padding: {x: -8, y: -5, z: -8, w: -5}
+  m_Softness: {x: 0, y: 0}
+--- !u!1 &5730519544870476725
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519544870476724}
+  - component: {fileID: 5730519544870476714}
+  - component: {fileID: 5730519544870476715}
+  m_Layer: 5
+  m_Name: Text (TMP)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5730519544870476724
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544870476725}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 5730519546215868953}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5730519544870476714
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544870476725}
+  m_CullTransparentMesh: 1
+--- !u!114 &5730519544870476715
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544870476725}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: Start
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4281479730
+  m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 16
+  m_fontSizeBase: 16
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &5730519544880200502
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519544880200501}
+  - component: {fileID: 5730519544880200490}
+  - component: {fileID: 5730519544880200491}
+  - component: {fileID: 5730519544880200500}
+  m_Layer: 5
+  m_Name: StopButton
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5730519544880200501
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544880200502}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 5730519545508721172}
+  m_Father: {fileID: 5730519545150539365}
+  m_RootOrder: 7
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 50, y: -275}
+  m_SizeDelta: {x: 160, y: 30}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5730519544880200490
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544880200502}
+  m_CullTransparentMesh: 1
+--- !u!114 &5730519544880200491
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544880200502}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 0.6107548, b: 0.2216981, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &5730519544880200500
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544880200502}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 5730519544880200491}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls: []
+--- !u!1 &5730519544969120615
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519544969120614}
+  - component: {fileID: 5730519544969120613}
+  m_Layer: 5
+  m_Name: Text Area
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5730519544969120614
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544969120615}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 5730519545977023077}
+  - {fileID: 5730519545569659420}
+  m_Father: {fileID: 5730519544763499742}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: -0.5}
+  m_SizeDelta: {x: -20, y: -13}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &5730519544969120613
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519544969120615}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Padding: {x: -8, y: -5, z: -8, w: -5}
+  m_Softness: {x: 0, y: 0}
+--- !u!1 &5730519545130162201
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519545130162200}
+  - component: {fileID: 5730519545130162206}
+  - component: {fileID: 5730519545130162207}
+  m_Layer: 5
+  m_Name: PasswordLabel
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5730519545130162200
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545130162201}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 5730519545173937017}
+  m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 50, y: -197.8}
+  m_SizeDelta: {x: 200, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5730519545130162206
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545130162201}
+  m_CullTransparentMesh: 1
+--- !u!114 &5730519545130162207
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545130162201}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: Password
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4280463343
+  m_fontColor: {r: 0.9372549, g: 0.6862745, b: 0.13333334, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 16
+  m_fontSizeBase: 16
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 20, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &5730519545150539366
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519545150539365}
+  - component: {fileID: 5730519545150539364}
+  m_Layer: 5
+  m_Name: StartedUI
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &5730519545150539365
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545150539366}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 5730519545950333496}
+  - {fileID: 5730519544506166041}
+  - {fileID: 129232744442488311}
+  - {fileID: 3932976921392369732}
+  - {fileID: 5730519544782553061}
+  - {fileID: 6598228770620100968}
+  - {fileID: 7320836924272747997}
+  - {fileID: 5730519544880200501}
+  m_Father: {fileID: 5730519544691981041}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 85.5}
+  m_SizeDelta: {x: 100, y: 150}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &5730519545150539364
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545150539366}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Padding:
+    m_Left: 0
+    m_Right: 0
+    m_Top: 0
+    m_Bottom: 0
+  m_ChildAlignment: 1
+  m_Spacing: 0
+  m_ChildForceExpandWidth: 0
+  m_ChildForceExpandHeight: 1
+  m_ChildControlWidth: 0
+  m_ChildControlHeight: 0
+  m_ChildScaleWidth: 0
+  m_ChildScaleHeight: 0
+  m_ReverseArrangement: 0
+--- !u!1 &5730519545173937018
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519545173937017}
+  - component: {fileID: 5730519545173937016}
+  m_Layer: 5
+  m_Name: ConnectUI
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &5730519545173937017
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545173937018}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 5730519545763793511}
+  - {fileID: 5730519546572851609}
+  - {fileID: 5730519544763499742}
+  - {fileID: 5730519545130162200}
+  - {fileID: 5730519546039280235}
+  - {fileID: 5458769199638732725}
+  - {fileID: 611689114822603911}
+  - {fileID: 5730519546215868953}
+  m_Father: {fileID: 5730519544691981041}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 85.5}
+  m_SizeDelta: {x: 100, y: 150}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &5730519545173937016
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545173937018}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Padding:
+    m_Left: 0
+    m_Right: 0
+    m_Top: 0
+    m_Bottom: 0
+  m_ChildAlignment: 1
+  m_Spacing: 0
+  m_ChildForceExpandWidth: 0
+  m_ChildForceExpandHeight: 1
+  m_ChildControlWidth: 0
+  m_ChildControlHeight: 0
+  m_ChildScaleWidth: 0
+  m_ChildScaleHeight: 0
+  m_ReverseArrangement: 0
+--- !u!1 &5730519545217509601
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519545217509605}
+  - component: {fileID: 5730519545217509606}
+  - component: {fileID: 5730519545217509607}
+  - component: {fileID: 5730519545217509600}
+  - component: {fileID: 5730519545217509604}
+  - component: {fileID: 3808588107770984390}
+  m_Layer: 5
+  m_Name: ProximaConnectUI
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5730519545217509605
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545217509601}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0, y: 0, z: 0}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 5730519544691981041}
+  - {fileID: 7988148174635410369}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0, y: 0}
+--- !u!223 &5730519545217509606
+Canvas:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545217509601}
+  m_Enabled: 1
+  serializedVersion: 3
+  m_RenderMode: 0
+  m_Camera: {fileID: 0}
+  m_PlaneDistance: 100
+  m_PixelPerfect: 0
+  m_ReceivesEvents: 1
+  m_OverrideSorting: 0
+  m_OverridePixelPerfect: 0
+  m_SortingBucketNormalizedSize: 0
+  m_AdditionalShaderChannelsFlag: 25
+  m_SortingLayerID: 0
+  m_SortingOrder: 100
+  m_TargetDisplay: 0
+--- !u!114 &5730519545217509607
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545217509601}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_UiScaleMode: 1
+  m_ReferencePixelsPerUnit: 100
+  m_ScaleFactor: 1
+  m_ReferenceResolution: {x: 1000, y: 600}
+  m_ScreenMatchMode: 2
+  m_MatchWidthOrHeight: 0
+  m_PhysicalUnit: 3
+  m_FallbackScreenDPI: 96
+  m_DefaultSpriteDPI: 96
+  m_DynamicPixelsPerUnit: 1
+  m_PresetInfoIsWorld: 0
+--- !u!114 &5730519545217509600
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545217509601}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_IgnoreReversedGraphics: 1
+  m_BlockingObjects: 0
+  m_BlockingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+--- !u!114 &5730519545217509604
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545217509601}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: d20fb960dcd6aee4c91d76796c4e489a, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  _proximaInspector: {fileID: 0}
+  _displayNameInputField: {fileID: 5730519544763499741}
+  _passwordInputField: {fileID: 5730519546039280234}
+  _errorLabel: {fileID: 7728234179712220192}
+  _startButton: {fileID: 5730519546215868952}
+  _openButton: {fileID: 1242765748099048972}
+  _stopButton: {fileID: 5730519544880200500}
+  _connectUIRoot: {fileID: 5730519545173937018}
+  _startedUIRoot: {fileID: 5730519545150539366}
+  _showHideButton: {fileID: 3093772455502354858}
+--- !u!114 &3808588107770984390
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545217509601}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f8a779904589bf645b974624adf18491, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  _proximaInspector: {fileID: 0}
+  _uiRoot: {fileID: 0}
+  _connectInfoLabel: {fileID: 8225341106628767009}
+  _statusLabel: {fileID: 5730519544506166040}
+--- !u!1 &5730519545248126255
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519545248126254}
+  - component: {fileID: 5730519545248126243}
+  - component: {fileID: 5730519545248126252}
+  - component: {fileID: 5730519545248126253}
+  m_Layer: 5
+  m_Name: Placeholder
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5730519545248126254
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545248126255}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 5730519544870041897}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5730519545248126243
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545248126255}
+  m_CullTransparentMesh: 1
+--- !u!114 &5730519545248126252
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545248126255}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: 
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 2150773298
+  m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 14
+  m_fontSizeBase: 14
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 0
+  m_fontSizeMax: 0
+  m_fontStyle: 2
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 0
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 0
+  m_enableExtraPadding: 1
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!114 &5730519545248126253
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545248126255}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_IgnoreLayout: 1
+  m_MinWidth: -1
+  m_MinHeight: -1
+  m_PreferredWidth: -1
+  m_PreferredHeight: -1
+  m_FlexibleWidth: -1
+  m_FlexibleHeight: -1
+  m_LayoutPriority: 1
+--- !u!1 &5730519545508721173
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519545508721172}
+  - component: {fileID: 5730519545508721162}
+  - component: {fileID: 5730519545508721163}
+  m_Layer: 5
+  m_Name: Text (TMP)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5730519545508721172
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545508721173}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 5730519544880200501}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5730519545508721162
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545508721173}
+  m_CullTransparentMesh: 1
+--- !u!114 &5730519545508721163
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545508721173}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: Stop
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4281479730
+  m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 16
+  m_fontSizeBase: 16
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &5730519545569659421
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519545569659420}
+  - component: {fileID: 5730519545569659410}
+  - component: {fileID: 5730519545569659411}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5730519545569659420
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545569659421}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 5730519544969120614}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5730519545569659410
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545569659421}
+  m_CullTransparentMesh: 1
+--- !u!114 &5730519545569659411
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545569659421}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: "MyTestApp\u200B"
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4281479730
+  m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 14
+  m_fontSizeBase: 14
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 0
+  m_fontSizeMax: 0
+  m_fontStyle: 0
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 0
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 0
+  m_enableExtraPadding: 1
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &5730519545763793504
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519545763793511}
+  - component: {fileID: 5730519545763793509}
+  - component: {fileID: 5730519545763793510}
+  m_Layer: 5
+  m_Name: Logo
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5730519545763793511
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545763793504}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 5730519545173937017}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 50, y: -50}
+  m_SizeDelta: {x: 200, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5730519545763793509
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545763793504}
+  m_CullTransparentMesh: 1
+--- !u!114 &5730519545763793510
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545763793504}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: 834e6e3f5b2f6fd479051cdddf01f4b1, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 1
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!1 &5730519545950333497
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519545950333496}
+  - component: {fileID: 5730519545950333502}
+  - component: {fileID: 5730519545950333503}
+  m_Layer: 5
+  m_Name: Logo
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5730519545950333496
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545950333497}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 5730519545150539365}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 50, y: -50}
+  m_SizeDelta: {x: 200, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5730519545950333502
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545950333497}
+  m_CullTransparentMesh: 1
+--- !u!114 &5730519545950333503
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545950333497}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: 834e6e3f5b2f6fd479051cdddf01f4b1, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 1
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!1 &5730519545977023078
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519545977023077}
+  - component: {fileID: 5730519545977023130}
+  - component: {fileID: 5730519545977023131}
+  - component: {fileID: 5730519545977023076}
+  m_Layer: 5
+  m_Name: Placeholder
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5730519545977023077
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545977023078}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 5730519544969120614}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5730519545977023130
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545977023078}
+  m_CullTransparentMesh: 1
+--- !u!114 &5730519545977023131
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545977023078}
+  m_Enabled: 0
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: ']'
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 14
+  m_fontSizeBase: 14
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 0
+  m_fontSizeMax: 0
+  m_fontStyle: 2
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 0
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 0
+  m_enableExtraPadding: 1
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!114 &5730519545977023076
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519545977023078}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_IgnoreLayout: 1
+  m_MinWidth: -1
+  m_MinHeight: -1
+  m_PreferredWidth: -1
+  m_PreferredHeight: -1
+  m_FlexibleWidth: -1
+  m_FlexibleHeight: -1
+  m_LayoutPriority: 1
+--- !u!1 &5730519546039280244
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519546039280235}
+  - component: {fileID: 5730519546039280232}
+  - component: {fileID: 5730519546039280233}
+  - component: {fileID: 5730519546039280234}
+  m_Layer: 5
+  m_Name: PasswordInput
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5730519546039280235
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519546039280244}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 5730519544870041897}
+  m_Father: {fileID: 5730519545173937017}
+  m_RootOrder: 4
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 50, y: -237.8}
+  m_SizeDelta: {x: 280, y: 30}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5730519546039280232
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519546039280244}
+  m_CullTransparentMesh: 1
+--- !u!114 &5730519546039280233
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519546039280244}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.85882354, g: 0.85882354, b: 0.85882354, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &5730519546039280234
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519546039280244}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 5730519546039280233}
+  m_TextViewport: {fileID: 5730519544870041897}
+  m_TextComponent: {fileID: 5730519546101261993}
+  m_Placeholder: {fileID: 5730519545248126252}
+  m_VerticalScrollbar: {fileID: 0}
+  m_VerticalScrollbarEventHandler: {fileID: 0}
+  m_LayoutGroup: {fileID: 0}
+  m_ScrollSensitivity: 1
+  m_ContentType: 7
+  m_InputType: 2
+  m_AsteriskChar: 42
+  m_KeyboardType: 0
+  m_LineType: 0
+  m_HideMobileInput: 0
+  m_HideSoftKeyboard: 0
+  m_CharacterValidation: 0
+  m_RegexValue: 
+  m_GlobalPointSize: 14
+  m_CharacterLimit: 0
+  m_OnEndEdit:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnSubmit:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnSelect:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnDeselect:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnTextSelection:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnEndTextSelection:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnTouchScreenKeyboardStatusChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_CustomCaretColor: 0
+  m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412}
+  m_Text: 
+  m_CaretBlinkRate: 0.85
+  m_CaretWidth: 1
+  m_ReadOnly: 0
+  m_RichText: 1
+  m_GlobalFontAsset: {fileID: 0}
+  m_OnFocusSelectAll: 1
+  m_ResetOnDeActivation: 1
+  m_RestoreOriginalTextOnEscape: 1
+  m_isRichTextEditingAllowed: 0
+  m_LineLimit: 0
+  m_InputValidator: {fileID: 0}
+--- !u!1 &5730519546101261995
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519546101261994}
+  - component: {fileID: 5730519546101261992}
+  - component: {fileID: 5730519546101261993}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5730519546101261994
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519546101261995}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 5730519544870041897}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5730519546101261992
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519546101261995}
+  m_CullTransparentMesh: 1
+--- !u!114 &5730519546101261993
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519546101261995}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: "\u200B"
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4281479730
+  m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 14
+  m_fontSizeBase: 14
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 0
+  m_fontSizeMax: 0
+  m_fontStyle: 0
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 0
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 0
+  m_enableExtraPadding: 1
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &5730519546215868954
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519546215868953}
+  - component: {fileID: 5730519546215868958}
+  - component: {fileID: 5730519546215868959}
+  - component: {fileID: 5730519546215868952}
+  m_Layer: 5
+  m_Name: StartButton
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5730519546215868953
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519546215868954}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 5730519544870476724}
+  m_Father: {fileID: 5730519545173937017}
+  m_RootOrder: 7
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 50, y: -287.8}
+  m_SizeDelta: {x: 160, y: 30}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5730519546215868958
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519546215868954}
+  m_CullTransparentMesh: 1
+--- !u!114 &5730519546215868959
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519546215868954}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 0.6107548, b: 0.2216981, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &5730519546215868952
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519546215868954}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 5730519546215868959}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls: []
+--- !u!1 &5730519546572851610
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5730519546572851609}
+  - component: {fileID: 5730519546572851615}
+  - component: {fileID: 5730519546572851608}
+  m_Layer: 5
+  m_Name: DisplayNameLabel
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5730519546572851609
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519546572851610}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 5730519545173937017}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 50, y: -121.4}
+  m_SizeDelta: {x: 200, y: 42.8}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5730519546572851615
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519546572851610}
+  m_CullTransparentMesh: 1
+--- !u!114 &5730519546572851608
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5730519546572851610}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: Display Name
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4280463343
+  m_fontColor: {r: 0.9372549, g: 0.68481076, b: 0.13333334, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 16
+  m_fontSizeBase: 16
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 10, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &7947035745347171387
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 611689114822603911}
+  m_Layer: 5
+  m_Name: Spacer
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &611689114822603911
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7947035745347171387}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 5730519545173937017}
+  m_RootOrder: 6
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 50, y: -262.8}
+  m_SizeDelta: {x: 100, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &8577682666751902480
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3680753083280977413}
+  - component: {fileID: 2713453022754674115}
+  - component: {fileID: 5100627224966352245}
+  m_Layer: 5
+  m_Name: Text (TMP)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &3680753083280977413
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8577682666751902480}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 6598228770620100968}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &2713453022754674115
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8577682666751902480}
+  m_CullTransparentMesh: 1
+--- !u!114 &5100627224966352245
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8577682666751902480}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: Open in Browser
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4281479730
+  m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 16
+  m_fontSizeBase: 16
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &8723873089060226843
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 129232744442488311}
+  m_Layer: 5
+  m_Name: Spacer
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &129232744442488311
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8723873089060226843}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 5730519545150539365}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 50, y: -155}
+  m_SizeDelta: {x: 100, y: 10}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &9042197160478706960
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 6598228770620100968}
+  - component: {fileID: 4378093007323832161}
+  - component: {fileID: 585085157182159395}
+  - component: {fileID: 1242765748099048972}
+  m_Layer: 5
+  m_Name: OpenButton
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &6598228770620100968
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 9042197160478706960}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 3680753083280977413}
+  m_Father: {fileID: 5730519545150539365}
+  m_RootOrder: 5
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 50, y: -225}
+  m_SizeDelta: {x: 160, y: 30}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &4378093007323832161
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 9042197160478706960}
+  m_CullTransparentMesh: 1
+--- !u!114 &585085157182159395
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 9042197160478706960}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 0.6107548, b: 0.2216981, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &1242765748099048972
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 9042197160478706960}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 585085157182159395}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls: []
diff --git a/Assets/Proxima/Resources/Proxima/ProximaConnectUI.prefab.meta b/Assets/Proxima/Resources/Proxima/ProximaConnectUI.prefab.meta
new file mode 100644
index 0000000..72c1284
--- /dev/null
+++ b/Assets/Proxima/Resources/Proxima/ProximaConnectUI.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 9beaa43c2246f3c429af1bd9e5657284
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Resources/Proxima/ProximaEmbeddedCert.pfx b/Assets/Proxima/Resources/Proxima/ProximaEmbeddedCert.pfx
new file mode 100644
index 0000000..d4a54e0
Binary files /dev/null and b/Assets/Proxima/Resources/Proxima/ProximaEmbeddedCert.pfx differ
diff --git a/Assets/Proxima/Resources/Proxima/ProximaEmbeddedCert.pfx.meta b/Assets/Proxima/Resources/Proxima/ProximaEmbeddedCert.pfx.meta
new file mode 100644
index 0000000..9050b3f
--- /dev/null
+++ b/Assets/Proxima/Resources/Proxima/ProximaEmbeddedCert.pfx.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 6e3c283c1c02ed346bf0d4d327715b4b
+ScriptedImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 2
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
+  script: {fileID: 11500000, guid: 1f0da27eff826494b99f5e680d9acda9, type: 3}
diff --git a/Assets/Proxima/Resources/Proxima/ProximaStatusUI.prefab b/Assets/Proxima/Resources/Proxima/ProximaStatusUI.prefab
new file mode 100644
index 0000000..a67c358
--- /dev/null
+++ b/Assets/Proxima/Resources/Proxima/ProximaStatusUI.prefab
@@ -0,0 +1,865 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &384890343868295694
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8145749882119039238}
+  - component: {fileID: 2789547962602981077}
+  - component: {fileID: 1142189955481533906}
+  - component: {fileID: 1721831108900875074}
+  m_Layer: 5
+  m_Name: Placeholder
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &8145749882119039238
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 384890343868295694}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 6186048065140066065}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &2789547962602981077
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 384890343868295694}
+  m_CullTransparentMesh: 0
+--- !u!114 &1142189955481533906
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 384890343868295694}
+  m_Enabled: 0
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: Enter text...
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 2150773298
+  m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 13
+  m_fontSizeBase: 13
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 2
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 0
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 1
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!114 &1721831108900875074
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 384890343868295694}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_IgnoreLayout: 1
+  m_MinWidth: -1
+  m_MinHeight: -1
+  m_PreferredWidth: -1
+  m_PreferredHeight: -1
+  m_FlexibleWidth: -1
+  m_FlexibleHeight: -1
+  m_LayoutPriority: 1
+--- !u!1 &1739985618177381640
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 6015080605685723175}
+  - component: {fileID: 4066884605401563155}
+  - component: {fileID: 5353934841296736825}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &6015080605685723175
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1739985618177381640}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 6186048065140066065}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &4066884605401563155
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1739985618177381640}
+  m_CullTransparentMesh: 0
+--- !u!114 &5353934841296736825
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1739985618177381640}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: "http://127.0.0.1:1234\u200B"
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4281833205
+  m_fontColor: {r: 0.9607844, g: 0.5882353, b: 0.21568629, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 13
+  m_fontSizeBase: 13
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 4
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 0
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 1
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &3597693078874631350
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3597693078874631351}
+  - component: {fileID: 3597693078874631349}
+  - component: {fileID: 3597693078874631348}
+  - component: {fileID: 1114040584}
+  m_Layer: 5
+  m_Name: Panel
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &3597693078874631351
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3597693078874631350}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 3597693079650643246}
+  - {fileID: 8671961242263405349}
+  m_Father: {fileID: 3597693079969461663}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 0}
+  m_AnchoredPosition: {x: 0, y: 2}
+  m_SizeDelta: {x: 20, y: 60}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &3597693078874631349
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3597693078874631350}
+  m_CullTransparentMesh: 1
+--- !u!114 &3597693078874631348
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3597693078874631350}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.20392159, g: 0.20392159, b: 0.20392159, a: 1}
+  m_RaycastTarget: 1
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &1114040584
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3597693078874631350}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Padding:
+    m_Left: 25
+    m_Right: 25
+    m_Top: 6
+    m_Bottom: 0
+  m_ChildAlignment: 4
+  m_Spacing: 0
+  m_ChildForceExpandWidth: 1
+  m_ChildForceExpandHeight: 1
+  m_ChildControlWidth: 1
+  m_ChildControlHeight: 0
+  m_ChildScaleWidth: 0
+  m_ChildScaleHeight: 0
+--- !u!1 &3597693079650643241
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3597693079650643246}
+  - component: {fileID: 3597693079650643244}
+  - component: {fileID: 3597693079650643247}
+  m_Layer: 5
+  m_Name: StatusInfoLabel
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &3597693079650643246
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3597693079650643241}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 3597693078874631351}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 91.585846, y: -33}
+  m_SizeDelta: {x: 133.17169, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &3597693079650643244
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3597693079650643241}
+  m_CullTransparentMesh: 1
+--- !u!114 &3597693079650643247
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3597693079650643241}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: Proxima Status Information
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 13
+  m_fontSizeBase: 13
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 0
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 1
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &3597693079969461659
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3597693079969461663}
+  - component: {fileID: 3597693079969461662}
+  - component: {fileID: 3597693079969461657}
+  - component: {fileID: 3597693079969461656}
+  - component: {fileID: 3597693079969461660}
+  m_Layer: 5
+  m_Name: ProximaStatusUI
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &3597693079969461663
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3597693079969461659}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0, y: 0, z: 0}
+  m_Children:
+  - {fileID: 3597693078874631351}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0, y: 0}
+--- !u!223 &3597693079969461662
+Canvas:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3597693079969461659}
+  m_Enabled: 1
+  serializedVersion: 3
+  m_RenderMode: 0
+  m_Camera: {fileID: 0}
+  m_PlaneDistance: 100
+  m_PixelPerfect: 0
+  m_ReceivesEvents: 1
+  m_OverrideSorting: 0
+  m_OverridePixelPerfect: 0
+  m_SortingBucketNormalizedSize: 0
+  m_AdditionalShaderChannelsFlag: 25
+  m_SortingLayerID: 0
+  m_SortingOrder: 101
+  m_TargetDisplay: 0
+--- !u!114 &3597693079969461657
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3597693079969461659}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_UiScaleMode: 1
+  m_ReferencePixelsPerUnit: 100
+  m_ScaleFactor: 1
+  m_ReferenceResolution: {x: 1000, y: 600}
+  m_ScreenMatchMode: 2
+  m_MatchWidthOrHeight: 0
+  m_PhysicalUnit: 3
+  m_FallbackScreenDPI: 96
+  m_DefaultSpriteDPI: 96
+  m_DynamicPixelsPerUnit: 1
+--- !u!114 &3597693079969461656
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3597693079969461659}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_IgnoreReversedGraphics: 1
+  m_BlockingObjects: 0
+  m_BlockingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+--- !u!114 &3597693079969461660
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3597693079969461659}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f8a779904589bf645b974624adf18491, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  _proximaInspector: {fileID: 0}
+  _uiRoot: {fileID: 3597693078874631350}
+  _connectInfoLabel: {fileID: 8953921706836632590}
+  _statusLabel: {fileID: 3597693079650643247}
+--- !u!1 &5393328084012281428
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 6186048065140066065}
+  - component: {fileID: 2586662670998332376}
+  m_Layer: 5
+  m_Name: Text Area
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &6186048065140066065
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5393328084012281428}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 8145749882119039238}
+  - {fileID: 6015080605685723175}
+  m_Father: {fileID: 8671961242263405349}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: -0.5}
+  m_SizeDelta: {x: -20, y: -13}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &2586662670998332376
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5393328084012281428}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Padding: {x: 0, y: 0, z: 0, w: 0}
+  m_Softness: {x: 0, y: 0}
+--- !u!1 &8157973729697292968
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8671961242263405349}
+  - component: {fileID: 139474993449219955}
+  - component: {fileID: 4613375804612471316}
+  - component: {fileID: 8953921706836632590}
+  m_Layer: 5
+  m_Name: ConnectInfo
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &8671961242263405349
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8157973729697292968}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 6186048065140066065}
+  m_Father: {fileID: 3597693078874631351}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 215.2019, y: -33}
+  m_SizeDelta: {x: 200, y: 63}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &139474993449219955
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8157973729697292968}
+  m_CullTransparentMesh: 0
+--- !u!114 &4613375804612471316
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8157973729697292968}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.21960786, g: 0.21960786, b: 0.21960786, a: 0}
+  m_RaycastTarget: 1
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &8953921706836632590
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8157973729697292968}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 4613375804612471316}
+  m_TextViewport: {fileID: 6186048065140066065}
+  m_TextComponent: {fileID: 5353934841296736825}
+  m_Placeholder: {fileID: 1142189955481533906}
+  m_VerticalScrollbar: {fileID: 0}
+  m_VerticalScrollbarEventHandler: {fileID: 0}
+  m_LayoutGroup: {fileID: 0}
+  m_ScrollSensitivity: 1
+  m_ContentType: 0
+  m_InputType: 0
+  m_AsteriskChar: 42
+  m_KeyboardType: 0
+  m_LineType: 0
+  m_HideMobileInput: 0
+  m_HideSoftKeyboard: 0
+  m_CharacterValidation: 0
+  m_RegexValue: 
+  m_GlobalPointSize: 13
+  m_CharacterLimit: 0
+  m_OnEndEdit:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnSubmit:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnSelect:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnDeselect:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnTextSelection:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnEndTextSelection:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_OnTouchScreenKeyboardStatusChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_CustomCaretColor: 0
+  m_SelectionColor: {r: 0, g: 0, b: 0, a: 0.7529412}
+  m_Text: http://127.0.0.1:1234
+  m_CaretBlinkRate: 0.85
+  m_CaretWidth: 1
+  m_ReadOnly: 1
+  m_RichText: 1
+  m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_OnFocusSelectAll: 1
+  m_ResetOnDeActivation: 1
+  m_RestoreOriginalTextOnEscape: 1
+  m_isRichTextEditingAllowed: 0
+  m_LineLimit: 0
+  m_InputValidator: {fileID: 0}
diff --git a/Assets/Proxima/Resources/Proxima/ProximaStatusUI.prefab.meta b/Assets/Proxima/Resources/Proxima/ProximaStatusUI.prefab.meta
new file mode 100644
index 0000000..d092e51
--- /dev/null
+++ b/Assets/Proxima/Resources/Proxima/ProximaStatusUI.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 936ae2105fa77a7448151fea10fa110f
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Resources/Proxima/web.proximastatic b/Assets/Proxima/Resources/Proxima/web.proximastatic
new file mode 100644
index 0000000..a6726ad
Binary files /dev/null and b/Assets/Proxima/Resources/Proxima/web.proximastatic differ
diff --git a/Assets/Proxima/Resources/Proxima/web.proximastatic.meta b/Assets/Proxima/Resources/Proxima/web.proximastatic.meta
new file mode 100644
index 0000000..72f691a
--- /dev/null
+++ b/Assets/Proxima/Resources/Proxima/web.proximastatic.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: c93ac46350ab2f14ba1ea87cd2d9e3ba
+ScriptedImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 2
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
+  script: {fileID: 11500000, guid: 6516416497f676b4aba8328116af0c65, type: 3}
diff --git a/Assets/Proxima/Runtime.meta b/Assets/Proxima/Runtime.meta
new file mode 100644
index 0000000..f084e53
--- /dev/null
+++ b/Assets/Proxima/Runtime.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b11e3ec679925cc4fa85e9ffaf6e66b7
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/ArrayOrList.cs b/Assets/Proxima/Runtime/ArrayOrList.cs
new file mode 100644
index 0000000..47d77e4
--- /dev/null
+++ b/Assets/Proxima/Runtime/ArrayOrList.cs
@@ -0,0 +1,249 @@
+using System;
+using System.Collections;
+using UnityEngine;
+
+namespace Proxima
+{
+    internal class ArrayOrList
+    {
+        public static bool IsArrayOrList(Type arrayOrList)
+        {
+            return IsArray(arrayOrList) || IsList(arrayOrList);
+        }
+
+        public static bool IsList(Type arrayOrList)
+        {
+            return typeof(IList).IsAssignableFrom(arrayOrList) && arrayOrList.IsGenericType;
+        }
+
+        public static bool IsArray(Type arrayOrList)
+        {
+            return arrayOrList.IsArray;
+        }
+
+        public static bool IsArrayOrList(object arrayOrList)
+        {
+            return IsArray(arrayOrList) || IsList(arrayOrList);
+        }
+
+        public static bool IsList(object arrayOrList)
+        {
+            return IsList(arrayOrList.GetType());
+        }
+
+        public static bool IsArray(object arrayOrList)
+        {
+            return IsArray(arrayOrList.GetType());
+        }
+
+        public static int Count(object arrayOrList)
+        {
+            if (IsArray(arrayOrList))
+            {
+                return ((Array)arrayOrList).Length;
+            }
+            else if (IsList(arrayOrList))
+            {
+                return ((IList)arrayOrList).Count;
+            }
+
+            throw new ArgumentException("Type is not an array or list");
+        }
+
+        public static object Get(object arrayOrList, int index)
+        {
+            if (IsArray(arrayOrList))
+            {
+                return ((Array)arrayOrList).GetValue(index);
+            }
+            else if (IsList(arrayOrList))
+            {
+                return ((IList)arrayOrList)[index];
+            }
+
+            throw new ArgumentException("Type is not an array or list");
+        }
+
+        public static void Set(object arrayOrList, int index, object value)
+        {
+            if (IsArray(arrayOrList))
+            {
+                ((Array)arrayOrList).SetValue(value, index);
+            }
+            else if (IsList(arrayOrList))
+            {
+                ((IList)arrayOrList)[index] = value;
+            }
+            else
+            {
+                throw new ArgumentException("Type is not an array or list");
+            }
+        }
+
+        public static Type GetElementType(Type arrayOrList)
+        {
+            if (IsArray(arrayOrList))
+            {
+                return arrayOrList.GetElementType();
+            }
+            else if (IsList(arrayOrList))
+            {
+                return arrayOrList.GetGenericArguments()[0];
+            }
+
+            throw new ArgumentException("Type is not an array or list");
+        }
+
+        private static object CreateDefault(Type type)
+        {
+            if (type.IsPrimitive)
+            {
+                return Activator.CreateInstance(type);
+            }
+
+            if (type == typeof(string))
+            {
+                return "";
+            }
+
+            if (type.GetConstructor(Type.EmptyTypes) != null)
+            {
+                return Activator.CreateInstance(type);
+            }
+
+            return null;
+        }
+
+        private static object Duplicate(object value)
+        {
+            if (value == null)
+            {
+                return null;
+            }
+
+            var type = value.GetType();
+            if (type.IsValueType || type == typeof(string))
+            {
+                return value;
+            }
+
+            if (IsArray(type))
+            {
+                var array = (Array)value;
+                var newArray = Array.CreateInstance(type.GetElementType(), array.Length);
+                for (var i = 0; i < array.Length; i++)
+                {
+                    newArray.SetValue(Duplicate(array.GetValue(i)), i);
+                }
+            }
+
+            if (IsList(type))
+            {
+                var list = (IList)value;
+                var newList = (IList)Activator.CreateInstance(type);
+                foreach (var item in list)
+                {
+                    newList.Add(Duplicate(item));
+                }
+
+                return newList;
+            }
+
+            if (type.IsSubclassOf(typeof(UnityEngine.Object)))
+            {
+                return value;
+            }
+
+            return null;
+        }
+
+        public static object Resize(object arrayOrList, int size)
+        {
+            var oldSize = Count(arrayOrList);
+            if (oldSize == size)
+            {
+                return arrayOrList;
+            }
+
+            var type = arrayOrList.GetType();
+            var elementType = GetElementType(type);
+
+            if (IsArray(type))
+            {
+                var newArray = Array.CreateInstance(elementType, size);
+                Array.Copy((Array)arrayOrList, newArray, Math.Min(oldSize, size));
+                for (var i = oldSize; i < size; i++)
+                {
+                    newArray.SetValue(CreateDefault(elementType), i);
+                }
+
+                arrayOrList = newArray;
+            }
+            else if (IsList(type))
+            {
+                var list = ((IList)arrayOrList);
+                while (list.Count > size)
+                {
+                    list.RemoveAt(list.Count - 1);
+                }
+
+                while (list.Count < size)
+                {
+                    list.Add(CreateDefault(elementType));
+                }
+
+                arrayOrList = list;
+            }
+            else
+            {
+                throw new ArgumentException("Type is not an array or list");
+            }
+
+            // If we're adding elements, and we already have at least one,
+            // mimic the Unity behavior of duplicating the last element.
+            if (size > oldSize && oldSize > 0)
+            {
+                var lastElement = Get(arrayOrList, oldSize - 1);
+                for (var i = oldSize; i < size; i++)
+                {
+                    Set(arrayOrList, i, Duplicate(lastElement));
+                }
+            }
+
+            return arrayOrList;
+        }
+
+        public static void MoveElement(object arrayOrList, int from, int to)
+        {
+            var temp = Get(arrayOrList, from);
+
+            if (from < to)
+            {
+                for (int i = from; i < to; i++)
+                {
+                    Set(arrayOrList, i, Get(arrayOrList, i + 1));
+                }
+            }
+            else
+            {
+                for (int i = from; i > to; i--)
+                {
+                    Set(arrayOrList, i, Get(arrayOrList, i - 1));
+                }
+            }
+
+            Set(arrayOrList, to, temp);
+        }
+
+        public static object RemoveElement(object arrayOrList, int index)
+        {
+            var size = Count(arrayOrList);
+            for (int i = index; i < size - 1; i++)
+            {
+                Set(arrayOrList, i, Get(arrayOrList, i + 1));
+            }
+
+            return Resize(arrayOrList, size - 1);
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/ArrayOrList.cs.meta b/Assets/Proxima/Runtime/ArrayOrList.cs.meta
new file mode 100644
index 0000000..a6e338b
--- /dev/null
+++ b/Assets/Proxima/Runtime/ArrayOrList.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b3a424b5724df2440982f5f059d8ab12
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/AssemblyInfo.cs b/Assets/Proxima/Runtime/AssemblyInfo.cs
new file mode 100644
index 0000000..ff5132c
--- /dev/null
+++ b/Assets/Proxima/Runtime/AssemblyInfo.cs
@@ -0,0 +1,5 @@
+using System.Runtime.CompilerServices;
+
+[assembly:InternalsVisibleTo("Proxima.Tests")]
+[assembly:InternalsVisibleTo("Proxima.Editor.Tests")]
+[assembly:InternalsVisibleTo("Proxima.Editor")]
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/AssemblyInfo.cs.meta b/Assets/Proxima/Runtime/AssemblyInfo.cs.meta
new file mode 100644
index 0000000..0d508ec
--- /dev/null
+++ b/Assets/Proxima/Runtime/AssemblyInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 1433e3911ce61f54783a44faae88c010
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/CircularList.cs b/Assets/Proxima/Runtime/CircularList.cs
new file mode 100644
index 0000000..1e26a8c
--- /dev/null
+++ b/Assets/Proxima/Runtime/CircularList.cs
@@ -0,0 +1,46 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace Proxima
+{
+    internal class CircularList<T> : IEnumerable<T>
+    {
+        private T[] _array;
+        private int _itemsAdded = 0;
+        public int ItemsAdded => _itemsAdded;
+
+        public CircularList(int capacity)
+        {
+            _array = new T[capacity];
+        }
+
+        public void Add(T t)
+        {
+            var index = _itemsAdded % _array.Length;
+            _array[index] = t;
+            _itemsAdded++;
+        }
+
+        public IEnumerable<T> GetRange(int index)
+        {
+            index = Mathf.Max(_itemsAdded - _array.Length, index);
+            var count = _itemsAdded - index;
+            var start = index % _array.Length;
+            for (int i = 0; i < count; i++)
+            {
+                yield return _array[(i + start) % _array.Length];
+            }
+        }
+
+        public IEnumerator<T> GetEnumerator()
+        {
+            return GetRange(0).GetEnumerator();
+        }
+
+        IEnumerator IEnumerable.GetEnumerator()
+        {
+            return GetEnumerator();
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/CircularList.cs.meta b/Assets/Proxima/Runtime/CircularList.cs.meta
new file mode 100644
index 0000000..e313b0a
--- /dev/null
+++ b/Assets/Proxima/Runtime/CircularList.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 2cc8e31c1a399ed4e8c4cf72c2abfc5e
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/Embedded.meta b/Assets/Proxima/Runtime/Embedded.meta
new file mode 100644
index 0000000..e8fc3dd
--- /dev/null
+++ b/Assets/Proxima/Runtime/Embedded.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8c7b2482015820b45af101602f4bad9a
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/Embedded/HttpDateParse.cs b/Assets/Proxima/Runtime/Embedded/HttpDateParse.cs
new file mode 100644
index 0000000..8557180
--- /dev/null
+++ b/Assets/Proxima/Runtime/Embedded/HttpDateParse.cs
@@ -0,0 +1,487 @@
+// The MIT License (MIT)
+
+// Copyright (c) .NET Foundation and Contributors
+
+// All rights reserved.
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// Slightly modified from:
+// https://github.com/dotnet/runtime/blob/main/src/libraries/Common/src/System/Net/HttpDateParser.cs
+
+using System;
+using System.Globalization;
+
+namespace Proxima
+{
+    internal static class HttpDateParse {
+        private const int BASE_DEC  = 10; // base 10
+
+        //
+        // Date indicies used to figure out what each entry is.
+        //
+
+
+        private const int DATE_INDEX_DAY_OF_WEEK     = 0;
+
+        private const int DATE_1123_INDEX_DAY        = 1;
+        private const int DATE_1123_INDEX_MONTH      = 2;
+        private const int DATE_1123_INDEX_YEAR       = 3;
+        private const int DATE_1123_INDEX_HRS        = 4;
+        private const int DATE_1123_INDEX_MINS       = 5;
+        private const int DATE_1123_INDEX_SECS       = 6;
+
+        private const int DATE_ANSI_INDEX_MONTH      = 1;
+        private const int DATE_ANSI_INDEX_DAY        = 2;
+        private const int DATE_ANSI_INDEX_HRS        = 3;
+        private const int DATE_ANSI_INDEX_MINS       = 4;
+        private const int DATE_ANSI_INDEX_SECS       = 5;
+        private const int DATE_ANSI_INDEX_YEAR       = 6;
+
+        private const int DATE_INDEX_TZ              = 7;
+
+        private const int DATE_INDEX_LAST            = DATE_INDEX_TZ;
+        private const int MAX_FIELD_DATE_ENTRIES           = (DATE_INDEX_LAST+1);
+
+        //
+        // DATE_TOKEN's DWORD values used to determine what day/month we're on
+        //
+
+        private const int DATE_TOKEN_JANUARY      = 1;
+        private const int DATE_TOKEN_FEBRUARY     = 2;
+        private const int DATE_TOKEN_Microsoft        = 3;
+        private const int DATE_TOKEN_APRIL        = 4;
+        private const int DATE_TOKEN_MAY          = 5;
+        private const int DATE_TOKEN_JUNE         = 6;
+        private const int DATE_TOKEN_JULY         = 7;
+        private const int DATE_TOKEN_AUGUST       = 8;
+        private const int DATE_TOKEN_SEPTEMBER    = 9;
+        private const int DATE_TOKEN_OCTOBER      = 10;
+        private const int DATE_TOKEN_NOVEMBER     = 11;
+        private const int DATE_TOKEN_DECEMBER     = 12;
+
+        private const int DATE_TOKEN_LAST_MONTH   = (DATE_TOKEN_DECEMBER+1);
+
+        private const int DATE_TOKEN_SUNDAY       = 0;
+        private const int DATE_TOKEN_MONDAY       = 1;
+        private const int DATE_TOKEN_TUESDAY      = 2;
+        private const int DATE_TOKEN_WEDNESDAY    = 3;
+        private const int DATE_TOKEN_THURSDAY     = 4;
+        private const int DATE_TOKEN_FRIDAY       = 5;
+        private const int DATE_TOKEN_SATURDAY     = 6;
+
+        private const int DATE_TOKEN_LAST_DAY     = (DATE_TOKEN_SATURDAY+1);
+
+        private const int DATE_TOKEN_GMT          = -1000;
+
+        private const int DATE_TOKEN_LAST         = DATE_TOKEN_GMT;
+
+        private const int DATE_TOKEN_ERROR        = (DATE_TOKEN_LAST+1);
+
+
+        //
+        // MAKE_UPPER - takes an assumed lower character and bit manipulates into a upper.
+        //              (make sure the character is Lower case alpha char to begin,
+        //               otherwise it corrupts)
+        //
+
+        private
+        static
+        char
+        MAKE_UPPER(char c) {
+            return(Char.ToUpper(c, CultureInfo.InvariantCulture));
+        }
+
+        /*++
+
+        Routine Description:
+
+            Looks at the first three bytes of string to determine if we're looking
+                at a Day of the Week, or Month, or "GMT" string.  Is inlined so that
+                the compiler can optimize this code into the caller FInternalParseHttpDate.
+
+        Arguments:
+
+            lpszDay - a string ptr to the first byte of the string in question.
+
+        Return Value:
+
+            DWORD
+            Success - The Correct date token, 0-6 for day of the week, 1-14 for month, etc
+
+            Failure - DATE_TOKEN_ERROR
+
+        --*/
+
+        private
+        static
+        int
+        MapDayMonthToDword(
+                          char [] lpszDay,
+                          int index
+                          ) {
+            switch (MAKE_UPPER(lpszDay[index])) { // make uppercase
+                case 'A':
+                    switch (MAKE_UPPER(lpszDay[index+1])) {
+                        case 'P':
+                            return DATE_TOKEN_APRIL;
+                        case 'U':
+                            return DATE_TOKEN_AUGUST;
+
+                    }
+                    return DATE_TOKEN_ERROR;
+
+                case 'D':
+                    return DATE_TOKEN_DECEMBER;
+
+                case 'F':
+                    switch (MAKE_UPPER(lpszDay[index+1])) {
+                        case 'R':
+                            return DATE_TOKEN_FRIDAY;
+                        case 'E':
+                            return DATE_TOKEN_FEBRUARY;
+                    }
+
+                    return DATE_TOKEN_ERROR;
+
+                case 'G':
+                    return DATE_TOKEN_GMT;
+
+                case 'M':
+
+                    switch (MAKE_UPPER(lpszDay[index+1])) {
+                        case 'O':
+                            return DATE_TOKEN_MONDAY;
+                        case 'A':
+                            switch (MAKE_UPPER(lpszDay[index+2])) {
+                                case 'R':
+                                    return DATE_TOKEN_Microsoft;
+                                case 'Y':
+                                    return DATE_TOKEN_MAY;
+                            }
+
+                            // fall through to error
+                            break;
+                    }
+
+                    return DATE_TOKEN_ERROR;
+
+                case 'N':
+                    return DATE_TOKEN_NOVEMBER;
+
+                case 'J':
+
+                    switch (MAKE_UPPER(lpszDay[index+1])) {
+                        case 'A':
+                            return DATE_TOKEN_JANUARY;
+
+                        case 'U':
+                            switch (MAKE_UPPER(lpszDay[index+2])) {
+                                case 'N':
+                                    return DATE_TOKEN_JUNE;
+                                case 'L':
+                                    return DATE_TOKEN_JULY;
+                            }
+
+                            // fall through to error
+                            break;
+                    }
+
+                    return DATE_TOKEN_ERROR;
+
+                case 'O':
+                    return DATE_TOKEN_OCTOBER;
+
+                case 'S':
+
+                    switch (MAKE_UPPER(lpszDay[index+1])) {
+                        case 'A':
+                            return DATE_TOKEN_SATURDAY;
+                        case 'U':
+                            return DATE_TOKEN_SUNDAY;
+                        case 'E':
+                            return DATE_TOKEN_SEPTEMBER;
+                    }
+
+                    return DATE_TOKEN_ERROR;
+
+
+                case 'T':
+                    switch (MAKE_UPPER(lpszDay[index+1])) {
+                        case 'U':
+                            return DATE_TOKEN_TUESDAY;
+                        case 'H':
+                            return DATE_TOKEN_THURSDAY;
+                    }
+
+                    return DATE_TOKEN_ERROR;
+
+                case 'U':
+                    return DATE_TOKEN_GMT;
+
+                case 'W':
+                    return DATE_TOKEN_WEDNESDAY;
+
+            }
+
+            return DATE_TOKEN_ERROR;
+        }
+
+        /*++
+
+        Routine Description:
+
+            Parses through a ANSI, RFC850, or RFC1123 date format and covents it into
+             a FILETIME/SYSTEMTIME time format.
+
+            Important this a time-critical function and should only be changed
+             with the intention of optimizing or a critical need work item.
+
+        Arguments:
+
+            lpft - Ptr to FILETIME structure.  Used to store converted result.
+                    Must be NULL if not intended to be used !!!
+
+            lpSysTime - Ptr to SYSTEMTIME struture. Used to return Systime if needed.
+
+            lpcszDateStr - Const Date string to parse.
+
+        Return Value:
+
+            BOOL
+            Success - TRUE
+
+            Failure - FALSE
+
+        --*/
+        public
+        static
+        bool
+        ParseHttpDate(
+                     String DateString,
+                     out DateTime dtOut
+                     ) {
+            int index = 0;
+            int i = 0, iLastLettered = -1;
+            bool fIsANSIDateFormat = false;
+            int [] rgdwDateParseResults = new int[MAX_FIELD_DATE_ENTRIES];
+            bool fRet = true;
+            char [] lpInputBuffer = DateString.ToCharArray();
+
+            dtOut = new DateTime();
+
+            //
+            // Date Parsing v2 (1 more to go), and here is how it works...
+            //  We take a date string and churn through it once, converting
+            //  integers to integers, Month,Day, and GMT strings into integers,
+            //  and all is then placed IN order in a temp array.
+            //
+            // At the completetion of the parse stage, we simple look at
+            //  the data, and then map the results into the correct
+            //  places in the SYSTIME structure.  Simple, No allocations, and
+            //  No dirting the data.
+            //
+            // The end of the function does something munging and pretting
+            //  up of the results to handle the year 2000, and TZ offsets
+            //  Note: do we need to fully handle TZs anymore?
+            //
+
+            while (index < DateString.Length && i < MAX_FIELD_DATE_ENTRIES) {
+                if (lpInputBuffer[index] >= '0' && lpInputBuffer[index] <= '9') {
+                    //
+                    // we have a numerical entry, scan through it and convent to DWORD
+                    //
+
+                    rgdwDateParseResults[i] = 0;
+
+                    do {
+                        rgdwDateParseResults[i] *= BASE_DEC;
+                        rgdwDateParseResults[i] += (lpInputBuffer[index] - '0');
+                        index++;
+                    } while (index < DateString.Length &&
+                             lpInputBuffer[index] >= '0' &&
+                             lpInputBuffer[index] <= '9');
+
+                    i++; // next token
+                }
+                else if ((lpInputBuffer[index] >= 'A' && lpInputBuffer[index] <= 'Z') ||
+                         (lpInputBuffer[index] >= 'a' && lpInputBuffer[index] <= 'z')) {
+                    //
+                    // we have a string, should be a day, month, or GMT
+                    //   lets skim to the end of the string
+                    //
+
+                    rgdwDateParseResults[i] =
+                    MapDayMonthToDword(lpInputBuffer, index);
+
+                    iLastLettered = i;
+
+                    // We want to ignore the possibility of a time zone such as PST or EST in a non-standard
+                    // date format such as "Thu Dec 17 16:01:28 PST 1998" (Notice that the year is _after_ the time zone
+                    if ((rgdwDateParseResults[i] == DATE_TOKEN_ERROR)
+                        &&
+                        !(fIsANSIDateFormat && (i==DATE_ANSI_INDEX_YEAR))) {
+                        fRet = false;
+                        goto quit;
+                    }
+
+                    //
+                    // At this point if we have a vaild string
+                    //  at this index, we know for sure that we're
+                    //  looking at a ANSI type DATE format.
+                    //
+
+                    if (i == DATE_ANSI_INDEX_MONTH) {
+                        fIsANSIDateFormat = true;
+                    }
+
+                    //
+                    // Read past the end of the current set of alpha characters,
+                    //  as MapDayMonthToDword only peeks at a few characters
+                    //
+
+                    do {
+                        index++;
+                    } while (index < DateString.Length &&
+                             ( (lpInputBuffer[index] >= 'A' && lpInputBuffer[index] <= 'Z') ||
+                               (lpInputBuffer[index] >= 'a' && lpInputBuffer[index] <= 'z') ));
+
+                    i++; // next token
+                }
+                else {
+                    //
+                    // For the generic case its either a space, comma, semi-colon, etc.
+                    //  the point is we really don't care, nor do we need to waste time
+                    //  worring about it (the orginal code did).   The point is we
+                    //  care about the actual date information, So we just advance to the
+                    //  next lexume.
+                    //
+
+                    index++;
+                }
+            }
+
+            //
+            // We're finished parsing the string, now take the parsed tokens
+            //  and turn them to the actual structured information we care about.
+            //  So we build lpSysTime from the Array, using a local if none is passed in.
+            //
+
+            int year;
+            int month;
+            int day;
+            int hour;
+            int minute;
+            int second;
+            int millisecond;
+
+            millisecond =  0;
+
+            if (fIsANSIDateFormat) {
+                day    = rgdwDateParseResults[DATE_ANSI_INDEX_DAY];
+                month  = rgdwDateParseResults[DATE_ANSI_INDEX_MONTH];
+                hour   = rgdwDateParseResults[DATE_ANSI_INDEX_HRS];
+                minute = rgdwDateParseResults[DATE_ANSI_INDEX_MINS];
+                second = rgdwDateParseResults[DATE_ANSI_INDEX_SECS];
+                if (iLastLettered != DATE_ANSI_INDEX_YEAR) {
+                    year   = rgdwDateParseResults[DATE_ANSI_INDEX_YEAR];
+                }
+                else {
+                    // This is a fix to get around toString/toGMTstring (where the timezone is
+                    // appended at the end. (See above)
+                    year   = rgdwDateParseResults[DATE_INDEX_TZ];
+                }
+            }
+            else {
+                day    = rgdwDateParseResults[DATE_1123_INDEX_DAY];
+                month  = rgdwDateParseResults[DATE_1123_INDEX_MONTH];
+                year   = rgdwDateParseResults[DATE_1123_INDEX_YEAR];
+                hour   = rgdwDateParseResults[DATE_1123_INDEX_HRS];
+                minute = rgdwDateParseResults[DATE_1123_INDEX_MINS];
+                second = rgdwDateParseResults[DATE_1123_INDEX_SECS];
+            }
+
+            //
+            // Normalize the year, 90 == 1990, handle the year 2000, 02 == 2002
+            //  This is Year 2000 handling folks!!!  We get this wrong and
+            //  we all look bad.
+            //
+
+            if (year < 100) {
+                year += ((year < 80) ? 2000 : 1900);
+            }
+
+            //
+            // if we got misformed time, then plug in the current time
+            // !lpszHrs || !lpszMins || !lpszSec
+            //
+
+            if ((i < 4)
+                || (day > 31)
+                || (hour > 23)
+                || (minute > 59)
+                || (second > 59)) {
+                fRet = false;
+                goto quit;
+            }
+
+            //
+            // Now do the DateTime conversion
+            //
+
+            dtOut = new DateTime (year, month, day, hour, minute, second, millisecond);
+
+            //
+            // we want the system time to be accurate. This is _suhlow_
+            // The time passed in is in the local time zone; we have to convert this into GMT.
+            //
+
+            if (iLastLettered==DATE_ANSI_INDEX_YEAR) {
+                // this should be an unusual case.
+                dtOut = dtOut.ToUniversalTime();
+            }
+
+            //
+            // If we have an Offset to another Time Zone
+            //   then convert to appropriate GMT time
+            //
+
+            if ((i > DATE_INDEX_TZ &&
+                 rgdwDateParseResults[DATE_INDEX_TZ] != DATE_TOKEN_GMT)) {
+
+                //
+                // if we received +/-nnnn as offset (hhmm), modify the output FILETIME
+                //
+
+                double offset;
+
+                offset = (double) rgdwDateParseResults[DATE_INDEX_TZ];
+                dtOut.AddHours(offset);
+            }
+
+            // In the end, we leave it all in LocalTime
+
+            dtOut = dtOut.ToLocalTime();
+
+            quit:
+
+            return fRet;
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/Embedded/HttpDateParse.cs.meta b/Assets/Proxima/Runtime/Embedded/HttpDateParse.cs.meta
new file mode 100644
index 0000000..e92a197
--- /dev/null
+++ b/Assets/Proxima/Runtime/Embedded/HttpDateParse.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ec8f0b0fcb7462a43a5b930004717228
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/Embedded/PfxAsset.cs b/Assets/Proxima/Runtime/Embedded/PfxAsset.cs
new file mode 100644
index 0000000..1188d37
--- /dev/null
+++ b/Assets/Proxima/Runtime/Embedded/PfxAsset.cs
@@ -0,0 +1,9 @@
+using UnityEngine;
+
+namespace Proxima
+{
+    public class PfxAsset : ScriptableObject
+    {
+        public byte[] Bytes;
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/Embedded/PfxAsset.cs.meta b/Assets/Proxima/Runtime/Embedded/PfxAsset.cs.meta
new file mode 100644
index 0000000..7a8e345
--- /dev/null
+++ b/Assets/Proxima/Runtime/Embedded/PfxAsset.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3d9389e3e4f6e9c42b5b1a635c8eb849
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/Embedded/ProximaEmbeddedConnection.cs b/Assets/Proxima/Runtime/Embedded/ProximaEmbeddedConnection.cs
new file mode 100644
index 0000000..dfb8aab
--- /dev/null
+++ b/Assets/Proxima/Runtime/Embedded/ProximaEmbeddedConnection.cs
@@ -0,0 +1,127 @@
+using System;
+using System.Collections.Concurrent;
+using System.IO;
+using ProximaWebSocketSharp;
+using ProximaWebSocketSharp.Server;
+using UnityEngine;
+
+namespace Proxima
+{
+    internal class ProximaEmbeddedConnection : WebSocketBehavior, ProximaConnection
+    {
+        public bool Open => ReadyState == WebSocketState.Open;
+
+        private ConcurrentQueue<(ProximaConnection, string)> _receiveQueue;
+
+        private string _password;
+        private bool _passwordProvided = false;
+        private string _displayName;
+        private ProximaInstanceHello _hello;
+        private DateTime _lastListTime;
+        private DateTime _lastSelectTime;
+        private ProximaStatus _status;
+        private ProximaDispatcher _dispatcher;
+
+        public void Initialize(string displayName, string password, ProximaDispatcher dispatcher, ProximaStatus status, ConcurrentQueue<(ProximaConnection, string)> queue)
+        {
+            _displayName = displayName;
+            _receiveQueue = queue;
+            _dispatcher = dispatcher;
+            _status = status;
+
+            _dispatcher.Dispatch(() => {
+                _hello = ProximaSerialization.CreateHello(_displayName);
+                _password = ProximaSerialization.HashPassword(password, _hello.ConnectionId);
+            });
+        }
+
+        protected override void OnClose(CloseEventArgs e)
+        {
+            _dispatcher.Dispatch(() => {
+                if (_passwordProvided)
+                {
+                    _status.DecrementConnections();
+                }
+            });
+        }
+
+        public void SendMessage(MemoryStream data)
+        {
+            if (Open)
+            {
+                Log.Verbose("Sending: " + System.Text.Encoding.UTF8.GetString(data.GetBuffer(), 0, (int)data.Length));
+                SendAsTextAsync(data, (b) => {});
+            }
+        }
+
+        protected override void OnMessage(MessageEventArgs e)
+        {
+            Log.Verbose("Received: " + e.Data);
+
+            if (_passwordProvided)
+            {
+                _receiveQueue.Enqueue((this, e.Data));
+            }
+            else
+            {
+                ProximaRequest request;
+
+                try
+                {
+                    request = JsonUtility.FromJson<ProximaRequest>(e.Data);
+                }
+                catch (Exception ex)
+                {
+                    Log.Error("Failed to parse request: " + ex.Message);
+                    return;
+                }
+
+                if (request.Type == ProximaRequestType.List)
+                {
+                    if (_lastListTime != null && DateTime.Now - _lastListTime < TimeSpan.FromSeconds(1))
+                    {
+                        SendMessage(ProximaSerialization.ErrorResponse(request, "Too many requests."));
+                        return;
+                    }
+
+                    _dispatcher.Dispatch(() =>{
+                        SendMessage(ProximaSerialization.DataResponse(request, new ProximaInstanceHello[] { _hello }));
+                    });
+
+                    _lastListTime = DateTime.Now;
+                }
+                else if (request.Type == ProximaRequestType.Select)
+                {
+                    if (_lastSelectTime != null && DateTime.Now - _lastSelectTime < TimeSpan.FromSeconds(1))
+                    {
+                        SendMessage(ProximaSerialization.ErrorResponse(request, "Too many requests."));
+                        return;
+                    }
+
+                    MemoryStream response;
+                    if (request.Cmd != _hello.InstanceId)
+                    {
+                        response = ProximaSerialization.ErrorResponse(request, "Invalid selection.");
+                    }
+                    else if (request.Args.Length != 1 || request.Args[0] != _password)
+                    {
+                        response = ProximaSerialization.ErrorResponse(request, "Invalid password.");
+                    }
+                    else
+                    {
+                        response = ProximaSerialization.DataResponse(request, "OK");
+                        _passwordProvided = true;
+                        _dispatcher.Dispatch(() => _status.IncrementConnections());
+                    }
+
+                    SendMessage(response);
+                    _lastSelectTime = DateTime.Now;
+                }
+                else
+                {
+                    Log.Info("Unknown request: " + request.Type);
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/Embedded/ProximaEmbeddedConnection.cs.meta b/Assets/Proxima/Runtime/Embedded/ProximaEmbeddedConnection.cs.meta
new file mode 100644
index 0000000..9f6c86d
--- /dev/null
+++ b/Assets/Proxima/Runtime/Embedded/ProximaEmbeddedConnection.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 2bd3c2ee267f5b04fb056dceb506920a
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/Embedded/ProximaEmbeddedServer.cs b/Assets/Proxima/Runtime/Embedded/ProximaEmbeddedServer.cs
new file mode 100644
index 0000000..ff890f7
--- /dev/null
+++ b/Assets/Proxima/Runtime/Embedded/ProximaEmbeddedServer.cs
@@ -0,0 +1,171 @@
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Security.Cryptography.X509Certificates;
+using UnityEngine;
+using ProximaWebSocketSharp.Server;
+using System.Net;
+using System.Net.Sockets;
+using System.Threading.Tasks;
+
+namespace Proxima
+{
+    internal class ProximaEmbeddedServer : ProximaServer
+    {
+        private ConcurrentQueue<(ProximaConnection, string)> _receiveQueue;
+        private HttpServer _server;
+        private ProximaDispatcher _dispatcher;
+        private int _port;
+        private bool _useHttps;
+        private PfxAsset _cert;
+        private string _certPass;
+        private Dictionary<string, ProximaStatic.StaticFile> _pathToFile;
+        private ProximaStatus _status;
+
+        public ProximaEmbeddedServer(ProximaDispatcher dispatcher, ProximaStatus status, int port, bool useHttps, PfxAsset cert, string certPass)
+        {
+            _dispatcher = dispatcher;
+            _port = port;
+            _useHttps = useHttps;
+            _cert = cert;
+            _certPass = certPass;
+            _status = status;
+
+            if (_useHttps && _cert == null)
+            {
+                _cert = Resources.Load<PfxAsset>("Proxima/ProximaEmbeddedCert");
+                _certPass = "proximapass";
+            }
+
+            var staticFiles = Resources.Load<ProximaStatic>("Proxima/web");
+            _pathToFile = new Dictionary<string, ProximaStatic.StaticFile>();
+            foreach (var file in staticFiles.Files)
+            {
+                _pathToFile.Add(file.Path, file);
+            }
+        }
+
+        public void Start(string displayName, string password)
+        {
+            _server = new HttpServer(System.Net.IPAddress.Any, _port, _useHttps);
+            _server.Log.Level = ProximaWebSocketSharp.LogLevel.Trace;
+
+            if (_useHttps)
+            {
+                _server.SslConfiguration.ServerCertificate = new X509Certificate2(_cert.Bytes, _certPass);
+                _server.SslConfiguration.EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12;
+            }
+
+            var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
+
+            _server.OnGet += (sender, e) =>
+            {
+                var req = e.Request;
+                var res = e.Response;
+                var path = req.RawUrl.Split('?')[0];
+
+                path = path == "/" ? "index.html" : path.Substring(1);
+
+                if (_pathToFile.TryGetValue(path, out var file) || _pathToFile.TryGetValue(path + ".html", out file))
+                {
+                    var lastModifiedDt = epoch.AddMilliseconds(file.LastModified);
+                    if (req.Headers.AllKeys.Contains("If-Modified-Since"))
+                    {
+                        var ifModifiedSince = req.Headers["If-Modified-Since"];
+
+                        try
+                        {
+                            if (HttpDateParse.ParseHttpDate(ifModifiedSince, out var ifModifiedSinceDt))
+                            {
+                                ifModifiedSinceDt = ifModifiedSinceDt.ToUniversalTime();
+                                if (lastModifiedDt <= ifModifiedSinceDt)
+                                {
+                                    res.StatusCode = 304;
+                                    res.Close();
+                                    return;
+                                }
+                            }
+                        } catch (Exception) {}
+                    }
+
+                    var lastModified = string.Format("{0:ddd, dd MMM yyyy HH:mm:ss} GMT", lastModifiedDt);
+                    res.AppendHeader("Last-Modified", lastModified);
+                    res.ContentEncoding = System.Text.Encoding.UTF8;
+                    res.ContentType = ProximaMimeTypes.Get(Path.GetExtension(file.Path));
+                    res.ContentLength64 = file.Bytes.Length;
+                    res.OutputStream.Write(file.Bytes, 0, file.Bytes.Length);
+                    res.Close();
+                }
+                else
+                {
+                    res.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
+                    res.Close();
+                }
+            };
+
+            _receiveQueue = new ConcurrentQueue<(ProximaConnection, string)>();
+            _server.AddWebSocketService<ProximaEmbeddedConnection>("/api", (api) => api.Initialize(displayName, password, _dispatcher, _status, _receiveQueue));
+
+
+            _server.Start();
+            UpdateConnectionInfo();
+        }
+
+        public async void UpdateConnectionInfo()
+        {
+            var ip = await GetIpAddress();
+            var connectionInfo = (_useHttps ? "https" : "http") + "://" + ip + ":" + _port;
+            Log.Info("Proxima Inspector started on " + connectionInfo);
+            _status.SetConnectInfo(connectionInfo);
+        }
+
+        private async Task<string> GetIpAddress()
+        {
+            try
+            {
+                using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
+                {
+                    // Try to connect to Google DNS servers. This is a more reliable way to get the local IP address.
+                    var task = socket.ConnectAsync("8.8.8.8", 53);
+                    await Task.WhenAny(task, Task.Delay(100));
+                    if (task.Status == TaskStatus.RanToCompletion)
+                    {
+                        return socket.LocalEndPoint.ToString().Split(':')[0];
+                    }
+                }
+            }
+            catch (Exception e)
+            {
+                Log.Exception(e);
+            }
+
+            // If not connected to the internet, or this is taking too long, fallback to the first IPv4 address.
+            return Dns.GetHostEntry(Dns.GetHostName())
+                .AddressList.First(
+                    f => f.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
+                .ToString();
+        }
+
+        public void Stop()
+        {
+            _server?.Stop();
+            _server = null;
+            _receiveQueue = null;
+        }
+
+        public bool TryGetMessage(out (ProximaConnection, string) message)
+        {
+            if (_receiveQueue != null)
+            {
+                return _receiveQueue.TryDequeue(out message);
+            }
+            else
+            {
+                message = (null, "");
+                return false;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/Embedded/ProximaEmbeddedServer.cs.meta b/Assets/Proxima/Runtime/Embedded/ProximaEmbeddedServer.cs.meta
new file mode 100644
index 0000000..2c93a30
--- /dev/null
+++ b/Assets/Proxima/Runtime/Embedded/ProximaEmbeddedServer.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 886fa013fd1b21f4d9e70f837e19dd45
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/Embedded/ProximaStatic.cs b/Assets/Proxima/Runtime/Embedded/ProximaStatic.cs
new file mode 100644
index 0000000..c78e6e4
--- /dev/null
+++ b/Assets/Proxima/Runtime/Embedded/ProximaStatic.cs
@@ -0,0 +1,19 @@
+using System.Collections.Generic;
+using System;
+using UnityEngine;
+
+namespace Proxima
+{
+    public class ProximaStatic : ScriptableObject
+    {
+        [Serializable]
+        public struct StaticFile
+        {
+            public string Path;
+            public byte[] Bytes;
+            public long LastModified;
+        }
+
+        public List<StaticFile> Files;
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/Embedded/ProximaStatic.cs.meta b/Assets/Proxima/Runtime/Embedded/ProximaStatic.cs.meta
new file mode 100644
index 0000000..259460a
--- /dev/null
+++ b/Assets/Proxima/Runtime/Embedded/ProximaStatic.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 43c0651e2177f7b42846248f4ee5d1b6
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/FastJson.cs b/Assets/Proxima/Runtime/FastJson.cs
new file mode 100644
index 0000000..49d46f0
--- /dev/null
+++ b/Assets/Proxima/Runtime/FastJson.cs
@@ -0,0 +1,641 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Reflection;
+using UnityEngine;
+
+namespace Proxima
+{
+    [AttributeUsage(AttributeTargets.Field)]
+    internal class SerializeIfAttribute : Attribute
+    {
+        public string Method;
+
+        public SerializeIfAttribute(string method)
+        {
+            Method = method;
+        }
+    }
+
+    internal class FastJson
+    {
+        private static bool _pretty = false;
+        private static MemoryStream _stream;
+        public static Dictionary<Type, List<FieldInfo>> _typeToObjectFields = new Dictionary<Type, List<FieldInfo>>(100);
+
+        public static MemoryStream Serialize(object data, bool pretty = false)
+        {
+            if (data == null)
+            {
+                return null;
+            }
+
+            _pretty = pretty;
+            _stream = new MemoryStream(1024);
+
+            try
+            {
+                SerializeRecursively(data.GetType(), data, false);
+                _stream.Position = 0;
+                return _stream;
+            }
+            catch (Exception e)
+            {
+                Debug.LogException(e);
+                return null;
+            }
+        }
+
+        private static void SerializeRecursively(Type type, object data, bool quote)
+        {
+            if (TrySerializeValue(type, data, quote))
+            {
+                return;
+            }
+
+            if (typeof(IList).IsAssignableFrom(type))
+            {
+                SerializeList(data);
+                return;
+            }
+
+            if (type.IsArray)
+            {
+                SerializeArray(data);
+                return;
+            }
+
+            if (type.IsSerializable)
+            {
+                SerializeObject(data);
+                return;
+            }
+
+            if (typeof(IEnumerable).IsAssignableFrom(type))
+            {
+                SerializeEnumerable(data);
+                return;
+            }
+
+            throw new Exception($"Unsupported type {type}");
+        }
+
+        private static bool TrySerializeValue(Type type, object data, bool quote)
+        {
+            switch (type)
+            {
+                case Type t when t == typeof(bool): SerializeBool(data); break;
+                case Type t when t == typeof(byte): WriteUInt64((ulong)(byte)data); break;
+                case Type t when t == typeof(sbyte): WriteInt64((long)(sbyte)data); break;
+                case Type t when t == typeof(short): WriteInt64((long)(short)data); break;
+                case Type t when t == typeof(ushort): WriteUInt64((ulong)(ushort)data); break;
+                case Type t when t == typeof(int): WriteInt64((long)(int)data); break;
+                case Type t when t == typeof(uint): WriteUInt64((ulong)(uint)data); break;
+                case Type t when t == typeof(long): WriteInt64((long)data); break;
+                case Type t when t == typeof(ulong): WriteUInt64((ulong)data); break;
+                case Type t when t == typeof(float): SerializeFloat(data); break;
+                case Type t when t == typeof(double): SerializeDouble(data); break;
+                case Type t when t == typeof(string): SerializeString(data, quote); break;
+                case Type t when t == typeof(Vector2): SerializeVector2(data); break;
+                case Type t when t == typeof(Vector3): SerializeVector3(data); break;
+                case Type t when t == typeof(Vector4): SerializeVector4(data); break;
+                case Type t when t == typeof(Vector2Int): SerializeVector2Int(data); break;
+                case Type t when t == typeof(Vector3Int): SerializeVector3Int(data); break;
+                case Type t when t == typeof(Quaternion): SerializeQuaternion(data); break;
+                case Type t when t == typeof(Rect): SerializeRect(data); break;
+                case Type t when t == typeof(RectInt): SerializeRectInt(data); break;
+                case Type t when t == typeof(Bounds): SerializeBounds(data); break;
+                case Type t when t == typeof(BoundsInt): SerializeBoundsInt(data); break;
+                case Type t when t == typeof(Color): SerializeColor(data, quote); break;
+                case Type t when t == typeof(LayerMask): SerializeLayerMask(data); break;
+                case Type t when t.IsEnum: SerializeEnum(data); break;
+                case Type t when t.IsSubclassOf(typeof(UnityEngine.Object)): SerializeUnityObject(type, data, quote); break;
+                default: return false;
+            }
+
+            return true;
+        }
+
+        private static void Write(char value)
+        {
+            _stream.WriteByte((byte)value);
+        }
+
+        private static void Write(string value, int offset, int count)
+        {
+            var encoding = System.Text.Encoding.UTF8;
+            var startLength = (int)_stream.Length;
+            _stream.SetLength(_stream.Length + encoding.GetMaxByteCount(count));
+            var written = encoding.GetBytes(value, offset, count, _stream.GetBuffer(), startLength);
+            _stream.SetLength(startLength + written);
+            _stream.Seek(0, SeekOrigin.End);
+        }
+
+        private static void Write(string value)
+        {
+            Write(value, 0, value.Length);
+        }
+
+        private static void SerializeBool(object data)
+        {
+            SerializeBool(data != null ? (bool)data : false);
+        }
+
+        private static void SerializeBool(bool data)
+        {
+            if (data)
+            {
+                Write("true");
+            }
+            else
+            {
+                Write("false");
+            }
+        }
+
+        private static void SerializeFloat(object data)
+        {
+            SerializeFloat(data != null ? (float)data : 0f);
+        }
+
+        private static void SerializeFloat(float data)
+        {
+            if (float.IsNaN(data))
+            {
+                Write('0');
+                return;
+            }
+
+            if (float.IsInfinity(data))
+            {
+                Write("\"Infinity\"");
+                return;
+            }
+
+            if (float.IsNegativeInfinity(data))
+            {
+                Write("\"-Infinity\"");
+                return;
+            }
+
+            var value = data;
+            Write(value.ToString(CultureInfo.InvariantCulture));
+        }
+
+        private static void SerializeDouble(object data)
+        {
+            SerializeDouble(data != null ? (double)data : 0d);
+        }
+
+        private static void SerializeDouble(double data)
+        {
+            if (double.IsNaN(data))
+            {
+                Write('0');
+                return;
+            }
+
+            if (double.IsInfinity(data))
+            {
+                Write("\"Infinity\"");
+                return;
+            }
+
+            if (double.IsNegativeInfinity(data))
+            {
+                Write("\"-Infinity\"");
+                return;
+            }
+
+            var value = data;
+            Write(value.ToString(CultureInfo.InvariantCulture));
+        }
+
+        private static void SerializeString(object data, bool quote)
+        {
+            var value = (string)data;
+            if (quote)
+            {
+                Write('"');
+            }
+
+            if (String.IsNullOrEmpty(value))
+            {
+                if (quote)
+                {
+                    Write('"');
+                }
+
+                return;
+            }
+
+            int len = value.Length;
+            bool needEncode = false;
+            char c;
+            for (int i = 0; i < len; i++)
+            {
+                c = value[i];
+
+                if (c >= 0 && c <= 31 || c == 34 || c == 39 || c == 60 || c == 62 || c == 92)
+                {
+                    needEncode = true;
+                    break;
+                }
+            }
+
+            if (!needEncode)
+            {
+                Write(value);
+                if (quote)
+                {
+                    Write('"');
+                }
+
+                return;
+            }
+
+            int start = 0;
+            for (int i = 0; i < len; i++)
+            {
+                c = value[i];
+                string escaped = null;
+                if (c >= 0 && c <= 7 || c == 11 || c >= 14 && c <= 31 || c == 39 || c == 60 || c == 62)
+                {
+                    escaped = string.Format("\\u{0:x4}", (int)c);
+                }
+                else switch ((int)c)
+                {
+                    case 8:
+                        escaped = "\\b";
+                        break;
+                    case 9:
+                        escaped = "\\t";
+                        break;
+                    case 10:
+                        escaped = "\\n";
+                        break;
+                    case 12:
+                        escaped = "\\f";
+                        break;
+                    case 13:
+                        escaped = "\\r";
+                        break;
+                    case 34:
+                        escaped = "\\\"";
+                        break;
+                    case 92:
+                        escaped = "\\\\";
+                        break;
+                }
+
+                if (escaped != null)
+                {
+                    if (start < i)
+                    {
+                        Write(value.Substring(start, i - start));
+                    }
+
+                    Write(escaped);
+                    start = i + 1;
+                }
+            }
+
+            if (start < len)
+            {
+                Write(value.Substring(start));
+            }
+
+            if (quote)
+            {
+                Write('"');
+            }
+        }
+
+        private static void SerializeParams<T>(params T[] values)
+        {
+            SerializeList(values);
+        }
+
+        private static void SerializeVector2(object data)
+        {
+            var v = (data != null) ? (Vector2)data : Vector2.zero;
+            SerializeParams(v.x, v.y);
+        }
+
+        private static void SerializeVector3(object data)
+        {
+            var v = (data != null) ? (Vector3)data : Vector3.zero;
+            SerializeParams(v.x, v.y, v.z);
+        }
+
+        private static void SerializeVector4(object data)
+        {
+            var v = (data != null) ? (Vector4)data : Vector4.zero;
+            SerializeParams(v.x, v.y, v.z, v.w);
+        }
+
+        private static void SerializeVector2Int(object data)
+        {
+            var v = (data != null) ? (Vector2Int)data : Vector2Int.zero;
+            SerializeParams(v.x, v.y);
+        }
+
+        private static void SerializeVector3Int(object data)
+        {
+            var v = (data != null) ? (Vector3Int)data : Vector3Int.zero;
+            SerializeParams(v.x, v.y, v.z);
+        }
+
+        private static void SerializeQuaternion(object data)
+        {
+            var euler = (data != null) ? ((Quaternion)data).eulerAngles : Vector3.zero;
+            SerializeVector3(euler);
+        }
+
+        private static void SerializeRect(object data)
+        {
+            var r = (data != null) ? (Rect)data : Rect.zero;
+            SerializeParams(r.x, r.y, r.width, r.height);
+        }
+
+        private static void SerializeRectInt(object data)
+        {
+            var r = (data != null) ? (RectInt)data : new RectInt(0, 0, 0, 0);
+            SerializeParams(r.x, r.y, r.width, r.height);
+        }
+
+        private static void SerializeBounds(object data)
+        {
+            var b = (data != null) ? (Bounds)data : new Bounds(Vector3.zero, Vector3.zero);
+            SerializeParams(b.center.x, b.center.y, b.center.z, b.size.x, b.size.y, b.size.z);
+        }
+
+        private static void SerializeBoundsInt(object data)
+        {
+            var b = (data != null) ? (BoundsInt)data : new BoundsInt(Vector3Int.zero, Vector3Int.zero);
+            SerializeParams(b.position.x, b.position.y, b.position.z, b.size.x, b.size.y, b.size.z);
+        }
+
+        private static void WriteHex(byte value)
+        {
+            byte high = (byte)(value >> 4);
+            byte low = (byte)(value & 15);
+            Write((char)(high < 10 ? high + 48 : high + 55));
+            Write((char)(low < 10 ? low + 48 : low + 55));
+        }
+
+        private static void SerializeColor(object data, bool quote)
+        {
+            var color = data != null ? (Color)data : Color.black;
+            if (quote)
+            {
+                Write('"');
+            }
+
+            Write('#');
+            WriteHex((byte)(color.r * 255));
+            WriteHex((byte)(color.g * 255));
+            WriteHex((byte)(color.b * 255));
+            WriteHex((byte)(color.a * 255));
+
+            if (quote)
+            {
+                Write('"');
+            }
+        }
+
+        private static void SerializeLayerMask(object data)
+        {
+            var value = (LayerMask)data;
+            WriteInt64(value.value);
+        }
+
+        private static void SerializeEnum(object data)
+        {
+            if (data == null)
+            {
+                Write('0');
+                return;
+            }
+
+            var underlyingType = Enum.GetUnderlyingType(data.GetType());
+            switch (underlyingType)
+            {
+                case Type t when t == typeof(byte): WriteUInt64((byte)data); break;
+                case Type t when t == typeof(sbyte): WriteInt64((sbyte)data); break;
+                case Type t when t == typeof(short): WriteInt64((short)data); break;
+                case Type t when t == typeof(ushort): WriteUInt64((ushort)data); break;
+                case Type t when t == typeof(int): WriteInt64((int)data); break;
+                case Type t when t == typeof(uint): WriteUInt64((uint)data); break;
+                case Type t when t == typeof(long): WriteInt64((long)data); break;
+                case Type t when t == typeof(ulong): WriteUInt64((ulong)data); break;
+                default: throw new Exception($"Unsupported enum type {underlyingType}");
+            }
+        }
+
+        private static void SerializeUnityObject(Type type, object data, bool quote)
+        {
+            var value = (UnityEngine.Object)data;
+            if (value == null)
+            {
+                Write("null");
+                return;
+            }
+
+            SerializeString(value.name, quote);
+        }
+
+        private static void SerializeList(object data)
+        {
+            var list = (IList)data;
+            Write('[');
+            var first = true;
+            var elementType = list.GetType().GetElementType();
+            for (int i = 0; i < list.Count; i++)
+            {
+                var item = list[i];
+                if (!first)
+                {
+                    if (_pretty)
+                    {
+                        Write(", ");
+                    }
+                    else
+                    {
+                        Write(',');
+                    }
+                }
+
+                SerializeRecursively(item != null ? item.GetType() : elementType, item, true);
+                first = false;
+            }
+
+            Write(']');
+        }
+
+        private static void SerializeArray(object data)
+        {
+            var array = (Array)data;
+            Write('[');
+            var first = true;
+            var elementType = array.GetType().GetElementType();
+            for (int i = 0; i < array.Length; i++)
+            {
+                var item = array.GetValue(i);
+                if (!first)
+                {
+                    if (_pretty)
+                    {
+                        Write(", ");
+                    }
+                    else
+                    {
+                        Write(',');
+                    }
+                }
+
+                SerializeRecursively(item != null ? item.GetType() : elementType, item, true);
+                first = false;
+            }
+
+            Write(']');
+        }
+
+        private static void SerializeEnumerable(object data)
+        {
+            var enumerable = (IEnumerable)data;
+            Write('[');
+            var first = true;
+            var genericType = data.GetType().GetGenericArguments()[0];
+            foreach (var item in enumerable)
+            {
+                if (!first)
+                {
+                    if (_pretty)
+                    {
+                        Write(", ");
+                    }
+                    else
+                    {
+                        Write(',');
+                    }
+                }
+
+                SerializeRecursively(item != null ? item.GetType() : genericType, item, true);
+                first = false;
+            }
+
+            Write(']');
+        }
+
+        private static void SerializeObject(object data)
+        {
+            if (data == null)
+            {
+                Write("null");
+            }
+
+            var type = data.GetType();
+            var json = JsonUtility.ToJson(data);
+
+            if (!_typeToObjectFields.TryGetValue(type, out var objectFields))
+            {
+                objectFields = new List<FieldInfo>();
+                foreach (var field in type.GetFields(BindingFlags.Public | BindingFlags.Instance))
+                {
+                    if ((field.FieldType == typeof(object) || field.FieldType == typeof(object[]))
+                        && !Attribute.IsDefined(field, typeof(NonSerializedAttribute)))
+                    {
+                        objectFields.Add(field);
+                    }
+                }
+
+                _typeToObjectFields.Add(type, objectFields);
+            }
+
+            if (objectFields.Count > 0)
+            {
+                Write(json, 0, json.Length - 1);
+                foreach (var field in objectFields)
+                {
+                    var value = field.GetValue(data);
+                    if (value != null)
+                    {
+                        var serializeIf = field.GetCustomAttribute<SerializeIfAttribute>();
+                        if (serializeIf != null)
+                        {
+                            var conditionMethod = data.GetType().GetMethod(serializeIf.Method, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
+                            if (conditionMethod == null)
+                            {
+                                throw new Exception($"Method {serializeIf.Method} not found in {data.GetType()}");
+                            }
+
+                            var shouldSerialize = (bool)conditionMethod.Invoke(data, null);
+                            if (!shouldSerialize)
+                            {
+                                continue;
+                            }
+                        }
+
+                        if (json.Length > 2)
+                        {
+                            Write(',');
+                        }
+
+                        Write('"');
+                        Write(field.Name);
+                        Write("\":");
+                        SerializeRecursively(value.GetType(), value, true);
+                    }
+                }
+                Write('}');
+            }
+            else
+            {
+                Write(json);
+            }
+        }
+
+        private static void WriteInt64(long data)
+        {
+            var value = (long)data;
+            if (value < 0)
+            {
+                if (value == long.MinValue) // -9223372036854775808
+                {
+                    Write("-9223372036854775808");
+                    return;
+                }
+
+                Write('-');
+                value = unchecked(-value);
+            }
+
+            WriteUInt64((ulong)value);
+        }
+
+        private static void WriteUInt64(ulong value)
+        {
+            var start = _stream.Length;
+            var buf = _stream.GetBuffer();
+
+            while (value > 9)
+            {
+                var digit = value % 10;
+                value /= 10;
+                _stream.WriteByte((byte)('0' + digit));
+            }
+
+            _stream.WriteByte((byte)('0' + value));
+            var newLength = _stream.Length;
+            for (int i = 0; i < (newLength - start) / 2; i++)
+            {
+                var tmp = buf[start + i];
+                buf[start + i] = buf[newLength - i - 1];
+                buf[newLength - i - 1] = tmp;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/FastJson.cs.meta b/Assets/Proxima/Runtime/FastJson.cs.meta
new file mode 100644
index 0000000..c364e6e
--- /dev/null
+++ b/Assets/Proxima/Runtime/FastJson.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ea1dc8830e236d145a577c7f26fd36d4
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/Generated.meta b/Assets/Proxima/Runtime/Generated.meta
new file mode 100644
index 0000000..927a963
--- /dev/null
+++ b/Assets/Proxima/Runtime/Generated.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: d48c9afd792220c4da8fadca29a741db
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/Generated/ProximaReflection.Generated.cs b/Assets/Proxima/Runtime/Generated/ProximaReflection.Generated.cs
new file mode 100644
index 0000000..6eab793
--- /dev/null
+++ b/Assets/Proxima/Runtime/Generated/ProximaReflection.Generated.cs
@@ -0,0 +1,1939 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace Proxima
+{
+    using UnityProperty = ProximaComponentCommands.PropertyInfo;
+
+    internal static class ProximaReflection_Generated
+    {
+        public static Dictionary<string, UnityProperty[]> Properties = new Dictionary<string, UnityProperty[]>
+        {
+        #if UNITY_ANIMATION
+            { "UnityEngine.Animations.AimConstraint", new UnityProperty[] {
+                new UnityProperty { Name = "constraintActive", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Animations.AimConstraint)o).constraintActive = (System.Boolean)v, Getter = (o) => ((UnityEngine.Animations.AimConstraint)o).constraintActive, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.AimConstraint)o).constraintActive; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "weight", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.Animations.AimConstraint)o).weight = (System.Single)v, Getter = (o) => ((UnityEngine.Animations.AimConstraint)o).weight, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.AimConstraint)o).weight; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "aimVector", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((UnityEngine.Animations.AimConstraint)o).aimVector = (UnityEngine.Vector3)v, Getter = (o) => ((UnityEngine.Animations.AimConstraint)o).aimVector, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.AimConstraint)o).aimVector; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "upVector", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((UnityEngine.Animations.AimConstraint)o).upVector = (UnityEngine.Vector3)v, Getter = (o) => ((UnityEngine.Animations.AimConstraint)o).upVector, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.AimConstraint)o).upVector; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "worldUpType", PropertyType = typeof(UnityEngine.Animations.AimConstraint.WorldUpType), Setter = (o, v) => ((UnityEngine.Animations.AimConstraint)o).worldUpType = (UnityEngine.Animations.AimConstraint.WorldUpType)v, Getter = (o) => ((UnityEngine.Animations.AimConstraint)o).worldUpType, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.Animations.AimConstraint)o).worldUpType; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "worldUpVector", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((UnityEngine.Animations.AimConstraint)o).worldUpVector = (UnityEngine.Vector3)v, Getter = (o) => ((UnityEngine.Animations.AimConstraint)o).worldUpVector, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.AimConstraint)o).worldUpVector; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "worldUpObject", PropertyType = typeof(UnityEngine.Transform), Setter = (o, v) => ((UnityEngine.Animations.AimConstraint)o).worldUpObject = (UnityEngine.Transform)v, Getter = (o) => ((UnityEngine.Animations.AimConstraint)o).worldUpObject, },
+                new UnityProperty { Name = "locked", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Animations.AimConstraint)o).locked = (System.Boolean)v, Getter = (o) => ((UnityEngine.Animations.AimConstraint)o).locked, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.AimConstraint)o).locked; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "rotationAtRest", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((UnityEngine.Animations.AimConstraint)o).rotationAtRest = (UnityEngine.Vector3)v, Getter = (o) => ((UnityEngine.Animations.AimConstraint)o).rotationAtRest, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.AimConstraint)o).rotationAtRest; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "rotationOffset", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((UnityEngine.Animations.AimConstraint)o).rotationOffset = (UnityEngine.Vector3)v, Getter = (o) => ((UnityEngine.Animations.AimConstraint)o).rotationOffset, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.AimConstraint)o).rotationOffset; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "rotationAxis", PropertyType = typeof(UnityEngine.Animations.Axis), Setter = (o, v) => ((UnityEngine.Animations.AimConstraint)o).rotationAxis = (UnityEngine.Animations.Axis)v, Getter = (o) => ((UnityEngine.Animations.AimConstraint)o).rotationAxis, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.Animations.AimConstraint)o).rotationAxis; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Animations.AimConstraint)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.Animations.AimConstraint)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.AimConstraint)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_ANIMATION
+            { "UnityEngine.Animation", new UnityProperty[] {
+                new UnityProperty { Name = "clip", PropertyType = typeof(UnityEngine.AnimationClip), Setter = (o, v) => ((Animation)o).clip = (UnityEngine.AnimationClip)v, Getter = (o) => ((Animation)o).clip, },
+                new UnityProperty { Name = "playAutomatically", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Animation)o).playAutomatically = (System.Boolean)v, Getter = (o) => ((Animation)o).playAutomatically, Updater = (object o, ref object v) => { var x = ((Animation)o).playAutomatically; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "animatePhysics", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Animation)o).animatePhysics = (System.Boolean)v, Getter = (o) => ((Animation)o).animatePhysics, Updater = (object o, ref object v) => { var x = ((Animation)o).animatePhysics; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "cullingType", PropertyType = typeof(UnityEngine.AnimationCullingType), Setter = (o, v) => ((Animation)o).cullingType = (UnityEngine.AnimationCullingType)v, Getter = (o) => ((Animation)o).cullingType, Updater = (object o, ref object v) => { var x = (int)((Animation)o).cullingType; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Animation)o).enabled = (System.Boolean)v, Getter = (o) => ((Animation)o).enabled, Updater = (object o, ref object v) => { var x = ((Animation)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_ANIMATION
+            { "UnityEngine.Animator", new UnityProperty[] {
+                new UnityProperty { Name = "runtimeAnimatorController", PropertyType = typeof(UnityEngine.RuntimeAnimatorController), Setter = (o, v) => ((Animator)o).runtimeAnimatorController = (UnityEngine.RuntimeAnimatorController)v, Getter = (o) => ((Animator)o).runtimeAnimatorController, },
+                new UnityProperty { Name = "avatar", PropertyType = typeof(UnityEngine.Avatar), Setter = (o, v) => ((Animator)o).avatar = (UnityEngine.Avatar)v, Getter = (o) => ((Animator)o).avatar, },
+                new UnityProperty { Name = "applyRootMotion", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Animator)o).applyRootMotion = (System.Boolean)v, Getter = (o) => ((Animator)o).applyRootMotion, Updater = (object o, ref object v) => { var x = ((Animator)o).applyRootMotion; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "updateMode", PropertyType = typeof(UnityEngine.AnimatorUpdateMode), Setter = (o, v) => ((Animator)o).updateMode = (UnityEngine.AnimatorUpdateMode)v, Getter = (o) => ((Animator)o).updateMode, Updater = (object o, ref object v) => { var x = (int)((Animator)o).updateMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "cullingMode", PropertyType = typeof(UnityEngine.AnimatorCullingMode), Setter = (o, v) => ((Animator)o).cullingMode = (UnityEngine.AnimatorCullingMode)v, Getter = (o) => ((Animator)o).cullingMode, Updater = (object o, ref object v) => { var x = (int)((Animator)o).cullingMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Animator)o).enabled = (System.Boolean)v, Getter = (o) => ((Animator)o).enabled, Updater = (object o, ref object v) => { var x = ((Animator)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.AreaEffector2D", new UnityProperty[] {
+                new UnityProperty { Name = "useColliderMask", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((AreaEffector2D)o).useColliderMask = (System.Boolean)v, Getter = (o) => ((AreaEffector2D)o).useColliderMask, Updater = (object o, ref object v) => { var x = ((AreaEffector2D)o).useColliderMask; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "colliderMask", PropertyType = typeof(System.Int32), Setter = (o, v) => ((AreaEffector2D)o).colliderMask = (System.Int32)v, Getter = (o) => ((AreaEffector2D)o).colliderMask, Updater = (object o, ref object v) => { var x = ((AreaEffector2D)o).colliderMask; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useGlobalAngle", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((AreaEffector2D)o).useGlobalAngle = (System.Boolean)v, Getter = (o) => ((AreaEffector2D)o).useGlobalAngle, Updater = (object o, ref object v) => { var x = ((AreaEffector2D)o).useGlobalAngle; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "forceAngle", PropertyType = typeof(System.Single), Setter = (o, v) => ((AreaEffector2D)o).forceAngle = (System.Single)v, Getter = (o) => ((AreaEffector2D)o).forceAngle, Updater = (object o, ref object v) => { var x = ((AreaEffector2D)o).forceAngle; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "forceMagnitude", PropertyType = typeof(System.Single), Setter = (o, v) => ((AreaEffector2D)o).forceMagnitude = (System.Single)v, Getter = (o) => ((AreaEffector2D)o).forceMagnitude, Updater = (object o, ref object v) => { var x = ((AreaEffector2D)o).forceMagnitude; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "forceVariation", PropertyType = typeof(System.Single), Setter = (o, v) => ((AreaEffector2D)o).forceVariation = (System.Single)v, Getter = (o) => ((AreaEffector2D)o).forceVariation, Updater = (object o, ref object v) => { var x = ((AreaEffector2D)o).forceVariation; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "forceTarget", PropertyType = typeof(UnityEngine.EffectorSelection2D), Setter = (o, v) => ((AreaEffector2D)o).forceTarget = (UnityEngine.EffectorSelection2D)v, Getter = (o) => ((AreaEffector2D)o).forceTarget, Updater = (object o, ref object v) => { var x = (int)((AreaEffector2D)o).forceTarget; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "drag", PropertyType = typeof(System.Single), Setter = (o, v) => ((AreaEffector2D)o).drag = (System.Single)v, Getter = (o) => ((AreaEffector2D)o).drag, Updater = (object o, ref object v) => { var x = ((AreaEffector2D)o).drag; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "angularDrag", PropertyType = typeof(System.Single), Setter = (o, v) => ((AreaEffector2D)o).angularDrag = (System.Single)v, Getter = (o) => ((AreaEffector2D)o).angularDrag, Updater = (object o, ref object v) => { var x = ((AreaEffector2D)o).angularDrag; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((AreaEffector2D)o).enabled = (System.Boolean)v, Getter = (o) => ((AreaEffector2D)o).enabled, Updater = (object o, ref object v) => { var x = ((AreaEffector2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_2020_3_OR_NEWER&&UNITY_PHYSICS
+            { "UnityEngine.ArticulationBody", new UnityProperty[] {
+                new UnityProperty { Name = "mass", PropertyType = typeof(System.Single), Setter = (o, v) => ((ArticulationBody)o).mass = (System.Single)v, Getter = (o) => ((ArticulationBody)o).mass, Updater = (object o, ref object v) => { var x = ((ArticulationBody)o).mass; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useGravity", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((ArticulationBody)o).useGravity = (System.Boolean)v, Getter = (o) => ((ArticulationBody)o).useGravity, Updater = (object o, ref object v) => { var x = ((ArticulationBody)o).useGravity; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "immovable", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((ArticulationBody)o).immovable = (System.Boolean)v, Getter = (o) => ((ArticulationBody)o).immovable, Updater = (object o, ref object v) => { var x = ((ArticulationBody)o).immovable; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "linearDamping", PropertyType = typeof(System.Single), Setter = (o, v) => ((ArticulationBody)o).linearDamping = (System.Single)v, Getter = (o) => ((ArticulationBody)o).linearDamping, Updater = (object o, ref object v) => { var x = ((ArticulationBody)o).linearDamping; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "angularDamping", PropertyType = typeof(System.Single), Setter = (o, v) => ((ArticulationBody)o).angularDamping = (System.Single)v, Getter = (o) => ((ArticulationBody)o).angularDamping, Updater = (object o, ref object v) => { var x = ((ArticulationBody)o).angularDamping; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "collisionDetectionMode", PropertyType = typeof(UnityEngine.CollisionDetectionMode), Setter = (o, v) => ((ArticulationBody)o).collisionDetectionMode = (UnityEngine.CollisionDetectionMode)v, Getter = (o) => ((ArticulationBody)o).collisionDetectionMode, Updater = (object o, ref object v) => { var x = (int)((ArticulationBody)o).collisionDetectionMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((ArticulationBody)o).enabled = (System.Boolean)v, Getter = (o) => ((ArticulationBody)o).enabled, Updater = (object o, ref object v) => { var x = ((ArticulationBody)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_AUDIO
+            { "UnityEngine.AudioChorusFilter", new UnityProperty[] {
+                new UnityProperty { Name = "dryMix", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioChorusFilter)o).dryMix = (System.Single)v, Getter = (o) => ((AudioChorusFilter)o).dryMix, Updater = (object o, ref object v) => { var x = ((AudioChorusFilter)o).dryMix; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "wetMix1", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioChorusFilter)o).wetMix1 = (System.Single)v, Getter = (o) => ((AudioChorusFilter)o).wetMix1, Updater = (object o, ref object v) => { var x = ((AudioChorusFilter)o).wetMix1; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "wetMix2", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioChorusFilter)o).wetMix2 = (System.Single)v, Getter = (o) => ((AudioChorusFilter)o).wetMix2, Updater = (object o, ref object v) => { var x = ((AudioChorusFilter)o).wetMix2; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "wetMix3", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioChorusFilter)o).wetMix3 = (System.Single)v, Getter = (o) => ((AudioChorusFilter)o).wetMix3, Updater = (object o, ref object v) => { var x = ((AudioChorusFilter)o).wetMix3; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "delay", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioChorusFilter)o).delay = (System.Single)v, Getter = (o) => ((AudioChorusFilter)o).delay, Updater = (object o, ref object v) => { var x = ((AudioChorusFilter)o).delay; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "rate", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioChorusFilter)o).rate = (System.Single)v, Getter = (o) => ((AudioChorusFilter)o).rate, Updater = (object o, ref object v) => { var x = ((AudioChorusFilter)o).rate; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "depth", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioChorusFilter)o).depth = (System.Single)v, Getter = (o) => ((AudioChorusFilter)o).depth, Updater = (object o, ref object v) => { var x = ((AudioChorusFilter)o).depth; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((AudioChorusFilter)o).enabled = (System.Boolean)v, Getter = (o) => ((AudioChorusFilter)o).enabled, Updater = (object o, ref object v) => { var x = ((AudioChorusFilter)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_AUDIO
+            { "UnityEngine.AudioDistortionFilter", new UnityProperty[] {
+                new UnityProperty { Name = "distortionLevel", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioDistortionFilter)o).distortionLevel = (System.Single)v, Getter = (o) => ((AudioDistortionFilter)o).distortionLevel, Updater = (object o, ref object v) => { var x = ((AudioDistortionFilter)o).distortionLevel; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((AudioDistortionFilter)o).enabled = (System.Boolean)v, Getter = (o) => ((AudioDistortionFilter)o).enabled, Updater = (object o, ref object v) => { var x = ((AudioDistortionFilter)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_AUDIO
+            { "UnityEngine.AudioEchoFilter", new UnityProperty[] {
+                new UnityProperty { Name = "delay", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioEchoFilter)o).delay = (System.Single)v, Getter = (o) => ((AudioEchoFilter)o).delay, Updater = (object o, ref object v) => { var x = ((AudioEchoFilter)o).delay; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "decayRatio", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioEchoFilter)o).decayRatio = (System.Single)v, Getter = (o) => ((AudioEchoFilter)o).decayRatio, Updater = (object o, ref object v) => { var x = ((AudioEchoFilter)o).decayRatio; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "dryMix", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioEchoFilter)o).dryMix = (System.Single)v, Getter = (o) => ((AudioEchoFilter)o).dryMix, Updater = (object o, ref object v) => { var x = ((AudioEchoFilter)o).dryMix; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "wetMix", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioEchoFilter)o).wetMix = (System.Single)v, Getter = (o) => ((AudioEchoFilter)o).wetMix, Updater = (object o, ref object v) => { var x = ((AudioEchoFilter)o).wetMix; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((AudioEchoFilter)o).enabled = (System.Boolean)v, Getter = (o) => ((AudioEchoFilter)o).enabled, Updater = (object o, ref object v) => { var x = ((AudioEchoFilter)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_AUDIO
+            { "UnityEngine.AudioHighPassFilter", new UnityProperty[] {
+                new UnityProperty { Name = "cutoffFrequency", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioHighPassFilter)o).cutoffFrequency = (System.Single)v, Getter = (o) => ((AudioHighPassFilter)o).cutoffFrequency, Updater = (object o, ref object v) => { var x = ((AudioHighPassFilter)o).cutoffFrequency; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "highpassResonanceQ", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioHighPassFilter)o).highpassResonanceQ = (System.Single)v, Getter = (o) => ((AudioHighPassFilter)o).highpassResonanceQ, Updater = (object o, ref object v) => { var x = ((AudioHighPassFilter)o).highpassResonanceQ; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((AudioHighPassFilter)o).enabled = (System.Boolean)v, Getter = (o) => ((AudioHighPassFilter)o).enabled, Updater = (object o, ref object v) => { var x = ((AudioHighPassFilter)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_AUDIO
+            { "UnityEngine.AudioLowPassFilter", new UnityProperty[] {
+                new UnityProperty { Name = "cutoffFrequency", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioLowPassFilter)o).cutoffFrequency = (System.Single)v, Getter = (o) => ((AudioLowPassFilter)o).cutoffFrequency, Updater = (object o, ref object v) => { var x = ((AudioLowPassFilter)o).cutoffFrequency; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "lowpassResonanceQ", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioLowPassFilter)o).lowpassResonanceQ = (System.Single)v, Getter = (o) => ((AudioLowPassFilter)o).lowpassResonanceQ, Updater = (object o, ref object v) => { var x = ((AudioLowPassFilter)o).lowpassResonanceQ; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((AudioLowPassFilter)o).enabled = (System.Boolean)v, Getter = (o) => ((AudioLowPassFilter)o).enabled, Updater = (object o, ref object v) => { var x = ((AudioLowPassFilter)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_AUDIO
+            { "UnityEngine.AudioReverbFilter", new UnityProperty[] {
+                new UnityProperty { Name = "reverbPreset", PropertyType = typeof(UnityEngine.AudioReverbPreset), Setter = (o, v) => ((AudioReverbFilter)o).reverbPreset = (UnityEngine.AudioReverbPreset)v, Getter = (o) => ((AudioReverbFilter)o).reverbPreset, Updater = (object o, ref object v) => { var x = (int)((AudioReverbFilter)o).reverbPreset; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "dryLevel", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbFilter)o).dryLevel = (System.Single)v, Getter = (o) => ((AudioReverbFilter)o).dryLevel, Updater = (object o, ref object v) => { var x = ((AudioReverbFilter)o).dryLevel; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "room", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbFilter)o).room = (System.Single)v, Getter = (o) => ((AudioReverbFilter)o).room, Updater = (object o, ref object v) => { var x = ((AudioReverbFilter)o).room; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "roomHF", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbFilter)o).roomHF = (System.Single)v, Getter = (o) => ((AudioReverbFilter)o).roomHF, Updater = (object o, ref object v) => { var x = ((AudioReverbFilter)o).roomHF; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "roomLF", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbFilter)o).roomLF = (System.Single)v, Getter = (o) => ((AudioReverbFilter)o).roomLF, Updater = (object o, ref object v) => { var x = ((AudioReverbFilter)o).roomLF; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "decayTime", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbFilter)o).decayTime = (System.Single)v, Getter = (o) => ((AudioReverbFilter)o).decayTime, Updater = (object o, ref object v) => { var x = ((AudioReverbFilter)o).decayTime; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "decayHFRatio", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbFilter)o).decayHFRatio = (System.Single)v, Getter = (o) => ((AudioReverbFilter)o).decayHFRatio, Updater = (object o, ref object v) => { var x = ((AudioReverbFilter)o).decayHFRatio; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "reflectionsLevel", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbFilter)o).reflectionsLevel = (System.Single)v, Getter = (o) => ((AudioReverbFilter)o).reflectionsLevel, Updater = (object o, ref object v) => { var x = ((AudioReverbFilter)o).reflectionsLevel; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "reflectionsDelay", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbFilter)o).reflectionsDelay = (System.Single)v, Getter = (o) => ((AudioReverbFilter)o).reflectionsDelay, Updater = (object o, ref object v) => { var x = ((AudioReverbFilter)o).reflectionsDelay; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "reverbLevel", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbFilter)o).reverbLevel = (System.Single)v, Getter = (o) => ((AudioReverbFilter)o).reverbLevel, Updater = (object o, ref object v) => { var x = ((AudioReverbFilter)o).reverbLevel; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "reverbDelay", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbFilter)o).reverbDelay = (System.Single)v, Getter = (o) => ((AudioReverbFilter)o).reverbDelay, Updater = (object o, ref object v) => { var x = ((AudioReverbFilter)o).reverbDelay; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "hfReference", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbFilter)o).hfReference = (System.Single)v, Getter = (o) => ((AudioReverbFilter)o).hfReference, Updater = (object o, ref object v) => { var x = ((AudioReverbFilter)o).hfReference; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "lfReference", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbFilter)o).lfReference = (System.Single)v, Getter = (o) => ((AudioReverbFilter)o).lfReference, Updater = (object o, ref object v) => { var x = ((AudioReverbFilter)o).lfReference; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "diffusion", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbFilter)o).diffusion = (System.Single)v, Getter = (o) => ((AudioReverbFilter)o).diffusion, Updater = (object o, ref object v) => { var x = ((AudioReverbFilter)o).diffusion; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "density", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbFilter)o).density = (System.Single)v, Getter = (o) => ((AudioReverbFilter)o).density, Updater = (object o, ref object v) => { var x = ((AudioReverbFilter)o).density; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((AudioReverbFilter)o).enabled = (System.Boolean)v, Getter = (o) => ((AudioReverbFilter)o).enabled, Updater = (object o, ref object v) => { var x = ((AudioReverbFilter)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_AUDIO
+            { "UnityEngine.AudioReverbZone", new UnityProperty[] {
+                new UnityProperty { Name = "minDistance", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbZone)o).minDistance = (System.Single)v, Getter = (o) => ((AudioReverbZone)o).minDistance, Updater = (object o, ref object v) => { var x = ((AudioReverbZone)o).minDistance; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "maxDistance", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbZone)o).maxDistance = (System.Single)v, Getter = (o) => ((AudioReverbZone)o).maxDistance, Updater = (object o, ref object v) => { var x = ((AudioReverbZone)o).maxDistance; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "reverbPreset", PropertyType = typeof(UnityEngine.AudioReverbPreset), Setter = (o, v) => ((AudioReverbZone)o).reverbPreset = (UnityEngine.AudioReverbPreset)v, Getter = (o) => ((AudioReverbZone)o).reverbPreset, Updater = (object o, ref object v) => { var x = (int)((AudioReverbZone)o).reverbPreset; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "room", PropertyType = typeof(System.Int32), Setter = (o, v) => ((AudioReverbZone)o).room = (System.Int32)v, Getter = (o) => ((AudioReverbZone)o).room, Updater = (object o, ref object v) => { var x = ((AudioReverbZone)o).room; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "roomHF", PropertyType = typeof(System.Int32), Setter = (o, v) => ((AudioReverbZone)o).roomHF = (System.Int32)v, Getter = (o) => ((AudioReverbZone)o).roomHF, Updater = (object o, ref object v) => { var x = ((AudioReverbZone)o).roomHF; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "roomLF", PropertyType = typeof(System.Int32), Setter = (o, v) => ((AudioReverbZone)o).roomLF = (System.Int32)v, Getter = (o) => ((AudioReverbZone)o).roomLF, Updater = (object o, ref object v) => { var x = ((AudioReverbZone)o).roomLF; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "decayTime", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbZone)o).decayTime = (System.Single)v, Getter = (o) => ((AudioReverbZone)o).decayTime, Updater = (object o, ref object v) => { var x = ((AudioReverbZone)o).decayTime; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "decayHFRatio", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbZone)o).decayHFRatio = (System.Single)v, Getter = (o) => ((AudioReverbZone)o).decayHFRatio, Updater = (object o, ref object v) => { var x = ((AudioReverbZone)o).decayHFRatio; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "reflections", PropertyType = typeof(System.Int32), Setter = (o, v) => ((AudioReverbZone)o).reflections = (System.Int32)v, Getter = (o) => ((AudioReverbZone)o).reflections, Updater = (object o, ref object v) => { var x = ((AudioReverbZone)o).reflections; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "reflectionsDelay", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbZone)o).reflectionsDelay = (System.Single)v, Getter = (o) => ((AudioReverbZone)o).reflectionsDelay, Updater = (object o, ref object v) => { var x = ((AudioReverbZone)o).reflectionsDelay; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "reverb", PropertyType = typeof(System.Int32), Setter = (o, v) => ((AudioReverbZone)o).reverb = (System.Int32)v, Getter = (o) => ((AudioReverbZone)o).reverb, Updater = (object o, ref object v) => { var x = ((AudioReverbZone)o).reverb; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "reverbDelay", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbZone)o).reverbDelay = (System.Single)v, Getter = (o) => ((AudioReverbZone)o).reverbDelay, Updater = (object o, ref object v) => { var x = ((AudioReverbZone)o).reverbDelay; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "HFReference", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbZone)o).HFReference = (System.Single)v, Getter = (o) => ((AudioReverbZone)o).HFReference, Updater = (object o, ref object v) => { var x = ((AudioReverbZone)o).HFReference; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "LFReference", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbZone)o).LFReference = (System.Single)v, Getter = (o) => ((AudioReverbZone)o).LFReference, Updater = (object o, ref object v) => { var x = ((AudioReverbZone)o).LFReference; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "diffusion", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbZone)o).diffusion = (System.Single)v, Getter = (o) => ((AudioReverbZone)o).diffusion, Updater = (object o, ref object v) => { var x = ((AudioReverbZone)o).diffusion; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "density", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioReverbZone)o).density = (System.Single)v, Getter = (o) => ((AudioReverbZone)o).density, Updater = (object o, ref object v) => { var x = ((AudioReverbZone)o).density; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((AudioReverbZone)o).enabled = (System.Boolean)v, Getter = (o) => ((AudioReverbZone)o).enabled, Updater = (object o, ref object v) => { var x = ((AudioReverbZone)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_AUDIO
+            { "UnityEngine.AudioSource", new UnityProperty[] {
+                new UnityProperty { Name = "clip", PropertyType = typeof(UnityEngine.AudioClip), Setter = (o, v) => ((AudioSource)o).clip = (UnityEngine.AudioClip)v, Getter = (o) => ((AudioSource)o).clip, },
+                new UnityProperty { Name = "outputAudioMixerGroup", PropertyType = typeof(UnityEngine.Audio.AudioMixerGroup), Setter = (o, v) => ((AudioSource)o).outputAudioMixerGroup = (UnityEngine.Audio.AudioMixerGroup)v, Getter = (o) => ((AudioSource)o).outputAudioMixerGroup, },
+                new UnityProperty { Name = "mute", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((AudioSource)o).mute = (System.Boolean)v, Getter = (o) => ((AudioSource)o).mute, Updater = (object o, ref object v) => { var x = ((AudioSource)o).mute; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "bypassEffects", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((AudioSource)o).bypassEffects = (System.Boolean)v, Getter = (o) => ((AudioSource)o).bypassEffects, Updater = (object o, ref object v) => { var x = ((AudioSource)o).bypassEffects; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "bypassListenerEffects", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((AudioSource)o).bypassListenerEffects = (System.Boolean)v, Getter = (o) => ((AudioSource)o).bypassListenerEffects, Updater = (object o, ref object v) => { var x = ((AudioSource)o).bypassListenerEffects; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "bypassReverbZones", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((AudioSource)o).bypassReverbZones = (System.Boolean)v, Getter = (o) => ((AudioSource)o).bypassReverbZones, Updater = (object o, ref object v) => { var x = ((AudioSource)o).bypassReverbZones; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "playOnAwake", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((AudioSource)o).playOnAwake = (System.Boolean)v, Getter = (o) => ((AudioSource)o).playOnAwake, Updater = (object o, ref object v) => { var x = ((AudioSource)o).playOnAwake; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "loop", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((AudioSource)o).loop = (System.Boolean)v, Getter = (o) => ((AudioSource)o).loop, Updater = (object o, ref object v) => { var x = ((AudioSource)o).loop; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "priority", PropertyType = typeof(System.Int32), Setter = (o, v) => ((AudioSource)o).priority = (System.Int32)v, Getter = (o) => ((AudioSource)o).priority, Updater = (object o, ref object v) => { var x = ((AudioSource)o).priority; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "volume", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioSource)o).volume = (System.Single)v, Getter = (o) => ((AudioSource)o).volume, Updater = (object o, ref object v) => { var x = ((AudioSource)o).volume; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "pitch", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioSource)o).pitch = (System.Single)v, Getter = (o) => ((AudioSource)o).pitch, Updater = (object o, ref object v) => { var x = ((AudioSource)o).pitch; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "panStereo", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioSource)o).panStereo = (System.Single)v, Getter = (o) => ((AudioSource)o).panStereo, Updater = (object o, ref object v) => { var x = ((AudioSource)o).panStereo; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "spatialBlend", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioSource)o).spatialBlend = (System.Single)v, Getter = (o) => ((AudioSource)o).spatialBlend, Updater = (object o, ref object v) => { var x = ((AudioSource)o).spatialBlend; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "reverbZoneMix", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioSource)o).reverbZoneMix = (System.Single)v, Getter = (o) => ((AudioSource)o).reverbZoneMix, Updater = (object o, ref object v) => { var x = ((AudioSource)o).reverbZoneMix; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "dopplerLevel", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioSource)o).dopplerLevel = (System.Single)v, Getter = (o) => ((AudioSource)o).dopplerLevel, Updater = (object o, ref object v) => { var x = ((AudioSource)o).dopplerLevel; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "spread", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioSource)o).spread = (System.Single)v, Getter = (o) => ((AudioSource)o).spread, Updater = (object o, ref object v) => { var x = ((AudioSource)o).spread; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "rolloffMode", PropertyType = typeof(UnityEngine.AudioRolloffMode), Setter = (o, v) => ((AudioSource)o).rolloffMode = (UnityEngine.AudioRolloffMode)v, Getter = (o) => ((AudioSource)o).rolloffMode, Updater = (object o, ref object v) => { var x = (int)((AudioSource)o).rolloffMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "minDistance", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioSource)o).minDistance = (System.Single)v, Getter = (o) => ((AudioSource)o).minDistance, Updater = (object o, ref object v) => { var x = ((AudioSource)o).minDistance; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "maxDistance", PropertyType = typeof(System.Single), Setter = (o, v) => ((AudioSource)o).maxDistance = (System.Single)v, Getter = (o) => ((AudioSource)o).maxDistance, Updater = (object o, ref object v) => { var x = ((AudioSource)o).maxDistance; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((AudioSource)o).enabled = (System.Boolean)v, Getter = (o) => ((AudioSource)o).enabled, Updater = (object o, ref object v) => { var x = ((AudioSource)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS
+            { "UnityEngine.BoxCollider", new UnityProperty[] {
+                new UnityProperty { Name = "isTrigger", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((BoxCollider)o).isTrigger = (System.Boolean)v, Getter = (o) => ((BoxCollider)o).isTrigger, Updater = (object o, ref object v) => { var x = ((BoxCollider)o).isTrigger; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sharedMaterial", PropertyType = typeof(UnityEngine.PhysicMaterial), Setter = (o, v) => ((BoxCollider)o).sharedMaterial = (UnityEngine.PhysicMaterial)v, Getter = (o) => ((BoxCollider)o).sharedMaterial, },
+                new UnityProperty { Name = "center", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((BoxCollider)o).center = (UnityEngine.Vector3)v, Getter = (o) => ((BoxCollider)o).center, Updater = (object o, ref object v) => { var x = ((BoxCollider)o).center; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "size", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((BoxCollider)o).size = (UnityEngine.Vector3)v, Getter = (o) => ((BoxCollider)o).size, Updater = (object o, ref object v) => { var x = ((BoxCollider)o).size; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((BoxCollider)o).enabled = (System.Boolean)v, Getter = (o) => ((BoxCollider)o).enabled, Updater = (object o, ref object v) => { var x = ((BoxCollider)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.BoxCollider2D", new UnityProperty[] {
+                new UnityProperty { Name = "sharedMaterial", PropertyType = typeof(UnityEngine.PhysicsMaterial2D), Setter = (o, v) => ((BoxCollider2D)o).sharedMaterial = (UnityEngine.PhysicsMaterial2D)v, Getter = (o) => ((BoxCollider2D)o).sharedMaterial, },
+                new UnityProperty { Name = "isTrigger", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((BoxCollider2D)o).isTrigger = (System.Boolean)v, Getter = (o) => ((BoxCollider2D)o).isTrigger, Updater = (object o, ref object v) => { var x = ((BoxCollider2D)o).isTrigger; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "usedByEffector", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((BoxCollider2D)o).usedByEffector = (System.Boolean)v, Getter = (o) => ((BoxCollider2D)o).usedByEffector, Updater = (object o, ref object v) => { var x = ((BoxCollider2D)o).usedByEffector; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #if !UNITY_2023_1_OR_NEWER
+                new UnityProperty { Name = "usedByComposite", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((BoxCollider2D)o).usedByComposite = (System.Boolean)v, Getter = (o) => ((BoxCollider2D)o).usedByComposite, Updater = (object o, ref object v) => { var x = ((BoxCollider2D)o).usedByComposite; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #endif
+            #if UNITY_2023_1_OR_NEWER
+                new UnityProperty { Name = "compositeOperation", PropertyType = typeof(UnityEngine.Collider2D.CompositeOperation), Setter = (o, v) => ((BoxCollider2D)o).compositeOperation = (UnityEngine.Collider2D.CompositeOperation)v, Getter = (o) => ((BoxCollider2D)o).compositeOperation, Updater = (object o, ref object v) => { var x = (int)((BoxCollider2D)o).compositeOperation; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+            #endif
+                new UnityProperty { Name = "offset", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((BoxCollider2D)o).offset = (UnityEngine.Vector2)v, Getter = (o) => ((BoxCollider2D)o).offset, Updater = (object o, ref object v) => { var x = ((BoxCollider2D)o).offset; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "autoTiling", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((BoxCollider2D)o).autoTiling = (System.Boolean)v, Getter = (o) => ((BoxCollider2D)o).autoTiling, Updater = (object o, ref object v) => { var x = ((BoxCollider2D)o).autoTiling; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "size", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((BoxCollider2D)o).size = (UnityEngine.Vector2)v, Getter = (o) => ((BoxCollider2D)o).size, Updater = (object o, ref object v) => { var x = ((BoxCollider2D)o).size; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "edgeRadius", PropertyType = typeof(System.Single), Setter = (o, v) => ((BoxCollider2D)o).edgeRadius = (System.Single)v, Getter = (o) => ((BoxCollider2D)o).edgeRadius, Updater = (object o, ref object v) => { var x = ((BoxCollider2D)o).edgeRadius; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((BoxCollider2D)o).enabled = (System.Boolean)v, Getter = (o) => ((BoxCollider2D)o).enabled, Updater = (object o, ref object v) => { var x = ((BoxCollider2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+            { "UnityEngine.BillboardRenderer", new UnityProperty[] {
+                new UnityProperty { Name = "billboard", PropertyType = typeof(UnityEngine.BillboardAsset), Setter = (o, v) => ((BillboardRenderer)o).billboard = (UnityEngine.BillboardAsset)v, Getter = (o) => ((BillboardRenderer)o).billboard, },
+                new UnityProperty { Name = "shadowCastingMode", PropertyType = typeof(UnityEngine.Rendering.ShadowCastingMode), Setter = (o, v) => ((BillboardRenderer)o).shadowCastingMode = (UnityEngine.Rendering.ShadowCastingMode)v, Getter = (o) => ((BillboardRenderer)o).shadowCastingMode, Updater = (object o, ref object v) => { var x = (int)((BillboardRenderer)o).shadowCastingMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "receiveShadows", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((BillboardRenderer)o).receiveShadows = (System.Boolean)v, Getter = (o) => ((BillboardRenderer)o).receiveShadows, Updater = (object o, ref object v) => { var x = ((BillboardRenderer)o).receiveShadows; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "lightProbeUsage", PropertyType = typeof(UnityEngine.Rendering.LightProbeUsage), Setter = (o, v) => ((BillboardRenderer)o).lightProbeUsage = (UnityEngine.Rendering.LightProbeUsage)v, Getter = (o) => ((BillboardRenderer)o).lightProbeUsage, Updater = (object o, ref object v) => { var x = (int)((BillboardRenderer)o).lightProbeUsage; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "reflectionProbeUsage", PropertyType = typeof(UnityEngine.Rendering.ReflectionProbeUsage), Setter = (o, v) => ((BillboardRenderer)o).reflectionProbeUsage = (UnityEngine.Rendering.ReflectionProbeUsage)v, Getter = (o) => ((BillboardRenderer)o).reflectionProbeUsage, Updater = (object o, ref object v) => { var x = (int)((BillboardRenderer)o).reflectionProbeUsage; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "motionVectorGenerationMode", PropertyType = typeof(UnityEngine.MotionVectorGenerationMode), Setter = (o, v) => ((BillboardRenderer)o).motionVectorGenerationMode = (UnityEngine.MotionVectorGenerationMode)v, Getter = (o) => ((BillboardRenderer)o).motionVectorGenerationMode, Updater = (object o, ref object v) => { var x = (int)((BillboardRenderer)o).motionVectorGenerationMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "allowOcclusionWhenDynamic", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((BillboardRenderer)o).allowOcclusionWhenDynamic = (System.Boolean)v, Getter = (o) => ((BillboardRenderer)o).allowOcclusionWhenDynamic, Updater = (object o, ref object v) => { var x = ((BillboardRenderer)o).allowOcclusionWhenDynamic; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((BillboardRenderer)o).enabled = (System.Boolean)v, Getter = (o) => ((BillboardRenderer)o).enabled, Updater = (object o, ref object v) => { var x = ((BillboardRenderer)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.BuoyancyEffector2D", new UnityProperty[] {
+                new UnityProperty { Name = "useColliderMask", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((BuoyancyEffector2D)o).useColliderMask = (System.Boolean)v, Getter = (o) => ((BuoyancyEffector2D)o).useColliderMask, Updater = (object o, ref object v) => { var x = ((BuoyancyEffector2D)o).useColliderMask; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "colliderMask", PropertyType = typeof(System.Int32), Setter = (o, v) => ((BuoyancyEffector2D)o).colliderMask = (System.Int32)v, Getter = (o) => ((BuoyancyEffector2D)o).colliderMask, Updater = (object o, ref object v) => { var x = ((BuoyancyEffector2D)o).colliderMask; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "density", PropertyType = typeof(System.Single), Setter = (o, v) => ((BuoyancyEffector2D)o).density = (System.Single)v, Getter = (o) => ((BuoyancyEffector2D)o).density, Updater = (object o, ref object v) => { var x = ((BuoyancyEffector2D)o).density; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "surfaceLevel", PropertyType = typeof(System.Single), Setter = (o, v) => ((BuoyancyEffector2D)o).surfaceLevel = (System.Single)v, Getter = (o) => ((BuoyancyEffector2D)o).surfaceLevel, Updater = (object o, ref object v) => { var x = ((BuoyancyEffector2D)o).surfaceLevel; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "linearDrag", PropertyType = typeof(System.Single), Setter = (o, v) => ((BuoyancyEffector2D)o).linearDrag = (System.Single)v, Getter = (o) => ((BuoyancyEffector2D)o).linearDrag, Updater = (object o, ref object v) => { var x = ((BuoyancyEffector2D)o).linearDrag; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "angularDrag", PropertyType = typeof(System.Single), Setter = (o, v) => ((BuoyancyEffector2D)o).angularDrag = (System.Single)v, Getter = (o) => ((BuoyancyEffector2D)o).angularDrag, Updater = (object o, ref object v) => { var x = ((BuoyancyEffector2D)o).angularDrag; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "flowAngle", PropertyType = typeof(System.Single), Setter = (o, v) => ((BuoyancyEffector2D)o).flowAngle = (System.Single)v, Getter = (o) => ((BuoyancyEffector2D)o).flowAngle, Updater = (object o, ref object v) => { var x = ((BuoyancyEffector2D)o).flowAngle; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "flowMagnitude", PropertyType = typeof(System.Single), Setter = (o, v) => ((BuoyancyEffector2D)o).flowMagnitude = (System.Single)v, Getter = (o) => ((BuoyancyEffector2D)o).flowMagnitude, Updater = (object o, ref object v) => { var x = ((BuoyancyEffector2D)o).flowMagnitude; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "flowVariation", PropertyType = typeof(System.Single), Setter = (o, v) => ((BuoyancyEffector2D)o).flowVariation = (System.Single)v, Getter = (o) => ((BuoyancyEffector2D)o).flowVariation, Updater = (object o, ref object v) => { var x = ((BuoyancyEffector2D)o).flowVariation; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((BuoyancyEffector2D)o).enabled = (System.Boolean)v, Getter = (o) => ((BuoyancyEffector2D)o).enabled, Updater = (object o, ref object v) => { var x = ((BuoyancyEffector2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.Button", new UnityProperty[] {
+                new UnityProperty { Name = "interactable", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Button)o).interactable = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Button)o).interactable, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Button)o).interactable; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "transition", PropertyType = typeof(UnityEngine.UI.Selectable.Transition), Setter = (o, v) => ((UnityEngine.UI.Button)o).transition = (UnityEngine.UI.Selectable.Transition)v, Getter = (o) => ((UnityEngine.UI.Button)o).transition, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.Button)o).transition; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "targetGraphic", PropertyType = typeof(UnityEngine.UI.Graphic), Setter = (o, v) => ((UnityEngine.UI.Button)o).targetGraphic = (UnityEngine.UI.Graphic)v, Getter = (o) => ((UnityEngine.UI.Button)o).targetGraphic, },
+                new UnityProperty { Name = "colors", PropertyType = typeof(UnityEngine.UI.ColorBlock), Setter = (o, v) => ((UnityEngine.UI.Button)o).colors = (UnityEngine.UI.ColorBlock)v, Getter = (o) => ((UnityEngine.UI.Button)o).colors, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Button)o).colors; if (!x.Equals((UnityEngine.UI.ColorBlock)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "navigation", PropertyType = typeof(UnityEngine.UI.Navigation), Setter = (o, v) => ((UnityEngine.UI.Button)o).navigation = (UnityEngine.UI.Navigation)v, Getter = (o) => ((UnityEngine.UI.Button)o).navigation, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Button)o).navigation; if (!x.Equals((UnityEngine.UI.Navigation)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Button)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Button)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Button)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+            { "UnityEngine.Camera", new UnityProperty[] {
+                new UnityProperty { Name = "clearFlags", PropertyType = typeof(UnityEngine.CameraClearFlags), Setter = (o, v) => ((Camera)o).clearFlags = (UnityEngine.CameraClearFlags)v, Getter = (o) => ((Camera)o).clearFlags, Updater = (object o, ref object v) => { var x = (int)((Camera)o).clearFlags; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "backgroundColor", PropertyType = typeof(UnityEngine.Color), Setter = (o, v) => ((Camera)o).backgroundColor = (UnityEngine.Color)v, Getter = (o) => ((Camera)o).backgroundColor, Updater = (object o, ref object v) => { var x = ((Camera)o).backgroundColor; if (!x.Equals((UnityEngine.Color)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "cullingMask", PropertyType = typeof(System.Int32), Setter = (o, v) => ((Camera)o).cullingMask = (System.Int32)v, Getter = (o) => ((Camera)o).cullingMask, Updater = (object o, ref object v) => { var x = ((Camera)o).cullingMask; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "orthographic", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Camera)o).orthographic = (System.Boolean)v, Getter = (o) => ((Camera)o).orthographic, Updater = (object o, ref object v) => { var x = ((Camera)o).orthographic; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "fieldOfView", PropertyType = typeof(System.Single), Setter = (o, v) => ((Camera)o).fieldOfView = (System.Single)v, Getter = (o) => ((Camera)o).fieldOfView, Updater = (object o, ref object v) => { var x = ((Camera)o).fieldOfView; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "usePhysicalProperties", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Camera)o).usePhysicalProperties = (System.Boolean)v, Getter = (o) => ((Camera)o).usePhysicalProperties, Updater = (object o, ref object v) => { var x = ((Camera)o).usePhysicalProperties; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "nearClipPlane", PropertyType = typeof(System.Single), Setter = (o, v) => ((Camera)o).nearClipPlane = (System.Single)v, Getter = (o) => ((Camera)o).nearClipPlane, Updater = (object o, ref object v) => { var x = ((Camera)o).nearClipPlane; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "farClipPlane", PropertyType = typeof(System.Single), Setter = (o, v) => ((Camera)o).farClipPlane = (System.Single)v, Getter = (o) => ((Camera)o).farClipPlane, Updater = (object o, ref object v) => { var x = ((Camera)o).farClipPlane; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "rect", PropertyType = typeof(UnityEngine.Rect), Setter = (o, v) => ((Camera)o).rect = (UnityEngine.Rect)v, Getter = (o) => ((Camera)o).rect, Updater = (object o, ref object v) => { var x = ((Camera)o).rect; if (!x.Equals((UnityEngine.Rect)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "depth", PropertyType = typeof(System.Single), Setter = (o, v) => ((Camera)o).depth = (System.Single)v, Getter = (o) => ((Camera)o).depth, Updater = (object o, ref object v) => { var x = ((Camera)o).depth; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "renderingPath", PropertyType = typeof(UnityEngine.RenderingPath), Setter = (o, v) => ((Camera)o).renderingPath = (UnityEngine.RenderingPath)v, Getter = (o) => ((Camera)o).renderingPath, Updater = (object o, ref object v) => { var x = (int)((Camera)o).renderingPath; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "targetTexture", PropertyType = typeof(UnityEngine.RenderTexture), Setter = (o, v) => ((Camera)o).targetTexture = (UnityEngine.RenderTexture)v, Getter = (o) => ((Camera)o).targetTexture, },
+                new UnityProperty { Name = "useOcclusionCulling", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Camera)o).useOcclusionCulling = (System.Boolean)v, Getter = (o) => ((Camera)o).useOcclusionCulling, Updater = (object o, ref object v) => { var x = ((Camera)o).useOcclusionCulling; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "allowHDR", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Camera)o).allowHDR = (System.Boolean)v, Getter = (o) => ((Camera)o).allowHDR, Updater = (object o, ref object v) => { var x = ((Camera)o).allowHDR; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "allowMSAA", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Camera)o).allowMSAA = (System.Boolean)v, Getter = (o) => ((Camera)o).allowMSAA, Updater = (object o, ref object v) => { var x = ((Camera)o).allowMSAA; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "allowDynamicResolution", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Camera)o).allowDynamicResolution = (System.Boolean)v, Getter = (o) => ((Camera)o).allowDynamicResolution, Updater = (object o, ref object v) => { var x = ((Camera)o).allowDynamicResolution; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "targetDisplay", PropertyType = typeof(System.Int32), Setter = (o, v) => ((Camera)o).targetDisplay = (System.Int32)v, Getter = (o) => ((Camera)o).targetDisplay, Updater = (object o, ref object v) => { var x = ((Camera)o).targetDisplay; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Camera)o).enabled = (System.Boolean)v, Getter = (o) => ((Camera)o).enabled, Updater = (object o, ref object v) => { var x = ((Camera)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+
+
+        #if UNITY_UI
+            { "UnityEngine.Canvas", new UnityProperty[] {
+                new UnityProperty { Name = "renderMode", PropertyType = typeof(UnityEngine.RenderMode), Setter = (o, v) => ((Canvas)o).renderMode = (UnityEngine.RenderMode)v, Getter = (o) => ((Canvas)o).renderMode, Updater = (object o, ref object v) => { var x = (int)((Canvas)o).renderMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "worldCamera", PropertyType = typeof(UnityEngine.Camera), Setter = (o, v) => ((Canvas)o).worldCamera = (UnityEngine.Camera)v, Getter = (o) => ((Canvas)o).worldCamera, },
+                new UnityProperty { Name = "pixelPerfect", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Canvas)o).pixelPerfect = (System.Boolean)v, Getter = (o) => ((Canvas)o).pixelPerfect, Updater = (object o, ref object v) => { var x = ((Canvas)o).pixelPerfect; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sortingOrder", PropertyType = typeof(System.Int32), Setter = (o, v) => ((Canvas)o).sortingOrder = (System.Int32)v, Getter = (o) => ((Canvas)o).sortingOrder, Updater = (object o, ref object v) => { var x = ((Canvas)o).sortingOrder; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "targetDisplay", PropertyType = typeof(System.Int32), Setter = (o, v) => ((Canvas)o).targetDisplay = (System.Int32)v, Getter = (o) => ((Canvas)o).targetDisplay, Updater = (object o, ref object v) => { var x = ((Canvas)o).targetDisplay; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "additionalShaderChannels", PropertyType = typeof(UnityEngine.AdditionalCanvasShaderChannels), Setter = (o, v) => ((Canvas)o).additionalShaderChannels = (UnityEngine.AdditionalCanvasShaderChannels)v, Getter = (o) => ((Canvas)o).additionalShaderChannels, Updater = (object o, ref object v) => { var x = (int)((Canvas)o).additionalShaderChannels; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Canvas)o).enabled = (System.Boolean)v, Getter = (o) => ((Canvas)o).enabled, Updater = (object o, ref object v) => { var x = ((Canvas)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_UI
+            { "UnityEngine.CanvasGroup", new UnityProperty[] {
+                new UnityProperty { Name = "alpha", PropertyType = typeof(System.Single), Setter = (o, v) => ((CanvasGroup)o).alpha = (System.Single)v, Getter = (o) => ((CanvasGroup)o).alpha, Updater = (object o, ref object v) => { var x = ((CanvasGroup)o).alpha; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "interactable", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CanvasGroup)o).interactable = (System.Boolean)v, Getter = (o) => ((CanvasGroup)o).interactable, Updater = (object o, ref object v) => { var x = ((CanvasGroup)o).interactable; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "blocksRaycasts", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CanvasGroup)o).blocksRaycasts = (System.Boolean)v, Getter = (o) => ((CanvasGroup)o).blocksRaycasts, Updater = (object o, ref object v) => { var x = ((CanvasGroup)o).blocksRaycasts; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "ignoreParentGroups", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CanvasGroup)o).ignoreParentGroups = (System.Boolean)v, Getter = (o) => ((CanvasGroup)o).ignoreParentGroups, Updater = (object o, ref object v) => { var x = ((CanvasGroup)o).ignoreParentGroups; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CanvasGroup)o).enabled = (System.Boolean)v, Getter = (o) => ((CanvasGroup)o).enabled, Updater = (object o, ref object v) => { var x = ((CanvasGroup)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_UI
+            { "UnityEngine.CanvasRenderer", new UnityProperty[] {
+                new UnityProperty { Name = "cullTransparentMesh", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CanvasRenderer)o).cullTransparentMesh = (System.Boolean)v, Getter = (o) => ((CanvasRenderer)o).cullTransparentMesh, Updater = (object o, ref object v) => { var x = ((CanvasRenderer)o).cullTransparentMesh; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.CanvasScaler", new UnityProperty[] {
+                new UnityProperty { Name = "uiScaleMode", PropertyType = typeof(UnityEngine.UI.CanvasScaler.ScaleMode), Setter = (o, v) => ((UnityEngine.UI.CanvasScaler)o).uiScaleMode = (UnityEngine.UI.CanvasScaler.ScaleMode)v, Getter = (o) => ((UnityEngine.UI.CanvasScaler)o).uiScaleMode, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.CanvasScaler)o).uiScaleMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "scaleFactor", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.CanvasScaler)o).scaleFactor = (System.Single)v, Getter = (o) => ((UnityEngine.UI.CanvasScaler)o).scaleFactor, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.CanvasScaler)o).scaleFactor; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "referenceResolution", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((UnityEngine.UI.CanvasScaler)o).referenceResolution = (UnityEngine.Vector2)v, Getter = (o) => ((UnityEngine.UI.CanvasScaler)o).referenceResolution, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.CanvasScaler)o).referenceResolution; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "screenMatchMode", PropertyType = typeof(UnityEngine.UI.CanvasScaler.ScreenMatchMode), Setter = (o, v) => ((UnityEngine.UI.CanvasScaler)o).screenMatchMode = (UnityEngine.UI.CanvasScaler.ScreenMatchMode)v, Getter = (o) => ((UnityEngine.UI.CanvasScaler)o).screenMatchMode, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.CanvasScaler)o).screenMatchMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "physicalUnit", PropertyType = typeof(UnityEngine.UI.CanvasScaler.Unit), Setter = (o, v) => ((UnityEngine.UI.CanvasScaler)o).physicalUnit = (UnityEngine.UI.CanvasScaler.Unit)v, Getter = (o) => ((UnityEngine.UI.CanvasScaler)o).physicalUnit, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.CanvasScaler)o).physicalUnit; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "fallbackScreenDPI", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.CanvasScaler)o).fallbackScreenDPI = (System.Single)v, Getter = (o) => ((UnityEngine.UI.CanvasScaler)o).fallbackScreenDPI, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.CanvasScaler)o).fallbackScreenDPI; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "defaultSpriteDPI", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.CanvasScaler)o).defaultSpriteDPI = (System.Single)v, Getter = (o) => ((UnityEngine.UI.CanvasScaler)o).defaultSpriteDPI, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.CanvasScaler)o).defaultSpriteDPI; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "referencePixelsPerUnit", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.CanvasScaler)o).referencePixelsPerUnit = (System.Single)v, Getter = (o) => ((UnityEngine.UI.CanvasScaler)o).referencePixelsPerUnit, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.CanvasScaler)o).referencePixelsPerUnit; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.CanvasScaler)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.CanvasScaler)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.CanvasScaler)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS
+            { "UnityEngine.CapsuleCollider", new UnityProperty[] {
+                new UnityProperty { Name = "isTrigger", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CapsuleCollider)o).isTrigger = (System.Boolean)v, Getter = (o) => ((CapsuleCollider)o).isTrigger, Updater = (object o, ref object v) => { var x = ((CapsuleCollider)o).isTrigger; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sharedMaterial", PropertyType = typeof(UnityEngine.PhysicMaterial), Setter = (o, v) => ((CapsuleCollider)o).sharedMaterial = (UnityEngine.PhysicMaterial)v, Getter = (o) => ((CapsuleCollider)o).sharedMaterial, },
+                new UnityProperty { Name = "center", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((CapsuleCollider)o).center = (UnityEngine.Vector3)v, Getter = (o) => ((CapsuleCollider)o).center, Updater = (object o, ref object v) => { var x = ((CapsuleCollider)o).center; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "radius", PropertyType = typeof(System.Single), Setter = (o, v) => ((CapsuleCollider)o).radius = (System.Single)v, Getter = (o) => ((CapsuleCollider)o).radius, Updater = (object o, ref object v) => { var x = ((CapsuleCollider)o).radius; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "height", PropertyType = typeof(System.Single), Setter = (o, v) => ((CapsuleCollider)o).height = (System.Single)v, Getter = (o) => ((CapsuleCollider)o).height, Updater = (object o, ref object v) => { var x = ((CapsuleCollider)o).height; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "direction", PropertyType = typeof(System.Int32), Setter = (o, v) => ((CapsuleCollider)o).direction = (System.Int32)v, Getter = (o) => ((CapsuleCollider)o).direction, Updater = (object o, ref object v) => { var x = ((CapsuleCollider)o).direction; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CapsuleCollider)o).enabled = (System.Boolean)v, Getter = (o) => ((CapsuleCollider)o).enabled, Updater = (object o, ref object v) => { var x = ((CapsuleCollider)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.CapsuleCollider2D", new UnityProperty[] {
+                new UnityProperty { Name = "sharedMaterial", PropertyType = typeof(UnityEngine.PhysicsMaterial2D), Setter = (o, v) => ((CapsuleCollider2D)o).sharedMaterial = (UnityEngine.PhysicsMaterial2D)v, Getter = (o) => ((CapsuleCollider2D)o).sharedMaterial, },
+                new UnityProperty { Name = "isTrigger", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CapsuleCollider2D)o).isTrigger = (System.Boolean)v, Getter = (o) => ((CapsuleCollider2D)o).isTrigger, Updater = (object o, ref object v) => { var x = ((CapsuleCollider2D)o).isTrigger; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "usedByEffector", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CapsuleCollider2D)o).usedByEffector = (System.Boolean)v, Getter = (o) => ((CapsuleCollider2D)o).usedByEffector, Updater = (object o, ref object v) => { var x = ((CapsuleCollider2D)o).usedByEffector; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #if !UNITY_2023_1_OR_NEWER
+                new UnityProperty { Name = "usedByComposite", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CapsuleCollider2D)o).usedByComposite = (System.Boolean)v, Getter = (o) => ((CapsuleCollider2D)o).usedByComposite, Updater = (object o, ref object v) => { var x = ((CapsuleCollider2D)o).usedByComposite; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #endif
+            #if UNITY_2023_1_OR_NEWER
+                new UnityProperty { Name = "compositeOperation", PropertyType = typeof(UnityEngine.Collider2D.CompositeOperation), Setter = (o, v) => ((CapsuleCollider2D)o).compositeOperation = (UnityEngine.Collider2D.CompositeOperation)v, Getter = (o) => ((CapsuleCollider2D)o).compositeOperation, Updater = (object o, ref object v) => { var x = (int)((CapsuleCollider2D)o).compositeOperation; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+            #endif
+                new UnityProperty { Name = "offset", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((CapsuleCollider2D)o).offset = (UnityEngine.Vector2)v, Getter = (o) => ((CapsuleCollider2D)o).offset, Updater = (object o, ref object v) => { var x = ((CapsuleCollider2D)o).offset; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "size", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((CapsuleCollider2D)o).size = (UnityEngine.Vector2)v, Getter = (o) => ((CapsuleCollider2D)o).size, Updater = (object o, ref object v) => { var x = ((CapsuleCollider2D)o).size; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "direction", PropertyType = typeof(UnityEngine.CapsuleDirection2D), Setter = (o, v) => ((CapsuleCollider2D)o).direction = (UnityEngine.CapsuleDirection2D)v, Getter = (o) => ((CapsuleCollider2D)o).direction, Updater = (object o, ref object v) => { var x = (int)((CapsuleCollider2D)o).direction; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CapsuleCollider2D)o).enabled = (System.Boolean)v, Getter = (o) => ((CapsuleCollider2D)o).enabled, Updater = (object o, ref object v) => { var x = ((CapsuleCollider2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS
+            { "UnityEngine.CharacterController", new UnityProperty[] {
+                new UnityProperty { Name = "slopeLimit", PropertyType = typeof(System.Single), Setter = (o, v) => ((CharacterController)o).slopeLimit = (System.Single)v, Getter = (o) => ((CharacterController)o).slopeLimit, Updater = (object o, ref object v) => { var x = ((CharacterController)o).slopeLimit; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "stepOffset", PropertyType = typeof(System.Single), Setter = (o, v) => ((CharacterController)o).stepOffset = (System.Single)v, Getter = (o) => ((CharacterController)o).stepOffset, Updater = (object o, ref object v) => { var x = ((CharacterController)o).stepOffset; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "skinWidth", PropertyType = typeof(System.Single), Setter = (o, v) => ((CharacterController)o).skinWidth = (System.Single)v, Getter = (o) => ((CharacterController)o).skinWidth, Updater = (object o, ref object v) => { var x = ((CharacterController)o).skinWidth; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "minMoveDistance", PropertyType = typeof(System.Single), Setter = (o, v) => ((CharacterController)o).minMoveDistance = (System.Single)v, Getter = (o) => ((CharacterController)o).minMoveDistance, Updater = (object o, ref object v) => { var x = ((CharacterController)o).minMoveDistance; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "center", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((CharacterController)o).center = (UnityEngine.Vector3)v, Getter = (o) => ((CharacterController)o).center, Updater = (object o, ref object v) => { var x = ((CharacterController)o).center; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "radius", PropertyType = typeof(System.Single), Setter = (o, v) => ((CharacterController)o).radius = (System.Single)v, Getter = (o) => ((CharacterController)o).radius, Updater = (object o, ref object v) => { var x = ((CharacterController)o).radius; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "height", PropertyType = typeof(System.Single), Setter = (o, v) => ((CharacterController)o).height = (System.Single)v, Getter = (o) => ((CharacterController)o).height, Updater = (object o, ref object v) => { var x = ((CharacterController)o).height; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CharacterController)o).enabled = (System.Boolean)v, Getter = (o) => ((CharacterController)o).enabled, Updater = (object o, ref object v) => { var x = ((CharacterController)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS
+            { "UnityEngine.CharacterJoint", new UnityProperty[] {
+                new UnityProperty { Name = "connectedBody", PropertyType = typeof(UnityEngine.Rigidbody), Setter = (o, v) => ((CharacterJoint)o).connectedBody = (UnityEngine.Rigidbody)v, Getter = (o) => ((CharacterJoint)o).connectedBody, },
+            #if UNITY_2020_2_OR_NEWER
+                new UnityProperty { Name = "connectedArticulationBody", PropertyType = typeof(UnityEngine.ArticulationBody), Setter = (o, v) => ((CharacterJoint)o).connectedArticulationBody = (UnityEngine.ArticulationBody)v, Getter = (o) => ((CharacterJoint)o).connectedArticulationBody, },
+            #endif
+                new UnityProperty { Name = "anchor", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((CharacterJoint)o).anchor = (UnityEngine.Vector3)v, Getter = (o) => ((CharacterJoint)o).anchor, Updater = (object o, ref object v) => { var x = ((CharacterJoint)o).anchor; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "axis", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((CharacterJoint)o).axis = (UnityEngine.Vector3)v, Getter = (o) => ((CharacterJoint)o).axis, Updater = (object o, ref object v) => { var x = ((CharacterJoint)o).axis; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "autoConfigureConnectedAnchor", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CharacterJoint)o).autoConfigureConnectedAnchor = (System.Boolean)v, Getter = (o) => ((CharacterJoint)o).autoConfigureConnectedAnchor, Updater = (object o, ref object v) => { var x = ((CharacterJoint)o).autoConfigureConnectedAnchor; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedAnchor", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((CharacterJoint)o).connectedAnchor = (UnityEngine.Vector3)v, Getter = (o) => ((CharacterJoint)o).connectedAnchor, Updater = (object o, ref object v) => { var x = ((CharacterJoint)o).connectedAnchor; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "swingAxis", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((CharacterJoint)o).swingAxis = (UnityEngine.Vector3)v, Getter = (o) => ((CharacterJoint)o).swingAxis, Updater = (object o, ref object v) => { var x = ((CharacterJoint)o).swingAxis; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "twistLimitSpring", PropertyType = typeof(UnityEngine.SoftJointLimitSpring), Setter = (o, v) => ((CharacterJoint)o).twistLimitSpring = (UnityEngine.SoftJointLimitSpring)v, Getter = (o) => ((CharacterJoint)o).twistLimitSpring, Updater = (object o, ref object v) => { var x = ((CharacterJoint)o).twistLimitSpring; if (!x.Equals((UnityEngine.SoftJointLimitSpring)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "lowTwistLimit", PropertyType = typeof(UnityEngine.SoftJointLimit), Setter = (o, v) => ((CharacterJoint)o).lowTwistLimit = (UnityEngine.SoftJointLimit)v, Getter = (o) => ((CharacterJoint)o).lowTwistLimit, Updater = (object o, ref object v) => { var x = ((CharacterJoint)o).lowTwistLimit; if (!x.Equals((UnityEngine.SoftJointLimit)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "highTwistLimit", PropertyType = typeof(UnityEngine.SoftJointLimit), Setter = (o, v) => ((CharacterJoint)o).highTwistLimit = (UnityEngine.SoftJointLimit)v, Getter = (o) => ((CharacterJoint)o).highTwistLimit, Updater = (object o, ref object v) => { var x = ((CharacterJoint)o).highTwistLimit; if (!x.Equals((UnityEngine.SoftJointLimit)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "swingLimitSpring", PropertyType = typeof(UnityEngine.SoftJointLimitSpring), Setter = (o, v) => ((CharacterJoint)o).swingLimitSpring = (UnityEngine.SoftJointLimitSpring)v, Getter = (o) => ((CharacterJoint)o).swingLimitSpring, Updater = (object o, ref object v) => { var x = ((CharacterJoint)o).swingLimitSpring; if (!x.Equals((UnityEngine.SoftJointLimitSpring)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "swing1Limit", PropertyType = typeof(UnityEngine.SoftJointLimit), Setter = (o, v) => ((CharacterJoint)o).swing1Limit = (UnityEngine.SoftJointLimit)v, Getter = (o) => ((CharacterJoint)o).swing1Limit, Updater = (object o, ref object v) => { var x = ((CharacterJoint)o).swing1Limit; if (!x.Equals((UnityEngine.SoftJointLimit)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "swing2Limit", PropertyType = typeof(UnityEngine.SoftJointLimit), Setter = (o, v) => ((CharacterJoint)o).swing2Limit = (UnityEngine.SoftJointLimit)v, Getter = (o) => ((CharacterJoint)o).swing2Limit, Updater = (object o, ref object v) => { var x = ((CharacterJoint)o).swing2Limit; if (!x.Equals((UnityEngine.SoftJointLimit)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enableProjection", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CharacterJoint)o).enableProjection = (System.Boolean)v, Getter = (o) => ((CharacterJoint)o).enableProjection, Updater = (object o, ref object v) => { var x = ((CharacterJoint)o).enableProjection; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "projectionDistance", PropertyType = typeof(System.Single), Setter = (o, v) => ((CharacterJoint)o).projectionDistance = (System.Single)v, Getter = (o) => ((CharacterJoint)o).projectionDistance, Updater = (object o, ref object v) => { var x = ((CharacterJoint)o).projectionDistance; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "projectionAngle", PropertyType = typeof(System.Single), Setter = (o, v) => ((CharacterJoint)o).projectionAngle = (System.Single)v, Getter = (o) => ((CharacterJoint)o).projectionAngle, Updater = (object o, ref object v) => { var x = ((CharacterJoint)o).projectionAngle; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakForce", PropertyType = typeof(System.Single), Setter = (o, v) => ((CharacterJoint)o).breakForce = (System.Single)v, Getter = (o) => ((CharacterJoint)o).breakForce, Updater = (object o, ref object v) => { var x = ((CharacterJoint)o).breakForce; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakTorque", PropertyType = typeof(System.Single), Setter = (o, v) => ((CharacterJoint)o).breakTorque = (System.Single)v, Getter = (o) => ((CharacterJoint)o).breakTorque, Updater = (object o, ref object v) => { var x = ((CharacterJoint)o).breakTorque; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enableCollision", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CharacterJoint)o).enableCollision = (System.Boolean)v, Getter = (o) => ((CharacterJoint)o).enableCollision, Updater = (object o, ref object v) => { var x = ((CharacterJoint)o).enableCollision; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enablePreprocessing", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CharacterJoint)o).enablePreprocessing = (System.Boolean)v, Getter = (o) => ((CharacterJoint)o).enablePreprocessing, Updater = (object o, ref object v) => { var x = ((CharacterJoint)o).enablePreprocessing; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "massScale", PropertyType = typeof(System.Single), Setter = (o, v) => ((CharacterJoint)o).massScale = (System.Single)v, Getter = (o) => ((CharacterJoint)o).massScale, Updater = (object o, ref object v) => { var x = ((CharacterJoint)o).massScale; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedMassScale", PropertyType = typeof(System.Single), Setter = (o, v) => ((CharacterJoint)o).connectedMassScale = (System.Single)v, Getter = (o) => ((CharacterJoint)o).connectedMassScale, Updater = (object o, ref object v) => { var x = ((CharacterJoint)o).connectedMassScale; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.CircleCollider2D", new UnityProperty[] {
+                new UnityProperty { Name = "sharedMaterial", PropertyType = typeof(UnityEngine.PhysicsMaterial2D), Setter = (o, v) => ((CircleCollider2D)o).sharedMaterial = (UnityEngine.PhysicsMaterial2D)v, Getter = (o) => ((CircleCollider2D)o).sharedMaterial, },
+                new UnityProperty { Name = "isTrigger", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CircleCollider2D)o).isTrigger = (System.Boolean)v, Getter = (o) => ((CircleCollider2D)o).isTrigger, Updater = (object o, ref object v) => { var x = ((CircleCollider2D)o).isTrigger; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "usedByEffector", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CircleCollider2D)o).usedByEffector = (System.Boolean)v, Getter = (o) => ((CircleCollider2D)o).usedByEffector, Updater = (object o, ref object v) => { var x = ((CircleCollider2D)o).usedByEffector; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #if !UNITY_2023_1_OR_NEWER
+                new UnityProperty { Name = "usedByComposite", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CircleCollider2D)o).usedByComposite = (System.Boolean)v, Getter = (o) => ((CircleCollider2D)o).usedByComposite, Updater = (object o, ref object v) => { var x = ((CircleCollider2D)o).usedByComposite; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #endif
+            #if UNITY_2023_1_OR_NEWER
+                new UnityProperty { Name = "compositeOperation", PropertyType = typeof(UnityEngine.Collider2D.CompositeOperation), Setter = (o, v) => ((CircleCollider2D)o).compositeOperation = (UnityEngine.Collider2D.CompositeOperation)v, Getter = (o) => ((CircleCollider2D)o).compositeOperation, Updater = (object o, ref object v) => { var x = (int)((CircleCollider2D)o).compositeOperation; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+            #endif
+                new UnityProperty { Name = "offset", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((CircleCollider2D)o).offset = (UnityEngine.Vector2)v, Getter = (o) => ((CircleCollider2D)o).offset, Updater = (object o, ref object v) => { var x = ((CircleCollider2D)o).offset; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "radius", PropertyType = typeof(System.Single), Setter = (o, v) => ((CircleCollider2D)o).radius = (System.Single)v, Getter = (o) => ((CircleCollider2D)o).radius, Updater = (object o, ref object v) => { var x = ((CircleCollider2D)o).radius; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CircleCollider2D)o).enabled = (System.Boolean)v, Getter = (o) => ((CircleCollider2D)o).enabled, Updater = (object o, ref object v) => { var x = ((CircleCollider2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_CLOTH
+            { "UnityEngine.Cloth", new UnityProperty[] {
+                new UnityProperty { Name = "stretchingStiffness", PropertyType = typeof(System.Single), Setter = (o, v) => ((Cloth)o).stretchingStiffness = (System.Single)v, Getter = (o) => ((Cloth)o).stretchingStiffness, Updater = (object o, ref object v) => { var x = ((Cloth)o).stretchingStiffness; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "bendingStiffness", PropertyType = typeof(System.Single), Setter = (o, v) => ((Cloth)o).bendingStiffness = (System.Single)v, Getter = (o) => ((Cloth)o).bendingStiffness, Updater = (object o, ref object v) => { var x = ((Cloth)o).bendingStiffness; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useTethers", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Cloth)o).useTethers = (System.Boolean)v, Getter = (o) => ((Cloth)o).useTethers, Updater = (object o, ref object v) => { var x = ((Cloth)o).useTethers; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useGravity", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Cloth)o).useGravity = (System.Boolean)v, Getter = (o) => ((Cloth)o).useGravity, Updater = (object o, ref object v) => { var x = ((Cloth)o).useGravity; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "damping", PropertyType = typeof(System.Single), Setter = (o, v) => ((Cloth)o).damping = (System.Single)v, Getter = (o) => ((Cloth)o).damping, Updater = (object o, ref object v) => { var x = ((Cloth)o).damping; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "externalAcceleration", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((Cloth)o).externalAcceleration = (UnityEngine.Vector3)v, Getter = (o) => ((Cloth)o).externalAcceleration, Updater = (object o, ref object v) => { var x = ((Cloth)o).externalAcceleration; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "randomAcceleration", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((Cloth)o).randomAcceleration = (UnityEngine.Vector3)v, Getter = (o) => ((Cloth)o).randomAcceleration, Updater = (object o, ref object v) => { var x = ((Cloth)o).randomAcceleration; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "worldVelocityScale", PropertyType = typeof(System.Single), Setter = (o, v) => ((Cloth)o).worldVelocityScale = (System.Single)v, Getter = (o) => ((Cloth)o).worldVelocityScale, Updater = (object o, ref object v) => { var x = ((Cloth)o).worldVelocityScale; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "worldAccelerationScale", PropertyType = typeof(System.Single), Setter = (o, v) => ((Cloth)o).worldAccelerationScale = (System.Single)v, Getter = (o) => ((Cloth)o).worldAccelerationScale, Updater = (object o, ref object v) => { var x = ((Cloth)o).worldAccelerationScale; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "friction", PropertyType = typeof(System.Single), Setter = (o, v) => ((Cloth)o).friction = (System.Single)v, Getter = (o) => ((Cloth)o).friction, Updater = (object o, ref object v) => { var x = ((Cloth)o).friction; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "collisionMassScale", PropertyType = typeof(System.Single), Setter = (o, v) => ((Cloth)o).collisionMassScale = (System.Single)v, Getter = (o) => ((Cloth)o).collisionMassScale, Updater = (object o, ref object v) => { var x = ((Cloth)o).collisionMassScale; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enableContinuousCollision", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Cloth)o).enableContinuousCollision = (System.Boolean)v, Getter = (o) => ((Cloth)o).enableContinuousCollision, Updater = (object o, ref object v) => { var x = ((Cloth)o).enableContinuousCollision; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useVirtualParticles", PropertyType = typeof(System.Single), Setter = (o, v) => ((Cloth)o).useVirtualParticles = (System.Single)v, Getter = (o) => ((Cloth)o).useVirtualParticles, Updater = (object o, ref object v) => { var x = ((Cloth)o).useVirtualParticles; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "clothSolverFrequency", PropertyType = typeof(System.Single), Setter = (o, v) => ((Cloth)o).clothSolverFrequency = (System.Single)v, Getter = (o) => ((Cloth)o).clothSolverFrequency, Updater = (object o, ref object v) => { var x = ((Cloth)o).clothSolverFrequency; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sleepThreshold", PropertyType = typeof(System.Single), Setter = (o, v) => ((Cloth)o).sleepThreshold = (System.Single)v, Getter = (o) => ((Cloth)o).sleepThreshold, Updater = (object o, ref object v) => { var x = ((Cloth)o).sleepThreshold; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "capsuleColliders", PropertyType = typeof(UnityEngine.CapsuleCollider[]), Setter = (o, v) => ((Cloth)o).capsuleColliders = (UnityEngine.CapsuleCollider[])v, Getter = (o) => ((Cloth)o).capsuleColliders, },
+                new UnityProperty { Name = "sphereColliders", PropertyType = typeof(UnityEngine.ClothSphereColliderPair[]), Setter = (o, v) => ((Cloth)o).sphereColliders = (UnityEngine.ClothSphereColliderPair[])v, Getter = (o) => ((Cloth)o).sphereColliders, },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Cloth)o).enabled = (System.Boolean)v, Getter = (o) => ((Cloth)o).enabled, Updater = (object o, ref object v) => { var x = ((Cloth)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.CompositeCollider2D", new UnityProperty[] {
+                new UnityProperty { Name = "sharedMaterial", PropertyType = typeof(UnityEngine.PhysicsMaterial2D), Setter = (o, v) => ((CompositeCollider2D)o).sharedMaterial = (UnityEngine.PhysicsMaterial2D)v, Getter = (o) => ((CompositeCollider2D)o).sharedMaterial, },
+                new UnityProperty { Name = "isTrigger", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CompositeCollider2D)o).isTrigger = (System.Boolean)v, Getter = (o) => ((CompositeCollider2D)o).isTrigger, Updater = (object o, ref object v) => { var x = ((CompositeCollider2D)o).isTrigger; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "usedByEffector", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CompositeCollider2D)o).usedByEffector = (System.Boolean)v, Getter = (o) => ((CompositeCollider2D)o).usedByEffector, Updater = (object o, ref object v) => { var x = ((CompositeCollider2D)o).usedByEffector; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #if !UNITY_2023_1_OR_NEWER
+                new UnityProperty { Name = "usedByComposite", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CompositeCollider2D)o).usedByComposite = (System.Boolean)v, Getter = (o) => ((CompositeCollider2D)o).usedByComposite, Updater = (object o, ref object v) => { var x = ((CompositeCollider2D)o).usedByComposite; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #endif
+            #if UNITY_2023_1_OR_NEWER
+                new UnityProperty { Name = "compositeOperation", PropertyType = typeof(UnityEngine.Collider2D.CompositeOperation), Setter = (o, v) => ((CompositeCollider2D)o).compositeOperation = (UnityEngine.Collider2D.CompositeOperation)v, Getter = (o) => ((CompositeCollider2D)o).compositeOperation, Updater = (object o, ref object v) => { var x = (int)((CompositeCollider2D)o).compositeOperation; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+            #endif
+                new UnityProperty { Name = "offset", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((CompositeCollider2D)o).offset = (UnityEngine.Vector2)v, Getter = (o) => ((CompositeCollider2D)o).offset, Updater = (object o, ref object v) => { var x = ((CompositeCollider2D)o).offset; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "geometryType", PropertyType = typeof(UnityEngine.CompositeCollider2D.GeometryType), Setter = (o, v) => ((CompositeCollider2D)o).geometryType = (UnityEngine.CompositeCollider2D.GeometryType)v, Getter = (o) => ((CompositeCollider2D)o).geometryType, Updater = (object o, ref object v) => { var x = (int)((CompositeCollider2D)o).geometryType; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "generationType", PropertyType = typeof(UnityEngine.CompositeCollider2D.GenerationType), Setter = (o, v) => ((CompositeCollider2D)o).generationType = (UnityEngine.CompositeCollider2D.GenerationType)v, Getter = (o) => ((CompositeCollider2D)o).generationType, Updater = (object o, ref object v) => { var x = (int)((CompositeCollider2D)o).generationType; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "vertexDistance", PropertyType = typeof(System.Single), Setter = (o, v) => ((CompositeCollider2D)o).vertexDistance = (System.Single)v, Getter = (o) => ((CompositeCollider2D)o).vertexDistance, Updater = (object o, ref object v) => { var x = ((CompositeCollider2D)o).vertexDistance; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "offsetDistance", PropertyType = typeof(System.Single), Setter = (o, v) => ((CompositeCollider2D)o).offsetDistance = (System.Single)v, Getter = (o) => ((CompositeCollider2D)o).offsetDistance, Updater = (object o, ref object v) => { var x = ((CompositeCollider2D)o).offsetDistance; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "edgeRadius", PropertyType = typeof(System.Single), Setter = (o, v) => ((CompositeCollider2D)o).edgeRadius = (System.Single)v, Getter = (o) => ((CompositeCollider2D)o).edgeRadius, Updater = (object o, ref object v) => { var x = ((CompositeCollider2D)o).edgeRadius; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((CompositeCollider2D)o).enabled = (System.Boolean)v, Getter = (o) => ((CompositeCollider2D)o).enabled, Updater = (object o, ref object v) => { var x = ((CompositeCollider2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS
+            { "UnityEngine.ConfigurableJoint", new UnityProperty[] {
+                new UnityProperty { Name = "connectedBody", PropertyType = typeof(UnityEngine.Rigidbody), Setter = (o, v) => ((ConfigurableJoint)o).connectedBody = (UnityEngine.Rigidbody)v, Getter = (o) => ((ConfigurableJoint)o).connectedBody, },
+            #if UNITY_2020_2_OR_NEWER
+                new UnityProperty { Name = "connectedArticulationBody", PropertyType = typeof(UnityEngine.ArticulationBody), Setter = (o, v) => ((ConfigurableJoint)o).connectedArticulationBody = (UnityEngine.ArticulationBody)v, Getter = (o) => ((ConfigurableJoint)o).connectedArticulationBody, },
+            #endif
+                new UnityProperty { Name = "anchor", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((ConfigurableJoint)o).anchor = (UnityEngine.Vector3)v, Getter = (o) => ((ConfigurableJoint)o).anchor, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).anchor; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "axis", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((ConfigurableJoint)o).axis = (UnityEngine.Vector3)v, Getter = (o) => ((ConfigurableJoint)o).axis, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).axis; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "autoConfigureConnectedAnchor", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((ConfigurableJoint)o).autoConfigureConnectedAnchor = (System.Boolean)v, Getter = (o) => ((ConfigurableJoint)o).autoConfigureConnectedAnchor, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).autoConfigureConnectedAnchor; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedAnchor", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((ConfigurableJoint)o).connectedAnchor = (UnityEngine.Vector3)v, Getter = (o) => ((ConfigurableJoint)o).connectedAnchor, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).connectedAnchor; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "xMotion", PropertyType = typeof(UnityEngine.ConfigurableJointMotion), Setter = (o, v) => ((ConfigurableJoint)o).xMotion = (UnityEngine.ConfigurableJointMotion)v, Getter = (o) => ((ConfigurableJoint)o).xMotion, Updater = (object o, ref object v) => { var x = (int)((ConfigurableJoint)o).xMotion; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "yMotion", PropertyType = typeof(UnityEngine.ConfigurableJointMotion), Setter = (o, v) => ((ConfigurableJoint)o).yMotion = (UnityEngine.ConfigurableJointMotion)v, Getter = (o) => ((ConfigurableJoint)o).yMotion, Updater = (object o, ref object v) => { var x = (int)((ConfigurableJoint)o).yMotion; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "zMotion", PropertyType = typeof(UnityEngine.ConfigurableJointMotion), Setter = (o, v) => ((ConfigurableJoint)o).zMotion = (UnityEngine.ConfigurableJointMotion)v, Getter = (o) => ((ConfigurableJoint)o).zMotion, Updater = (object o, ref object v) => { var x = (int)((ConfigurableJoint)o).zMotion; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "angularXMotion", PropertyType = typeof(UnityEngine.ConfigurableJointMotion), Setter = (o, v) => ((ConfigurableJoint)o).angularXMotion = (UnityEngine.ConfigurableJointMotion)v, Getter = (o) => ((ConfigurableJoint)o).angularXMotion, Updater = (object o, ref object v) => { var x = (int)((ConfigurableJoint)o).angularXMotion; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "angularYMotion", PropertyType = typeof(UnityEngine.ConfigurableJointMotion), Setter = (o, v) => ((ConfigurableJoint)o).angularYMotion = (UnityEngine.ConfigurableJointMotion)v, Getter = (o) => ((ConfigurableJoint)o).angularYMotion, Updater = (object o, ref object v) => { var x = (int)((ConfigurableJoint)o).angularYMotion; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "angularZMotion", PropertyType = typeof(UnityEngine.ConfigurableJointMotion), Setter = (o, v) => ((ConfigurableJoint)o).angularZMotion = (UnityEngine.ConfigurableJointMotion)v, Getter = (o) => ((ConfigurableJoint)o).angularZMotion, Updater = (object o, ref object v) => { var x = (int)((ConfigurableJoint)o).angularZMotion; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "linearLimitSpring", PropertyType = typeof(UnityEngine.SoftJointLimitSpring), Setter = (o, v) => ((ConfigurableJoint)o).linearLimitSpring = (UnityEngine.SoftJointLimitSpring)v, Getter = (o) => ((ConfigurableJoint)o).linearLimitSpring, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).linearLimitSpring; if (!x.Equals((UnityEngine.SoftJointLimitSpring)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "linearLimit", PropertyType = typeof(UnityEngine.SoftJointLimit), Setter = (o, v) => ((ConfigurableJoint)o).linearLimit = (UnityEngine.SoftJointLimit)v, Getter = (o) => ((ConfigurableJoint)o).linearLimit, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).linearLimit; if (!x.Equals((UnityEngine.SoftJointLimit)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "angularXLimitSpring", PropertyType = typeof(UnityEngine.SoftJointLimitSpring), Setter = (o, v) => ((ConfigurableJoint)o).angularXLimitSpring = (UnityEngine.SoftJointLimitSpring)v, Getter = (o) => ((ConfigurableJoint)o).angularXLimitSpring, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).angularXLimitSpring; if (!x.Equals((UnityEngine.SoftJointLimitSpring)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "lowAngularXLimit", PropertyType = typeof(UnityEngine.SoftJointLimit), Setter = (o, v) => ((ConfigurableJoint)o).lowAngularXLimit = (UnityEngine.SoftJointLimit)v, Getter = (o) => ((ConfigurableJoint)o).lowAngularXLimit, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).lowAngularXLimit; if (!x.Equals((UnityEngine.SoftJointLimit)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "highAngularXLimit", PropertyType = typeof(UnityEngine.SoftJointLimit), Setter = (o, v) => ((ConfigurableJoint)o).highAngularXLimit = (UnityEngine.SoftJointLimit)v, Getter = (o) => ((ConfigurableJoint)o).highAngularXLimit, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).highAngularXLimit; if (!x.Equals((UnityEngine.SoftJointLimit)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "angularYZLimitSpring", PropertyType = typeof(UnityEngine.SoftJointLimitSpring), Setter = (o, v) => ((ConfigurableJoint)o).angularYZLimitSpring = (UnityEngine.SoftJointLimitSpring)v, Getter = (o) => ((ConfigurableJoint)o).angularYZLimitSpring, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).angularYZLimitSpring; if (!x.Equals((UnityEngine.SoftJointLimitSpring)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "angularYLimit", PropertyType = typeof(UnityEngine.SoftJointLimit), Setter = (o, v) => ((ConfigurableJoint)o).angularYLimit = (UnityEngine.SoftJointLimit)v, Getter = (o) => ((ConfigurableJoint)o).angularYLimit, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).angularYLimit; if (!x.Equals((UnityEngine.SoftJointLimit)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "angularZLimit", PropertyType = typeof(UnityEngine.SoftJointLimit), Setter = (o, v) => ((ConfigurableJoint)o).angularZLimit = (UnityEngine.SoftJointLimit)v, Getter = (o) => ((ConfigurableJoint)o).angularZLimit, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).angularZLimit; if (!x.Equals((UnityEngine.SoftJointLimit)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "targetPosition", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((ConfigurableJoint)o).targetPosition = (UnityEngine.Vector3)v, Getter = (o) => ((ConfigurableJoint)o).targetPosition, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).targetPosition; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "targetVelocity", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((ConfigurableJoint)o).targetVelocity = (UnityEngine.Vector3)v, Getter = (o) => ((ConfigurableJoint)o).targetVelocity, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).targetVelocity; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "xDrive", PropertyType = typeof(UnityEngine.JointDrive), Setter = (o, v) => ((ConfigurableJoint)o).xDrive = (UnityEngine.JointDrive)v, Getter = (o) => ((ConfigurableJoint)o).xDrive, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).xDrive; if (!x.Equals((UnityEngine.JointDrive)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "yDrive", PropertyType = typeof(UnityEngine.JointDrive), Setter = (o, v) => ((ConfigurableJoint)o).yDrive = (UnityEngine.JointDrive)v, Getter = (o) => ((ConfigurableJoint)o).yDrive, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).yDrive; if (!x.Equals((UnityEngine.JointDrive)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "zDrive", PropertyType = typeof(UnityEngine.JointDrive), Setter = (o, v) => ((ConfigurableJoint)o).zDrive = (UnityEngine.JointDrive)v, Getter = (o) => ((ConfigurableJoint)o).zDrive, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).zDrive; if (!x.Equals((UnityEngine.JointDrive)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "targetRotation", PropertyType = typeof(UnityEngine.Quaternion), Setter = (o, v) => ((ConfigurableJoint)o).targetRotation = (UnityEngine.Quaternion)v, Getter = (o) => ((ConfigurableJoint)o).targetRotation, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).targetRotation; if (!x.Equals((UnityEngine.Quaternion)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "targetAngularVelocity", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((ConfigurableJoint)o).targetAngularVelocity = (UnityEngine.Vector3)v, Getter = (o) => ((ConfigurableJoint)o).targetAngularVelocity, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).targetAngularVelocity; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "rotationDriveMode", PropertyType = typeof(UnityEngine.RotationDriveMode), Setter = (o, v) => ((ConfigurableJoint)o).rotationDriveMode = (UnityEngine.RotationDriveMode)v, Getter = (o) => ((ConfigurableJoint)o).rotationDriveMode, Updater = (object o, ref object v) => { var x = (int)((ConfigurableJoint)o).rotationDriveMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "angularXDrive", PropertyType = typeof(UnityEngine.JointDrive), Setter = (o, v) => ((ConfigurableJoint)o).angularXDrive = (UnityEngine.JointDrive)v, Getter = (o) => ((ConfigurableJoint)o).angularXDrive, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).angularXDrive; if (!x.Equals((UnityEngine.JointDrive)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "angularYZDrive", PropertyType = typeof(UnityEngine.JointDrive), Setter = (o, v) => ((ConfigurableJoint)o).angularYZDrive = (UnityEngine.JointDrive)v, Getter = (o) => ((ConfigurableJoint)o).angularYZDrive, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).angularYZDrive; if (!x.Equals((UnityEngine.JointDrive)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "slerpDrive", PropertyType = typeof(UnityEngine.JointDrive), Setter = (o, v) => ((ConfigurableJoint)o).slerpDrive = (UnityEngine.JointDrive)v, Getter = (o) => ((ConfigurableJoint)o).slerpDrive, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).slerpDrive; if (!x.Equals((UnityEngine.JointDrive)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "projectionMode", PropertyType = typeof(UnityEngine.JointProjectionMode), Setter = (o, v) => ((ConfigurableJoint)o).projectionMode = (UnityEngine.JointProjectionMode)v, Getter = (o) => ((ConfigurableJoint)o).projectionMode, Updater = (object o, ref object v) => { var x = (int)((ConfigurableJoint)o).projectionMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "projectionDistance", PropertyType = typeof(System.Single), Setter = (o, v) => ((ConfigurableJoint)o).projectionDistance = (System.Single)v, Getter = (o) => ((ConfigurableJoint)o).projectionDistance, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).projectionDistance; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "projectionAngle", PropertyType = typeof(System.Single), Setter = (o, v) => ((ConfigurableJoint)o).projectionAngle = (System.Single)v, Getter = (o) => ((ConfigurableJoint)o).projectionAngle, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).projectionAngle; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "configuredInWorldSpace", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((ConfigurableJoint)o).configuredInWorldSpace = (System.Boolean)v, Getter = (o) => ((ConfigurableJoint)o).configuredInWorldSpace, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).configuredInWorldSpace; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "swapBodies", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((ConfigurableJoint)o).swapBodies = (System.Boolean)v, Getter = (o) => ((ConfigurableJoint)o).swapBodies, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).swapBodies; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakForce", PropertyType = typeof(System.Single), Setter = (o, v) => ((ConfigurableJoint)o).breakForce = (System.Single)v, Getter = (o) => ((ConfigurableJoint)o).breakForce, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).breakForce; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakTorque", PropertyType = typeof(System.Single), Setter = (o, v) => ((ConfigurableJoint)o).breakTorque = (System.Single)v, Getter = (o) => ((ConfigurableJoint)o).breakTorque, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).breakTorque; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enableCollision", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((ConfigurableJoint)o).enableCollision = (System.Boolean)v, Getter = (o) => ((ConfigurableJoint)o).enableCollision, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).enableCollision; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enablePreprocessing", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((ConfigurableJoint)o).enablePreprocessing = (System.Boolean)v, Getter = (o) => ((ConfigurableJoint)o).enablePreprocessing, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).enablePreprocessing; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "massScale", PropertyType = typeof(System.Single), Setter = (o, v) => ((ConfigurableJoint)o).massScale = (System.Single)v, Getter = (o) => ((ConfigurableJoint)o).massScale, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).massScale; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedMassScale", PropertyType = typeof(System.Single), Setter = (o, v) => ((ConfigurableJoint)o).connectedMassScale = (System.Single)v, Getter = (o) => ((ConfigurableJoint)o).connectedMassScale, Updater = (object o, ref object v) => { var x = ((ConfigurableJoint)o).connectedMassScale; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS
+            { "UnityEngine.ConstantForce", new UnityProperty[] {
+                new UnityProperty { Name = "force", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((ConstantForce)o).force = (UnityEngine.Vector3)v, Getter = (o) => ((ConstantForce)o).force, Updater = (object o, ref object v) => { var x = ((ConstantForce)o).force; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "relativeForce", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((ConstantForce)o).relativeForce = (UnityEngine.Vector3)v, Getter = (o) => ((ConstantForce)o).relativeForce, Updater = (object o, ref object v) => { var x = ((ConstantForce)o).relativeForce; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "torque", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((ConstantForce)o).torque = (UnityEngine.Vector3)v, Getter = (o) => ((ConstantForce)o).torque, Updater = (object o, ref object v) => { var x = ((ConstantForce)o).torque; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "relativeTorque", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((ConstantForce)o).relativeTorque = (UnityEngine.Vector3)v, Getter = (o) => ((ConstantForce)o).relativeTorque, Updater = (object o, ref object v) => { var x = ((ConstantForce)o).relativeTorque; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((ConstantForce)o).enabled = (System.Boolean)v, Getter = (o) => ((ConstantForce)o).enabled, Updater = (object o, ref object v) => { var x = ((ConstantForce)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.ConstantForce2D", new UnityProperty[] {
+                new UnityProperty { Name = "force", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((ConstantForce2D)o).force = (UnityEngine.Vector2)v, Getter = (o) => ((ConstantForce2D)o).force, Updater = (object o, ref object v) => { var x = ((ConstantForce2D)o).force; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "relativeForce", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((ConstantForce2D)o).relativeForce = (UnityEngine.Vector2)v, Getter = (o) => ((ConstantForce2D)o).relativeForce, Updater = (object o, ref object v) => { var x = ((ConstantForce2D)o).relativeForce; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "torque", PropertyType = typeof(System.Single), Setter = (o, v) => ((ConstantForce2D)o).torque = (System.Single)v, Getter = (o) => ((ConstantForce2D)o).torque, Updater = (object o, ref object v) => { var x = ((ConstantForce2D)o).torque; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((ConstantForce2D)o).enabled = (System.Boolean)v, Getter = (o) => ((ConstantForce2D)o).enabled, Updater = (object o, ref object v) => { var x = ((ConstantForce2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.ContentSizeFitter", new UnityProperty[] {
+                new UnityProperty { Name = "horizontalFit", PropertyType = typeof(UnityEngine.UI.ContentSizeFitter.FitMode), Setter = (o, v) => ((UnityEngine.UI.ContentSizeFitter)o).horizontalFit = (UnityEngine.UI.ContentSizeFitter.FitMode)v, Getter = (o) => ((UnityEngine.UI.ContentSizeFitter)o).horizontalFit, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.ContentSizeFitter)o).horizontalFit; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "verticalFit", PropertyType = typeof(UnityEngine.UI.ContentSizeFitter.FitMode), Setter = (o, v) => ((UnityEngine.UI.ContentSizeFitter)o).verticalFit = (UnityEngine.UI.ContentSizeFitter.FitMode)v, Getter = (o) => ((UnityEngine.UI.ContentSizeFitter)o).verticalFit, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.ContentSizeFitter)o).verticalFit; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.ContentSizeFitter)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.ContentSizeFitter)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.ContentSizeFitter)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.DistanceJoint2D", new UnityProperty[] {
+                new UnityProperty { Name = "enableCollision", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((DistanceJoint2D)o).enableCollision = (System.Boolean)v, Getter = (o) => ((DistanceJoint2D)o).enableCollision, Updater = (object o, ref object v) => { var x = ((DistanceJoint2D)o).enableCollision; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedBody", PropertyType = typeof(UnityEngine.Rigidbody2D), Setter = (o, v) => ((DistanceJoint2D)o).connectedBody = (UnityEngine.Rigidbody2D)v, Getter = (o) => ((DistanceJoint2D)o).connectedBody, },
+                new UnityProperty { Name = "autoConfigureConnectedAnchor", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((DistanceJoint2D)o).autoConfigureConnectedAnchor = (System.Boolean)v, Getter = (o) => ((DistanceJoint2D)o).autoConfigureConnectedAnchor, Updater = (object o, ref object v) => { var x = ((DistanceJoint2D)o).autoConfigureConnectedAnchor; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "anchor", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((DistanceJoint2D)o).anchor = (UnityEngine.Vector2)v, Getter = (o) => ((DistanceJoint2D)o).anchor, Updater = (object o, ref object v) => { var x = ((DistanceJoint2D)o).anchor; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedAnchor", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((DistanceJoint2D)o).connectedAnchor = (UnityEngine.Vector2)v, Getter = (o) => ((DistanceJoint2D)o).connectedAnchor, Updater = (object o, ref object v) => { var x = ((DistanceJoint2D)o).connectedAnchor; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "autoConfigureDistance", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((DistanceJoint2D)o).autoConfigureDistance = (System.Boolean)v, Getter = (o) => ((DistanceJoint2D)o).autoConfigureDistance, Updater = (object o, ref object v) => { var x = ((DistanceJoint2D)o).autoConfigureDistance; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "distance", PropertyType = typeof(System.Single), Setter = (o, v) => ((DistanceJoint2D)o).distance = (System.Single)v, Getter = (o) => ((DistanceJoint2D)o).distance, Updater = (object o, ref object v) => { var x = ((DistanceJoint2D)o).distance; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "maxDistanceOnly", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((DistanceJoint2D)o).maxDistanceOnly = (System.Boolean)v, Getter = (o) => ((DistanceJoint2D)o).maxDistanceOnly, Updater = (object o, ref object v) => { var x = ((DistanceJoint2D)o).maxDistanceOnly; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakForce", PropertyType = typeof(System.Single), Setter = (o, v) => ((DistanceJoint2D)o).breakForce = (System.Single)v, Getter = (o) => ((DistanceJoint2D)o).breakForce, Updater = (object o, ref object v) => { var x = ((DistanceJoint2D)o).breakForce; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((DistanceJoint2D)o).enabled = (System.Boolean)v, Getter = (o) => ((DistanceJoint2D)o).enabled, Updater = (object o, ref object v) => { var x = ((DistanceJoint2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.Dropdown", new UnityProperty[] {
+                new UnityProperty { Name = "interactable", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Dropdown)o).interactable = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Dropdown)o).interactable, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Dropdown)o).interactable; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "transition", PropertyType = typeof(UnityEngine.UI.Selectable.Transition), Setter = (o, v) => ((UnityEngine.UI.Dropdown)o).transition = (UnityEngine.UI.Selectable.Transition)v, Getter = (o) => ((UnityEngine.UI.Dropdown)o).transition, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.Dropdown)o).transition; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "targetGraphic", PropertyType = typeof(UnityEngine.UI.Graphic), Setter = (o, v) => ((UnityEngine.UI.Dropdown)o).targetGraphic = (UnityEngine.UI.Graphic)v, Getter = (o) => ((UnityEngine.UI.Dropdown)o).targetGraphic, },
+                new UnityProperty { Name = "colors", PropertyType = typeof(UnityEngine.UI.ColorBlock), Setter = (o, v) => ((UnityEngine.UI.Dropdown)o).colors = (UnityEngine.UI.ColorBlock)v, Getter = (o) => ((UnityEngine.UI.Dropdown)o).colors, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Dropdown)o).colors; if (!x.Equals((UnityEngine.UI.ColorBlock)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "navigation", PropertyType = typeof(UnityEngine.UI.Navigation), Setter = (o, v) => ((UnityEngine.UI.Dropdown)o).navigation = (UnityEngine.UI.Navigation)v, Getter = (o) => ((UnityEngine.UI.Dropdown)o).navigation, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Dropdown)o).navigation; if (!x.Equals((UnityEngine.UI.Navigation)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "template", PropertyType = typeof(UnityEngine.RectTransform), Setter = (o, v) => ((UnityEngine.UI.Dropdown)o).template = (UnityEngine.RectTransform)v, Getter = (o) => ((UnityEngine.UI.Dropdown)o).template, },
+                new UnityProperty { Name = "captionText", PropertyType = typeof(UnityEngine.UI.Text), Setter = (o, v) => ((UnityEngine.UI.Dropdown)o).captionText = (UnityEngine.UI.Text)v, Getter = (o) => ((UnityEngine.UI.Dropdown)o).captionText, },
+                new UnityProperty { Name = "captionImage", PropertyType = typeof(UnityEngine.UI.Image), Setter = (o, v) => ((UnityEngine.UI.Dropdown)o).captionImage = (UnityEngine.UI.Image)v, Getter = (o) => ((UnityEngine.UI.Dropdown)o).captionImage, },
+                new UnityProperty { Name = "itemText", PropertyType = typeof(UnityEngine.UI.Text), Setter = (o, v) => ((UnityEngine.UI.Dropdown)o).itemText = (UnityEngine.UI.Text)v, Getter = (o) => ((UnityEngine.UI.Dropdown)o).itemText, },
+                new UnityProperty { Name = "itemImage", PropertyType = typeof(UnityEngine.UI.Image), Setter = (o, v) => ((UnityEngine.UI.Dropdown)o).itemImage = (UnityEngine.UI.Image)v, Getter = (o) => ((UnityEngine.UI.Dropdown)o).itemImage, },
+                new UnityProperty { Name = "value", PropertyType = typeof(System.Int32), Setter = (o, v) => ((UnityEngine.UI.Dropdown)o).value = (System.Int32)v, Getter = (o) => ((UnityEngine.UI.Dropdown)o).value, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Dropdown)o).value; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "alphaFadeSpeed", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.Dropdown)o).alphaFadeSpeed = (System.Single)v, Getter = (o) => ((UnityEngine.UI.Dropdown)o).alphaFadeSpeed, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Dropdown)o).alphaFadeSpeed; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "options", PropertyType = typeof(System.Collections.Generic.List<UnityEngine.UI.Dropdown.OptionData>), Setter = (o, v) => ((UnityEngine.UI.Dropdown)o).options = (System.Collections.Generic.List<UnityEngine.UI.Dropdown.OptionData>)v, Getter = (o) => ((UnityEngine.UI.Dropdown)o).options, },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Dropdown)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Dropdown)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Dropdown)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.EdgeCollider2D", new UnityProperty[] {
+                new UnityProperty { Name = "sharedMaterial", PropertyType = typeof(UnityEngine.PhysicsMaterial2D), Setter = (o, v) => ((EdgeCollider2D)o).sharedMaterial = (UnityEngine.PhysicsMaterial2D)v, Getter = (o) => ((EdgeCollider2D)o).sharedMaterial, },
+                new UnityProperty { Name = "isTrigger", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((EdgeCollider2D)o).isTrigger = (System.Boolean)v, Getter = (o) => ((EdgeCollider2D)o).isTrigger, Updater = (object o, ref object v) => { var x = ((EdgeCollider2D)o).isTrigger; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "usedByEffector", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((EdgeCollider2D)o).usedByEffector = (System.Boolean)v, Getter = (o) => ((EdgeCollider2D)o).usedByEffector, Updater = (object o, ref object v) => { var x = ((EdgeCollider2D)o).usedByEffector; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #if !UNITY_2023_1_OR_NEWER
+                new UnityProperty { Name = "usedByComposite", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((EdgeCollider2D)o).usedByComposite = (System.Boolean)v, Getter = (o) => ((EdgeCollider2D)o).usedByComposite, Updater = (object o, ref object v) => { var x = ((EdgeCollider2D)o).usedByComposite; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #endif
+            #if UNITY_2023_1_OR_NEWER
+                new UnityProperty { Name = "compositeOperation", PropertyType = typeof(UnityEngine.Collider2D.CompositeOperation), Setter = (o, v) => ((EdgeCollider2D)o).compositeOperation = (UnityEngine.Collider2D.CompositeOperation)v, Getter = (o) => ((EdgeCollider2D)o).compositeOperation, Updater = (object o, ref object v) => { var x = (int)((EdgeCollider2D)o).compositeOperation; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+            #endif
+                new UnityProperty { Name = "offset", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((EdgeCollider2D)o).offset = (UnityEngine.Vector2)v, Getter = (o) => ((EdgeCollider2D)o).offset, Updater = (object o, ref object v) => { var x = ((EdgeCollider2D)o).offset; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "edgeRadius", PropertyType = typeof(System.Single), Setter = (o, v) => ((EdgeCollider2D)o).edgeRadius = (System.Single)v, Getter = (o) => ((EdgeCollider2D)o).edgeRadius, Updater = (object o, ref object v) => { var x = ((EdgeCollider2D)o).edgeRadius; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "points", PropertyType = typeof(UnityEngine.Vector2[]), Setter = (o, v) => ((EdgeCollider2D)o).points = (UnityEngine.Vector2[])v, Getter = (o) => ((EdgeCollider2D)o).points, },
+            #if UNITY_2020_1_OR_NEWER
+                new UnityProperty { Name = "useAdjacentStartPoint", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((EdgeCollider2D)o).useAdjacentStartPoint = (System.Boolean)v, Getter = (o) => ((EdgeCollider2D)o).useAdjacentStartPoint, Updater = (object o, ref object v) => { var x = ((EdgeCollider2D)o).useAdjacentStartPoint; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #endif
+            #if UNITY_2020_1_OR_NEWER
+                new UnityProperty { Name = "useAdjacentEndPoint", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((EdgeCollider2D)o).useAdjacentEndPoint = (System.Boolean)v, Getter = (o) => ((EdgeCollider2D)o).useAdjacentEndPoint, Updater = (object o, ref object v) => { var x = ((EdgeCollider2D)o).useAdjacentEndPoint; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #endif
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((EdgeCollider2D)o).enabled = (System.Boolean)v, Getter = (o) => ((EdgeCollider2D)o).enabled, Updater = (object o, ref object v) => { var x = ((EdgeCollider2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.EventSystems.EventSystem", new UnityProperty[] {
+                new UnityProperty { Name = "firstSelectedGameObject", PropertyType = typeof(UnityEngine.GameObject), Setter = (o, v) => ((UnityEngine.EventSystems.EventSystem)o).firstSelectedGameObject = (UnityEngine.GameObject)v, Getter = (o) => ((UnityEngine.EventSystems.EventSystem)o).firstSelectedGameObject, },
+                new UnityProperty { Name = "sendNavigationEvents", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.EventSystems.EventSystem)o).sendNavigationEvents = (System.Boolean)v, Getter = (o) => ((UnityEngine.EventSystems.EventSystem)o).sendNavigationEvents, Updater = (object o, ref object v) => { var x = ((UnityEngine.EventSystems.EventSystem)o).sendNavigationEvents; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "pixelDragThreshold", PropertyType = typeof(System.Int32), Setter = (o, v) => ((UnityEngine.EventSystems.EventSystem)o).pixelDragThreshold = (System.Int32)v, Getter = (o) => ((UnityEngine.EventSystems.EventSystem)o).pixelDragThreshold, Updater = (object o, ref object v) => { var x = ((UnityEngine.EventSystems.EventSystem)o).pixelDragThreshold; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.EventSystems.EventSystem)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.EventSystems.EventSystem)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.EventSystems.EventSystem)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.FixedJoint2D", new UnityProperty[] {
+                new UnityProperty { Name = "enableCollision", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((FixedJoint2D)o).enableCollision = (System.Boolean)v, Getter = (o) => ((FixedJoint2D)o).enableCollision, Updater = (object o, ref object v) => { var x = ((FixedJoint2D)o).enableCollision; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedBody", PropertyType = typeof(UnityEngine.Rigidbody2D), Setter = (o, v) => ((FixedJoint2D)o).connectedBody = (UnityEngine.Rigidbody2D)v, Getter = (o) => ((FixedJoint2D)o).connectedBody, },
+                new UnityProperty { Name = "autoConfigureConnectedAnchor", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((FixedJoint2D)o).autoConfigureConnectedAnchor = (System.Boolean)v, Getter = (o) => ((FixedJoint2D)o).autoConfigureConnectedAnchor, Updater = (object o, ref object v) => { var x = ((FixedJoint2D)o).autoConfigureConnectedAnchor; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "anchor", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((FixedJoint2D)o).anchor = (UnityEngine.Vector2)v, Getter = (o) => ((FixedJoint2D)o).anchor, Updater = (object o, ref object v) => { var x = ((FixedJoint2D)o).anchor; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedAnchor", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((FixedJoint2D)o).connectedAnchor = (UnityEngine.Vector2)v, Getter = (o) => ((FixedJoint2D)o).connectedAnchor, Updater = (object o, ref object v) => { var x = ((FixedJoint2D)o).connectedAnchor; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "dampingRatio", PropertyType = typeof(System.Single), Setter = (o, v) => ((FixedJoint2D)o).dampingRatio = (System.Single)v, Getter = (o) => ((FixedJoint2D)o).dampingRatio, Updater = (object o, ref object v) => { var x = ((FixedJoint2D)o).dampingRatio; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "frequency", PropertyType = typeof(System.Single), Setter = (o, v) => ((FixedJoint2D)o).frequency = (System.Single)v, Getter = (o) => ((FixedJoint2D)o).frequency, Updater = (object o, ref object v) => { var x = ((FixedJoint2D)o).frequency; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakForce", PropertyType = typeof(System.Single), Setter = (o, v) => ((FixedJoint2D)o).breakForce = (System.Single)v, Getter = (o) => ((FixedJoint2D)o).breakForce, Updater = (object o, ref object v) => { var x = ((FixedJoint2D)o).breakForce; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakTorque", PropertyType = typeof(System.Single), Setter = (o, v) => ((FixedJoint2D)o).breakTorque = (System.Single)v, Getter = (o) => ((FixedJoint2D)o).breakTorque, Updater = (object o, ref object v) => { var x = ((FixedJoint2D)o).breakTorque; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((FixedJoint2D)o).enabled = (System.Boolean)v, Getter = (o) => ((FixedJoint2D)o).enabled, Updater = (object o, ref object v) => { var x = ((FixedJoint2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.FrictionJoint2D", new UnityProperty[] {
+                new UnityProperty { Name = "enableCollision", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((FrictionJoint2D)o).enableCollision = (System.Boolean)v, Getter = (o) => ((FrictionJoint2D)o).enableCollision, Updater = (object o, ref object v) => { var x = ((FrictionJoint2D)o).enableCollision; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedBody", PropertyType = typeof(UnityEngine.Rigidbody2D), Setter = (o, v) => ((FrictionJoint2D)o).connectedBody = (UnityEngine.Rigidbody2D)v, Getter = (o) => ((FrictionJoint2D)o).connectedBody, },
+                new UnityProperty { Name = "autoConfigureConnectedAnchor", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((FrictionJoint2D)o).autoConfigureConnectedAnchor = (System.Boolean)v, Getter = (o) => ((FrictionJoint2D)o).autoConfigureConnectedAnchor, Updater = (object o, ref object v) => { var x = ((FrictionJoint2D)o).autoConfigureConnectedAnchor; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "anchor", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((FrictionJoint2D)o).anchor = (UnityEngine.Vector2)v, Getter = (o) => ((FrictionJoint2D)o).anchor, Updater = (object o, ref object v) => { var x = ((FrictionJoint2D)o).anchor; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedAnchor", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((FrictionJoint2D)o).connectedAnchor = (UnityEngine.Vector2)v, Getter = (o) => ((FrictionJoint2D)o).connectedAnchor, Updater = (object o, ref object v) => { var x = ((FrictionJoint2D)o).connectedAnchor; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "maxForce", PropertyType = typeof(System.Single), Setter = (o, v) => ((FrictionJoint2D)o).maxForce = (System.Single)v, Getter = (o) => ((FrictionJoint2D)o).maxForce, Updater = (object o, ref object v) => { var x = ((FrictionJoint2D)o).maxForce; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "maxTorque", PropertyType = typeof(System.Single), Setter = (o, v) => ((FrictionJoint2D)o).maxTorque = (System.Single)v, Getter = (o) => ((FrictionJoint2D)o).maxTorque, Updater = (object o, ref object v) => { var x = ((FrictionJoint2D)o).maxTorque; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakForce", PropertyType = typeof(System.Single), Setter = (o, v) => ((FrictionJoint2D)o).breakForce = (System.Single)v, Getter = (o) => ((FrictionJoint2D)o).breakForce, Updater = (object o, ref object v) => { var x = ((FrictionJoint2D)o).breakForce; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakTorque", PropertyType = typeof(System.Single), Setter = (o, v) => ((FrictionJoint2D)o).breakTorque = (System.Single)v, Getter = (o) => ((FrictionJoint2D)o).breakTorque, Updater = (object o, ref object v) => { var x = ((FrictionJoint2D)o).breakTorque; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((FrictionJoint2D)o).enabled = (System.Boolean)v, Getter = (o) => ((FrictionJoint2D)o).enabled, Updater = (object o, ref object v) => { var x = ((FrictionJoint2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.GraphicRaycaster", new UnityProperty[] {
+                new UnityProperty { Name = "ignoreReversedGraphics", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.GraphicRaycaster)o).ignoreReversedGraphics = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.GraphicRaycaster)o).ignoreReversedGraphics, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.GraphicRaycaster)o).ignoreReversedGraphics; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "blockingObjects", PropertyType = typeof(UnityEngine.UI.GraphicRaycaster.BlockingObjects), Setter = (o, v) => ((UnityEngine.UI.GraphicRaycaster)o).blockingObjects = (UnityEngine.UI.GraphicRaycaster.BlockingObjects)v, Getter = (o) => ((UnityEngine.UI.GraphicRaycaster)o).blockingObjects, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.GraphicRaycaster)o).blockingObjects; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+            #if UNITY_2020_2_OR_NEWER
+                new UnityProperty { Name = "blockingMask", PropertyType = typeof(UnityEngine.LayerMask), Setter = (o, v) => ((UnityEngine.UI.GraphicRaycaster)o).blockingMask = (UnityEngine.LayerMask)v, Getter = (o) => ((UnityEngine.UI.GraphicRaycaster)o).blockingMask, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.GraphicRaycaster)o).blockingMask; if (!x.Equals((UnityEngine.LayerMask)v)) { v = x; return true; } return false; } },
+            #endif
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.GraphicRaycaster)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.GraphicRaycaster)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.GraphicRaycaster)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+            { "UnityEngine.Grid", new UnityProperty[] {
+                new UnityProperty { Name = "cellSize", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((Grid)o).cellSize = (UnityEngine.Vector3)v, Getter = (o) => ((Grid)o).cellSize, Updater = (object o, ref object v) => { var x = ((Grid)o).cellSize; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "cellGap", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((Grid)o).cellGap = (UnityEngine.Vector3)v, Getter = (o) => ((Grid)o).cellGap, Updater = (object o, ref object v) => { var x = ((Grid)o).cellGap; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "cellLayout", PropertyType = typeof(UnityEngine.GridLayout.CellLayout), Setter = (o, v) => ((Grid)o).cellLayout = (UnityEngine.GridLayout.CellLayout)v, Getter = (o) => ((Grid)o).cellLayout, Updater = (object o, ref object v) => { var x = (int)((Grid)o).cellLayout; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "cellSwizzle", PropertyType = typeof(UnityEngine.GridLayout.CellSwizzle), Setter = (o, v) => ((Grid)o).cellSwizzle = (UnityEngine.GridLayout.CellSwizzle)v, Getter = (o) => ((Grid)o).cellSwizzle, Updater = (object o, ref object v) => { var x = (int)((Grid)o).cellSwizzle; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Grid)o).enabled = (System.Boolean)v, Getter = (o) => ((Grid)o).enabled, Updater = (object o, ref object v) => { var x = ((Grid)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.GridLayoutGroup", new UnityProperty[] {
+                new UnityProperty { Name = "padding", PropertyType = typeof(UnityEngine.RectOffset), Setter = (o, v) => ((UnityEngine.UI.GridLayoutGroup)o).padding = (UnityEngine.RectOffset)v, Getter = (o) => ((UnityEngine.UI.GridLayoutGroup)o).padding, },
+                new UnityProperty { Name = "cellSize", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((UnityEngine.UI.GridLayoutGroup)o).cellSize = (UnityEngine.Vector2)v, Getter = (o) => ((UnityEngine.UI.GridLayoutGroup)o).cellSize, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.GridLayoutGroup)o).cellSize; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "spacing", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((UnityEngine.UI.GridLayoutGroup)o).spacing = (UnityEngine.Vector2)v, Getter = (o) => ((UnityEngine.UI.GridLayoutGroup)o).spacing, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.GridLayoutGroup)o).spacing; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "startCorner", PropertyType = typeof(UnityEngine.UI.GridLayoutGroup.Corner), Setter = (o, v) => ((UnityEngine.UI.GridLayoutGroup)o).startCorner = (UnityEngine.UI.GridLayoutGroup.Corner)v, Getter = (o) => ((UnityEngine.UI.GridLayoutGroup)o).startCorner, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.GridLayoutGroup)o).startCorner; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "startAxis", PropertyType = typeof(UnityEngine.UI.GridLayoutGroup.Axis), Setter = (o, v) => ((UnityEngine.UI.GridLayoutGroup)o).startAxis = (UnityEngine.UI.GridLayoutGroup.Axis)v, Getter = (o) => ((UnityEngine.UI.GridLayoutGroup)o).startAxis, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.GridLayoutGroup)o).startAxis; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "childAlignment", PropertyType = typeof(UnityEngine.TextAnchor), Setter = (o, v) => ((UnityEngine.UI.GridLayoutGroup)o).childAlignment = (UnityEngine.TextAnchor)v, Getter = (o) => ((UnityEngine.UI.GridLayoutGroup)o).childAlignment, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.GridLayoutGroup)o).childAlignment; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "constraint", PropertyType = typeof(UnityEngine.UI.GridLayoutGroup.Constraint), Setter = (o, v) => ((UnityEngine.UI.GridLayoutGroup)o).constraint = (UnityEngine.UI.GridLayoutGroup.Constraint)v, Getter = (o) => ((UnityEngine.UI.GridLayoutGroup)o).constraint, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.GridLayoutGroup)o).constraint; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.GridLayoutGroup)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.GridLayoutGroup)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.GridLayoutGroup)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS
+            { "UnityEngine.HingeJoint", new UnityProperty[] {
+                new UnityProperty { Name = "connectedBody", PropertyType = typeof(UnityEngine.Rigidbody), Setter = (o, v) => ((HingeJoint)o).connectedBody = (UnityEngine.Rigidbody)v, Getter = (o) => ((HingeJoint)o).connectedBody, },
+            #if UNITY_2020_2_OR_NEWER
+                new UnityProperty { Name = "connectedArticulationBody", PropertyType = typeof(UnityEngine.ArticulationBody), Setter = (o, v) => ((HingeJoint)o).connectedArticulationBody = (UnityEngine.ArticulationBody)v, Getter = (o) => ((HingeJoint)o).connectedArticulationBody, },
+            #endif
+                new UnityProperty { Name = "anchor", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((HingeJoint)o).anchor = (UnityEngine.Vector3)v, Getter = (o) => ((HingeJoint)o).anchor, Updater = (object o, ref object v) => { var x = ((HingeJoint)o).anchor; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "axis", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((HingeJoint)o).axis = (UnityEngine.Vector3)v, Getter = (o) => ((HingeJoint)o).axis, Updater = (object o, ref object v) => { var x = ((HingeJoint)o).axis; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "autoConfigureConnectedAnchor", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((HingeJoint)o).autoConfigureConnectedAnchor = (System.Boolean)v, Getter = (o) => ((HingeJoint)o).autoConfigureConnectedAnchor, Updater = (object o, ref object v) => { var x = ((HingeJoint)o).autoConfigureConnectedAnchor; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedAnchor", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((HingeJoint)o).connectedAnchor = (UnityEngine.Vector3)v, Getter = (o) => ((HingeJoint)o).connectedAnchor, Updater = (object o, ref object v) => { var x = ((HingeJoint)o).connectedAnchor; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useSpring", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((HingeJoint)o).useSpring = (System.Boolean)v, Getter = (o) => ((HingeJoint)o).useSpring, Updater = (object o, ref object v) => { var x = ((HingeJoint)o).useSpring; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "spring", PropertyType = typeof(UnityEngine.JointSpring), Setter = (o, v) => ((HingeJoint)o).spring = (UnityEngine.JointSpring)v, Getter = (o) => ((HingeJoint)o).spring, Updater = (object o, ref object v) => { var x = ((HingeJoint)o).spring; if (!x.Equals((UnityEngine.JointSpring)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useMotor", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((HingeJoint)o).useMotor = (System.Boolean)v, Getter = (o) => ((HingeJoint)o).useMotor, Updater = (object o, ref object v) => { var x = ((HingeJoint)o).useMotor; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "motor", PropertyType = typeof(UnityEngine.JointMotor), Setter = (o, v) => ((HingeJoint)o).motor = (UnityEngine.JointMotor)v, Getter = (o) => ((HingeJoint)o).motor, Updater = (object o, ref object v) => { var x = ((HingeJoint)o).motor; if (!x.Equals((UnityEngine.JointMotor)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useLimits", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((HingeJoint)o).useLimits = (System.Boolean)v, Getter = (o) => ((HingeJoint)o).useLimits, Updater = (object o, ref object v) => { var x = ((HingeJoint)o).useLimits; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "limits", PropertyType = typeof(UnityEngine.JointLimits), Setter = (o, v) => ((HingeJoint)o).limits = (UnityEngine.JointLimits)v, Getter = (o) => ((HingeJoint)o).limits, Updater = (object o, ref object v) => { var x = ((HingeJoint)o).limits; if (!x.Equals((UnityEngine.JointLimits)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakForce", PropertyType = typeof(System.Single), Setter = (o, v) => ((HingeJoint)o).breakForce = (System.Single)v, Getter = (o) => ((HingeJoint)o).breakForce, Updater = (object o, ref object v) => { var x = ((HingeJoint)o).breakForce; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakTorque", PropertyType = typeof(System.Single), Setter = (o, v) => ((HingeJoint)o).breakTorque = (System.Single)v, Getter = (o) => ((HingeJoint)o).breakTorque, Updater = (object o, ref object v) => { var x = ((HingeJoint)o).breakTorque; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enableCollision", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((HingeJoint)o).enableCollision = (System.Boolean)v, Getter = (o) => ((HingeJoint)o).enableCollision, Updater = (object o, ref object v) => { var x = ((HingeJoint)o).enableCollision; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enablePreprocessing", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((HingeJoint)o).enablePreprocessing = (System.Boolean)v, Getter = (o) => ((HingeJoint)o).enablePreprocessing, Updater = (object o, ref object v) => { var x = ((HingeJoint)o).enablePreprocessing; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "massScale", PropertyType = typeof(System.Single), Setter = (o, v) => ((HingeJoint)o).massScale = (System.Single)v, Getter = (o) => ((HingeJoint)o).massScale, Updater = (object o, ref object v) => { var x = ((HingeJoint)o).massScale; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedMassScale", PropertyType = typeof(System.Single), Setter = (o, v) => ((HingeJoint)o).connectedMassScale = (System.Single)v, Getter = (o) => ((HingeJoint)o).connectedMassScale, Updater = (object o, ref object v) => { var x = ((HingeJoint)o).connectedMassScale; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.HingeJoint2D", new UnityProperty[] {
+                new UnityProperty { Name = "enableCollision", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((HingeJoint2D)o).enableCollision = (System.Boolean)v, Getter = (o) => ((HingeJoint2D)o).enableCollision, Updater = (object o, ref object v) => { var x = ((HingeJoint2D)o).enableCollision; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedBody", PropertyType = typeof(UnityEngine.Rigidbody2D), Setter = (o, v) => ((HingeJoint2D)o).connectedBody = (UnityEngine.Rigidbody2D)v, Getter = (o) => ((HingeJoint2D)o).connectedBody, },
+                new UnityProperty { Name = "autoConfigureConnectedAnchor", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((HingeJoint2D)o).autoConfigureConnectedAnchor = (System.Boolean)v, Getter = (o) => ((HingeJoint2D)o).autoConfigureConnectedAnchor, Updater = (object o, ref object v) => { var x = ((HingeJoint2D)o).autoConfigureConnectedAnchor; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "anchor", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((HingeJoint2D)o).anchor = (UnityEngine.Vector2)v, Getter = (o) => ((HingeJoint2D)o).anchor, Updater = (object o, ref object v) => { var x = ((HingeJoint2D)o).anchor; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedAnchor", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((HingeJoint2D)o).connectedAnchor = (UnityEngine.Vector2)v, Getter = (o) => ((HingeJoint2D)o).connectedAnchor, Updater = (object o, ref object v) => { var x = ((HingeJoint2D)o).connectedAnchor; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useMotor", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((HingeJoint2D)o).useMotor = (System.Boolean)v, Getter = (o) => ((HingeJoint2D)o).useMotor, Updater = (object o, ref object v) => { var x = ((HingeJoint2D)o).useMotor; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "motor", PropertyType = typeof(UnityEngine.JointMotor2D), Setter = (o, v) => ((HingeJoint2D)o).motor = (UnityEngine.JointMotor2D)v, Getter = (o) => ((HingeJoint2D)o).motor, Updater = (object o, ref object v) => { var x = ((HingeJoint2D)o).motor; if (!x.Equals((UnityEngine.JointMotor2D)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useLimits", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((HingeJoint2D)o).useLimits = (System.Boolean)v, Getter = (o) => ((HingeJoint2D)o).useLimits, Updater = (object o, ref object v) => { var x = ((HingeJoint2D)o).useLimits; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "limits", PropertyType = typeof(UnityEngine.JointAngleLimits2D), Setter = (o, v) => ((HingeJoint2D)o).limits = (UnityEngine.JointAngleLimits2D)v, Getter = (o) => ((HingeJoint2D)o).limits, Updater = (object o, ref object v) => { var x = ((HingeJoint2D)o).limits; if (!x.Equals((UnityEngine.JointAngleLimits2D)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakForce", PropertyType = typeof(System.Single), Setter = (o, v) => ((HingeJoint2D)o).breakForce = (System.Single)v, Getter = (o) => ((HingeJoint2D)o).breakForce, Updater = (object o, ref object v) => { var x = ((HingeJoint2D)o).breakForce; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakTorque", PropertyType = typeof(System.Single), Setter = (o, v) => ((HingeJoint2D)o).breakTorque = (System.Single)v, Getter = (o) => ((HingeJoint2D)o).breakTorque, Updater = (object o, ref object v) => { var x = ((HingeJoint2D)o).breakTorque; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((HingeJoint2D)o).enabled = (System.Boolean)v, Getter = (o) => ((HingeJoint2D)o).enabled, Updater = (object o, ref object v) => { var x = ((HingeJoint2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.HorizontalLayoutGroup", new UnityProperty[] {
+                new UnityProperty { Name = "padding", PropertyType = typeof(UnityEngine.RectOffset), Setter = (o, v) => ((UnityEngine.UI.HorizontalLayoutGroup)o).padding = (UnityEngine.RectOffset)v, Getter = (o) => ((UnityEngine.UI.HorizontalLayoutGroup)o).padding, },
+                new UnityProperty { Name = "spacing", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.HorizontalLayoutGroup)o).spacing = (System.Single)v, Getter = (o) => ((UnityEngine.UI.HorizontalLayoutGroup)o).spacing, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.HorizontalLayoutGroup)o).spacing; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "childAlignment", PropertyType = typeof(UnityEngine.TextAnchor), Setter = (o, v) => ((UnityEngine.UI.HorizontalLayoutGroup)o).childAlignment = (UnityEngine.TextAnchor)v, Getter = (o) => ((UnityEngine.UI.HorizontalLayoutGroup)o).childAlignment, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.HorizontalLayoutGroup)o).childAlignment; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "childControlWidth", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.HorizontalLayoutGroup)o).childControlWidth = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.HorizontalLayoutGroup)o).childControlWidth, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.HorizontalLayoutGroup)o).childControlWidth; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "childControlHeight", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.HorizontalLayoutGroup)o).childControlHeight = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.HorizontalLayoutGroup)o).childControlHeight, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.HorizontalLayoutGroup)o).childControlHeight; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "childScaleWidth", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.HorizontalLayoutGroup)o).childScaleWidth = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.HorizontalLayoutGroup)o).childScaleWidth, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.HorizontalLayoutGroup)o).childScaleWidth; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "childScaleHeight", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.HorizontalLayoutGroup)o).childScaleHeight = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.HorizontalLayoutGroup)o).childScaleHeight, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.HorizontalLayoutGroup)o).childScaleHeight; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "childForceExpandWidth", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.HorizontalLayoutGroup)o).childForceExpandWidth = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.HorizontalLayoutGroup)o).childForceExpandWidth, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.HorizontalLayoutGroup)o).childForceExpandWidth; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "childForceExpandHeight", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.HorizontalLayoutGroup)o).childForceExpandHeight = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.HorizontalLayoutGroup)o).childForceExpandHeight, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.HorizontalLayoutGroup)o).childForceExpandHeight; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.HorizontalLayoutGroup)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.HorizontalLayoutGroup)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.HorizontalLayoutGroup)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.VerticalLayoutGroup", new UnityProperty[] {
+                new UnityProperty { Name = "padding", PropertyType = typeof(UnityEngine.RectOffset), Setter = (o, v) => ((UnityEngine.UI.VerticalLayoutGroup)o).padding = (UnityEngine.RectOffset)v, Getter = (o) => ((UnityEngine.UI.VerticalLayoutGroup)o).padding, },
+                new UnityProperty { Name = "spacing", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.VerticalLayoutGroup)o).spacing = (System.Single)v, Getter = (o) => ((UnityEngine.UI.VerticalLayoutGroup)o).spacing, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.VerticalLayoutGroup)o).spacing; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "childAlignment", PropertyType = typeof(UnityEngine.TextAnchor), Setter = (o, v) => ((UnityEngine.UI.VerticalLayoutGroup)o).childAlignment = (UnityEngine.TextAnchor)v, Getter = (o) => ((UnityEngine.UI.VerticalLayoutGroup)o).childAlignment, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.VerticalLayoutGroup)o).childAlignment; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "childControlWidth", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.VerticalLayoutGroup)o).childControlWidth = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.VerticalLayoutGroup)o).childControlWidth, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.VerticalLayoutGroup)o).childControlWidth; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "childControlHeight", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.VerticalLayoutGroup)o).childControlHeight = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.VerticalLayoutGroup)o).childControlHeight, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.VerticalLayoutGroup)o).childControlHeight; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "childScaleWidth", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.VerticalLayoutGroup)o).childScaleWidth = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.VerticalLayoutGroup)o).childScaleWidth, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.VerticalLayoutGroup)o).childScaleWidth; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "childScaleHeight", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.VerticalLayoutGroup)o).childScaleHeight = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.VerticalLayoutGroup)o).childScaleHeight, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.VerticalLayoutGroup)o).childScaleHeight; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "childForceExpandWidth", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.VerticalLayoutGroup)o).childForceExpandWidth = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.VerticalLayoutGroup)o).childForceExpandWidth, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.VerticalLayoutGroup)o).childForceExpandWidth; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "childForceExpandHeight", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.VerticalLayoutGroup)o).childForceExpandHeight = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.VerticalLayoutGroup)o).childForceExpandHeight, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.VerticalLayoutGroup)o).childForceExpandHeight; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.VerticalLayoutGroup)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.VerticalLayoutGroup)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.VerticalLayoutGroup)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.Image", new UnityProperty[] {
+                new UnityProperty { Name = "sprite", PropertyType = typeof(UnityEngine.Sprite), Setter = (o, v) => ((UnityEngine.UI.Image)o).sprite = (UnityEngine.Sprite)v, Getter = (o) => ((UnityEngine.UI.Image)o).sprite, },
+                new UnityProperty { Name = "material", PropertyType = typeof(UnityEngine.Material), Setter = (o, v) => ((UnityEngine.UI.Image)o).material = (UnityEngine.Material)v, Getter = (o) => ((UnityEngine.UI.Image)o).material, },
+                new UnityProperty { Name = "color", PropertyType = typeof(UnityEngine.Color), Setter = (o, v) => ((UnityEngine.UI.Image)o).color = (UnityEngine.Color)v, Getter = (o) => ((UnityEngine.UI.Image)o).color, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Image)o).color; if (!x.Equals((UnityEngine.Color)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "raycastTarget", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Image)o).raycastTarget = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Image)o).raycastTarget, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Image)o).raycastTarget; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #if UNITY_2020_1_OR_NEWER
+                new UnityProperty { Name = "raycastPadding", PropertyType = typeof(UnityEngine.Vector4), Setter = (o, v) => ((UnityEngine.UI.Image)o).raycastPadding = (UnityEngine.Vector4)v, Getter = (o) => ((UnityEngine.UI.Image)o).raycastPadding, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Image)o).raycastPadding; if (!x.Equals((UnityEngine.Vector4)v)) { v = x; return true; } return false; } },
+            #endif
+                new UnityProperty { Name = "maskable", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Image)o).maskable = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Image)o).maskable, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Image)o).maskable; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Image)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Image)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Image)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.InputField", new UnityProperty[] {
+                new UnityProperty { Name = "interactable", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.InputField)o).interactable = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.InputField)o).interactable, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.InputField)o).interactable; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "transition", PropertyType = typeof(UnityEngine.UI.Selectable.Transition), Setter = (o, v) => ((UnityEngine.UI.InputField)o).transition = (UnityEngine.UI.Selectable.Transition)v, Getter = (o) => ((UnityEngine.UI.InputField)o).transition, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.InputField)o).transition; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "targetGraphic", PropertyType = typeof(UnityEngine.UI.Graphic), Setter = (o, v) => ((UnityEngine.UI.InputField)o).targetGraphic = (UnityEngine.UI.Graphic)v, Getter = (o) => ((UnityEngine.UI.InputField)o).targetGraphic, },
+                new UnityProperty { Name = "colors", PropertyType = typeof(UnityEngine.UI.ColorBlock), Setter = (o, v) => ((UnityEngine.UI.InputField)o).colors = (UnityEngine.UI.ColorBlock)v, Getter = (o) => ((UnityEngine.UI.InputField)o).colors, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.InputField)o).colors; if (!x.Equals((UnityEngine.UI.ColorBlock)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "navigation", PropertyType = typeof(UnityEngine.UI.Navigation), Setter = (o, v) => ((UnityEngine.UI.InputField)o).navigation = (UnityEngine.UI.Navigation)v, Getter = (o) => ((UnityEngine.UI.InputField)o).navigation, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.InputField)o).navigation; if (!x.Equals((UnityEngine.UI.Navigation)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "textComponent", PropertyType = typeof(UnityEngine.UI.Text), Setter = (o, v) => ((UnityEngine.UI.InputField)o).textComponent = (UnityEngine.UI.Text)v, Getter = (o) => ((UnityEngine.UI.InputField)o).textComponent, },
+                new UnityProperty { Name = "text", PropertyType = typeof(System.String), Setter = (o, v) => ((UnityEngine.UI.InputField)o).text = (System.String)v, Getter = (o) => ((UnityEngine.UI.InputField)o).text, },
+                new UnityProperty { Name = "characterLimit", PropertyType = typeof(System.Int32), Setter = (o, v) => ((UnityEngine.UI.InputField)o).characterLimit = (System.Int32)v, Getter = (o) => ((UnityEngine.UI.InputField)o).characterLimit, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.InputField)o).characterLimit; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "contentType", PropertyType = typeof(UnityEngine.UI.InputField.ContentType), Setter = (o, v) => ((UnityEngine.UI.InputField)o).contentType = (UnityEngine.UI.InputField.ContentType)v, Getter = (o) => ((UnityEngine.UI.InputField)o).contentType, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.InputField)o).contentType; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "lineType", PropertyType = typeof(UnityEngine.UI.InputField.LineType), Setter = (o, v) => ((UnityEngine.UI.InputField)o).lineType = (UnityEngine.UI.InputField.LineType)v, Getter = (o) => ((UnityEngine.UI.InputField)o).lineType, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.InputField)o).lineType; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "placeholder", PropertyType = typeof(UnityEngine.UI.Graphic), Setter = (o, v) => ((UnityEngine.UI.InputField)o).placeholder = (UnityEngine.UI.Graphic)v, Getter = (o) => ((UnityEngine.UI.InputField)o).placeholder, },
+                new UnityProperty { Name = "caretBlinkRate", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.InputField)o).caretBlinkRate = (System.Single)v, Getter = (o) => ((UnityEngine.UI.InputField)o).caretBlinkRate, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.InputField)o).caretBlinkRate; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "caretWidth", PropertyType = typeof(System.Int32), Setter = (o, v) => ((UnityEngine.UI.InputField)o).caretWidth = (System.Int32)v, Getter = (o) => ((UnityEngine.UI.InputField)o).caretWidth, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.InputField)o).caretWidth; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "customCaretColor", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.InputField)o).customCaretColor = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.InputField)o).customCaretColor, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.InputField)o).customCaretColor; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "selectionColor", PropertyType = typeof(UnityEngine.Color), Setter = (o, v) => ((UnityEngine.UI.InputField)o).selectionColor = (UnityEngine.Color)v, Getter = (o) => ((UnityEngine.UI.InputField)o).selectionColor, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.InputField)o).selectionColor; if (!x.Equals((UnityEngine.Color)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "shouldHideMobileInput", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.InputField)o).shouldHideMobileInput = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.InputField)o).shouldHideMobileInput, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.InputField)o).shouldHideMobileInput; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "readOnly", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.InputField)o).readOnly = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.InputField)o).readOnly, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.InputField)o).readOnly; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #if UNITY_2020_3_OR_NEWER
+                new UnityProperty { Name = "shouldActivateOnSelect", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.InputField)o).shouldActivateOnSelect = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.InputField)o).shouldActivateOnSelect, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.InputField)o).shouldActivateOnSelect; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #endif
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.InputField)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.InputField)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.InputField)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.LayoutElement", new UnityProperty[] {
+                new UnityProperty { Name = "ignoreLayout", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.LayoutElement)o).ignoreLayout = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.LayoutElement)o).ignoreLayout, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.LayoutElement)o).ignoreLayout; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "minWidth", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.LayoutElement)o).minWidth = (System.Single)v, Getter = (o) => ((UnityEngine.UI.LayoutElement)o).minWidth, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.LayoutElement)o).minWidth; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "minHeight", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.LayoutElement)o).minHeight = (System.Single)v, Getter = (o) => ((UnityEngine.UI.LayoutElement)o).minHeight, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.LayoutElement)o).minHeight; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "preferredWidth", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.LayoutElement)o).preferredWidth = (System.Single)v, Getter = (o) => ((UnityEngine.UI.LayoutElement)o).preferredWidth, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.LayoutElement)o).preferredWidth; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "preferredHeight", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.LayoutElement)o).preferredHeight = (System.Single)v, Getter = (o) => ((UnityEngine.UI.LayoutElement)o).preferredHeight, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.LayoutElement)o).preferredHeight; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "flexibleWidth", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.LayoutElement)o).flexibleWidth = (System.Single)v, Getter = (o) => ((UnityEngine.UI.LayoutElement)o).flexibleWidth, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.LayoutElement)o).flexibleWidth; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "flexibleHeight", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.LayoutElement)o).flexibleHeight = (System.Single)v, Getter = (o) => ((UnityEngine.UI.LayoutElement)o).flexibleHeight, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.LayoutElement)o).flexibleHeight; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "layoutPriority", PropertyType = typeof(System.Int32), Setter = (o, v) => ((UnityEngine.UI.LayoutElement)o).layoutPriority = (System.Int32)v, Getter = (o) => ((UnityEngine.UI.LayoutElement)o).layoutPriority, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.LayoutElement)o).layoutPriority; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.LayoutElement)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.LayoutElement)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.LayoutElement)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+            { "UnityEngine.LensFlare", new UnityProperty[] {
+                new UnityProperty { Name = "flare", PropertyType = typeof(UnityEngine.Flare), Setter = (o, v) => ((LensFlare)o).flare = (UnityEngine.Flare)v, Getter = (o) => ((LensFlare)o).flare, },
+                new UnityProperty { Name = "color", PropertyType = typeof(UnityEngine.Color), Setter = (o, v) => ((LensFlare)o).color = (UnityEngine.Color)v, Getter = (o) => ((LensFlare)o).color, Updater = (object o, ref object v) => { var x = ((LensFlare)o).color; if (!x.Equals((UnityEngine.Color)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "brightness", PropertyType = typeof(System.Single), Setter = (o, v) => ((LensFlare)o).brightness = (System.Single)v, Getter = (o) => ((LensFlare)o).brightness, Updater = (object o, ref object v) => { var x = ((LensFlare)o).brightness; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "fadeSpeed", PropertyType = typeof(System.Single), Setter = (o, v) => ((LensFlare)o).fadeSpeed = (System.Single)v, Getter = (o) => ((LensFlare)o).fadeSpeed, Updater = (object o, ref object v) => { var x = ((LensFlare)o).fadeSpeed; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((LensFlare)o).enabled = (System.Boolean)v, Getter = (o) => ((LensFlare)o).enabled, Updater = (object o, ref object v) => { var x = ((LensFlare)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+
+
+            { "UnityEngine.Light", new UnityProperty[] {
+                new UnityProperty { Name = "type", PropertyType = typeof(UnityEngine.LightType), Setter = (o, v) => ((Light)o).type = (UnityEngine.LightType)v, Getter = (o) => ((Light)o).type, Updater = (object o, ref object v) => { var x = (int)((Light)o).type; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "range", PropertyType = typeof(System.Single), Setter = (o, v) => ((Light)o).range = (System.Single)v, Getter = (o) => ((Light)o).range, Updater = (object o, ref object v) => { var x = ((Light)o).range; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "spotAngle", PropertyType = typeof(System.Single), Setter = (o, v) => ((Light)o).spotAngle = (System.Single)v, Getter = (o) => ((Light)o).spotAngle, Updater = (object o, ref object v) => { var x = ((Light)o).spotAngle; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "type", PropertyType = typeof(UnityEngine.LightType), Setter = (o, v) => ((Light)o).type = (UnityEngine.LightType)v, Getter = (o) => ((Light)o).type, Updater = (object o, ref object v) => { var x = (int)((Light)o).type; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "color", PropertyType = typeof(UnityEngine.Color), Setter = (o, v) => ((Light)o).color = (UnityEngine.Color)v, Getter = (o) => ((Light)o).color, Updater = (object o, ref object v) => { var x = ((Light)o).color; if (!x.Equals((UnityEngine.Color)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "intensity", PropertyType = typeof(System.Single), Setter = (o, v) => ((Light)o).intensity = (System.Single)v, Getter = (o) => ((Light)o).intensity, Updater = (object o, ref object v) => { var x = ((Light)o).intensity; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "bounceIntensity", PropertyType = typeof(System.Single), Setter = (o, v) => ((Light)o).bounceIntensity = (System.Single)v, Getter = (o) => ((Light)o).bounceIntensity, Updater = (object o, ref object v) => { var x = ((Light)o).bounceIntensity; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "shadows", PropertyType = typeof(UnityEngine.LightShadows), Setter = (o, v) => ((Light)o).shadows = (UnityEngine.LightShadows)v, Getter = (o) => ((Light)o).shadows, Updater = (object o, ref object v) => { var x = (int)((Light)o).shadows; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "cookie", PropertyType = typeof(UnityEngine.Texture), Setter = (o, v) => ((Light)o).cookie = (UnityEngine.Texture)v, Getter = (o) => ((Light)o).cookie, },
+                new UnityProperty { Name = "flare", PropertyType = typeof(UnityEngine.Flare), Setter = (o, v) => ((Light)o).flare = (UnityEngine.Flare)v, Getter = (o) => ((Light)o).flare, },
+                new UnityProperty { Name = "renderMode", PropertyType = typeof(UnityEngine.LightRenderMode), Setter = (o, v) => ((Light)o).renderMode = (UnityEngine.LightRenderMode)v, Getter = (o) => ((Light)o).renderMode, Updater = (object o, ref object v) => { var x = (int)((Light)o).renderMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "cullingMask", PropertyType = typeof(System.Int32), Setter = (o, v) => ((Light)o).cullingMask = (System.Int32)v, Getter = (o) => ((Light)o).cullingMask, Updater = (object o, ref object v) => { var x = ((Light)o).cullingMask; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Light)o).enabled = (System.Boolean)v, Getter = (o) => ((Light)o).enabled, Updater = (object o, ref object v) => { var x = ((Light)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+
+
+            { "UnityEngine.LightProbeProxyVolume", new UnityProperty[] {
+                new UnityProperty { Name = "refreshMode", PropertyType = typeof(UnityEngine.LightProbeProxyVolume.RefreshMode), Setter = (o, v) => ((LightProbeProxyVolume)o).refreshMode = (UnityEngine.LightProbeProxyVolume.RefreshMode)v, Getter = (o) => ((LightProbeProxyVolume)o).refreshMode, Updater = (object o, ref object v) => { var x = (int)((LightProbeProxyVolume)o).refreshMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "qualityMode", PropertyType = typeof(UnityEngine.LightProbeProxyVolume.QualityMode), Setter = (o, v) => ((LightProbeProxyVolume)o).qualityMode = (UnityEngine.LightProbeProxyVolume.QualityMode)v, Getter = (o) => ((LightProbeProxyVolume)o).qualityMode, Updater = (object o, ref object v) => { var x = (int)((LightProbeProxyVolume)o).qualityMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+            #if UNITY_2020_2_OR_NEWER
+                new UnityProperty { Name = "dataFormat", PropertyType = typeof(UnityEngine.LightProbeProxyVolume.DataFormat), Setter = (o, v) => ((LightProbeProxyVolume)o).dataFormat = (UnityEngine.LightProbeProxyVolume.DataFormat)v, Getter = (o) => ((LightProbeProxyVolume)o).dataFormat, Updater = (object o, ref object v) => { var x = (int)((LightProbeProxyVolume)o).dataFormat; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+            #endif
+                new UnityProperty { Name = "boundingBoxMode", PropertyType = typeof(UnityEngine.LightProbeProxyVolume.BoundingBoxMode), Setter = (o, v) => ((LightProbeProxyVolume)o).boundingBoxMode = (UnityEngine.LightProbeProxyVolume.BoundingBoxMode)v, Getter = (o) => ((LightProbeProxyVolume)o).boundingBoxMode, Updater = (object o, ref object v) => { var x = (int)((LightProbeProxyVolume)o).boundingBoxMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "resolutionMode", PropertyType = typeof(UnityEngine.LightProbeProxyVolume.ResolutionMode), Setter = (o, v) => ((LightProbeProxyVolume)o).resolutionMode = (UnityEngine.LightProbeProxyVolume.ResolutionMode)v, Getter = (o) => ((LightProbeProxyVolume)o).resolutionMode, Updater = (object o, ref object v) => { var x = (int)((LightProbeProxyVolume)o).resolutionMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "probeDensity", PropertyType = typeof(System.Single), Setter = (o, v) => ((LightProbeProxyVolume)o).probeDensity = (System.Single)v, Getter = (o) => ((LightProbeProxyVolume)o).probeDensity, Updater = (object o, ref object v) => { var x = ((LightProbeProxyVolume)o).probeDensity; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "probePositionMode", PropertyType = typeof(UnityEngine.LightProbeProxyVolume.ProbePositionMode), Setter = (o, v) => ((LightProbeProxyVolume)o).probePositionMode = (UnityEngine.LightProbeProxyVolume.ProbePositionMode)v, Getter = (o) => ((LightProbeProxyVolume)o).probePositionMode, Updater = (object o, ref object v) => { var x = (int)((LightProbeProxyVolume)o).probePositionMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((LightProbeProxyVolume)o).enabled = (System.Boolean)v, Getter = (o) => ((LightProbeProxyVolume)o).enabled, Updater = (object o, ref object v) => { var x = ((LightProbeProxyVolume)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+
+
+            { "UnityEngine.LineRenderer", new UnityProperty[] {
+                new UnityProperty { Name = "loop", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((LineRenderer)o).loop = (System.Boolean)v, Getter = (o) => ((LineRenderer)o).loop, Updater = (object o, ref object v) => { var x = ((LineRenderer)o).loop; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "startColor", PropertyType = typeof(UnityEngine.Color), Setter = (o, v) => ((LineRenderer)o).startColor = (UnityEngine.Color)v, Getter = (o) => ((LineRenderer)o).startColor, Updater = (object o, ref object v) => { var x = ((LineRenderer)o).startColor; if (!x.Equals((UnityEngine.Color)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "endColor", PropertyType = typeof(UnityEngine.Color), Setter = (o, v) => ((LineRenderer)o).endColor = (UnityEngine.Color)v, Getter = (o) => ((LineRenderer)o).endColor, Updater = (object o, ref object v) => { var x = ((LineRenderer)o).endColor; if (!x.Equals((UnityEngine.Color)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "numCornerVertices", PropertyType = typeof(System.Int32), Setter = (o, v) => ((LineRenderer)o).numCornerVertices = (System.Int32)v, Getter = (o) => ((LineRenderer)o).numCornerVertices, Updater = (object o, ref object v) => { var x = ((LineRenderer)o).numCornerVertices; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "numCapVertices", PropertyType = typeof(System.Int32), Setter = (o, v) => ((LineRenderer)o).numCapVertices = (System.Int32)v, Getter = (o) => ((LineRenderer)o).numCapVertices, Updater = (object o, ref object v) => { var x = ((LineRenderer)o).numCapVertices; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "alignment", PropertyType = typeof(UnityEngine.LineAlignment), Setter = (o, v) => ((LineRenderer)o).alignment = (UnityEngine.LineAlignment)v, Getter = (o) => ((LineRenderer)o).alignment, Updater = (object o, ref object v) => { var x = (int)((LineRenderer)o).alignment; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "textureMode", PropertyType = typeof(UnityEngine.LineTextureMode), Setter = (o, v) => ((LineRenderer)o).textureMode = (UnityEngine.LineTextureMode)v, Getter = (o) => ((LineRenderer)o).textureMode, Updater = (object o, ref object v) => { var x = (int)((LineRenderer)o).textureMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "shadowBias", PropertyType = typeof(System.Single), Setter = (o, v) => ((LineRenderer)o).shadowBias = (System.Single)v, Getter = (o) => ((LineRenderer)o).shadowBias, Updater = (object o, ref object v) => { var x = ((LineRenderer)o).shadowBias; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "generateLightingData", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((LineRenderer)o).generateLightingData = (System.Boolean)v, Getter = (o) => ((LineRenderer)o).generateLightingData, Updater = (object o, ref object v) => { var x = ((LineRenderer)o).generateLightingData; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useWorldSpace", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((LineRenderer)o).useWorldSpace = (System.Boolean)v, Getter = (o) => ((LineRenderer)o).useWorldSpace, Updater = (object o, ref object v) => { var x = ((LineRenderer)o).useWorldSpace; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sharedMaterials", PropertyType = typeof(UnityEngine.Material[]), Setter = (o, v) => ((LineRenderer)o).sharedMaterials = (UnityEngine.Material[])v, Getter = (o) => ((LineRenderer)o).sharedMaterials, Updater = (object o, ref object v) => { var x = ((LineRenderer)o).sharedMaterials; if (x.Length != ((UnityEngine.Material[])v).Length) { v = x; return true; } else { v = x; return false; }} },
+                new UnityProperty { Name = "shadowCastingMode", PropertyType = typeof(UnityEngine.Rendering.ShadowCastingMode), Setter = (o, v) => ((LineRenderer)o).shadowCastingMode = (UnityEngine.Rendering.ShadowCastingMode)v, Getter = (o) => ((LineRenderer)o).shadowCastingMode, Updater = (object o, ref object v) => { var x = (int)((LineRenderer)o).shadowCastingMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "receiveShadows", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((LineRenderer)o).receiveShadows = (System.Boolean)v, Getter = (o) => ((LineRenderer)o).receiveShadows, Updater = (object o, ref object v) => { var x = ((LineRenderer)o).receiveShadows; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "lightProbeUsage", PropertyType = typeof(UnityEngine.Rendering.LightProbeUsage), Setter = (o, v) => ((LineRenderer)o).lightProbeUsage = (UnityEngine.Rendering.LightProbeUsage)v, Getter = (o) => ((LineRenderer)o).lightProbeUsage, Updater = (object o, ref object v) => { var x = (int)((LineRenderer)o).lightProbeUsage; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "reflectionProbeUsage", PropertyType = typeof(UnityEngine.Rendering.ReflectionProbeUsage), Setter = (o, v) => ((LineRenderer)o).reflectionProbeUsage = (UnityEngine.Rendering.ReflectionProbeUsage)v, Getter = (o) => ((LineRenderer)o).reflectionProbeUsage, Updater = (object o, ref object v) => { var x = (int)((LineRenderer)o).reflectionProbeUsage; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "motionVectorGenerationMode", PropertyType = typeof(UnityEngine.MotionVectorGenerationMode), Setter = (o, v) => ((LineRenderer)o).motionVectorGenerationMode = (UnityEngine.MotionVectorGenerationMode)v, Getter = (o) => ((LineRenderer)o).motionVectorGenerationMode, Updater = (object o, ref object v) => { var x = (int)((LineRenderer)o).motionVectorGenerationMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "allowOcclusionWhenDynamic", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((LineRenderer)o).allowOcclusionWhenDynamic = (System.Boolean)v, Getter = (o) => ((LineRenderer)o).allowOcclusionWhenDynamic, Updater = (object o, ref object v) => { var x = ((LineRenderer)o).allowOcclusionWhenDynamic; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sortingLayerID", PropertyType = typeof(System.Int32), Setter = (o, v) => ((LineRenderer)o).sortingLayerID = (System.Int32)v, Getter = (o) => ((LineRenderer)o).sortingLayerID, Updater = (object o, ref object v) => { var x = ((LineRenderer)o).sortingLayerID; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sortingOrder", PropertyType = typeof(System.Int32), Setter = (o, v) => ((LineRenderer)o).sortingOrder = (System.Int32)v, Getter = (o) => ((LineRenderer)o).sortingOrder, Updater = (object o, ref object v) => { var x = ((LineRenderer)o).sortingOrder; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((LineRenderer)o).enabled = (System.Boolean)v, Getter = (o) => ((LineRenderer)o).enabled, Updater = (object o, ref object v) => { var x = ((LineRenderer)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+
+
+        #if UNITY_ANIMATION
+            { "UnityEngine.Animations.LookAtConstraint", new UnityProperty[] {
+                new UnityProperty { Name = "constraintActive", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Animations.LookAtConstraint)o).constraintActive = (System.Boolean)v, Getter = (o) => ((UnityEngine.Animations.LookAtConstraint)o).constraintActive, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.LookAtConstraint)o).constraintActive; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "weight", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.Animations.LookAtConstraint)o).weight = (System.Single)v, Getter = (o) => ((UnityEngine.Animations.LookAtConstraint)o).weight, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.LookAtConstraint)o).weight; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useUpObject", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Animations.LookAtConstraint)o).useUpObject = (System.Boolean)v, Getter = (o) => ((UnityEngine.Animations.LookAtConstraint)o).useUpObject, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.LookAtConstraint)o).useUpObject; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "roll", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.Animations.LookAtConstraint)o).roll = (System.Single)v, Getter = (o) => ((UnityEngine.Animations.LookAtConstraint)o).roll, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.LookAtConstraint)o).roll; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "worldUpObject", PropertyType = typeof(UnityEngine.Transform), Setter = (o, v) => ((UnityEngine.Animations.LookAtConstraint)o).worldUpObject = (UnityEngine.Transform)v, Getter = (o) => ((UnityEngine.Animations.LookAtConstraint)o).worldUpObject, },
+                new UnityProperty { Name = "locked", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Animations.LookAtConstraint)o).locked = (System.Boolean)v, Getter = (o) => ((UnityEngine.Animations.LookAtConstraint)o).locked, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.LookAtConstraint)o).locked; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "rotationAtRest", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((UnityEngine.Animations.LookAtConstraint)o).rotationAtRest = (UnityEngine.Vector3)v, Getter = (o) => ((UnityEngine.Animations.LookAtConstraint)o).rotationAtRest, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.LookAtConstraint)o).rotationAtRest; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "rotationOffset", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((UnityEngine.Animations.LookAtConstraint)o).rotationOffset = (UnityEngine.Vector3)v, Getter = (o) => ((UnityEngine.Animations.LookAtConstraint)o).rotationOffset, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.LookAtConstraint)o).rotationOffset; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Animations.LookAtConstraint)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.Animations.LookAtConstraint)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.LookAtConstraint)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.Mask", new UnityProperty[] {
+                new UnityProperty { Name = "showMaskGraphic", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Mask)o).showMaskGraphic = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Mask)o).showMaskGraphic, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Mask)o).showMaskGraphic; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Mask)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Mask)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Mask)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS
+            { "UnityEngine.MeshCollider", new UnityProperty[] {
+                new UnityProperty { Name = "convex", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((MeshCollider)o).convex = (System.Boolean)v, Getter = (o) => ((MeshCollider)o).convex, Updater = (object o, ref object v) => { var x = ((MeshCollider)o).convex; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "isTrigger", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((MeshCollider)o).isTrigger = (System.Boolean)v, Getter = (o) => ((MeshCollider)o).isTrigger, Updater = (object o, ref object v) => { var x = ((MeshCollider)o).isTrigger; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "cookingOptions", PropertyType = typeof(UnityEngine.MeshColliderCookingOptions), Setter = (o, v) => ((MeshCollider)o).cookingOptions = (UnityEngine.MeshColliderCookingOptions)v, Getter = (o) => ((MeshCollider)o).cookingOptions, Updater = (object o, ref object v) => { var x = (int)((MeshCollider)o).cookingOptions; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sharedMaterial", PropertyType = typeof(UnityEngine.PhysicMaterial), Setter = (o, v) => ((MeshCollider)o).sharedMaterial = (UnityEngine.PhysicMaterial)v, Getter = (o) => ((MeshCollider)o).sharedMaterial, },
+                new UnityProperty { Name = "sharedMesh", PropertyType = typeof(UnityEngine.Mesh), Setter = (o, v) => ((MeshCollider)o).sharedMesh = (UnityEngine.Mesh)v, Getter = (o) => ((MeshCollider)o).sharedMesh, },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((MeshCollider)o).enabled = (System.Boolean)v, Getter = (o) => ((MeshCollider)o).enabled, Updater = (object o, ref object v) => { var x = ((MeshCollider)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+            { "UnityEngine.MeshFilter", new UnityProperty[] {
+                new UnityProperty { Name = "sharedMesh", PropertyType = typeof(UnityEngine.Mesh), Setter = (o, v) => ((MeshFilter)o).sharedMesh = (UnityEngine.Mesh)v, Getter = (o) => ((MeshFilter)o).sharedMesh, },
+            }},
+
+
+            { "UnityEngine.MeshRenderer", new UnityProperty[] {
+                new UnityProperty { Name = "sharedMaterials", PropertyType = typeof(UnityEngine.Material[]), Setter = (o, v) => ((MeshRenderer)o).sharedMaterials = (UnityEngine.Material[])v, Getter = (o) => ((MeshRenderer)o).sharedMaterials, Updater = (object o, ref object v) => { var x = ((MeshRenderer)o).sharedMaterials; if (x.Length != ((UnityEngine.Material[])v).Length) { v = x; return true; } else { v = x; return false; }} },
+                new UnityProperty { Name = "shadowCastingMode", PropertyType = typeof(UnityEngine.Rendering.ShadowCastingMode), Setter = (o, v) => ((MeshRenderer)o).shadowCastingMode = (UnityEngine.Rendering.ShadowCastingMode)v, Getter = (o) => ((MeshRenderer)o).shadowCastingMode, Updater = (object o, ref object v) => { var x = (int)((MeshRenderer)o).shadowCastingMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "receiveShadows", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((MeshRenderer)o).receiveShadows = (System.Boolean)v, Getter = (o) => ((MeshRenderer)o).receiveShadows, Updater = (object o, ref object v) => { var x = ((MeshRenderer)o).receiveShadows; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "lightProbeUsage", PropertyType = typeof(UnityEngine.Rendering.LightProbeUsage), Setter = (o, v) => ((MeshRenderer)o).lightProbeUsage = (UnityEngine.Rendering.LightProbeUsage)v, Getter = (o) => ((MeshRenderer)o).lightProbeUsage, Updater = (object o, ref object v) => { var x = (int)((MeshRenderer)o).lightProbeUsage; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "reflectionProbeUsage", PropertyType = typeof(UnityEngine.Rendering.ReflectionProbeUsage), Setter = (o, v) => ((MeshRenderer)o).reflectionProbeUsage = (UnityEngine.Rendering.ReflectionProbeUsage)v, Getter = (o) => ((MeshRenderer)o).reflectionProbeUsage, Updater = (object o, ref object v) => { var x = (int)((MeshRenderer)o).reflectionProbeUsage; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "probeAnchor", PropertyType = typeof(UnityEngine.Transform), Setter = (o, v) => ((MeshRenderer)o).probeAnchor = (UnityEngine.Transform)v, Getter = (o) => ((MeshRenderer)o).probeAnchor, },
+                new UnityProperty { Name = "motionVectorGenerationMode", PropertyType = typeof(UnityEngine.MotionVectorGenerationMode), Setter = (o, v) => ((MeshRenderer)o).motionVectorGenerationMode = (UnityEngine.MotionVectorGenerationMode)v, Getter = (o) => ((MeshRenderer)o).motionVectorGenerationMode, Updater = (object o, ref object v) => { var x = (int)((MeshRenderer)o).motionVectorGenerationMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "allowOcclusionWhenDynamic", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((MeshRenderer)o).allowOcclusionWhenDynamic = (System.Boolean)v, Getter = (o) => ((MeshRenderer)o).allowOcclusionWhenDynamic, Updater = (object o, ref object v) => { var x = ((MeshRenderer)o).allowOcclusionWhenDynamic; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((MeshRenderer)o).enabled = (System.Boolean)v, Getter = (o) => ((MeshRenderer)o).enabled, Updater = (object o, ref object v) => { var x = ((MeshRenderer)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+
+
+        #if UNITY_AI
+            { "UnityEngine.AI.NavMeshAgent", new UnityProperty[] {
+                new UnityProperty { Name = "agentTypeID", PropertyType = typeof(System.Int32), Setter = (o, v) => ((UnityEngine.AI.NavMeshAgent)o).agentTypeID = (System.Int32)v, Getter = (o) => ((UnityEngine.AI.NavMeshAgent)o).agentTypeID, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.NavMeshAgent)o).agentTypeID; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "baseOffset", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.AI.NavMeshAgent)o).baseOffset = (System.Single)v, Getter = (o) => ((UnityEngine.AI.NavMeshAgent)o).baseOffset, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.NavMeshAgent)o).baseOffset; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "speed", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.AI.NavMeshAgent)o).speed = (System.Single)v, Getter = (o) => ((UnityEngine.AI.NavMeshAgent)o).speed, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.NavMeshAgent)o).speed; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "angularSpeed", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.AI.NavMeshAgent)o).angularSpeed = (System.Single)v, Getter = (o) => ((UnityEngine.AI.NavMeshAgent)o).angularSpeed, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.NavMeshAgent)o).angularSpeed; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "acceleration", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.AI.NavMeshAgent)o).acceleration = (System.Single)v, Getter = (o) => ((UnityEngine.AI.NavMeshAgent)o).acceleration, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.NavMeshAgent)o).acceleration; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "stoppingDistance", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.AI.NavMeshAgent)o).stoppingDistance = (System.Single)v, Getter = (o) => ((UnityEngine.AI.NavMeshAgent)o).stoppingDistance, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.NavMeshAgent)o).stoppingDistance; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "autoBraking", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.AI.NavMeshAgent)o).autoBraking = (System.Boolean)v, Getter = (o) => ((UnityEngine.AI.NavMeshAgent)o).autoBraking, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.NavMeshAgent)o).autoBraking; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "radius", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.AI.NavMeshAgent)o).radius = (System.Single)v, Getter = (o) => ((UnityEngine.AI.NavMeshAgent)o).radius, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.NavMeshAgent)o).radius; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "height", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.AI.NavMeshAgent)o).height = (System.Single)v, Getter = (o) => ((UnityEngine.AI.NavMeshAgent)o).height, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.NavMeshAgent)o).height; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "obstacleAvoidanceType", PropertyType = typeof(UnityEngine.AI.ObstacleAvoidanceType), Setter = (o, v) => ((UnityEngine.AI.NavMeshAgent)o).obstacleAvoidanceType = (UnityEngine.AI.ObstacleAvoidanceType)v, Getter = (o) => ((UnityEngine.AI.NavMeshAgent)o).obstacleAvoidanceType, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.AI.NavMeshAgent)o).obstacleAvoidanceType; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "avoidancePriority", PropertyType = typeof(System.Int32), Setter = (o, v) => ((UnityEngine.AI.NavMeshAgent)o).avoidancePriority = (System.Int32)v, Getter = (o) => ((UnityEngine.AI.NavMeshAgent)o).avoidancePriority, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.NavMeshAgent)o).avoidancePriority; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "autoTraverseOffMeshLink", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.AI.NavMeshAgent)o).autoTraverseOffMeshLink = (System.Boolean)v, Getter = (o) => ((UnityEngine.AI.NavMeshAgent)o).autoTraverseOffMeshLink, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.NavMeshAgent)o).autoTraverseOffMeshLink; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "autoRepath", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.AI.NavMeshAgent)o).autoRepath = (System.Boolean)v, Getter = (o) => ((UnityEngine.AI.NavMeshAgent)o).autoRepath, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.NavMeshAgent)o).autoRepath; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "areaMask", PropertyType = typeof(System.Int32), Setter = (o, v) => ((UnityEngine.AI.NavMeshAgent)o).areaMask = (System.Int32)v, Getter = (o) => ((UnityEngine.AI.NavMeshAgent)o).areaMask, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.NavMeshAgent)o).areaMask; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.AI.NavMeshAgent)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.AI.NavMeshAgent)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.NavMeshAgent)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_AI
+            { "UnityEngine.AI.NavMeshObstacle", new UnityProperty[] {
+                new UnityProperty { Name = "shape", PropertyType = typeof(UnityEngine.AI.NavMeshObstacleShape), Setter = (o, v) => ((UnityEngine.AI.NavMeshObstacle)o).shape = (UnityEngine.AI.NavMeshObstacleShape)v, Getter = (o) => ((UnityEngine.AI.NavMeshObstacle)o).shape, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.AI.NavMeshObstacle)o).shape; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "center", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((UnityEngine.AI.NavMeshObstacle)o).center = (UnityEngine.Vector3)v, Getter = (o) => ((UnityEngine.AI.NavMeshObstacle)o).center, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.NavMeshObstacle)o).center; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "size", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((UnityEngine.AI.NavMeshObstacle)o).size = (UnityEngine.Vector3)v, Getter = (o) => ((UnityEngine.AI.NavMeshObstacle)o).size, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.NavMeshObstacle)o).size; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "carving", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.AI.NavMeshObstacle)o).carving = (System.Boolean)v, Getter = (o) => ((UnityEngine.AI.NavMeshObstacle)o).carving, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.NavMeshObstacle)o).carving; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.AI.NavMeshObstacle)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.AI.NavMeshObstacle)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.NavMeshObstacle)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+            { "UnityEngine.OcclusionArea", new UnityProperty[] {
+                new UnityProperty { Name = "size", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((OcclusionArea)o).size = (UnityEngine.Vector3)v, Getter = (o) => ((OcclusionArea)o).size, Updater = (object o, ref object v) => { var x = ((OcclusionArea)o).size; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "center", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((OcclusionArea)o).center = (UnityEngine.Vector3)v, Getter = (o) => ((OcclusionArea)o).center, Updater = (object o, ref object v) => { var x = ((OcclusionArea)o).center; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+            }},
+
+
+            { "UnityEngine.OcclusionPortal", new UnityProperty[] {
+                new UnityProperty { Name = "open", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((OcclusionPortal)o).open = (System.Boolean)v, Getter = (o) => ((OcclusionPortal)o).open, Updater = (object o, ref object v) => { var x = ((OcclusionPortal)o).open; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+
+
+        #if UNITY_AI && !UNITY_2023_2_OR_NEWER
+            { "UnityEngine.AI.OffMeshLink", new UnityProperty[] {
+                new UnityProperty { Name = "startTransform", PropertyType = typeof(UnityEngine.Transform), Setter = (o, v) => ((UnityEngine.AI.OffMeshLink)o).startTransform = (UnityEngine.Transform)v, Getter = (o) => ((UnityEngine.AI.OffMeshLink)o).startTransform, },
+                new UnityProperty { Name = "endTransform", PropertyType = typeof(UnityEngine.Transform), Setter = (o, v) => ((UnityEngine.AI.OffMeshLink)o).endTransform = (UnityEngine.Transform)v, Getter = (o) => ((UnityEngine.AI.OffMeshLink)o).endTransform, },
+                new UnityProperty { Name = "costOverride", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.AI.OffMeshLink)o).costOverride = (System.Single)v, Getter = (o) => ((UnityEngine.AI.OffMeshLink)o).costOverride, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.OffMeshLink)o).costOverride; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "biDirectional", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.AI.OffMeshLink)o).biDirectional = (System.Boolean)v, Getter = (o) => ((UnityEngine.AI.OffMeshLink)o).biDirectional, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.OffMeshLink)o).biDirectional; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "activated", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.AI.OffMeshLink)o).activated = (System.Boolean)v, Getter = (o) => ((UnityEngine.AI.OffMeshLink)o).activated, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.OffMeshLink)o).activated; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "autoUpdatePositions", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.AI.OffMeshLink)o).autoUpdatePositions = (System.Boolean)v, Getter = (o) => ((UnityEngine.AI.OffMeshLink)o).autoUpdatePositions, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.OffMeshLink)o).autoUpdatePositions; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "area", PropertyType = typeof(System.Int32), Setter = (o, v) => ((UnityEngine.AI.OffMeshLink)o).area = (System.Int32)v, Getter = (o) => ((UnityEngine.AI.OffMeshLink)o).area, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.OffMeshLink)o).area; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.AI.OffMeshLink)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.AI.OffMeshLink)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.AI.OffMeshLink)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.Outline", new UnityProperty[] {
+                new UnityProperty { Name = "effectColor", PropertyType = typeof(UnityEngine.Color), Setter = (o, v) => ((UnityEngine.UI.Outline)o).effectColor = (UnityEngine.Color)v, Getter = (o) => ((UnityEngine.UI.Outline)o).effectColor, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Outline)o).effectColor; if (!x.Equals((UnityEngine.Color)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "effectDistance", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((UnityEngine.UI.Outline)o).effectDistance = (UnityEngine.Vector2)v, Getter = (o) => ((UnityEngine.UI.Outline)o).effectDistance, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Outline)o).effectDistance; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useGraphicAlpha", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Outline)o).useGraphicAlpha = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Outline)o).useGraphicAlpha, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Outline)o).useGraphicAlpha; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Outline)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Outline)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Outline)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_ANIMATION
+            { "UnityEngine.Animations.ParentConstraint", new UnityProperty[] {
+                new UnityProperty { Name = "constraintActive", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Animations.ParentConstraint)o).constraintActive = (System.Boolean)v, Getter = (o) => ((UnityEngine.Animations.ParentConstraint)o).constraintActive, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.ParentConstraint)o).constraintActive; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "weight", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.Animations.ParentConstraint)o).weight = (System.Single)v, Getter = (o) => ((UnityEngine.Animations.ParentConstraint)o).weight, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.ParentConstraint)o).weight; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "locked", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Animations.ParentConstraint)o).locked = (System.Boolean)v, Getter = (o) => ((UnityEngine.Animations.ParentConstraint)o).locked, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.ParentConstraint)o).locked; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "translationAtRest", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((UnityEngine.Animations.ParentConstraint)o).translationAtRest = (UnityEngine.Vector3)v, Getter = (o) => ((UnityEngine.Animations.ParentConstraint)o).translationAtRest, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.ParentConstraint)o).translationAtRest; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "rotationAtRest", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((UnityEngine.Animations.ParentConstraint)o).rotationAtRest = (UnityEngine.Vector3)v, Getter = (o) => ((UnityEngine.Animations.ParentConstraint)o).rotationAtRest, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.ParentConstraint)o).rotationAtRest; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "translationOffsets", PropertyType = typeof(UnityEngine.Vector3[]), Setter = (o, v) => ((UnityEngine.Animations.ParentConstraint)o).translationOffsets = (UnityEngine.Vector3[])v, Getter = (o) => ((UnityEngine.Animations.ParentConstraint)o).translationOffsets, },
+                new UnityProperty { Name = "rotationOffsets", PropertyType = typeof(UnityEngine.Vector3[]), Setter = (o, v) => ((UnityEngine.Animations.ParentConstraint)o).rotationOffsets = (UnityEngine.Vector3[])v, Getter = (o) => ((UnityEngine.Animations.ParentConstraint)o).rotationOffsets, },
+                new UnityProperty { Name = "translationAxis", PropertyType = typeof(UnityEngine.Animations.Axis), Setter = (o, v) => ((UnityEngine.Animations.ParentConstraint)o).translationAxis = (UnityEngine.Animations.Axis)v, Getter = (o) => ((UnityEngine.Animations.ParentConstraint)o).translationAxis, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.Animations.ParentConstraint)o).translationAxis; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "rotationAxis", PropertyType = typeof(UnityEngine.Animations.Axis), Setter = (o, v) => ((UnityEngine.Animations.ParentConstraint)o).rotationAxis = (UnityEngine.Animations.Axis)v, Getter = (o) => ((UnityEngine.Animations.ParentConstraint)o).rotationAxis, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.Animations.ParentConstraint)o).rotationAxis; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Animations.ParentConstraint)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.Animations.ParentConstraint)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.ParentConstraint)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PARTICLE_SYSTEM
+            { "UnityEngine.ParticleSystemForceField", new UnityProperty[] {
+                new UnityProperty { Name = "shape", PropertyType = typeof(UnityEngine.ParticleSystemForceFieldShape), Setter = (o, v) => ((ParticleSystemForceField)o).shape = (UnityEngine.ParticleSystemForceFieldShape)v, Getter = (o) => ((ParticleSystemForceField)o).shape, Updater = (object o, ref object v) => { var x = (int)((ParticleSystemForceField)o).shape; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "startRange", PropertyType = typeof(System.Single), Setter = (o, v) => ((ParticleSystemForceField)o).startRange = (System.Single)v, Getter = (o) => ((ParticleSystemForceField)o).startRange, Updater = (object o, ref object v) => { var x = ((ParticleSystemForceField)o).startRange; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "endRange", PropertyType = typeof(System.Single), Setter = (o, v) => ((ParticleSystemForceField)o).endRange = (System.Single)v, Getter = (o) => ((ParticleSystemForceField)o).endRange, Updater = (object o, ref object v) => { var x = ((ParticleSystemForceField)o).endRange; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "directionX", PropertyType = typeof(UnityEngine.ParticleSystem.MinMaxCurve), Setter = (o, v) => ((ParticleSystemForceField)o).directionX = (UnityEngine.ParticleSystem.MinMaxCurve)v, Getter = (o) => ((ParticleSystemForceField)o).directionX, Updater = (object o, ref object v) => { var x = ((ParticleSystemForceField)o).directionX; if (!x.Equals((UnityEngine.ParticleSystem.MinMaxCurve)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "directionY", PropertyType = typeof(UnityEngine.ParticleSystem.MinMaxCurve), Setter = (o, v) => ((ParticleSystemForceField)o).directionY = (UnityEngine.ParticleSystem.MinMaxCurve)v, Getter = (o) => ((ParticleSystemForceField)o).directionY, Updater = (object o, ref object v) => { var x = ((ParticleSystemForceField)o).directionY; if (!x.Equals((UnityEngine.ParticleSystem.MinMaxCurve)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "directionZ", PropertyType = typeof(UnityEngine.ParticleSystem.MinMaxCurve), Setter = (o, v) => ((ParticleSystemForceField)o).directionZ = (UnityEngine.ParticleSystem.MinMaxCurve)v, Getter = (o) => ((ParticleSystemForceField)o).directionZ, Updater = (object o, ref object v) => { var x = ((ParticleSystemForceField)o).directionZ; if (!x.Equals((UnityEngine.ParticleSystem.MinMaxCurve)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "gravity", PropertyType = typeof(UnityEngine.ParticleSystem.MinMaxCurve), Setter = (o, v) => ((ParticleSystemForceField)o).gravity = (UnityEngine.ParticleSystem.MinMaxCurve)v, Getter = (o) => ((ParticleSystemForceField)o).gravity, Updater = (object o, ref object v) => { var x = ((ParticleSystemForceField)o).gravity; if (!x.Equals((UnityEngine.ParticleSystem.MinMaxCurve)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "gravityFocus", PropertyType = typeof(System.Single), Setter = (o, v) => ((ParticleSystemForceField)o).gravityFocus = (System.Single)v, Getter = (o) => ((ParticleSystemForceField)o).gravityFocus, Updater = (object o, ref object v) => { var x = ((ParticleSystemForceField)o).gravityFocus; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "rotationSpeed", PropertyType = typeof(UnityEngine.ParticleSystem.MinMaxCurve), Setter = (o, v) => ((ParticleSystemForceField)o).rotationSpeed = (UnityEngine.ParticleSystem.MinMaxCurve)v, Getter = (o) => ((ParticleSystemForceField)o).rotationSpeed, Updater = (object o, ref object v) => { var x = ((ParticleSystemForceField)o).rotationSpeed; if (!x.Equals((UnityEngine.ParticleSystem.MinMaxCurve)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "rotationAttraction", PropertyType = typeof(UnityEngine.ParticleSystem.MinMaxCurve), Setter = (o, v) => ((ParticleSystemForceField)o).rotationAttraction = (UnityEngine.ParticleSystem.MinMaxCurve)v, Getter = (o) => ((ParticleSystemForceField)o).rotationAttraction, Updater = (object o, ref object v) => { var x = ((ParticleSystemForceField)o).rotationAttraction; if (!x.Equals((UnityEngine.ParticleSystem.MinMaxCurve)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "rotationRandomness", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((ParticleSystemForceField)o).rotationRandomness = (UnityEngine.Vector2)v, Getter = (o) => ((ParticleSystemForceField)o).rotationRandomness, Updater = (object o, ref object v) => { var x = ((ParticleSystemForceField)o).rotationRandomness; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "drag", PropertyType = typeof(UnityEngine.ParticleSystem.MinMaxCurve), Setter = (o, v) => ((ParticleSystemForceField)o).drag = (UnityEngine.ParticleSystem.MinMaxCurve)v, Getter = (o) => ((ParticleSystemForceField)o).drag, Updater = (object o, ref object v) => { var x = ((ParticleSystemForceField)o).drag; if (!x.Equals((UnityEngine.ParticleSystem.MinMaxCurve)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "multiplyDragByParticleSize", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((ParticleSystemForceField)o).multiplyDragByParticleSize = (System.Boolean)v, Getter = (o) => ((ParticleSystemForceField)o).multiplyDragByParticleSize, Updater = (object o, ref object v) => { var x = ((ParticleSystemForceField)o).multiplyDragByParticleSize; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "multiplyDragByParticleVelocity", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((ParticleSystemForceField)o).multiplyDragByParticleVelocity = (System.Boolean)v, Getter = (o) => ((ParticleSystemForceField)o).multiplyDragByParticleVelocity, Updater = (object o, ref object v) => { var x = ((ParticleSystemForceField)o).multiplyDragByParticleVelocity; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "vectorField", PropertyType = typeof(UnityEngine.Texture3D), Setter = (o, v) => ((ParticleSystemForceField)o).vectorField = (UnityEngine.Texture3D)v, Getter = (o) => ((ParticleSystemForceField)o).vectorField, },
+                new UnityProperty { Name = "vectorFieldSpeed", PropertyType = typeof(UnityEngine.ParticleSystem.MinMaxCurve), Setter = (o, v) => ((ParticleSystemForceField)o).vectorFieldSpeed = (UnityEngine.ParticleSystem.MinMaxCurve)v, Getter = (o) => ((ParticleSystemForceField)o).vectorFieldSpeed, Updater = (object o, ref object v) => { var x = ((ParticleSystemForceField)o).vectorFieldSpeed; if (!x.Equals((UnityEngine.ParticleSystem.MinMaxCurve)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "vectorFieldAttraction", PropertyType = typeof(UnityEngine.ParticleSystem.MinMaxCurve), Setter = (o, v) => ((ParticleSystemForceField)o).vectorFieldAttraction = (UnityEngine.ParticleSystem.MinMaxCurve)v, Getter = (o) => ((ParticleSystemForceField)o).vectorFieldAttraction, Updater = (object o, ref object v) => { var x = ((ParticleSystemForceField)o).vectorFieldAttraction; if (!x.Equals((UnityEngine.ParticleSystem.MinMaxCurve)v)) { v = x; return true; } return false; } },
+            #if UNITY_2021_3_OR_NEWER
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((ParticleSystemForceField)o).enabled = (System.Boolean)v, Getter = (o) => ((ParticleSystemForceField)o).enabled, Updater = (object o, ref object v) => { var x = ((ParticleSystemForceField)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #endif
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.EventSystems.Physics2DRaycaster", new UnityProperty[] {
+                new UnityProperty { Name = "eventMask", PropertyType = typeof(UnityEngine.LayerMask), Setter = (o, v) => ((UnityEngine.EventSystems.Physics2DRaycaster)o).eventMask = (UnityEngine.LayerMask)v, Getter = (o) => ((UnityEngine.EventSystems.Physics2DRaycaster)o).eventMask, Updater = (object o, ref object v) => { var x = ((UnityEngine.EventSystems.Physics2DRaycaster)o).eventMask; if (!x.Equals((UnityEngine.LayerMask)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "maxRayIntersections", PropertyType = typeof(System.Int32), Setter = (o, v) => ((UnityEngine.EventSystems.Physics2DRaycaster)o).maxRayIntersections = (System.Int32)v, Getter = (o) => ((UnityEngine.EventSystems.Physics2DRaycaster)o).maxRayIntersections, Updater = (object o, ref object v) => { var x = ((UnityEngine.EventSystems.Physics2DRaycaster)o).maxRayIntersections; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.EventSystems.Physics2DRaycaster)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.EventSystems.Physics2DRaycaster)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.EventSystems.Physics2DRaycaster)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.EventSystems.PhysicsRaycaster", new UnityProperty[] {
+                new UnityProperty { Name = "eventMask", PropertyType = typeof(UnityEngine.LayerMask), Setter = (o, v) => ((UnityEngine.EventSystems.PhysicsRaycaster)o).eventMask = (UnityEngine.LayerMask)v, Getter = (o) => ((UnityEngine.EventSystems.PhysicsRaycaster)o).eventMask, Updater = (object o, ref object v) => { var x = ((UnityEngine.EventSystems.PhysicsRaycaster)o).eventMask; if (!x.Equals((UnityEngine.LayerMask)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "maxRayIntersections", PropertyType = typeof(System.Int32), Setter = (o, v) => ((UnityEngine.EventSystems.PhysicsRaycaster)o).maxRayIntersections = (System.Int32)v, Getter = (o) => ((UnityEngine.EventSystems.PhysicsRaycaster)o).maxRayIntersections, Updater = (object o, ref object v) => { var x = ((UnityEngine.EventSystems.PhysicsRaycaster)o).maxRayIntersections; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.EventSystems.PhysicsRaycaster)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.EventSystems.PhysicsRaycaster)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.EventSystems.PhysicsRaycaster)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.PlatformEffector2D", new UnityProperty[] {
+                new UnityProperty { Name = "useColliderMask", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((PlatformEffector2D)o).useColliderMask = (System.Boolean)v, Getter = (o) => ((PlatformEffector2D)o).useColliderMask, Updater = (object o, ref object v) => { var x = ((PlatformEffector2D)o).useColliderMask; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "colliderMask", PropertyType = typeof(System.Int32), Setter = (o, v) => ((PlatformEffector2D)o).colliderMask = (System.Int32)v, Getter = (o) => ((PlatformEffector2D)o).colliderMask, Updater = (object o, ref object v) => { var x = ((PlatformEffector2D)o).colliderMask; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "rotationalOffset", PropertyType = typeof(System.Single), Setter = (o, v) => ((PlatformEffector2D)o).rotationalOffset = (System.Single)v, Getter = (o) => ((PlatformEffector2D)o).rotationalOffset, Updater = (object o, ref object v) => { var x = ((PlatformEffector2D)o).rotationalOffset; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useOneWay", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((PlatformEffector2D)o).useOneWay = (System.Boolean)v, Getter = (o) => ((PlatformEffector2D)o).useOneWay, Updater = (object o, ref object v) => { var x = ((PlatformEffector2D)o).useOneWay; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useOneWayGrouping", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((PlatformEffector2D)o).useOneWayGrouping = (System.Boolean)v, Getter = (o) => ((PlatformEffector2D)o).useOneWayGrouping, Updater = (object o, ref object v) => { var x = ((PlatformEffector2D)o).useOneWayGrouping; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "surfaceArc", PropertyType = typeof(System.Single), Setter = (o, v) => ((PlatformEffector2D)o).surfaceArc = (System.Single)v, Getter = (o) => ((PlatformEffector2D)o).surfaceArc, Updater = (object o, ref object v) => { var x = ((PlatformEffector2D)o).surfaceArc; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useSideFriction", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((PlatformEffector2D)o).useSideFriction = (System.Boolean)v, Getter = (o) => ((PlatformEffector2D)o).useSideFriction, Updater = (object o, ref object v) => { var x = ((PlatformEffector2D)o).useSideFriction; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useSideBounce", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((PlatformEffector2D)o).useSideBounce = (System.Boolean)v, Getter = (o) => ((PlatformEffector2D)o).useSideBounce, Updater = (object o, ref object v) => { var x = ((PlatformEffector2D)o).useSideBounce; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sideArc", PropertyType = typeof(System.Single), Setter = (o, v) => ((PlatformEffector2D)o).sideArc = (System.Single)v, Getter = (o) => ((PlatformEffector2D)o).sideArc, Updater = (object o, ref object v) => { var x = ((PlatformEffector2D)o).sideArc; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((PlatformEffector2D)o).enabled = (System.Boolean)v, Getter = (o) => ((PlatformEffector2D)o).enabled, Updater = (object o, ref object v) => { var x = ((PlatformEffector2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_DIRECTOR
+            { "UnityEngine.Playables.PlayableDirector", new UnityProperty[] {
+                new UnityProperty { Name = "playableAsset", PropertyType = typeof(UnityEngine.Playables.PlayableAsset), Setter = (o, v) => ((UnityEngine.Playables.PlayableDirector)o).playableAsset = (UnityEngine.Playables.PlayableAsset)v, Getter = (o) => ((UnityEngine.Playables.PlayableDirector)o).playableAsset, },
+                new UnityProperty { Name = "timeUpdateMode", PropertyType = typeof(UnityEngine.Playables.DirectorUpdateMode), Setter = (o, v) => ((UnityEngine.Playables.PlayableDirector)o).timeUpdateMode = (UnityEngine.Playables.DirectorUpdateMode)v, Getter = (o) => ((UnityEngine.Playables.PlayableDirector)o).timeUpdateMode, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.Playables.PlayableDirector)o).timeUpdateMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "playOnAwake", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Playables.PlayableDirector)o).playOnAwake = (System.Boolean)v, Getter = (o) => ((UnityEngine.Playables.PlayableDirector)o).playOnAwake, Updater = (object o, ref object v) => { var x = ((UnityEngine.Playables.PlayableDirector)o).playOnAwake; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "extrapolationMode", PropertyType = typeof(UnityEngine.Playables.DirectorWrapMode), Setter = (o, v) => ((UnityEngine.Playables.PlayableDirector)o).extrapolationMode = (UnityEngine.Playables.DirectorWrapMode)v, Getter = (o) => ((UnityEngine.Playables.PlayableDirector)o).extrapolationMode, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.Playables.PlayableDirector)o).extrapolationMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "initialTime", PropertyType = typeof(System.Double), Setter = (o, v) => ((UnityEngine.Playables.PlayableDirector)o).initialTime = (System.Double)v, Getter = (o) => ((UnityEngine.Playables.PlayableDirector)o).initialTime, Updater = (object o, ref object v) => { var x = ((UnityEngine.Playables.PlayableDirector)o).initialTime; if (!x.Equals((System.Double)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "time", PropertyType = typeof(System.Double), Setter = (o, v) => ((UnityEngine.Playables.PlayableDirector)o).time = (System.Double)v, Getter = (o) => ((UnityEngine.Playables.PlayableDirector)o).time, Updater = (object o, ref object v) => { var x = ((UnityEngine.Playables.PlayableDirector)o).time; if (!x.Equals((System.Double)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Playables.PlayableDirector)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.Playables.PlayableDirector)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.Playables.PlayableDirector)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.PointEffector2D", new UnityProperty[] {
+                new UnityProperty { Name = "useColliderMask", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((PointEffector2D)o).useColliderMask = (System.Boolean)v, Getter = (o) => ((PointEffector2D)o).useColliderMask, Updater = (object o, ref object v) => { var x = ((PointEffector2D)o).useColliderMask; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "colliderMask", PropertyType = typeof(System.Int32), Setter = (o, v) => ((PointEffector2D)o).colliderMask = (System.Int32)v, Getter = (o) => ((PointEffector2D)o).colliderMask, Updater = (object o, ref object v) => { var x = ((PointEffector2D)o).colliderMask; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "forceMagnitude", PropertyType = typeof(System.Single), Setter = (o, v) => ((PointEffector2D)o).forceMagnitude = (System.Single)v, Getter = (o) => ((PointEffector2D)o).forceMagnitude, Updater = (object o, ref object v) => { var x = ((PointEffector2D)o).forceMagnitude; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "forceVariation", PropertyType = typeof(System.Single), Setter = (o, v) => ((PointEffector2D)o).forceVariation = (System.Single)v, Getter = (o) => ((PointEffector2D)o).forceVariation, Updater = (object o, ref object v) => { var x = ((PointEffector2D)o).forceVariation; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "distanceScale", PropertyType = typeof(System.Single), Setter = (o, v) => ((PointEffector2D)o).distanceScale = (System.Single)v, Getter = (o) => ((PointEffector2D)o).distanceScale, Updater = (object o, ref object v) => { var x = ((PointEffector2D)o).distanceScale; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "forceSource", PropertyType = typeof(UnityEngine.EffectorSelection2D), Setter = (o, v) => ((PointEffector2D)o).forceSource = (UnityEngine.EffectorSelection2D)v, Getter = (o) => ((PointEffector2D)o).forceSource, Updater = (object o, ref object v) => { var x = (int)((PointEffector2D)o).forceSource; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "forceTarget", PropertyType = typeof(UnityEngine.EffectorSelection2D), Setter = (o, v) => ((PointEffector2D)o).forceTarget = (UnityEngine.EffectorSelection2D)v, Getter = (o) => ((PointEffector2D)o).forceTarget, Updater = (object o, ref object v) => { var x = (int)((PointEffector2D)o).forceTarget; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "forceMode", PropertyType = typeof(UnityEngine.EffectorForceMode2D), Setter = (o, v) => ((PointEffector2D)o).forceMode = (UnityEngine.EffectorForceMode2D)v, Getter = (o) => ((PointEffector2D)o).forceMode, Updater = (object o, ref object v) => { var x = (int)((PointEffector2D)o).forceMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "drag", PropertyType = typeof(System.Single), Setter = (o, v) => ((PointEffector2D)o).drag = (System.Single)v, Getter = (o) => ((PointEffector2D)o).drag, Updater = (object o, ref object v) => { var x = ((PointEffector2D)o).drag; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "angularDrag", PropertyType = typeof(System.Single), Setter = (o, v) => ((PointEffector2D)o).angularDrag = (System.Single)v, Getter = (o) => ((PointEffector2D)o).angularDrag, Updater = (object o, ref object v) => { var x = ((PointEffector2D)o).angularDrag; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((PointEffector2D)o).enabled = (System.Boolean)v, Getter = (o) => ((PointEffector2D)o).enabled, Updater = (object o, ref object v) => { var x = ((PointEffector2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.PolygonCollider2D", new UnityProperty[] {
+                new UnityProperty { Name = "sharedMaterial", PropertyType = typeof(UnityEngine.PhysicsMaterial2D), Setter = (o, v) => ((PolygonCollider2D)o).sharedMaterial = (UnityEngine.PhysicsMaterial2D)v, Getter = (o) => ((PolygonCollider2D)o).sharedMaterial, },
+                new UnityProperty { Name = "isTrigger", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((PolygonCollider2D)o).isTrigger = (System.Boolean)v, Getter = (o) => ((PolygonCollider2D)o).isTrigger, Updater = (object o, ref object v) => { var x = ((PolygonCollider2D)o).isTrigger; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "usedByEffector", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((PolygonCollider2D)o).usedByEffector = (System.Boolean)v, Getter = (o) => ((PolygonCollider2D)o).usedByEffector, Updater = (object o, ref object v) => { var x = ((PolygonCollider2D)o).usedByEffector; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #if !UNITY_2023_1_OR_NEWER
+                new UnityProperty { Name = "usedByComposite", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((PolygonCollider2D)o).usedByComposite = (System.Boolean)v, Getter = (o) => ((PolygonCollider2D)o).usedByComposite, Updater = (object o, ref object v) => { var x = ((PolygonCollider2D)o).usedByComposite; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #endif
+            #if UNITY_2023_1_OR_NEWER
+                new UnityProperty { Name = "compositeOperation", PropertyType = typeof(UnityEngine.Collider2D.CompositeOperation), Setter = (o, v) => ((PolygonCollider2D)o).compositeOperation = (UnityEngine.Collider2D.CompositeOperation)v, Getter = (o) => ((PolygonCollider2D)o).compositeOperation, Updater = (object o, ref object v) => { var x = (int)((PolygonCollider2D)o).compositeOperation; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+            #endif
+                new UnityProperty { Name = "autoTiling", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((PolygonCollider2D)o).autoTiling = (System.Boolean)v, Getter = (o) => ((PolygonCollider2D)o).autoTiling, Updater = (object o, ref object v) => { var x = ((PolygonCollider2D)o).autoTiling; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "offset", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((PolygonCollider2D)o).offset = (UnityEngine.Vector2)v, Getter = (o) => ((PolygonCollider2D)o).offset, Updater = (object o, ref object v) => { var x = ((PolygonCollider2D)o).offset; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "pathCount", PropertyType = typeof(System.Int32), Setter = (o, v) => ((PolygonCollider2D)o).pathCount = (System.Int32)v, Getter = (o) => ((PolygonCollider2D)o).pathCount, Updater = (object o, ref object v) => { var x = ((PolygonCollider2D)o).pathCount; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "points", PropertyType = typeof(UnityEngine.Vector2[]), Setter = (o, v) => ((PolygonCollider2D)o).points = (UnityEngine.Vector2[])v, Getter = (o) => ((PolygonCollider2D)o).points, },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((PolygonCollider2D)o).enabled = (System.Boolean)v, Getter = (o) => ((PolygonCollider2D)o).enabled, Updater = (object o, ref object v) => { var x = ((PolygonCollider2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_ANIMATION
+            { "UnityEngine.Animations.PositionConstraint", new UnityProperty[] {
+                new UnityProperty { Name = "constraintActive", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Animations.PositionConstraint)o).constraintActive = (System.Boolean)v, Getter = (o) => ((UnityEngine.Animations.PositionConstraint)o).constraintActive, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.PositionConstraint)o).constraintActive; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "weight", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.Animations.PositionConstraint)o).weight = (System.Single)v, Getter = (o) => ((UnityEngine.Animations.PositionConstraint)o).weight, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.PositionConstraint)o).weight; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "locked", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Animations.PositionConstraint)o).locked = (System.Boolean)v, Getter = (o) => ((UnityEngine.Animations.PositionConstraint)o).locked, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.PositionConstraint)o).locked; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "translationAtRest", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((UnityEngine.Animations.PositionConstraint)o).translationAtRest = (UnityEngine.Vector3)v, Getter = (o) => ((UnityEngine.Animations.PositionConstraint)o).translationAtRest, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.PositionConstraint)o).translationAtRest; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "translationOffset", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((UnityEngine.Animations.PositionConstraint)o).translationOffset = (UnityEngine.Vector3)v, Getter = (o) => ((UnityEngine.Animations.PositionConstraint)o).translationOffset, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.PositionConstraint)o).translationOffset; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "translationAxis", PropertyType = typeof(UnityEngine.Animations.Axis), Setter = (o, v) => ((UnityEngine.Animations.PositionConstraint)o).translationAxis = (UnityEngine.Animations.Axis)v, Getter = (o) => ((UnityEngine.Animations.PositionConstraint)o).translationAxis, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.Animations.PositionConstraint)o).translationAxis; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Animations.PositionConstraint)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.Animations.PositionConstraint)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.PositionConstraint)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+            { "UnityEngine.Projector", new UnityProperty[] {
+                new UnityProperty { Name = "nearClipPlane", PropertyType = typeof(System.Single), Setter = (o, v) => ((Projector)o).nearClipPlane = (System.Single)v, Getter = (o) => ((Projector)o).nearClipPlane, Updater = (object o, ref object v) => { var x = ((Projector)o).nearClipPlane; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "farClipPlane", PropertyType = typeof(System.Single), Setter = (o, v) => ((Projector)o).farClipPlane = (System.Single)v, Getter = (o) => ((Projector)o).farClipPlane, Updater = (object o, ref object v) => { var x = ((Projector)o).farClipPlane; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "fieldOfView", PropertyType = typeof(System.Single), Setter = (o, v) => ((Projector)o).fieldOfView = (System.Single)v, Getter = (o) => ((Projector)o).fieldOfView, Updater = (object o, ref object v) => { var x = ((Projector)o).fieldOfView; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "aspectRatio", PropertyType = typeof(System.Single), Setter = (o, v) => ((Projector)o).aspectRatio = (System.Single)v, Getter = (o) => ((Projector)o).aspectRatio, Updater = (object o, ref object v) => { var x = ((Projector)o).aspectRatio; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "orthographic", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Projector)o).orthographic = (System.Boolean)v, Getter = (o) => ((Projector)o).orthographic, Updater = (object o, ref object v) => { var x = ((Projector)o).orthographic; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "orthographicSize", PropertyType = typeof(System.Single), Setter = (o, v) => ((Projector)o).orthographicSize = (System.Single)v, Getter = (o) => ((Projector)o).orthographicSize, Updater = (object o, ref object v) => { var x = ((Projector)o).orthographicSize; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "material", PropertyType = typeof(UnityEngine.Material), Setter = (o, v) => ((Projector)o).material = (UnityEngine.Material)v, Getter = (o) => ((Projector)o).material, },
+                new UnityProperty { Name = "ignoreLayers", PropertyType = typeof(System.Int32), Setter = (o, v) => ((Projector)o).ignoreLayers = (System.Int32)v, Getter = (o) => ((Projector)o).ignoreLayers, Updater = (object o, ref object v) => { var x = ((Projector)o).ignoreLayers; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Projector)o).enabled = (System.Boolean)v, Getter = (o) => ((Projector)o).enabled, Updater = (object o, ref object v) => { var x = ((Projector)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.RawImage", new UnityProperty[] {
+                new UnityProperty { Name = "texture", PropertyType = typeof(UnityEngine.Texture), Setter = (o, v) => ((UnityEngine.UI.RawImage)o).texture = (UnityEngine.Texture)v, Getter = (o) => ((UnityEngine.UI.RawImage)o).texture, },
+                new UnityProperty { Name = "color", PropertyType = typeof(UnityEngine.Color), Setter = (o, v) => ((UnityEngine.UI.RawImage)o).color = (UnityEngine.Color)v, Getter = (o) => ((UnityEngine.UI.RawImage)o).color, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.RawImage)o).color; if (!x.Equals((UnityEngine.Color)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "raycastTarget", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.RawImage)o).raycastTarget = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.RawImage)o).raycastTarget, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.RawImage)o).raycastTarget; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #if UNITY_2020_1_OR_NEWER
+                new UnityProperty { Name = "raycastPadding", PropertyType = typeof(UnityEngine.Vector4), Setter = (o, v) => ((UnityEngine.UI.RawImage)o).raycastPadding = (UnityEngine.Vector4)v, Getter = (o) => ((UnityEngine.UI.RawImage)o).raycastPadding, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.RawImage)o).raycastPadding; if (!x.Equals((UnityEngine.Vector4)v)) { v = x; return true; } return false; } },
+            #endif
+                new UnityProperty { Name = "maskable", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.RawImage)o).maskable = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.RawImage)o).maskable, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.RawImage)o).maskable; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "uvRect", PropertyType = typeof(UnityEngine.Rect), Setter = (o, v) => ((UnityEngine.UI.RawImage)o).uvRect = (UnityEngine.Rect)v, Getter = (o) => ((UnityEngine.UI.RawImage)o).uvRect, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.RawImage)o).uvRect; if (!x.Equals((UnityEngine.Rect)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.RawImage)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.RawImage)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.RawImage)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.RectMask2D", new UnityProperty[] {
+                new UnityProperty { Name = "padding", PropertyType = typeof(UnityEngine.Vector4), Setter = (o, v) => ((UnityEngine.UI.RectMask2D)o).padding = (UnityEngine.Vector4)v, Getter = (o) => ((UnityEngine.UI.RectMask2D)o).padding, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.RectMask2D)o).padding; if (!x.Equals((UnityEngine.Vector4)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "softness", PropertyType = typeof(UnityEngine.Vector2Int), Setter = (o, v) => ((UnityEngine.UI.RectMask2D)o).softness = (UnityEngine.Vector2Int)v, Getter = (o) => ((UnityEngine.UI.RectMask2D)o).softness, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.RectMask2D)o).softness; if (!x.Equals((UnityEngine.Vector2Int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.RectMask2D)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.RectMask2D)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.RectMask2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+            { "UnityEngine.RectTransform", new UnityProperty[] {
+                new UnityProperty { Name = "localPosition", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((RectTransform)o).localPosition = (UnityEngine.Vector3)v, Getter = (o) => ((RectTransform)o).localPosition, Updater = (object o, ref object v) => { var x = ((RectTransform)o).localPosition; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sizeDelta", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((RectTransform)o).sizeDelta = (UnityEngine.Vector2)v, Getter = (o) => ((RectTransform)o).sizeDelta, Updater = (object o, ref object v) => { var x = ((RectTransform)o).sizeDelta; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "anchorMin", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((RectTransform)o).anchorMin = (UnityEngine.Vector2)v, Getter = (o) => ((RectTransform)o).anchorMin, Updater = (object o, ref object v) => { var x = ((RectTransform)o).anchorMin; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "anchorMax", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((RectTransform)o).anchorMax = (UnityEngine.Vector2)v, Getter = (o) => ((RectTransform)o).anchorMax, Updater = (object o, ref object v) => { var x = ((RectTransform)o).anchorMax; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "localRotation", PropertyType = typeof(UnityEngine.Quaternion), Setter = (o, v) => ((RectTransform)o).localRotation = (UnityEngine.Quaternion)v, Getter = (o) => ((RectTransform)o).localRotation, Updater = (object o, ref object v) => { var x = ((RectTransform)o).localRotation; if (!x.Equals((UnityEngine.Quaternion)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "localScale", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((RectTransform)o).localScale = (UnityEngine.Vector3)v, Getter = (o) => ((RectTransform)o).localScale, Updater = (object o, ref object v) => { var x = ((RectTransform)o).localScale; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+            }},
+
+
+            { "UnityEngine.ReflectionProbe", new UnityProperty[] {
+                new UnityProperty { Name = "mode", PropertyType = typeof(UnityEngine.Rendering.ReflectionProbeMode), Setter = (o, v) => ((ReflectionProbe)o).mode = (UnityEngine.Rendering.ReflectionProbeMode)v, Getter = (o) => ((ReflectionProbe)o).mode, Updater = (object o, ref object v) => { var x = (int)((ReflectionProbe)o).mode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "importance", PropertyType = typeof(System.Int32), Setter = (o, v) => ((ReflectionProbe)o).importance = (System.Int32)v, Getter = (o) => ((ReflectionProbe)o).importance, Updater = (object o, ref object v) => { var x = ((ReflectionProbe)o).importance; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "intensity", PropertyType = typeof(System.Single), Setter = (o, v) => ((ReflectionProbe)o).intensity = (System.Single)v, Getter = (o) => ((ReflectionProbe)o).intensity, Updater = (object o, ref object v) => { var x = ((ReflectionProbe)o).intensity; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "boxProjection", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((ReflectionProbe)o).boxProjection = (System.Boolean)v, Getter = (o) => ((ReflectionProbe)o).boxProjection, Updater = (object o, ref object v) => { var x = ((ReflectionProbe)o).boxProjection; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "blendDistance", PropertyType = typeof(System.Single), Setter = (o, v) => ((ReflectionProbe)o).blendDistance = (System.Single)v, Getter = (o) => ((ReflectionProbe)o).blendDistance, Updater = (object o, ref object v) => { var x = ((ReflectionProbe)o).blendDistance; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "size", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((ReflectionProbe)o).size = (UnityEngine.Vector3)v, Getter = (o) => ((ReflectionProbe)o).size, Updater = (object o, ref object v) => { var x = ((ReflectionProbe)o).size; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "center", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((ReflectionProbe)o).center = (UnityEngine.Vector3)v, Getter = (o) => ((ReflectionProbe)o).center, Updater = (object o, ref object v) => { var x = ((ReflectionProbe)o).center; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "resolution", PropertyType = typeof(System.Int32), Setter = (o, v) => ((ReflectionProbe)o).resolution = (System.Int32)v, Getter = (o) => ((ReflectionProbe)o).resolution, Updater = (object o, ref object v) => { var x = ((ReflectionProbe)o).resolution; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "hdr", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((ReflectionProbe)o).hdr = (System.Boolean)v, Getter = (o) => ((ReflectionProbe)o).hdr, Updater = (object o, ref object v) => { var x = ((ReflectionProbe)o).hdr; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "shadowDistance", PropertyType = typeof(System.Single), Setter = (o, v) => ((ReflectionProbe)o).shadowDistance = (System.Single)v, Getter = (o) => ((ReflectionProbe)o).shadowDistance, Updater = (object o, ref object v) => { var x = ((ReflectionProbe)o).shadowDistance; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "clearFlags", PropertyType = typeof(UnityEngine.Rendering.ReflectionProbeClearFlags), Setter = (o, v) => ((ReflectionProbe)o).clearFlags = (UnityEngine.Rendering.ReflectionProbeClearFlags)v, Getter = (o) => ((ReflectionProbe)o).clearFlags, Updater = (object o, ref object v) => { var x = (int)((ReflectionProbe)o).clearFlags; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "backgroundColor", PropertyType = typeof(UnityEngine.Color), Setter = (o, v) => ((ReflectionProbe)o).backgroundColor = (UnityEngine.Color)v, Getter = (o) => ((ReflectionProbe)o).backgroundColor, Updater = (object o, ref object v) => { var x = ((ReflectionProbe)o).backgroundColor; if (!x.Equals((UnityEngine.Color)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "cullingMask", PropertyType = typeof(System.Int32), Setter = (o, v) => ((ReflectionProbe)o).cullingMask = (System.Int32)v, Getter = (o) => ((ReflectionProbe)o).cullingMask, Updater = (object o, ref object v) => { var x = ((ReflectionProbe)o).cullingMask; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "nearClipPlane", PropertyType = typeof(System.Single), Setter = (o, v) => ((ReflectionProbe)o).nearClipPlane = (System.Single)v, Getter = (o) => ((ReflectionProbe)o).nearClipPlane, Updater = (object o, ref object v) => { var x = ((ReflectionProbe)o).nearClipPlane; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "farClipPlane", PropertyType = typeof(System.Single), Setter = (o, v) => ((ReflectionProbe)o).farClipPlane = (System.Single)v, Getter = (o) => ((ReflectionProbe)o).farClipPlane, Updater = (object o, ref object v) => { var x = ((ReflectionProbe)o).farClipPlane; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((ReflectionProbe)o).enabled = (System.Boolean)v, Getter = (o) => ((ReflectionProbe)o).enabled, Updater = (object o, ref object v) => { var x = ((ReflectionProbe)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.RelativeJoint2D", new UnityProperty[] {
+                new UnityProperty { Name = "enableCollision", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((RelativeJoint2D)o).enableCollision = (System.Boolean)v, Getter = (o) => ((RelativeJoint2D)o).enableCollision, Updater = (object o, ref object v) => { var x = ((RelativeJoint2D)o).enableCollision; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedBody", PropertyType = typeof(UnityEngine.Rigidbody2D), Setter = (o, v) => ((RelativeJoint2D)o).connectedBody = (UnityEngine.Rigidbody2D)v, Getter = (o) => ((RelativeJoint2D)o).connectedBody, },
+                new UnityProperty { Name = "maxForce", PropertyType = typeof(System.Single), Setter = (o, v) => ((RelativeJoint2D)o).maxForce = (System.Single)v, Getter = (o) => ((RelativeJoint2D)o).maxForce, Updater = (object o, ref object v) => { var x = ((RelativeJoint2D)o).maxForce; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "maxTorque", PropertyType = typeof(System.Single), Setter = (o, v) => ((RelativeJoint2D)o).maxTorque = (System.Single)v, Getter = (o) => ((RelativeJoint2D)o).maxTorque, Updater = (object o, ref object v) => { var x = ((RelativeJoint2D)o).maxTorque; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "correctionScale", PropertyType = typeof(System.Single), Setter = (o, v) => ((RelativeJoint2D)o).correctionScale = (System.Single)v, Getter = (o) => ((RelativeJoint2D)o).correctionScale, Updater = (object o, ref object v) => { var x = ((RelativeJoint2D)o).correctionScale; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "autoConfigureOffset", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((RelativeJoint2D)o).autoConfigureOffset = (System.Boolean)v, Getter = (o) => ((RelativeJoint2D)o).autoConfigureOffset, Updater = (object o, ref object v) => { var x = ((RelativeJoint2D)o).autoConfigureOffset; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "linearOffset", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((RelativeJoint2D)o).linearOffset = (UnityEngine.Vector2)v, Getter = (o) => ((RelativeJoint2D)o).linearOffset, Updater = (object o, ref object v) => { var x = ((RelativeJoint2D)o).linearOffset; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "angularOffset", PropertyType = typeof(System.Single), Setter = (o, v) => ((RelativeJoint2D)o).angularOffset = (System.Single)v, Getter = (o) => ((RelativeJoint2D)o).angularOffset, Updater = (object o, ref object v) => { var x = ((RelativeJoint2D)o).angularOffset; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakForce", PropertyType = typeof(System.Single), Setter = (o, v) => ((RelativeJoint2D)o).breakForce = (System.Single)v, Getter = (o) => ((RelativeJoint2D)o).breakForce, Updater = (object o, ref object v) => { var x = ((RelativeJoint2D)o).breakForce; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakTorque", PropertyType = typeof(System.Single), Setter = (o, v) => ((RelativeJoint2D)o).breakTorque = (System.Single)v, Getter = (o) => ((RelativeJoint2D)o).breakTorque, Updater = (object o, ref object v) => { var x = ((RelativeJoint2D)o).breakTorque; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((RelativeJoint2D)o).enabled = (System.Boolean)v, Getter = (o) => ((RelativeJoint2D)o).enabled, Updater = (object o, ref object v) => { var x = ((RelativeJoint2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS
+            { "UnityEngine.Rigidbody", new UnityProperty[] {
+                new UnityProperty { Name = "mass", PropertyType = typeof(System.Single), Setter = (o, v) => ((Rigidbody)o).mass = (System.Single)v, Getter = (o) => ((Rigidbody)o).mass, Updater = (object o, ref object v) => { var x = ((Rigidbody)o).mass; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "drag", PropertyType = typeof(System.Single), Setter = (o, v) => ((Rigidbody)o).drag = (System.Single)v, Getter = (o) => ((Rigidbody)o).drag, Updater = (object o, ref object v) => { var x = ((Rigidbody)o).drag; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "angularDrag", PropertyType = typeof(System.Single), Setter = (o, v) => ((Rigidbody)o).angularDrag = (System.Single)v, Getter = (o) => ((Rigidbody)o).angularDrag, Updater = (object o, ref object v) => { var x = ((Rigidbody)o).angularDrag; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useGravity", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Rigidbody)o).useGravity = (System.Boolean)v, Getter = (o) => ((Rigidbody)o).useGravity, Updater = (object o, ref object v) => { var x = ((Rigidbody)o).useGravity; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "isKinematic", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Rigidbody)o).isKinematic = (System.Boolean)v, Getter = (o) => ((Rigidbody)o).isKinematic, Updater = (object o, ref object v) => { var x = ((Rigidbody)o).isKinematic; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "interpolation", PropertyType = typeof(UnityEngine.RigidbodyInterpolation), Setter = (o, v) => ((Rigidbody)o).interpolation = (UnityEngine.RigidbodyInterpolation)v, Getter = (o) => ((Rigidbody)o).interpolation, Updater = (object o, ref object v) => { var x = (int)((Rigidbody)o).interpolation; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "collisionDetectionMode", PropertyType = typeof(UnityEngine.CollisionDetectionMode), Setter = (o, v) => ((Rigidbody)o).collisionDetectionMode = (UnityEngine.CollisionDetectionMode)v, Getter = (o) => ((Rigidbody)o).collisionDetectionMode, Updater = (object o, ref object v) => { var x = (int)((Rigidbody)o).collisionDetectionMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "constraints", PropertyType = typeof(UnityEngine.RigidbodyConstraints), Setter = (o, v) => ((Rigidbody)o).constraints = (UnityEngine.RigidbodyConstraints)v, Getter = (o) => ((Rigidbody)o).constraints, Updater = (object o, ref object v) => { var x = (int)((Rigidbody)o).constraints; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.Rigidbody2D", new UnityProperty[] {
+                new UnityProperty { Name = "bodyType", PropertyType = typeof(UnityEngine.RigidbodyType2D), Setter = (o, v) => ((Rigidbody2D)o).bodyType = (UnityEngine.RigidbodyType2D)v, Getter = (o) => ((Rigidbody2D)o).bodyType, Updater = (object o, ref object v) => { var x = (int)((Rigidbody2D)o).bodyType; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "simulated", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Rigidbody2D)o).simulated = (System.Boolean)v, Getter = (o) => ((Rigidbody2D)o).simulated, Updater = (object o, ref object v) => { var x = ((Rigidbody2D)o).simulated; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useAutoMass", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Rigidbody2D)o).useAutoMass = (System.Boolean)v, Getter = (o) => ((Rigidbody2D)o).useAutoMass, Updater = (object o, ref object v) => { var x = ((Rigidbody2D)o).useAutoMass; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "mass", PropertyType = typeof(System.Single), Setter = (o, v) => ((Rigidbody2D)o).mass = (System.Single)v, Getter = (o) => ((Rigidbody2D)o).mass, Updater = (object o, ref object v) => { var x = ((Rigidbody2D)o).mass; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "drag", PropertyType = typeof(System.Single), Setter = (o, v) => ((Rigidbody2D)o).drag = (System.Single)v, Getter = (o) => ((Rigidbody2D)o).drag, Updater = (object o, ref object v) => { var x = ((Rigidbody2D)o).drag; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "angularDrag", PropertyType = typeof(System.Single), Setter = (o, v) => ((Rigidbody2D)o).angularDrag = (System.Single)v, Getter = (o) => ((Rigidbody2D)o).angularDrag, Updater = (object o, ref object v) => { var x = ((Rigidbody2D)o).angularDrag; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "gravityScale", PropertyType = typeof(System.Single), Setter = (o, v) => ((Rigidbody2D)o).gravityScale = (System.Single)v, Getter = (o) => ((Rigidbody2D)o).gravityScale, Updater = (object o, ref object v) => { var x = ((Rigidbody2D)o).gravityScale; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "collisionDetectionMode", PropertyType = typeof(UnityEngine.CollisionDetectionMode2D), Setter = (o, v) => ((Rigidbody2D)o).collisionDetectionMode = (UnityEngine.CollisionDetectionMode2D)v, Getter = (o) => ((Rigidbody2D)o).collisionDetectionMode, Updater = (object o, ref object v) => { var x = (int)((Rigidbody2D)o).collisionDetectionMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sleepMode", PropertyType = typeof(UnityEngine.RigidbodySleepMode2D), Setter = (o, v) => ((Rigidbody2D)o).sleepMode = (UnityEngine.RigidbodySleepMode2D)v, Getter = (o) => ((Rigidbody2D)o).sleepMode, Updater = (object o, ref object v) => { var x = (int)((Rigidbody2D)o).sleepMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "interpolation", PropertyType = typeof(UnityEngine.RigidbodyInterpolation2D), Setter = (o, v) => ((Rigidbody2D)o).interpolation = (UnityEngine.RigidbodyInterpolation2D)v, Getter = (o) => ((Rigidbody2D)o).interpolation, Updater = (object o, ref object v) => { var x = (int)((Rigidbody2D)o).interpolation; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "constraints", PropertyType = typeof(UnityEngine.RigidbodyConstraints2D), Setter = (o, v) => ((Rigidbody2D)o).constraints = (UnityEngine.RigidbodyConstraints2D)v, Getter = (o) => ((Rigidbody2D)o).constraints, Updater = (object o, ref object v) => { var x = (int)((Rigidbody2D)o).constraints; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_ANIMATION
+            { "UnityEngine.Animations.RotationConstraint", new UnityProperty[] {
+                new UnityProperty { Name = "constraintActive", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Animations.RotationConstraint)o).constraintActive = (System.Boolean)v, Getter = (o) => ((UnityEngine.Animations.RotationConstraint)o).constraintActive, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.RotationConstraint)o).constraintActive; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "weight", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.Animations.RotationConstraint)o).weight = (System.Single)v, Getter = (o) => ((UnityEngine.Animations.RotationConstraint)o).weight, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.RotationConstraint)o).weight; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "locked", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Animations.RotationConstraint)o).locked = (System.Boolean)v, Getter = (o) => ((UnityEngine.Animations.RotationConstraint)o).locked, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.RotationConstraint)o).locked; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "rotationAtRest", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((UnityEngine.Animations.RotationConstraint)o).rotationAtRest = (UnityEngine.Vector3)v, Getter = (o) => ((UnityEngine.Animations.RotationConstraint)o).rotationAtRest, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.RotationConstraint)o).rotationAtRest; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "rotationOffset", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((UnityEngine.Animations.RotationConstraint)o).rotationOffset = (UnityEngine.Vector3)v, Getter = (o) => ((UnityEngine.Animations.RotationConstraint)o).rotationOffset, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.RotationConstraint)o).rotationOffset; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "rotationAxis", PropertyType = typeof(UnityEngine.Animations.Axis), Setter = (o, v) => ((UnityEngine.Animations.RotationConstraint)o).rotationAxis = (UnityEngine.Animations.Axis)v, Getter = (o) => ((UnityEngine.Animations.RotationConstraint)o).rotationAxis, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.Animations.RotationConstraint)o).rotationAxis; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Animations.RotationConstraint)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.Animations.RotationConstraint)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.RotationConstraint)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_ANIMATION
+            { "UnityEngine.Animations.ScaleConstraint", new UnityProperty[] {
+                new UnityProperty { Name = "constraintActive", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Animations.ScaleConstraint)o).constraintActive = (System.Boolean)v, Getter = (o) => ((UnityEngine.Animations.ScaleConstraint)o).constraintActive, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.ScaleConstraint)o).constraintActive; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "weight", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.Animations.ScaleConstraint)o).weight = (System.Single)v, Getter = (o) => ((UnityEngine.Animations.ScaleConstraint)o).weight, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.ScaleConstraint)o).weight; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "locked", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Animations.ScaleConstraint)o).locked = (System.Boolean)v, Getter = (o) => ((UnityEngine.Animations.ScaleConstraint)o).locked, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.ScaleConstraint)o).locked; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "scaleAtRest", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((UnityEngine.Animations.ScaleConstraint)o).scaleAtRest = (UnityEngine.Vector3)v, Getter = (o) => ((UnityEngine.Animations.ScaleConstraint)o).scaleAtRest, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.ScaleConstraint)o).scaleAtRest; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "scaleOffset", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((UnityEngine.Animations.ScaleConstraint)o).scaleOffset = (UnityEngine.Vector3)v, Getter = (o) => ((UnityEngine.Animations.ScaleConstraint)o).scaleOffset, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.ScaleConstraint)o).scaleOffset; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "scalingAxis", PropertyType = typeof(UnityEngine.Animations.Axis), Setter = (o, v) => ((UnityEngine.Animations.ScaleConstraint)o).scalingAxis = (UnityEngine.Animations.Axis)v, Getter = (o) => ((UnityEngine.Animations.ScaleConstraint)o).scalingAxis, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.Animations.ScaleConstraint)o).scalingAxis; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Animations.ScaleConstraint)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.Animations.ScaleConstraint)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.Animations.ScaleConstraint)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.Scrollbar", new UnityProperty[] {
+                new UnityProperty { Name = "interactable", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Scrollbar)o).interactable = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Scrollbar)o).interactable, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Scrollbar)o).interactable; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "transition", PropertyType = typeof(UnityEngine.UI.Selectable.Transition), Setter = (o, v) => ((UnityEngine.UI.Scrollbar)o).transition = (UnityEngine.UI.Selectable.Transition)v, Getter = (o) => ((UnityEngine.UI.Scrollbar)o).transition, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.Scrollbar)o).transition; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "targetGraphic", PropertyType = typeof(UnityEngine.UI.Graphic), Setter = (o, v) => ((UnityEngine.UI.Scrollbar)o).targetGraphic = (UnityEngine.UI.Graphic)v, Getter = (o) => ((UnityEngine.UI.Scrollbar)o).targetGraphic, },
+                new UnityProperty { Name = "colors", PropertyType = typeof(UnityEngine.UI.ColorBlock), Setter = (o, v) => ((UnityEngine.UI.Scrollbar)o).colors = (UnityEngine.UI.ColorBlock)v, Getter = (o) => ((UnityEngine.UI.Scrollbar)o).colors, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Scrollbar)o).colors; if (!x.Equals((UnityEngine.UI.ColorBlock)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "navigation", PropertyType = typeof(UnityEngine.UI.Navigation), Setter = (o, v) => ((UnityEngine.UI.Scrollbar)o).navigation = (UnityEngine.UI.Navigation)v, Getter = (o) => ((UnityEngine.UI.Scrollbar)o).navigation, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Scrollbar)o).navigation; if (!x.Equals((UnityEngine.UI.Navigation)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "handleRect", PropertyType = typeof(UnityEngine.RectTransform), Setter = (o, v) => ((UnityEngine.UI.Scrollbar)o).handleRect = (UnityEngine.RectTransform)v, Getter = (o) => ((UnityEngine.UI.Scrollbar)o).handleRect, },
+                new UnityProperty { Name = "direction", PropertyType = typeof(UnityEngine.UI.Scrollbar.Direction), Setter = (o, v) => ((UnityEngine.UI.Scrollbar)o).direction = (UnityEngine.UI.Scrollbar.Direction)v, Getter = (o) => ((UnityEngine.UI.Scrollbar)o).direction, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.Scrollbar)o).direction; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "value", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.Scrollbar)o).value = (System.Single)v, Getter = (o) => ((UnityEngine.UI.Scrollbar)o).value, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Scrollbar)o).value; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "size", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.Scrollbar)o).size = (System.Single)v, Getter = (o) => ((UnityEngine.UI.Scrollbar)o).size, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Scrollbar)o).size; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "numberOfSteps", PropertyType = typeof(System.Int32), Setter = (o, v) => ((UnityEngine.UI.Scrollbar)o).numberOfSteps = (System.Int32)v, Getter = (o) => ((UnityEngine.UI.Scrollbar)o).numberOfSteps, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Scrollbar)o).numberOfSteps; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Scrollbar)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Scrollbar)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Scrollbar)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.ScrollRect", new UnityProperty[] {
+                new UnityProperty { Name = "content", PropertyType = typeof(UnityEngine.RectTransform), Setter = (o, v) => ((UnityEngine.UI.ScrollRect)o).content = (UnityEngine.RectTransform)v, Getter = (o) => ((UnityEngine.UI.ScrollRect)o).content, },
+                new UnityProperty { Name = "horizontal", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.ScrollRect)o).horizontal = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.ScrollRect)o).horizontal, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.ScrollRect)o).horizontal; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "vertical", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.ScrollRect)o).vertical = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.ScrollRect)o).vertical, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.ScrollRect)o).vertical; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "movementType", PropertyType = typeof(UnityEngine.UI.ScrollRect.MovementType), Setter = (o, v) => ((UnityEngine.UI.ScrollRect)o).movementType = (UnityEngine.UI.ScrollRect.MovementType)v, Getter = (o) => ((UnityEngine.UI.ScrollRect)o).movementType, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.ScrollRect)o).movementType; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "elasticity", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.ScrollRect)o).elasticity = (System.Single)v, Getter = (o) => ((UnityEngine.UI.ScrollRect)o).elasticity, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.ScrollRect)o).elasticity; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "inertia", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.ScrollRect)o).inertia = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.ScrollRect)o).inertia, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.ScrollRect)o).inertia; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "decelerationRate", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.ScrollRect)o).decelerationRate = (System.Single)v, Getter = (o) => ((UnityEngine.UI.ScrollRect)o).decelerationRate, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.ScrollRect)o).decelerationRate; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "scrollSensitivity", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.ScrollRect)o).scrollSensitivity = (System.Single)v, Getter = (o) => ((UnityEngine.UI.ScrollRect)o).scrollSensitivity, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.ScrollRect)o).scrollSensitivity; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "viewport", PropertyType = typeof(UnityEngine.RectTransform), Setter = (o, v) => ((UnityEngine.UI.ScrollRect)o).viewport = (UnityEngine.RectTransform)v, Getter = (o) => ((UnityEngine.UI.ScrollRect)o).viewport, },
+                new UnityProperty { Name = "horizontalScrollbar", PropertyType = typeof(UnityEngine.UI.Scrollbar), Setter = (o, v) => ((UnityEngine.UI.ScrollRect)o).horizontalScrollbar = (UnityEngine.UI.Scrollbar)v, Getter = (o) => ((UnityEngine.UI.ScrollRect)o).horizontalScrollbar, },
+                new UnityProperty { Name = "verticalScrollbar", PropertyType = typeof(UnityEngine.UI.Scrollbar), Setter = (o, v) => ((UnityEngine.UI.ScrollRect)o).verticalScrollbar = (UnityEngine.UI.Scrollbar)v, Getter = (o) => ((UnityEngine.UI.ScrollRect)o).verticalScrollbar, },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.ScrollRect)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.ScrollRect)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.ScrollRect)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.Shadow", new UnityProperty[] {
+                new UnityProperty { Name = "effectColor", PropertyType = typeof(UnityEngine.Color), Setter = (o, v) => ((UnityEngine.UI.Shadow)o).effectColor = (UnityEngine.Color)v, Getter = (o) => ((UnityEngine.UI.Shadow)o).effectColor, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Shadow)o).effectColor; if (!x.Equals((UnityEngine.Color)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "effectDistance", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((UnityEngine.UI.Shadow)o).effectDistance = (UnityEngine.Vector2)v, Getter = (o) => ((UnityEngine.UI.Shadow)o).effectDistance, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Shadow)o).effectDistance; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useGraphicAlpha", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Shadow)o).useGraphicAlpha = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Shadow)o).useGraphicAlpha, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Shadow)o).useGraphicAlpha; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Shadow)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Shadow)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Shadow)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+            { "UnityEngine.SkinnedMeshRenderer", new UnityProperty[] {
+            #if UNITY_2021_2_OR_NEWER
+                new UnityProperty { Name = "bounds", PropertyType = typeof(UnityEngine.Bounds), Setter = (o, v) => ((SkinnedMeshRenderer)o).bounds = (UnityEngine.Bounds)v, Getter = (o) => ((SkinnedMeshRenderer)o).bounds, Updater = (object o, ref object v) => { var x = ((SkinnedMeshRenderer)o).bounds; if (!x.Equals((UnityEngine.Bounds)v)) { v = x; return true; } return false; } },
+            #endif
+                new UnityProperty { Name = "quality", PropertyType = typeof(UnityEngine.SkinQuality), Setter = (o, v) => ((SkinnedMeshRenderer)o).quality = (UnityEngine.SkinQuality)v, Getter = (o) => ((SkinnedMeshRenderer)o).quality, Updater = (object o, ref object v) => { var x = (int)((SkinnedMeshRenderer)o).quality; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "updateWhenOffscreen", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SkinnedMeshRenderer)o).updateWhenOffscreen = (System.Boolean)v, Getter = (o) => ((SkinnedMeshRenderer)o).updateWhenOffscreen, Updater = (object o, ref object v) => { var x = ((SkinnedMeshRenderer)o).updateWhenOffscreen; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sharedMesh", PropertyType = typeof(UnityEngine.Mesh), Setter = (o, v) => ((SkinnedMeshRenderer)o).sharedMesh = (UnityEngine.Mesh)v, Getter = (o) => ((SkinnedMeshRenderer)o).sharedMesh, },
+                new UnityProperty { Name = "rootBone", PropertyType = typeof(UnityEngine.Transform), Setter = (o, v) => ((SkinnedMeshRenderer)o).rootBone = (UnityEngine.Transform)v, Getter = (o) => ((SkinnedMeshRenderer)o).rootBone, },
+                new UnityProperty { Name = "sharedMaterials", PropertyType = typeof(UnityEngine.Material[]), Setter = (o, v) => ((SkinnedMeshRenderer)o).sharedMaterials = (UnityEngine.Material[])v, Getter = (o) => ((SkinnedMeshRenderer)o).sharedMaterials, Updater = (object o, ref object v) => { var x = ((SkinnedMeshRenderer)o).sharedMaterials; if (x.Length != ((UnityEngine.Material[])v).Length) { v = x; return true; } else { v = x; return false; }} },
+                new UnityProperty { Name = "shadowCastingMode", PropertyType = typeof(UnityEngine.Rendering.ShadowCastingMode), Setter = (o, v) => ((SkinnedMeshRenderer)o).shadowCastingMode = (UnityEngine.Rendering.ShadowCastingMode)v, Getter = (o) => ((SkinnedMeshRenderer)o).shadowCastingMode, Updater = (object o, ref object v) => { var x = (int)((SkinnedMeshRenderer)o).shadowCastingMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "receiveShadows", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SkinnedMeshRenderer)o).receiveShadows = (System.Boolean)v, Getter = (o) => ((SkinnedMeshRenderer)o).receiveShadows, Updater = (object o, ref object v) => { var x = ((SkinnedMeshRenderer)o).receiveShadows; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "lightProbeUsage", PropertyType = typeof(UnityEngine.Rendering.LightProbeUsage), Setter = (o, v) => ((SkinnedMeshRenderer)o).lightProbeUsage = (UnityEngine.Rendering.LightProbeUsage)v, Getter = (o) => ((SkinnedMeshRenderer)o).lightProbeUsage, Updater = (object o, ref object v) => { var x = (int)((SkinnedMeshRenderer)o).lightProbeUsage; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "reflectionProbeUsage", PropertyType = typeof(UnityEngine.Rendering.ReflectionProbeUsage), Setter = (o, v) => ((SkinnedMeshRenderer)o).reflectionProbeUsage = (UnityEngine.Rendering.ReflectionProbeUsage)v, Getter = (o) => ((SkinnedMeshRenderer)o).reflectionProbeUsage, Updater = (object o, ref object v) => { var x = (int)((SkinnedMeshRenderer)o).reflectionProbeUsage; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "motionVectorGenerationMode", PropertyType = typeof(UnityEngine.MotionVectorGenerationMode), Setter = (o, v) => ((SkinnedMeshRenderer)o).motionVectorGenerationMode = (UnityEngine.MotionVectorGenerationMode)v, Getter = (o) => ((SkinnedMeshRenderer)o).motionVectorGenerationMode, Updater = (object o, ref object v) => { var x = (int)((SkinnedMeshRenderer)o).motionVectorGenerationMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "allowOcclusionWhenDynamic", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SkinnedMeshRenderer)o).allowOcclusionWhenDynamic = (System.Boolean)v, Getter = (o) => ((SkinnedMeshRenderer)o).allowOcclusionWhenDynamic, Updater = (object o, ref object v) => { var x = ((SkinnedMeshRenderer)o).allowOcclusionWhenDynamic; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SkinnedMeshRenderer)o).enabled = (System.Boolean)v, Getter = (o) => ((SkinnedMeshRenderer)o).enabled, Updater = (object o, ref object v) => { var x = ((SkinnedMeshRenderer)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+
+
+            { "UnityEngine.Skybox", new UnityProperty[] {
+                new UnityProperty { Name = "material", PropertyType = typeof(UnityEngine.Material), Setter = (o, v) => ((Skybox)o).material = (UnityEngine.Material)v, Getter = (o) => ((Skybox)o).material, },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((Skybox)o).enabled = (System.Boolean)v, Getter = (o) => ((Skybox)o).enabled, Updater = (object o, ref object v) => { var x = ((Skybox)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.Slider", new UnityProperty[] {
+                new UnityProperty { Name = "interactable", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Slider)o).interactable = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Slider)o).interactable, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Slider)o).interactable; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "transition", PropertyType = typeof(UnityEngine.UI.Selectable.Transition), Setter = (o, v) => ((UnityEngine.UI.Slider)o).transition = (UnityEngine.UI.Selectable.Transition)v, Getter = (o) => ((UnityEngine.UI.Slider)o).transition, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.Slider)o).transition; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "targetGraphic", PropertyType = typeof(UnityEngine.UI.Graphic), Setter = (o, v) => ((UnityEngine.UI.Slider)o).targetGraphic = (UnityEngine.UI.Graphic)v, Getter = (o) => ((UnityEngine.UI.Slider)o).targetGraphic, },
+                new UnityProperty { Name = "colors", PropertyType = typeof(UnityEngine.UI.ColorBlock), Setter = (o, v) => ((UnityEngine.UI.Slider)o).colors = (UnityEngine.UI.ColorBlock)v, Getter = (o) => ((UnityEngine.UI.Slider)o).colors, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Slider)o).colors; if (!x.Equals((UnityEngine.UI.ColorBlock)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "navigation", PropertyType = typeof(UnityEngine.UI.Navigation), Setter = (o, v) => ((UnityEngine.UI.Slider)o).navigation = (UnityEngine.UI.Navigation)v, Getter = (o) => ((UnityEngine.UI.Slider)o).navigation, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Slider)o).navigation; if (!x.Equals((UnityEngine.UI.Navigation)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "fillRect", PropertyType = typeof(UnityEngine.RectTransform), Setter = (o, v) => ((UnityEngine.UI.Slider)o).fillRect = (UnityEngine.RectTransform)v, Getter = (o) => ((UnityEngine.UI.Slider)o).fillRect, },
+                new UnityProperty { Name = "handleRect", PropertyType = typeof(UnityEngine.RectTransform), Setter = (o, v) => ((UnityEngine.UI.Slider)o).handleRect = (UnityEngine.RectTransform)v, Getter = (o) => ((UnityEngine.UI.Slider)o).handleRect, },
+                new UnityProperty { Name = "direction", PropertyType = typeof(UnityEngine.UI.Slider.Direction), Setter = (o, v) => ((UnityEngine.UI.Slider)o).direction = (UnityEngine.UI.Slider.Direction)v, Getter = (o) => ((UnityEngine.UI.Slider)o).direction, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.Slider)o).direction; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "minValue", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.Slider)o).minValue = (System.Single)v, Getter = (o) => ((UnityEngine.UI.Slider)o).minValue, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Slider)o).minValue; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "maxValue", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.Slider)o).maxValue = (System.Single)v, Getter = (o) => ((UnityEngine.UI.Slider)o).maxValue, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Slider)o).maxValue; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "wholeNumbers", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Slider)o).wholeNumbers = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Slider)o).wholeNumbers, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Slider)o).wholeNumbers; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "value", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.Slider)o).value = (System.Single)v, Getter = (o) => ((UnityEngine.UI.Slider)o).value, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Slider)o).value; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Slider)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Slider)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Slider)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.SliderJoint2D", new UnityProperty[] {
+                new UnityProperty { Name = "enableCollision", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SliderJoint2D)o).enableCollision = (System.Boolean)v, Getter = (o) => ((SliderJoint2D)o).enableCollision, Updater = (object o, ref object v) => { var x = ((SliderJoint2D)o).enableCollision; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedBody", PropertyType = typeof(UnityEngine.Rigidbody2D), Setter = (o, v) => ((SliderJoint2D)o).connectedBody = (UnityEngine.Rigidbody2D)v, Getter = (o) => ((SliderJoint2D)o).connectedBody, },
+                new UnityProperty { Name = "autoConfigureConnectedAnchor", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SliderJoint2D)o).autoConfigureConnectedAnchor = (System.Boolean)v, Getter = (o) => ((SliderJoint2D)o).autoConfigureConnectedAnchor, Updater = (object o, ref object v) => { var x = ((SliderJoint2D)o).autoConfigureConnectedAnchor; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "anchor", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((SliderJoint2D)o).anchor = (UnityEngine.Vector2)v, Getter = (o) => ((SliderJoint2D)o).anchor, Updater = (object o, ref object v) => { var x = ((SliderJoint2D)o).anchor; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedAnchor", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((SliderJoint2D)o).connectedAnchor = (UnityEngine.Vector2)v, Getter = (o) => ((SliderJoint2D)o).connectedAnchor, Updater = (object o, ref object v) => { var x = ((SliderJoint2D)o).connectedAnchor; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "autoConfigureAngle", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SliderJoint2D)o).autoConfigureAngle = (System.Boolean)v, Getter = (o) => ((SliderJoint2D)o).autoConfigureAngle, Updater = (object o, ref object v) => { var x = ((SliderJoint2D)o).autoConfigureAngle; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "angle", PropertyType = typeof(System.Single), Setter = (o, v) => ((SliderJoint2D)o).angle = (System.Single)v, Getter = (o) => ((SliderJoint2D)o).angle, Updater = (object o, ref object v) => { var x = ((SliderJoint2D)o).angle; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useMotor", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SliderJoint2D)o).useMotor = (System.Boolean)v, Getter = (o) => ((SliderJoint2D)o).useMotor, Updater = (object o, ref object v) => { var x = ((SliderJoint2D)o).useMotor; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "motor", PropertyType = typeof(UnityEngine.JointMotor2D), Setter = (o, v) => ((SliderJoint2D)o).motor = (UnityEngine.JointMotor2D)v, Getter = (o) => ((SliderJoint2D)o).motor, Updater = (object o, ref object v) => { var x = ((SliderJoint2D)o).motor; if (!x.Equals((UnityEngine.JointMotor2D)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useLimits", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SliderJoint2D)o).useLimits = (System.Boolean)v, Getter = (o) => ((SliderJoint2D)o).useLimits, Updater = (object o, ref object v) => { var x = ((SliderJoint2D)o).useLimits; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "limits", PropertyType = typeof(UnityEngine.JointTranslationLimits2D), Setter = (o, v) => ((SliderJoint2D)o).limits = (UnityEngine.JointTranslationLimits2D)v, Getter = (o) => ((SliderJoint2D)o).limits, Updater = (object o, ref object v) => { var x = ((SliderJoint2D)o).limits; if (!x.Equals((UnityEngine.JointTranslationLimits2D)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakForce", PropertyType = typeof(System.Single), Setter = (o, v) => ((SliderJoint2D)o).breakForce = (System.Single)v, Getter = (o) => ((SliderJoint2D)o).breakForce, Updater = (object o, ref object v) => { var x = ((SliderJoint2D)o).breakForce; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakTorque", PropertyType = typeof(System.Single), Setter = (o, v) => ((SliderJoint2D)o).breakTorque = (System.Single)v, Getter = (o) => ((SliderJoint2D)o).breakTorque, Updater = (object o, ref object v) => { var x = ((SliderJoint2D)o).breakTorque; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SliderJoint2D)o).enabled = (System.Boolean)v, Getter = (o) => ((SliderJoint2D)o).enabled, Updater = (object o, ref object v) => { var x = ((SliderJoint2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+            { "UnityEngine.Rendering.SortingGroup", new UnityProperty[] {
+                new UnityProperty { Name = "sortingLayerID", PropertyType = typeof(System.Int32), Setter = (o, v) => ((UnityEngine.Rendering.SortingGroup)o).sortingLayerID = (System.Int32)v, Getter = (o) => ((UnityEngine.Rendering.SortingGroup)o).sortingLayerID, Updater = (object o, ref object v) => { var x = ((UnityEngine.Rendering.SortingGroup)o).sortingLayerID; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sortingOrder", PropertyType = typeof(System.Int32), Setter = (o, v) => ((UnityEngine.Rendering.SortingGroup)o).sortingOrder = (System.Int32)v, Getter = (o) => ((UnityEngine.Rendering.SortingGroup)o).sortingOrder, Updater = (object o, ref object v) => { var x = ((UnityEngine.Rendering.SortingGroup)o).sortingOrder; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Rendering.SortingGroup)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.Rendering.SortingGroup)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.Rendering.SortingGroup)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+
+
+        #if UNITY_PHYSICS
+            { "UnityEngine.SphereCollider", new UnityProperty[] {
+                new UnityProperty { Name = "isTrigger", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SphereCollider)o).isTrigger = (System.Boolean)v, Getter = (o) => ((SphereCollider)o).isTrigger, Updater = (object o, ref object v) => { var x = ((SphereCollider)o).isTrigger; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sharedMaterial", PropertyType = typeof(UnityEngine.PhysicMaterial), Setter = (o, v) => ((SphereCollider)o).sharedMaterial = (UnityEngine.PhysicMaterial)v, Getter = (o) => ((SphereCollider)o).sharedMaterial, },
+                new UnityProperty { Name = "center", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((SphereCollider)o).center = (UnityEngine.Vector3)v, Getter = (o) => ((SphereCollider)o).center, Updater = (object o, ref object v) => { var x = ((SphereCollider)o).center; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "radius", PropertyType = typeof(System.Single), Setter = (o, v) => ((SphereCollider)o).radius = (System.Single)v, Getter = (o) => ((SphereCollider)o).radius, Updater = (object o, ref object v) => { var x = ((SphereCollider)o).radius; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SphereCollider)o).enabled = (System.Boolean)v, Getter = (o) => ((SphereCollider)o).enabled, Updater = (object o, ref object v) => { var x = ((SphereCollider)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS
+            { "UnityEngine.SpringJoint", new UnityProperty[] {
+                new UnityProperty { Name = "connectedBody", PropertyType = typeof(UnityEngine.Rigidbody), Setter = (o, v) => ((SpringJoint)o).connectedBody = (UnityEngine.Rigidbody)v, Getter = (o) => ((SpringJoint)o).connectedBody, },
+            #if UNITY_2020_2_OR_NEWER
+                new UnityProperty { Name = "connectedArticulationBody", PropertyType = typeof(UnityEngine.ArticulationBody), Setter = (o, v) => ((SpringJoint)o).connectedArticulationBody = (UnityEngine.ArticulationBody)v, Getter = (o) => ((SpringJoint)o).connectedArticulationBody, },
+            #endif
+                new UnityProperty { Name = "anchor", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((SpringJoint)o).anchor = (UnityEngine.Vector3)v, Getter = (o) => ((SpringJoint)o).anchor, Updater = (object o, ref object v) => { var x = ((SpringJoint)o).anchor; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "axis", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((SpringJoint)o).axis = (UnityEngine.Vector3)v, Getter = (o) => ((SpringJoint)o).axis, Updater = (object o, ref object v) => { var x = ((SpringJoint)o).axis; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "autoConfigureConnectedAnchor", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SpringJoint)o).autoConfigureConnectedAnchor = (System.Boolean)v, Getter = (o) => ((SpringJoint)o).autoConfigureConnectedAnchor, Updater = (object o, ref object v) => { var x = ((SpringJoint)o).autoConfigureConnectedAnchor; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedAnchor", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((SpringJoint)o).connectedAnchor = (UnityEngine.Vector3)v, Getter = (o) => ((SpringJoint)o).connectedAnchor, Updater = (object o, ref object v) => { var x = ((SpringJoint)o).connectedAnchor; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "spring", PropertyType = typeof(System.Single), Setter = (o, v) => ((SpringJoint)o).spring = (System.Single)v, Getter = (o) => ((SpringJoint)o).spring, Updater = (object o, ref object v) => { var x = ((SpringJoint)o).spring; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "damper", PropertyType = typeof(System.Single), Setter = (o, v) => ((SpringJoint)o).damper = (System.Single)v, Getter = (o) => ((SpringJoint)o).damper, Updater = (object o, ref object v) => { var x = ((SpringJoint)o).damper; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "minDistance", PropertyType = typeof(System.Single), Setter = (o, v) => ((SpringJoint)o).minDistance = (System.Single)v, Getter = (o) => ((SpringJoint)o).minDistance, Updater = (object o, ref object v) => { var x = ((SpringJoint)o).minDistance; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "maxDistance", PropertyType = typeof(System.Single), Setter = (o, v) => ((SpringJoint)o).maxDistance = (System.Single)v, Getter = (o) => ((SpringJoint)o).maxDistance, Updater = (object o, ref object v) => { var x = ((SpringJoint)o).maxDistance; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "tolerance", PropertyType = typeof(System.Single), Setter = (o, v) => ((SpringJoint)o).tolerance = (System.Single)v, Getter = (o) => ((SpringJoint)o).tolerance, Updater = (object o, ref object v) => { var x = ((SpringJoint)o).tolerance; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakForce", PropertyType = typeof(System.Single), Setter = (o, v) => ((SpringJoint)o).breakForce = (System.Single)v, Getter = (o) => ((SpringJoint)o).breakForce, Updater = (object o, ref object v) => { var x = ((SpringJoint)o).breakForce; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakTorque", PropertyType = typeof(System.Single), Setter = (o, v) => ((SpringJoint)o).breakTorque = (System.Single)v, Getter = (o) => ((SpringJoint)o).breakTorque, Updater = (object o, ref object v) => { var x = ((SpringJoint)o).breakTorque; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enableCollision", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SpringJoint)o).enableCollision = (System.Boolean)v, Getter = (o) => ((SpringJoint)o).enableCollision, Updater = (object o, ref object v) => { var x = ((SpringJoint)o).enableCollision; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enablePreprocessing", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SpringJoint)o).enablePreprocessing = (System.Boolean)v, Getter = (o) => ((SpringJoint)o).enablePreprocessing, Updater = (object o, ref object v) => { var x = ((SpringJoint)o).enablePreprocessing; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "massScale", PropertyType = typeof(System.Single), Setter = (o, v) => ((SpringJoint)o).massScale = (System.Single)v, Getter = (o) => ((SpringJoint)o).massScale, Updater = (object o, ref object v) => { var x = ((SpringJoint)o).massScale; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedMassScale", PropertyType = typeof(System.Single), Setter = (o, v) => ((SpringJoint)o).connectedMassScale = (System.Single)v, Getter = (o) => ((SpringJoint)o).connectedMassScale, Updater = (object o, ref object v) => { var x = ((SpringJoint)o).connectedMassScale; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.SpringJoint2D", new UnityProperty[] {
+                new UnityProperty { Name = "enableCollision", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SpringJoint2D)o).enableCollision = (System.Boolean)v, Getter = (o) => ((SpringJoint2D)o).enableCollision, Updater = (object o, ref object v) => { var x = ((SpringJoint2D)o).enableCollision; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedBody", PropertyType = typeof(UnityEngine.Rigidbody2D), Setter = (o, v) => ((SpringJoint2D)o).connectedBody = (UnityEngine.Rigidbody2D)v, Getter = (o) => ((SpringJoint2D)o).connectedBody, },
+                new UnityProperty { Name = "autoConfigureConnectedAnchor", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SpringJoint2D)o).autoConfigureConnectedAnchor = (System.Boolean)v, Getter = (o) => ((SpringJoint2D)o).autoConfigureConnectedAnchor, Updater = (object o, ref object v) => { var x = ((SpringJoint2D)o).autoConfigureConnectedAnchor; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "anchor", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((SpringJoint2D)o).anchor = (UnityEngine.Vector2)v, Getter = (o) => ((SpringJoint2D)o).anchor, Updater = (object o, ref object v) => { var x = ((SpringJoint2D)o).anchor; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedAnchor", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((SpringJoint2D)o).connectedAnchor = (UnityEngine.Vector2)v, Getter = (o) => ((SpringJoint2D)o).connectedAnchor, Updater = (object o, ref object v) => { var x = ((SpringJoint2D)o).connectedAnchor; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "autoConfigureDistance", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SpringJoint2D)o).autoConfigureDistance = (System.Boolean)v, Getter = (o) => ((SpringJoint2D)o).autoConfigureDistance, Updater = (object o, ref object v) => { var x = ((SpringJoint2D)o).autoConfigureDistance; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "distance", PropertyType = typeof(System.Single), Setter = (o, v) => ((SpringJoint2D)o).distance = (System.Single)v, Getter = (o) => ((SpringJoint2D)o).distance, Updater = (object o, ref object v) => { var x = ((SpringJoint2D)o).distance; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "dampingRatio", PropertyType = typeof(System.Single), Setter = (o, v) => ((SpringJoint2D)o).dampingRatio = (System.Single)v, Getter = (o) => ((SpringJoint2D)o).dampingRatio, Updater = (object o, ref object v) => { var x = ((SpringJoint2D)o).dampingRatio; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "frequency", PropertyType = typeof(System.Single), Setter = (o, v) => ((SpringJoint2D)o).frequency = (System.Single)v, Getter = (o) => ((SpringJoint2D)o).frequency, Updater = (object o, ref object v) => { var x = ((SpringJoint2D)o).frequency; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakForce", PropertyType = typeof(System.Single), Setter = (o, v) => ((SpringJoint2D)o).breakForce = (System.Single)v, Getter = (o) => ((SpringJoint2D)o).breakForce, Updater = (object o, ref object v) => { var x = ((SpringJoint2D)o).breakForce; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SpringJoint2D)o).enabled = (System.Boolean)v, Getter = (o) => ((SpringJoint2D)o).enabled, Updater = (object o, ref object v) => { var x = ((SpringJoint2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+            { "UnityEngine.SpriteMask", new UnityProperty[] {
+                new UnityProperty { Name = "sprite", PropertyType = typeof(UnityEngine.Sprite), Setter = (o, v) => ((SpriteMask)o).sprite = (UnityEngine.Sprite)v, Getter = (o) => ((SpriteMask)o).sprite, },
+                new UnityProperty { Name = "alphaCutoff", PropertyType = typeof(System.Single), Setter = (o, v) => ((SpriteMask)o).alphaCutoff = (System.Single)v, Getter = (o) => ((SpriteMask)o).alphaCutoff, Updater = (object o, ref object v) => { var x = ((SpriteMask)o).alphaCutoff; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "isCustomRangeActive", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SpriteMask)o).isCustomRangeActive = (System.Boolean)v, Getter = (o) => ((SpriteMask)o).isCustomRangeActive, Updater = (object o, ref object v) => { var x = ((SpriteMask)o).isCustomRangeActive; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "frontSortingOrder", PropertyType = typeof(System.Int32), Setter = (o, v) => ((SpriteMask)o).frontSortingOrder = (System.Int32)v, Getter = (o) => ((SpriteMask)o).frontSortingOrder, Updater = (object o, ref object v) => { var x = ((SpriteMask)o).frontSortingOrder; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SpriteMask)o).enabled = (System.Boolean)v, Getter = (o) => ((SpriteMask)o).enabled, Updater = (object o, ref object v) => { var x = ((SpriteMask)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+
+
+            { "UnityEngine.SpriteRenderer", new UnityProperty[] {
+                new UnityProperty { Name = "sprite", PropertyType = typeof(UnityEngine.Sprite), Setter = (o, v) => ((SpriteRenderer)o).sprite = (UnityEngine.Sprite)v, Getter = (o) => ((SpriteRenderer)o).sprite, },
+                new UnityProperty { Name = "color", PropertyType = typeof(UnityEngine.Color), Setter = (o, v) => ((SpriteRenderer)o).color = (UnityEngine.Color)v, Getter = (o) => ((SpriteRenderer)o).color, Updater = (object o, ref object v) => { var x = ((SpriteRenderer)o).color; if (!x.Equals((UnityEngine.Color)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "flipX", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SpriteRenderer)o).flipX = (System.Boolean)v, Getter = (o) => ((SpriteRenderer)o).flipX, Updater = (object o, ref object v) => { var x = ((SpriteRenderer)o).flipX; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "flipY", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SpriteRenderer)o).flipY = (System.Boolean)v, Getter = (o) => ((SpriteRenderer)o).flipY, Updater = (object o, ref object v) => { var x = ((SpriteRenderer)o).flipY; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "drawMode", PropertyType = typeof(UnityEngine.SpriteDrawMode), Setter = (o, v) => ((SpriteRenderer)o).drawMode = (UnityEngine.SpriteDrawMode)v, Getter = (o) => ((SpriteRenderer)o).drawMode, Updater = (object o, ref object v) => { var x = (int)((SpriteRenderer)o).drawMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "maskInteraction", PropertyType = typeof(UnityEngine.SpriteMaskInteraction), Setter = (o, v) => ((SpriteRenderer)o).maskInteraction = (UnityEngine.SpriteMaskInteraction)v, Getter = (o) => ((SpriteRenderer)o).maskInteraction, Updater = (object o, ref object v) => { var x = (int)((SpriteRenderer)o).maskInteraction; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "spriteSortPoint", PropertyType = typeof(UnityEngine.SpriteSortPoint), Setter = (o, v) => ((SpriteRenderer)o).spriteSortPoint = (UnityEngine.SpriteSortPoint)v, Getter = (o) => ((SpriteRenderer)o).spriteSortPoint, Updater = (object o, ref object v) => { var x = (int)((SpriteRenderer)o).spriteSortPoint; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sharedMaterials", PropertyType = typeof(UnityEngine.Material[]), Setter = (o, v) => ((SpriteRenderer)o).sharedMaterials = (UnityEngine.Material[])v, Getter = (o) => ((SpriteRenderer)o).sharedMaterials, Updater = (object o, ref object v) => { var x = ((SpriteRenderer)o).sharedMaterials; if (x.Length != ((UnityEngine.Material[])v).Length) { v = x; return true; } else { v = x; return false; }} },
+                new UnityProperty { Name = "sortingLayerID", PropertyType = typeof(System.Int32), Setter = (o, v) => ((SpriteRenderer)o).sortingLayerID = (System.Int32)v, Getter = (o) => ((SpriteRenderer)o).sortingLayerID, Updater = (object o, ref object v) => { var x = ((SpriteRenderer)o).sortingLayerID; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sortingOrder", PropertyType = typeof(System.Int32), Setter = (o, v) => ((SpriteRenderer)o).sortingOrder = (System.Int32)v, Getter = (o) => ((SpriteRenderer)o).sortingOrder, Updater = (object o, ref object v) => { var x = ((SpriteRenderer)o).sortingOrder; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SpriteRenderer)o).enabled = (System.Boolean)v, Getter = (o) => ((SpriteRenderer)o).enabled, Updater = (object o, ref object v) => { var x = ((SpriteRenderer)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+
+
+        #if UNITY_UI
+            { "UnityEngine.U2D.SpriteShapeRenderer", new UnityProperty[] {
+                new UnityProperty { Name = "color", PropertyType = typeof(UnityEngine.Color), Setter = (o, v) => ((UnityEngine.U2D.SpriteShapeRenderer)o).color = (UnityEngine.Color)v, Getter = (o) => ((UnityEngine.U2D.SpriteShapeRenderer)o).color, Updater = (object o, ref object v) => { var x = ((UnityEngine.U2D.SpriteShapeRenderer)o).color; if (!x.Equals((UnityEngine.Color)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "maskInteraction", PropertyType = typeof(UnityEngine.SpriteMaskInteraction), Setter = (o, v) => ((UnityEngine.U2D.SpriteShapeRenderer)o).maskInteraction = (UnityEngine.SpriteMaskInteraction)v, Getter = (o) => ((UnityEngine.U2D.SpriteShapeRenderer)o).maskInteraction, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.U2D.SpriteShapeRenderer)o).maskInteraction; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sharedMaterials", PropertyType = typeof(UnityEngine.Material[]), Setter = (o, v) => ((UnityEngine.U2D.SpriteShapeRenderer)o).sharedMaterials = (UnityEngine.Material[])v, Getter = (o) => ((UnityEngine.U2D.SpriteShapeRenderer)o).sharedMaterials, Updater = (object o, ref object v) => { var x = ((UnityEngine.U2D.SpriteShapeRenderer)o).sharedMaterials; if (x.Length != ((UnityEngine.Material[])v).Length) { v = x; return true; } else { v = x; return false; }} },
+                new UnityProperty { Name = "sortingLayerID", PropertyType = typeof(System.Int32), Setter = (o, v) => ((UnityEngine.U2D.SpriteShapeRenderer)o).sortingLayerID = (System.Int32)v, Getter = (o) => ((UnityEngine.U2D.SpriteShapeRenderer)o).sortingLayerID, Updater = (object o, ref object v) => { var x = ((UnityEngine.U2D.SpriteShapeRenderer)o).sortingLayerID; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sortingOrder", PropertyType = typeof(System.Int32), Setter = (o, v) => ((UnityEngine.U2D.SpriteShapeRenderer)o).sortingOrder = (System.Int32)v, Getter = (o) => ((UnityEngine.U2D.SpriteShapeRenderer)o).sortingOrder, Updater = (object o, ref object v) => { var x = ((UnityEngine.U2D.SpriteShapeRenderer)o).sortingOrder; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.U2D.SpriteShapeRenderer)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.U2D.SpriteShapeRenderer)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.U2D.SpriteShapeRenderer)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.EventSystems.StandaloneInputModule", new UnityProperty[] {
+                new UnityProperty { Name = "horizontalAxis", PropertyType = typeof(System.String), Setter = (o, v) => ((UnityEngine.EventSystems.StandaloneInputModule)o).horizontalAxis = (System.String)v, Getter = (o) => ((UnityEngine.EventSystems.StandaloneInputModule)o).horizontalAxis, },
+                new UnityProperty { Name = "verticalAxis", PropertyType = typeof(System.String), Setter = (o, v) => ((UnityEngine.EventSystems.StandaloneInputModule)o).verticalAxis = (System.String)v, Getter = (o) => ((UnityEngine.EventSystems.StandaloneInputModule)o).verticalAxis, },
+                new UnityProperty { Name = "submitButton", PropertyType = typeof(System.String), Setter = (o, v) => ((UnityEngine.EventSystems.StandaloneInputModule)o).submitButton = (System.String)v, Getter = (o) => ((UnityEngine.EventSystems.StandaloneInputModule)o).submitButton, },
+                new UnityProperty { Name = "cancelButton", PropertyType = typeof(System.String), Setter = (o, v) => ((UnityEngine.EventSystems.StandaloneInputModule)o).cancelButton = (System.String)v, Getter = (o) => ((UnityEngine.EventSystems.StandaloneInputModule)o).cancelButton, },
+                new UnityProperty { Name = "inputActionsPerSecond", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.EventSystems.StandaloneInputModule)o).inputActionsPerSecond = (System.Single)v, Getter = (o) => ((UnityEngine.EventSystems.StandaloneInputModule)o).inputActionsPerSecond, Updater = (object o, ref object v) => { var x = ((UnityEngine.EventSystems.StandaloneInputModule)o).inputActionsPerSecond; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "repeatDelay", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.EventSystems.StandaloneInputModule)o).repeatDelay = (System.Single)v, Getter = (o) => ((UnityEngine.EventSystems.StandaloneInputModule)o).repeatDelay, Updater = (object o, ref object v) => { var x = ((UnityEngine.EventSystems.StandaloneInputModule)o).repeatDelay; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.EventSystems.StandaloneInputModule)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.EventSystems.StandaloneInputModule)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.EventSystems.StandaloneInputModule)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+            { "UnityEngine.StreamingController", new UnityProperty[] {
+                new UnityProperty { Name = "streamingMipmapBias", PropertyType = typeof(System.Single), Setter = (o, v) => ((StreamingController)o).streamingMipmapBias = (System.Single)v, Getter = (o) => ((StreamingController)o).streamingMipmapBias, Updater = (object o, ref object v) => { var x = ((StreamingController)o).streamingMipmapBias; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((StreamingController)o).enabled = (System.Boolean)v, Getter = (o) => ((StreamingController)o).enabled, Updater = (object o, ref object v) => { var x = ((StreamingController)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.SurfaceEffector2D", new UnityProperty[] {
+                new UnityProperty { Name = "useColliderMask", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SurfaceEffector2D)o).useColliderMask = (System.Boolean)v, Getter = (o) => ((SurfaceEffector2D)o).useColliderMask, Updater = (object o, ref object v) => { var x = ((SurfaceEffector2D)o).useColliderMask; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "colliderMask", PropertyType = typeof(System.Int32), Setter = (o, v) => ((SurfaceEffector2D)o).colliderMask = (System.Int32)v, Getter = (o) => ((SurfaceEffector2D)o).colliderMask, Updater = (object o, ref object v) => { var x = ((SurfaceEffector2D)o).colliderMask; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "speed", PropertyType = typeof(System.Single), Setter = (o, v) => ((SurfaceEffector2D)o).speed = (System.Single)v, Getter = (o) => ((SurfaceEffector2D)o).speed, Updater = (object o, ref object v) => { var x = ((SurfaceEffector2D)o).speed; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "speedVariation", PropertyType = typeof(System.Single), Setter = (o, v) => ((SurfaceEffector2D)o).speedVariation = (System.Single)v, Getter = (o) => ((SurfaceEffector2D)o).speedVariation, Updater = (object o, ref object v) => { var x = ((SurfaceEffector2D)o).speedVariation; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "forceScale", PropertyType = typeof(System.Single), Setter = (o, v) => ((SurfaceEffector2D)o).forceScale = (System.Single)v, Getter = (o) => ((SurfaceEffector2D)o).forceScale, Updater = (object o, ref object v) => { var x = ((SurfaceEffector2D)o).forceScale; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useContactForce", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SurfaceEffector2D)o).useContactForce = (System.Boolean)v, Getter = (o) => ((SurfaceEffector2D)o).useContactForce, Updater = (object o, ref object v) => { var x = ((SurfaceEffector2D)o).useContactForce; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useFriction", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SurfaceEffector2D)o).useFriction = (System.Boolean)v, Getter = (o) => ((SurfaceEffector2D)o).useFriction, Updater = (object o, ref object v) => { var x = ((SurfaceEffector2D)o).useFriction; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useBounce", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SurfaceEffector2D)o).useBounce = (System.Boolean)v, Getter = (o) => ((SurfaceEffector2D)o).useBounce, Updater = (object o, ref object v) => { var x = ((SurfaceEffector2D)o).useBounce; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((SurfaceEffector2D)o).enabled = (System.Boolean)v, Getter = (o) => ((SurfaceEffector2D)o).enabled, Updater = (object o, ref object v) => { var x = ((SurfaceEffector2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.TargetJoint2D", new UnityProperty[] {
+                new UnityProperty { Name = "anchor", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((TargetJoint2D)o).anchor = (UnityEngine.Vector2)v, Getter = (o) => ((TargetJoint2D)o).anchor, Updater = (object o, ref object v) => { var x = ((TargetJoint2D)o).anchor; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "target", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((TargetJoint2D)o).target = (UnityEngine.Vector2)v, Getter = (o) => ((TargetJoint2D)o).target, Updater = (object o, ref object v) => { var x = ((TargetJoint2D)o).target; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "autoConfigureTarget", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TargetJoint2D)o).autoConfigureTarget = (System.Boolean)v, Getter = (o) => ((TargetJoint2D)o).autoConfigureTarget, Updater = (object o, ref object v) => { var x = ((TargetJoint2D)o).autoConfigureTarget; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "maxForce", PropertyType = typeof(System.Single), Setter = (o, v) => ((TargetJoint2D)o).maxForce = (System.Single)v, Getter = (o) => ((TargetJoint2D)o).maxForce, Updater = (object o, ref object v) => { var x = ((TargetJoint2D)o).maxForce; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "dampingRatio", PropertyType = typeof(System.Single), Setter = (o, v) => ((TargetJoint2D)o).dampingRatio = (System.Single)v, Getter = (o) => ((TargetJoint2D)o).dampingRatio, Updater = (object o, ref object v) => { var x = ((TargetJoint2D)o).dampingRatio; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "frequency", PropertyType = typeof(System.Single), Setter = (o, v) => ((TargetJoint2D)o).frequency = (System.Single)v, Getter = (o) => ((TargetJoint2D)o).frequency, Updater = (object o, ref object v) => { var x = ((TargetJoint2D)o).frequency; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakForce", PropertyType = typeof(System.Single), Setter = (o, v) => ((TargetJoint2D)o).breakForce = (System.Single)v, Getter = (o) => ((TargetJoint2D)o).breakForce, Updater = (object o, ref object v) => { var x = ((TargetJoint2D)o).breakForce; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TargetJoint2D)o).enabled = (System.Boolean)v, Getter = (o) => ((TargetJoint2D)o).enabled, Updater = (object o, ref object v) => { var x = ((TargetJoint2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_TERRAIN_PHYSICS
+            { "UnityEngine.TerrainCollider", new UnityProperty[] {
+                new UnityProperty { Name = "isTrigger", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TerrainCollider)o).isTrigger = (System.Boolean)v, Getter = (o) => ((TerrainCollider)o).isTrigger, Updater = (object o, ref object v) => { var x = ((TerrainCollider)o).isTrigger; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sharedMaterial", PropertyType = typeof(UnityEngine.PhysicMaterial), Setter = (o, v) => ((TerrainCollider)o).sharedMaterial = (UnityEngine.PhysicMaterial)v, Getter = (o) => ((TerrainCollider)o).sharedMaterial, },
+                new UnityProperty { Name = "terrainData", PropertyType = typeof(UnityEngine.TerrainData), Setter = (o, v) => ((TerrainCollider)o).terrainData = (UnityEngine.TerrainData)v, Getter = (o) => ((TerrainCollider)o).terrainData, },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TerrainCollider)o).enabled = (System.Boolean)v, Getter = (o) => ((TerrainCollider)o).enabled, Updater = (object o, ref object v) => { var x = ((TerrainCollider)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.Text", new UnityProperty[] {
+                new UnityProperty { Name = "text", PropertyType = typeof(System.String), Setter = (o, v) => ((UnityEngine.UI.Text)o).text = (System.String)v, Getter = (o) => ((UnityEngine.UI.Text)o).text, },
+                new UnityProperty { Name = "font", PropertyType = typeof(UnityEngine.Font), Setter = (o, v) => ((UnityEngine.UI.Text)o).font = (UnityEngine.Font)v, Getter = (o) => ((UnityEngine.UI.Text)o).font, },
+                new UnityProperty { Name = "fontStyle", PropertyType = typeof(UnityEngine.FontStyle), Setter = (o, v) => ((UnityEngine.UI.Text)o).fontStyle = (UnityEngine.FontStyle)v, Getter = (o) => ((UnityEngine.UI.Text)o).fontStyle, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.Text)o).fontStyle; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "fontSize", PropertyType = typeof(System.Int32), Setter = (o, v) => ((UnityEngine.UI.Text)o).fontSize = (System.Int32)v, Getter = (o) => ((UnityEngine.UI.Text)o).fontSize, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Text)o).fontSize; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "lineSpacing", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UI.Text)o).lineSpacing = (System.Single)v, Getter = (o) => ((UnityEngine.UI.Text)o).lineSpacing, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Text)o).lineSpacing; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "supportRichText", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Text)o).supportRichText = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Text)o).supportRichText, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Text)o).supportRichText; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "alignment", PropertyType = typeof(UnityEngine.TextAnchor), Setter = (o, v) => ((UnityEngine.UI.Text)o).alignment = (UnityEngine.TextAnchor)v, Getter = (o) => ((UnityEngine.UI.Text)o).alignment, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.Text)o).alignment; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "alignByGeometry", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Text)o).alignByGeometry = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Text)o).alignByGeometry, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Text)o).alignByGeometry; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "horizontalOverflow", PropertyType = typeof(UnityEngine.HorizontalWrapMode), Setter = (o, v) => ((UnityEngine.UI.Text)o).horizontalOverflow = (UnityEngine.HorizontalWrapMode)v, Getter = (o) => ((UnityEngine.UI.Text)o).horizontalOverflow, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.Text)o).horizontalOverflow; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "verticalOverflow", PropertyType = typeof(UnityEngine.VerticalWrapMode), Setter = (o, v) => ((UnityEngine.UI.Text)o).verticalOverflow = (UnityEngine.VerticalWrapMode)v, Getter = (o) => ((UnityEngine.UI.Text)o).verticalOverflow, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.Text)o).verticalOverflow; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "resizeTextForBestFit", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Text)o).resizeTextForBestFit = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Text)o).resizeTextForBestFit, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Text)o).resizeTextForBestFit; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "color", PropertyType = typeof(UnityEngine.Color), Setter = (o, v) => ((UnityEngine.UI.Text)o).color = (UnityEngine.Color)v, Getter = (o) => ((UnityEngine.UI.Text)o).color, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Text)o).color; if (!x.Equals((UnityEngine.Color)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "raycastTarget", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Text)o).raycastTarget = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Text)o).raycastTarget, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Text)o).raycastTarget; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #if UNITY_2020_1_OR_NEWER
+                new UnityProperty { Name = "raycastPadding", PropertyType = typeof(UnityEngine.Vector4), Setter = (o, v) => ((UnityEngine.UI.Text)o).raycastPadding = (UnityEngine.Vector4)v, Getter = (o) => ((UnityEngine.UI.Text)o).raycastPadding, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Text)o).raycastPadding; if (!x.Equals((UnityEngine.Vector4)v)) { v = x; return true; } return false; } },
+            #endif
+                new UnityProperty { Name = "maskable", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Text)o).maskable = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Text)o).maskable, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Text)o).maskable; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Text)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Text)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Text)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_TMPRO
+            { "TMPro.TextContainer", new UnityProperty[] {
+                new UnityProperty { Name = "anchorPosition", PropertyType = typeof(TMPro.TextContainerAnchors), Setter = (o, v) => ((TMPro.TextContainer)o).anchorPosition = (TMPro.TextContainerAnchors)v, Getter = (o) => ((TMPro.TextContainer)o).anchorPosition, Updater = (object o, ref object v) => { var x = (int)((TMPro.TextContainer)o).anchorPosition; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "width", PropertyType = typeof(System.Single), Setter = (o, v) => ((TMPro.TextContainer)o).width = (System.Single)v, Getter = (o) => ((TMPro.TextContainer)o).width, Updater = (object o, ref object v) => { var x = ((TMPro.TextContainer)o).width; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "height", PropertyType = typeof(System.Single), Setter = (o, v) => ((TMPro.TextContainer)o).height = (System.Single)v, Getter = (o) => ((TMPro.TextContainer)o).height, Updater = (object o, ref object v) => { var x = ((TMPro.TextContainer)o).height; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "margins", PropertyType = typeof(UnityEngine.Vector4), Setter = (o, v) => ((TMPro.TextContainer)o).margins = (UnityEngine.Vector4)v, Getter = (o) => ((TMPro.TextContainer)o).margins, Updater = (object o, ref object v) => { var x = ((TMPro.TextContainer)o).margins; if (!x.Equals((UnityEngine.Vector4)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextContainer)o).enabled = (System.Boolean)v, Getter = (o) => ((TMPro.TextContainer)o).enabled, Updater = (object o, ref object v) => { var x = ((TMPro.TextContainer)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+            { "UnityEngine.TextMesh", new UnityProperty[] {
+                new UnityProperty { Name = "text", PropertyType = typeof(System.String), Setter = (o, v) => ((TextMesh)o).text = (System.String)v, Getter = (o) => ((TextMesh)o).text, },
+                new UnityProperty { Name = "offsetZ", PropertyType = typeof(System.Single), Setter = (o, v) => ((TextMesh)o).offsetZ = (System.Single)v, Getter = (o) => ((TextMesh)o).offsetZ, Updater = (object o, ref object v) => { var x = ((TextMesh)o).offsetZ; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "characterSize", PropertyType = typeof(System.Single), Setter = (o, v) => ((TextMesh)o).characterSize = (System.Single)v, Getter = (o) => ((TextMesh)o).characterSize, Updater = (object o, ref object v) => { var x = ((TextMesh)o).characterSize; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "lineSpacing", PropertyType = typeof(System.Single), Setter = (o, v) => ((TextMesh)o).lineSpacing = (System.Single)v, Getter = (o) => ((TextMesh)o).lineSpacing, Updater = (object o, ref object v) => { var x = ((TextMesh)o).lineSpacing; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "anchor", PropertyType = typeof(UnityEngine.TextAnchor), Setter = (o, v) => ((TextMesh)o).anchor = (UnityEngine.TextAnchor)v, Getter = (o) => ((TextMesh)o).anchor, Updater = (object o, ref object v) => { var x = (int)((TextMesh)o).anchor; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "alignment", PropertyType = typeof(UnityEngine.TextAlignment), Setter = (o, v) => ((TextMesh)o).alignment = (UnityEngine.TextAlignment)v, Getter = (o) => ((TextMesh)o).alignment, Updater = (object o, ref object v) => { var x = (int)((TextMesh)o).alignment; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "tabSize", PropertyType = typeof(System.Single), Setter = (o, v) => ((TextMesh)o).tabSize = (System.Single)v, Getter = (o) => ((TextMesh)o).tabSize, Updater = (object o, ref object v) => { var x = ((TextMesh)o).tabSize; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "fontSize", PropertyType = typeof(System.Int32), Setter = (o, v) => ((TextMesh)o).fontSize = (System.Int32)v, Getter = (o) => ((TextMesh)o).fontSize, Updater = (object o, ref object v) => { var x = ((TextMesh)o).fontSize; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "fontStyle", PropertyType = typeof(UnityEngine.FontStyle), Setter = (o, v) => ((TextMesh)o).fontStyle = (UnityEngine.FontStyle)v, Getter = (o) => ((TextMesh)o).fontStyle, Updater = (object o, ref object v) => { var x = (int)((TextMesh)o).fontStyle; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "richText", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TextMesh)o).richText = (System.Boolean)v, Getter = (o) => ((TextMesh)o).richText, Updater = (object o, ref object v) => { var x = ((TextMesh)o).richText; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "font", PropertyType = typeof(UnityEngine.Font), Setter = (o, v) => ((TextMesh)o).font = (UnityEngine.Font)v, Getter = (o) => ((TextMesh)o).font, },
+                new UnityProperty { Name = "color", PropertyType = typeof(UnityEngine.Color), Setter = (o, v) => ((TextMesh)o).color = (UnityEngine.Color)v, Getter = (o) => ((TextMesh)o).color, Updater = (object o, ref object v) => { var x = ((TextMesh)o).color; if (!x.Equals((UnityEngine.Color)v)) { v = x; return true; } return false; } },
+            }},
+
+
+        #if UNITY_TMPRO
+            { "TMPro.TextMeshPro", new UnityProperty[] {
+                new UnityProperty { Name = "text", PropertyType = typeof(System.String), Setter = (o, v) => ((TMPro.TextMeshPro)o).text = (System.String)v, Getter = (o) => ((TMPro.TextMeshPro)o).text, },
+                new UnityProperty { Name = "font", PropertyType = typeof(TMPro.TMP_FontAsset), Setter = (o, v) => ((TMPro.TextMeshPro)o).font = (TMPro.TMP_FontAsset)v, Getter = (o) => ((TMPro.TextMeshPro)o).font, },
+                new UnityProperty { Name = "fontStyle", PropertyType = typeof(TMPro.FontStyles), Setter = (o, v) => ((TMPro.TextMeshPro)o).fontStyle = (TMPro.FontStyles)v, Getter = (o) => ((TMPro.TextMeshPro)o).fontStyle, Updater = (object o, ref object v) => { var x = (int)((TMPro.TextMeshPro)o).fontStyle; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "fontSize", PropertyType = typeof(System.Single), Setter = (o, v) => ((TMPro.TextMeshPro)o).fontSize = (System.Single)v, Getter = (o) => ((TMPro.TextMeshPro)o).fontSize, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshPro)o).fontSize; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "autoSizeTextContainer", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshPro)o).autoSizeTextContainer = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshPro)o).autoSizeTextContainer, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshPro)o).autoSizeTextContainer; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "color", PropertyType = typeof(UnityEngine.Color), Setter = (o, v) => ((TMPro.TextMeshPro)o).color = (UnityEngine.Color)v, Getter = (o) => ((TMPro.TextMeshPro)o).color, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshPro)o).color; if (!x.Equals((UnityEngine.Color)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "colorGradientPreset", PropertyType = typeof(TMPro.TMP_ColorGradient), Setter = (o, v) => ((TMPro.TextMeshPro)o).colorGradientPreset = (TMPro.TMP_ColorGradient)v, Getter = (o) => ((TMPro.TextMeshPro)o).colorGradientPreset, },
+                new UnityProperty { Name = "colorGradient", PropertyType = typeof(TMPro.VertexGradient), Setter = (o, v) => ((TMPro.TextMeshPro)o).colorGradient = (TMPro.VertexGradient)v, Getter = (o) => ((TMPro.TextMeshPro)o).colorGradient, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshPro)o).colorGradient; if (!x.Equals((TMPro.VertexGradient)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "overrideColorTags", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshPro)o).overrideColorTags = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshPro)o).overrideColorTags, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshPro)o).overrideColorTags; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "characterSpacing", PropertyType = typeof(System.Single), Setter = (o, v) => ((TMPro.TextMeshPro)o).characterSpacing = (System.Single)v, Getter = (o) => ((TMPro.TextMeshPro)o).characterSpacing, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshPro)o).characterSpacing; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "wordSpacing", PropertyType = typeof(System.Single), Setter = (o, v) => ((TMPro.TextMeshPro)o).wordSpacing = (System.Single)v, Getter = (o) => ((TMPro.TextMeshPro)o).wordSpacing, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshPro)o).wordSpacing; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "lineSpacing", PropertyType = typeof(System.Single), Setter = (o, v) => ((TMPro.TextMeshPro)o).lineSpacing = (System.Single)v, Getter = (o) => ((TMPro.TextMeshPro)o).lineSpacing, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshPro)o).lineSpacing; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "paragraphSpacing", PropertyType = typeof(System.Single), Setter = (o, v) => ((TMPro.TextMeshPro)o).paragraphSpacing = (System.Single)v, Getter = (o) => ((TMPro.TextMeshPro)o).paragraphSpacing, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshPro)o).paragraphSpacing; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "alignment", PropertyType = typeof(TMPro.TextAlignmentOptions), Setter = (o, v) => ((TMPro.TextMeshPro)o).alignment = (TMPro.TextAlignmentOptions)v, Getter = (o) => ((TMPro.TextMeshPro)o).alignment, Updater = (object o, ref object v) => { var x = (int)((TMPro.TextMeshPro)o).alignment; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enableWordWrapping", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshPro)o).enableWordWrapping = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshPro)o).enableWordWrapping, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshPro)o).enableWordWrapping; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "overflowMode", PropertyType = typeof(TMPro.TextOverflowModes), Setter = (o, v) => ((TMPro.TextMeshPro)o).overflowMode = (TMPro.TextOverflowModes)v, Getter = (o) => ((TMPro.TextMeshPro)o).overflowMode, Updater = (object o, ref object v) => { var x = (int)((TMPro.TextMeshPro)o).overflowMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "horizontalMapping", PropertyType = typeof(TMPro.TextureMappingOptions), Setter = (o, v) => ((TMPro.TextMeshPro)o).horizontalMapping = (TMPro.TextureMappingOptions)v, Getter = (o) => ((TMPro.TextMeshPro)o).horizontalMapping, Updater = (object o, ref object v) => { var x = (int)((TMPro.TextMeshPro)o).horizontalMapping; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "verticalMapping", PropertyType = typeof(TMPro.TextureMappingOptions), Setter = (o, v) => ((TMPro.TextMeshPro)o).verticalMapping = (TMPro.TextureMappingOptions)v, Getter = (o) => ((TMPro.TextMeshPro)o).verticalMapping, Updater = (object o, ref object v) => { var x = (int)((TMPro.TextMeshPro)o).verticalMapping; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "margin", PropertyType = typeof(UnityEngine.Vector4), Setter = (o, v) => ((TMPro.TextMeshPro)o).margin = (UnityEngine.Vector4)v, Getter = (o) => ((TMPro.TextMeshPro)o).margin, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshPro)o).margin; if (!x.Equals((UnityEngine.Vector4)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sortingLayerID", PropertyType = typeof(System.Int32), Setter = (o, v) => ((TMPro.TextMeshPro)o).sortingLayerID = (System.Int32)v, Getter = (o) => ((TMPro.TextMeshPro)o).sortingLayerID, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshPro)o).sortingLayerID; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sortingOrder", PropertyType = typeof(System.Int32), Setter = (o, v) => ((TMPro.TextMeshPro)o).sortingOrder = (System.Int32)v, Getter = (o) => ((TMPro.TextMeshPro)o).sortingOrder, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshPro)o).sortingOrder; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "geometrySortingOrder", PropertyType = typeof(TMPro.VertexSortingOrder), Setter = (o, v) => ((TMPro.TextMeshPro)o).geometrySortingOrder = (TMPro.VertexSortingOrder)v, Getter = (o) => ((TMPro.TextMeshPro)o).geometrySortingOrder, Updater = (object o, ref object v) => { var x = (int)((TMPro.TextMeshPro)o).geometrySortingOrder; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "isTextObjectScaleStatic", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshPro)o).isTextObjectScaleStatic = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshPro)o).isTextObjectScaleStatic, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshPro)o).isTextObjectScaleStatic; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "isOrthographic", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshPro)o).isOrthographic = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshPro)o).isOrthographic, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshPro)o).isOrthographic; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "richText", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshPro)o).richText = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshPro)o).richText, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshPro)o).richText; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "parseCtrlCharacters", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshPro)o).parseCtrlCharacters = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshPro)o).parseCtrlCharacters, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshPro)o).parseCtrlCharacters; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useMaxVisibleDescender", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshPro)o).useMaxVisibleDescender = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshPro)o).useMaxVisibleDescender, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshPro)o).useMaxVisibleDescender; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "spriteAsset", PropertyType = typeof(TMPro.TMP_SpriteAsset), Setter = (o, v) => ((TMPro.TextMeshPro)o).spriteAsset = (TMPro.TMP_SpriteAsset)v, Getter = (o) => ((TMPro.TextMeshPro)o).spriteAsset, },
+                new UnityProperty { Name = "styleSheet", PropertyType = typeof(TMPro.TMP_StyleSheet), Setter = (o, v) => ((TMPro.TextMeshPro)o).styleSheet = (TMPro.TMP_StyleSheet)v, Getter = (o) => ((TMPro.TextMeshPro)o).styleSheet, },
+                new UnityProperty { Name = "enableKerning", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshPro)o).enableKerning = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshPro)o).enableKerning, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshPro)o).enableKerning; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "extraPadding", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshPro)o).extraPadding = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshPro)o).extraPadding, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshPro)o).extraPadding; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshPro)o).enabled = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshPro)o).enabled, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshPro)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_TMPRO
+            { "TMPro.TextMeshProUGUI", new UnityProperty[] {
+                new UnityProperty { Name = "text", PropertyType = typeof(System.String), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).text = (System.String)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).text, },
+                new UnityProperty { Name = "font", PropertyType = typeof(TMPro.TMP_FontAsset), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).font = (TMPro.TMP_FontAsset)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).font, },
+                new UnityProperty { Name = "fontStyle", PropertyType = typeof(TMPro.FontStyles), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).fontStyle = (TMPro.FontStyles)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).fontStyle, Updater = (object o, ref object v) => { var x = (int)((TMPro.TextMeshProUGUI)o).fontStyle; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "fontSize", PropertyType = typeof(System.Single), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).fontSize = (System.Single)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).fontSize, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshProUGUI)o).fontSize; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "autoSizeTextContainer", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).autoSizeTextContainer = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).autoSizeTextContainer, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshProUGUI)o).autoSizeTextContainer; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "color", PropertyType = typeof(UnityEngine.Color), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).color = (UnityEngine.Color)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).color, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshProUGUI)o).color; if (!x.Equals((UnityEngine.Color)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "colorGradientPreset", PropertyType = typeof(TMPro.TMP_ColorGradient), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).colorGradientPreset = (TMPro.TMP_ColorGradient)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).colorGradientPreset, },
+                new UnityProperty { Name = "colorGradient", PropertyType = typeof(TMPro.VertexGradient), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).colorGradient = (TMPro.VertexGradient)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).colorGradient, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshProUGUI)o).colorGradient; if (!x.Equals((TMPro.VertexGradient)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "overrideColorTags", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).overrideColorTags = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).overrideColorTags, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshProUGUI)o).overrideColorTags; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "characterSpacing", PropertyType = typeof(System.Single), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).characterSpacing = (System.Single)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).characterSpacing, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshProUGUI)o).characterSpacing; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "wordSpacing", PropertyType = typeof(System.Single), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).wordSpacing = (System.Single)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).wordSpacing, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshProUGUI)o).wordSpacing; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "lineSpacing", PropertyType = typeof(System.Single), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).lineSpacing = (System.Single)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).lineSpacing, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshProUGUI)o).lineSpacing; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "paragraphSpacing", PropertyType = typeof(System.Single), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).paragraphSpacing = (System.Single)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).paragraphSpacing, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshProUGUI)o).paragraphSpacing; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "alignment", PropertyType = typeof(TMPro.TextAlignmentOptions), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).alignment = (TMPro.TextAlignmentOptions)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).alignment, Updater = (object o, ref object v) => { var x = (int)((TMPro.TextMeshProUGUI)o).alignment; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enableWordWrapping", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).enableWordWrapping = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).enableWordWrapping, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshProUGUI)o).enableWordWrapping; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "overflowMode", PropertyType = typeof(TMPro.TextOverflowModes), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).overflowMode = (TMPro.TextOverflowModes)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).overflowMode, Updater = (object o, ref object v) => { var x = (int)((TMPro.TextMeshProUGUI)o).overflowMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "horizontalMapping", PropertyType = typeof(TMPro.TextureMappingOptions), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).horizontalMapping = (TMPro.TextureMappingOptions)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).horizontalMapping, Updater = (object o, ref object v) => { var x = (int)((TMPro.TextMeshProUGUI)o).horizontalMapping; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "verticalMapping", PropertyType = typeof(TMPro.TextureMappingOptions), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).verticalMapping = (TMPro.TextureMappingOptions)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).verticalMapping, Updater = (object o, ref object v) => { var x = (int)((TMPro.TextMeshProUGUI)o).verticalMapping; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "margin", PropertyType = typeof(UnityEngine.Vector4), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).margin = (UnityEngine.Vector4)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).margin, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshProUGUI)o).margin; if (!x.Equals((UnityEngine.Vector4)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "geometrySortingOrder", PropertyType = typeof(TMPro.VertexSortingOrder), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).geometrySortingOrder = (TMPro.VertexSortingOrder)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).geometrySortingOrder, Updater = (object o, ref object v) => { var x = (int)((TMPro.TextMeshProUGUI)o).geometrySortingOrder; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "isTextObjectScaleStatic", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).isTextObjectScaleStatic = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).isTextObjectScaleStatic, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshProUGUI)o).isTextObjectScaleStatic; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "isOrthographic", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).isOrthographic = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).isOrthographic, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshProUGUI)o).isOrthographic; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "richText", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).richText = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).richText, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshProUGUI)o).richText; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "parseCtrlCharacters", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).parseCtrlCharacters = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).parseCtrlCharacters, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshProUGUI)o).parseCtrlCharacters; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useMaxVisibleDescender", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).useMaxVisibleDescender = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).useMaxVisibleDescender, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshProUGUI)o).useMaxVisibleDescender; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "spriteAsset", PropertyType = typeof(TMPro.TMP_SpriteAsset), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).spriteAsset = (TMPro.TMP_SpriteAsset)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).spriteAsset, },
+                new UnityProperty { Name = "styleSheet", PropertyType = typeof(TMPro.TMP_StyleSheet), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).styleSheet = (TMPro.TMP_StyleSheet)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).styleSheet, },
+                new UnityProperty { Name = "enableKerning", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).enableKerning = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).enableKerning, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshProUGUI)o).enableKerning; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "extraPadding", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).extraPadding = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).extraPadding, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshProUGUI)o).extraPadding; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TextMeshProUGUI)o).enabled = (System.Boolean)v, Getter = (o) => ((TMPro.TextMeshProUGUI)o).enabled, Updater = (object o, ref object v) => { var x = ((TMPro.TextMeshProUGUI)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_TILEMAP
+            { "UnityEngine.Tilemaps.Tilemap", new UnityProperty[] {
+                new UnityProperty { Name = "animationFrameRate", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.Tilemaps.Tilemap)o).animationFrameRate = (System.Single)v, Getter = (o) => ((UnityEngine.Tilemaps.Tilemap)o).animationFrameRate, Updater = (object o, ref object v) => { var x = ((UnityEngine.Tilemaps.Tilemap)o).animationFrameRate; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "color", PropertyType = typeof(UnityEngine.Color), Setter = (o, v) => ((UnityEngine.Tilemaps.Tilemap)o).color = (UnityEngine.Color)v, Getter = (o) => ((UnityEngine.Tilemaps.Tilemap)o).color, Updater = (object o, ref object v) => { var x = ((UnityEngine.Tilemaps.Tilemap)o).color; if (!x.Equals((UnityEngine.Color)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "tileAnchor", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((UnityEngine.Tilemaps.Tilemap)o).tileAnchor = (UnityEngine.Vector3)v, Getter = (o) => ((UnityEngine.Tilemaps.Tilemap)o).tileAnchor, Updater = (object o, ref object v) => { var x = ((UnityEngine.Tilemaps.Tilemap)o).tileAnchor; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "orientation", PropertyType = typeof(UnityEngine.Tilemaps.Tilemap.Orientation), Setter = (o, v) => ((UnityEngine.Tilemaps.Tilemap)o).orientation = (UnityEngine.Tilemaps.Tilemap.Orientation)v, Getter = (o) => ((UnityEngine.Tilemaps.Tilemap)o).orientation, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.Tilemaps.Tilemap)o).orientation; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Tilemaps.Tilemap)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.Tilemaps.Tilemap)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.Tilemaps.Tilemap)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_TILEMAP
+            { "UnityEngine.Tilemaps.TilemapCollider2D", new UnityProperty[] {
+                new UnityProperty { Name = "maximumTileChangeCount", PropertyType = typeof(System.UInt32), Setter = (o, v) => ((UnityEngine.Tilemaps.TilemapCollider2D)o).maximumTileChangeCount = (System.UInt32)v, Getter = (o) => ((UnityEngine.Tilemaps.TilemapCollider2D)o).maximumTileChangeCount, Updater = (object o, ref object v) => { var x = ((UnityEngine.Tilemaps.TilemapCollider2D)o).maximumTileChangeCount; if (!x.Equals((System.UInt32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "extrusionFactor", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.Tilemaps.TilemapCollider2D)o).extrusionFactor = (System.Single)v, Getter = (o) => ((UnityEngine.Tilemaps.TilemapCollider2D)o).extrusionFactor, Updater = (object o, ref object v) => { var x = ((UnityEngine.Tilemaps.TilemapCollider2D)o).extrusionFactor; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sharedMaterial", PropertyType = typeof(UnityEngine.PhysicsMaterial2D), Setter = (o, v) => ((UnityEngine.Tilemaps.TilemapCollider2D)o).sharedMaterial = (UnityEngine.PhysicsMaterial2D)v, Getter = (o) => ((UnityEngine.Tilemaps.TilemapCollider2D)o).sharedMaterial, },
+                new UnityProperty { Name = "isTrigger", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Tilemaps.TilemapCollider2D)o).isTrigger = (System.Boolean)v, Getter = (o) => ((UnityEngine.Tilemaps.TilemapCollider2D)o).isTrigger, Updater = (object o, ref object v) => { var x = ((UnityEngine.Tilemaps.TilemapCollider2D)o).isTrigger; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "usedByEffector", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Tilemaps.TilemapCollider2D)o).usedByEffector = (System.Boolean)v, Getter = (o) => ((UnityEngine.Tilemaps.TilemapCollider2D)o).usedByEffector, Updater = (object o, ref object v) => { var x = ((UnityEngine.Tilemaps.TilemapCollider2D)o).usedByEffector; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #if !UNITY_2023_1_OR_NEWER
+                new UnityProperty { Name = "usedByComposite", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Tilemaps.TilemapCollider2D)o).usedByComposite = (System.Boolean)v, Getter = (o) => ((UnityEngine.Tilemaps.TilemapCollider2D)o).usedByComposite, Updater = (object o, ref object v) => { var x = ((UnityEngine.Tilemaps.TilemapCollider2D)o).usedByComposite; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            #endif
+            #if UNITY_2023_1_OR_NEWER
+                new UnityProperty { Name = "compositeOperation", PropertyType = typeof(UnityEngine.Collider2D.CompositeOperation), Setter = (o, v) => ((UnityEngine.Tilemaps.TilemapCollider2D)o).compositeOperation = (UnityEngine.Collider2D.CompositeOperation)v, Getter = (o) => ((UnityEngine.Tilemaps.TilemapCollider2D)o).compositeOperation, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.Tilemaps.TilemapCollider2D)o).compositeOperation; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+            #endif
+                new UnityProperty { Name = "offset", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((UnityEngine.Tilemaps.TilemapCollider2D)o).offset = (UnityEngine.Vector2)v, Getter = (o) => ((UnityEngine.Tilemaps.TilemapCollider2D)o).offset, Updater = (object o, ref object v) => { var x = ((UnityEngine.Tilemaps.TilemapCollider2D)o).offset; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Tilemaps.TilemapCollider2D)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.Tilemaps.TilemapCollider2D)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.Tilemaps.TilemapCollider2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_TILEMAP
+            { "UnityEngine.Tilemaps.TilemapRenderer", new UnityProperty[] {
+                new UnityProperty { Name = "sortOrder", PropertyType = typeof(UnityEngine.Tilemaps.TilemapRenderer.SortOrder), Setter = (o, v) => ((UnityEngine.Tilemaps.TilemapRenderer)o).sortOrder = (UnityEngine.Tilemaps.TilemapRenderer.SortOrder)v, Getter = (o) => ((UnityEngine.Tilemaps.TilemapRenderer)o).sortOrder, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.Tilemaps.TilemapRenderer)o).sortOrder; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "mode", PropertyType = typeof(UnityEngine.Tilemaps.TilemapRenderer.Mode), Setter = (o, v) => ((UnityEngine.Tilemaps.TilemapRenderer)o).mode = (UnityEngine.Tilemaps.TilemapRenderer.Mode)v, Getter = (o) => ((UnityEngine.Tilemaps.TilemapRenderer)o).mode, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.Tilemaps.TilemapRenderer)o).mode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "detectChunkCullingBounds", PropertyType = typeof(UnityEngine.Tilemaps.TilemapRenderer.DetectChunkCullingBounds), Setter = (o, v) => ((UnityEngine.Tilemaps.TilemapRenderer)o).detectChunkCullingBounds = (UnityEngine.Tilemaps.TilemapRenderer.DetectChunkCullingBounds)v, Getter = (o) => ((UnityEngine.Tilemaps.TilemapRenderer)o).detectChunkCullingBounds, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.Tilemaps.TilemapRenderer)o).detectChunkCullingBounds; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "chunkCullingBounds", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((UnityEngine.Tilemaps.TilemapRenderer)o).chunkCullingBounds = (UnityEngine.Vector3)v, Getter = (o) => ((UnityEngine.Tilemaps.TilemapRenderer)o).chunkCullingBounds, Updater = (object o, ref object v) => { var x = ((UnityEngine.Tilemaps.TilemapRenderer)o).chunkCullingBounds; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "maskInteraction", PropertyType = typeof(UnityEngine.SpriteMaskInteraction), Setter = (o, v) => ((UnityEngine.Tilemaps.TilemapRenderer)o).maskInteraction = (UnityEngine.SpriteMaskInteraction)v, Getter = (o) => ((UnityEngine.Tilemaps.TilemapRenderer)o).maskInteraction, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.Tilemaps.TilemapRenderer)o).maskInteraction; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sharedMaterials", PropertyType = typeof(UnityEngine.Material[]), Setter = (o, v) => ((UnityEngine.Tilemaps.TilemapRenderer)o).sharedMaterials = (UnityEngine.Material[])v, Getter = (o) => ((UnityEngine.Tilemaps.TilemapRenderer)o).sharedMaterials, Updater = (object o, ref object v) => { var x = ((UnityEngine.Tilemaps.TilemapRenderer)o).sharedMaterials; if (x.Length != ((UnityEngine.Material[])v).Length) { v = x; return true; } else { v = x; return false; }} },
+                new UnityProperty { Name = "sortingLayerID", PropertyType = typeof(System.Int32), Setter = (o, v) => ((UnityEngine.Tilemaps.TilemapRenderer)o).sortingLayerID = (System.Int32)v, Getter = (o) => ((UnityEngine.Tilemaps.TilemapRenderer)o).sortingLayerID, Updater = (object o, ref object v) => { var x = ((UnityEngine.Tilemaps.TilemapRenderer)o).sortingLayerID; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sortingOrder", PropertyType = typeof(System.Int32), Setter = (o, v) => ((UnityEngine.Tilemaps.TilemapRenderer)o).sortingOrder = (System.Int32)v, Getter = (o) => ((UnityEngine.Tilemaps.TilemapRenderer)o).sortingOrder, Updater = (object o, ref object v) => { var x = ((UnityEngine.Tilemaps.TilemapRenderer)o).sortingOrder; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Tilemaps.TilemapRenderer)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.Tilemaps.TilemapRenderer)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.Tilemaps.TilemapRenderer)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_TMPRO
+            { "TMPro.TMP_Dropdown", new UnityProperty[] {
+                new UnityProperty { Name = "template", PropertyType = typeof(UnityEngine.RectTransform), Setter = (o, v) => ((TMPro.TMP_Dropdown)o).template = (UnityEngine.RectTransform)v, Getter = (o) => ((TMPro.TMP_Dropdown)o).template, },
+                new UnityProperty { Name = "captionText", PropertyType = typeof(TMPro.TMP_Text), Setter = (o, v) => ((TMPro.TMP_Dropdown)o).captionText = (TMPro.TMP_Text)v, Getter = (o) => ((TMPro.TMP_Dropdown)o).captionText, },
+                new UnityProperty { Name = "captionImage", PropertyType = typeof(UnityEngine.UI.Image), Setter = (o, v) => ((TMPro.TMP_Dropdown)o).captionImage = (UnityEngine.UI.Image)v, Getter = (o) => ((TMPro.TMP_Dropdown)o).captionImage, },
+                new UnityProperty { Name = "placeholder", PropertyType = typeof(UnityEngine.UI.Graphic), Setter = (o, v) => ((TMPro.TMP_Dropdown)o).placeholder = (UnityEngine.UI.Graphic)v, Getter = (o) => ((TMPro.TMP_Dropdown)o).placeholder, },
+                new UnityProperty { Name = "itemText", PropertyType = typeof(TMPro.TMP_Text), Setter = (o, v) => ((TMPro.TMP_Dropdown)o).itemText = (TMPro.TMP_Text)v, Getter = (o) => ((TMPro.TMP_Dropdown)o).itemText, },
+                new UnityProperty { Name = "itemImage", PropertyType = typeof(UnityEngine.UI.Image), Setter = (o, v) => ((TMPro.TMP_Dropdown)o).itemImage = (UnityEngine.UI.Image)v, Getter = (o) => ((TMPro.TMP_Dropdown)o).itemImage, },
+                new UnityProperty { Name = "value", PropertyType = typeof(System.Int32), Setter = (o, v) => ((TMPro.TMP_Dropdown)o).value = (System.Int32)v, Getter = (o) => ((TMPro.TMP_Dropdown)o).value, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_Dropdown)o).value; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "alphaFadeSpeed", PropertyType = typeof(System.Single), Setter = (o, v) => ((TMPro.TMP_Dropdown)o).alphaFadeSpeed = (System.Single)v, Getter = (o) => ((TMPro.TMP_Dropdown)o).alphaFadeSpeed, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_Dropdown)o).alphaFadeSpeed; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "options", PropertyType = typeof(System.Collections.Generic.List<TMPro.TMP_Dropdown.OptionData>), Setter = (o, v) => ((TMPro.TMP_Dropdown)o).options = (System.Collections.Generic.List<TMPro.TMP_Dropdown.OptionData>)v, Getter = (o) => ((TMPro.TMP_Dropdown)o).options, },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TMP_Dropdown)o).enabled = (System.Boolean)v, Getter = (o) => ((TMPro.TMP_Dropdown)o).enabled, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_Dropdown)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_TMPRO
+            { "TMPro.TMP_InputField", new UnityProperty[] {
+                new UnityProperty { Name = "interactable", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TMP_InputField)o).interactable = (System.Boolean)v, Getter = (o) => ((TMPro.TMP_InputField)o).interactable, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_InputField)o).interactable; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "transition", PropertyType = typeof(UnityEngine.UI.Selectable.Transition), Setter = (o, v) => ((TMPro.TMP_InputField)o).transition = (UnityEngine.UI.Selectable.Transition)v, Getter = (o) => ((TMPro.TMP_InputField)o).transition, Updater = (object o, ref object v) => { var x = (int)((TMPro.TMP_InputField)o).transition; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "targetGraphic", PropertyType = typeof(UnityEngine.UI.Graphic), Setter = (o, v) => ((TMPro.TMP_InputField)o).targetGraphic = (UnityEngine.UI.Graphic)v, Getter = (o) => ((TMPro.TMP_InputField)o).targetGraphic, },
+                new UnityProperty { Name = "colors", PropertyType = typeof(UnityEngine.UI.ColorBlock), Setter = (o, v) => ((TMPro.TMP_InputField)o).colors = (UnityEngine.UI.ColorBlock)v, Getter = (o) => ((TMPro.TMP_InputField)o).colors, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_InputField)o).colors; if (!x.Equals((UnityEngine.UI.ColorBlock)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "navigation", PropertyType = typeof(UnityEngine.UI.Navigation), Setter = (o, v) => ((TMPro.TMP_InputField)o).navigation = (UnityEngine.UI.Navigation)v, Getter = (o) => ((TMPro.TMP_InputField)o).navigation, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_InputField)o).navigation; if (!x.Equals((UnityEngine.UI.Navigation)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "textViewport", PropertyType = typeof(UnityEngine.RectTransform), Setter = (o, v) => ((TMPro.TMP_InputField)o).textViewport = (UnityEngine.RectTransform)v, Getter = (o) => ((TMPro.TMP_InputField)o).textViewport, },
+                new UnityProperty { Name = "textComponent", PropertyType = typeof(TMPro.TMP_Text), Setter = (o, v) => ((TMPro.TMP_InputField)o).textComponent = (TMPro.TMP_Text)v, Getter = (o) => ((TMPro.TMP_InputField)o).textComponent, },
+                new UnityProperty { Name = "text", PropertyType = typeof(System.String), Setter = (o, v) => ((TMPro.TMP_InputField)o).text = (System.String)v, Getter = (o) => ((TMPro.TMP_InputField)o).text, },
+                new UnityProperty { Name = "fontAsset", PropertyType = typeof(TMPro.TMP_FontAsset), Setter = (o, v) => ((TMPro.TMP_InputField)o).fontAsset = (TMPro.TMP_FontAsset)v, Getter = (o) => ((TMPro.TMP_InputField)o).fontAsset, },
+                new UnityProperty { Name = "pointSize", PropertyType = typeof(System.Single), Setter = (o, v) => ((TMPro.TMP_InputField)o).pointSize = (System.Single)v, Getter = (o) => ((TMPro.TMP_InputField)o).pointSize, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_InputField)o).pointSize; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "characterLimit", PropertyType = typeof(System.Int32), Setter = (o, v) => ((TMPro.TMP_InputField)o).characterLimit = (System.Int32)v, Getter = (o) => ((TMPro.TMP_InputField)o).characterLimit, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_InputField)o).characterLimit; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "contentType", PropertyType = typeof(TMPro.TMP_InputField.ContentType), Setter = (o, v) => ((TMPro.TMP_InputField)o).contentType = (TMPro.TMP_InputField.ContentType)v, Getter = (o) => ((TMPro.TMP_InputField)o).contentType, Updater = (object o, ref object v) => { var x = (int)((TMPro.TMP_InputField)o).contentType; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "lineType", PropertyType = typeof(TMPro.TMP_InputField.LineType), Setter = (o, v) => ((TMPro.TMP_InputField)o).lineType = (TMPro.TMP_InputField.LineType)v, Getter = (o) => ((TMPro.TMP_InputField)o).lineType, Updater = (object o, ref object v) => { var x = (int)((TMPro.TMP_InputField)o).lineType; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "placeholder", PropertyType = typeof(UnityEngine.UI.Graphic), Setter = (o, v) => ((TMPro.TMP_InputField)o).placeholder = (UnityEngine.UI.Graphic)v, Getter = (o) => ((TMPro.TMP_InputField)o).placeholder, },
+                new UnityProperty { Name = "verticalScrollbar", PropertyType = typeof(UnityEngine.UI.Scrollbar), Setter = (o, v) => ((TMPro.TMP_InputField)o).verticalScrollbar = (UnityEngine.UI.Scrollbar)v, Getter = (o) => ((TMPro.TMP_InputField)o).verticalScrollbar, },
+                new UnityProperty { Name = "caretBlinkRate", PropertyType = typeof(System.Single), Setter = (o, v) => ((TMPro.TMP_InputField)o).caretBlinkRate = (System.Single)v, Getter = (o) => ((TMPro.TMP_InputField)o).caretBlinkRate, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_InputField)o).caretBlinkRate; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "caretWidth", PropertyType = typeof(System.Int32), Setter = (o, v) => ((TMPro.TMP_InputField)o).caretWidth = (System.Int32)v, Getter = (o) => ((TMPro.TMP_InputField)o).caretWidth, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_InputField)o).caretWidth; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "customCaretColor", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TMP_InputField)o).customCaretColor = (System.Boolean)v, Getter = (o) => ((TMPro.TMP_InputField)o).customCaretColor, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_InputField)o).customCaretColor; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "selectionColor", PropertyType = typeof(UnityEngine.Color), Setter = (o, v) => ((TMPro.TMP_InputField)o).selectionColor = (UnityEngine.Color)v, Getter = (o) => ((TMPro.TMP_InputField)o).selectionColor, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_InputField)o).selectionColor; if (!x.Equals((UnityEngine.Color)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "onFocusSelectAll", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TMP_InputField)o).onFocusSelectAll = (System.Boolean)v, Getter = (o) => ((TMPro.TMP_InputField)o).onFocusSelectAll, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_InputField)o).onFocusSelectAll; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "resetOnDeActivation", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TMP_InputField)o).resetOnDeActivation = (System.Boolean)v, Getter = (o) => ((TMPro.TMP_InputField)o).resetOnDeActivation, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_InputField)o).resetOnDeActivation; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "restoreOriginalTextOnEscape", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TMP_InputField)o).restoreOriginalTextOnEscape = (System.Boolean)v, Getter = (o) => ((TMPro.TMP_InputField)o).restoreOriginalTextOnEscape, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_InputField)o).restoreOriginalTextOnEscape; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "shouldHideSoftKeyboard", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TMP_InputField)o).shouldHideSoftKeyboard = (System.Boolean)v, Getter = (o) => ((TMPro.TMP_InputField)o).shouldHideSoftKeyboard, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_InputField)o).shouldHideSoftKeyboard; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "shouldHideMobileInput", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TMP_InputField)o).shouldHideMobileInput = (System.Boolean)v, Getter = (o) => ((TMPro.TMP_InputField)o).shouldHideMobileInput, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_InputField)o).shouldHideMobileInput; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "readOnly", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TMP_InputField)o).readOnly = (System.Boolean)v, Getter = (o) => ((TMPro.TMP_InputField)o).readOnly, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_InputField)o).readOnly; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "richText", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TMP_InputField)o).richText = (System.Boolean)v, Getter = (o) => ((TMPro.TMP_InputField)o).richText, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_InputField)o).richText; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "isRichTextEditingAllowed", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TMP_InputField)o).isRichTextEditingAllowed = (System.Boolean)v, Getter = (o) => ((TMPro.TMP_InputField)o).isRichTextEditingAllowed, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_InputField)o).isRichTextEditingAllowed; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TMP_InputField)o).enabled = (System.Boolean)v, Getter = (o) => ((TMPro.TMP_InputField)o).enabled, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_InputField)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_TMPRO
+            { "TMPro.TMP_ScrollbarEventHandler", new UnityProperty[] {
+                new UnityProperty { Name = "isSelected", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TMP_ScrollbarEventHandler)o).isSelected = (System.Boolean)v, Getter = (o) => ((TMPro.TMP_ScrollbarEventHandler)o).isSelected, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_ScrollbarEventHandler)o).isSelected; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TMP_ScrollbarEventHandler)o).enabled = (System.Boolean)v, Getter = (o) => ((TMPro.TMP_ScrollbarEventHandler)o).enabled, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_ScrollbarEventHandler)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_TMPRO
+            { "TMPro.TMP_SubMesh", new UnityProperty[] {
+                new UnityProperty { Name = "fontAsset", PropertyType = typeof(TMPro.TMP_FontAsset), Setter = (o, v) => ((TMPro.TMP_SubMesh)o).fontAsset = (TMPro.TMP_FontAsset)v, Getter = (o) => ((TMPro.TMP_SubMesh)o).fontAsset, },
+                new UnityProperty { Name = "spriteAsset", PropertyType = typeof(TMPro.TMP_SpriteAsset), Setter = (o, v) => ((TMPro.TMP_SubMesh)o).spriteAsset = (TMPro.TMP_SpriteAsset)v, Getter = (o) => ((TMPro.TMP_SubMesh)o).spriteAsset, },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TMP_SubMesh)o).enabled = (System.Boolean)v, Getter = (o) => ((TMPro.TMP_SubMesh)o).enabled, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_SubMesh)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_TMPRO
+            { "TMPro.TMP_SubMeshUI", new UnityProperty[] {
+                new UnityProperty { Name = "fontAsset", PropertyType = typeof(TMPro.TMP_FontAsset), Setter = (o, v) => ((TMPro.TMP_SubMeshUI)o).fontAsset = (TMPro.TMP_FontAsset)v, Getter = (o) => ((TMPro.TMP_SubMeshUI)o).fontAsset, },
+                new UnityProperty { Name = "spriteAsset", PropertyType = typeof(TMPro.TMP_SpriteAsset), Setter = (o, v) => ((TMPro.TMP_SubMeshUI)o).spriteAsset = (TMPro.TMP_SpriteAsset)v, Getter = (o) => ((TMPro.TMP_SubMeshUI)o).spriteAsset, },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TMPro.TMP_SubMeshUI)o).enabled = (System.Boolean)v, Getter = (o) => ((TMPro.TMP_SubMeshUI)o).enabled, Updater = (object o, ref object v) => { var x = ((TMPro.TMP_SubMeshUI)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.Toggle", new UnityProperty[] {
+                new UnityProperty { Name = "interactable", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Toggle)o).interactable = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Toggle)o).interactable, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Toggle)o).interactable; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "transition", PropertyType = typeof(UnityEngine.UI.Selectable.Transition), Setter = (o, v) => ((UnityEngine.UI.Toggle)o).transition = (UnityEngine.UI.Selectable.Transition)v, Getter = (o) => ((UnityEngine.UI.Toggle)o).transition, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.Toggle)o).transition; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "targetGraphic", PropertyType = typeof(UnityEngine.UI.Graphic), Setter = (o, v) => ((UnityEngine.UI.Toggle)o).targetGraphic = (UnityEngine.UI.Graphic)v, Getter = (o) => ((UnityEngine.UI.Toggle)o).targetGraphic, },
+                new UnityProperty { Name = "colors", PropertyType = typeof(UnityEngine.UI.ColorBlock), Setter = (o, v) => ((UnityEngine.UI.Toggle)o).colors = (UnityEngine.UI.ColorBlock)v, Getter = (o) => ((UnityEngine.UI.Toggle)o).colors, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Toggle)o).colors; if (!x.Equals((UnityEngine.UI.ColorBlock)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "navigation", PropertyType = typeof(UnityEngine.UI.Navigation), Setter = (o, v) => ((UnityEngine.UI.Toggle)o).navigation = (UnityEngine.UI.Navigation)v, Getter = (o) => ((UnityEngine.UI.Toggle)o).navigation, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Toggle)o).navigation; if (!x.Equals((UnityEngine.UI.Navigation)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "isOn", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Toggle)o).isOn = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Toggle)o).isOn, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Toggle)o).isOn; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "toggleTransition", PropertyType = typeof(UnityEngine.UI.Toggle.ToggleTransition), Setter = (o, v) => ((UnityEngine.UI.Toggle)o).toggleTransition = (UnityEngine.UI.Toggle.ToggleTransition)v, Getter = (o) => ((UnityEngine.UI.Toggle)o).toggleTransition, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.UI.Toggle)o).toggleTransition; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "graphic", PropertyType = typeof(UnityEngine.UI.Graphic), Setter = (o, v) => ((UnityEngine.UI.Toggle)o).graphic = (UnityEngine.UI.Graphic)v, Getter = (o) => ((UnityEngine.UI.Toggle)o).graphic, },
+                new UnityProperty { Name = "group", PropertyType = typeof(UnityEngine.UI.ToggleGroup), Setter = (o, v) => ((UnityEngine.UI.Toggle)o).group = (UnityEngine.UI.ToggleGroup)v, Getter = (o) => ((UnityEngine.UI.Toggle)o).group, },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.Toggle)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.Toggle)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.Toggle)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_GUI
+            { "UnityEngine.UI.ToggleGroup", new UnityProperty[] {
+                new UnityProperty { Name = "allowSwitchOff", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.ToggleGroup)o).allowSwitchOff = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.ToggleGroup)o).allowSwitchOff, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.ToggleGroup)o).allowSwitchOff; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UI.ToggleGroup)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UI.ToggleGroup)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UI.ToggleGroup)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+            { "UnityEngine.TrailRenderer", new UnityProperty[] {
+                new UnityProperty { Name = "time", PropertyType = typeof(System.Single), Setter = (o, v) => ((TrailRenderer)o).time = (System.Single)v, Getter = (o) => ((TrailRenderer)o).time, Updater = (object o, ref object v) => { var x = ((TrailRenderer)o).time; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "minVertexDistance", PropertyType = typeof(System.Single), Setter = (o, v) => ((TrailRenderer)o).minVertexDistance = (System.Single)v, Getter = (o) => ((TrailRenderer)o).minVertexDistance, Updater = (object o, ref object v) => { var x = ((TrailRenderer)o).minVertexDistance; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "autodestruct", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TrailRenderer)o).autodestruct = (System.Boolean)v, Getter = (o) => ((TrailRenderer)o).autodestruct, Updater = (object o, ref object v) => { var x = ((TrailRenderer)o).autodestruct; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "emitting", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TrailRenderer)o).emitting = (System.Boolean)v, Getter = (o) => ((TrailRenderer)o).emitting, Updater = (object o, ref object v) => { var x = ((TrailRenderer)o).emitting; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "colorGradient", PropertyType = typeof(UnityEngine.Gradient), Setter = (o, v) => ((TrailRenderer)o).colorGradient = (UnityEngine.Gradient)v, Getter = (o) => ((TrailRenderer)o).colorGradient, },
+                new UnityProperty { Name = "numCornerVertices", PropertyType = typeof(System.Int32), Setter = (o, v) => ((TrailRenderer)o).numCornerVertices = (System.Int32)v, Getter = (o) => ((TrailRenderer)o).numCornerVertices, Updater = (object o, ref object v) => { var x = ((TrailRenderer)o).numCornerVertices; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "numCapVertices", PropertyType = typeof(System.Int32), Setter = (o, v) => ((TrailRenderer)o).numCapVertices = (System.Int32)v, Getter = (o) => ((TrailRenderer)o).numCapVertices, Updater = (object o, ref object v) => { var x = ((TrailRenderer)o).numCapVertices; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "alignment", PropertyType = typeof(UnityEngine.LineAlignment), Setter = (o, v) => ((TrailRenderer)o).alignment = (UnityEngine.LineAlignment)v, Getter = (o) => ((TrailRenderer)o).alignment, Updater = (object o, ref object v) => { var x = (int)((TrailRenderer)o).alignment; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "textureMode", PropertyType = typeof(UnityEngine.LineTextureMode), Setter = (o, v) => ((TrailRenderer)o).textureMode = (UnityEngine.LineTextureMode)v, Getter = (o) => ((TrailRenderer)o).textureMode, Updater = (object o, ref object v) => { var x = (int)((TrailRenderer)o).textureMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "generateLightingData", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TrailRenderer)o).generateLightingData = (System.Boolean)v, Getter = (o) => ((TrailRenderer)o).generateLightingData, Updater = (object o, ref object v) => { var x = ((TrailRenderer)o).generateLightingData; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "shadowBias", PropertyType = typeof(System.Single), Setter = (o, v) => ((TrailRenderer)o).shadowBias = (System.Single)v, Getter = (o) => ((TrailRenderer)o).shadowBias, Updater = (object o, ref object v) => { var x = ((TrailRenderer)o).shadowBias; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sharedMaterials", PropertyType = typeof(UnityEngine.Material[]), Setter = (o, v) => ((TrailRenderer)o).sharedMaterials = (UnityEngine.Material[])v, Getter = (o) => ((TrailRenderer)o).sharedMaterials, Updater = (object o, ref object v) => { var x = ((TrailRenderer)o).sharedMaterials; if (x.Length != ((UnityEngine.Material[])v).Length) { v = x; return true; } else { v = x; return false; }} },
+                new UnityProperty { Name = "shadowCastingMode", PropertyType = typeof(UnityEngine.Rendering.ShadowCastingMode), Setter = (o, v) => ((TrailRenderer)o).shadowCastingMode = (UnityEngine.Rendering.ShadowCastingMode)v, Getter = (o) => ((TrailRenderer)o).shadowCastingMode, Updater = (object o, ref object v) => { var x = (int)((TrailRenderer)o).shadowCastingMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "receiveShadows", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TrailRenderer)o).receiveShadows = (System.Boolean)v, Getter = (o) => ((TrailRenderer)o).receiveShadows, Updater = (object o, ref object v) => { var x = ((TrailRenderer)o).receiveShadows; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "lightProbeUsage", PropertyType = typeof(UnityEngine.Rendering.LightProbeUsage), Setter = (o, v) => ((TrailRenderer)o).lightProbeUsage = (UnityEngine.Rendering.LightProbeUsage)v, Getter = (o) => ((TrailRenderer)o).lightProbeUsage, Updater = (object o, ref object v) => { var x = (int)((TrailRenderer)o).lightProbeUsage; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "reflectionProbeUsage", PropertyType = typeof(UnityEngine.Rendering.ReflectionProbeUsage), Setter = (o, v) => ((TrailRenderer)o).reflectionProbeUsage = (UnityEngine.Rendering.ReflectionProbeUsage)v, Getter = (o) => ((TrailRenderer)o).reflectionProbeUsage, Updater = (object o, ref object v) => { var x = (int)((TrailRenderer)o).reflectionProbeUsage; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "motionVectorGenerationMode", PropertyType = typeof(UnityEngine.MotionVectorGenerationMode), Setter = (o, v) => ((TrailRenderer)o).motionVectorGenerationMode = (UnityEngine.MotionVectorGenerationMode)v, Getter = (o) => ((TrailRenderer)o).motionVectorGenerationMode, Updater = (object o, ref object v) => { var x = (int)((TrailRenderer)o).motionVectorGenerationMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "allowOcclusionWhenDynamic", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TrailRenderer)o).allowOcclusionWhenDynamic = (System.Boolean)v, Getter = (o) => ((TrailRenderer)o).allowOcclusionWhenDynamic, Updater = (object o, ref object v) => { var x = ((TrailRenderer)o).allowOcclusionWhenDynamic; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sortingLayerID", PropertyType = typeof(System.Int32), Setter = (o, v) => ((TrailRenderer)o).sortingLayerID = (System.Int32)v, Getter = (o) => ((TrailRenderer)o).sortingLayerID, Updater = (object o, ref object v) => { var x = ((TrailRenderer)o).sortingLayerID; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sortingOrder", PropertyType = typeof(System.Int32), Setter = (o, v) => ((TrailRenderer)o).sortingOrder = (System.Int32)v, Getter = (o) => ((TrailRenderer)o).sortingOrder, Updater = (object o, ref object v) => { var x = ((TrailRenderer)o).sortingOrder; if (!x.Equals((System.Int32)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((TrailRenderer)o).enabled = (System.Boolean)v, Getter = (o) => ((TrailRenderer)o).enabled, Updater = (object o, ref object v) => { var x = ((TrailRenderer)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+
+
+            { "UnityEngine.Transform", new UnityProperty[] {
+                new UnityProperty { Name = "localPosition", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((Transform)o).localPosition = (UnityEngine.Vector3)v, Getter = (o) => ((Transform)o).localPosition, Updater = (object o, ref object v) => { var x = ((Transform)o).localPosition; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "localRotation", PropertyType = typeof(UnityEngine.Quaternion), Setter = (o, v) => ((Transform)o).localRotation = (UnityEngine.Quaternion)v, Getter = (o) => ((Transform)o).localRotation, Updater = (object o, ref object v) => { var x = ((Transform)o).localRotation; if (!x.Equals((UnityEngine.Quaternion)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "localScale", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((Transform)o).localScale = (UnityEngine.Vector3)v, Getter = (o) => ((Transform)o).localScale, Updater = (object o, ref object v) => { var x = ((Transform)o).localScale; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+            }},
+
+
+        #if UNITY_2021_2_OR_NEWER&&UNITY_UIELEMENTS
+            { "UnityEngine.UIElements.UIDocument", new UnityProperty[] {
+                new UnityProperty { Name = "panelSettings", PropertyType = typeof(UnityEngine.UIElements.PanelSettings), Setter = (o, v) => ((UnityEngine.UIElements.UIDocument)o).panelSettings = (UnityEngine.UIElements.PanelSettings)v, Getter = (o) => ((UnityEngine.UIElements.UIDocument)o).panelSettings, },
+                new UnityProperty { Name = "visualTreeAsset", PropertyType = typeof(UnityEngine.UIElements.VisualTreeAsset), Setter = (o, v) => ((UnityEngine.UIElements.UIDocument)o).visualTreeAsset = (UnityEngine.UIElements.VisualTreeAsset)v, Getter = (o) => ((UnityEngine.UIElements.UIDocument)o).visualTreeAsset, },
+                new UnityProperty { Name = "sortingOrder", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.UIElements.UIDocument)o).sortingOrder = (System.Single)v, Getter = (o) => ((UnityEngine.UIElements.UIDocument)o).sortingOrder, Updater = (object o, ref object v) => { var x = ((UnityEngine.UIElements.UIDocument)o).sortingOrder; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.UIElements.UIDocument)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.UIElements.UIDocument)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.UIElements.UIDocument)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_VIDEO
+            { "UnityEngine.Video.VideoPlayer", new UnityProperty[] {
+                new UnityProperty { Name = "source", PropertyType = typeof(UnityEngine.Video.VideoSource), Setter = (o, v) => ((UnityEngine.Video.VideoPlayer)o).source = (UnityEngine.Video.VideoSource)v, Getter = (o) => ((UnityEngine.Video.VideoPlayer)o).source, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.Video.VideoPlayer)o).source; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "clip", PropertyType = typeof(UnityEngine.Video.VideoClip), Setter = (o, v) => ((UnityEngine.Video.VideoPlayer)o).clip = (UnityEngine.Video.VideoClip)v, Getter = (o) => ((UnityEngine.Video.VideoPlayer)o).clip, },
+                new UnityProperty { Name = "url", PropertyType = typeof(System.String), Setter = (o, v) => ((UnityEngine.Video.VideoPlayer)o).url = (System.String)v, Getter = (o) => ((UnityEngine.Video.VideoPlayer)o).url, },
+                new UnityProperty { Name = "playOnAwake", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Video.VideoPlayer)o).playOnAwake = (System.Boolean)v, Getter = (o) => ((UnityEngine.Video.VideoPlayer)o).playOnAwake, Updater = (object o, ref object v) => { var x = ((UnityEngine.Video.VideoPlayer)o).playOnAwake; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "waitForFirstFrame", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Video.VideoPlayer)o).waitForFirstFrame = (System.Boolean)v, Getter = (o) => ((UnityEngine.Video.VideoPlayer)o).waitForFirstFrame, Updater = (object o, ref object v) => { var x = ((UnityEngine.Video.VideoPlayer)o).waitForFirstFrame; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "isLooping", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Video.VideoPlayer)o).isLooping = (System.Boolean)v, Getter = (o) => ((UnityEngine.Video.VideoPlayer)o).isLooping, Updater = (object o, ref object v) => { var x = ((UnityEngine.Video.VideoPlayer)o).isLooping; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "skipOnDrop", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Video.VideoPlayer)o).skipOnDrop = (System.Boolean)v, Getter = (o) => ((UnityEngine.Video.VideoPlayer)o).skipOnDrop, Updater = (object o, ref object v) => { var x = ((UnityEngine.Video.VideoPlayer)o).skipOnDrop; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "playbackSpeed", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.Video.VideoPlayer)o).playbackSpeed = (System.Single)v, Getter = (o) => ((UnityEngine.Video.VideoPlayer)o).playbackSpeed, Updater = (object o, ref object v) => { var x = ((UnityEngine.Video.VideoPlayer)o).playbackSpeed; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "renderMode", PropertyType = typeof(UnityEngine.Video.VideoRenderMode), Setter = (o, v) => ((UnityEngine.Video.VideoPlayer)o).renderMode = (UnityEngine.Video.VideoRenderMode)v, Getter = (o) => ((UnityEngine.Video.VideoPlayer)o).renderMode, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.Video.VideoPlayer)o).renderMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "targetCamera", PropertyType = typeof(UnityEngine.Camera), Setter = (o, v) => ((UnityEngine.Video.VideoPlayer)o).targetCamera = (UnityEngine.Camera)v, Getter = (o) => ((UnityEngine.Video.VideoPlayer)o).targetCamera, },
+                new UnityProperty { Name = "targetCameraAlpha", PropertyType = typeof(System.Single), Setter = (o, v) => ((UnityEngine.Video.VideoPlayer)o).targetCameraAlpha = (System.Single)v, Getter = (o) => ((UnityEngine.Video.VideoPlayer)o).targetCameraAlpha, Updater = (object o, ref object v) => { var x = ((UnityEngine.Video.VideoPlayer)o).targetCameraAlpha; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "targetCamera3DLayout", PropertyType = typeof(UnityEngine.Video.Video3DLayout), Setter = (o, v) => ((UnityEngine.Video.VideoPlayer)o).targetCamera3DLayout = (UnityEngine.Video.Video3DLayout)v, Getter = (o) => ((UnityEngine.Video.VideoPlayer)o).targetCamera3DLayout, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.Video.VideoPlayer)o).targetCamera3DLayout; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "aspectRatio", PropertyType = typeof(UnityEngine.Video.VideoAspectRatio), Setter = (o, v) => ((UnityEngine.Video.VideoPlayer)o).aspectRatio = (UnityEngine.Video.VideoAspectRatio)v, Getter = (o) => ((UnityEngine.Video.VideoPlayer)o).aspectRatio, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.Video.VideoPlayer)o).aspectRatio; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "audioOutputMode", PropertyType = typeof(UnityEngine.Video.VideoAudioOutputMode), Setter = (o, v) => ((UnityEngine.Video.VideoPlayer)o).audioOutputMode = (UnityEngine.Video.VideoAudioOutputMode)v, Getter = (o) => ((UnityEngine.Video.VideoPlayer)o).audioOutputMode, Updater = (object o, ref object v) => { var x = (int)((UnityEngine.Video.VideoPlayer)o).audioOutputMode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "controlledAudioTrackCount", PropertyType = typeof(System.UInt16), Setter = (o, v) => ((UnityEngine.Video.VideoPlayer)o).controlledAudioTrackCount = (System.UInt16)v, Getter = (o) => ((UnityEngine.Video.VideoPlayer)o).controlledAudioTrackCount, Updater = (object o, ref object v) => { var x = ((UnityEngine.Video.VideoPlayer)o).controlledAudioTrackCount; if (!x.Equals((System.UInt16)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((UnityEngine.Video.VideoPlayer)o).enabled = (System.Boolean)v, Getter = (o) => ((UnityEngine.Video.VideoPlayer)o).enabled, Updater = (object o, ref object v) => { var x = ((UnityEngine.Video.VideoPlayer)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_VEHICLES
+            { "UnityEngine.WheelCollider", new UnityProperty[] {
+                new UnityProperty { Name = "mass", PropertyType = typeof(System.Single), Setter = (o, v) => ((WheelCollider)o).mass = (System.Single)v, Getter = (o) => ((WheelCollider)o).mass, Updater = (object o, ref object v) => { var x = ((WheelCollider)o).mass; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "radius", PropertyType = typeof(System.Single), Setter = (o, v) => ((WheelCollider)o).radius = (System.Single)v, Getter = (o) => ((WheelCollider)o).radius, Updater = (object o, ref object v) => { var x = ((WheelCollider)o).radius; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "wheelDampingRate", PropertyType = typeof(System.Single), Setter = (o, v) => ((WheelCollider)o).wheelDampingRate = (System.Single)v, Getter = (o) => ((WheelCollider)o).wheelDampingRate, Updater = (object o, ref object v) => { var x = ((WheelCollider)o).wheelDampingRate; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "suspensionDistance", PropertyType = typeof(System.Single), Setter = (o, v) => ((WheelCollider)o).suspensionDistance = (System.Single)v, Getter = (o) => ((WheelCollider)o).suspensionDistance, Updater = (object o, ref object v) => { var x = ((WheelCollider)o).suspensionDistance; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "forceAppPointDistance", PropertyType = typeof(System.Single), Setter = (o, v) => ((WheelCollider)o).forceAppPointDistance = (System.Single)v, Getter = (o) => ((WheelCollider)o).forceAppPointDistance, Updater = (object o, ref object v) => { var x = ((WheelCollider)o).forceAppPointDistance; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "center", PropertyType = typeof(UnityEngine.Vector3), Setter = (o, v) => ((WheelCollider)o).center = (UnityEngine.Vector3)v, Getter = (o) => ((WheelCollider)o).center, Updater = (object o, ref object v) => { var x = ((WheelCollider)o).center; if (!x.Equals((UnityEngine.Vector3)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "suspensionSpring", PropertyType = typeof(UnityEngine.JointSpring), Setter = (o, v) => ((WheelCollider)o).suspensionSpring = (UnityEngine.JointSpring)v, Getter = (o) => ((WheelCollider)o).suspensionSpring, Updater = (object o, ref object v) => { var x = ((WheelCollider)o).suspensionSpring; if (!x.Equals((UnityEngine.JointSpring)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "forwardFriction", PropertyType = typeof(UnityEngine.WheelFrictionCurve), Setter = (o, v) => ((WheelCollider)o).forwardFriction = (UnityEngine.WheelFrictionCurve)v, Getter = (o) => ((WheelCollider)o).forwardFriction, Updater = (object o, ref object v) => { var x = ((WheelCollider)o).forwardFriction; if (!x.Equals((UnityEngine.WheelFrictionCurve)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "sidewaysFriction", PropertyType = typeof(UnityEngine.WheelFrictionCurve), Setter = (o, v) => ((WheelCollider)o).sidewaysFriction = (UnityEngine.WheelFrictionCurve)v, Getter = (o) => ((WheelCollider)o).sidewaysFriction, Updater = (object o, ref object v) => { var x = ((WheelCollider)o).sidewaysFriction; if (!x.Equals((UnityEngine.WheelFrictionCurve)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((WheelCollider)o).enabled = (System.Boolean)v, Getter = (o) => ((WheelCollider)o).enabled, Updater = (object o, ref object v) => { var x = ((WheelCollider)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_PHYSICS_2D
+            { "UnityEngine.WheelJoint2D", new UnityProperty[] {
+                new UnityProperty { Name = "enableCollision", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((WheelJoint2D)o).enableCollision = (System.Boolean)v, Getter = (o) => ((WheelJoint2D)o).enableCollision, Updater = (object o, ref object v) => { var x = ((WheelJoint2D)o).enableCollision; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedBody", PropertyType = typeof(UnityEngine.Rigidbody2D), Setter = (o, v) => ((WheelJoint2D)o).connectedBody = (UnityEngine.Rigidbody2D)v, Getter = (o) => ((WheelJoint2D)o).connectedBody, },
+                new UnityProperty { Name = "autoConfigureConnectedAnchor", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((WheelJoint2D)o).autoConfigureConnectedAnchor = (System.Boolean)v, Getter = (o) => ((WheelJoint2D)o).autoConfigureConnectedAnchor, Updater = (object o, ref object v) => { var x = ((WheelJoint2D)o).autoConfigureConnectedAnchor; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "anchor", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((WheelJoint2D)o).anchor = (UnityEngine.Vector2)v, Getter = (o) => ((WheelJoint2D)o).anchor, Updater = (object o, ref object v) => { var x = ((WheelJoint2D)o).anchor; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "connectedAnchor", PropertyType = typeof(UnityEngine.Vector2), Setter = (o, v) => ((WheelJoint2D)o).connectedAnchor = (UnityEngine.Vector2)v, Getter = (o) => ((WheelJoint2D)o).connectedAnchor, Updater = (object o, ref object v) => { var x = ((WheelJoint2D)o).connectedAnchor; if (!x.Equals((UnityEngine.Vector2)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "suspension", PropertyType = typeof(UnityEngine.JointSuspension2D), Setter = (o, v) => ((WheelJoint2D)o).suspension = (UnityEngine.JointSuspension2D)v, Getter = (o) => ((WheelJoint2D)o).suspension, Updater = (object o, ref object v) => { var x = ((WheelJoint2D)o).suspension; if (!x.Equals((UnityEngine.JointSuspension2D)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "useMotor", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((WheelJoint2D)o).useMotor = (System.Boolean)v, Getter = (o) => ((WheelJoint2D)o).useMotor, Updater = (object o, ref object v) => { var x = ((WheelJoint2D)o).useMotor; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "motor", PropertyType = typeof(UnityEngine.JointMotor2D), Setter = (o, v) => ((WheelJoint2D)o).motor = (UnityEngine.JointMotor2D)v, Getter = (o) => ((WheelJoint2D)o).motor, Updater = (object o, ref object v) => { var x = ((WheelJoint2D)o).motor; if (!x.Equals((UnityEngine.JointMotor2D)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakForce", PropertyType = typeof(System.Single), Setter = (o, v) => ((WheelJoint2D)o).breakForce = (System.Single)v, Getter = (o) => ((WheelJoint2D)o).breakForce, Updater = (object o, ref object v) => { var x = ((WheelJoint2D)o).breakForce; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "breakTorque", PropertyType = typeof(System.Single), Setter = (o, v) => ((WheelJoint2D)o).breakTorque = (System.Single)v, Getter = (o) => ((WheelJoint2D)o).breakTorque, Updater = (object o, ref object v) => { var x = ((WheelJoint2D)o).breakTorque; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "enabled", PropertyType = typeof(System.Boolean), Setter = (o, v) => ((WheelJoint2D)o).enabled = (System.Boolean)v, Getter = (o) => ((WheelJoint2D)o).enabled, Updater = (object o, ref object v) => { var x = ((WheelJoint2D)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+
+
+        #if UNITY_WIND
+            { "UnityEngine.WindZone", new UnityProperty[] {
+                new UnityProperty { Name = "mode", PropertyType = typeof(UnityEngine.WindZoneMode), Setter = (o, v) => ((WindZone)o).mode = (UnityEngine.WindZoneMode)v, Getter = (o) => ((WindZone)o).mode, Updater = (object o, ref object v) => { var x = (int)((WindZone)o).mode; if (!x.Equals((int)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "windMain", PropertyType = typeof(System.Single), Setter = (o, v) => ((WindZone)o).windMain = (System.Single)v, Getter = (o) => ((WindZone)o).windMain, Updater = (object o, ref object v) => { var x = ((WindZone)o).windMain; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "windTurbulence", PropertyType = typeof(System.Single), Setter = (o, v) => ((WindZone)o).windTurbulence = (System.Single)v, Getter = (o) => ((WindZone)o).windTurbulence, Updater = (object o, ref object v) => { var x = ((WindZone)o).windTurbulence; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "windPulseMagnitude", PropertyType = typeof(System.Single), Setter = (o, v) => ((WindZone)o).windPulseMagnitude = (System.Single)v, Getter = (o) => ((WindZone)o).windPulseMagnitude, Updater = (object o, ref object v) => { var x = ((WindZone)o).windPulseMagnitude; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+                new UnityProperty { Name = "windPulseFrequency", PropertyType = typeof(System.Single), Setter = (o, v) => ((WindZone)o).windPulseFrequency = (System.Single)v, Getter = (o) => ((WindZone)o).windPulseFrequency, Updater = (object o, ref object v) => { var x = ((WindZone)o).windPulseFrequency; if (!x.Equals((System.Single)v)) { v = x; return true; } return false; } },
+            }},
+        #endif
+        };
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/Generated/ProximaReflection.Generated.cs.meta b/Assets/Proxima/Runtime/Generated/ProximaReflection.Generated.cs.meta
new file mode 100644
index 0000000..0ca6b0b
--- /dev/null
+++ b/Assets/Proxima/Runtime/Generated/ProximaReflection.Generated.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 195ceee437781954394800fb2b18ed2e
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/Generated/ProximaReflection.Template.cs b/Assets/Proxima/Runtime/Generated/ProximaReflection.Template.cs
new file mode 100644
index 0000000..285276f
--- /dev/null
+++ b/Assets/Proxima/Runtime/Generated/ProximaReflection.Template.cs
@@ -0,0 +1,15 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace Proxima
+{
+    using UnityProperty = ProximaComponentCommands.PropertyInfo;
+
+    internal static class ProximaReflection_Template
+    {
+        public static Dictionary<string, UnityProperty[]> Properties = new Dictionary<string, UnityProperty[]>
+        {
+            // <Auto-generated>
+        };
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/Generated/ProximaReflection.Template.cs.meta b/Assets/Proxima/Runtime/Generated/ProximaReflection.Template.cs.meta
new file mode 100644
index 0000000..2490433
--- /dev/null
+++ b/Assets/Proxima/Runtime/Generated/ProximaReflection.Template.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b4fde9a24ee322043a11937afe647590
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/Proxima.asmdef b/Assets/Proxima/Runtime/Proxima.asmdef
new file mode 100644
index 0000000..dc775a0
--- /dev/null
+++ b/Assets/Proxima/Runtime/Proxima.asmdef
@@ -0,0 +1,104 @@
+{
+    "name": "Proxima",
+    "rootNamespace": "",
+    "references": [
+        "Unity.TextMeshPro"
+    ],
+    "includePlatforms": [],
+    "excludePlatforms": [],
+    "allowUnsafeCode": false,
+    "overrideReferences": true,
+    "precompiledReferences": [
+        "proxima-websocket-sharp.dll"
+    ],
+    "autoReferenced": true,
+    "defineConstraints": [],
+    "versionDefines": [
+        {
+            "name": "com.unity.modules.ai",
+            "expression": "",
+            "define": "UNITY_AI"
+        },
+        {
+            "name": "com.unity.modules.cloth",
+            "expression": "",
+            "define": "UNITY_CLOTH"
+        },
+        {
+            "name": "com.unity.modules.animation",
+            "expression": "",
+            "define": "UNITY_ANIMATION"
+        },
+        {
+            "name": "com.unity.modules.particlesystem",
+            "expression": "",
+            "define": "UNITY_PARTICLE_SYSTEM"
+        },
+        {
+            "name": "com.unity.modules.director",
+            "expression": "",
+            "define": "UNITY_DIRECTOR"
+        },
+        {
+            "name": "com.unity.modules.physics2d",
+            "expression": "",
+            "define": "UNITY_PHYSICS_2D"
+        },
+        {
+            "name": "com.unity.modules.audio",
+            "expression": "",
+            "define": "UNITY_AUDIO"
+        },
+        {
+            "name": "com.unity.modules.terrainphysics",
+            "expression": "",
+            "define": "UNITY_TERRAIN_PHYSICS"
+        },
+        {
+            "name": "com.unity.modules.tilemap",
+            "expression": "",
+            "define": "UNITY_TILEMAP"
+        },
+        {
+            "name": "com.unity.modules.video",
+            "expression": "",
+            "define": "UNITY_VIDEO"
+        },
+        {
+            "name": "com.unity.modules.physics",
+            "expression": "",
+            "define": "UNITY_PHYSICS"
+        },
+        {
+            "name": "com.unity.modules.wind",
+            "expression": "",
+            "define": "UNITY_WIND"
+        },
+        {
+            "name": "com.unity.modules.vehicles",
+            "expression": "",
+            "define": "UNITY_VEHICLES"
+        },
+        {
+            "name": "com.unity.textmeshpro",
+            "expression": "",
+            "define": "UNITY_TMPRO"
+        },
+        {
+            "name": "com.unity.modules.ui",
+            "expression": "",
+            "define": "UNITY_UI"
+        },
+        {
+            "name": "com.unity.ugui",
+            "expression": "",
+            "define": "UNITY_GUI"
+        },
+        {
+            "name": "com.unity.modules.uielements",
+            "expression": "",
+            "define": "UNITY_UIELEMENTS"
+        }
+    ],
+    "noEngineReferences": false
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/Proxima.asmdef.meta b/Assets/Proxima/Runtime/Proxima.asmdef.meta
new file mode 100644
index 0000000..1a874c7
--- /dev/null
+++ b/Assets/Proxima/Runtime/Proxima.asmdef.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 5aecca43f8b5ec34dbb52f863bdf0e59
+AssemblyDefinitionImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/ProximaCommand.cs b/Assets/Proxima/Runtime/ProximaCommand.cs
new file mode 100644
index 0000000..7d86057
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaCommand.cs
@@ -0,0 +1,25 @@
+
+using System;
+using UnityEngine.Scripting;
+
+namespace Proxima
+{
+    [AttributeUsage(AttributeTargets.Method)]
+    public class ProximaCommandAttribute : PreserveAttribute
+    {
+        public string Category;
+        public string Alias;
+        public string Description;
+        public string ExampleInput;
+        public string ExampleOutput;
+
+        public ProximaCommandAttribute(string category, string alias = "", string description = "", string exampleInput = "", string exampleOutput = "")
+        {
+            Category = category;
+            Alias = alias;
+            Description = description;
+            ExampleInput = exampleInput;
+            ExampleOutput = exampleOutput;
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/ProximaCommand.cs.meta b/Assets/Proxima/Runtime/ProximaCommand.cs.meta
new file mode 100644
index 0000000..c986dc7
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaCommand.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 99574471972d90040a8d9e1fd8bc45da
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/ProximaCommandHelpers.cs b/Assets/Proxima/Runtime/ProximaCommandHelpers.cs
new file mode 100644
index 0000000..861126f
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaCommandHelpers.cs
@@ -0,0 +1,353 @@
+using System;
+using System.Reflection;
+using System.Collections.Generic;
+using System.Text.RegularExpressions;
+using UnityEngine;
+using UnityEngine.Scripting;
+
+namespace Proxima
+{
+    public interface IPropertyOrValue
+    {
+        object Get(Type type);
+    }
+
+    public struct PropertyOrValue<T> : IPropertyOrValue
+    {
+        private string _pattern;
+
+        [Preserve]
+        public PropertyOrValue(string pattern)
+        {
+            _pattern = pattern;
+        }
+
+        public bool IsSet => !string.IsNullOrEmpty(_pattern);
+
+        public T Get()
+        {
+            return (T)Get(typeof(T));
+        }
+
+        public object Get(Type type)
+        {
+            var properties = ProximaCommandHelpers.FindProperties(_pattern);
+            if (properties.Count > 1)
+            {
+                throw new Exception("Multiple properties found that match pattern.");
+            }
+
+            if (properties.Count == 1)
+            {
+                var property = properties[0];
+                if (property.CanRead && property.Type.IsAssignableFrom(type))
+                {
+                    return property.GetValue();
+                }
+            }
+
+            return ProximaSerialization.Deserialize(type, _pattern);
+        }
+
+        public T GetOrDefault(T defaultValue = default)
+        {
+            if (!IsSet)
+            {
+                return defaultValue;
+            }
+
+            return Get();
+        }
+    }
+
+    public static class ProximaCommandHelpers
+    {
+        public static List<GameObject> FindGameObjects(string name)
+        {
+            #if UNITY_2023_1_OR_NEWER
+                var allGameObjects = GameObject.FindObjectsByType<GameObject>(FindObjectsInactive.Include, FindObjectsSortMode.None);
+            #elif UNITY_2020_1_OR_NEWER
+                var allGameObjects = GameObject.FindObjectsOfType<GameObject>(true);
+            #else
+                #pragma warning disable 612, 618
+                var allGameObjects = (GameObject[]) GameObject.FindObjectsOfTypeAll(typeof(GameObject));
+                #pragma warning restore 612, 618
+            #endif
+
+            var objects = new List<GameObject>();
+
+            if (name.StartsWith("[") && name.EndsWith("]") && int.TryParse(name.Substring(1, name.Length - 2), out var id))
+            {
+                foreach (var o in allGameObjects)
+                {
+                    if (o.GetInstanceID() == id)
+                    {
+                        objects.Add(o);
+                        break;
+                    }
+                }
+            }
+            else
+            {
+                var regex = new Regex("^" + Regex.Escape(name).Replace("\\*", ".*?") + "$", RegexOptions.IgnoreCase);
+                foreach (var o in allGameObjects)
+                {
+                    if (o.scene.isLoaded && regex.IsMatch(o.name))
+                    {
+                        objects.Add(o);
+                    }
+                }
+            }
+
+            objects.Sort((a, b) => a.name.ToLower().CompareTo(b.name.ToLower()));
+            return objects;
+        }
+
+        internal static List<PropertyOrField> FindProperties(string pattern)
+        {
+            var result = new List<PropertyOrField>();
+            var idx = pattern.IndexOf('.');
+            if (idx == -1)
+            {
+                return result;
+            }
+
+            var objectName = pattern.Substring(0, idx);
+            var rest = pattern.Substring(idx + 1);
+
+            foreach (var unityStatic in UnityStatics)
+            {
+                if (unityStatic.Name.Equals(objectName, StringComparison.OrdinalIgnoreCase))
+                {
+                    AddStaticProperty(result, unityStatic, rest);
+                    return result;
+                }
+            }
+
+            var gameObjects = FindGameObjects(objectName);
+            foreach (var o in gameObjects)
+            {
+                result.AddRange(FindGameObjectProperties(o, rest));
+            }
+
+            return result;
+        }
+
+        public static Type FindFirstComponentType(string className)
+        {
+            var fullType = Type.GetType(className, false, true);
+            if (fullType != null)
+            {
+                return fullType.IsSubclassOf(typeof(UnityEngine.Component)) ? fullType : null;
+            }
+
+            foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
+            {
+                foreach (var type in a.GetTypes())
+                {
+                    if (type.IsSubclassOf(typeof(UnityEngine.Component)) &&
+                        type.Name.Equals(className, StringComparison.OrdinalIgnoreCase))
+                    {
+                        return type;
+                    }
+                }
+            }
+
+            return null;
+        }
+
+        private static bool ComponentMatchesPattern(Component component, string pattern)
+        {
+            var type = component.GetType();
+            while (type != typeof(Component))
+            {
+                if (type.Name.Equals(pattern, StringComparison.OrdinalIgnoreCase))
+                {
+                    return true;
+                }
+
+                type = type.BaseType;
+            }
+
+            return false;
+        }
+
+        private static List<PropertyOrField> FindGameObjectProperties(GameObject obj, string pattern)
+        {
+            var descriptor = obj.name + " [" + obj.GetInstanceID() + "]";
+            var result = new List<PropertyOrField>();
+            if (TryAddObjectProperty(result, descriptor, obj, pattern))
+            {
+                return result;
+            }
+
+            var idx = pattern.IndexOf('.');
+            if (idx >= 0)
+            {
+                var componentName = pattern.Substring(0, idx);
+                var rest = pattern.Substring(idx + 1);
+                foreach (var component in obj.GetComponents<Component>())
+                {
+                    if (ComponentMatchesPattern(component, componentName))
+                    {
+                        TryAddObjectProperty(result, descriptor, component, rest);
+                    }
+                }
+            }
+            else
+            {
+                foreach (var component in obj.GetComponents<Component>())
+                {
+                    if (ComponentMatchesPattern(component, pattern))
+                    {
+                        result.Add(new PropertyOrField(descriptor, component));
+                    }
+                }
+            }
+
+            return result;
+        }
+
+        private static bool TryAddObjectProperty(List<PropertyOrField> list, string descriptor, object obj, string pattern)
+        {
+            var result = new List<PropertyOrField>();
+            var prop = obj.GetType().GetProperty(pattern, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
+            var field = obj.GetType().GetField(pattern, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase);
+            if (prop != null || field != null)
+            {
+                list.Add(new PropertyOrField(descriptor, obj, prop, field));
+                return true;
+            }
+
+            return false;
+        }
+
+        private static void AddStaticProperty(List<PropertyOrField> list, Type staticType, string pattern)
+        {
+            var result = new List<PropertyOrField>();
+            var prop = staticType.GetProperty(pattern, BindingFlags.Public | BindingFlags.Static | BindingFlags.IgnoreCase);
+            var field = staticType.GetField(pattern, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.IgnoreCase);
+            if (prop != null || field != null)
+            {
+                var name = prop != null ? prop.Name : field.Name;
+                list.Add(new PropertyOrField(staticType.Name + "." + name, null, prop, field));
+            }
+        }
+
+        private static Type[] UnityStatics = new Type[] {
+            typeof(Application), typeof(Time), typeof(Screen), typeof(QualitySettings), typeof(Input),
+
+            #if UNITY_PHYSICS
+                typeof(Physics),
+            #endif
+
+            #if UNITY_AUDIO
+                typeof(AudioSettings),
+            #endif
+
+            #if UNITY_PHYSICS_2D
+                typeof(Physics2D)
+            #endif
+        };
+    }
+
+    internal class PropertyOrField
+    {
+        public string Descriptor { get; set; }
+        public object Object { get; set; }
+        public PropertyInfo Property { get; set; }
+        public FieldInfo Field { get; set; }
+        public object Value { get; set; }
+
+        public PropertyOrField(string descriptor, object obj, PropertyInfo property, FieldInfo field)
+        {
+            Descriptor = descriptor;
+            Object = obj;
+            Property = property;
+            Field = field;
+        }
+
+        public PropertyOrField(string descriptor, object value)
+        {
+            Descriptor = descriptor;
+            Value = value;
+        }
+
+        public void SetValue(object value)
+        {
+            if (Property != null && Property.CanWrite)
+            {
+                Property.SetValue(Object, value);
+            }
+            else if (Field != null)
+            {
+                Field.SetValue(Object, value);
+            }
+        }
+
+        public object GetValue()
+        {
+            if (Property != null && Property.CanRead)
+            {
+                return Property.GetValue(Object);
+            }
+            else if (Field != null)
+            {
+                return Field.GetValue(Object);
+            }
+            else
+            {
+                return Value;
+            }
+        }
+
+        public Type Type
+        {
+            get
+            {
+                if (Property != null)
+                {
+                    return Property.PropertyType;
+                }
+                else if (Field != null)
+                {
+                    return Field.FieldType;
+                }
+                else
+                {
+                    return Value?.GetType();
+                }
+            }
+        }
+
+        public bool CanWrite
+        {
+            get
+            {
+                if (Property != null)
+                {
+                    return Property.CanWrite;
+                }
+                else
+                {
+                    return Field != null;
+                }
+            }
+        }
+
+        public bool CanRead
+        {
+            get
+            {
+                if (Property != null)
+                {
+                    return Property.CanRead;
+                }
+                else
+                {
+                    return Field != null || Value != null;
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/ProximaCommandHelpers.cs.meta b/Assets/Proxima/Runtime/ProximaCommandHelpers.cs.meta
new file mode 100644
index 0000000..91d3a1d
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaCommandHelpers.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 1e0f703866146ad4d9d9ef9f598eb95f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/ProximaComponentCommands.cs b/Assets/Proxima/Runtime/ProximaComponentCommands.cs
new file mode 100644
index 0000000..0a45ad2
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaComponentCommands.cs
@@ -0,0 +1,785 @@
+using System;
+using System.Linq;
+using System.Collections;
+using System.Collections.Generic;
+using System.Reflection;
+using UnityEngine;
+using UnityEngine.Scripting;
+
+namespace Proxima
+{
+    internal delegate void PropertySetter(object obj, object value);
+    internal delegate object PropertyGetter(object obj);
+    internal delegate bool PropertyUpdater(object obj, ref object value);
+
+    internal class ProximaComponentCommands
+    {
+        [Serializable]
+        internal class ButtonInfo
+        {
+            public string Id;
+            public string Text;
+
+            [NonSerialized]
+            public MethodInfo Method;
+        }
+
+        [Serializable]
+        internal class PropertyInfo
+        {
+            public string Name;
+            public string Type;
+
+            [SerializeIf("ShouldSerializeValue")]
+            public object Value;
+
+            [Preserve]
+            public bool ShouldSerializeValue()
+            {
+                return Children == null;
+            }
+
+            public object Children;
+            public List<PropertyInfo> ChildProps => (List<PropertyInfo>)Children;
+
+            [NonSerialized]
+            public PropertySetter Setter;
+
+            [NonSerialized]
+            public PropertyGetter Getter;
+
+            [NonSerialized]
+            public PropertyUpdater Updater;
+
+            [NonSerialized]
+            public Type PropertyType;
+        }
+
+        [Serializable]
+        internal class ComponentInfo
+        {
+            public int Id;
+            public int Order;
+            public string Name;
+            public object Properties;
+            public List<PropertyInfo> Props => (List<PropertyInfo>)Properties;
+            public object Buttons;
+            public List<ButtonInfo> Btns => (List<ButtonInfo>)Buttons;
+
+            [NonSerialized]
+            public Component Component;
+
+            [NonSerialized]
+            public bool Temp;
+        }
+
+        [Serializable]
+        internal class ComponentList
+        {
+            public object Components = new List<ComponentInfo>();
+            public List<ComponentInfo> Comps => (List<ComponentInfo>)Components;
+            public List<int> Destroyed = new List<int>();
+        }
+
+        private static Dictionary<int, ComponentStream> _goToStream;
+        private static Dictionary<string, ComponentStream> _streams;
+        private static Dictionary<int, ComponentInfo> _idToComponentInfo;
+        public static Dictionary<int, ComponentInfo> IdToComponentInfo => _idToComponentInfo;
+
+        private static List<ComponentInfo> _pool = new List<ComponentInfo>();
+        private static readonly int _poolSize = 25;
+
+        internal static Action<Component, ComponentInfo> ProHook_CreateComponentButtons;
+
+        private static ComponentInfo GetFromPool(int id, string name, Component component, bool temp)
+        {
+            ComponentInfo info;
+            if (_pool.Count > 0)
+            {
+                info = _pool[_pool.Count - 1];
+                _pool.RemoveAt(_pool.Count - 1);
+            }
+            else
+            {
+                info = new ComponentInfo {
+                    Properties = new List<PropertyInfo>(),
+                    Buttons = new List<ButtonInfo>()
+                };
+            }
+
+            info.Id = id;
+            info.Name = name;
+            info.Component = component;
+            info.Temp = temp;
+            return info;
+        }
+
+        private static void ReturnToPool(ComponentInfo info)
+        {
+            if (_pool.Count >= _poolSize)
+            {
+                return;
+            }
+
+            info.Id = 0;
+            info.Name = null;
+            info.Component = null;
+            info.Props.Clear();
+            info.Btns.Clear();
+            _pool.Add(info);
+        }
+
+        private static bool AreEqual(object lhs, object rhs)
+        {
+            if (lhs == null && rhs == null)
+            {
+                return true;
+            }
+
+            if (lhs == null || rhs == null)
+            {
+                return false;
+            }
+
+            return lhs.Equals(rhs);
+        }
+
+        [ProximaInitialize]
+        public static void Init()
+        {
+            _goToStream = new Dictionary<int, ComponentStream>();
+            _streams = new Dictionary<string, ComponentStream>();
+            _idToComponentInfo = new Dictionary<int, ComponentInfo>();
+        }
+
+        [ProximaTeardown]
+        public static void Teardown()
+        {
+            foreach (var stream in _streams.Values)
+            {
+                stream.Cleanup();
+            }
+
+            _goToStream.Clear();
+            _streams.Clear();
+            _idToComponentInfo.Clear();
+        }
+
+        private class ComponentStream
+        {
+            public HashSet<string> ActiveStreamIds = new HashSet<string>();
+            public HashSet<string> PendingStreamIds = new HashSet<string>();
+            public int GameObjectId;
+
+            private List<Component> _components = new List<Component>();
+            private ComponentList _componentList = new ComponentList();
+            private ComponentList _changeList = new ComponentList();
+            private int _lastUpdateFrame;
+            private int _lastUpdatedIndex;
+
+            public ComponentList Update(string id)
+            {
+                UpdateChangeList();
+
+                if (PendingStreamIds.Contains(id))
+                {
+                    PendingStreamIds.Remove(id);
+                    ActiveStreamIds.Add(id);
+                    return _componentList;
+                }
+
+                bool changed = _changeList.Comps.Count > 0 || _changeList.Destroyed.Count > 0;
+                return changed ? _changeList : null;
+            }
+
+            public void Cleanup()
+            {
+                foreach (var ci in _componentList.Comps)
+                {
+                    _idToComponentInfo.Remove(ci.Id);
+                    ReturnToPool(ci);
+                }
+            }
+
+            private void UpdateChangeList()
+            {
+                if (_lastUpdateFrame == Time.frameCount)
+                {
+                    return;
+                }
+
+                _lastUpdateFrame = Time.frameCount;
+
+                var cis = _changeList.Comps;
+                for (int i = 0 ; i < cis.Count; i++)
+                {
+                    if (cis[i].Temp)
+                    {
+                        ReturnToPool(cis[i]);
+                    }
+                }
+
+                _changeList.Comps.Clear();
+                _changeList.Destroyed.Clear();
+
+                if (!ProximaGameObjectCommands.IdToGameObject.TryGetValue(GameObjectId, out var go) || !go)
+                {
+                    return;
+                }
+
+                go.GetComponents(_components);
+                UpdateDeletedComponents();
+
+                if (_lastUpdatedIndex >= _components.Count)
+                {
+                    if (_lastUpdatedIndex < ProximaInspector.MaxComponentUpdateFrequency)
+                    {
+                        _lastUpdatedIndex++;
+                        return;
+                    }
+                    else
+                    {
+                        _lastUpdatedIndex = 0;
+                    }
+                }
+
+                UpdateComponentInfo(_components[_lastUpdatedIndex], _lastUpdatedIndex);
+                _lastUpdatedIndex++;
+            }
+
+            private bool ShouldHide(Component component)
+            {
+                return !ProximaGameObjectCommands.ShowHidden && component.hideFlags.HasFlag(HideFlags.HideInInspector);
+            }
+
+            private void UpdateDeletedComponents()
+            {
+                for (int i = _componentList.Comps.Count - 1; i >= 0; i--)
+                {
+                    var ci = _componentList.Comps[i];
+                    if (!ci.Component || ShouldHide(ci.Component))
+                    {
+                        _idToComponentInfo.Remove(ci.Id);
+                        _componentList.Comps.RemoveAt(i);
+                        _changeList.Destroyed.Add(ci.Id);
+                        ReturnToPool(ci);
+                    }
+                }
+            }
+
+            private void UpdateComponentInfo(Component component, int order)
+            {
+                if (ShouldHide(component))
+                {
+                    return;
+                }
+
+                var id = component.GetInstanceID();
+                if (!_idToComponentInfo.TryGetValue(id, out var ci))
+                {
+                    ci = GetFromPool(id, component.GetType().Name, component, false);
+                    ci.Order = order;
+                    _componentList.Comps.Add(ci);
+                    _idToComponentInfo.Add(component.GetInstanceID(), ci);
+                    CreateComponentProperties(component, ci);
+                    ProHook_CreateComponentButtons?.Invoke(component, ci);
+                    _changeList.Comps.Add(ci);
+                }
+                else
+                {
+                    UpdateProperties(ci, order);
+                }
+            }
+
+            private bool CallUpdater(object parent, PropertyInfo property)
+            {
+                return property.Updater(parent, ref property.Value);
+            }
+
+            private bool UpdatePropertyValue(object parent, PropertyInfo property, bool force)
+            {
+                if (force && property.Getter != null)
+                {
+                    property.Value = property.Getter(parent);
+                    return true;
+                }
+                else if (property.Updater != null)
+                {
+                    return CallUpdater(parent, property);
+                }
+                else if (property.Getter != null)
+                {
+                    var value = property.Getter(parent);
+                    if (!AreEqual(value, property.Value))
+                    {
+                        property.Value = value;
+                        return true;
+                    }
+                }
+
+                return false;
+            }
+
+            private bool UpdateProperty(object parent, PropertyInfo property)
+            {
+                bool changed = UpdatePropertyValue(parent, property, false);
+                if (property.Value != null && property.Children != null)
+                {
+                    if (ArrayOrList.IsArrayOrList(property.PropertyType))
+                    {
+                        changed = UpdateArrayItemProperties(property) || changed;
+                    }
+
+                    if (property.ChildProps != null)
+                    {
+                        foreach (var child in property.ChildProps)
+                        {
+                            changed = UpdateProperty(property.Value, child) || changed;
+                        }
+                    }
+                }
+
+                return changed;
+            }
+
+            private void UpdateProperties(ComponentInfo ci, int order)
+            {
+                ComponentInfo clci = null;
+                for (int i = 0; i < ci.Props.Count; i++)
+                {
+                    var property = ci.Props[i];
+                    if (UpdateProperty(ci.Component, property))
+                    {
+                        if (clci == null)
+                        {
+                            clci = GetFromPool(ci.Id, ci.Name, ci.Component, true);
+                            _changeList.Comps.Add(clci);
+                        }
+
+                        clci.Props.Add(property);
+                    }
+                }
+
+                if (ci.Order != order)
+                {
+                    ci.Order = order;
+                    if (clci == null)
+                    {
+                        clci = GetFromPool(ci.Id, ci.Name, ci.Component, true);
+                        _changeList.Comps.Add(clci);
+                    }
+
+                    clci.Order = order;
+                }
+            }
+
+            private void UpdateChildProperties(PropertyGetter parentGetter, List<PropertyInfo> list)
+            {
+                var parent = parentGetter(null);
+                if (parent != null)
+                {
+                    foreach (var property in list)
+                    {
+                        UpdatePropertyValue(parent, property, false);
+                    }
+                }
+            }
+
+            private void CreateComponentProperties(Component component, ComponentInfo ci)
+            {
+                ci.Properties = new List<PropertyInfo>();
+                var type = component.GetType();
+
+                if (ProximaReflection_Generated.Properties.TryGetValue(component.GetType().FullName, out var props))
+                {
+                    CreatePropertiesFromOverride(ci, props);
+                }
+                else if (component is MonoBehaviour)
+                {
+                    CreatePropertiesForMonoBehaviour(component, ci);
+                }
+                else
+                {
+                    CreatePropertiesForNativeObject(component, ci);
+                }
+            }
+
+            private void CreatePropertiesFromOverride(ComponentInfo ci, PropertyInfo[] props)
+            {
+                foreach (var prop in props)
+                {
+                    AddPropertyRecursively(ci.Component, ci.Props, prop.Name, prop.PropertyType, prop.Setter, prop.Getter, prop.Updater);
+                }
+            }
+
+            private PropertyInfo AddPropertyToList(object parent, List<PropertyInfo> list, string name, Type type, PropertySetter setter, PropertyGetter getter, PropertyUpdater updater)
+            {
+                var propInfo = new PropertyInfo {
+                    Name = name,
+                    Type = ProximaSerialization.GetSerializedTypeName(type),
+                    PropertyType = type,
+                    Setter = setter,
+                    Getter = getter,
+                    Updater = updater
+                };
+
+                UpdatePropertyValue(parent, propInfo, true);
+                list.Add(propInfo);
+                return propInfo;
+            }
+
+            private PropertyGetter GetPropertyGetter(System.Reflection.PropertyInfo property, FieldInfo field)
+            {
+                if (property != null && property.CanRead)
+                {
+                    return property.GetValue;
+                }
+                else if (field != null)
+                {
+                    return field.GetValue;
+                }
+
+                return null;
+            }
+
+            private PropertySetter GetPropertySetter(System.Reflection.PropertyInfo property, FieldInfo field)
+            {
+                if (property != null && property.CanWrite)
+                {
+                    return property.SetValue;
+                }
+                else if (field != null)
+                {
+                    return field.SetValue;
+                }
+
+                return null;
+            }
+
+            private bool UpdateArrayItemProperties(PropertyInfo property)
+            {
+                if (property.Value == null)
+                {
+                    if (property.Children != null)
+                    {
+                        property.Children = null;
+                        return true;
+                    }
+
+                    return false;
+                }
+
+                if (property.Children == null)
+                {
+                    property.Children = new List<PropertyInfo>();
+                }
+
+                var length = ArrayOrList.Count(property.Value);
+                var oldLength = property.ChildProps.Count;
+
+                if (length < oldLength)
+                {
+                    property.ChildProps.RemoveRange(length, oldLength - length);
+                    return true;
+                }
+
+                if (length > oldLength)
+                {
+                    var elementType = ArrayOrList.GetElementType(property.PropertyType);
+                    while (length > oldLength)
+                    {
+                        var index = oldLength;
+                        PropertySetter setter = (o, v) => ArrayOrList.Set(o, index, v);
+                        PropertyGetter getter = (o) => ArrayOrList.Get(o, index);
+                        AddPropertyRecursively(property.Value, property.ChildProps, index.ToString(), elementType, setter, getter);
+                        oldLength++;
+                    }
+
+                    return true;
+                }
+
+                return false;
+            }
+
+            private void AddPropertyRecursively(object parent, List<PropertyInfo> list, string name, Type type, PropertySetter setter, PropertyGetter getter, PropertyUpdater updater = null)
+            {
+                if (HasEditor(type))
+                {
+                    AddPropertyToList(parent, list, name, type, setter, getter, updater);
+                }
+                else if (ArrayOrList.IsArrayOrList(type))
+                {
+                    var propInfo = AddPropertyToList(parent, list, name, type, setter, getter, updater);
+                    UpdateArrayItemProperties(propInfo);
+                }
+                else
+                {
+                    var propInfo = AddPropertyToList(parent, list, name, type, setter, getter, updater);
+                    propInfo.Children = new List<PropertyInfo>();
+                    if (propInfo.Value != null)
+                    {
+                        AddChildProperties(propInfo.Value, type, propInfo.ChildProps);
+                    }
+                }
+            }
+
+            private void AddPropertyRecursively(object parent, List<PropertyInfo> list, string name, System.Reflection.PropertyInfo property, FieldInfo field)
+            {
+                var type = property != null ? property.PropertyType : field.FieldType;
+                var setter = GetPropertySetter(property, field);
+                var getter = GetPropertyGetter(property, field);
+                AddPropertyRecursively(parent, list, name, type, setter, getter);
+            }
+
+            private void AddEnabledProperty(ComponentInfo ci)
+            {
+                PropertySetter setter = (c, v) => ((MonoBehaviour)c).enabled = (bool)v;
+                PropertyGetter getter = c => ((MonoBehaviour)c).enabled;
+                PropertyUpdater updater = (object o, ref object v) => { var x = ((MonoBehaviour)o).enabled; if (!x.Equals((System.Boolean)v)) { v = x; return true; } return false; };
+                AddPropertyToList(ci.Component, ci.Props, "enabled", typeof(bool), setter, getter, updater);
+            }
+
+            private static List<Type> _nativeSerializedTypes = new List<Type>() {
+                typeof(Gradient),
+                // These types are problematic because Gradient returns a new array copy in the getter.
+                // typeof(GradientColorKey), typeof(GradientAlphaKey),
+#if UNITY_PHYSICS
+                typeof(SoftJointLimit), typeof(SoftJointLimitSpring),
+                typeof(JointDrive), typeof(JointMotor), typeof(JointSpring),
+                typeof(JointLimits), typeof(WheelFrictionCurve),
+#endif
+#if UNITY_PHYSICS_2D
+                typeof(JointAngleLimits2D), typeof(JointTranslationLimits2D),
+                typeof(JointMotor2D), typeof(JointSuspension2D),
+#endif
+#if UNITY_UI
+                typeof(RectOffset),
+#endif
+            };
+
+            private void AddChildProperties(object parent, Type type, List<PropertyInfo> list)
+            {
+                foreach (var field in type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
+                {
+                    if ((field.IsPublic || field.GetCustomAttribute<SerializeField>() != null) &&
+                        field.GetCustomAttribute<HideInInspector>() == null)
+                    {
+                        // If there's a custom editor, often just changing a field will have no effect.
+                        // Search for a corresponding property we can use instead.
+                        // https://docs.unity3d.com/Manual/VariablesAndTheInspector.html
+                        var fieldWithoutPrefix =
+                            field.Name.StartsWith("m_") ? field.Name.Substring(2) :
+                            // field.Name.StartsWith("k") ? field.Name.Substring(1) : // This isn't true...
+                            field.Name.StartsWith("_") ? field.Name.Substring(1) :
+                            field.Name;
+
+                        var fieldWithoutPrefixUpperCase = fieldWithoutPrefix[0].ToString().ToUpper() + fieldWithoutPrefix.Substring(1);
+                        var property = type.GetProperties().FirstOrDefault(p => p.Name == fieldWithoutPrefix || p.Name == fieldWithoutPrefixUpperCase);
+                        if (property != null && property.PropertyType == field.FieldType && ShouldUseProperty(property))
+                        {
+                            AddPropertyRecursively(parent, list, property.Name, property, field);
+                        }
+                        else if (ShouldUseField(field))
+                        {
+                            AddPropertyRecursively(parent, list, field.Name, null, field);
+                        }
+                    }
+                }
+
+                if (_nativeSerializedTypes.Contains(type))
+                {
+                    foreach (var property in type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
+                    {
+                        if (property.CanWrite && ShouldUseProperty(property))
+                        {
+                            AddPropertyRecursively(parent, list, property.Name, property, null);
+                        }
+                    }
+                }
+            }
+
+            private void CreatePropertiesForMonoBehaviour(Component component, ComponentInfo ci)
+            {
+                AddEnabledProperty(ci);
+                AddChildProperties(component, component.GetType(), ci.Props);
+            }
+
+            private static HashSet<string> _propertySkipList = new HashSet<string>
+            {
+                "name", "tag", "hideFlags", "gameObject", "transform",
+                "camera", "light", "meshFilter", "meshRenderer", "boxCollider", "scene",
+                "material", "mesh"
+            };
+
+            private static HashSet<string> _typesWithEditor = new HashSet<string>
+            {
+                typeof(string).Name, typeof(bool).Name, typeof(byte).Name, typeof(sbyte).Name,
+                typeof(short).Name, typeof(ushort).Name,
+                typeof(int).Name, typeof(uint).Name, typeof(long).Name, typeof(ulong).Name,
+                typeof(float).Name, typeof(double).Name,
+                typeof(Vector2).Name, typeof(Vector3).Name, typeof(Vector4).Name,
+                typeof(Vector2Int).Name, typeof(Vector3Int).Name, typeof(Quaternion).Name,
+                typeof(Rect).Name, typeof(RectInt).Name, typeof(Bounds).Name, typeof(BoundsInt).Name,
+                typeof(Color).Name, typeof(LayerMask).Name
+            };
+
+            private static HashSet<string> _disallowedAttrs = new HashSet<string>
+            {
+                "HideInInspector", "ObsoleteAttribute", "NativeConditionalAttribute", "EditorBrowsableAttribute"
+            };
+
+            private bool HasEditor(Type type)
+            {
+                return _typesWithEditor.Contains(type.Name) ||
+                    type.IsEnum ||
+                    type.IsSubclassOf(typeof(UnityEngine.Object));
+            }
+
+            private bool ShouldUseType(Type type)
+            {
+                if (!type.IsArray && type.IsSerializable)
+                {
+                    return true;
+                }
+
+                if (HasEditor(type))
+                {
+                    return true;
+                }
+
+                if (type.IsArray && ShouldUseType(type.GetElementType()))
+                {
+                    return true;
+                }
+
+                if (typeof(IList).IsAssignableFrom(type) && type.IsGenericType && ShouldUseType(type.GetGenericArguments()[0]))
+                {
+                    return true;
+                }
+
+                if (_nativeSerializedTypes.Contains(type))
+                {
+                    return true;
+                }
+
+                return false;
+            }
+
+            private bool ShouldUse(IEnumerable<Attribute> attributes, string name, Type type)
+            {
+                var attrs = attributes.Select(a => a.GetType().Name);
+                return
+                    !_propertySkipList.Contains(name) &&
+                    ShouldUseType(type) &&
+                    !attrs.Intersect(_disallowedAttrs).Any();
+            }
+
+            private bool ShouldUseProperty(System.Reflection.PropertyInfo property)
+            {
+                return ShouldUse(property.GetCustomAttributes(), property.Name, property.PropertyType);
+            }
+
+            private bool ShouldUseField(FieldInfo field)
+            {
+                return ShouldUse(field.GetCustomAttributes(), field.Name, field.FieldType);
+            }
+
+            private void CreatePropertiesForNativeObject(Component component, ComponentInfo ci)
+            {
+                // Fallback to just enumerating public properties. This works well for some components.
+                foreach (var property in component.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
+                {
+                    if (ShouldUseProperty(property))
+                    {
+                        AddPropertyRecursively(ci.Component, ci.Props, property.Name, property, null);
+                    }
+                }
+            }
+        }
+
+        [ProximaStreamStart("Components")]
+        public static void StartStream(string id, int gameObjectId)
+        {
+            if (!_goToStream.TryGetValue(gameObjectId, out var stream))
+            {
+                stream = new ComponentStream();
+                stream.GameObjectId = gameObjectId;
+                _goToStream.Add(gameObjectId, stream);
+            }
+
+            stream.PendingStreamIds.Add(id);
+            _streams.Add(id, stream);
+        }
+
+        [ProximaStreamUpdate("Components")]
+        public static ComponentList UpdateStream(string id)
+        {
+            if (_streams.TryGetValue(id, out var stream))
+            {
+                return stream.Update(id);
+            }
+
+            return null;
+        }
+
+        [ProximaStreamStop("Components")]
+        public static void StopStream(string id)
+        {
+            if (_streams.TryGetValue(id, out var stream))
+            {
+                stream.PendingStreamIds.Remove(id);
+                stream.ActiveStreamIds.Remove(id);
+                if (stream.PendingStreamIds.Count == 0 && stream.ActiveStreamIds.Count == 0)
+                {
+                    stream.Cleanup();
+                    _goToStream.Remove(stream.GameObjectId);
+                }
+            }
+
+            _streams.Remove(id);
+        }
+
+        [ProximaCommand("Internal")]
+        public static void DestroyComponent(int id)
+        {
+            if (!_idToComponentInfo.TryGetValue(id, out var ci))
+            {
+                Log.Warning($"DestroyComponent: Component with id {id} not found");
+                return;
+            }
+
+            if (ci.Component)
+            {
+                UnityEngine.Object.DestroyImmediate(ci.Component);
+            }
+        }
+
+        public static object GetPropertyValueForTest(int componentId, string name)
+        {
+            if (_idToComponentInfo.TryGetValue(componentId, out var ci))
+            {
+                var prop = ci.Props.Find(p => p.Name == name);
+                if (prop != null)
+                {
+                    return prop.Getter(ci.Component);
+                }
+            }
+
+            return null;
+        }
+
+        public static Type GetPropertyTypeForTest(int componentId, string name)
+        {
+            if (_idToComponentInfo.TryGetValue(componentId, out var ci))
+            {
+                var prop = ci.Props.Find(p => p.Name == name);
+                if (prop != null)
+                {
+                    return prop.PropertyType;
+                }
+            }
+
+            return null;
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/ProximaComponentCommands.cs.meta b/Assets/Proxima/Runtime/ProximaComponentCommands.cs.meta
new file mode 100644
index 0000000..e8895f1
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaComponentCommands.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0f7284d77cab99b45a8412399566627f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/ProximaConnectUI.cs b/Assets/Proxima/Runtime/ProximaConnectUI.cs
new file mode 100644
index 0000000..f55e969
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaConnectUI.cs
@@ -0,0 +1,229 @@
+#if UNITY_TMPRO
+
+using TMPro;
+using UnityEngine;
+using UnityEngine.EventSystems;
+using UnityEngine.UI;
+
+namespace Proxima
+{
+    [HelpURL("https://www.unityproxima.com/docs")]
+    public class ProximaConnectUI : MonoBehaviour
+    {
+        // Insepctor to start and stop.
+        [SerializeField]
+        private ProximaInspector _proximaInspector;
+        public ProximaInspector ProximaInspector
+        {
+            get => _proximaInspector;
+            set => _proximaInspector = value;
+        }
+
+        // Input field to enter the display name.
+        [SerializeField]
+        private TMP_InputField _displayNameInputField;
+        public TMP_InputField DisplayNameInputField
+        {
+            get => _displayNameInputField;
+            set => _displayNameInputField = value;
+        }
+
+        // Input field to enter the password.
+        [SerializeField]
+        private TMP_InputField _passwordInputField;
+        public TMP_InputField PasswordInputField
+        {
+            get => _passwordInputField;
+            set => _passwordInputField = value;
+        }
+
+        // Text to display errors.
+        [SerializeField]
+        private TMP_Text _errorLabel;
+        public TMP_Text ErrorLabel
+        {
+            get => _errorLabel;
+            set => _errorLabel = value;
+        }
+
+        // Button to start Proxima.
+        [SerializeField]
+        private Button _startButton;
+        public Button StartButton
+        {
+            get => _startButton;
+            set => _startButton = value;
+        }
+
+        // Button to open Proxima in the browser.
+        [SerializeField]
+        private Button _openButton;
+        public Button OpenButton
+        {
+            get => _openButton;
+            set => _openButton = value;
+        }
+
+        // Button to stop Proxima.
+        [SerializeField]
+        private Button _stopButton;
+        public Button StopButton
+        {
+            get => _stopButton;
+            set => _stopButton = value;
+        }
+
+        // GameObject to show when Proxima is not started.
+        [SerializeField]
+        private GameObject _connectUIRoot;
+        public GameObject ConnectUIRoot
+        {
+            get => _connectUIRoot;
+            set => _connectUIRoot = value;
+        }
+
+        // GameObject to show when Proxima is started.
+        [SerializeField]
+        private GameObject _startedUIRoot;
+        public GameObject StartedUIRoot
+        {
+            get => _startedUIRoot;
+            set => _startedUIRoot = value;
+        }
+
+        // Button to show/hide the UI.
+        [SerializeField]
+        private Button  _showHideButton;
+        public Button ShowHideButton
+        {
+            get => _showHideButton;
+            set => _showHideButton = value;
+        }
+
+        void Start()
+        {
+            if (EventSystem.current == null)
+            {
+                gameObject.AddComponent<EventSystem>();
+                gameObject.AddComponent<StandaloneInputModule>();
+            }
+
+            _proximaInspector.Status.Changed += OnStatusChanged;
+            _displayNameInputField.text = _proximaInspector.DisplayName;
+            _displayNameInputField.onSubmit.AddListener((s) => _passwordInputField.Select());
+            _startButton.onClick.AddListener(OnStartButtonClicked);
+
+            if (_openButton)
+            {
+                #if UNITY_WEBGL && !UNITY_EDITOR
+                    var trigger = _openButton.gameObject.AddComponent<EventTrigger>();
+                    var pointerDown = new EventTrigger.Entry();
+                    pointerDown.eventID = EventTriggerType.PointerDown;
+                    pointerDown.callback.AddListener((e) => {
+                        ProximaWebGLConnection.OpenOnMouseUp(_proximaInspector.Status.ConnectInfo);
+                    });
+                    trigger.triggers.Add(pointerDown);
+                #else
+                    _openButton.onClick.AddListener(() => {
+                        Application.OpenURL(_proximaInspector.Status.ConnectInfo);
+                    });
+                #endif
+            }
+
+            _stopButton.onClick.AddListener(OnStopButtonClicked);
+            _showHideButton.onClick.AddListener(TogglePanel);
+            _passwordInputField.onSubmit.AddListener((s) => OnStartButtonClicked());
+
+            OnStatusChanged();
+        }
+
+        private void OnDestroy()
+        {
+            if (_proximaInspector)
+            {
+                _proximaInspector.Status.Changed -= OnStatusChanged;
+            }
+        }
+
+        private void OnStatusChanged()
+        {
+            _startButton.interactable = !_proximaInspector.Status.IsRunning;
+
+            if (_proximaInspector.Status.Listening)
+            {
+                _startedUIRoot.SetActive(true);
+                _connectUIRoot.SetActive(false);
+            }
+            else
+            {
+                _startedUIRoot.SetActive(false);
+                _connectUIRoot.SetActive(true);
+            }
+
+            if (_errorLabel != null)
+            {
+                _errorLabel.text = _proximaInspector.Status.Error;
+                _errorLabel.gameObject.SetActive(!string.IsNullOrWhiteSpace(_proximaInspector.Status.Error));
+            }
+        }
+
+        private void OnStartButtonClicked()
+        {
+            if (_proximaInspector != null &&
+                _passwordInputField != null &&
+                _displayNameInputField != null &&
+                !_proximaInspector.Status.IsRunning)
+            {
+                _proximaInspector.Password = _passwordInputField.text;
+                _proximaInspector.DisplayName = _displayNameInputField.text;
+                _proximaInspector.Run();
+            }
+        }
+
+        private void OnStopButtonClicked()
+        {
+            if (_proximaInspector != null)
+            {
+                _proximaInspector.Stop();
+            }
+        }
+
+        private void Update()
+        {
+            if (Input.GetKeyDown(KeyCode.Escape))
+            {
+                HidePanel();
+            }
+        }
+
+        public void ShowPanel()
+        {
+            var panel = transform.GetChild(0).gameObject;
+            panel.SetActive(true);
+        }
+
+        public void HidePanel()
+        {
+            var panel = transform.GetChild(0).gameObject;
+            panel.SetActive(false);
+        }
+
+        public void TogglePanel()
+        {
+            var panel = transform.GetChild(0).gameObject;
+            panel.SetActive(!panel.activeSelf);
+        }
+    }
+}
+
+#else
+
+namespace Proxima
+{
+    public class ProximaConnectUI : UnityEngine.MonoBehaviour
+    {
+        public ProximaInspector ProximaInspector;
+    }
+}
+
+#endif
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/ProximaConnectUI.cs.meta b/Assets/Proxima/Runtime/ProximaConnectUI.cs.meta
new file mode 100644
index 0000000..3ae3416
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaConnectUI.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d20fb960dcd6aee4c91d76796c4e489a
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/ProximaConnection.cs b/Assets/Proxima/Runtime/ProximaConnection.cs
new file mode 100644
index 0000000..15d6fb1
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaConnection.cs
@@ -0,0 +1,10 @@
+using System.IO;
+
+namespace Proxima
+{
+    internal interface ProximaConnection
+    {
+        bool Open { get; }
+        void SendMessage(MemoryStream data);
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/ProximaConnection.cs.meta b/Assets/Proxima/Runtime/ProximaConnection.cs.meta
new file mode 100644
index 0000000..b9b71dc
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaConnection.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 191b8b0b4ac76204b84195265c432cd3
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/ProximaDispatcher.cs b/Assets/Proxima/Runtime/ProximaDispatcher.cs
new file mode 100644
index 0000000..090ded3
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaDispatcher.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Collections;
+using System.Collections.Concurrent;
+using UnityEngine;
+
+namespace Proxima
+{
+    internal class ProximaDispatcher
+    {
+        private ConcurrentQueue<Action> _queue = new ConcurrentQueue<Action>();
+        private MonoBehaviour _coroutineRunner;
+
+        public ProximaDispatcher(MonoBehaviour coroutineRunner)
+        {
+            _coroutineRunner = coroutineRunner;
+        }
+
+        public void Dispatch(Action action)
+        {
+            _queue.Enqueue(action);
+        }
+
+        public void InvokeAll()
+        {
+            while (_queue.TryDequeue(out var action))
+            {
+                try
+                {
+                    action();
+                }
+                catch (Exception e)
+                {
+                    Log.Exception(e);
+                }
+            }
+        }
+
+        public void StartCoroutine(IEnumerator coroutine)
+        {
+            if (_coroutineRunner)
+            {
+                _coroutineRunner.StartCoroutine(coroutine);
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/ProximaDispatcher.cs.meta b/Assets/Proxima/Runtime/ProximaDispatcher.cs.meta
new file mode 100644
index 0000000..5b2bd32
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaDispatcher.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: eada919c535fd264ab8d40736ba71513
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/ProximaFeatures.cs b/Assets/Proxima/Runtime/ProximaFeatures.cs
new file mode 100644
index 0000000..158b352
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaFeatures.cs
@@ -0,0 +1,62 @@
+using System.Collections.Generic;
+using System.Reflection;
+
+namespace Proxima
+{
+    internal class ProximaFeatures
+    {
+        [ProximaCommand("Internal")]
+        public static List<string> GetInstalledFeatures()
+        {
+            var features = new List<string>();
+            var assembly = Assembly.GetAssembly(typeof(ProximaInspector));
+
+            if (assembly.GetType("Proxima.ProximaConsoleCommands") != null)
+            {
+                features.Add("console");
+            }
+
+            if (assembly.GetType("Proxima.ProximaProComponentCommands") != null)
+            {
+                features.Add("inspectorEdit");
+            }
+
+            if (assembly.GetType("Proxima.ProximaProfilerCommands") != null)
+            {
+                features.Add("profiler");
+            }
+
+            return features;
+        }
+
+        public static void RegisterProFeatures()
+        {
+            ProximaInspector.RegisterCommands<ProximaFeatures>();
+
+            var assembly = Assembly.GetAssembly(typeof(ProximaInspector));
+
+            var consoleCommands = assembly.GetType("Proxima.ProximaConsoleCommands");
+            if (consoleCommands != null)
+            {
+                ProximaInspector.RegisterCommands(consoleCommands);
+            }
+
+            var proComponentCommands = assembly.GetType("Proxima.ProximaProComponentCommands");
+            if (proComponentCommands != null)
+            {
+                ProximaInspector.RegisterCommands(proComponentCommands);
+            }
+
+            var profilerCommands = assembly.GetType("Proxima.ProximaProfilerCommands");
+            if (profilerCommands != null)
+            {
+                ProximaInspector.RegisterCommands(profilerCommands);
+            }
+        }
+
+        public static bool AllFeaturesInstalled()
+        {
+            return GetInstalledFeatures().Count == 3;
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/ProximaFeatures.cs.meta b/Assets/Proxima/Runtime/ProximaFeatures.cs.meta
new file mode 100644
index 0000000..f389735
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaFeatures.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 04e66cb66bc0fa94995a4e0fd4c81ef1
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/ProximaGameObjectCommands.cs b/Assets/Proxima/Runtime/ProximaGameObjectCommands.cs
new file mode 100644
index 0000000..78c5f52
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaGameObjectCommands.cs
@@ -0,0 +1,534 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+using UnityEngine.SceneManagement;
+
+namespace Proxima
+{
+    internal class ProximaGameObjectCommands
+    {
+        [Serializable]
+        internal class GameObjectInfo
+        {
+            public int Id;
+            public string Name;
+            public bool ActiveSelf;
+            public int Parent;
+            public int Depth;
+            public int SiblingIndex;
+            public int ChildCount;
+            public int Order;
+            public int Layer;
+            public string Tag;
+            public string Scene;
+        }
+
+        [Serializable]
+        internal class GameObjectList
+        {
+            public List<GameObjectInfo> GameObjects = new List<GameObjectInfo>();
+            public string[] Layers;
+            public List<int> Destroyed = new List<int>();
+        }
+
+        private static Dictionary<int, GameObject> _idToGameObject;
+        public static Dictionary<int, GameObject> IdToGameObject => _idToGameObject;
+        private static List<GameObject> _rootGameObjects;
+        private static GameObjectList _gameObjects;
+        private static GameObjectList _changeList;
+        private static Dictionary<int, GameObjectInfo> _gameObjectToInfo;
+        private static int _lastUpdate;
+        private static int _order;
+        private static GameObject _lastUpdatedGameObject;
+        private static int _lastDeleteCheckedGameObjectInfo = -1;
+        private static Scene _dontDestroyOnLoadScene;
+        private static HashSet<string> _pendingStreamIds;
+        private static bool _showHidden;
+        public static bool ShowHidden => _showHidden;
+
+        [ProximaInitialize]
+        public static void Init()
+        {
+            _idToGameObject = new Dictionary<int, GameObject>();
+            _rootGameObjects = new List<GameObject>();
+            _gameObjects = new GameObjectList();
+            _gameObjects.Layers = Enumerable.Range(0, 31).Select(index => LayerMask.LayerToName(index)).ToArray();
+            _changeList = new GameObjectList();
+            _gameObjectToInfo = new Dictionary<int, GameObjectInfo>();
+            _lastUpdate = -1;
+            _pendingStreamIds = new HashSet<string>();
+
+            var ddolGO = new GameObject("Proxima DDOL");
+            GameObject.DontDestroyOnLoad(ddolGO);
+            _dontDestroyOnLoadScene = ddolGO.scene;
+            GameObject.Destroy(ddolGO);
+        }
+
+        [ProximaTeardown]
+        public static void Teardown()
+        {
+            _idToGameObject = null;
+            _rootGameObjects = null;
+            _gameObjects = null;
+            _changeList = null;
+            _gameObjectToInfo = null;
+            _lastUpdate = -1;
+            _pendingStreamIds = null;
+            _order = 0;
+            _lastUpdatedGameObject = null;
+            _lastDeleteCheckedGameObjectInfo = -1;
+            _dontDestroyOnLoadScene = default;
+        }
+
+        [ProximaCommand("Internal")]
+        public static void SetParent(int id, int parentId, int index)
+        {
+            if (_idToGameObject.TryGetValue(id, out var go))
+            {
+                _idToGameObject.TryGetValue(parentId, out var parentGo);
+                go.transform.SetParent(parentGo?.transform, true);
+                go.transform.SetSiblingIndex(index);
+            }
+            else
+            {
+                Log.Warning($"SetParent: GameObject with id {id} not found");
+            }
+        }
+
+        [ProximaCommand("Internal")]
+        public static void SetScene(int id, int sceneIndex, int index)
+        {
+            if (_idToGameObject.TryGetValue(id, out var go))
+            {
+                if (sceneIndex < SceneManager.sceneCount)
+                {
+                    go.transform.SetParent(null, true);
+                    SceneManager.MoveGameObjectToScene(go, SceneManager.GetSceneAt(sceneIndex));
+                    go.transform.SetSiblingIndex(index);
+                }
+            }
+            else
+            {
+                Log.Warning($"SetScene: GameObject with id {id} not found");
+            }
+        }
+
+        [ProximaCommand("Internal")]
+        public static void SetActive(int id, bool active)
+        {
+            if (_idToGameObject.TryGetValue(id, out var go))
+            {
+                go.SetActive(active);
+            }
+            else
+            {
+                Log.Warning($"SetActive: GameObject with id {id} not found");
+            }
+        }
+
+        [ProximaCommand("Internal")]
+        public static void SetName(int id, string name)
+        {
+            if (_idToGameObject.TryGetValue(id, out var go))
+            {
+                go.name = name;
+            }
+            else
+            {
+                Log.Warning($"SetName: GameObject with id {id} not found");
+            }
+        }
+
+        [ProximaCommand("Internal")]
+        public static void SetLayer(int id, int layer)
+        {
+            if (_idToGameObject.TryGetValue(id, out var go))
+            {
+                go.layer = layer;
+            }
+            else
+            {
+                Log.Warning($"SetLayer: GameObject with id {id} not found");
+            }
+        }
+
+        [ProximaCommand("Internal")]
+        public static void SetTag(int id, string tag)
+        {
+            if (_idToGameObject.TryGetValue(id, out var go))
+            {
+                go.tag = tag;
+            }
+            else
+            {
+                Log.Warning($"SetTag: GameObject with id {id} not found");
+            }
+        }
+
+        [ProximaCommand("Internal")]
+        public static void CreateGameObject(int parentId)
+        {
+            var go = new GameObject();
+            if (_idToGameObject.TryGetValue(parentId, out var parentGo))
+            {
+                go.transform.SetParent(parentGo.transform, true);
+            }
+        }
+
+        [ProximaCommand("Internal")]
+        public static void DuplicateGameObject(int id)
+        {
+            if (!_idToGameObject.TryGetValue(id, out var go))
+            {
+                Log.Warning($"DuplicateGameObject: GameObject with id {id} not found");
+
+            }
+
+            GameObject.Instantiate(go, go.transform.parent);
+        }
+
+        [ProximaCommand("Internal")]
+        public static void DestroyGameObject(int id)
+        {
+            if (_idToGameObject.TryGetValue(id, out var go) && go)
+            {
+                GameObject.Destroy(go);
+            }
+            else
+            {
+                Log.Warning($"DestroyGameObject: GameObject with id {id} not found");
+            }
+        }
+
+        [ProximaCommand("Internal")]
+        public static void AddGameObjectComponent(int id, string component)
+        {
+            if (!_idToGameObject.TryGetValue(id, out var go))
+            {
+                Log.Warning($"AddComponent: GameObject with id {id} not found");
+                return;
+            }
+
+            var componentType = ProximaCommandHelpers.FindFirstComponentType(component);
+            if (componentType == null)
+            {
+                throw new Exception($"Component type {component} not found.");
+            }
+
+            go.AddComponent(componentType);
+        }
+
+        [ProximaCommand("Internal")]
+        public static void SetShowHidden(bool showHidden)
+        {
+            _showHidden = showHidden;
+        }
+
+        [ProximaStreamStart("GameObjects")]
+        public static void StartStream(string id)
+        {
+            _pendingStreamIds.Add(id);
+        }
+
+        [ProximaStreamUpdate("GameObjects")]
+        public static GameObjectList UpdateStream(string id)
+        {
+            UpdateInfoLists();
+
+            if (_pendingStreamIds.Contains(id))
+            {
+                _pendingStreamIds.Remove(id);
+                return _gameObjects;
+            }
+
+            bool changed = _changeList.Destroyed.Count > 0 || _changeList.GameObjects.Count > 0;
+            return changed ? _changeList : null;
+        }
+
+        [ProximaStreamStop("GameObjects")]
+        public static void StopStream(string id)
+        {
+            _pendingStreamIds.Remove(id);
+        }
+
+        public static void UpdateInfoLists()
+        {
+            if (_lastUpdate == Time.frameCount)
+            {
+                return;
+            }
+
+            _lastUpdate = Time.frameCount;
+            _changeList.GameObjects.Clear();
+            _changeList.Destroyed.Clear();
+
+            if (!_lastUpdatedGameObject)
+            {
+                _lastUpdatedGameObject = null;
+            }
+
+            var updates = 0;
+            while (updates <= ProximaInspector.MaxGameObjectUpdatesPerFrame && UpdateNextGameObjectInfo())
+            {
+                updates++;
+            }
+
+            var deleteUpdates = 0;
+            while (deleteUpdates <= ProximaInspector.MaxGameObjectUpdatesPerFrame && UpdateNextDeletedGameObjectInfo())
+            {
+                deleteUpdates++;
+            }
+        }
+
+        private static bool UpdateNextGameObjectInfo()
+        {
+            _lastUpdatedGameObject = GetNextGameObject(_lastUpdatedGameObject);
+            if (_lastUpdatedGameObject != null)
+            {
+                UpdateGameObjectInfo(_lastUpdatedGameObject);
+                return true;
+            }
+
+            return false;
+        }
+
+        private static bool ShouldHide(GameObject go)
+        {
+            return !_showHidden && go.hideFlags.HasFlag(HideFlags.HideInHierarchy);
+        }
+
+        private static GameObject GetNextChildGameObject(Transform t)
+        {
+            for (int i = 0; i < t.childCount; i++)
+            {
+                var child = t.GetChild(i);
+                if (!ShouldHide(child.gameObject))
+                {
+                    return child.gameObject;
+                }
+            }
+
+            return null;
+        }
+
+        private static GameObject GetNextSiblingGameObject(Transform parent, Transform t)
+        {
+            var nextSiblingIndex = t.GetSiblingIndex() + 1;
+            while (nextSiblingIndex < parent.childCount)
+            {
+                var nextSibling = parent.GetChild(nextSiblingIndex);
+                var go = nextSibling.gameObject;
+                if (!ShouldHide(go))
+                {
+                    return go;
+                }
+
+                nextSiblingIndex++;
+            }
+
+            return null;
+        }
+
+        private static GameObject GetNextRootGameObject(GameObject go)
+        {
+            var rootIndex = _rootGameObjects.IndexOf(go);
+            if (rootIndex >= 0)
+            {
+                return GetNextRootGameObject(rootIndex + 1);
+            }
+
+            return null;
+        }
+
+        private static GameObject GetNextRootGameObject(int rootIndex)
+        {
+            while (rootIndex < _rootGameObjects.Count)
+            {
+                var nextRoot = _rootGameObjects[rootIndex];
+                if (nextRoot && !ShouldHide(nextRoot))
+                {
+                    return nextRoot;
+                }
+
+                rootIndex++;
+            }
+
+            return null;
+        }
+
+        private static GameObject GetNextSceneGameObject(Scene? currentScene)
+        {
+            var nextSceneIndex = 0;
+            for (int i = 0; i < SceneManager.sceneCount; i++)
+            {
+                if (SceneManager.GetSceneAt(i) == currentScene)
+                {
+                    nextSceneIndex = i + 1;
+                }
+            }
+
+            if (nextSceneIndex == 0)
+            {
+                _order = 0;
+            }
+
+            while (nextSceneIndex < SceneManager.sceneCount)
+            {
+                var nextScene = SceneManager.GetSceneAt(nextSceneIndex);
+                if (nextScene.isLoaded)
+                {
+                    nextScene.GetRootGameObjects(_rootGameObjects);
+                    var nextRoot = GetNextRootGameObject(0);
+                    if (nextRoot != null)
+                    {
+                        return nextRoot;
+                    }
+                }
+
+                nextSceneIndex++;
+            }
+
+            if (_dontDestroyOnLoadScene != null && currentScene != _dontDestroyOnLoadScene)
+            {
+                _dontDestroyOnLoadScene.GetRootGameObjects(_rootGameObjects);
+                var nextRoot = GetNextRootGameObject(0);
+                if (nextRoot != null)
+                {
+                    return nextRoot;
+                }
+            }
+
+            return null;
+        }
+
+        private static GameObject GetNextGameObject(GameObject go)
+        {
+            if (go == null)
+            {
+                return GetNextSceneGameObject(null);
+            }
+
+            _order++;
+
+            var t = go.transform;
+            var nextChild = GetNextChildGameObject(t);
+            if (nextChild != null)
+            {
+                return nextChild;
+            }
+
+            var parent = t.parent;
+            while (parent != null)
+            {
+                var nextSibling = GetNextSiblingGameObject(parent, t);
+                if (nextSibling != null)
+                {
+                    return nextSibling;
+                }
+
+                t = parent;
+                parent = t.parent;
+            }
+
+            go = t.gameObject;
+            go.scene.GetRootGameObjects(_rootGameObjects);
+            var nextRoot = GetNextRootGameObject(go);
+            if (nextRoot != null)
+            {
+                return nextRoot;
+            }
+
+            return GetNextSceneGameObject(go.scene);
+        }
+
+        private static bool FastStringEqual(string lhs, string rhs)
+        {
+            return lhs.Length == rhs.Length && lhs[0] == rhs[0] && lhs[lhs.Length - 1] == rhs[rhs.Length - 1];
+        }
+
+        private static void UpdateGameObjectInfo(GameObject go)
+        {
+            var id = go.GetInstanceID();
+            var parentId = go.transform.parent ? go.transform.parent.gameObject.GetInstanceID() : 0;
+            var siblingIndex = go.transform.GetSiblingIndex();
+
+            int depth = 0;
+            if (go.transform.parent)
+            {
+                if (_gameObjectToInfo.TryGetValue(parentId, out var parentGoi))
+                {
+                    depth = parentGoi.Depth + 1;
+                }
+            }
+
+            if (!_gameObjectToInfo.TryGetValue(id, out var goi))
+            {
+                goi = new GameObjectInfo {
+                    Id = id,
+                    Name = go.name,
+                    ActiveSelf = go.activeSelf,
+                    Parent = parentId,
+                    Depth = depth,
+                    SiblingIndex = siblingIndex,
+                    ChildCount = go.transform.childCount,
+                    Order = _order,
+                    Tag = go.tag,
+                    Layer = go.layer,
+                    Scene = depth == 0 ? go.scene.name + "#" + go.scene.handle : null
+                };
+
+                _gameObjects.GameObjects.Add(goi);
+                _gameObjectToInfo.Add(id, goi);
+                _idToGameObject.Add(id, go);
+                _changeList.GameObjects.Add(goi);
+            }
+            else
+            {
+                if (!FastStringEqual(goi.Name, go.name) ||
+                    goi.ActiveSelf != go.activeSelf ||
+                    goi.Parent != parentId ||
+                    goi.Depth != depth ||
+                    goi.SiblingIndex != siblingIndex ||
+                    goi.ChildCount != go.transform.childCount ||
+                    goi.Order != _order ||
+                    !FastStringEqual(goi.Tag, go.tag) ||
+                    goi.Layer != go.layer)
+                {
+                    goi.Name = go.name;
+                    goi.ActiveSelf = go.activeSelf;
+                    goi.Parent = parentId;
+                    goi.Depth = depth;
+                    goi.SiblingIndex = siblingIndex;
+                    goi.ChildCount = go.transform.childCount;
+                    goi.Order = _order;
+                    goi.Tag = go.tag;
+                    goi.Layer = go.layer;
+                    goi.Scene = depth == 0 ? go.scene.name + "#" + go.scene.handle : null;
+                    _changeList.GameObjects.Add(goi);
+                }
+            }
+        }
+
+        private static bool UpdateNextDeletedGameObjectInfo()
+        {
+            if (_gameObjects.GameObjects.Count == 0)
+            {
+                return false;
+            }
+
+            _lastDeleteCheckedGameObjectInfo = (_lastDeleteCheckedGameObjectInfo + 1) % _gameObjects.GameObjects.Count;
+            var goi = _gameObjects.GameObjects[_lastDeleteCheckedGameObjectInfo];
+            var go = _idToGameObject[goi.Id];
+            if (!go || ShouldHide(go))
+            {
+                _gameObjectToInfo.Remove(goi.Id);
+                _gameObjects.GameObjects.RemoveAt(_lastDeleteCheckedGameObjectInfo);
+                _changeList.Destroyed.Add(goi.Id);
+                _idToGameObject.Remove(goi.Id);
+            }
+
+            return true;
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/ProximaGameObjectCommands.cs.meta b/Assets/Proxima/Runtime/ProximaGameObjectCommands.cs.meta
new file mode 100644
index 0000000..dcc207e
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaGameObjectCommands.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f423de30373ae9147ad4d6f2b9a13a6f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/ProximaInitialize.cs b/Assets/Proxima/Runtime/ProximaInitialize.cs
new file mode 100644
index 0000000..61413ba
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaInitialize.cs
@@ -0,0 +1,16 @@
+
+using System;
+using UnityEngine.Scripting;
+
+namespace Proxima
+{
+    [AttributeUsage(AttributeTargets.Method)]
+    internal class ProximaInitializeAttribute : PreserveAttribute
+    {
+    }
+
+    [AttributeUsage(AttributeTargets.Method)]
+    internal class ProximaTeardownAttribute : PreserveAttribute
+    {
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/ProximaInitialize.cs.meta b/Assets/Proxima/Runtime/ProximaInitialize.cs.meta
new file mode 100644
index 0000000..58142bf
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaInitialize.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d0bb0da2a2865e54f8fa5372774fc723
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/ProximaInspector.cs b/Assets/Proxima/Runtime/ProximaInspector.cs
new file mode 100644
index 0000000..3ecb276
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaInspector.cs
@@ -0,0 +1,728 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using UnityEngine;
+
+namespace Proxima
+{
+    /// Proxima Inspector enables remote inspecting, debugging, and control of a Unity application.
+    [HelpURL("https://www.unityproxima.com/docs")]
+    public class ProximaInspector : MonoBehaviour
+    {
+        // The name displayed to show in the browser when connected.
+        [SerializeField]
+        private string _displayName;
+        public string DisplayName
+        {
+            get => _displayName;
+            set => _displayName = value;
+        }
+
+        // The port number to host the embedded Proxima server.
+        [SerializeField]
+        private int _port = 7759;
+        public int Port
+        {
+            get => _port;
+            set => _port = value;
+        }
+
+        // The password required to connect to Proxima. See unityproxima.com/docs/security for more information.
+        [SerializeField]
+        private string _password = "";
+        public string Password
+        {
+            get => _password;
+            set => _password = value;
+        }
+
+        // Enables and disables HTTPS for encryption. See unityproxima.com/docs/security for more information.
+        [SerializeField]
+        private bool _useHttps = false;
+        public bool UseHttps
+        {
+            get => _useHttps;
+            set => _useHttps = value;
+        }
+
+        // Optional TLS certificate. By default Proxima uses Proxima/Resources/Proxima/ProximaEmbeddedCert.pfx.
+        [SerializeField]
+        private PfxAsset _certificate;
+        public PfxAsset Certificate
+        {
+            get => _certificate;
+            set => _certificate = value;
+        }
+
+        // Password for the TLS certificate.
+        [SerializeField]
+        private string _certificatePassword;
+        public string CertificatePassword
+        {
+            get => _certificatePassword;
+            set => _certificatePassword = value;
+        }
+
+        // Automatically starts the Proxima server when this component is enabled.
+        [SerializeField]
+        private bool _runOnEnable = true;
+        public bool StartOnEnable
+        {
+            get => _runOnEnable;
+            set => _runOnEnable = value;
+        }
+
+        // Maximum number of log messages to keep in memory.
+        [SerializeField]
+        private int _logBufferSize = 1000;
+        public int LogBufferSize
+        {
+            get => _logBufferSize;
+            set => ProximaLogCommands.SetLogCapacity(value);
+        }
+
+        // Instantiates Proxima/Resources/Proxima/ProximaStatusUI.prefab on startup.
+        // This UI lets you see the current status of Proxima at the bottom of your screen.
+        [SerializeField]
+        private bool _instantiateStatusUI = true;
+        public bool InstantiateStatusUI
+        {
+            get => _instantiateStatusUI;
+            set => _instantiateStatusUI = value;
+        }
+
+        // Instantiates Proxima/Resources/Proxima/ProximaConnectUI.prefab on startup.
+        // This UI appears when the user presses F2 and allows the user to start and stop the server
+        // with a display name and password.
+        [SerializeField]
+        private bool _instantiateConnectUI = false;
+        public bool InstantiateConnectUI
+        {
+            get => _instantiateConnectUI;
+            set => _instantiateConnectUI = value;
+        }
+
+        // Adds the gameObject with the Proxima Inspector to the DontDestroyOnLoad scene,
+        // which keeps connections alive when transitioning between scenes.
+        [SerializeField]
+        private bool _dontDestroyOnLoad = true;
+
+        // When Proxima starts, sets Application.runInBackground to true. When Proxima stops,
+        // sets Application.runInBackground back to its previous value. This allows Proxima
+        // to work when connecting from a browseer on the same device, since normally Unity
+        // will pause the app when focus is set to the browser.
+        [SerializeField]
+        private bool _setRunInBackground = true;
+
+        // Stores the current status of Proxima and raises events when it changes.
+        public ProximaStatus Status = new ProximaStatus();
+
+        public enum ServerTypes
+        {
+            Remote,
+            Embedded,
+#if PROXIMA_DEMO
+            Demo
+#endif
+        }
+
+        // Is the Proxima server embedded or hosted remotely?
+        // This feature is a work in progress, and so is disabled.
+        [SerializeField, HideInInspector]
+        private ServerTypes _serverType = ServerTypes.Embedded;
+        public ServerTypes ServerType
+        {
+            get => _serverType;
+            set => _serverType = value;
+        }
+
+        /// URL of the remote Proxima Server.
+        [SerializeField, HideInInspector]
+        private string _serverUrl = "";
+        public string ServerUrl
+        {
+            get => _serverUrl;
+            set => _serverUrl = value;
+        }
+
+        // Performance options
+        public static int MaxGameObjectUpdatesPerFrame = 10;
+        public static int MaxComponentUpdateFrequency = 10;
+
+        private struct OpenStream
+        {
+            public ProximaConnection Connection;
+            public string Id;
+            public string Guid;
+            public StreamInfo Info;
+        }
+
+        private class StreamInfo
+        {
+            public MethodInfo StartMethod;
+            public MethodInfo StopMethod;
+            public MethodInfo UpdateMethod;
+        }
+
+        private ProximaServer _server;
+        private static List<MethodInfo> _inits = new List<MethodInfo>();
+        private static List<MethodInfo> _teardowns = new List<MethodInfo>();
+        private static Dictionary<string, MethodInfo> _commands = new Dictionary<string, MethodInfo>(StringComparer.OrdinalIgnoreCase);
+        public static Dictionary<string, MethodInfo> Commands => _commands;
+        private static bool _staticInitialized;
+
+        private static Dictionary<string, StreamInfo> _streams = new Dictionary<string, StreamInfo>(StringComparer.OrdinalIgnoreCase);
+        private Dictionary<string, List<OpenStream>> _openStreams;
+
+        private ProximaDispatcher _dispatcher;
+        private ProximaStatusUI _statusUI;
+        private ProximaConnectUI _connectUI;
+        private bool _wasRunInBackgroundSet;
+
+        void Awake()
+        {
+            if (!_staticInitialized)
+            {
+                RegisterBuiltInCommands();
+                ProximaLogCommands.SetLogCapacity(_logBufferSize);
+                _staticInitialized = true;
+            }
+
+            _dispatcher = new ProximaDispatcher(this);
+
+            if (string.IsNullOrEmpty(_displayName))
+            {
+                _displayName = Application.companyName + "." + Application.productName + "." + Application.version;
+            }
+        }
+
+        void OnEnable()
+        {
+            if (_dontDestroyOnLoad)
+            {
+                DontDestroyOnLoad(gameObject);
+            }
+
+            if (_runOnEnable)
+            {
+                Run();
+            }
+
+            if (_instantiateStatusUI)
+            {
+                _statusUI = Instantiate(Resources.Load<ProximaStatusUI>("Proxima/ProximaStatusUI"));
+                _statusUI.ProximaInspector = this;
+                _statusUI.transform.SetParent(transform);
+            }
+
+            if (_instantiateConnectUI)
+            {
+                _connectUI = Instantiate(Resources.Load<ProximaConnectUI>("Proxima/ProximaConnectUI"));
+                _connectUI.ProximaInspector = this;
+                _connectUI.GetComponent<ProximaStatusUI>().ProximaInspector = this;
+                _connectUI.transform.SetParent(transform);
+            }
+        }
+
+        void OnApplicationQuit()
+        {
+            Stop();
+        }
+
+        void OnDestroy()
+        {
+            Stop();
+        }
+
+        void OnDisable()
+        {
+            Stop();
+
+            if (_statusUI)
+            {
+                Destroy(_statusUI.gameObject);
+                _statusUI = null;
+            }
+
+            if (_connectUI)
+            {
+                Destroy(_connectUI.gameObject);
+                _connectUI = null;
+            }
+        }
+
+        // Starts the Proxima Server with the current configuration.
+        public void Run()
+        {
+            if (_server != null)
+            {
+                Log.Warning("Run was called, but Proxima is already running.");
+                return;
+            }
+
+            if (string.IsNullOrWhiteSpace(_displayName))
+            {
+                Status.SetError("Display name is required to start Proxima.");
+                Log.Error("Display name is required to start Proxima.");
+                return;
+            }
+
+            if (string.IsNullOrWhiteSpace(_password))
+            {
+                Status.SetError("Password is required to start Proxima.");
+                Log.Error("Password is required to start Proxima.");
+                return;
+            }
+
+            foreach (var method in _inits)
+            {
+                method.Invoke(null, null);
+            }
+
+            if (_setRunInBackground)
+            {
+                _wasRunInBackgroundSet = Application.runInBackground;
+                Application.runInBackground = true;
+            }
+
+            Status.Reset();
+            Status.SetRunning(true);
+
+            var remoteServerType = Type.GetType("Proxima.ProximaRemoteServer");
+            var demoServerType = Type.GetType("Proxima.ProximaDemoServer");
+            if (remoteServerType != null && _serverType == ServerTypes.Remote)
+            {
+                _server = (ProximaServer)Activator.CreateInstance(remoteServerType, _dispatcher, Status, _serverUrl);
+            }
+#if PROXIMA_DEMO
+            else if (demoServerType != null && _serverType == ServerTypes.Demo)
+            {
+                _server = (ProximaServer)Activator.CreateInstance(demoServerType, _dispatcher, Status);
+            }
+#endif
+            else
+            {
+#if UNITY_WEBGL && !UNITY_EDITOR
+                _server = new ProximaWebGLServer(_dispatcher, Status);
+#else
+                _server = new ProximaEmbeddedServer(_dispatcher, Status, _port, _useHttps, _certificate, _certificatePassword);
+#endif
+            }
+
+            try
+            {
+                _server.Start(_displayName, _password);
+            }
+            catch (Exception e)
+            {
+                if (e.InnerException != null)
+                {
+                    e = e.InnerException;
+                }
+
+                Log.Exception(e);
+                Status.SetError(e.Message);
+                Status.SetRunning(false);
+                Cleanup();
+            }
+        }
+
+        // Stops the Proxima Server, closing any connections.
+        public void Stop()
+        {
+            if (_server != null)
+            {
+                Log.Info("Proxima shutting down.");
+                foreach (var method in _teardowns)
+                {
+                    method.Invoke(null, null);
+                }
+            }
+
+            _server?.Stop();
+            Status.Reset();
+            Cleanup();
+        }
+
+        private void Cleanup()
+        {
+            if (_server != null && _setRunInBackground)
+            {
+                Application.runInBackground = _wasRunInBackgroundSet;
+            }
+
+            _server = null;
+            _openStreams = null;
+        }
+
+        void Update()
+        {
+            _dispatcher?.InvokeAll();
+
+            if (_server == null)
+            {
+                return;
+            }
+
+            if (_server.TryGetMessage(out var item))
+            {
+                var (connection, message) = item;
+                var response = HandleMessage(connection, message);
+                if (response != null)
+                {
+                    connection.SendMessage(response);
+                }
+            }
+
+            UpdateStreams();
+        }
+
+        private MemoryStream HandleMessage(ProximaConnection connection, string message)
+        {
+            ProximaRequest request;
+
+            try
+            {
+                request = JsonUtility.FromJson<ProximaRequest>(message);
+            }
+            catch (Exception ex)
+            {
+                Log.Error("Failed to parse request: " + ex.Message);
+                return ProximaSerialization.ErrorResponse(message, "Invalid request.");
+            }
+
+            if (request.Type == ProximaRequestType.StartStream)
+            {
+                return HandleStreamStartRequest(connection, request);
+            }
+            else if (request.Type == ProximaRequestType.StopStream)
+            {
+                return HandleStreamStopRequest(connection, request);
+            }
+            else if (request.Type == ProximaRequestType.Command)
+            {
+                return HandleCommand(request);
+            }
+            else if (request.Type == ProximaRequestType.List)
+            {
+                return ProximaSerialization.DataResponse(request, "");
+            }
+            else if (request.Type == ProximaRequestType.Select)
+            {
+                return ProximaSerialization.ErrorResponse(request, "Already selected.");
+            }
+            else
+            {
+                return ProximaSerialization.ErrorResponse(request, "Invalid request type.");
+            }
+        }
+
+        private MemoryStream HandleStreamStartRequest(ProximaConnection connection, ProximaRequest request)
+        {
+            var stream = request.Cmd;
+            if (!_streams.TryGetValue(stream, out var streamInfo))
+            {
+                return ProximaSerialization.ErrorResponse(request, "Invalid stream.");
+            }
+
+            if (_openStreams == null)
+            {
+                _openStreams = new Dictionary<string, List<OpenStream>>(StringComparer.OrdinalIgnoreCase);
+            }
+
+            if (!_openStreams.ContainsKey(stream))
+            {
+                _openStreams.Add(stream, new List<OpenStream>());
+            }
+
+            var guid = Guid.NewGuid().ToString();
+            if (streamInfo.StartMethod != null)
+            {
+                var args = new string[request.Args.Length + 1];
+                args[0] = guid;
+                Array.Copy(request.Args, 0, args, 1, request.Args.Length);
+                if (!TryInvoke(streamInfo.StartMethod, args, out var data, out var error))
+                {
+                    return ProximaSerialization.ErrorResponse(request, error);
+                }
+            }
+
+            var openStream = new OpenStream {
+                Connection = connection,
+                Id = request.Id,
+                Guid = guid,
+                Info = streamInfo
+            };
+
+            _openStreams[stream].Add(openStream);
+            return null;
+        }
+
+        private MemoryStream HandleStreamStopRequest(ProximaConnection connection, ProximaRequest request)
+        {
+            var stream = request.Cmd;
+            if (!_streams.TryGetValue(stream, out var streamInfo))
+            {
+                return ProximaSerialization.ErrorResponse(request, "Invalid stream name.");
+            }
+
+            if (_openStreams == null)
+            {
+                return ProximaSerialization.ErrorResponse(request, "Stream not open. (A)");
+            }
+
+            if (!_openStreams.TryGetValue(stream, out var listeners))
+            {
+                return ProximaSerialization.ErrorResponse(request, "Stream not open. (B)");
+            }
+
+            var idx = listeners.FindIndex(os => os.Connection == connection && os.Id == request.Id);
+            if (idx < 0)
+            {
+                return ProximaSerialization.ErrorResponse(request, "Stream not open. (C)");
+            }
+
+            var guid = listeners[idx].Guid;
+            listeners.RemoveAt(idx);
+
+            if (!TryInvoke(streamInfo.StopMethod, new string[] { guid }, out var result, out var error))
+            {
+                return ProximaSerialization.ErrorResponse(request, error);
+            }
+
+            return ProximaSerialization.DataResponse(request, "<STREAM-END>");
+        }
+
+        private MemoryStream HandleCommand(ProximaRequest request)
+        {
+            if (!_commands.TryGetValue(request.Cmd, out var method))
+            {
+                return ProximaSerialization.ErrorResponse(request, $"Method {request.Cmd} not found.");
+            }
+
+            if (!TryInvoke(method, request.Args, out var data, out var error))
+            {
+                return ProximaSerialization.ErrorResponse(request, error);
+            }
+
+            return ProximaSerialization.DataResponse(request, data);
+        }
+
+        private static StreamInfo GetOrCreateStreamInfo(string name)
+        {
+            if (!_streams.TryGetValue(name, out var streamInfo))
+            {
+                streamInfo = new StreamInfo();
+                _streams.Add(name, streamInfo);
+            }
+
+            return streamInfo;
+        }
+
+        private void RegisterBuiltInCommands()
+        {
+            RegisterCommands<ProximaInternalCommands>();
+            RegisterCommands<ProximaGameObjectCommands>();
+            RegisterCommands<ProximaComponentCommands>();
+            RegisterCommands<ProximaLogCommands>();
+            ProximaFeatures.RegisterProFeatures();
+        }
+
+        public static void RegisterCommands<T>()
+        {
+            RegisterCommands(typeof(T));
+        }
+
+        public static void RegisterCommands(Type type)
+        {
+            foreach (var method in type.GetRuntimeMethods())
+            {
+                if (!method.IsStatic) continue;
+
+                var initAttribute = method.GetCustomAttribute<ProximaInitializeAttribute>();
+                if (initAttribute != null)
+                {
+                    Log.Verbose("Found init: " + type.Name + "." + method.Name);
+                    _inits.Add(method);
+                }
+
+                var teardownAttribute = method.GetCustomAttribute<ProximaTeardownAttribute>();
+                if (teardownAttribute != null)
+                {
+                    Log.Verbose("Found teardown: " + type.Name + "." + method.Name);
+                    _teardowns.Add(method);
+                }
+
+                var commandAttribute = method.GetCustomAttribute<ProximaCommandAttribute>();
+                if (commandAttribute != null)
+                {
+                    if (_commands.ContainsKey(method.Name))
+                    {
+                        throw new Exception($"Multiple Proxima commands found with name {type.Name}.{method.Name}.");
+                    }
+
+                    Log.Verbose("Found command: " + type.Name + "." + method.Name);
+                    _commands.Add(method.Name, method);
+                    if (!string.IsNullOrWhiteSpace(commandAttribute.Alias))
+                    {
+                        Log.Verbose("Found command alias: " + commandAttribute.Alias);
+                        _commands.Add(commandAttribute.Alias, method);
+                    }
+                }
+
+                var streamStart = method.GetCustomAttribute<ProximaStreamStartAttribute>();
+                if (streamStart != null)
+                {
+                    var streamInfo = GetOrCreateStreamInfo(streamStart.Name);
+                    if (streamInfo.StartMethod != null)
+                    {
+                        throw new Exception($"Multiple Proxima stream start methods found for stream {type.Name}.{streamStart.Name}.");
+                    }
+
+                    Log.Verbose($"Found stream start: {type.Name}.{streamStart.Name}");
+                    streamInfo.StartMethod = method;
+                }
+
+                var streamStop = method.GetCustomAttribute<ProximaStreamStopAttribute>();
+                if (streamStop != null)
+                {
+                    var streamInfo = GetOrCreateStreamInfo(streamStop.Name);
+                    if (streamInfo.StopMethod != null)
+                    {
+                        throw new Exception($"Multiple Proxima stream stop methods found for stream {type.Name}.{streamStop.Name}.");
+                    }
+
+                    Log.Verbose($"Found stream stop: {type.Name}.{streamStop.Name}");
+                    streamInfo.StopMethod = method;
+                }
+
+                var streamUpdate = method.GetCustomAttribute<ProximaStreamUpdateAttribute>();
+                if (streamUpdate != null)
+                {
+                    var streamInfo = GetOrCreateStreamInfo(streamUpdate.Name);
+                    if (streamInfo.UpdateMethod != null)
+                    {
+                        throw new Exception($"Multiple Proxima stream update methods found for stream {type.Name}.{streamUpdate.Name}.");
+                    }
+
+                    Log.Verbose($"Found stream update: {type.Name}.{streamUpdate.Name}");
+                    streamInfo.UpdateMethod = method;
+
+                }
+            }
+        }
+
+        private void UpdateStreams()
+        {
+            if (_openStreams != null)
+            {
+                foreach (var stream in _openStreams)
+                {
+                    var listeners = stream.Value;
+
+                    // Close streams that disconnected
+                    foreach (var listener in listeners)
+                    {
+                        if (!listener.Connection.Open)
+                        {
+                            TryInvoke(listener.Info.StopMethod, new string[] { listener.Guid });
+                        }
+                    }
+
+                    listeners.RemoveAll(os => !os.Connection.Open);
+
+                    foreach (var listener in listeners)
+                    {
+                        object data = null;
+                        string error = null;
+
+                        try
+                        {
+                            data = listener.Info.UpdateMethod?.Invoke(null, new object[] { listener.Guid });
+                        }
+                        catch (Exception e)
+                        {
+                            Debug.LogException(e);
+                            error = e.Message;
+                        }
+
+                        if (!string.IsNullOrEmpty(error))
+                        {
+                            listener.Connection.SendMessage(ProximaSerialization.ErrorResponse(listener.Id, error));
+                        }
+                        else if (data != null)
+                        {
+                            listener.Connection.SendMessage(ProximaSerialization.DataResponse(listener.Id, data));
+                        }
+                    }
+                }
+            }
+        }
+
+        private bool TryInvoke(MethodInfo method, string[] args)
+        {
+            return TryInvoke(method, args, out var result, out var error);
+        }
+
+        private bool TryInvoke(MethodInfo method, string[] args, out object result, out string error)
+        {
+            result = null;
+            error = string.Empty;
+            if (method == null) return true;
+
+            var parameters = method.GetParameters();
+            var values = new object[parameters.Length];
+            for (int i = 0; i < parameters.Length; i++)
+            {
+                var parameter = parameters[i];
+                if (args == null || args.Length <= i)
+                {
+                    if (parameters[i].HasDefaultValue)
+                    {
+                        values[i] = parameters[i].DefaultValue;
+                        continue;
+                    }
+
+                    error = $"Required argument {parameter.Name} not found.";
+                    return false;
+                }
+
+                if (typeof(IPropertyOrValue).IsAssignableFrom(parameter.ParameterType))
+                {
+                    values[i] = Activator.CreateInstance(parameter.ParameterType, new object[] { args[i] });
+                    continue;
+                }
+
+                if (ProximaSerialization.TryDeserialize(parameter.ParameterType, args[i], out var value))
+                {
+                    values[i] = value;
+                    continue;
+                }
+
+                error = $"Unable to deserialize argument {parameter.Name} as {parameter.ParameterType.Name}.";
+                return false;
+            }
+
+            try
+            {
+                if (method.ReturnType == typeof(void))
+                {
+                    method.Invoke(null, values);
+                }
+                else
+                {
+                    result = method.Invoke(null, values);
+                }
+            }
+            catch (Exception e)
+            {
+                Log.Exception(e);
+                error = e.InnerException.Message;
+                return false;
+            }
+
+            return true;
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/ProximaInspector.cs.meta b/Assets/Proxima/Runtime/ProximaInspector.cs.meta
new file mode 100644
index 0000000..d489ef2
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaInspector.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e277581af68d4604da056e460b819656
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/ProximaInternalCommands.cs b/Assets/Proxima/Runtime/ProximaInternalCommands.cs
new file mode 100644
index 0000000..baa26cb
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaInternalCommands.cs
@@ -0,0 +1,288 @@
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Text;
+using UnityEngine;
+using UnityEngine.SceneManagement;
+
+namespace Proxima
+{
+    internal class ProximaInternalCommands
+    {
+        [Serializable]
+        private struct CommandsDump
+        {
+            public List<CommandDump> Commands;
+        }
+
+        [Serializable]
+        private struct CommandDump
+        {
+            public string Name;
+            public string Category;
+            public string Alias;
+            public string Description;
+            public string ExampleInput;
+            public string ExampleOutput;
+            public List<ParameterDump> Parameters;
+        }
+
+        [Serializable]
+        private struct ParameterDump
+        {
+            public string Name;
+            public string Type;
+            public string Default;
+        }
+
+        private static bool _paused;
+        private static float _timeScale;
+
+        private static string HelpCommand(string command)
+        {
+            if (!ProximaInspector.Commands.TryGetValue(command, out var method))
+            {
+                return "Unknown command: " + command;
+            }
+
+            var attr = method.GetCustomAttribute<ProximaCommandAttribute>();
+            var sb = new StringBuilder();
+            sb.AppendLine(method.Name);
+            sb.AppendLine("Category: " + attr.Category);
+            if (!string.IsNullOrWhiteSpace(attr.Alias))
+            {
+                sb.AppendLine("Alias: " + attr.Alias);
+            }
+
+            if (!string.IsNullOrWhiteSpace(attr.Description))
+            {
+                sb.AppendLine("Description: " + attr.Description);
+            }
+
+            var parameters = method.GetParameters();
+            if (parameters.Length > 0)
+            {
+                sb.AppendLine("Parameters:");
+            }
+
+            for (int i = 0; i < parameters.Length; i++)
+            {
+                var parameter = parameters[i];
+
+                sb.Append("  ");
+
+                var type = parameter.ParameterType;
+                var def = parameter.HasDefaultValue ? parameter.DefaultValue : null;
+                if (typeof(IPropertyOrValue).IsAssignableFrom(parameter.ParameterType))
+                {
+                    type = parameter.ParameterType.GetGenericArguments()[0];
+                    def = type.IsValueType ? Activator.CreateInstance(type) : "null";
+                }
+
+                sb.Append(parameter.Name);
+                sb.Append(": ");
+                sb.Append(type.Name);
+
+                if (parameter.HasDefaultValue)
+                {
+                    sb.Append(" (default: ");
+                    sb.Append(def);
+                    sb.Append(")");
+                }
+
+                sb.AppendLine();
+            }
+
+            if (!string.IsNullOrWhiteSpace(attr.ExampleInput))
+            {
+                sb.AppendLine();
+                sb.AppendLine("Example:");
+                sb.AppendLine("  > " + attr.ExampleInput);
+
+                if (!string.IsNullOrWhiteSpace(attr.ExampleOutput))
+                {
+                    sb.AppendLine("  " + attr.ExampleOutput.Replace("\n", "\n  "));
+                }
+            }
+
+            return sb.ToString();
+        }
+
+        private static string HelpAll()
+        {
+            var sb = new StringBuilder();
+            var categorizedCommands = new Dictionary<string, List<(string, MethodInfo)>>();
+            foreach (var kv in ProximaInspector.Commands)
+            {
+                var command = kv.Key;
+                var method = kv.Value;
+                var attr = method.GetCustomAttribute<ProximaCommandAttribute>();
+                if (attr.Alias == command || attr.Category == "Internal")
+                {
+                    continue;
+                }
+
+                if (!categorizedCommands.TryGetValue(attr.Category, out var commands))
+                {
+                    commands = new List<(string, MethodInfo)>();
+                    categorizedCommands.Add(attr.Category, commands);
+                }
+
+                commands.Add((command, method));
+            }
+
+            var sortedCategories = new List<string>(categorizedCommands.Keys);
+            sortedCategories.Sort();
+            foreach (var category in sortedCategories)
+            {
+                var commands = categorizedCommands[category];
+                commands.Sort((a, b) => a.Item1.CompareTo(b.Item1));
+
+                sb.AppendLine(category + " Commands:");
+                foreach (var (command, method) in commands)
+                {
+                    var attr = method.GetCustomAttribute<ProximaCommandAttribute>();
+
+                    var parameters = method.GetParameters();
+                    sb.Append("  ");
+                    sb.Append(command);
+                    sb.Append(" ");
+
+                    if (!string.IsNullOrEmpty(attr.Alias))
+                    {
+                        sb.Append("(");
+                        sb.Append(attr.Alias);
+                        sb.Append(") ");
+                    }
+
+                    for (int i = 0; i < parameters.Length; i++)
+                    {
+                        var parameter = parameters[i];
+
+                        if (parameter.HasDefaultValue)
+                        {
+                            sb.Append("<");
+                            sb.Append(parameter.Name);
+                            sb.Append(">");
+                        }
+                        else
+                        {
+                            sb.Append(parameter.Name);
+                        }
+
+                        if (i < parameters.Length - 1)
+                        {
+                            sb.Append(" ");
+                        }
+                    }
+
+                    sb.AppendLine();
+                }
+            }
+
+            return sb.ToString();
+        }
+
+        [ProximaCommand("Internal", "?")]
+        public static string Help(string command = null)
+        {
+            if (!string.IsNullOrWhiteSpace(command))
+            {
+                return HelpCommand(command);
+            }
+            else
+            {
+                return HelpAll();
+            }
+        }
+
+        [ProximaCommand("Internal")]
+        public static string Ping()
+        {
+            return "Pong";
+        }
+
+        [ProximaCommand("Internal")]
+        public static bool IsPaused()
+        {
+            return _paused;
+        }
+
+        [ProximaCommand("Internal")]
+        public static string Pause()
+        {
+            if (!_paused)
+            {
+                _timeScale = Time.timeScale;
+                Time.timeScale = 0;
+                _paused = true;
+                return "Paused.";
+            }
+
+            return "Already paused.";
+        }
+
+        [ProximaCommand("Internal")]
+        public static string Resume()
+        {
+            if (_paused)
+            {
+                Time.timeScale = _timeScale;
+                _paused = false;
+                return "Resumed.";
+            }
+
+            return "Already resume.";
+        }
+
+        [ProximaCommand("Internal")]
+        public static object DumpCommands()
+        {
+            var dump = new CommandsDump {
+                Commands = new List<CommandDump>()
+            };
+
+            foreach (var kv in ProximaInspector.Commands)
+            {
+                var name = kv.Key;
+                var method = kv.Value;
+                var attr = method.GetCustomAttribute<ProximaCommandAttribute>();
+                if (attr.Category == "Internal") continue;
+                if (attr.Alias == name) continue;
+
+                var cd = new CommandDump {
+                    Name = method.Name,
+                    Category = attr.Category,
+                    Alias = attr.Alias,
+                    Description = attr.Description,
+                    ExampleInput = attr.ExampleInput,
+                    ExampleOutput = attr.ExampleOutput,
+                    Parameters = new List<ParameterDump>()
+                };
+
+                var parameters = method.GetParameters();
+                for (int i = 0; i < parameters.Length; i++)
+                {
+                    var parameter = parameters[i];
+                    var type = parameter.ParameterType;
+                    var def = parameter.HasDefaultValue ? parameter.DefaultValue : null;
+                    if (typeof(IPropertyOrValue).IsAssignableFrom(parameter.ParameterType))
+                    {
+                        type = parameter.ParameterType.GetGenericArguments()[0];
+                        def = type.IsValueType ? Activator.CreateInstance(type) : "null";
+                    }
+
+                    cd.Parameters.Add(new ParameterDump {
+                        Name = parameter.Name,
+                        Type = type.Name,
+                        Default = def != null ? ProximaSerialization.Serialize(def) : null
+                    });
+                }
+
+                dump.Commands.Add(cd);
+            }
+
+            return dump;
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/ProximaInternalCommands.cs.meta b/Assets/Proxima/Runtime/ProximaInternalCommands.cs.meta
new file mode 100644
index 0000000..b1c797e
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaInternalCommands.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 5631c2ba32970104590d7fa32d88dd45
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/ProximaLog.cs b/Assets/Proxima/Runtime/ProximaLog.cs
new file mode 100644
index 0000000..6f5c180
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaLog.cs
@@ -0,0 +1,33 @@
+using System.Diagnostics;
+
+namespace Proxima
+{
+    internal class Log
+    {
+        [Conditional("PROXIMA_LOG_VERBOSE")]
+        public static void Verbose(string message)
+        {
+            UnityEngine.Debug.Log("PXV: " + message);
+        }
+
+        public static void Info(string message)
+        {
+            UnityEngine.Debug.Log("PX: " + message);
+        }
+
+        public static void Warning(string message)
+        {
+            UnityEngine.Debug.LogWarning("PX: " + message);
+        }
+
+        public static void Error(string message)
+        {
+            UnityEngine.Debug.LogError("PX: " + message);
+        }
+
+        public static void Exception(System.Exception e)
+        {
+            UnityEngine.Debug.LogException(e);
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/ProximaLog.cs.meta b/Assets/Proxima/Runtime/ProximaLog.cs.meta
new file mode 100644
index 0000000..d4d5d7b
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaLog.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 02714c12f1904514a8b943bb91117463
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/ProximaLogCommands.cs b/Assets/Proxima/Runtime/ProximaLogCommands.cs
new file mode 100644
index 0000000..a9640ef
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaLogCommands.cs
@@ -0,0 +1,147 @@
+using System;
+using System.IO;
+using System.Collections.Generic;
+using UnityEngine;
+using System.Collections;
+
+namespace Proxima
+{
+    internal class ProximaLogCommands
+    {
+        [Serializable]
+        public struct LogInfo
+        {
+            public long LogTime;
+            public string LogString;
+            public string StackTrace;
+            public LogType Type;
+        }
+
+        private static HashSet<string> _pendingStreamIds;
+        private static CircularList<LogInfo> _logs;
+        private static IEnumerable<LogInfo> _streamLogs;
+        private static int _streamIndex = 0;
+        private static int _lastUpdateFrame;
+
+        public static void SetLogCapacity(int capacity)
+        {
+            _logs = new CircularList<LogInfo>(capacity);
+        }
+
+        [ProximaInitialize]
+        public static void Initialize()
+        {
+            _pendingStreamIds = new HashSet<string>();
+            Application.logMessageReceived += OnLogMessageReceived;
+        }
+
+        [ProximaTeardown]
+        public static void Teardown()
+        {
+            _pendingStreamIds = null;
+            Application.logMessageReceived -= OnLogMessageReceived;
+        }
+
+        [ProximaStreamStart("LogStream")]
+        public static void StartStream(string id)
+        {
+            _pendingStreamIds.Add(id);
+        }
+
+        [ProximaStreamUpdate("LogStream")]
+        public static IEnumerable<LogInfo> UpdateStream(string id)
+        {
+            if (_lastUpdateFrame != Time.frameCount)
+            {
+                _lastUpdateFrame = Time.frameCount;
+                bool hasUpdate = _streamIndex != _logs.ItemsAdded;
+                _streamLogs = hasUpdate ? _logs.GetRange(_streamIndex) : null;
+                _streamIndex = _logs.ItemsAdded;
+            }
+
+            if (_pendingStreamIds.Contains(id))
+            {
+                _pendingStreamIds.Remove(id);
+                return _logs.ItemsAdded > 0 ? _logs : null;
+            }
+
+            return _streamLogs;
+        }
+
+        [ProximaStreamStop("LogStream")]
+        public static void StopStream(string id)
+        {
+            _pendingStreamIds.Remove(id);
+        }
+
+        private static void OnLogMessageReceived(string message, string stackTrace, LogType type)
+        {
+            #if PROXIMA_LOG_VERBOSE
+                if (message.StartsWith("PXV:"))
+                {
+                    return;
+                }
+            #endif
+
+            var logInfo = new LogInfo
+            {
+                LogTime = (long) System.DateTime.UtcNow.Subtract(new System.DateTime(1970, 1, 1)).TotalMilliseconds,
+                LogString = message,
+                StackTrace = stackTrace,
+                Type = type
+            };
+
+            _logs.Add(logInfo);
+        }
+
+        [ProximaCommand("Internal")]
+        public static string GetLogFile()
+        {
+            if (string.IsNullOrEmpty(Application.consoleLogPath))
+            {
+                throw new Exception("Log file not available");
+            }
+
+            try
+            {
+                // If we just try to open the file we'll get a sharing violation, so need to copy it first.
+                var temp = Path.Combine(Application.temporaryCachePath, Path.GetTempFileName());
+                File.Copy(Application.consoleLogPath, temp, true);
+                var result = File.ReadAllText(temp);
+                File.Delete(temp);
+                return result;
+            }
+            catch (Exception e)
+            {
+                Log.Error("Failed to get log file: " + e.Message);
+                return "Failed to get log file: " + e.Message;
+            }
+        }
+
+        [ProximaCommand("Internal")]
+        public static string GetPreviousLogFile()
+        {
+            if (string.IsNullOrEmpty(Application.consoleLogPath))
+            {
+                throw new Exception("Log file not available");
+            }
+
+            try
+            {
+                var path = Application.consoleLogPath.Replace(".log", "-prev.log");
+                return File.ReadAllText(path);
+            }
+            catch (Exception e)
+            {
+                Log.Error("Failed to get previous log file: " + e.Message);
+                return "Failed to get previous log file: " + e.Message;
+            }
+        }
+
+        [ProximaCommand("Internal")]
+        public static bool GetLogFilesAvailable()
+        {
+            return !string.IsNullOrEmpty(Application.consoleLogPath) && File.Exists(Application.consoleLogPath);
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/ProximaLogCommands.cs.meta b/Assets/Proxima/Runtime/ProximaLogCommands.cs.meta
new file mode 100644
index 0000000..1dd12b3
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaLogCommands.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: cd9d69ce3bb609948a7a44e254094c6d
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/ProximaMimeTypes.cs b/Assets/Proxima/Runtime/ProximaMimeTypes.cs
new file mode 100644
index 0000000..7f75d1c
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaMimeTypes.cs
@@ -0,0 +1,95 @@
+using System.Collections.Generic;
+
+namespace Proxima
+{
+    internal static class ProximaMimeTypes
+    {
+        private static Dictionary<string, string> MimeTypes = new Dictionary<string, string>()
+        {
+            { ".aac", "audio/aac" },
+            { ".abw", "application/x-abiword" },
+            { ".arc", "application/x-freearc" },
+            { ".avi", "video/x-msvideo" },
+            { ".azw", "application/vnd.amazon.ebook" },
+            { ".bin", "application/octet-stream" },
+            { ".bmp", "image/bmp" },
+            { ".bz", "application/x-bzip" },
+            { ".bz2", "application/x-bzip2" },
+            { ".csh", "application/x-csh" },
+            { ".css", "text/css" },
+            { ".csv", "text/csv" },
+            { ".doc", "application/msword" },
+            { ".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" },
+            { ".eot", "application/vnd.ms-fontobject" },
+            { ".epub", "application/epub+zip" },
+            { ".gz", "application/gzip" },
+            { ".gif", "image/gif" },
+            { ".htm", "text/html" },
+            { ".html", "text/html" },
+            { ".ico", "image/vnd.microsoft.icon" },
+            { ".ics", "text/calendar" },
+            { ".jar", "application/java-archive" },
+            { ".jpeg", "image/jpeg" },
+            { ".jpg", "image/jpeg" },
+            { ".js", "text/javascript" },
+            { ".json", "application/json" },
+            { ".jsonld", "application/ld+json" },
+            { ".mid", "audio/midi" },
+            { ".midi", "audio/midi" },
+            { ".mjs", "text/javascript" },
+            { ".mp3", "audio/mpeg" },
+            { ".mpeg", "video/mpeg" },
+            { ".mpkg", "application/vnd.apple.installer+xml" },
+            { ".odp", "application/vnd.oasis.opendocument.presentation" },
+            { ".ods", "application/vnd.oasis.opendocument.spreadsheet" },
+            { ".odt", "application/vnd.oasis.opendocument.text" },
+            { ".oga", "audio/ogg" },
+            { ".ogv", "video/ogg" },
+            { ".ogx", "application/ogg" },
+            { ".opus", "audio/opus" },
+            { ".otf", "font/otf" },
+            { ".png", "image/png" },
+            { ".pdf", "application/pdf" },
+            { ".php", "application/x-httpd-php" },
+            { ".ppt", "application/vnd.ms-powerpoint" },
+            { ".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation" },
+            { ".rar", "application/vnd.rar" },
+            { ".rtf", "application/rtf" },
+            { ".sh", "application/x-sh" },
+            { ".svg", "image/svg+xml" },
+            { ".swf", "application/x-shockwave-flash" },
+            { ".tar", "application/x-tar" },
+            { ".tif", "image/tiff" },
+            { ".tiff", "image/tiff" },
+            { ".ts", "video/mp2t" },
+            { ".ttf", "font/ttf" },
+            { ".txt", "text/plain" },
+            { ".vsd", "application/vnd.visio" },
+            { ".wav", "audio/wav" },
+            { ".weba", "audio/webm" },
+            { ".webm", "video/webm" },
+            { ".webp", "image/webp" },
+            { ".woff", "font/woff" },
+            { ".woff2", "font/woff2" },
+            { ".xhtml", "application/xhtml+xml" },
+            { ".xls", "application/vnd.ms-excel" },
+            { ".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" },
+            { ".xml", "application/xml" },
+            { ".xul", "application/vnd.mozilla.xul+xml" },
+            { ".zip", "application/zip" },
+            { ".3gp", "video/3gpp" },
+            { ".3g2", "video/3gpp2" },
+            { ".7z", "application/x-7z-compressed" },
+        };
+
+        public static string Get(string extension)
+        {
+            if (MimeTypes.TryGetValue(extension, out var mimeType))
+            {
+                return mimeType;
+            }
+
+            return "application/octet-stream";
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/ProximaMimeTypes.cs.meta b/Assets/Proxima/Runtime/ProximaMimeTypes.cs.meta
new file mode 100644
index 0000000..209f301
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaMimeTypes.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 515a81d2e925f9c4ca6315349af8e00b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/ProximaSerialization.cs b/Assets/Proxima/Runtime/ProximaSerialization.cs
new file mode 100644
index 0000000..0609f0d
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaSerialization.cs
@@ -0,0 +1,618 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Reflection;
+using System.Security.Cryptography;
+using System.Text;
+using UnityEngine;
+
+namespace Proxima
+{
+    [Serializable]
+    internal enum ProximaRequestType
+    {
+        Command = 0,
+        StartStream = 1,
+        StopStream = 2,
+        List = 3,
+        Select = 4
+    }
+
+    [Serializable]
+    internal class ProximaRequest
+    {
+        public string Id;
+        public ProximaRequestType Type;
+        public string Cmd;
+        public string[] Args;
+    }
+
+    [Serializable]
+    internal class ProximaDataResponse
+    {
+        public string Id;
+        public object Data;
+    }
+
+    [Serializable]
+    internal class ProximaErrorResponse
+    {
+        public string Id;
+        public string Error;
+    }
+
+    [System.Serializable]
+    internal struct ProximaInstanceHello
+    {
+        public string DisplayName;
+        public string InstanceId;
+        public string ProductName;
+        public string CompanyName;
+        public string Platform;
+        public string ProductVersion;
+        public string ProximaVersion;
+        public string ConnectionId;
+        public string Password;
+    }
+
+    public static class ProximaSerialization
+    {
+        internal static readonly string VERSION = "1.0.0";
+
+        public static string Serialize(object data, bool pretty = false)
+        {
+            var stream = FastJson.Serialize(data, pretty);
+            if (stream == null)
+            {
+                return null;
+            }
+
+            return Encoding.UTF8.GetString(stream.GetBuffer(), 0, (int)stream.Length);
+        }
+
+        internal static MemoryStream DataResponse(ProximaRequest request, object data)
+        {
+            return DataResponse(request.Id, data);
+        }
+
+        internal static MemoryStream DataResponse(string id, object data)
+        {
+            return FastJson.Serialize(new ProximaDataResponse { Id = id, Data = data });
+        }
+
+        internal static MemoryStream ErrorResponse(ProximaRequest request, string error)
+        {
+            return ErrorResponse(request.Id, error);
+        }
+
+        internal static MemoryStream ErrorResponse(string id, string error)
+        {
+            return FastJson.Serialize(new ProximaErrorResponse { Id = id, Error = error });
+        }
+
+        internal static string HashPassword(string password, string connectionId)
+        {
+            SHA256 hash = SHA256.Create();
+            byte[] bytes = hash.ComputeHash(Encoding.UTF8.GetBytes(password + connectionId));
+            var hashedPassword = Convert.ToBase64String(bytes);
+            return hashedPassword;
+        }
+
+        internal static ProximaInstanceHello CreateHello(string displayName, string password = "")
+        {
+            var hello = new ProximaInstanceHello();
+            hello.DisplayName = displayName;
+            hello.InstanceId = displayName.GetHashCode().ToString() + "_" + VERSION;
+            hello.ProductName = Application.productName;
+            hello.CompanyName = Application.companyName;
+            hello.Platform = Enum.GetName(typeof(RuntimePlatform), Application.platform);
+            hello.ProductVersion = Application.version;
+            hello.ProximaVersion = VERSION;
+            hello.ConnectionId = Guid.NewGuid().ToString();
+
+            if (!string.IsNullOrEmpty(password))
+            {
+                hello.Password = HashPassword(password, hello.ConnectionId);
+            }
+
+            return hello;
+        }
+
+        private static bool TrySplitArray(string arrayString, out List<string> elements)
+        {
+            elements = null;
+
+            if (arrayString.Length < 2)
+            {
+                return false;
+            }
+
+            if (arrayString[0] != '[')
+            {
+                return false;
+            }
+
+            if (arrayString[arrayString.Length - 1] != ']')
+            {
+                return false;
+            }
+
+            elements = new List<string>();
+            int b = 0;
+            bool q = false;
+            bool bs = false;
+            var sb = new StringBuilder();
+            for (int i = 1; i < arrayString.Length - 1; i++)
+            {
+                var c = arrayString[i];
+                if (!q && b == 0 && c == ',') {
+                    elements.Add(sb.ToString());
+                    sb.Clear();
+                    continue;
+                }
+
+                sb.Append(c);
+
+                if (bs)
+                {
+                    bs = false;
+                }
+                else if (c == '\\')
+                {
+                    bs = true;
+                }
+                else if (c == '"')
+                {
+                    q = !q;
+                }
+                else if (c == '[')
+                {
+                    b++;
+                }
+                else if (c == ']')
+                {
+                    b--;
+                }
+            }
+
+            if (sb.Length > 0)
+            {
+                elements.Add(sb.ToString());
+            }
+
+            return true;
+        }
+
+        internal static IList MakeListOf(Type elementType)
+        {
+            var list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(elementType));
+            return list;
+        }
+
+        internal static IList MakeList(Type listType)
+        {
+            return MakeListOf(listType.GetGenericArguments()[0]);
+        }
+
+        internal static IList CopyList(IList list)
+        {
+            var newList = MakeList(list.GetType());
+            foreach (var item in list)
+            {
+                newList.Add(item);
+            }
+
+            return newList;
+        }
+
+        internal static Array MakeArrayOf(Type elementType, int length)
+        {
+            return Array.CreateInstance(elementType, length);
+        }
+
+        internal static Array MakeArray(Type arrayType, int length)
+        {
+            return MakeArrayOf(arrayType.GetElementType(), length);
+        }
+
+        internal static Array CopyArray(Array array)
+        {
+            var newArray = MakeArray(array.GetType(), array.Length);
+            Array.Copy(array, newArray, array.Length);
+            return newArray;
+        }
+
+        internal static Array ResizeArray(Array array, int size)
+        {
+            var newArray = MakeArray(array.GetType(), size);
+            Array.Copy(array, newArray, Math.Min(array.Length, size));
+            return newArray;
+        }
+
+        private static bool TryDeserializeList(Type listType, string arrayString, out IList values)
+        {
+            if (!TrySplitArray(arrayString, out var elements))
+            {
+                values = null;
+                return false;
+            }
+
+            var elementType = listType.GetGenericArguments()[0];
+            values = MakeListOf(elementType);
+            for (int i = 0; i < elements.Count; i++)
+            {
+                if (!TryDeserialize(elementType, elements[i].Trim('"'), out var obj))
+                {
+                    values = null;
+                    return false;
+                }
+
+                values.Add(obj);
+            }
+
+            return true;
+        }
+
+        private static bool TryDeserializeArray(Type elementType, string arrayString, out Array values)
+        {
+            if (!TrySplitArray(arrayString, out var elements))
+            {
+                values = null;
+                return false;
+            }
+
+            values = MakeArrayOf(elementType, elements.Count);
+            for (int i = 0; i < elements.Count; i++)
+            {
+                if (!TryDeserialize(elementType, elements[i].Trim('"'), out var obj))
+                {
+                    values = null;
+                    return false;
+                }
+
+                values.SetValue(obj, i);
+            }
+
+            return true;
+        }
+
+        private static bool TryDeserializeArray<T>(string arrayString, out T[] values)
+        {
+            if (TryDeserializeArray(typeof(T), arrayString, out var array))
+            {
+                values = (T[])array;
+                return true;
+            }
+
+            values = null;
+            return false;
+        }
+
+        private static bool TryDeserializeArray<T>(string arrayString, int count, out T[] values)
+        {
+            if (!TryDeserializeArray<T>(arrayString, out values))
+            {
+                return false;
+            }
+
+            if (values.Length != count)
+            {
+                values = null;
+                return false;
+            }
+
+            return true;
+        }
+
+        internal static bool TryDeserialize<T>(string value, out T result)
+        {
+            if (TryDeserialize(typeof(T), value, out var obj))
+            {
+                result = (T)obj;
+                return true;
+            }
+
+            result = default(T);
+            return false;
+        }
+
+        // This does NOT do full JSON deserialization. It just deserializes single values
+        // or arrays of values, which is all the inspector needs.
+        internal static bool TryDeserialize(Type type, string value, out object result)
+        {
+            if (type == typeof(string))
+            {
+                result = value;
+                return true;
+            }
+            else if (type == typeof(float))
+            {
+                if (float.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out var floatValue))
+                {
+                    result = floatValue;
+                    return true;
+                }
+            }
+            else if (type == typeof(double))
+            {
+                if (double.TryParse(value, out var doubleValue))
+                {
+                    result = doubleValue;
+                    return true;
+                }
+            }
+            else if (type == typeof(byte))
+            {
+                if (byte.TryParse(value, out var byteValue))
+                {
+                    result = byteValue;
+                    return true;
+                }
+            }
+            else if (type == typeof(sbyte))
+            {
+                if (sbyte.TryParse(value, out var sbyteValue))
+                {
+                    result = sbyteValue;
+                    return true;
+                }
+            }
+            else if (type == typeof(short))
+            {
+                if (short.TryParse(value, out var shortValue))
+                {
+                    result = shortValue;
+                    return true;
+                }
+            }
+            else if (type == typeof(ushort))
+            {
+                if (ushort.TryParse(value, out var ushortValue))
+                {
+                    result = ushortValue;
+                    return true;
+                }
+            }
+            else if (type == typeof(int))
+            {
+                if (int.TryParse(value, out var intValue))
+                {
+                    result = intValue;
+                    return true;
+                }
+            }
+            else if (type == typeof(uint))
+            {
+                if (uint.TryParse(value, out var uintValue))
+                {
+                    result = uintValue;
+                    return true;
+                }
+            }
+            else if (type == typeof(long))
+            {
+                if (long.TryParse(value, out var longValue))
+                {
+                    result = longValue;
+                    return true;
+                }
+            }
+            else if (type == typeof(ulong))
+            {
+                if (ulong.TryParse(value, out var ulongValue))
+                {
+                    result = ulongValue;
+                    return true;
+                }
+            }
+            else if (type == typeof(bool))
+            {
+                result = (value == "true");
+                return true;
+            }
+            else if (type == typeof(Vector2))
+            {
+                if (TryDeserializeArray<float>(value, 2, out var v))
+                {
+                    result = new Vector2(v[0], v[1]);
+                    return true;
+                }
+            }
+            else if (type == typeof(Vector3))
+            {
+                if (TryDeserializeArray<float>(value, 3, out var v))
+                {
+                    result = new Vector3(v[0], v[1], v[2]);
+                    return true;
+                }
+            }
+            else if (type == typeof(Vector4))
+            {
+                if (TryDeserializeArray<float>(value, 4, out var v))
+                {
+                    result = new Vector4(v[0], v[1], v[2], v[3]);
+                    return true;
+                }
+            }
+            else if (type == typeof(Vector2Int))
+            {
+                if (TryDeserializeArray<int>(value, 2, out var v))
+                {
+                    result = new Vector2Int(v[0], v[1]);
+                    return true;
+                }
+            }
+            else if (type == typeof(Vector3Int))
+            {
+                if (TryDeserializeArray<int>(value, 3, out var v))
+                {
+                    result = new Vector3Int(v[0], v[1], v[2]);
+                    return true;
+                }
+            }
+            else if (type == typeof(Quaternion))
+            {
+                if (TryDeserializeArray<float>(value, 3, out var v))
+                {
+                    result = Quaternion.Euler(v[0], v[1], v[2]);
+                    return true;
+                }
+            }
+            else if (type == typeof(Rect))
+            {
+                if (TryDeserializeArray<float>(value, 4, out var v))
+                {
+                    result = new Rect(v[0], v[1], v[2], v[3]);
+                    return true;
+                }
+            }
+            else if (type == typeof(RectInt))
+            {
+                if (TryDeserializeArray<int>(value, 4, out var v))
+                {
+                    result = new RectInt(v[0], v[1], v[2], v[3]);
+                    return true;
+                }
+            }
+            else if (type == typeof(Bounds))
+            {
+                if (TryDeserializeArray<float>(value, 6, out var v))
+                {
+                    result = new Bounds(new Vector3(v[0], v[1], v[2]), new Vector3(v[3], v[4], v[5]));
+                    return true;
+                }
+            }
+            else if (type == typeof(BoundsInt))
+            {
+                if (TryDeserializeArray<int>(value, 6, out var v))
+                {
+                    result = new BoundsInt(new Vector3Int(v[0], v[1], v[2]), new Vector3Int(v[3], v[4], v[5]));
+                    return true;
+                }
+            }
+            else if (type == typeof(Color))
+            {
+                if (ColorUtility.TryParseHtmlString(value, out var color))
+                {
+                    result = color;
+                    return true;
+                }
+            }
+            else if (type == typeof(LayerMask))
+            {
+                if (int.TryParse(value, out var intValue))
+                {
+                    result = new LayerMask() { value = intValue };
+                    return true;
+                }
+            }
+            else if (type.IsEnum)
+            {
+                if (int.TryParse(value, out var enumValue))
+                {
+                    result = enumValue;
+                    return true;
+                }
+            }
+            else if (type.IsArray)
+            {
+                if (TryDeserializeArray(type.GetElementType(), value, out var array))
+                {
+                    result = array;
+                    return true;
+                }
+            }
+            else if (typeof(IList).IsAssignableFrom(type))
+            {
+                if (TryDeserializeList(type, value, out var list))
+                {
+                    result = list;
+                    return true;
+                }
+            }
+
+            result = null;
+            return false;
+        }
+
+        internal static object Deserialize(Type t, string value)
+        {
+            if (TryDeserialize(t, value, out var result))
+            {
+                return result;
+            }
+
+            throw new Exception("Failed to deserialize value: " + value + " as type: " + t.Name);
+        }
+
+        internal static T Deserialize<T>(string value)
+        {
+            return (T)Deserialize(typeof(T), value);
+        }
+
+        private static List<Type> _nativeFlags = new List<Type>() {
+#if UNITY_PHYSICS
+            typeof(RigidbodyConstraints)
+#endif
+        };
+
+        internal static string GetSerializedTypeName(Type propertyType)
+        {
+            if (propertyType.IsEnum)
+            {
+                var sb = new StringBuilder();
+                var values = Enum.GetValues(propertyType);
+                var names = propertyType.GetEnumNames();
+                var underlyingType = Enum.GetUnderlyingType(propertyType);
+
+                bool nativeFlag = _nativeFlags.Contains(propertyType);
+                if (nativeFlag || propertyType.GetCustomAttribute(typeof(FlagsAttribute)) != null)
+                {
+                    sb.Append("Flags");
+                }
+                else
+                {
+                    sb.Append("Enum");
+                }
+
+                if (values.Length > 0)
+                {
+                    sb.Append(" ");
+                }
+
+                for (int i = 0; i < values.Length; i++)
+                {
+                    if (i > 0)
+                    {
+                        sb.Append(",");
+                    }
+
+                    sb.Append(names[i]);
+                    sb.Append(":");
+                    sb.Append(Convert.ChangeType(values.GetValue(i), underlyingType));
+                }
+
+                return sb.ToString();
+            }
+
+            if (propertyType.IsArray)
+            {
+                return "Array " + GetSerializedTypeName(propertyType.GetElementType());
+            }
+
+            if (typeof(IList).IsAssignableFrom(propertyType))
+            {
+                return "Array " + GetSerializedTypeName(propertyType.GetGenericArguments()[0]);
+            }
+
+            if (propertyType.IsSubclassOf(typeof(UnityEngine.Object)))
+            {
+                return "Object " + propertyType.Name;
+            }
+
+            return propertyType.Name;
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/ProximaSerialization.cs.meta b/Assets/Proxima/Runtime/ProximaSerialization.cs.meta
new file mode 100644
index 0000000..458a9c8
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaSerialization.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 201053f9f6c9b184a90c145b9e3733cd
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/ProximaServer.cs b/Assets/Proxima/Runtime/ProximaServer.cs
new file mode 100644
index 0000000..fc1e4ba
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaServer.cs
@@ -0,0 +1,9 @@
+namespace Proxima
+{
+    internal interface ProximaServer
+    {
+        void Start(string displayName, string password);
+        void Stop();
+        bool TryGetMessage(out (ProximaConnection, string) message);
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/ProximaServer.cs.meta b/Assets/Proxima/Runtime/ProximaServer.cs.meta
new file mode 100644
index 0000000..37abd6e
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaServer.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d0eba2327bf45a14ca7165f1058269b1
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/ProximaStatus.cs b/Assets/Proxima/Runtime/ProximaStatus.cs
new file mode 100644
index 0000000..b591527
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaStatus.cs
@@ -0,0 +1,75 @@
+using System;
+
+namespace Proxima
+{
+    public class ProximaStatus
+    {
+        // Is Proxima running?
+        private bool _isRunning;
+        public bool IsRunning => _isRunning;
+
+        // Information for how to connect to Proxima.
+        private string _connectInfo;
+        public string ConnectInfo => _connectInfo;
+
+        // True if Proxima is listening for connections.
+        private bool _listening;
+        public bool Listening => _listening;
+
+        // Number of active connections which have entered the correct password.
+        private int _connections;
+        public int Connections => _connections;
+
+        // Error message to display to the user.
+        private string _error;
+        public string Error => _error;
+
+        // Event which is fired when any of the above properties change.
+        public event Action Changed;
+
+        internal void Reset()
+        {
+            _isRunning = false;
+            _connectInfo = null;
+            _listening = false;
+            _connections = 0;
+            _error = null;
+            Changed?.Invoke();
+        }
+
+        internal void SetRunning(bool running)
+        {
+            _isRunning = running;
+            Changed?.Invoke();
+        }
+
+        internal void SetConnectInfo(string info)
+        {
+            _connectInfo = info;
+            _listening  = true;
+            _error = null;
+            Changed?.Invoke();
+        }
+
+        internal void SetError(string error)
+        {
+            _error = error;
+            Changed?.Invoke();
+        }
+
+        internal void IncrementConnections()
+        {
+            _connections++;
+            Changed?.Invoke();
+        }
+
+        internal void DecrementConnections()
+        {
+            if (_connections > 0)
+            {
+                _connections--;
+                Changed?.Invoke();
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/ProximaStatus.cs.meta b/Assets/Proxima/Runtime/ProximaStatus.cs.meta
new file mode 100644
index 0000000..5998aaf
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaStatus.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 99dc7c2f70983554c864c7aaac5267dd
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/ProximaStatusUI.cs b/Assets/Proxima/Runtime/ProximaStatusUI.cs
new file mode 100644
index 0000000..f58e995
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaStatusUI.cs
@@ -0,0 +1,122 @@
+#if UNITY_TMPRO
+
+using TMPro;
+using UnityEngine;
+
+namespace Proxima
+{
+    [HelpURL("https://www.unityproxima.com/docs")]
+    public class ProximaStatusUI : MonoBehaviour
+    {
+        // The inspector to monitor status from.
+        [SerializeField]
+        private ProximaInspector _proximaInspector;
+        public ProximaInspector ProximaInspector
+        {
+            get => _proximaInspector;
+            set => _proximaInspector = value;
+        }
+
+        // GameObject to show when Proxima is enabled.
+        [SerializeField]
+        private GameObject _uiRoot;
+        public GameObject UIRoot
+        {
+            get => _uiRoot;
+            set => _uiRoot = value;
+        }
+
+        // Label to show address to connect to Proxima.
+        [SerializeField]
+        private TMP_InputField _connectInfoLabel;
+        public TMP_InputField ConnectInfoLabel
+        {
+            get => _connectInfoLabel;
+            set => _connectInfoLabel = value;
+        }
+
+        // Label to show the current status and errors.
+        [SerializeField]
+        private TMP_Text _statusLabel;
+        public TMP_Text StatusLabel
+        {
+            get => _statusLabel;
+            set => _statusLabel = value;
+        }
+
+        private bool _isPortrait;
+
+        void Start()
+        {
+            _proximaInspector.Status.Changed += UpdateUI;
+            UpdateUI();
+        }
+
+        void OnDestroy()
+        {
+            if (_proximaInspector)
+            {
+                _proximaInspector.Status.Changed -= UpdateUI;
+            }
+        }
+
+        private void UpdateUI()
+        {
+            if (_uiRoot)
+            {
+                _uiRoot.SetActive(_proximaInspector.Status.Listening);
+            }
+
+            if (_connectInfoLabel)
+            {
+                _connectInfoLabel.text = _proximaInspector.Status.ConnectInfo;
+            }
+
+            if (_statusLabel)
+            {
+                if (_proximaInspector.Status.Connections > 0)
+                {
+                    if (_isPortrait)
+                    {
+                        _statusLabel.text = "Connected: " + _proximaInspector.Status.Connections;
+                    }
+                    else
+                    {
+                        _statusLabel.text = "Proxima connected to " + _proximaInspector.Status.Connections +
+                            (_proximaInspector.Status.Connections > 1 ? " clients." : " client.");
+                    }
+                }
+                else if (_proximaInspector.Status.Error != null)
+                {
+                    _statusLabel.text = _proximaInspector.Status.Error;
+                }
+                else if (_proximaInspector.Status.Listening)
+                {
+                    _statusLabel.text = _isPortrait ? "Listening" : "Proxima is listening for connections.";
+                }
+            }
+        }
+
+        void Update()
+        {
+            bool isPortrait = (float)Screen.width / (float)Screen.height < 0.75f;
+            if (_isPortrait != isPortrait)
+            {
+                _isPortrait = isPortrait;
+                UpdateUI();
+            }
+        }
+    }
+}
+
+#else
+
+namespace Proxima
+{
+    public class ProximaStatusUI : UnityEngine.MonoBehaviour
+    {
+        public ProximaInspector ProximaInspector;
+    }
+}
+
+#endif
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/ProximaStatusUI.cs.meta b/Assets/Proxima/Runtime/ProximaStatusUI.cs.meta
new file mode 100644
index 0000000..77718dc
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaStatusUI.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f8a779904589bf645b974624adf18491
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/ProximaStream.cs b/Assets/Proxima/Runtime/ProximaStream.cs
new file mode 100644
index 0000000..69862ef
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaStream.cs
@@ -0,0 +1,39 @@
+
+using System;
+using UnityEngine.Scripting;
+
+namespace Proxima
+{
+    [AttributeUsage(AttributeTargets.Method)]
+    internal class ProximaStreamStartAttribute : PreserveAttribute
+    {
+        public string Name;
+
+        public ProximaStreamStartAttribute(string name, bool hidden = false)
+        {
+            Name = name;
+        }
+    }
+
+    [AttributeUsage(AttributeTargets.Method)]
+    internal class ProximaStreamStopAttribute : PreserveAttribute
+    {
+        public string Name;
+
+        public ProximaStreamStopAttribute(string name, bool hidden = false)
+        {
+            Name = name;
+        }
+    }
+
+    [AttributeUsage(AttributeTargets.Method)]
+    internal class ProximaStreamUpdateAttribute : PreserveAttribute
+    {
+        public string Name;
+
+        public ProximaStreamUpdateAttribute(string name, bool hidden = false)
+        {
+            Name = name;
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/ProximaStream.cs.meta b/Assets/Proxima/Runtime/ProximaStream.cs.meta
new file mode 100644
index 0000000..7b0e961
--- /dev/null
+++ b/Assets/Proxima/Runtime/ProximaStream.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 52a8003bd3ff1f74ca735d2b68d69135
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/UnityComponents.json b/Assets/Proxima/Runtime/UnityComponents.json
new file mode 100644
index 0000000..bbc4bbc
--- /dev/null
+++ b/Assets/Proxima/Runtime/UnityComponents.json
@@ -0,0 +1,127 @@
+{
+    "UNITY_ANIMATION:UnityEngine.Animations.AimConstraint": ["constraintActive", "weight", "aimVector", "upVector", "worldUpType", "worldUpVector", "worldUpObject", "locked", "rotationAtRest", "rotationOffset", "rotationAxis"],
+    "UNITY_ANIMATION:Animation": ["clip", "playAutomatically", "animatePhysics", "cullingType"],
+    "UNITY_ANIMATION:Animator": ["runtimeAnimatorController", "avatar", "applyRootMotion", "updateMode", "cullingMode"],
+    "UNITY_PHYSICS_2D:AreaEffector2D": ["useColliderMask", "colliderMask", "useGlobalAngle", "forceAngle", "forceMagnitude", "forceVariation", "forceTarget", "drag", "angularDrag"],
+    "UNITY_2020_3_OR_NEWER && UNITY_PHYSICS:ArticulationBody": ["mass", "useGravity", "immovable", "linearDamping", "angularDamping", "collisionDetectionMode"],
+    "UNITY_AUDIO:AudioChorusFilter": ["dryMix", "wetMix1", "wetMix2", "wetMix3", "delay", "rate", "depth"],
+    "UNITY_AUDIO:AudioDistortionFilter": ["distortionLevel"],
+    "UNITY_AUDIO:AudioEchoFilter": ["delay", "decayRatio", "dryMix", "wetMix"],
+    "UNITY_AUDIO:AudioHighPassFilter": ["cutoffFrequency", "highpassResonanceQ"],
+    "UNITY_AUDIO:AudioLowPassFilter": ["cutoffFrequency", "lowpassResonanceQ"],
+    "UNITY_AUDIO:AudioReverbFilter": ["reverbPreset", "dryLevel", "room", "roomHF", "roomLF", "decayTime", "decayHFRatio", "reflectionsLevel", "reflectionsDelay", "reverbLevel", "reverbDelay", "hfReference", "lfReference", "diffusion", "density"],
+    "UNITY_AUDIO:AudioReverbZone": ["minDistance", "maxDistance", "reverbPreset", "room", "roomHF", "roomLF", "decayTime", "decayHFRatio", "reflections", "reflectionsDelay", "reverb", "reverbDelay", "HFReference", "LFReference", "diffusion", "density"],
+    "UNITY_AUDIO:AudioSource": ["clip", "outputAudioMixerGroup", "mute", "bypassEffects", "bypassListenerEffects", "bypassReverbZones", "playOnAwake", "loop", "priority", "volume", "pitch", "panStereo", "spatialBlend", "reverbZoneMix", "dopplerLevel", "spread", "rolloffMode", "minDistance", "maxDistance"],
+    "UNITY_PHYSICS:BoxCollider": ["isTrigger", "sharedMaterial", "center", "size"],
+    "UNITY_PHYSICS_2D:BoxCollider2D": ["sharedMaterial", "isTrigger", "usedByEffector", "!UNITY_2023_1_OR_NEWER:usedByComposite", "UNITY_2023_1_OR_NEWER:compositeOperation", "offset", "autoTiling", "size", "edgeRadius"],
+    "BillboardRenderer": ["billboard", "shadowCastingMode", "receiveShadows", "lightProbeUsage", "reflectionProbeUsage", "motionVectorGenerationMode", "allowOcclusionWhenDynamic"],
+    "UNITY_PHYSICS_2D:BuoyancyEffector2D": ["useColliderMask", "colliderMask", "density", "surfaceLevel", "linearDrag", "angularDrag", "flowAngle", "flowMagnitude", "flowVariation"],
+    "UNITY_GUI:UnityEngine.UI.Button": ["interactable", "transition", "targetGraphic", "colors", "navigation"],
+    "Camera": ["clearFlags", "backgroundColor", "cullingMask", "orthographic", "fieldOfView", "usePhysicalProperties", "nearClipPlane", "farClipPlane", "rect", "depth", "renderingPath", "targetTexture", "useOcclusionCulling", "allowHDR", "allowMSAA", "allowDynamicResolution", "targetDisplay"],
+    "UNITY_UI:Canvas": ["renderMode", "worldCamera", "pixelPerfect", "sortingOrder", "targetDisplay", "additionalShaderChannels"],
+    "UNITY_UI:CanvasGroup": ["alpha", "interactable", "blocksRaycasts", "ignoreParentGroups"],
+    "UNITY_UI:CanvasRenderer": ["cullTransparentMesh"],
+    "UNITY_GUI:UnityEngine.UI.CanvasScaler": ["uiScaleMode", "scaleFactor", "referenceResolution", "screenMatchMode", "physicalUnit", "fallbackScreenDPI", "defaultSpriteDPI", "referencePixelsPerUnit"],
+    "UNITY_PHYSICS:CapsuleCollider": ["isTrigger", "sharedMaterial", "center", "radius", "height", "direction"],
+    "UNITY_PHYSICS_2D:CapsuleCollider2D": ["sharedMaterial", "isTrigger", "usedByEffector", "!UNITY_2023_1_OR_NEWER:usedByComposite", "UNITY_2023_1_OR_NEWER:compositeOperation", "offset", "size", "direction"],
+    "UNITY_PHYSICS:CharacterController": ["slopeLimit", "stepOffset", "skinWidth", "minMoveDistance", "center", "radius", "height"],
+    "UNITY_PHYSICS:CharacterJoint": ["connectedBody", "UNITY_2020_2_OR_NEWER:connectedArticulationBody", "anchor", "axis", "autoConfigureConnectedAnchor", "connectedAnchor", "swingAxis", "twistLimitSpring", "lowTwistLimit", "highTwistLimit", "swingLimitSpring", "swing1Limit", "swing2Limit", "enableProjection", "projectionDistance", "projectionAngle", "breakForce", "breakTorque", "enableCollision", "enablePreprocessing", "massScale", "connectedMassScale"],
+    "UNITY_PHYSICS_2D:CircleCollider2D": ["sharedMaterial", "isTrigger", "usedByEffector", "!UNITY_2023_1_OR_NEWER:usedByComposite", "UNITY_2023_1_OR_NEWER:compositeOperation", "offset", "radius"],
+    "UNITY_CLOTH:Cloth": ["stretchingStiffness", "bendingStiffness", "useTethers", "useGravity", "damping", "externalAcceleration", "randomAcceleration", "worldVelocityScale", "worldAccelerationScale", "friction", "collisionMassScale", "enableContinuousCollision", "useVirtualParticles", "clothSolverFrequency", "sleepThreshold", "capsuleColliders", "sphereColliders"],
+    "UNITY_PHYSICS_2D:CompositeCollider2D": ["sharedMaterial", "isTrigger", "usedByEffector", "!UNITY_2023_1_OR_NEWER:usedByComposite", "UNITY_2023_1_OR_NEWER:compositeOperation", "offset", "geometryType", "generationType", "vertexDistance", "offsetDistance", "edgeRadius"],
+    "UNITY_PHYSICS:ConfigurableJoint": ["connectedBody", "UNITY_2020_2_OR_NEWER:connectedArticulationBody", "anchor", "axis", "autoConfigureConnectedAnchor", "connectedAnchor", "xMotion", "yMotion", "zMotion", "angularXMotion", "angularYMotion", "angularZMotion", "linearLimitSpring", "linearLimit", "angularXLimitSpring", "lowAngularXLimit", "highAngularXLimit", "angularYZLimitSpring", "angularYLimit", "angularZLimit", "targetPosition", "targetVelocity", "xDrive", "yDrive", "zDrive", "targetRotation", "targetAngularVelocity", "rotationDriveMode", "angularXDrive", "angularYZDrive", "slerpDrive", "projectionMode", "projectionDistance", "projectionAngle", "configuredInWorldSpace", "swapBodies", "breakForce", "breakTorque", "enableCollision", "enablePreprocessing", "massScale", "connectedMassScale"],
+    "UNITY_PHYSICS:ConstantForce": ["force", "relativeForce", "torque", "relativeTorque"],
+    "UNITY_PHYSICS_2D:ConstantForce2D": ["force", "relativeForce", "torque"],
+    "UNITY_GUI:UnityEngine.UI.ContentSizeFitter": ["horizontalFit", "verticalFit"],
+    "UNITY_PHYSICS_2D:DistanceJoint2D": ["enableCollision", "connectedBody", "autoConfigureConnectedAnchor", "anchor", "connectedAnchor", "autoConfigureDistance", "distance", "maxDistanceOnly", "breakForce"],
+    "UNITY_GUI:UnityEngine.UI.Dropdown": ["interactable", "transition", "targetGraphic", "colors", "navigation", "template", "captionText", "captionImage", "itemText", "itemImage", "value", "alphaFadeSpeed", "options"],
+    "UNITY_PHYSICS_2D:EdgeCollider2D": ["sharedMaterial", "isTrigger", "usedByEffector", "!UNITY_2023_1_OR_NEWER:usedByComposite", "UNITY_2023_1_OR_NEWER:compositeOperation", "offset", "edgeRadius", "points", "UNITY_2020_1_OR_NEWER:useAdjacentStartPoint", "UNITY_2020_1_OR_NEWER:useAdjacentEndPoint"],
+    "UNITY_GUI:UnityEngine.EventSystems.EventSystem": ["firstSelectedGameObject", "sendNavigationEvents", "pixelDragThreshold"],
+    "UNITY_PHYSICS_2D:FixedJoint2D": ["enableCollision", "connectedBody", "autoConfigureConnectedAnchor", "anchor", "connectedAnchor", "dampingRatio", "frequency", "breakForce", "breakTorque"],
+    "UNITY_PHYSICS_2D:FrictionJoint2D": ["enableCollision", "connectedBody", "autoConfigureConnectedAnchor", "anchor", "connectedAnchor", "maxForce", "maxTorque", "breakForce", "breakTorque"],
+    "UNITY_GUI:UnityEngine.UI.GraphicRaycaster": ["ignoreReversedGraphics", "blockingObjects", "UNITY_2020_2_OR_NEWER:blockingMask"],
+    "Grid": ["cellSize", "cellGap", "cellLayout", "cellSwizzle"],
+    "UNITY_GUI:UnityEngine.UI.GridLayoutGroup": ["padding", "cellSize", "spacing", "startCorner", "startAxis", "childAlignment", "constraint"],
+    "UNITY_PHYSICS:HingeJoint": ["connectedBody", "UNITY_2020_2_OR_NEWER:connectedArticulationBody", "anchor", "axis", "autoConfigureConnectedAnchor", "connectedAnchor", "useSpring", "spring", "useMotor", "motor", "useLimits", "limits", "breakForce", "breakTorque", "enableCollision", "enablePreprocessing", "massScale", "connectedMassScale"],
+    "UNITY_PHYSICS_2D:HingeJoint2D": ["enableCollision", "connectedBody", "autoConfigureConnectedAnchor", "anchor", "connectedAnchor", "useMotor", "motor", "useLimits", "limits", "breakForce", "breakTorque"],
+    "UNITY_GUI:UnityEngine.UI.HorizontalLayoutGroup": ["padding", "spacing", "childAlignment", "childControlWidth", "childControlHeight", "childScaleWidth", "childScaleHeight", "childForceExpandWidth", "childForceExpandHeight"],
+    "UNITY_GUI:UnityEngine.UI.VerticalLayoutGroup": ["padding", "spacing", "childAlignment", "childControlWidth", "childControlHeight", "childScaleWidth", "childScaleHeight", "childForceExpandWidth", "childForceExpandHeight"],
+    "UNITY_GUI:UnityEngine.UI.Image": ["sprite", "material", "color", "raycastTarget", "UNITY_2020_1_OR_NEWER:raycastPadding", "maskable"],
+    "UNITY_GUI:UnityEngine.UI.InputField": ["interactable", "transition", "targetGraphic", "colors", "navigation", "textComponent", "text", "characterLimit", "contentType", "lineType", "placeholder", "caretBlinkRate", "caretWidth", "customCaretColor", "selectionColor", "shouldHideMobileInput", "readOnly", "UNITY_2020_3_OR_NEWER:shouldActivateOnSelect"],
+    "UNITY_GUI:UnityEngine.UI.LayoutElement": ["ignoreLayout", "minWidth", "minHeight", "preferredWidth", "preferredHeight", "flexibleWidth", "flexibleHeight", "layoutPriority"],
+    "LensFlare": ["flare", "color", "brightness", "fadeSpeed"],
+    "Light": ["type", "range", "spotAngle", "color", "intensity", "bounceIntensity", "shadows", "cookie", "flare", "renderMode", "cullingMask"],
+    "LightProbeProxyVolume": ["refreshMode", "qualityMode", "UNITY_2020_2_OR_NEWER:dataFormat", "boundingBoxMode", "resolutionMode", "probeDensity", "probePositionMode"],
+    "LineRenderer": ["loop", "startColor", "endColor", "numCornerVertices", "numCapVertices", "alignment", "textureMode", "shadowBias", "generateLightingData", "useWorldSpace", "sharedMaterials", "shadowCastingMode", "receiveShadows", "lightProbeUsage", "reflectionProbeUsage", "motionVectorGenerationMode", "allowOcclusionWhenDynamic", "sortingLayerID", "sortingOrder"],
+    "UNITY_ANIMATION:UnityEngine.Animations.LookAtConstraint": ["constraintActive", "weight", "useUpObject", "roll", "worldUpObject", "locked", "rotationAtRest", "rotationOffset"],
+    "UNITY_GUI:UnityEngine.UI.Mask": ["showMaskGraphic"],
+    "UNITY_PHYSICS:MeshCollider": ["convex", "isTrigger", "cookingOptions", "sharedMaterial", "sharedMesh"],
+    "MeshFilter": ["sharedMesh"],
+    "MeshRenderer": ["sharedMaterials", "shadowCastingMode", "receiveShadows", "lightProbeUsage", "reflectionProbeUsage", "probeAnchor", "motionVectorGenerationMode", "allowOcclusionWhenDynamic"],
+    "UNITY_AI:UnityEngine.AI.NavMeshAgent": ["agentTypeID", "baseOffset", "speed", "angularSpeed", "acceleration", "stoppingDistance", "autoBraking", "radius", "height", "obstacleAvoidanceType", "avoidancePriority", "autoTraverseOffMeshLink", "autoRepath", "areaMask"],
+    "UNITY_AI:UnityEngine.AI.NavMeshObstacle": ["shape", "center", "size", "carving"],
+    "OcclusionArea": ["size", "center"],
+    "OcclusionPortal": ["open"],
+    "UNITY_AI && !UNITY_2023_2_OR_NEWER:UnityEngine.AI.OffMeshLink": ["startTransform", "endTransform", "costOverride", "biDirectional", "activated", "autoUpdatePositions", "area"],
+    "UNITY_GUI:UnityEngine.UI.Outline": ["effectColor", "effectDistance", "useGraphicAlpha"],
+    "UNITY_ANIMATION:UnityEngine.Animations.ParentConstraint": ["constraintActive", "weight", "locked", "translationAtRest", "rotationAtRest", "translationOffsets", "rotationOffsets", "translationAxis", "rotationAxis"],
+    "UNITY_PARTICLE_SYSTEM:ParticleSystemForceField": ["shape", "startRange", "endRange", "directionX", "directionY", "directionZ", "gravity", "gravityFocus", "rotationSpeed", "rotationAttraction", "rotationRandomness", "drag", "multiplyDragByParticleSize", "multiplyDragByParticleVelocity", "vectorField", "vectorFieldSpeed", "vectorFieldAttraction", "UNITY_2021_3_OR_NEWER:enabled"],
+    "UNITY_GUI:UnityEngine.EventSystems.Physics2DRaycaster": ["eventMask", "maxRayIntersections"],
+    "UNITY_GUI:UnityEngine.EventSystems.PhysicsRaycaster": ["eventMask", "maxRayIntersections"],
+    "UNITY_PHYSICS_2D:PlatformEffector2D": ["useColliderMask", "colliderMask", "rotationalOffset", "useOneWay", "useOneWayGrouping", "surfaceArc", "useSideFriction", "useSideBounce", "sideArc"],
+    "UNITY_DIRECTOR:UnityEngine.Playables.PlayableDirector": ["playableAsset", "timeUpdateMode", "playOnAwake", "extrapolationMode", "initialTime", "time"],
+    "UNITY_PHYSICS_2D:PointEffector2D": ["useColliderMask", "colliderMask", "forceMagnitude", "forceVariation", "distanceScale", "forceSource", "forceTarget", "forceMode", "drag", "angularDrag"],
+    "UNITY_PHYSICS_2D:PolygonCollider2D": ["sharedMaterial", "isTrigger", "usedByEffector", "!UNITY_2023_1_OR_NEWER:usedByComposite", "UNITY_2023_1_OR_NEWER:compositeOperation", "autoTiling", "offset", "pathCount", "points"],
+    "UNITY_ANIMATION:UnityEngine.Animations.PositionConstraint": ["constraintActive", "weight", "locked", "translationAtRest", "translationOffset", "translationAxis"],
+    "Projector": ["nearClipPlane", "farClipPlane", "fieldOfView", "aspectRatio", "orthographic", "orthographicSize", "material", "ignoreLayers"],
+    "UNITY_GUI:UnityEngine.UI.RawImage": ["texture", "color", "raycastTarget", "UNITY_2020_1_OR_NEWER:raycastPadding", "maskable", "uvRect"],
+    "UNITY_GUI:UnityEngine.UI.RectMask2D": ["padding", "softness"],
+    "RectTransform": ["localPosition", "sizeDelta", "anchorMin", "anchorMax", "localRotation", "localScale"],
+    "ReflectionProbe": ["mode", "importance", "intensity", "boxProjection", "blendDistance", "size", "center", "resolution", "hdr", "shadowDistance", "clearFlags", "backgroundColor", "cullingMask", "nearClipPlane", "farClipPlane"],
+    "UNITY_PHYSICS_2D:RelativeJoint2D": ["enableCollision", "connectedBody", "maxForce", "maxTorque", "correctionScale", "autoConfigureOffset", "linearOffset", "angularOffset", "breakForce", "breakTorque"],
+    "UNITY_PHYSICS:Rigidbody": ["mass", "drag", "angularDrag", "useGravity", "isKinematic", "interpolation", "collisionDetectionMode", "constraints"],
+    "UNITY_PHYSICS_2D:Rigidbody2D": ["bodyType", "simulated", "useAutoMass", "mass", "drag", "angularDrag", "gravityScale", "collisionDetectionMode", "sleepMode", "interpolation", "constraints"],
+    "UNITY_ANIMATION:UnityEngine.Animations.RotationConstraint": ["constraintActive", "weight", "locked", "rotationAtRest", "rotationOffset", "rotationAxis"],
+    "UNITY_ANIMATION:UnityEngine.Animations.ScaleConstraint": ["constraintActive", "weight", "locked", "scaleAtRest", "scaleOffset", "scalingAxis"],
+    "UNITY_GUI:UnityEngine.UI.Scrollbar": ["interactable", "transition", "targetGraphic", "colors", "navigation", "handleRect", "direction", "value", "size", "numberOfSteps"],
+    "UNITY_GUI:UnityEngine.UI.ScrollRect": ["content", "horizontal", "vertical", "movementType", "elasticity", "inertia", "decelerationRate", "scrollSensitivity", "viewport", "horizontalScrollbar", "verticalScrollbar"],
+    "UNITY_GUI:UnityEngine.UI.Shadow": ["effectColor", "effectDistance", "useGraphicAlpha"],
+    "SkinnedMeshRenderer": ["UNITY_2021_2_OR_NEWER:bounds", "quality", "updateWhenOffscreen", "sharedMesh", "rootBone", "sharedMaterials", "shadowCastingMode", "receiveShadows", "lightProbeUsage", "reflectionProbeUsage", "motionVectorGenerationMode", "allowOcclusionWhenDynamic"],
+    "Skybox": ["material"],
+    "UNITY_GUI:UnityEngine.UI.Slider": ["interactable", "transition", "targetGraphic", "colors", "navigation", "fillRect", "handleRect", "direction", "minValue", "maxValue", "wholeNumbers", "value"],
+    "UNITY_PHYSICS_2D:SliderJoint2D": ["enableCollision", "connectedBody", "autoConfigureConnectedAnchor", "anchor", "connectedAnchor", "autoConfigureAngle", "angle", "useMotor", "motor", "useLimits", "limits", "breakForce", "breakTorque"],
+    "UnityEngine.Rendering.SortingGroup": ["sortingLayerID", "sortingOrder"],
+    "UNITY_PHYSICS:SphereCollider": ["isTrigger", "sharedMaterial", "center", "radius"],
+    "UNITY_PHYSICS:SpringJoint": ["connectedBody", "UNITY_2020_2_OR_NEWER:connectedArticulationBody", "anchor", "axis", "autoConfigureConnectedAnchor", "connectedAnchor", "spring", "damper", "minDistance", "maxDistance", "tolerance", "breakForce", "breakTorque", "enableCollision", "enablePreprocessing", "massScale", "connectedMassScale"],
+    "UNITY_PHYSICS_2D:SpringJoint2D": ["enableCollision", "connectedBody", "autoConfigureConnectedAnchor", "anchor", "connectedAnchor", "autoConfigureDistance", "distance", "dampingRatio", "frequency", "breakForce"],
+    "SpriteMask": ["sprite", "alphaCutoff", "isCustomRangeActive", "frontSortingOrder"],
+    "SpriteRenderer": ["sprite", "color", "flipX", "flipY", "drawMode", "maskInteraction", "spriteSortPoint", "sharedMaterials", "sortingLayerID", "sortingOrder"],
+    "UNITY_UI:UnityEngine.U2D.SpriteShapeRenderer": ["color", "maskInteraction", "sharedMaterials", "sortingLayerID", "sortingOrder"],
+    "UNITY_GUI:UnityEngine.EventSystems.StandaloneInputModule": ["horizontalAxis", "verticalAxis", "submitButton", "cancelButton", "inputActionsPerSecond", "repeatDelay"],
+    "StreamingController": ["streamingMipmapBias"],
+    "UNITY_PHYSICS_2D:SurfaceEffector2D": ["useColliderMask", "colliderMask", "speed", "speedVariation", "forceScale", "useContactForce", "useFriction", "useBounce"],
+    "UNITY_PHYSICS_2D:TargetJoint2D": ["anchor", "target", "autoConfigureTarget", "maxForce", "dampingRatio", "frequency", "breakForce"],
+    "UNITY_TERRAIN_PHYSICS:TerrainCollider": ["isTrigger", "sharedMaterial", "terrainData"],
+    "UNITY_GUI:UnityEngine.UI.Text": ["text", "font", "fontStyle", "fontSize", "lineSpacing", "supportRichText", "alignment", "alignByGeometry", "horizontalOverflow", "verticalOverflow", "resizeTextForBestFit", "color", "raycastTarget", "UNITY_2020_1_OR_NEWER:raycastPadding", "maskable"],
+    "UNITY_TMPRO:TMPro.TextContainer": ["anchorPosition", "width", "height", "margins"],
+    "TextMesh": ["text", "offsetZ", "characterSize", "lineSpacing", "anchor", "alignment", "tabSize", "fontSize", "fontStyle", "richText", "font", "color"],
+    "UNITY_TMPRO:TMPro.TextMeshPro": ["text", "font", "fontStyle", "fontSize", "autoSizeTextContainer", "color", "colorGradientPreset", "colorGradient", "overrideColorTags", "characterSpacing", "wordSpacing", "lineSpacing", "paragraphSpacing", "alignment", "enableWordWrapping", "overflowMode", "horizontalMapping", "verticalMapping", "margin", "sortingLayerID", "sortingOrder", "geometrySortingOrder", "isTextObjectScaleStatic", "isOrthographic", "richText", "parseCtrlCharacters", "useMaxVisibleDescender", "spriteAsset", "styleSheet", "enableKerning", "extraPadding"],
+    "UNITY_TMPRO:TMPro.TextMeshProUGUI": ["text", "font", "fontStyle", "fontSize", "autoSizeTextContainer", "color", "colorGradientPreset", "colorGradient", "overrideColorTags", "characterSpacing", "wordSpacing", "lineSpacing", "paragraphSpacing", "alignment", "enableWordWrapping", "overflowMode", "horizontalMapping", "verticalMapping", "margin", "geometrySortingOrder", "isTextObjectScaleStatic", "isOrthographic", "richText", "parseCtrlCharacters", "useMaxVisibleDescender", "spriteAsset", "styleSheet", "enableKerning", "extraPadding"],
+    "UNITY_TILEMAP:UnityEngine.Tilemaps.Tilemap": ["animationFrameRate", "color", "tileAnchor", "orientation"],
+    "UNITY_TILEMAP:UnityEngine.Tilemaps.TilemapCollider2D": ["maximumTileChangeCount", "extrusionFactor", "sharedMaterial", "isTrigger", "usedByEffector", "!UNITY_2023_1_OR_NEWER:usedByComposite", "UNITY_2023_1_OR_NEWER:compositeOperation", "offset"],
+    "UNITY_TILEMAP:UnityEngine.Tilemaps.TilemapRenderer": ["sortOrder", "mode", "detectChunkCullingBounds", "chunkCullingBounds", "maskInteraction", "sharedMaterials", "sortingLayerID", "sortingOrder"],
+    "UNITY_TMPRO:TMPro.TMP_Dropdown": ["template", "captionText", "captionImage", "placeholder", "itemText", "itemImage", "value", "alphaFadeSpeed", "options"],
+    "UNITY_TMPRO:TMPro.TMP_InputField": ["interactable", "transition", "targetGraphic", "colors", "navigation", "textViewport", "textComponent", "text", "fontAsset", "pointSize", "characterLimit", "contentType", "lineType", "placeholder", "verticalScrollbar", "caretBlinkRate", "caretWidth", "customCaretColor", "selectionColor", "onFocusSelectAll", "resetOnDeActivation", "restoreOriginalTextOnEscape", "shouldHideSoftKeyboard", "shouldHideMobileInput", "readOnly", "richText", "isRichTextEditingAllowed"],
+    "UNITY_TMPRO:TMPro.TMP_ScrollbarEventHandler": ["isSelected"],
+    "UNITY_TMPRO:TMPro.TMP_SubMesh": ["fontAsset", "spriteAsset"],
+    "UNITY_TMPRO:TMPro.TMP_SubMeshUI": ["fontAsset", "spriteAsset"],
+    "UNITY_GUI:UnityEngine.UI.Toggle": ["interactable", "transition", "targetGraphic", "colors", "navigation", "isOn", "toggleTransition", "graphic", "group"],
+    "UNITY_GUI:UnityEngine.UI.ToggleGroup": ["allowSwitchOff"],
+    "TrailRenderer": ["time", "minVertexDistance", "autodestruct", "emitting", "colorGradient", "numCornerVertices", "numCapVertices", "alignment", "textureMode", "generateLightingData", "shadowBias", "sharedMaterials", "shadowCastingMode", "receiveShadows", "lightProbeUsage", "reflectionProbeUsage", "motionVectorGenerationMode", "allowOcclusionWhenDynamic", "sortingLayerID", "sortingOrder"],
+    "Transform": ["localPosition", "localRotation", "localScale"],
+    "UNITY_2021_2_OR_NEWER && UNITY_UIELEMENTS:UnityEngine.UIElements.UIDocument": ["panelSettings", "visualTreeAsset", "sortingOrder"],
+    "UNITY_VIDEO:UnityEngine.Video.VideoPlayer": ["source", "clip", "url", "playOnAwake", "waitForFirstFrame", "isLooping", "skipOnDrop", "playbackSpeed", "renderMode", "targetCamera", "targetCameraAlpha", "targetCamera3DLayout", "aspectRatio", "audioOutputMode", "controlledAudioTrackCount"],
+    "UNITY_VEHICLES:WheelCollider": ["mass", "radius", "wheelDampingRate", "suspensionDistance", "forceAppPointDistance", "center", "suspensionSpring", "forwardFriction", "sidewaysFriction"],
+    "UNITY_PHYSICS_2D:WheelJoint2D": ["enableCollision", "connectedBody", "autoConfigureConnectedAnchor", "anchor", "connectedAnchor", "suspension", "useMotor", "motor", "breakForce", "breakTorque"],
+    "UNITY_WIND:WindZone": ["mode", "windMain", "windTurbulence", "windPulseMagnitude", "windPulseFrequency"]
+}
diff --git a/Assets/Proxima/Runtime/UnityComponents.json.meta b/Assets/Proxima/Runtime/UnityComponents.json.meta
new file mode 100644
index 0000000..21fa190
--- /dev/null
+++ b/Assets/Proxima/Runtime/UnityComponents.json.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d6f93b674e30e4fc0bfa22e0880c4c87
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/WebGL.meta b/Assets/Proxima/Runtime/WebGL.meta
new file mode 100644
index 0000000..8ac0be2
--- /dev/null
+++ b/Assets/Proxima/Runtime/WebGL.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 65bd8c67802efd14abb7aead9681ea6d
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/WebGL/ProximaWebGL.jslib b/Assets/Proxima/Runtime/WebGL/ProximaWebGL.jslib
new file mode 100644
index 0000000..f632b07
--- /dev/null
+++ b/Assets/Proxima/Runtime/WebGL/ProximaWebGL.jslib
@@ -0,0 +1,113 @@
+const ProximaWebGLLib = {
+    $channels: {},
+
+    ProximaWebGLCreate: function(displayName, instanceId, productName, companyName, platform, productVersion, proximaVersion, connectionId, messageCb, closeCB) {
+        const connId = UTF8ToString(connectionId);
+        const instId = UTF8ToString(instanceId);
+        const inChannel = new BroadcastChannel('proxima-' + connId + '-in');
+        const outChannel = new BroadcastChannel('proxima-' + connId + '-out');
+
+        const conIdUtf8Length = lengthBytesUTF8(connId) + 1;
+        const connIdUtf8 = _malloc(conIdUtf8Length);
+        stringToUTF8(connId, connIdUtf8, conIdUtf8Length);
+
+        inChannel.onmessage = function(e) {
+            if (e.data === 'close') {
+                Module.dynCall_vi(closeCB, connIdUtf8);
+                return;
+            }
+
+            const size = lengthBytesUTF8(e.data) + 1;
+            const buffer = _malloc(size);
+            stringToUTF8(e.data, buffer, size);
+
+            try {
+                Module.dynCall_vii(messageCb, connIdUtf8, buffer);
+            } finally {
+                _free(buffer);
+            }
+        };
+
+        const channel = {
+            out: outChannel,
+            in: inChannel,
+            connIdUtf8: connIdUtf8,
+        };
+
+        channels[connId] = channel;
+
+        const connections = [{
+            DisplayName: UTF8ToString(displayName),
+            InstanceId: instId,
+            ProductName: UTF8ToString(productName),
+            CompanyName: UTF8ToString(companyName),
+            Platform: UTF8ToString(platform),
+            ProductVersion: UTF8ToString(productVersion),
+            ProximaVersion: UTF8ToString(proximaVersion),
+            ConnectionId: connId
+        }];
+
+        // Avoid hanging onto old connections in localStorage by clearing it out
+        window.localStorage.setItem('proxima-connections', JSON.stringify(connections));
+
+        window.addEventListener('pagehide', function() {
+            if (channel.out) {
+                const connections = window.localStorage.getItem('proxima-connections');
+                if (connections && connections.includes(connId)) {
+                    window.localStorage.setItem('proxima-connections', '[]');
+                }
+
+                channel.out.postMessage('close');
+            }
+        });
+    },
+
+    ProximaWebGLSelected: function(connectionId) {
+        window.localStorage.setItem('proxima-connections', '[]');
+    },
+
+    ProximaWebGLOpenOnMouseUp: function(url) {
+        const urlString = UTF8ToString(url);
+        function openUrl() {
+            window.open(urlString, '_blank');
+            document.removeEventListener('mouseup', openUrl);
+        }
+
+        document.addEventListener('mouseup', openUrl);
+    },
+
+    ProximaWebGLDestroy: function(connectionId) {
+        const connId = UTF8ToString(connectionId);
+
+        const outChannel = channels[connId].out;
+        if (outChannel) {
+            outChannel.postMessage('close');
+            outChannel.close();
+        }
+
+        const inChannel = channels[connId].in;
+        if (inChannel) {
+            inChannel.close();
+        }
+
+        const connIdUtf8 = channels[connId].connIdUtf8;
+        if (connIdUtf8) {
+            _free(connIdUtf8);
+        }
+
+        const connections = window.localStorage.getItem('proxima-connections');
+        if (connections && connections.includes(connId)) {
+            window.localStorage.setItem('proxima-connections', '[]');
+        }
+
+        delete channels[connId];
+    },
+
+    ProximaWebGLSend: function(connectionId, data) {
+        const connId = UTF8ToString(connectionId);
+        channels[connId].out.postMessage(UTF8ToString(data));
+    }
+}
+
+autoAddDeps(ProximaWebGLLib, '$channels');
+mergeInto(LibraryManager.library, ProximaWebGLLib);
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/WebGL/ProximaWebGL.jslib.meta b/Assets/Proxima/Runtime/WebGL/ProximaWebGL.jslib.meta
new file mode 100644
index 0000000..e9b14df
--- /dev/null
+++ b/Assets/Proxima/Runtime/WebGL/ProximaWebGL.jslib.meta
@@ -0,0 +1,32 @@
+fileFormatVersion: 2
+guid: 0a66e2f15d6d7b441ba16ebb86095440
+PluginImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  iconMap: {}
+  executionOrder: {}
+  defineConstraints: []
+  isPreloaded: 0
+  isOverridable: 0
+  isExplicitlyReferenced: 0
+  validateReferences: 1
+  platformData:
+  - first:
+      Any: 
+    second:
+      enabled: 0
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 0
+      settings:
+        DefaultValueInitialized: true
+  - first:
+      WebGL: WebGL
+    second:
+      enabled: 1
+      settings: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/WebGL/ProximaWebGLConnection.cs b/Assets/Proxima/Runtime/WebGL/ProximaWebGLConnection.cs
new file mode 100644
index 0000000..5d80804
--- /dev/null
+++ b/Assets/Proxima/Runtime/WebGL/ProximaWebGLConnection.cs
@@ -0,0 +1,195 @@
+#if UNITY_WEBGL
+
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.IO;
+using System.Runtime.InteropServices;
+using AOT;
+using UnityEngine;
+
+namespace Proxima
+{
+    internal class ProximaWebGLConnection : ProximaConnection, IDisposable
+    {
+        public bool Open => _open;
+
+        public event Action OnConnect;
+        public event Action OnClose;
+
+        private ConcurrentQueue<(ProximaConnection, string)> _receiveQueue;
+
+        private string _password;
+        private bool _passwordProvided = false;
+        private ProximaInstanceHello _hello;
+        private DateTime _lastListTime;
+        private DateTime _lastSelectTime;
+        private ProximaStatus _status;
+        private ProximaDispatcher _dispatcher;
+        private bool _open;
+
+        private static Dictionary<string, ProximaWebGLConnection> _connections = new Dictionary<string, ProximaWebGLConnection>();
+
+        [DllImport("__Internal")]
+        private static extern void ProximaWebGLCreate(
+            string displayName,
+            string instanceId,
+            string productName,
+            string companyName,
+            string platform,
+            string productVersion,
+            string proximaVersion,
+            string connectionId,
+            Action<string, string> messageCb,
+            Action<string> closeCB);
+
+        [DllImport("__Internal")]
+        private static extern void ProximaWebGLSelected(string connectionId);
+
+        [DllImport("__Internal")]
+        private static extern void ProximaWebGLOpenOnMouseUp(string url);
+
+        [DllImport("__Internal")]
+        private static extern void ProximaWebGLSend(string connectionId, string message);
+
+        [DllImport("__Internal")]
+        private static extern void ProximaWebGLDestroy(string connectionId);
+
+        public ProximaWebGLConnection(string displayName, string password, ProximaDispatcher dispatcher, ProximaStatus status, ConcurrentQueue<(ProximaConnection, string)> queue)
+        {
+            _receiveQueue = queue;
+            _dispatcher = dispatcher;
+            _status = status;
+
+            _hello = ProximaSerialization.CreateHello(displayName);
+            _password = ProximaSerialization.HashPassword(password, _hello.ConnectionId);
+
+            _connections.Add(_hello.ConnectionId, this);
+
+            ProximaWebGLCreate(
+                _hello.DisplayName,
+                _hello.InstanceId,
+                _hello.ProductName,
+                _hello.CompanyName,
+                _hello.Platform,
+                _hello.ProductVersion,
+                _hello.ProximaVersion,
+                _hello.ConnectionId,
+                OnMessageStatic,
+                OnCloseStatic);
+        }
+
+        public static void OpenOnMouseUp(string url)
+        {
+            ProximaWebGLOpenOnMouseUp(url);
+        }
+
+        [MonoPInvokeCallback(typeof(Action<string, string>))]
+        public static void OnMessageStatic(string connectionId, string message)
+        {
+            try
+            {
+                _connections[connectionId].OnMessageInstance(message);
+            }
+            catch (Exception e)
+            {
+                Log.Exception(e);
+            }
+        }
+
+        [MonoPInvokeCallback(typeof(Action<string>))]
+        public static void OnCloseStatic(string connectionId)
+        {
+            try
+            {
+                _connections[connectionId].OnCloseInstance();
+            }
+            catch (Exception e)
+            {
+                Log.Exception(e);
+            }
+        }
+
+        private void OnCloseInstance()
+        {
+            _open = false;
+            _dispatcher.Dispatch(() => {
+                if (_passwordProvided)
+                {
+                    OnClose?.Invoke();
+                }
+            });
+        }
+
+        public void SendMessage(MemoryStream data)
+        {
+            var message = System.Text.Encoding.UTF8.GetString(data.GetBuffer(), 0, (int)data.Length);
+            Log.Verbose("Sending: " + message);
+            ProximaWebGLSend(_hello.ConnectionId, message);
+        }
+
+        private void OnMessageInstance(string message)
+        {
+            Log.Verbose("Received: " + message);
+
+            if (_passwordProvided)
+            {
+                _receiveQueue.Enqueue((this, message));
+            }
+            else
+            {
+                ProximaRequest request;
+
+                try
+                {
+                    request = JsonUtility.FromJson<ProximaRequest>(message);
+                }
+                catch (Exception ex)
+                {
+                    Log.Error("Failed to parse request: " + ex.Message);
+                    return;
+                }
+
+                if (request.Type == ProximaRequestType.Select)
+                {
+                    if (_lastSelectTime != null && DateTime.Now - _lastSelectTime < TimeSpan.FromSeconds(1))
+                    {
+                        SendMessage(ProximaSerialization.ErrorResponse(request, "Too many requests."));
+                        return;
+                    }
+
+                    MemoryStream response;
+                    if (request.Cmd != _hello.InstanceId)
+                    {
+                        response = ProximaSerialization.ErrorResponse(request, "Invalid selection.");
+                    }
+                    else if (request.Args.Length != 1 || request.Args[0] != _password)
+                    {
+                        response = ProximaSerialization.ErrorResponse(request, "Invalid password.");
+                    }
+                    else
+                    {
+                        response = ProximaSerialization.DataResponse(request, "OK");
+                        _open = true;
+                        _passwordProvided = true;
+                        _dispatcher.Dispatch(() => OnConnect?.Invoke());
+                    }
+
+                    SendMessage(response);
+                    _lastSelectTime = DateTime.Now;
+                }
+                else
+                {
+                    Log.Info("Unknown request: " + request.Type);
+                }
+            }
+        }
+
+        public void Dispose()
+        {
+            ProximaWebGLDestroy(_hello.ConnectionId);
+        }
+    }
+}
+
+#endif
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/WebGL/ProximaWebGLConnection.cs.meta b/Assets/Proxima/Runtime/WebGL/ProximaWebGLConnection.cs.meta
new file mode 100644
index 0000000..00212a6
--- /dev/null
+++ b/Assets/Proxima/Runtime/WebGL/ProximaWebGLConnection.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 86c13c40d96ce6c4ebd1ef78ca0ec678
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/WebGL/ProximaWebGLServer.cs b/Assets/Proxima/Runtime/WebGL/ProximaWebGLServer.cs
new file mode 100644
index 0000000..ac461eb
--- /dev/null
+++ b/Assets/Proxima/Runtime/WebGL/ProximaWebGLServer.cs
@@ -0,0 +1,121 @@
+#if UNITY_WEBGL
+
+using System.Collections;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace Proxima
+{
+    internal class ProximaWebGLServer : ProximaServer
+    {
+        private ConcurrentQueue<(ProximaConnection, string)> _receiveQueue;
+        private ProximaDispatcher _dispatcher;
+        private WaitForSeconds _wait = new WaitForSeconds(1);
+        private ProximaStatus _status;
+        private ProximaWebGLConnection _pendingConnection;
+        private List<ProximaWebGLConnection> _activeConnections = new List<ProximaWebGLConnection>();
+        private string _displayName;
+        private string _password;
+
+        public ProximaWebGLServer(ProximaDispatcher dispatcher, ProximaStatus status)
+        {
+            _dispatcher = dispatcher;
+            _status = status;
+        }
+
+        public void Start(string displayName, string password)
+        {
+            Log.Info("Proxima Inspector started for WebGL.");
+            _displayName = displayName;
+            _password = password;
+            _receiveQueue = new ConcurrentQueue<(ProximaConnection, string)>();
+            _status.SetConnectInfo(Application.streamingAssetsPath + "/proxima/index.html");
+            CreateNewConnection();
+        }
+
+        private IEnumerator CreateNewConnectionCoroutine()
+        {
+            yield return _wait;
+            if (_pendingConnection != null)
+            {
+                yield break;
+            }
+
+            try
+            {
+
+                Log.Verbose("Opening new Proxima WebGL connection: ");
+                var conn = new ProximaWebGLConnection(_displayName, _password, _dispatcher, _status, _receiveQueue);
+
+                conn.OnConnect += () => {
+                    Log.Verbose("Connected.");
+                    _activeConnections.Add(conn);
+                    _status.IncrementConnections();
+                    CreateNewConnection();
+                };
+
+                conn.OnClose += () => {
+                    Log.Verbose("Disconnected.");
+                    conn.Dispose();
+
+                    if (conn == _pendingConnection)
+                    {
+                        if (_receiveQueue != null)
+                        {
+                            Log.Verbose("Failed to create WebGL connection. Check for JavaScript errors.");
+                            _status.SetError("Failed to create WebGL connection. Check for JavaScript errors.");
+                        }
+                    }
+                    else
+                    {
+                        _activeConnections.Remove(conn);
+                        _status.DecrementConnections();
+                    }
+                };
+
+                _pendingConnection = conn;
+            }
+            catch (System.Exception e)
+            {
+                Log.Exception(e);
+            }
+        }
+
+        private void CreateNewConnection()
+        {
+            _pendingConnection = null;
+            if (_receiveQueue != null && _dispatcher != null)
+            {
+                _dispatcher.StartCoroutine(CreateNewConnectionCoroutine());
+            }
+        }
+
+        public void Stop()
+        {
+            foreach (var connection in _activeConnections)
+            {
+                connection.Dispose();
+            }
+
+            _activeConnections.Clear();
+            _pendingConnection?.Dispose();
+            _receiveQueue = null;
+        }
+
+        public bool TryGetMessage(out (ProximaConnection, string) message)
+        {
+            if (_receiveQueue != null)
+            {
+                return _receiveQueue.TryDequeue(out message);
+            }
+            else
+            {
+                message = (null, "");
+                return false;
+            }
+        }
+    }
+}
+
+#endif
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/WebGL/ProximaWebGLServer.cs.meta b/Assets/Proxima/Runtime/WebGL/ProximaWebGLServer.cs.meta
new file mode 100644
index 0000000..6c58d4e
--- /dev/null
+++ b/Assets/Proxima/Runtime/WebGL/ProximaWebGLServer.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f38bbfdc4fcaa7448bdbaf5c6eb4c6fd
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Runtime/csc.rsp b/Assets/Proxima/Runtime/csc.rsp
new file mode 100644
index 0000000..349a1e2
--- /dev/null
+++ b/Assets/Proxima/Runtime/csc.rsp
@@ -0,0 +1 @@
+-r:System.Web.dll
\ No newline at end of file
diff --git a/Assets/Proxima/Runtime/csc.rsp.meta b/Assets/Proxima/Runtime/csc.rsp.meta
new file mode 100644
index 0000000..d63520a
--- /dev/null
+++ b/Assets/Proxima/Runtime/csc.rsp.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 65378d4b1a0f3004082b228aa7a3dca1
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Scenes.meta b/Assets/Proxima/Scenes.meta
new file mode 100644
index 0000000..9ea7bcb
--- /dev/null
+++ b/Assets/Proxima/Scenes.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5b35b2d7756994647929b3f5f3361927
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Scenes/BasicProximaSetup.unity b/Assets/Proxima/Scenes/BasicProximaSetup.unity
new file mode 100644
index 0000000..aeabbda
--- /dev/null
+++ b/Assets/Proxima/Scenes/BasicProximaSetup.unity
@@ -0,0 +1,636 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_OcclusionBakeSettings:
+    smallestOccluder: 5
+    smallestHole: 0.25
+    backfaceThreshold: 100
+  m_SceneGUID: 00000000000000000000000000000000
+  m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 9
+  m_Fog: 0
+  m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+  m_FogMode: 3
+  m_FogDensity: 0.01
+  m_LinearFogStart: 0
+  m_LinearFogEnd: 300
+  m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+  m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+  m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+  m_AmbientIntensity: 1
+  m_AmbientMode: 0
+  m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+  m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+  m_HaloStrength: 0.5
+  m_FlareStrength: 1
+  m_FlareFadeSpeed: 3
+  m_HaloTexture: {fileID: 0}
+  m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+  m_DefaultReflectionMode: 0
+  m_DefaultReflectionResolution: 128
+  m_ReflectionBounces: 1
+  m_ReflectionIntensity: 1
+  m_CustomReflection: {fileID: 0}
+  m_Sun: {fileID: 0}
+  m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1}
+  m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 12
+  m_GIWorkflowMode: 1
+  m_GISettings:
+    serializedVersion: 2
+    m_BounceScale: 1
+    m_IndirectOutputScale: 1
+    m_AlbedoBoost: 1
+    m_EnvironmentLightingMode: 0
+    m_EnableBakedLightmaps: 1
+    m_EnableRealtimeLightmaps: 0
+  m_LightmapEditorSettings:
+    serializedVersion: 12
+    m_Resolution: 2
+    m_BakeResolution: 40
+    m_AtlasSize: 1024
+    m_AO: 0
+    m_AOMaxDistance: 1
+    m_CompAOExponent: 1
+    m_CompAOExponentDirect: 0
+    m_ExtractAmbientOcclusion: 0
+    m_Padding: 2
+    m_LightmapParameters: {fileID: 0}
+    m_LightmapsBakeMode: 1
+    m_TextureCompression: 1
+    m_FinalGather: 0
+    m_FinalGatherFiltering: 1
+    m_FinalGatherRayCount: 256
+    m_ReflectionCompression: 2
+    m_MixedBakeMode: 2
+    m_BakeBackend: 1
+    m_PVRSampling: 1
+    m_PVRDirectSampleCount: 32
+    m_PVRSampleCount: 512
+    m_PVRBounces: 2
+    m_PVREnvironmentSampleCount: 256
+    m_PVREnvironmentReferencePointCount: 2048
+    m_PVRFilteringMode: 1
+    m_PVRDenoiserTypeDirect: 1
+    m_PVRDenoiserTypeIndirect: 1
+    m_PVRDenoiserTypeAO: 1
+    m_PVRFilterTypeDirect: 0
+    m_PVRFilterTypeIndirect: 0
+    m_PVRFilterTypeAO: 0
+    m_PVREnvironmentMIS: 1
+    m_PVRCulling: 1
+    m_PVRFilteringGaussRadiusDirect: 1
+    m_PVRFilteringGaussRadiusIndirect: 5
+    m_PVRFilteringGaussRadiusAO: 2
+    m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+    m_PVRFilteringAtrousPositionSigmaIndirect: 2
+    m_PVRFilteringAtrousPositionSigmaAO: 1
+    m_ExportTrainingData: 0
+    m_TrainingDataDestination: TrainingData
+    m_LightProbeSampleCountMultiplier: 4
+  m_LightingDataAsset: {fileID: 0}
+  m_LightingSettings: {fileID: 0}
+--- !u!196 &4
+NavMeshSettings:
+  serializedVersion: 2
+  m_ObjectHideFlags: 0
+  m_BuildSettings:
+    serializedVersion: 2
+    agentTypeID: 0
+    agentRadius: 0.5
+    agentHeight: 2
+    agentSlope: 45
+    agentClimb: 0.4
+    ledgeDropHeight: 0
+    maxJumpAcrossDistance: 0
+    minRegionArea: 2
+    manualCellSize: 0
+    cellSize: 0.16666667
+    manualTileSize: 0
+    tileSize: 256
+    accuratePlacement: 0
+    maxJobWorkers: 0
+    preserveTilesOutsideBounds: 0
+    debug:
+      m_Flags: 0
+  m_NavMeshData: {fileID: 0}
+--- !u!1 &129971643
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 129971645}
+  - component: {fileID: 129971644}
+  m_Layer: 0
+  m_Name: Proxima
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &129971644
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 129971643}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: e277581af68d4604da056e460b819656, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  _displayName: My App
+  _port: 7759
+  _password: 
+  _useHttps: 0
+  _certificate: {fileID: 0}
+  _certificatePassword: 
+  _runOnEnable: 0
+  _logBufferSize: 1000
+  _instantiateStatusUI: 1
+  _instantiateConnectUI: 1
+  _dontDestroyOnLoad: 1
+  _serverType: 1
+  _serverUrl: 
+--- !u!4 &129971645
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 129971643}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &408310171
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 408310174}
+  - component: {fileID: 408310173}
+  - component: {fileID: 408310172}
+  m_Layer: 0
+  m_Name: Main Camera
+  m_TagString: MainCamera
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!81 &408310172
+AudioListener:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 408310171}
+  m_Enabled: 1
+--- !u!20 &408310173
+Camera:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 408310171}
+  m_Enabled: 1
+  serializedVersion: 2
+  m_ClearFlags: 1
+  m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+  m_projectionMatrixMode: 1
+  m_GateFitMode: 2
+  m_FOVAxisMode: 0
+  m_SensorSize: {x: 36, y: 24}
+  m_LensShift: {x: 0, y: 0}
+  m_FocalLength: 50
+  m_NormalizedViewPortRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  near clip plane: 0.3
+  far clip plane: 1000
+  field of view: 60
+  orthographic: 0
+  orthographic size: 5
+  m_Depth: -1
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_RenderingPath: -1
+  m_TargetTexture: {fileID: 0}
+  m_TargetDisplay: 0
+  m_TargetEye: 3
+  m_HDR: 1
+  m_AllowMSAA: 1
+  m_AllowDynamicResolution: 0
+  m_ForceIntoRT: 0
+  m_OcclusionCulling: 1
+  m_StereoConvergence: 10
+  m_StereoSeparation: 0.022
+--- !u!4 &408310174
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 408310171}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 1, z: -10}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &502782348
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 502782352}
+  - component: {fileID: 502782351}
+  - component: {fileID: 502782350}
+  - component: {fileID: 502782349}
+  m_Layer: 0
+  m_Name: Cube
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!65 &502782349
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 502782348}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 1, y: 1, z: 1}
+  m_Center: {x: 0, y: 0, z: 0}
+--- !u!23 &502782350
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 502782348}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_StaticShadowCaster: 0
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+  m_AdditionalVertexStreams: {fileID: 0}
+--- !u!33 &502782351
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 502782348}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &502782352
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 502782348}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1162993644
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1162993646}
+  - component: {fileID: 1162993645}
+  m_Layer: 0
+  m_Name: Directional Light
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!108 &1162993645
+Light:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1162993644}
+  m_Enabled: 1
+  serializedVersion: 10
+  m_Type: 1
+  m_Shape: 0
+  m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
+  m_Intensity: 1
+  m_Range: 10
+  m_SpotAngle: 30
+  m_InnerSpotAngle: 21.80208
+  m_CookieSize: 10
+  m_Shadows:
+    m_Type: 2
+    m_Resolution: -1
+    m_CustomResolution: -1
+    m_Strength: 1
+    m_Bias: 0.05
+    m_NormalBias: 0.4
+    m_NearPlane: 0.2
+    m_CullingMatrixOverride:
+      e00: 1
+      e01: 0
+      e02: 0
+      e03: 0
+      e10: 0
+      e11: 1
+      e12: 0
+      e13: 0
+      e20: 0
+      e21: 0
+      e22: 1
+      e23: 0
+      e30: 0
+      e31: 0
+      e32: 0
+      e33: 1
+    m_UseCullingMatrixOverride: 0
+  m_Cookie: {fileID: 0}
+  m_DrawHalo: 0
+  m_Flare: {fileID: 0}
+  m_RenderMode: 0
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_RenderingLayerMask: 1
+  m_Lightmapping: 4
+  m_LightShadowCasterMode: 0
+  m_AreaSize: {x: 1, y: 1}
+  m_BounceIntensity: 1
+  m_ColorTemperature: 6570
+  m_UseColorTemperature: 0
+  m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
+  m_UseBoundingSphereOverride: 0
+  m_UseViewFrustumForShadowCasterCull: 1
+  m_ShadowRadius: 0
+  m_ShadowAngle: 0
+--- !u!4 &1162993646
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1162993644}
+  m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
+  m_LocalPosition: {x: 0, y: 3, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
+--- !u!1 &1290094354
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1290094357}
+  - component: {fileID: 1290094356}
+  - component: {fileID: 1290094355}
+  m_Layer: 0
+  m_Name: Instructions
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1290094355
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1290094354}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: '1. Play this scene
+
+    2. Press Proxima Icon, set display name and password
+
+    3.
+    In your browser, visit 127.0.0.1:7759
+
+    4. Learn more at unityproxima.com'
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 4
+  m_fontSizeBase: 4
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 0
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  _SortingLayer: 0
+  _SortingLayerID: 0
+  _SortingOrder: 0
+  m_hasFontAssetChanged: 0
+  m_renderer: {fileID: 1290094356}
+  m_maskType: 0
+--- !u!23 &1290094356
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1290094354}
+  m_Enabled: 1
+  m_CastShadows: 0
+  m_ReceiveShadows: 0
+  m_DynamicOccludee: 1
+  m_StaticShadowCaster: 0
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+  m_AdditionalVertexStreams: {fileID: 0}
+--- !u!224 &1290094357
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1290094354}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 4
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 2.43}
+  m_SizeDelta: {x: 10.13, y: 5}
+  m_Pivot: {x: 0.5, y: 0.5}
diff --git a/Assets/Proxima/Scenes/BasicProximaSetup.unity.meta b/Assets/Proxima/Scenes/BasicProximaSetup.unity.meta
new file mode 100644
index 0000000..c6a93b6
--- /dev/null
+++ b/Assets/Proxima/Scenes/BasicProximaSetup.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 8f5fd60ea70bf0243ac3e32c81becef6
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Sprites.meta b/Assets/Proxima/Sprites.meta
new file mode 100644
index 0000000..c8dd1a5
--- /dev/null
+++ b/Assets/Proxima/Sprites.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2b20e0d4eb6a26846917fb941ab3162f
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Sprites/flexalon-logo.png b/Assets/Proxima/Sprites/flexalon-logo.png
new file mode 100644
index 0000000..d3fff5b
Binary files /dev/null and b/Assets/Proxima/Sprites/flexalon-logo.png differ
diff --git a/Assets/Proxima/Sprites/flexalon-logo.png.meta b/Assets/Proxima/Sprites/flexalon-logo.png.meta
new file mode 100644
index 0000000..a8b6720
--- /dev/null
+++ b/Assets/Proxima/Sprites/flexalon-logo.png.meta
@@ -0,0 +1,158 @@
+fileFormatVersion: 2
+guid: 9c4086f38f8e37949978f4861eee5e47
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 0
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 1
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: -1
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Server
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: WebGL
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Windows Store Apps
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Sprites/proxima_icon_32x32.png b/Assets/Proxima/Sprites/proxima_icon_32x32.png
new file mode 100644
index 0000000..0e274fe
Binary files /dev/null and b/Assets/Proxima/Sprites/proxima_icon_32x32.png differ
diff --git a/Assets/Proxima/Sprites/proxima_icon_32x32.png.meta b/Assets/Proxima/Sprites/proxima_icon_32x32.png.meta
new file mode 100644
index 0000000..8b5780b
--- /dev/null
+++ b/Assets/Proxima/Sprites/proxima_icon_32x32.png.meta
@@ -0,0 +1,146 @@
+fileFormatVersion: 2
+guid: 84dd31c6b1180460789ddc5fc0620856
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 0
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 1
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: -1
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Server
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: iPhone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: WebGL
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Sprites/proxima_logo.png b/Assets/Proxima/Sprites/proxima_logo.png
new file mode 100644
index 0000000..ec7e00e
Binary files /dev/null and b/Assets/Proxima/Sprites/proxima_logo.png differ
diff --git a/Assets/Proxima/Sprites/proxima_logo.png.meta b/Assets/Proxima/Sprites/proxima_logo.png.meta
new file mode 100644
index 0000000..8f4722e
--- /dev/null
+++ b/Assets/Proxima/Sprites/proxima_logo.png.meta
@@ -0,0 +1,158 @@
+fileFormatVersion: 2
+guid: 834e6e3f5b2f6fd479051cdddf01f4b1
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 0
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 1
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: -1
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Server
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: iPhone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: WebGL
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/Third-Party Notices.txt b/Assets/Proxima/Third-Party Notices.txt
new file mode 100644
index 0000000..c78dc78
--- /dev/null
+++ b/Assets/Proxima/Third-Party Notices.txt	
@@ -0,0 +1,14 @@
+Proxima uses third party code under their own
+respective licenses:
+
+Proxima/Runtime/HttpDateParse.cs:
+
+    https://github.com/dotnet/runtime/blob/main/src/libraries/Common/src/System/Net/HttpDateParser.cs
+    Copyright (c) .NET Foundation and Contributors
+    MIT License
+
+Proxima/WebSocketSharp
+
+    https://github.com/sta/websocket-sharp
+    Copyright (c) 2010-2023 sta.blockhead
+    MIT License
\ No newline at end of file
diff --git a/Assets/Proxima/Third-Party Notices.txt.meta b/Assets/Proxima/Third-Party Notices.txt.meta
new file mode 100644
index 0000000..8466d50
--- /dev/null
+++ b/Assets/Proxima/Third-Party Notices.txt.meta	
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 665ad43a4b3704868b3ad4406c5c3d5b
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/WebSocketSharp.meta b/Assets/Proxima/WebSocketSharp.meta
new file mode 100644
index 0000000..f3d5063
--- /dev/null
+++ b/Assets/Proxima/WebSocketSharp.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 487bb2dde2973534d95874cd2990307b
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/WebSocketSharp/LICENSE.txt b/Assets/Proxima/WebSocketSharp/LICENSE.txt
new file mode 100644
index 0000000..577a452
--- /dev/null
+++ b/Assets/Proxima/WebSocketSharp/LICENSE.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2010-2023 sta.blockhead
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/Assets/Proxima/WebSocketSharp/LICENSE.txt.meta b/Assets/Proxima/WebSocketSharp/LICENSE.txt.meta
new file mode 100644
index 0000000..37cb04f
--- /dev/null
+++ b/Assets/Proxima/WebSocketSharp/LICENSE.txt.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 3adce1a9bc62b4515979022e003e9e6b
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/WebSocketSharp/README.txt b/Assets/Proxima/WebSocketSharp/README.txt
new file mode 100644
index 0000000..274a3ba
--- /dev/null
+++ b/Assets/Proxima/WebSocketSharp/README.txt
@@ -0,0 +1,12 @@
+This is a modified fork of the open source WebSocketSharp library:
+
+https://github.com/sta/websocket-sharp
+
+If you need access to the modified source, email support@virtualmaker.net.
+
+Modifications:
+- Prefixed all namespaces with 'Proxima' to avoid collisions.
+- Previously, if HttpServer was initialized as 'secure', it would fail for HTTP requests. Now, it will handle HTTP requests by redirecting to HTTPS.
+- Updated targeted .NET version to 4.7.1.
+- Added default parameter to SslStrema constructor, to avoid failure on older Unity versions.
+- Added SendAsTextAsync to avoid some memory allocation and send MemoryStream directly as string.
\ No newline at end of file
diff --git a/Assets/Proxima/WebSocketSharp/README.txt.meta b/Assets/Proxima/WebSocketSharp/README.txt.meta
new file mode 100644
index 0000000..35eae7b
--- /dev/null
+++ b/Assets/Proxima/WebSocketSharp/README.txt.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 1a87c93370d624c58b4383aa0fa31ed7
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/WebSocketSharp/proxima-websocket-sharp.dll b/Assets/Proxima/WebSocketSharp/proxima-websocket-sharp.dll
new file mode 100644
index 0000000..01f9225
Binary files /dev/null and b/Assets/Proxima/WebSocketSharp/proxima-websocket-sharp.dll differ
diff --git a/Assets/Proxima/WebSocketSharp/proxima-websocket-sharp.dll.meta b/Assets/Proxima/WebSocketSharp/proxima-websocket-sharp.dll.meta
new file mode 100644
index 0000000..2a1a5ba
--- /dev/null
+++ b/Assets/Proxima/WebSocketSharp/proxima-websocket-sharp.dll.meta
@@ -0,0 +1,33 @@
+fileFormatVersion: 2
+guid: 9baed5fd89595c948b35d6068d0764bf
+PluginImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  iconMap: {}
+  executionOrder: {}
+  defineConstraints: []
+  isPreloaded: 0
+  isOverridable: 0
+  isExplicitlyReferenced: 0
+  validateReferences: 1
+  platformData:
+  - first:
+      Any: 
+    second:
+      enabled: 1
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 0
+      settings:
+        DefaultValueInitialized: true
+  - first:
+      Windows Store Apps: WindowsStoreApps
+    second:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/link.xml b/Assets/Proxima/link.xml
new file mode 100644
index 0000000..68b81db
--- /dev/null
+++ b/Assets/Proxima/link.xml
@@ -0,0 +1,8 @@
+<linker>
+    <assembly fullname="System.Configuration">
+      <type fullname="System.Configuration.ExeConfigurationHost" preserve="all" />
+    </assembly>
+    <assembly fullname="System">
+      <type fullname="System.Net.Configuration.*" preserve="all" />
+    </assembly>
+</linker>
\ No newline at end of file
diff --git a/Assets/Proxima/link.xml.meta b/Assets/Proxima/link.xml.meta
new file mode 100644
index 0000000..6011a2a
--- /dev/null
+++ b/Assets/Proxima/link.xml.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: cc0f737b215c72d4494952f595bd1ed3
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Proxima/package.json b/Assets/Proxima/package.json
new file mode 100644
index 0000000..fa466dd
--- /dev/null
+++ b/Assets/Proxima/package.json
@@ -0,0 +1,8 @@
+{
+    "displayName": "Proxima Inspector",
+    "description": "Inspect your game's components, logs, performance, and more from the web browser.",
+    "name": "com.virtualmaker.proxima",
+    "unity": "2019.4",
+    "version": "1.3.1",
+    "category": "utilities"
+}
\ No newline at end of file
diff --git a/Assets/Proxima/package.json.meta b/Assets/Proxima/package.json.meta
new file mode 100644
index 0000000..70695c7
--- /dev/null
+++ b/Assets/Proxima/package.json.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 55a7fa332ffadb5489464312015b3ea8
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/SharedSpatialAnchors/Scenes/SharedSpatialAnchors.unity b/Assets/SharedSpatialAnchors/Scenes/SharedSpatialAnchors.unity
index 285319d..3d9c1da 100644
--- a/Assets/SharedSpatialAnchors/Scenes/SharedSpatialAnchors.unity
+++ b/Assets/SharedSpatialAnchors/Scenes/SharedSpatialAnchors.unity
@@ -4095,6 +4095,11 @@ CanvasRenderer:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1038098150}
   m_CullTransparentMesh: 1
+--- !u!1 &1075346024 stripped
+GameObject:
+  m_CorrespondingSourceObject: {fileID: 988491626994134724, guid: 60fa00281e83b294583adc31df520fbe, type: 3}
+  m_PrefabInstance: {fileID: 2982998299393685461}
+  m_PrefabAsset: {fileID: 0}
 --- !u!1 &1109088824
 GameObject:
   m_ObjectHideFlags: 0
@@ -5840,6 +5845,64 @@ CanvasRenderer:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1496496565}
   m_CullTransparentMesh: 1
+--- !u!1 &1501354727
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1501354729}
+  - component: {fileID: 1501354728}
+  m_Layer: 0
+  m_Name: Proxima
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1501354728
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1501354727}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: e277581af68d4604da056e460b819656, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  _displayName: TwinTurbine
+  _port: 7759
+  _password: 123456
+  _useHttps: 1
+  _certificate: {fileID: 0}
+  _certificatePassword: 
+  _runOnEnable: 1
+  _logBufferSize: 1000
+  _instantiateStatusUI: 1
+  _instantiateConnectUI: 0
+  _dontDestroyOnLoad: 1
+  _setRunInBackground: 1
+  _serverType: 1
+  _serverUrl: 
+--- !u!4 &1501354729
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1501354727}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0.69282347, y: -1.4099673, z: -0.2268675}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 9
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!1 &1515478303
 GameObject:
   m_ObjectHideFlags: 0
@@ -9298,6 +9361,25 @@ PrefabInstance:
       objectReference: {fileID: 0}
     m_RemovedComponents: []
   m_SourcePrefab: {fileID: 100100000, guid: 8754aa5f3d45cec4980f02029a881f7d, type: 3}
+--- !u!1 &5361334261533984053 stripped
+GameObject:
+  m_CorrespondingSourceObject: {fileID: 8661891273527454774, guid: 8754aa5f3d45cec4980f02029a881f7d, type: 3}
+  m_PrefabInstance: {fileID: 5361334261533984052}
+  m_PrefabAsset: {fileID: 0}
+--- !u!114 &5361334261533984054
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5361334261533984053}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4357a20539a2184997fc22358044a5f, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  prefab: {fileID: 5361334261533984053}
+  previewPrefab: {fileID: 1075346024}
 --- !u!4 &7079690333416248134 stripped
 Transform:
   m_CorrespondingSourceObject: {fileID: 5414912244175512723, guid: 60fa00281e83b294583adc31df520fbe, type: 3}
diff --git a/Assets/SharedSpatialAnchors/Scripts/PrefabSpawnner.cs b/Assets/SharedSpatialAnchors/Scripts/PrefabSpawnner.cs
new file mode 100644
index 0000000..a69cf79
--- /dev/null
+++ b/Assets/SharedSpatialAnchors/Scripts/PrefabSpawnner.cs
@@ -0,0 +1,31 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class PrefabSpawnner : MonoBehaviour
+{
+    public GameObject prefab;
+    public GameObject previewPrefab;
+    private GameObject currentPreview;
+    // Start is called before the first frame update
+    void Start()
+    {
+        currentPreview = Instantiate(previewPrefab);
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        Ray ray = new Ray(OVRInput.GetLocalControllerPosition(OVRInput.Controller.RTouch), OVRInput.GetLocalControllerRotation(OVRInput.Controller.RTouch) * Vector3.forward);
+        if(Physics.Raycast(ray,out RaycastHit hit))
+        {
+            currentPreview.transform.position = hit.point;
+            currentPreview.transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
+
+            if (OVRInput.GetDown(OVRInput.Button.One))
+            {
+                Instantiate(prefab, hit.point, Quaternion.FromToRotation(Vector3.up, hit.normal));
+            }
+        }
+    }
+}
diff --git a/Assets/SharedSpatialAnchors/Scripts/PrefabSpawnner.cs.meta b/Assets/SharedSpatialAnchors/Scripts/PrefabSpawnner.cs.meta
new file mode 100644
index 0000000..aab27ec
--- /dev/null
+++ b/Assets/SharedSpatialAnchors/Scripts/PrefabSpawnner.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f4357a20539a2184997fc22358044a5f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/SharedSpatialAnchors/Scripts/SharedAnchorControlPanel.cs b/Assets/SharedSpatialAnchors/Scripts/SharedAnchorControlPanel.cs
index af6b0e9..e17efde 100644
--- a/Assets/SharedSpatialAnchors/Scripts/SharedAnchorControlPanel.cs
+++ b/Assets/SharedSpatialAnchors/Scripts/SharedAnchorControlPanel.cs
@@ -28,6 +28,7 @@ using PhotonRealtime = Photon.Realtime;
 
 public class SharedAnchorControlPanel : MonoBehaviour
 {
+
     [SerializeField]
     private Transform referencePoint;