shithub: microui

Download patch

ref: 56f81e3b36aaf438351d19afbbba4c22a1ee0f94
author: rxi <[email protected]>
date: Sat Sep 22 04:08:14 EDT 2018

Initial commit

diff: cannot open b/demo//null: file does not exist: 'b/demo//null' diff: cannot open b/doc//null: file does not exist: 'b/doc//null' diff: cannot open b/src//null: file does not exist: 'b/src//null'
--- /dev/null
+++ b/LICENSE
@@ -1,0 +1,19 @@
+Copyright (c) 2018 rxi
+
+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.
--- /dev/null
+++ b/README.md
@@ -1,0 +1,34 @@
+# microui
+![screenshot](https://user-images.githubusercontent.com/3920290/45842139-b4ca8680-bd13-11e8-81ef-1d78a46faac9.png)
+
+A tiny, portable, immediate-mode UI library written in ANSI C
+
+## Features
+* Tiny: around `1100 cloc` of ANSI C
+* Works within a fixed-sized memory region: no additional memory is
+  allocated
+* Built-in controls: window, panel, button, slider, textbox, label,
+  checkbox, wordwrapped text
+* Easy to add custom controls
+* Simple layout system
+
+## Usage
+* See [`doc/usage.md`](doc/usage.md) for usage instructions
+* See the [`demo`](demo) directory for a usage example
+
+## Notes
+* The library expects the user to provide input and handle the resultant
+  drawing commands, it does not do any drawing itself
+* In contrast to other immediate mode ui libraries microui does not store
+  window, panel, header or treenode state internally. It is up to the
+  user to manage this data themselves
+
+## Contributing
+The library is designed to be lightweight, providing a foundation to which
+you can easily add custom controls and UI elements; pull requests adding
+additional features will likely not be merged. Bug reports are welcome.
+
+## License
+This library is free software; you can redistribute it and/or modify it
+under the terms of the MIT license. See [LICENSE](LICENSE) for details.
+
--- /dev/null
+++ b/demo/atlas.inl
@@ -1,0 +1,996 @@
+
+enum { ATLAS_WHITE = MU_ICON_MAX, ATLAS_FONT };
+enum { ATLAS_WIDTH = 128, ATLAS_HEIGHT = 128 };
+
+
+static unsigned char atlas_texture[ATLAS_WIDTH * ATLAS_HEIGHT] = {
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc0, 0x20,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x32, 0x0b, 0x00, 0x00, 0x00,
+  0x00, 0x31, 0x35, 0x01, 0x00, 0x00, 0x00, 0x15, 0x35, 0x1d, 0x30, 0x19,
+  0x00, 0x00, 0x0f, 0x35, 0x06, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x2d, 0x00, 0x00, 0x00,
+  0x14, 0x26, 0x00, 0x00, 0x31, 0x2a, 0x00, 0x00, 0x00, 0x10, 0x31, 0x00,
+  0x00, 0x00, 0x00, 0x06, 0x3e, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x06, 0x3e, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x40, 0x0d, 0x00, 0x00, 0x00, 0x00,
+  0x31, 0x35, 0x2f, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x41,
+  0x37, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x21, 0xe0, 0xea, 0x2c, 0x00, 0x00, 0x00, 0x00,
+  0x36, 0xc4, 0xdb, 0xb2, 0xd9, 0xc1, 0x1a, 0x00, 0x00, 0xea, 0xff, 0x39,
+  0x00, 0x00, 0x00, 0x9e, 0xff, 0x88, 0xbe, 0x9c, 0x00, 0x00, 0x72, 0xff,
+  0x48, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x1c, 0xe4, 0xce, 0x8d, 0x00, 0x00, 0xb5, 0x60, 0x00, 0x00,
+  0xea, 0xfa, 0x2c, 0x00, 0x00, 0x4e, 0xeb, 0x00, 0x00, 0x1c, 0x8f, 0xea,
+  0xea, 0xee, 0x92, 0x1f, 0x00, 0x00, 0x1c, 0x8f, 0xea, 0xea, 0xee, 0x92,
+  0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x42, 0xf3, 0xcd, 0xf5, 0x3a, 0x00, 0x00, 0x00, 0xea, 0xf2, 0xef, 0xe5,
+  0x8f, 0x2f, 0x00, 0x00, 0x0f, 0xa0, 0xfe, 0xf2, 0xf1, 0xfa, 0x33, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21,
+  0xe0, 0xea, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x35, 0xdc, 0x33, 0x00, 0x06,
+  0x00, 0x5a, 0xd7, 0x13, 0x00, 0xea, 0xd8, 0x92, 0x00, 0x00, 0x09, 0xf0,
+  0xd9, 0x88, 0x7b, 0xda, 0x00, 0x00, 0xb9, 0xe9, 0x91, 0x00, 0x05, 0xf4,
+  0x03, 0x35, 0x02, 0x32, 0x1f, 0x00, 0x04, 0x37, 0x24, 0x00, 0x5b, 0xa9,
+  0x1b, 0xe7, 0x01, 0x44, 0xd0, 0x02, 0x00, 0x00, 0xea, 0xe4, 0xc3, 0x01,
+  0x00, 0x4e, 0xeb, 0x00, 0x00, 0x8f, 0xd8, 0x42, 0x01, 0x3a, 0xd0, 0x9b,
+  0x00, 0x00, 0x8f, 0xd8, 0x42, 0x01, 0x3a, 0xd0, 0x9b, 0x00, 0x2e, 0x1a,
+  0x00, 0x03, 0x36, 0x19, 0x00, 0x04, 0x36, 0x00, 0xa3, 0xa0, 0x00, 0xb5,
+  0x8d, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x01, 0x3d, 0xac, 0xe5, 0x03, 0x00,
+  0xa1, 0xeb, 0x63, 0x0c, 0x03, 0x2e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xe1, 0xeb, 0x2d, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xd6, 0x38, 0x37, 0xb4, 0xd6, 0xe9, 0x35, 0x9e, 0x5c,
+  0x00, 0xea, 0x87, 0xe8, 0x03, 0x00, 0x56, 0xcc, 0xba, 0x88, 0x38, 0xff,
+  0x1a, 0x09, 0xf7, 0x84, 0xd9, 0x00, 0x39, 0xfe, 0x0e, 0xff, 0xb7, 0xe1,
+  0xf3, 0x94, 0xbc, 0xde, 0xfb, 0x97, 0x73, 0x9b, 0x0b, 0xfb, 0x0b, 0xcf,
+  0x44, 0x01, 0x00, 0x00, 0xea, 0x65, 0xf7, 0x63, 0x00, 0x4e, 0xeb, 0x00,
+  0x01, 0xe0, 0x79, 0x00, 0x00, 0x00, 0x6b, 0xea, 0x03, 0x01, 0xe0, 0x79,
+  0x00, 0x00, 0x00, 0x6b, 0xea, 0x03, 0xb0, 0xa4, 0x00, 0x39, 0xfe, 0xa0,
+  0x00, 0x3d, 0xfd, 0x00, 0x6e, 0xe0, 0x5b, 0xef, 0x41, 0x00, 0x00, 0x00,
+  0xea, 0x6d, 0x00, 0x00, 0x17, 0xfd, 0x47, 0x18, 0xff, 0x8f, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x21, 0xe1, 0xeb, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xe3,
+  0x00, 0xc5, 0x51, 0x00, 0xd4, 0x37, 0x61, 0x99, 0x00, 0xea, 0x4d, 0xe9,
+  0x45, 0x00, 0xb2, 0x70, 0xbf, 0x88, 0x04, 0xf0, 0x59, 0x48, 0xe9, 0x18,
+  0xfd, 0x23, 0x77, 0xd4, 0x0e, 0xff, 0x9f, 0x02, 0x54, 0xff, 0x86, 0x00,
+  0x69, 0xf0, 0x39, 0xd1, 0x61, 0xca, 0x60, 0xb6, 0x6f, 0xe3, 0x98, 0x00,
+  0xea, 0x4a, 0x7f, 0xec, 0x15, 0x4e, 0xeb, 0x00, 0x32, 0xff, 0x36, 0x00,
+  0x00, 0x00, 0x29, 0xff, 0x3e, 0x32, 0xff, 0x36, 0x00, 0x00, 0x00, 0x29,
+  0xff, 0x3f, 0x68, 0xe6, 0x00, 0x83, 0xaf, 0xe7, 0x01, 0x80, 0xc9, 0x00,
+  0x18, 0xf4, 0xff, 0x53, 0x00, 0x15, 0x3b, 0x00, 0xea, 0x6d, 0x00, 0x00,
+  0x00, 0xc5, 0xa2, 0x41, 0xff, 0x39, 0x00, 0x40, 0x73, 0x73, 0x35, 0x00,
+  0x00, 0x00, 0x3d, 0xed, 0x45, 0x00, 0x00, 0x00, 0x22, 0xe1, 0xeb, 0x2d,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xb3, 0x12, 0xf9, 0x04, 0x03,
+  0xef, 0x2c, 0x6a, 0x94, 0x00, 0xea, 0x4d, 0x95, 0x9e, 0x14, 0xf6, 0x18,
+  0xc1, 0x88, 0x00, 0xb2, 0x96, 0x8e, 0xa4, 0x00, 0xcb, 0x6a, 0xb5, 0x92,
+  0x0e, 0xff, 0x59, 0x00, 0x27, 0xff, 0x3d, 0x00, 0x3a, 0xff, 0x04, 0x71,
+  0xae, 0x40, 0xe0, 0x2e, 0xee, 0x1e, 0xd5, 0x00, 0xea, 0x4d, 0x08, 0xd9,
+  0xa0, 0x4b, 0xeb, 0x00, 0x20, 0xfe, 0x45, 0x00, 0x00, 0x00, 0x37, 0xff,
+  0x2c, 0x20, 0xfe, 0x45, 0x00, 0x00, 0x00, 0x37, 0xff, 0x3b, 0x21, 0xff,
+  0x29, 0xcc, 0x4a, 0xe9, 0x30, 0xc3, 0x81, 0x14, 0xdf, 0xab, 0xbd, 0xcd,
+  0x14, 0x9c, 0xb5, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0xdc, 0xa6, 0x20,
+  0xfe, 0x42, 0x00, 0x63, 0xb2, 0xf4, 0x76, 0x00, 0x00, 0x00, 0x13, 0xd0,
+  0xf6, 0x45, 0x00, 0x22, 0xe1, 0xeb, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x3f, 0xe7, 0x03, 0xd7, 0x5e, 0x75, 0xf7, 0x8d, 0xc7, 0x4a,
+  0x00, 0xea, 0x4d, 0x3c, 0xf0, 0x71, 0xb7, 0x00, 0xc1, 0x88, 0x00, 0x70,
+  0xc9, 0xcb, 0x5d, 0x00, 0x83, 0xa2, 0xe9, 0x4f, 0x0e, 0xff, 0x43, 0x00,
+  0x26, 0xff, 0x2d, 0x00, 0x39, 0xff, 0x00, 0x00, 0x00, 0x7c, 0x9a, 0x1f,
+  0xf1, 0x00, 0xaf, 0x00, 0xea, 0x4d, 0x00, 0x44, 0xfe, 0x83, 0xeb, 0x00,
+  0x00, 0xcd, 0x89, 0x00, 0x00, 0x00, 0x7b, 0xd9, 0x00, 0x00, 0xcd, 0x89,
+  0x00, 0x00, 0x00, 0x7b, 0xf8, 0x08, 0x00, 0xd8, 0x75, 0xf8, 0x0d, 0xa7,
+  0x79, 0xf7, 0x39, 0x5b, 0xfc, 0x0a, 0x09, 0xba, 0xd4, 0xf6, 0x39, 0x00,
+  0xea, 0x6d, 0x00, 0x00, 0x31, 0xff, 0x75, 0x00, 0xcc, 0x8f, 0x00, 0x00,
+  0x00, 0xdb, 0x76, 0x00, 0x00, 0x00, 0x00, 0x13, 0xd0, 0xf6, 0x63, 0xe1,
+  0xeb, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xf3,
+  0x44, 0x2c, 0x96, 0x87, 0x29, 0xa3, 0x64, 0x00, 0x00, 0xea, 0x4d, 0x01,
+  0xe1, 0xf3, 0x5b, 0x00, 0xc1, 0x88, 0x00, 0x2e, 0xf7, 0xf5, 0x17, 0x00,
+  0x3a, 0xec, 0xfc, 0x10, 0x0e, 0xff, 0x43, 0x00, 0x26, 0xff, 0x2d, 0x00,
+  0x39, 0xff, 0x00, 0x00, 0x17, 0xe6, 0x19, 0x02, 0xee, 0x13, 0xd0, 0x00,
+  0xea, 0x4d, 0x00, 0x00, 0xa5, 0xf6, 0xeb, 0x00, 0x00, 0x7d, 0xec, 0x7a,
+  0x24, 0x73, 0xe7, 0x87, 0x00, 0x00, 0x7d, 0xec, 0x7a, 0x24, 0x73, 0xe7,
+  0x9c, 0x00, 0x00, 0x91, 0xda, 0xbd, 0x00, 0x61, 0xd9, 0xed, 0x03, 0x2b,
+  0xfe, 0x67, 0x1d, 0x70, 0xfc, 0xf0, 0x1a, 0x00, 0xea, 0x7f, 0x31, 0x81,
+  0xdc, 0xdc, 0x0a, 0x00, 0x79, 0xef, 0x83, 0x23, 0x1c, 0xe1, 0x76, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x13, 0xd0, 0xff, 0xec, 0x2e, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0xdc, 0x78, 0x20, 0x0d,
+  0x3c, 0x3b, 0x00, 0x00, 0x00, 0xea, 0x4d, 0x00, 0x8a, 0xf3, 0x0b, 0x00,
+  0xc1, 0x88, 0x00, 0x01, 0xea, 0xce, 0x00, 0x00, 0x03, 0xed, 0xc9, 0x00,
+  0x0e, 0xff, 0x43, 0x00, 0x26, 0xff, 0x2d, 0x00, 0x39, 0xff, 0x00, 0x00,
+  0x98, 0x7e, 0x00, 0x00, 0x78, 0xe7, 0xb0, 0x00, 0xea, 0x4d, 0x00, 0x00,
+  0x18, 0xef, 0xeb, 0x00, 0x00, 0x06, 0x54, 0xb6, 0xfb, 0xbb, 0x57, 0x07,
+  0x00, 0x00, 0x06, 0x54, 0xb6, 0xfc, 0xff, 0x8d, 0x01, 0x00, 0x00, 0x49,
+  0xff, 0x74, 0x00, 0x1b, 0xfe, 0xa8, 0x00, 0x00, 0x7f, 0xde, 0xff, 0xe7,
+  0x72, 0xb1, 0xdb, 0x00, 0xea, 0xff, 0xf8, 0xd6, 0x92, 0x13, 0x00, 0x00,
+  0x06, 0x52, 0xb4, 0xfb, 0xff, 0xe5, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x13, 0xbc, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x44, 0xb7, 0xde, 0xdb, 0xad, 0x50, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x1b, 0xda, 0xbb, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
+  0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0xe6,
+  0xa0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x17, 0x00, 0x00, 0x00,
+  0x2a, 0x1e, 0x00, 0x35, 0x13, 0x00, 0x00, 0x00, 0x2c, 0x1c, 0x00, 0x00,
+  0x0c, 0x27, 0x00, 0x29, 0x09, 0x00, 0x00, 0x00, 0x3c, 0x24, 0x00, 0x00,
+  0x00, 0x31, 0x35, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44,
+  0x1f, 0x00, 0x00, 0x31, 0x17, 0x00, 0x00, 0x13, 0x35, 0x00, 0x31, 0x35,
+  0x2b, 0x02, 0x00, 0x00, 0x00, 0x31, 0x35, 0x2a, 0x02, 0x00, 0x00, 0x33,
+  0x16, 0x00, 0x00, 0x00, 0x0f, 0x35, 0x27, 0x28, 0x00, 0x00, 0x00, 0x1f,
+  0x2e, 0x0b, 0xbc, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x13, 0xbc, 0x2a, 0x0b, 0xbc, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0xc9, 0x8e, 0x00, 0xfc,
+  0x5b, 0x00, 0x00, 0x00, 0xd2, 0x84, 0x00, 0x00, 0x59, 0xa9, 0x00, 0xea,
+  0x0f, 0x00, 0x00, 0x34, 0xfe, 0xce, 0x00, 0x00, 0x00, 0xea, 0xf2, 0xed,
+  0xfa, 0xce, 0x1a, 0x00, 0x09, 0xb5, 0xfd, 0xe7, 0xf5, 0xaf, 0x00, 0xea,
+  0x6d, 0x00, 0x0c, 0xcf, 0xa7, 0x00, 0xea, 0xf2, 0xf3, 0xea, 0x94, 0x00,
+  0x00, 0xea, 0xf4, 0xf6, 0xec, 0x9d, 0x00, 0xc0, 0x9e, 0x00, 0x00, 0x00,
+  0x7a, 0xe5, 0x58, 0xf8, 0x26, 0x00, 0x0d, 0xe4, 0x7a, 0x0e, 0xff, 0x43,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xff, 0x39, 0x0e,
+  0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea,
+  0x6d, 0x00, 0x00, 0x00, 0xc9, 0x8e, 0x00, 0xfc, 0x5b, 0x00, 0x00, 0x00,
+  0xd2, 0x84, 0x00, 0x00, 0x89, 0x79, 0x1c, 0xdd, 0x00, 0x00, 0x00, 0x93,
+  0xad, 0xf9, 0x2e, 0x00, 0x00, 0xea, 0x6d, 0x00, 0x19, 0xe3, 0x8c, 0x00,
+  0xab, 0xe1, 0x4f, 0x02, 0x07, 0x1f, 0x00, 0xea, 0x6d, 0x03, 0xb2, 0xc6,
+  0x08, 0x00, 0xea, 0x6d, 0x03, 0x4d, 0xff, 0x33, 0x00, 0xea, 0x6d, 0x03,
+  0x49, 0xff, 0x3a, 0x67, 0xee, 0x06, 0x00, 0x00, 0xd0, 0x8e, 0x00, 0xb3,
+  0xbb, 0x00, 0x8e, 0xcf, 0x05, 0x0e, 0xff, 0x41, 0x12, 0x25, 0x00, 0x00,
+  0x00, 0x00, 0x18, 0x20, 0x18, 0xff, 0x39, 0x0e, 0xff, 0x41, 0x2e, 0x33,
+  0x01, 0x00, 0x03, 0x35, 0x01, 0x2e, 0x34, 0x01, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x04, 0x39, 0x05, 0x00, 0x00, 0x03, 0x36, 0x02, 0x11, 0x25,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00,
+  0xc9, 0x8e, 0x00, 0xfc, 0x5b, 0x00, 0x00, 0x00, 0xd2, 0x84, 0x41, 0xd3,
+  0xf0, 0xe3, 0xdd, 0xf4, 0xd3, 0x00, 0x06, 0xec, 0x52, 0xb4, 0x8d, 0x00,
+  0x00, 0xea, 0x6d, 0x00, 0x06, 0xdd, 0x86, 0x0b, 0xfc, 0x81, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xea, 0x6d, 0x8d, 0xdd, 0x15, 0x00, 0x00, 0xea, 0x6d,
+  0x00, 0x07, 0xf3, 0x64, 0x00, 0xea, 0x6d, 0x00, 0x0a, 0xf4, 0x69, 0x13,
+  0xfa, 0x4a, 0x00, 0x27, 0xff, 0x34, 0x00, 0x1c, 0xf1, 0x86, 0xf7, 0x33,
+  0x00, 0x0e, 0xff, 0xaa, 0xd3, 0xf8, 0xab, 0x01, 0x00, 0x87, 0xf6, 0xda,
+  0xa5, 0xff, 0x39, 0x0e, 0xff, 0xc0, 0xe5, 0xf2, 0xd5, 0x03, 0x0e, 0xff,
+  0xb4, 0xe5, 0xf2, 0xd6, 0x04, 0x00, 0x00, 0x00, 0x00, 0x6d, 0xe7, 0xdd,
+  0xe7, 0x6d, 0x00, 0x0e, 0xff, 0x98, 0xd2, 0xf8, 0xab, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xea, 0xe9, 0xd9, 0xd9, 0xd9, 0xf7, 0x8e, 0x00, 0xfc,
+  0x5b, 0x00, 0x00, 0x00, 0xd2, 0x84, 0x09, 0x1d, 0xec, 0x2e, 0x93, 0x87,
+  0x1d, 0x00, 0x52, 0xf1, 0x09, 0x5d, 0xe8, 0x04, 0x00, 0xea, 0xe4, 0xd3,
+  0xf6, 0xb1, 0x0d, 0x3c, 0xff, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea,
+  0xc9, 0xff, 0x60, 0x00, 0x00, 0x00, 0xea, 0x8a, 0x49, 0x9e, 0xf1, 0x0d,
+  0x00, 0xea, 0xa6, 0x71, 0xbb, 0xe1, 0x1a, 0x00, 0xb4, 0xa0, 0x00, 0x7d,
+  0xda, 0x00, 0x00, 0x00, 0x74, 0xff, 0x93, 0x00, 0x00, 0x0e, 0xff, 0x9c,
+  0x02, 0x2a, 0xff, 0x32, 0x0e, 0xfa, 0x5a, 0x00, 0x6f, 0xff, 0x39, 0x0e,
+  0xff, 0xa6, 0x04, 0x1e, 0xff, 0x42, 0x0e, 0xff, 0xa5, 0x04, 0x1e, 0xff,
+  0x42, 0x00, 0x00, 0x00, 0x07, 0xf1, 0x59, 0x00, 0x55, 0xf2, 0x09, 0x0e,
+  0xff, 0x99, 0x01, 0x2d, 0xff, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea,
+  0x98, 0x4c, 0x4c, 0x4c, 0xd9, 0x8e, 0x00, 0xfc, 0x5b, 0x00, 0x00, 0x00,
+  0xd2, 0x84, 0x37, 0x58, 0xef, 0x4a, 0xc6, 0x83, 0x38, 0x00, 0xb1, 0xd5,
+  0x6f, 0x7d, 0xff, 0x4c, 0x00, 0xea, 0x94, 0x47, 0x70, 0xe7, 0x83, 0x22,
+  0xff, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0xd2, 0xaf, 0xe2, 0x10,
+  0x00, 0x00, 0xea, 0xf5, 0xda, 0x94, 0x3e, 0x00, 0x00, 0xea, 0xd6, 0xc4,
+  0xfd, 0x27, 0x00, 0x00, 0x5b, 0xef, 0x06, 0xd3, 0x81, 0x00, 0x00, 0x01,
+  0xbc, 0xeb, 0xd2, 0x06, 0x00, 0x0e, 0xff, 0x56, 0x00, 0x00, 0xdd, 0x77,
+  0x50, 0xfb, 0x0c, 0x00, 0x23, 0xff, 0x39, 0x0e, 0xff, 0x5c, 0x00, 0x00,
+  0xeb, 0x68, 0x0e, 0xff, 0x5c, 0x00, 0x00, 0xeb, 0x68, 0x00, 0x00, 0x00,
+  0x4c, 0xfb, 0x0b, 0x00, 0x08, 0xf8, 0x51, 0x0e, 0xff, 0x52, 0x00, 0x00,
+  0xde, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00,
+  0xc9, 0x8e, 0x00, 0xd3, 0x85, 0x00, 0x00, 0x09, 0xf4, 0x6b, 0x7b, 0xc7,
+  0xdf, 0xa7, 0xfd, 0xa9, 0x7f, 0x16, 0xfa, 0xc4, 0xb8, 0xb8, 0xe2, 0xab,
+  0x00, 0xea, 0x6d, 0x00, 0x00, 0x8e, 0xdf, 0x00, 0xd2, 0x89, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xea, 0x6d, 0x0f, 0xe0, 0xa1, 0x00, 0x00, 0xea, 0x6d,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x01, 0xc6, 0xa5, 0x00, 0x00,
+  0x0c, 0xf5, 0x69, 0xff, 0x28, 0x00, 0x00, 0x60, 0xec, 0x21, 0xe4, 0x80,
+  0x00, 0x0e, 0xff, 0x65, 0x00, 0x01, 0xea, 0x67, 0x43, 0xfe, 0x12, 0x00,
+  0x25, 0xff, 0x39, 0x0e, 0xff, 0x43, 0x00, 0x00, 0xea, 0x68, 0x0e, 0xff,
+  0x43, 0x00, 0x00, 0xea, 0x68, 0x00, 0x00, 0x00, 0x4c, 0xfe, 0x16, 0x00,
+  0x11, 0xfd, 0x40, 0x0e, 0xff, 0x65, 0x00, 0x01, 0xeb, 0x67, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0xc9, 0x8e, 0x00, 0x72,
+  0xdf, 0x4b, 0x23, 0x8c, 0xfa, 0x28, 0x00, 0x7c, 0x81, 0x1a, 0xe5, 0x00,
+  0x00, 0x70, 0xeb, 0x05, 0x00, 0x00, 0x5c, 0xf8, 0x00, 0xea, 0x7f, 0x22,
+  0x4a, 0xdd, 0x95, 0x00, 0x84, 0xed, 0x7c, 0x1d, 0x24, 0x32, 0x00, 0xea,
+  0x6d, 0x00, 0x40, 0xfd, 0x52, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0xea, 0x6d, 0x00, 0x31, 0xfc, 0x49, 0x00, 0x00, 0xa8, 0xe3, 0xcd,
+  0x00, 0x00, 0x17, 0xed, 0x62, 0x00, 0x54, 0xf9, 0x2d, 0x0e, 0xff, 0xbc,
+  0x1d, 0x5f, 0xff, 0x21, 0x07, 0xf5, 0x7e, 0x11, 0x8d, 0xff, 0x39, 0x0e,
+  0xff, 0x43, 0x00, 0x00, 0xea, 0x68, 0x0e, 0xff, 0x43, 0x00, 0x00, 0xea,
+  0x68, 0x00, 0x00, 0x00, 0x14, 0xf2, 0x88, 0x15, 0x82, 0xe8, 0x03, 0x0e,
+  0xff, 0xbc, 0x1e, 0x61, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea,
+  0x6d, 0x00, 0x00, 0x00, 0xc9, 0x8e, 0x00, 0x10, 0x85, 0xdc, 0xfe, 0xd9,
+  0x4c, 0x00, 0x00, 0xaa, 0x50, 0x4b, 0xb4, 0x00, 0x00, 0xcf, 0x97, 0x00,
+  0x00, 0x00, 0x0c, 0xf4, 0x00, 0xea, 0xff, 0xff, 0xdd, 0x93, 0x1c, 0x00,
+  0x08, 0x5c, 0xc0, 0xfe, 0xed, 0x7b, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x8d,
+  0xea, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00,
+  0x00, 0x95, 0xe0, 0x00, 0x00, 0x4f, 0xff, 0x74, 0x00, 0x00, 0xa8, 0xc3,
+  0x01, 0x00, 0x00, 0xb7, 0xca, 0x0e, 0xfd, 0x6f, 0xd4, 0xe5, 0x72, 0x00,
+  0x00, 0x5c, 0xd9, 0xdb, 0x63, 0xef, 0x39, 0x0e, 0xff, 0x43, 0x00, 0x00,
+  0xea, 0x68, 0x0e, 0xff, 0x43, 0x00, 0x00, 0xea, 0x68, 0x00, 0x00, 0x00,
+  0x00, 0x43, 0xdb, 0xfc, 0xb7, 0x46, 0x00, 0x0e, 0xff, 0x8c, 0xd4, 0xe4,
+  0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a,
+  0x00, 0x00, 0x00, 0x0e, 0xff, 0x43, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
+  0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xc2, 0x33, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x79,
+  0x00, 0x00, 0x00, 0x00, 0x58, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x0a, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e,
+  0x14, 0x00, 0x00, 0x04, 0x32, 0x3b, 0x03, 0x00, 0x00, 0x00, 0x21, 0x38,
+  0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0x3b, 0x0f, 0x00, 0x2e, 0x35, 0x35,
+  0x35, 0x16, 0x00, 0x00, 0x03, 0x26, 0x49, 0x1f, 0x1e, 0x33, 0x33, 0x33,
+  0x33, 0x33, 0x00, 0x00, 0x18, 0x3a, 0x05, 0x00, 0x00, 0x00, 0x14, 0x37,
+  0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f,
+  0x00, 0x31, 0x35, 0x35, 0x35, 0x27, 0x00, 0x31, 0x35, 0x35, 0x35, 0x26,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xa6, 0xea, 0x9e, 0x53, 0x0f, 0x03,
+  0x5f, 0xa3, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d,
+  0xe9, 0xea, 0xb4, 0x23, 0x00, 0x07, 0x98, 0xff, 0x61, 0x00, 0x27, 0xd4,
+  0xee, 0xe8, 0xe8, 0x2f, 0x32, 0xcf, 0xdd, 0xe5, 0xef, 0x33, 0x00, 0x00,
+  0x00, 0x89, 0xff, 0x41, 0x00, 0xea, 0xf9, 0xf6, 0xf6, 0x64, 0x00, 0x25,
+  0xcf, 0xfe, 0xd1, 0x6c, 0x90, 0xf6, 0xf6, 0xf6, 0xf9, 0xff, 0x00, 0xa0,
+  0xea, 0xca, 0xee, 0x3e, 0x00, 0x9e, 0xf3, 0xe2, 0xe3, 0x1c, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0xea, 0xf4, 0xec,
+  0xec, 0xac, 0x00, 0xea, 0xf4, 0xec, 0xec, 0xa9, 0x00, 0x00, 0x00, 0x00,
+  0x17, 0x3a, 0x05, 0x30, 0x0c, 0x06, 0x36, 0x0c, 0x00, 0x00, 0x34, 0x13,
+  0x16, 0xf6, 0x91, 0xc3, 0x79, 0x5b, 0x80, 0xed, 0xc9, 0xd9, 0xdb, 0xcb,
+  0x00, 0x00, 0x31, 0xa9, 0x00, 0x00, 0x06, 0xf7, 0x57, 0x0c, 0xbd, 0x88,
+  0x05, 0xc6, 0xb6, 0xed, 0x61, 0x00, 0x08, 0x64, 0x05, 0x02, 0xbf, 0x9d,
+  0x04, 0x3a, 0x00, 0x01, 0xbe, 0xa2, 0x00, 0x00, 0x3d, 0xd1, 0xfc, 0x41,
+  0x02, 0xfc, 0x41, 0x00, 0x00, 0x00, 0x00, 0xc9, 0xa9, 0x1f, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x90, 0xbf, 0x23, 0xfe, 0x27, 0x00, 0x9b, 0xaf,
+  0x2b, 0xfc, 0x21, 0x00, 0xa9, 0xb1, 0x00, 0x00, 0x00, 0x01, 0x50, 0xce,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0x98, 0x1e, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x7c, 0xc1, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 0xea,
+  0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0xf6, 0xdf, 0xbf, 0xf9,
+  0x39, 0x1d, 0xff, 0x38, 0x00, 0x00, 0xf6, 0x5c, 0x30, 0xff, 0x55, 0xa7,
+  0x00, 0x00, 0x06, 0x21, 0xdd, 0xeb, 0x45, 0x0c, 0x00, 0x00, 0x3a, 0xc8,
+  0x00, 0x00, 0x35, 0xfd, 0x09, 0x00, 0x77, 0xc1, 0x00, 0x44, 0x03, 0xee,
+  0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0xa9, 0x00, 0x00, 0x00, 0x09,
+  0xdb, 0x79, 0x00, 0x0d, 0xdc, 0x43, 0xff, 0x41, 0x13, 0xff, 0x38, 0x0f,
+  0x00, 0x00, 0x36, 0xff, 0x34, 0x26, 0x05, 0x00, 0x00, 0x00, 0x00, 0x12,
+  0xf3, 0x4e, 0x0a, 0xf1, 0x6b, 0x16, 0xce, 0x80, 0x6e, 0xda, 0x00, 0x00,
+  0x58, 0xe9, 0x00, 0x01, 0x50, 0xce, 0xbc, 0x44, 0x49, 0xab, 0xab, 0xab,
+  0xab, 0xa8, 0x0f, 0x78, 0xe1, 0x98, 0x1f, 0x00, 0x00, 0x01, 0xdb, 0x62,
+  0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6a, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x0e, 0xfa, 0x58, 0x00, 0x6f, 0xff, 0x39, 0x1d, 0xff, 0x38,
+  0x00, 0x00, 0xf6, 0x5c, 0x00, 0x90, 0xfc, 0xdd, 0x46, 0x00, 0x00, 0x8b,
+  0xbb, 0x75, 0xce, 0x06, 0x41, 0x8d, 0xa7, 0xe7, 0x8d, 0x8d, 0x6b, 0xe3,
+  0x00, 0x00, 0x52, 0xf5, 0x00, 0x00, 0x00, 0xf0, 0x61, 0x00, 0x00, 0x00,
+  0x00, 0x31, 0xf8, 0x3f, 0x00, 0x33, 0xcb, 0xf8, 0x85, 0x05, 0x00, 0x9c,
+  0x8e, 0x08, 0xff, 0x41, 0x1f, 0xfd, 0xfe, 0xfa, 0xb8, 0x2d, 0x5b, 0xf2,
+  0xc9, 0xe6, 0xe7, 0x5a, 0x00, 0x00, 0x00, 0x7c, 0xd9, 0x02, 0x00, 0x37,
+  0xfb, 0xf8, 0xa4, 0x02, 0x2e, 0xfd, 0x49, 0x26, 0xbd, 0xfe, 0x35, 0xce,
+  0xac, 0x34, 0x00, 0x00, 0x24, 0x55, 0x55, 0x55, 0x55, 0x53, 0x00, 0x00,
+  0x08, 0x68, 0xd8, 0x98, 0x00, 0x3b, 0xf4, 0x0d, 0x00, 0xea, 0xe8, 0xd6,
+  0xd6, 0x6f, 0x00, 0xea, 0xb6, 0x82, 0x82, 0x42, 0x00, 0x00, 0x4f, 0xfb,
+  0x0c, 0x00, 0x23, 0xff, 0x39, 0x1d, 0xff, 0x38, 0x00, 0x00, 0xf6, 0x5c,
+  0x00, 0x00, 0x3a, 0xe4, 0xf4, 0x89, 0x00, 0x24, 0x30, 0x0c, 0x48, 0x00,
+  0x34, 0x72, 0x92, 0xe1, 0x72, 0x72, 0x5e, 0xea, 0x00, 0x00, 0x59, 0xee,
+  0x00, 0x00, 0x00, 0xf0, 0x61, 0x00, 0x00, 0x00, 0x22, 0xe6, 0x76, 0x00,
+  0x00, 0x15, 0x57, 0x82, 0xe7, 0x79, 0x4d, 0xd5, 0x09, 0x08, 0xff, 0x41,
+  0x00, 0x13, 0x03, 0x2c, 0xcd, 0xa5, 0x6f, 0xfc, 0x30, 0x01, 0x81, 0xd3,
+  0x00, 0x00, 0x09, 0xe9, 0x6a, 0x00, 0x0f, 0xc5, 0xb2, 0x78, 0xed, 0x63,
+  0x00, 0x7f, 0xe4, 0xe4, 0xa5, 0xeb, 0x34, 0xc4, 0xcd, 0x64, 0x0a, 0x00,
+  0x2e, 0x6c, 0x6c, 0x6c, 0x6c, 0x6a, 0x00, 0x00, 0x29, 0x92, 0xe4, 0x93,
+  0x00, 0x9a, 0xa3, 0x00, 0x00, 0xea, 0x96, 0x48, 0x48, 0x25, 0x00, 0xea,
+  0xc8, 0xa1, 0xa1, 0x52, 0x00, 0x00, 0x43, 0xfe, 0x12, 0x00, 0x23, 0xff,
+  0x39, 0x1c, 0xff, 0x3d, 0x00, 0x1c, 0xff, 0x5c, 0x06, 0x00, 0x17, 0xa7,
+  0x8a, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0xc8,
+  0x00, 0x00, 0x25, 0xff, 0x0f, 0x00, 0x7f, 0xb8, 0x00, 0x00, 0x00, 0xf0,
+  0x61, 0x00, 0x00, 0x20, 0xe0, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x84, 0xe4, 0xc4, 0xf0, 0xe2, 0xe3, 0xff, 0xe9, 0x00, 0x00, 0x00, 0x00,
+  0x7b, 0xdd, 0x4b, 0xf3, 0x07, 0x00, 0x47, 0xf8, 0x00, 0x00, 0x68, 0xed,
+  0x0b, 0x00, 0x5f, 0xe3, 0x02, 0x00, 0x5d, 0xeb, 0x00, 0x00, 0x01, 0x00,
+  0xaa, 0xbd, 0x00, 0x00, 0x35, 0xa5, 0xea, 0x90, 0x3f, 0x92, 0x92, 0x92,
+  0x92, 0x90, 0x34, 0xbe, 0xe0, 0x74, 0x10, 0x00, 0x09, 0xf0, 0x44, 0x00,
+  0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6a, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x07, 0xf5, 0x7b, 0x10, 0x8b, 0xff, 0x39, 0x02, 0xe4, 0x8c,
+  0x10, 0x86, 0xff, 0x5c, 0x60, 0xd2, 0xa9, 0xea, 0xfd, 0x77, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x91, 0x00, 0x00, 0x01, 0xea,
+  0x87, 0x2f, 0xd5, 0x81, 0x00, 0x00, 0x00, 0xf0, 0x61, 0x00, 0x1f, 0xdf,
+  0x9f, 0x29, 0x29, 0x29, 0x36, 0x28, 0x04, 0x29, 0xcd, 0x9c, 0x2a, 0x35,
+  0x35, 0x3b, 0xff, 0x69, 0x28, 0x37, 0x09, 0x32, 0xd3, 0x81, 0x16, 0xef,
+  0x7f, 0x18, 0xa7, 0xaf, 0x00, 0x03, 0xdb, 0x87, 0x00, 0x00, 0x3e, 0xf5,
+  0x26, 0x05, 0x88, 0xc7, 0x00, 0x06, 0x1b, 0x75, 0xf4, 0x48, 0x00, 0x00,
+  0x00, 0x00, 0x1b, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x56,
+  0x04, 0x00, 0x00, 0x00, 0x5a, 0xe2, 0x02, 0x00, 0x00, 0xea, 0x81, 0x24,
+  0x24, 0x1a, 0x00, 0xea, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c,
+  0xda, 0xda, 0x71, 0xff, 0x39, 0x00, 0x68, 0xe4, 0xfa, 0xa6, 0xd0, 0x5c,
+  0x09, 0x38, 0x74, 0xc9, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xb5, 0xef, 0x82, 0x10,
+  0x00, 0x00, 0x00, 0xf0, 0x61, 0x00, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0x5f, 0xdc, 0xfc, 0xe9, 0xa6, 0x22, 0x00, 0x00, 0x00, 0x08, 0xff, 0x41,
+  0x3e, 0xd7, 0xfd, 0xe4, 0x95, 0x17, 0x00, 0x47, 0xdc, 0xfb, 0xb2, 0x30,
+  0x00, 0x55, 0xfa, 0x1b, 0x00, 0x00, 0x00, 0x90, 0xe3, 0xf2, 0xbf, 0x3c,
+  0x00, 0xec, 0xfc, 0xde, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0xb9, 0x85, 0x00, 0x00, 0x00, 0xea, 0xff, 0xff, 0xff, 0xba, 0x00, 0xea,
+  0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x1a, 0xff,
+  0x39, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x70,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x01,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x01,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0f, 0x0d, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xff, 0x39, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x14, 0xc2, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x17, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x15, 0x43, 0x14, 0x00, 0x2d, 0x35, 0x35, 0x35,
+  0x35, 0x35, 0x32, 0x1b, 0x00, 0x00, 0x00, 0x26, 0x1c, 0x35, 0x35, 0x35,
+  0x35, 0x35, 0x00, 0x00, 0x1d, 0x17, 0x00, 0x00, 0x00, 0x00, 0x8c, 0xa9,
+  0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xbc, 0x2f, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x7a,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x35, 0x35,
+  0x35, 0x2b, 0x0d, 0x35, 0x04, 0x35, 0x0e, 0x00, 0x12, 0x41, 0x0e, 0x00,
+  0x2f, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 0xa1,
+  0xf9, 0xe4, 0xfe, 0x7c, 0xc9, 0xf0, 0xf6, 0xfe, 0xf0, 0xf0, 0x9e, 0xd1,
+  0x02, 0x00, 0x14, 0xf1, 0x7c, 0xf0, 0xf0, 0xf0, 0xf8, 0xff, 0x00, 0x00,
+  0xbd, 0xae, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xb2, 0x74, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xaa, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x60, 0x60, 0x60, 0xaa, 0x33, 0xfc,
+  0x02, 0xf9, 0x36, 0x9f, 0xeb, 0xd6, 0xf7, 0x5d, 0xa5, 0x99, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x2b, 0xfe, 0x2d, 0x00, 0x1a, 0x15,
+  0x00, 0x00, 0x6c, 0xea, 0x00, 0x00, 0x1d, 0xf7, 0x58, 0x00, 0x8a, 0xda,
+  0x00, 0x00, 0x00, 0x08, 0xd5, 0x9c, 0x00, 0x35, 0xc9, 0xd2, 0x34, 0x00,
+  0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x03, 0x35, 0x42, 0x09, 0x00,
+  0x00, 0x00, 0x07, 0x38, 0x03, 0x00, 0x00, 0x00, 0x28, 0x48, 0x36, 0x36,
+  0x0e, 0xff, 0x40, 0x00, 0x0e, 0x36, 0x34, 0x17, 0x00, 0x00, 0x0f, 0x36,
+  0x25, 0x2c, 0x00, 0x00, 0x1a, 0x35, 0x33, 0x1a, 0x00, 0x00, 0x10, 0x36,
+  0x00, 0x00, 0x58, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x95, 0x00, 0x00, 0x00, 0x95, 0x1f, 0xea, 0x00, 0xe6, 0x22, 0x1c,
+  0x04, 0x00, 0x7a, 0xcf, 0x46, 0xef, 0x09, 0x00, 0x00, 0x00, 0x04, 0x3e,
+  0x21, 0x00, 0x04, 0x36, 0x34, 0x06, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00,
+  0x00, 0x00, 0x24, 0xff, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0xea,
+  0x00, 0x00, 0x00, 0x8b, 0xd9, 0x1d, 0xf5, 0x54, 0x00, 0x00, 0x00, 0x8b,
+  0xe0, 0x0e, 0x00, 0xac, 0x58, 0x54, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xa7, 0xd5, 0xc6, 0xf3, 0x42, 0x00, 0x6d, 0xe1, 0xc7,
+  0xe1, 0x49, 0x02, 0xca, 0xbd, 0xb6, 0xff, 0xb2, 0x0e, 0xff, 0x40, 0x0c,
+  0xc7, 0xae, 0xba, 0xa4, 0x00, 0x00, 0x7f, 0xdf, 0x46, 0xfb, 0x38, 0x08,
+  0xd8, 0x97, 0xb6, 0xb1, 0x00, 0x00, 0x81, 0xe2, 0x00, 0x00, 0x58, 0xaa,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00,
+  0x00, 0x95, 0x0a, 0xa3, 0x00, 0xa1, 0x0d, 0x00, 0x00, 0x02, 0xa9, 0xb9,
+  0x03, 0xe3, 0x58, 0x00, 0x00, 0x70, 0xe7, 0xdd, 0xf7, 0x11, 0xe9, 0xe3,
+  0xd8, 0xcf, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x84,
+  0xfb, 0xb6, 0x33, 0x00, 0x00, 0x00, 0x6c, 0xea, 0x00, 0x00, 0x00, 0x12,
+  0xef, 0xd9, 0xc8, 0x01, 0x00, 0x00, 0x3b, 0xfb, 0x42, 0x00, 0x26, 0xdf,
+  0x04, 0x02, 0xd1, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a,
+  0x00, 0x00, 0xa7, 0xa5, 0x07, 0xf1, 0x3f, 0x00, 0x77, 0xba, 0x45, 0xf4,
+  0x06, 0x01, 0xe9, 0x66, 0x0e, 0xff, 0x45, 0xbc, 0xbb, 0x07, 0x59, 0xf3,
+  0x0a, 0x00, 0xd8, 0x80, 0x00, 0x95, 0xd5, 0x8f, 0xdb, 0x0b, 0x50, 0xf9,
+  0x13, 0x00, 0xd8, 0x85, 0x00, 0x00, 0x58, 0xaa, 0x00, 0x00, 0x2c, 0xb1,
+  0xcf, 0x88, 0x4c, 0x89, 0x00, 0x95, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x01, 0x9a, 0xd6, 0x1d, 0x00, 0x86, 0xb7, 0x00,
+  0x07, 0xf1, 0x62, 0x00, 0x06, 0x58, 0xf8, 0x20, 0x00, 0x08, 0x00, 0x00,
+  0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xbe, 0xfe, 0x5a,
+  0x00, 0x00, 0x6c, 0xea, 0x00, 0x00, 0x00, 0x00, 0x79, 0xff, 0x40, 0x00,
+  0x00, 0x0a, 0xda, 0x92, 0x00, 0x00, 0x9a, 0x75, 0x00, 0x00, 0x53, 0xc0,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x8b, 0xbf, 0xe6, 0xc5,
+  0x49, 0xfe, 0xc3, 0xc2, 0xd2, 0xfc, 0x36, 0xfe, 0x39, 0x2b, 0xf8, 0x29,
+  0x0e, 0xff, 0xc7, 0xf9, 0x18, 0x00, 0x09, 0xef, 0x57, 0x32, 0xfd, 0x20,
+  0x00, 0x0b, 0xe0, 0xff, 0x3d, 0x00, 0x04, 0xe5, 0x69, 0x31, 0xfe, 0x25,
+  0x00, 0x00, 0x58, 0xaa, 0x00, 0x00, 0x49, 0x3a, 0x47, 0x91, 0xbd, 0x67,
+  0x00, 0x95, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x43, 0xe6, 0x15, 0x00, 0x00, 0x28, 0xfb, 0x1a, 0x4a, 0xfb, 0x0d, 0x00,
+  0x00, 0x11, 0xc2, 0xf4, 0x90, 0x19, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xbe, 0x00, 0x00, 0x6c, 0xea,
+  0x00, 0x00, 0x00, 0x00, 0x47, 0xff, 0x12, 0x00, 0x00, 0x91, 0xda, 0x0a,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x27, 0xfc, 0x6a, 0x1e, 0x9a, 0xc5, 0x3b, 0xfd, 0x42, 0x31,
+  0x31, 0x31, 0x00, 0x9f, 0xe5, 0xb3, 0x5d, 0x00, 0x0e, 0xff, 0xac, 0xd2,
+  0xa4, 0x00, 0x00, 0x97, 0xac, 0x88, 0xbc, 0x00, 0x00, 0x2b, 0xf7, 0xee,
+  0x75, 0x00, 0x00, 0x82, 0xbf, 0x86, 0xc3, 0x00, 0x00, 0x00, 0x58, 0xaa,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00,
+  0x00, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x5b, 0x00, 0x00,
+  0x00, 0x00, 0xc7, 0x76, 0x40, 0xfe, 0x15, 0x00, 0x00, 0x00, 0x01, 0x4f,
+  0xd1, 0xdf, 0x00, 0x00, 0x00, 0xea, 0x83, 0x27, 0x27, 0x23, 0x39, 0x44,
+  0x14, 0x2b, 0xd1, 0x7b, 0x00, 0x00, 0x6c, 0xea, 0x00, 0x00, 0x00, 0x00,
+  0x47, 0xff, 0x12, 0x00, 0x40, 0xfd, 0x60, 0x27, 0x27, 0x27, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xf6,
+  0x0f, 0x1f, 0xe4, 0xc5, 0x01, 0xe0, 0x89, 0x0e, 0x07, 0x31, 0x08, 0xfa,
+  0x4e, 0x24, 0x0a, 0x00, 0x0e, 0xff, 0x40, 0x2b, 0xf5, 0x65, 0x00, 0x36,
+  0xef, 0xd1, 0x5b, 0x00, 0x05, 0xcd, 0x9e, 0x4b, 0xf8, 0x2d, 0x00, 0x1e,
+  0xf6, 0xda, 0x63, 0x00, 0x00, 0x00, 0x58, 0xaa, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x10, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x68, 0xd4,
+  0x04, 0xec, 0x8a, 0x14, 0x3f, 0x27, 0x2c, 0x01, 0x54, 0xee, 0x00, 0x00,
+  0x00, 0xea, 0xff, 0xff, 0xff, 0xe6, 0x51, 0xdb, 0xfd, 0xea, 0xa3, 0x11,
+  0x00, 0x00, 0x6c, 0xea, 0x00, 0x00, 0x00, 0x00, 0x47, 0xff, 0x12, 0x00,
+  0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc8, 0xf7, 0xdf, 0x83, 0xc5,
+  0x00, 0x3f, 0xae, 0xf4, 0xfc, 0x9f, 0x0a, 0xd2, 0xfc, 0xfb, 0xf7, 0x90,
+  0x0e, 0xff, 0x40, 0x00, 0x65, 0xf6, 0x00, 0x00, 0xd4, 0xf0, 0x09, 0x00,
+  0x83, 0xe5, 0x10, 0x00, 0xa2, 0xd0, 0x00, 0x00, 0xb4, 0xf4, 0x0d, 0x00,
+  0x00, 0x00, 0x58, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0xc6, 0x95, 0x95, 0x95, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x82, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x11, 0xf7, 0x00, 0x4f, 0xbf, 0xfe,
+  0xf1, 0x57, 0xe9, 0xf3, 0xde, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x0c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d,
+  0x0a, 0x00, 0xaa, 0x94, 0x08, 0x02, 0x4e, 0xf8, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x06, 0xbf, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x58, 0xaa,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x0f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xae,
+  0x37, 0x49, 0xae, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xc3,
+  0xf1, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x58, 0xaa, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x79, 0xb0, 0x96, 0x5c, 0x10,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x9f, 0x3a, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x3d, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xff, 0x5a, 0xff, 0x8f, 0x00,
+  0x00, 0x00, 0xff, 0x8f, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x3c, 0xaa, 0x3c, 0x8f, 0xff, 0x8f, 0x00, 0x00, 0x8f, 0xff,
+  0x8f, 0x00, 0x8f, 0xff, 0x8f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x8f, 0xff, 0x8f, 0x00, 0x00, 0x8f, 0xff, 0x8f, 0xff, 0x8f,
+  0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14,
+  0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x6e, 0xaa, 0x00, 0x3c, 0xaa, 0x3c, 0x00, 0x00, 0x8f,
+  0xff, 0x8f, 0x00, 0x00, 0x8f, 0xff, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x86, 0xbd, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x17,
+  0x00, 0x00, 0x00, 0x0a, 0x35, 0x13, 0x00, 0x00, 0x30, 0x20, 0x1d, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x31, 0x17, 0x00, 0x33, 0x15, 0x07, 0x35, 0x35,
+  0x26, 0x35, 0x31, 0x03, 0x7f, 0x18, 0x03, 0x7f, 0x18, 0x0b, 0xbc, 0x31,
+  0x00, 0x00, 0x0d, 0x35, 0x00, 0x00, 0x00, 0x5e, 0xff, 0x70, 0x00, 0x00,
+  0x00, 0x00, 0x70, 0xff, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5,
+  0xff, 0x00, 0x5a, 0xff, 0x5a, 0x00, 0x8f, 0xff, 0x8f, 0x00, 0x00, 0x00,
+  0x00, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x81, 0xd8, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x4f, 0x3b, 0x00, 0x00, 0x00, 0xb5, 0xf5, 0xb0, 0xe7, 0x28, 0x00, 0x26,
+  0xff, 0x55, 0x00, 0x3e, 0xe7, 0x4c, 0xdc, 0x06, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0xea, 0x6d, 0x00, 0xf4, 0x64, 0x22, 0xff, 0xcb, 0x8e, 0xd6, 0xeb, 0x0b,
+  0xc5, 0x2f, 0x0b, 0xc5, 0x2f, 0x0e, 0xff, 0x43, 0x00, 0x00, 0x33, 0xfc,
+  0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0x70, 0x00, 0x00, 0x70, 0xff, 0x70,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x8f, 0xff, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x17, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x07,
+  0xcd, 0xa8, 0x36, 0x03, 0x35, 0x00, 0x24, 0x0b, 0xcf, 0x85, 0x36, 0x00,
+  0x32, 0xfd, 0x1b, 0x01, 0xbb, 0x85, 0x00, 0x19, 0xff, 0x48, 0x01, 0xca,
+  0x70, 0x01, 0xca, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x2c, 0x09, 0x00, 0x2c, 0x08, 0x00, 0xea, 0x6d, 0x00, 0xf4,
+  0x64, 0x22, 0xff, 0x12, 0x00, 0x46, 0xeb, 0x03, 0x36, 0x0e, 0x03, 0x36,
+  0x0e, 0x0e, 0xff, 0x43, 0x00, 0x00, 0x1f, 0xea, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x70, 0xff, 0x70, 0x70, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x55, 0x37, 0x00, 0x37, 0x55, 0x00, 0x1e, 0x55, 0x1e, 0xff, 0x8f, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0xcc,
+  0xcc, 0xe8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x98, 0xf3, 0xe6, 0xc9, 0x0e,
+  0xff, 0x85, 0xfc, 0x93, 0xfb, 0xde, 0xc9, 0x00, 0x41, 0xf6, 0x00, 0x00,
+  0x9e, 0x99, 0x00, 0x0c, 0xff, 0x3c, 0x2c, 0xff, 0x0f, 0x00, 0x69, 0xd0,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xf8, 0x54,
+  0x20, 0xf8, 0x51, 0x00, 0xea, 0x6d, 0x00, 0xf4, 0x64, 0x22, 0xff, 0x12,
+  0x00, 0x46, 0xeb, 0x0e, 0xff, 0x43, 0x0e, 0xff, 0x43, 0x0e, 0xff, 0x43,
+  0x00, 0x00, 0x0a, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff,
+  0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa5, 0x00, 0xa5,
+  0xff, 0x00, 0x5a, 0xff, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xe6, 0x6f, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0xc7, 0x8b, 0x00, 0x0e, 0xff, 0xc7, 0x1f, 0x00,
+  0xee, 0x64, 0x00, 0x00, 0x64, 0xe7, 0x00, 0x00, 0x8f, 0xba, 0x00, 0x01,
+  0xfd, 0x2f, 0x54, 0xe5, 0x00, 0x00, 0x41, 0xf6, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x45, 0x09, 0x03, 0x46, 0x09, 0x00,
+  0xea, 0x6d, 0x00, 0xf4, 0x64, 0x22, 0xff, 0x12, 0x00, 0x46, 0xeb, 0x0e,
+  0xff, 0x43, 0x0e, 0xff, 0x43, 0x0e, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0xff, 0x70, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x55, 0x37, 0x00, 0x37, 0x55, 0x00, 0x1e, 0x55,
+  0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x01, 0xb1, 0xb6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0xc7, 0x8b, 0x00, 0x0e, 0xff, 0x5d, 0x00, 0x00, 0xee, 0x64, 0x00, 0x9b,
+  0xe8, 0x53, 0x00, 0x00, 0x23, 0xc4, 0xd7, 0x00, 0xf1, 0x22, 0x7b, 0xbe,
+  0x00, 0x00, 0x1a, 0xff, 0x00, 0x00, 0x00, 0x62, 0xa4, 0xa4, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0xf4,
+  0x64, 0x22, 0xff, 0x12, 0x00, 0x46, 0xeb, 0x0e, 0xff, 0x43, 0x0e, 0xff,
+  0x43, 0x0e, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x70, 0xff, 0x70, 0x70, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69,
+  0xe8, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x8b, 0x00, 0x0e,
+  0xff, 0x43, 0x00, 0x00, 0xee, 0x64, 0x00, 0x52, 0xcc, 0xa7, 0x00, 0x00,
+  0x4e, 0xea, 0x76, 0x00, 0x75, 0x0c, 0x6f, 0xca, 0x00, 0x00, 0x26, 0xff,
+  0x00, 0x00, 0x00, 0x49, 0x7a, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0xf4, 0x64, 0x22, 0xff, 0x12,
+  0x00, 0x46, 0xeb, 0x0e, 0xff, 0x43, 0x0e, 0xff, 0x43, 0x0e, 0xff, 0x43,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0x70, 0x00,
+  0x00, 0x70, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xf5, 0x4c, 0x03, 0x03, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0xc7, 0x8b, 0x00, 0x0e, 0xff, 0x43, 0x00, 0x00,
+  0xd0, 0x8f, 0x05, 0x00, 0x4a, 0xf5, 0x00, 0x00, 0x99, 0xa2, 0x00, 0x08,
+  0x75, 0x17, 0x47, 0xf2, 0x01, 0x00, 0x4e, 0xeb, 0x09, 0x56, 0x17, 0x00,
+  0x00, 0x00, 0x08, 0x75, 0x17, 0x08, 0x75, 0x17, 0x09, 0x56, 0x17, 0x00,
+  0xea, 0x6d, 0x00, 0xf4, 0x64, 0x22, 0xff, 0x12, 0x00, 0x46, 0xeb, 0x0e,
+  0xff, 0x43, 0x0e, 0xff, 0x43, 0x0e, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x5e, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff,
+  0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x9a, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0xc7, 0x8b, 0x00, 0x0e, 0xff, 0x43, 0x00, 0x00, 0x62, 0xee, 0xfc, 0x00,
+  0x41, 0xf7, 0x00, 0x00, 0x9f, 0x99, 0x00, 0x27, 0xfe, 0x4f, 0x1a, 0xfc,
+  0x27, 0x00, 0x82, 0xba, 0x3d, 0xf9, 0x14, 0x00, 0x00, 0x00, 0x27, 0xfe,
+  0x4f, 0x27, 0xfe, 0x4f, 0x3d, 0xf9, 0x14, 0x00, 0xea, 0x6d, 0x00, 0xf6,
+  0x60, 0x22, 0xff, 0x12, 0x00, 0x46, 0xeb, 0x0e, 0xff, 0x43, 0x0e, 0xff,
+  0x43, 0x0e, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14,
+  0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0e, 0x00, 0x13, 0xf7, 0x74, 0x3a,
+  0xe1, 0x6d, 0x00, 0x00, 0x12, 0x00, 0x00, 0x97, 0x9e, 0x0d, 0xeb, 0x3d,
+  0x71, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x00,
+  0x71, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x33, 0xff, 0x25, 0x22, 0xff, 0x3c,
+  0x20, 0x67, 0xeb, 0x00, 0x00, 0x00, 0x17, 0xff, 0x42, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1,
+  0xc1, 0xc1, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xa8, 0x8b, 0x86, 0x0d, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x16, 0xc8, 0x5c, 0x97, 0x00, 0x49, 0x33, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x33, 0x00, 0x00,
+  0x00, 0x00, 0xf9, 0xad, 0x00, 0x1c, 0xd1, 0xd1, 0x95, 0xd1, 0xc0, 0x00,
+  0x00, 0x00, 0xba, 0xf7, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+
+static mu_Rect atlas[] = {
+  [ MU_ICON_CLOSE ] = { 88, 68, 16, 16 },
+  [ MU_ICON_CHECK ] = { 0, 0, 18, 18 },
+  [ MU_ICON_EXPANDED ] = { 118, 68, 7, 5 },
+  [ MU_ICON_COLLAPSED ] = { 113, 68, 5, 7 },
+  [ MU_ICON_RESIZE ] = { 104, 68, 9, 9 },
+  [ ATLAS_WHITE ] = { 125, 68, 3, 3 },
+  [ ATLAS_FONT+32 ] = { 84, 68, 2, 17 },
+  [ ATLAS_FONT+33 ] = { 39, 68, 3, 17 },
+  [ ATLAS_FONT+34 ] = { 114, 51, 5, 17 },
+  [ ATLAS_FONT+35 ] = { 34, 17, 7, 17 },
+  [ ATLAS_FONT+36 ] = { 28, 34, 6, 17 },
+  [ ATLAS_FONT+37 ] = { 58, 0, 9, 17 },
+  [ ATLAS_FONT+38 ] = { 103, 0, 8, 17 },
+  [ ATLAS_FONT+39 ] = { 86, 68, 2, 17 },
+  [ ATLAS_FONT+40 ] = { 42, 68, 3, 17 },
+  [ ATLAS_FONT+41 ] = { 45, 68, 3, 17 },
+  [ ATLAS_FONT+42 ] = { 34, 34, 6, 17 },
+  [ ATLAS_FONT+43 ] = { 40, 34, 6, 17 },
+  [ ATLAS_FONT+44 ] = { 48, 68, 3, 17 },
+  [ ATLAS_FONT+45 ] = { 51, 68, 3, 17 },
+  [ ATLAS_FONT+46 ] = { 54, 68, 3, 17 },
+  [ ATLAS_FONT+47 ] = { 124, 34, 4, 17 },
+  [ ATLAS_FONT+48 ] = { 46, 34, 6, 17 },
+  [ ATLAS_FONT+49 ] = { 52, 34, 6, 17 },
+  [ ATLAS_FONT+50 ] = { 58, 34, 6, 17 },
+  [ ATLAS_FONT+51 ] = { 64, 34, 6, 17 },
+  [ ATLAS_FONT+52 ] = { 70, 34, 6, 17 },
+  [ ATLAS_FONT+53 ] = { 76, 34, 6, 17 },
+  [ ATLAS_FONT+54 ] = { 82, 34, 6, 17 },
+  [ ATLAS_FONT+55 ] = { 88, 34, 6, 17 },
+  [ ATLAS_FONT+56 ] = { 94, 34, 6, 17 },
+  [ ATLAS_FONT+57 ] = { 100, 34, 6, 17 },
+  [ ATLAS_FONT+58 ] = { 57, 68, 3, 17 },
+  [ ATLAS_FONT+59 ] = { 60, 68, 3, 17 },
+  [ ATLAS_FONT+60 ] = { 106, 34, 6, 17 },
+  [ ATLAS_FONT+61 ] = { 112, 34, 6, 17 },
+  [ ATLAS_FONT+62 ] = { 118, 34, 6, 17 },
+  [ ATLAS_FONT+63 ] = { 119, 51, 5, 17 },
+  [ ATLAS_FONT+64 ] = { 18, 0, 10, 17 },
+  [ ATLAS_FONT+65 ] = { 41, 17, 7, 17 },
+  [ ATLAS_FONT+66 ] = { 48, 17, 7, 17 },
+  [ ATLAS_FONT+67 ] = { 55, 17, 7, 17 },
+  [ ATLAS_FONT+68 ] = { 111, 0, 8, 17 },
+  [ ATLAS_FONT+69 ] = { 0, 35, 6, 17 },
+  [ ATLAS_FONT+70 ] = { 6, 35, 6, 17 },
+  [ ATLAS_FONT+71 ] = { 119, 0, 8, 17 },
+  [ ATLAS_FONT+72 ] = { 18, 17, 8, 17 },
+  [ ATLAS_FONT+73 ] = { 63, 68, 3, 17 },
+  [ ATLAS_FONT+74 ] = { 66, 68, 3, 17 },
+  [ ATLAS_FONT+75 ] = { 62, 17, 7, 17 },
+  [ ATLAS_FONT+76 ] = { 12, 51, 6, 17 },
+  [ ATLAS_FONT+77 ] = { 28, 0, 10, 17 },
+  [ ATLAS_FONT+78 ] = { 67, 0, 9, 17 },
+  [ ATLAS_FONT+79 ] = { 76, 0, 9, 17 },
+  [ ATLAS_FONT+80 ] = { 69, 17, 7, 17 },
+  [ ATLAS_FONT+81 ] = { 85, 0, 9, 17 },
+  [ ATLAS_FONT+82 ] = { 76, 17, 7, 17 },
+  [ ATLAS_FONT+83 ] = { 18, 51, 6, 17 },
+  [ ATLAS_FONT+84 ] = { 24, 51, 6, 17 },
+  [ ATLAS_FONT+85 ] = { 26, 17, 8, 17 },
+  [ ATLAS_FONT+86 ] = { 83, 17, 7, 17 },
+  [ ATLAS_FONT+87 ] = { 38, 0, 10, 17 },
+  [ ATLAS_FONT+88 ] = { 90, 17, 7, 17 },
+  [ ATLAS_FONT+89 ] = { 30, 51, 6, 17 },
+  [ ATLAS_FONT+90 ] = { 36, 51, 6, 17 },
+  [ ATLAS_FONT+91 ] = { 69, 68, 3, 17 },
+  [ ATLAS_FONT+92 ] = { 124, 51, 4, 17 },
+  [ ATLAS_FONT+93 ] = { 72, 68, 3, 17 },
+  [ ATLAS_FONT+94 ] = { 42, 51, 6, 17 },
+  [ ATLAS_FONT+95 ] = { 15, 68, 4, 17 },
+  [ ATLAS_FONT+96 ] = { 48, 51, 6, 17 },
+  [ ATLAS_FONT+97 ] = { 54, 51, 6, 17 },
+  [ ATLAS_FONT+98 ] = { 97, 17, 7, 17 },
+  [ ATLAS_FONT+99 ] = { 0, 52, 5, 17 },
+  [ ATLAS_FONT+100 ] = { 104, 17, 7, 17 },
+  [ ATLAS_FONT+101 ] = { 60, 51, 6, 17 },
+  [ ATLAS_FONT+102 ] = { 19, 68, 4, 17 },
+  [ ATLAS_FONT+103 ] = { 66, 51, 6, 17 },
+  [ ATLAS_FONT+104 ] = { 111, 17, 7, 17 },
+  [ ATLAS_FONT+105 ] = { 75, 68, 3, 17 },
+  [ ATLAS_FONT+106 ] = { 78, 68, 3, 17 },
+  [ ATLAS_FONT+107 ] = { 72, 51, 6, 17 },
+  [ ATLAS_FONT+108 ] = { 81, 68, 3, 17 },
+  [ ATLAS_FONT+109 ] = { 48, 0, 10, 17 },
+  [ ATLAS_FONT+110 ] = { 118, 17, 7, 17 },
+  [ ATLAS_FONT+111 ] = { 0, 18, 7, 17 },
+  [ ATLAS_FONT+112 ] = { 7, 18, 7, 17 },
+  [ ATLAS_FONT+113 ] = { 14, 34, 7, 17 },
+  [ ATLAS_FONT+114 ] = { 23, 68, 4, 17 },
+  [ ATLAS_FONT+115 ] = { 5, 52, 5, 17 },
+  [ ATLAS_FONT+116 ] = { 27, 68, 4, 17 },
+  [ ATLAS_FONT+117 ] = { 21, 34, 7, 17 },
+  [ ATLAS_FONT+118 ] = { 78, 51, 6, 17 },
+  [ ATLAS_FONT+119 ] = { 94, 0, 9, 17 },
+  [ ATLAS_FONT+120 ] = { 84, 51, 6, 17 },
+  [ ATLAS_FONT+121 ] = { 90, 51, 6, 17 },
+  [ ATLAS_FONT+122 ] = { 10, 68, 5, 17 },
+  [ ATLAS_FONT+123 ] = { 31, 68, 4, 17 },
+  [ ATLAS_FONT+124 ] = { 96, 51, 6, 17 },
+  [ ATLAS_FONT+125 ] = { 35, 68, 4, 17 },
+  [ ATLAS_FONT+126 ] = { 102, 51, 6, 17 },
+  [ ATLAS_FONT+127 ] = { 108, 51, 6, 17 },
+};
+
--- /dev/null
+++ b/demo/build.sh
@@ -1,0 +1,3 @@
+#!/bin/bash
+gcc main.c renderer.c ../src/microui.c -I../src\
+    -Wall -std=c11 -pedantic -lSDL2 -lGL -lm -O3 -g
--- /dev/null
+++ b/demo/main.c
@@ -1,0 +1,323 @@
+#include <SDL2/SDL.h>
+#include <stdio.h>
+#include "renderer.h"
+#include "microui.h"
+
+
+static  char logbuf[64000];
+static   int logbuf_updated = 0;
+static float bg[3] = { 90, 95, 100 };
+
+
+static void write_log(const char *text) {
+  if (logbuf[0]) { strcat(logbuf, "\n"); }
+  strcat(logbuf, text);
+  logbuf_updated = 1;
+}
+
+
+static void test_window(mu_Context *ctx) {
+  static mu_Container window;
+
+  /* init window manually so we can set its position and size */
+  if (!window.inited) {
+    mu_init_window(ctx, &window, 0);
+    window.rect = mu_rect(40, 40, 300, 450);
+  }
+
+  /* limit window to minimum size */
+  window.rect.w = mu_max(window.rect.w, 240);
+  window.rect.h = mu_max(window.rect.h, 300);
+
+
+  /* do window */
+  if (mu_begin_window(ctx, &window, "Demo Window")) {
+
+    /* window info */
+    static int show_info = 0;
+    if (mu_header(ctx, &show_info, "Window Info")) {
+      char buf[64];
+      mu_layout_row(ctx, 2, (int[]) { 54, -1 }, 0);
+      mu_label(ctx,"Position:");
+      sprintf(buf, "%d, %d", window.rect.x, window.rect.y); mu_label(ctx, buf);
+      mu_label(ctx, "Size:");
+      sprintf(buf, "%d, %d", window.rect.w, window.rect.h); mu_label(ctx, buf);
+      mu_label(ctx, "Hovered:");
+      mu_label(ctx, ctx->hover_root == &window ? "true" : "false");
+    }
+
+    /* labels + buttons */
+    static int show_buttons = 1;
+    if (mu_header(ctx, &show_buttons, "Test Buttons")) {
+      mu_layout_row(ctx, 3, (int[]) { 86, -110, -1 }, 0);
+      mu_label(ctx, "Test buttons 1:");
+      if (mu_button(ctx, "Button 1")) { write_log("Pressed button 1"); }
+      if (mu_button(ctx, "Button 2")) { write_log("Pressed button 2"); }
+      mu_label(ctx, "Test buttons 2:");
+      if (mu_button(ctx, "Button 3")) { write_log("Pressed button 3"); }
+      if (mu_button(ctx, "Button 4")) { write_log("Pressed button 4"); }
+    }
+
+    /* tree */
+    static int show_tree = 1;
+    if (mu_header(ctx, &show_tree, "Tree and Text")) {
+      mu_layout_row(ctx, 2, (int[]) { 140, -1 }, 0);
+      mu_layout_begin_column(ctx);
+      static int states[8];
+      if (mu_begin_treenode(ctx, &states[0], "Test 1")) {
+        if (mu_begin_treenode(ctx, &states[1], "Test 1a")) {
+          mu_label(ctx, "Hello");
+          mu_label(ctx, "world");
+          mu_end_treenode(ctx);
+        }
+        if (mu_begin_treenode(ctx, &states[2], "Test 1b")) {
+          if (mu_button(ctx, "Button 1")) { write_log("Pressed button 1"); }
+          if (mu_button(ctx, "Button 2")) { write_log("Pressed button 2"); }
+          mu_end_treenode(ctx);
+        }
+        mu_end_treenode(ctx);
+      }
+      if (mu_begin_treenode(ctx, &states[3], "Test 2")) {
+        mu_layout_row(ctx, 2, (int[]) { 54, 54 }, 0);
+        if (mu_button(ctx, "Button 3")) { write_log("Pressed button 3"); }
+        if (mu_button(ctx, "Button 4")) { write_log("Pressed button 4"); }
+        if (mu_button(ctx, "Button 5")) { write_log("Pressed button 5"); }
+        if (mu_button(ctx, "Button 6")) { write_log("Pressed button 6"); }
+        mu_end_treenode(ctx);
+      }
+      if (mu_begin_treenode(ctx, &states[4], "Test 3")) {
+        static int checks[3] = { 1, 0, 1 };
+        mu_checkbox(ctx, &checks[0], "Checkbox 1");
+        mu_checkbox(ctx, &checks[1], "Checkbox 2");
+        mu_checkbox(ctx, &checks[2], "Checkbox 3");
+        mu_end_treenode(ctx);
+      }
+      mu_layout_end_column(ctx);
+
+      mu_layout_begin_column(ctx);
+      mu_layout_row(ctx, 1, (int[]) { -1 }, 0);
+      mu_text(ctx, "Lorem ipsum dolor sit amet, consectetur adipiscing "
+        "elit. Maecenas lacinia, sem eu lacinia molestie, mi risus faucibus "
+        "ipsum, eu varius magna felis a nulla.");
+      mu_layout_end_column(ctx);
+    }
+
+    /* background color sliders */
+    static int show_sliders = 1;
+    if (mu_header(ctx, &show_sliders, "Background Color")) {
+      mu_layout_row(ctx, 2, (int[]) { -78, -1 }, 76);
+      /* sliders */
+      mu_layout_begin_column(ctx);
+      mu_layout_row(ctx, 2, (int[]) { 46, -1 }, 0);
+      mu_label(ctx, "Red:");   mu_slider(ctx, &bg[0], 0, 255);
+      mu_label(ctx, "Green:"); mu_slider(ctx, &bg[1], 0, 255);
+      mu_label(ctx, "Blue:");  mu_slider(ctx, &bg[2], 0, 255);
+      mu_layout_end_column(ctx);
+      /* color preview */
+      mu_Rect r = mu_layout_next(ctx);
+      mu_draw_rect(ctx, r, mu_color(bg[0], bg[1], bg[2], 255));
+      mu_draw_box(ctx, r, ctx->style->colors[MU_COLOR_BORDER]);
+      char buf[32];
+      sprintf(buf, "#%02X%02X%02X", (int) bg[0], (int) bg[1], (int) bg[2]);
+      mu_draw_control_text(ctx, buf, r, MU_COLOR_TEXT, MU_OPT_ALIGNCENTER);
+    }
+
+    mu_end_window(ctx);
+  }
+}
+
+
+static void log_window(mu_Context *ctx) {
+  static mu_Container window;
+
+  /* init window manually so we can set its position and size */
+  if (!window.inited) {
+    mu_init_window(ctx, &window, 0);
+    window.rect = mu_rect(350, 40, 300, 200);
+  }
+
+  if (mu_begin_window(ctx, &window, "Log Window")) {
+
+    /* output text panel */
+    static mu_Container panel;
+    mu_layout_row(ctx, 1, (int[]) { -1 }, -28);
+    mu_begin_panel(ctx, &panel);
+    mu_layout_row(ctx, 1, (int[]) { -1 }, -1);
+    mu_text(ctx, logbuf);
+    mu_end_panel(ctx);
+    if (logbuf_updated) {
+      panel.scroll.y = panel.content_size.y;
+      logbuf_updated = 0;
+    }
+
+    /* input textbox + submit button */
+    static char buf[128];
+    int submitted = 0;
+    mu_layout_row(ctx, 2, (int[]) { -70, -1 }, 0);
+    if (mu_textbox(ctx, buf, sizeof(buf)) & MU_RES_SUBMIT) {
+      mu_set_focus(ctx, ctx->last_id);
+      submitted = 1;
+    }
+    if (mu_button(ctx, "Submit")) { submitted = 1; }
+    if (submitted) {
+      write_log(buf);
+      buf[0] = '\0';
+    }
+
+    mu_end_window(ctx);
+  }
+}
+
+
+static int uint8_slider(mu_Context *ctx, unsigned char *value, int low, int high) {
+  static float tmp;
+  mu_push_id(ctx, &value, sizeof(value));
+  tmp = *value;
+  int res = mu_slider_ex(ctx, &tmp, low, high, 0, "%.0f", MU_OPT_ALIGNCENTER);
+  *value = tmp;
+  mu_pop_id(ctx);
+  return res;
+}
+
+
+static void style_window(mu_Context *ctx) {
+  static mu_Container window;
+
+  /* init window manually so we can set its position and size */
+  if (!window.inited) {
+    mu_init_window(ctx, &window, 0);
+    window.rect = mu_rect(350, 250, 300, 240);
+  }
+
+  static struct { const char *label; int idx; } colors[] = {
+    { "text:",         MU_COLOR_TEXT        },
+    { "border:",       MU_COLOR_BORDER      },
+    { "windowbg:",     MU_COLOR_WINDOWBG    },
+    { "titlebg:",      MU_COLOR_TITLEBG     },
+    { "titletext:",    MU_COLOR_TITLETEXT   },
+    { "panelbg:",      MU_COLOR_PANELBG     },
+    { "button:",       MU_COLOR_BUTTON      },
+    { "buttonhover:",  MU_COLOR_BUTTONHOVER },
+    { "buttonfocus:",  MU_COLOR_BUTTONFOCUS },
+    { "base:",         MU_COLOR_BASE        },
+    { "basehover:",    MU_COLOR_BASEHOVER   },
+    { "basefocus:",    MU_COLOR_BASEFOCUS   },
+    { "scrollbase:",   MU_COLOR_SCROLLBASE  },
+    { "scrollthumb:",  MU_COLOR_SCROLLTHUMB },
+    { NULL }
+  };
+
+  if (mu_begin_window(ctx, &window, "Style Editor")) {
+    int sw = mu_get_container(ctx)->body.w * 0.16;
+    mu_layout_row(ctx, 6, (int[]) { 80, sw, sw, sw, sw, -1 }, 0);
+    for (int i = 0; colors[i].label; i++) {
+      mu_label(ctx, colors[i].label);
+      uint8_slider(ctx, &ctx->style->colors[i].r, 0, 255);
+      uint8_slider(ctx, &ctx->style->colors[i].g, 0, 255);
+      uint8_slider(ctx, &ctx->style->colors[i].b, 0, 255);
+      uint8_slider(ctx, &ctx->style->colors[i].a, 0, 255);
+      mu_draw_rect(ctx, mu_layout_next(ctx), ctx->style->colors[i]);
+    }
+    mu_end_window(ctx);
+  }
+}
+
+
+static void process_frame(mu_Context *ctx) {
+  mu_begin(ctx);
+  test_window(ctx);
+  log_window(ctx);
+  style_window(ctx);
+  mu_end(ctx);
+}
+
+
+
+static const char button_map[256] = {
+  [ SDL_BUTTON_LEFT   & 0xff ] =  MU_MOUSE_LEFT,
+  [ SDL_BUTTON_RIGHT  & 0xff ] =  MU_MOUSE_RIGHT,
+  [ SDL_BUTTON_MIDDLE & 0xff ] =  MU_MOUSE_MIDDLE,
+};
+
+static const char key_map[256] = {
+  [ SDLK_LSHIFT       & 0xff ] = MU_KEY_SHIFT,
+  [ SDLK_RSHIFT       & 0xff ] = MU_KEY_SHIFT,
+  [ SDLK_LCTRL        & 0xff ] = MU_KEY_CTRL,
+  [ SDLK_RCTRL        & 0xff ] = MU_KEY_CTRL,
+  [ SDLK_LALT         & 0xff ] = MU_KEY_ALT,
+  [ SDLK_RALT         & 0xff ] = MU_KEY_ALT,
+  [ SDLK_RETURN       & 0xff ] = MU_KEY_RETURN,
+  [ SDLK_BACKSPACE    & 0xff ] = MU_KEY_BACKSPACE,
+};
+
+
+static int text_width(mu_Font font, const char *text, int len) {
+  if (len == -1) { len = strlen(text); }
+  return r_get_text_width(text, len);
+}
+
+static int text_height(mu_Font font) {
+  return r_get_text_height();
+}
+
+
+int main(int argc, char **argv) {
+  /* init SDL and renderer */
+  SDL_Init(SDL_INIT_EVERYTHING);
+  r_init();
+
+  /* init microui */
+  mu_Context *ctx = malloc(sizeof(mu_Context));
+  mu_init(ctx);
+  ctx->text_width = text_width;
+  ctx->text_height = text_height;
+
+  /* main loop */
+  for (;;) {
+    /* handle SDL events */
+    SDL_Event e;
+    while (SDL_PollEvent(&e)) {
+      switch (e.type) {
+        case SDL_QUIT: exit(EXIT_SUCCESS); break;
+        case SDL_MOUSEMOTION: mu_input_mousemove(ctx, e.motion.x, e.motion.y); break;
+        case SDL_MOUSEWHEEL: mu_input_mousewheel(ctx, e.wheel.y); break;
+        case SDL_TEXTINPUT: mu_input_text(ctx, e.text.text); break;
+
+        case SDL_MOUSEBUTTONDOWN:
+        case SDL_MOUSEBUTTONUP: {
+          int b = button_map[e.button.button & 0xff];
+          if (b && e.type == SDL_MOUSEBUTTONDOWN) { mu_input_mousedown(ctx, e.button.x, e.button.y, b); }
+          if (b && e.type ==   SDL_MOUSEBUTTONUP) { mu_input_mouseup(ctx, e.button.x, e.button.y, b);   }
+        }
+
+        case SDL_KEYDOWN:
+        case SDL_KEYUP: {
+          int c = key_map[e.key.keysym.sym & 0xff];
+          if (c && e.type == SDL_KEYDOWN) { mu_input_keydown(ctx, c); }
+          if (c && e.type ==   SDL_KEYUP) { mu_input_keyup(ctx, c);   }
+          break;
+        }
+      }
+    }
+
+    /* process frame */
+    process_frame(ctx);
+
+    /* render */
+    r_clear(mu_color(bg[0], bg[1], bg[2], 255));
+    mu_Command *cmd = NULL;
+    while (mu_next_command(ctx, &cmd)) {
+      switch (cmd->type) {
+        case MU_COMMAND_TEXT: r_draw_text(cmd->text.str, cmd->text.pos, cmd->text.color); break;
+        case MU_COMMAND_RECT: r_draw_rect(cmd->rect.rect, cmd->rect.color); break;
+        case MU_COMMAND_ICON: r_draw_icon(cmd->icon.id, cmd->icon.rect, cmd->icon.color); break;
+        case MU_COMMAND_CLIP: r_set_clip_rect(cmd->clip.rect); break;
+      }
+    }
+    r_present();
+  }
+
+  return 0;
+}
+
+
--- /dev/null
+++ b/demo/renderer.c
@@ -1,0 +1,181 @@
+#include <SDL2/SDL.h>
+#include <SDL2/SDL_opengl.h>
+#include <assert.h>
+#include "renderer.h"
+#include "atlas.inl"
+
+#define BUFFER_SIZE 16384
+
+static GLfloat   tex_buf[BUFFER_SIZE *  8];
+static GLfloat  vert_buf[BUFFER_SIZE *  8];
+static GLubyte color_buf[BUFFER_SIZE * 16];
+static GLuint  index_buf[BUFFER_SIZE *  6];
+
+static int width  = 800;
+static int height = 600;
+static int buf_idx;
+
+static SDL_Window *window;
+
+
+void r_init(void) {
+  /* init SDL window */
+  window = SDL_CreateWindow(
+    NULL, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
+    width, height, SDL_WINDOW_OPENGL);
+  SDL_GL_CreateContext(window);
+
+  /* init gl */
+  glEnable(GL_BLEND);
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  glDisable(GL_CULL_FACE);
+  glDisable(GL_DEPTH_TEST);
+  glEnable(GL_SCISSOR_TEST);
+  glEnable(GL_TEXTURE_2D);
+  glEnableClientState(GL_VERTEX_ARRAY);
+  glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+  glEnableClientState(GL_COLOR_ARRAY);
+
+  /* init texture */
+  GLuint id;
+  glGenTextures(1, &id);
+  glBindTexture(GL_TEXTURE_2D, id);
+  glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, ATLAS_WIDTH, ATLAS_HEIGHT, 0,
+    GL_ALPHA, GL_UNSIGNED_BYTE, atlas_texture);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+  assert(glGetError() == 0);
+}
+
+
+static void flush(void) {
+  if (buf_idx == 0) { return; }
+
+  glViewport(0, 0, width, height);
+  glMatrixMode(GL_PROJECTION);
+  glPushMatrix();
+  glLoadIdentity();
+  glOrtho(0.0f, width, height, 0.0f, -1.0f, +1.0f);
+  glMatrixMode(GL_MODELVIEW);
+  glPushMatrix();
+  glLoadIdentity();
+
+  glTexCoordPointer(2, GL_FLOAT, 0, tex_buf);
+  glVertexPointer(2, GL_FLOAT, 0, vert_buf);
+  glColorPointer(4, GL_UNSIGNED_BYTE, 0, color_buf);
+  glDrawElements(GL_TRIANGLES, buf_idx * 6, GL_UNSIGNED_INT, index_buf);
+
+  glMatrixMode(GL_MODELVIEW);
+  glPopMatrix();
+  glMatrixMode(GL_PROJECTION);
+  glPopMatrix();
+
+  buf_idx = 0;
+}
+
+
+static void push_quad(mu_Rect dst, mu_Rect src, mu_Color color) {
+  if (buf_idx == BUFFER_SIZE) { flush(); }
+
+  int texvert_idx = buf_idx *  8;
+  int   color_idx = buf_idx * 16;
+  int element_idx = buf_idx *  4;
+  int   index_idx = buf_idx *  6;
+  buf_idx++;
+
+  /* update texture buffer */
+  float x = src.x / (float) ATLAS_WIDTH;
+  float y = src.y / (float) ATLAS_HEIGHT;
+  float w = src.w / (float) ATLAS_WIDTH;
+  float h = src.h / (float) ATLAS_HEIGHT;
+  tex_buf[texvert_idx + 0] = x;
+  tex_buf[texvert_idx + 1] = y;
+  tex_buf[texvert_idx + 2] = x + w;
+  tex_buf[texvert_idx + 3] = y;
+  tex_buf[texvert_idx + 4] = x;
+  tex_buf[texvert_idx + 5] = y + h;
+  tex_buf[texvert_idx + 6] = x + w;
+  tex_buf[texvert_idx + 7] = y + h;
+
+  /* update vertex buffer */
+  vert_buf[texvert_idx + 0] = dst.x;
+  vert_buf[texvert_idx + 1] = dst.y;
+  vert_buf[texvert_idx + 2] = dst.x + dst.w;
+  vert_buf[texvert_idx + 3] = dst.y;
+  vert_buf[texvert_idx + 4] = dst.x;
+  vert_buf[texvert_idx + 5] = dst.y + dst.h;
+  vert_buf[texvert_idx + 6] = dst.x + dst.w;
+  vert_buf[texvert_idx + 7] = dst.y + dst.h;
+
+  /* update color buffer */
+  memcpy(color_buf + color_idx +  0, &color, 4);
+  memcpy(color_buf + color_idx +  4, &color, 4);
+  memcpy(color_buf + color_idx +  8, &color, 4);
+  memcpy(color_buf + color_idx + 12, &color, 4);
+
+  /* update index buffer */
+  index_buf[index_idx + 0] = element_idx + 0;
+  index_buf[index_idx + 1] = element_idx + 1;
+  index_buf[index_idx + 2] = element_idx + 2;
+  index_buf[index_idx + 3] = element_idx + 2;
+  index_buf[index_idx + 4] = element_idx + 3;
+  index_buf[index_idx + 5] = element_idx + 1;
+}
+
+
+void r_draw_rect(mu_Rect rect, mu_Color color) {
+  push_quad(rect, atlas[ATLAS_WHITE], color);
+}
+
+
+void r_draw_text(const char *text, mu_Vec2 pos, mu_Color color) {
+  mu_Rect dst = { pos.x, pos.y, 0, 0 };
+  for (const char *p = text; *p; p++) {
+    mu_Rect src = atlas[ATLAS_FONT + (unsigned char) *p];
+    dst.w = src.w;
+    dst.h = src.h;
+    push_quad(dst, src, color);
+    dst.x += dst.w;
+  }
+}
+
+
+void r_draw_icon(int id, mu_Rect rect, mu_Color color) {
+  mu_Rect src = atlas[id];
+  int x = rect.x + (rect.w - src.w) / 2;
+  int y = rect.y + (rect.h - src.h) / 2;
+  push_quad(mu_rect(x, y, src.w, src.h), src, color);
+}
+
+
+int r_get_text_width(const char *text, int len) {
+  int res = 0;
+  for (const char *p = text; *p && len--; p++) {
+    res += atlas[ATLAS_FONT + (unsigned char) *p].w;
+  }
+  return res;
+}
+
+
+int r_get_text_height(void) {
+  return 18;
+}
+
+
+void r_set_clip_rect(mu_Rect rect) {
+  flush();
+  glScissor(rect.x, height - (rect.y + rect.h), rect.w, rect.h);
+}
+
+
+void r_clear(mu_Color clr) {
+  flush();
+  glClearColor(clr.r / 255., clr.g / 255., clr.b / 255., clr.a / 255.);
+  glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+void r_present(void) {
+  flush();
+  SDL_GL_SwapWindow(window);
+}
--- /dev/null
+++ b/demo/renderer.h
@@ -1,0 +1,17 @@
+#ifndef RENDERER_H
+#define RENDERER_H
+
+#include "microui.h"
+
+void r_init(void);
+void r_draw_rect(mu_Rect rect, mu_Color color);
+void r_draw_text(const char *text, mu_Vec2 pos, mu_Color color);
+void r_draw_icon(int id, mu_Rect rect, mu_Color color);
+ int r_get_text_width(const char *text, int len);
+ int r_get_text_height(void);
+void r_set_clip_rect(mu_Rect rect);
+void r_clear(mu_Color color);
+void r_present(void);
+
+#endif
+
--- /dev/null
+++ b/doc/usage.md
@@ -1,0 +1,131 @@
+# Usage
+* **[Overview](#overview)**
+* **[Getting Started](#getting-started)**
+* **[Layout System](#layout-system)**
+* **[Style Customisation](#style-customisation)**
+* **[Custom Controls](#custom-controls)**
+
+## Overview
+The overall structure when using the library is as follows:
+```
+initialize `mu_Context`
+
+main loop:
+  call `mu_input_...` functions
+  call `mu_begin()`
+  process ui
+  call `mu_end()`
+  iterate commands using `mu_command_next()`
+```
+
+## Getting Started
+Before use a `mu_Context` should be initialized:
+```c
+mu_Context *ctx = malloc(sizeof(mu_Context));
+mu_init(ctx);
+```
+
+In your main loop you should first pass user input to microui using the
+`mu_input_...` functions. It is safe to call the input functions multiple
+times if the same input event occurs in a single frame.
+
+After handling the input the `mu_begin()` function must be called before
+processing your UI:
+```c
+mu_begin(ctx);
+```
+
+Before any controls can be used we must begin a window using one of the
+`mu_begin_window...` or `mu_begin_popup...` functions. The `mu_Container`
+for the window is expected to be either zeroed memory in which case
+it will be initialized automatically when used, or to have been
+intialized manually using the `mu_init_window()` function; once used,
+the `mu_Container`'s memory must remain valid until `mu_end()` is called
+at the end of the frame. The `mu_begin_...` window functions return a
+truthy value if the window is open, if this is not the case we should
+not process the window any further. When we are finished processing the
+window's ui the `mu_end_...` window function should be called.
+
+```c
+static mu_Container window;
+
+if (mu_begin_window(ctx, &window, "My Window")) {
+  /* process ui here... */
+  mu_end_window(ctx);
+}
+```
+
+It is safe to nest `mu_begin_window()` calls, this can be useful for
+things like context menus; the windows will still render separate from
+one another like normal.
+
+While inside a window block we can safely process controls. Controls
+that allow user interaction return a bitset of `MU_RES_...` values. Some
+controls — such as buttons — can only potentially return a single
+`MU_RES_...`, thus their return value can be treated as a boolean:
+```c
+if (mu_button(ctx, "My Button")) {
+  printf("'My Button' was pressed\n");
+}
+```
+
+The library generates unique IDs for controls internally to keep track
+of which are focused, hovered, etc. These are generated either from the
+pointer passed to the function (eg. for treenodes, checkboxes, textboxes
+and sliders), or the string/icon passed to the function (eg. buttons). An
+issue arrises then if you have several buttons in a window or panel that
+use the same label. The `mu_push_id()` and `mu_pop_id()` functions are
+provided for such situations, allowing you to push additional data that
+will be mixed into the unique ID:
+```c
+for (int i = 0; i < 10; i++) {
+  mu_push_id(ctx, &i, sizeof(i));
+  if (mu_button(ctx, "x")) {
+    printf("Pressed button %d\n", i);
+  }
+  mu_pop_id(ctx);
+}
+```
+
+When we're finished processing the UI for this frame the `mu_end()`
+function should be called:
+```c
+mu_end(ctx);
+```
+
+When we're ready to draw the UI the `mu_next_command()` can be used
+to iterate the resultant commands. The function expects a `mu_Command`
+pointer initialized to `NULL`. It is safe to iterate through the commands
+list any number of times:
+```c
+mu_Command *cmd = NULL;
+while (mu_next_command(ctx, &cmd)) {
+  if (cmd->type == MU_COMMAND_TEXT) {
+    render_text(cmd->text.font, cmd->text.text, cmd->text.pos.x, cmd->text.pos.y, cmd->text.color);
+  }
+  if (cmd->type == MU_COMMAND_RECT) {
+    render_rect(cmd->rect.rect, cmd->rect.color);
+  }
+  if (cmd->type == MU_COMMAND_ICON) {
+    render_icon(cmd->icon.id, cmd->icon.rect, cmd->icon.color);
+  }
+  if (cmd->type == MU_COMMAND_CLIP) {
+    set_clip_rect(cmd->clip.rect);
+  }
+}
+```
+
+See the [`demo`](demo) directory for a usage example.
+
+
+## Layout System
+*TODO*
+
+
+## Style Customisation
+*TODO*
+
+
+## Custom Controls
+*TODO*
+
--- /dev/null
+++ b/src/microui.c
@@ -1,0 +1,1205 @@
+/*
+** Copyright (c) 2018 rxi
+**
+** 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.
+*/
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+
+#include "microui.h"
+
+#define unused(x) ((void) (x))
+
+#define expect(x) do {                                               \
+    if (!(x)) {                                                      \
+      fprintf(stderr, "Fatal error: %s:%d: assertion '%s' failed\n", \
+        __FILE__, __LINE__, #x);                                     \
+      abort();                                                       \
+    }                                                                \
+  } while (0)
+
+
+#define push(stk, val) do {                                                 \
+    expect((stk).idx < (int) (sizeof((stk).items) / sizeof(*(stk).items))); \
+    (stk).items[ (stk).idx ] = (val);                                       \
+    (stk).idx++;                                                            \
+  } while (0)
+
+
+#define pop(stk) do {      \
+    expect((stk).idx > 0); \
+    (stk).idx--;           \
+  } while (0)
+
+
+static mu_Rect unclipped_rect = { 0, 0, 0x1000000, 0x1000000 };
+
+static mu_Style default_style = {
+  NULL,       /* font */
+  { 70, 12 }, /* size */
+  6, 2, 24,   /* padding, spacing, indent */
+  26, 20,     /* title_height, footer_height */
+  12, 10,     /* scrollbar_size, thumb_size */
+  {
+    { 230, 230, 230, 255 }, /* MU_COLOR_TEXT */
+    { 20,  20,  20,  200 }, /* MU_COLOR_BORDER */
+    { 50,  50,  50,  255 }, /* MU_COLOR_WINDOWBG */
+    { 20,  20,  20,  255 }, /* MU_COLOR_TITLEBG */
+    { 240, 240, 240, 255 }, /* MU_COLOR_TITLETEXT */
+    { 0,   0,   0,   0   }, /* MU_COLOR_PANELBG */
+    { 75,  75,  75,  255 }, /* MU_COLOR_BUTTON */
+    { 95,  95,  95,  255 }, /* MU_COLOR_BUTTONHOVER */
+    { 115, 115, 115, 255 }, /* MU_COLOR_BUTTONFOCUS */
+    { 30,  30,  30,  255 }, /* MU_COLOR_BASE */
+    { 35,  35,  35,  255 }, /* MU_COLOR_BASEHOVER */
+    { 40,  40,  40,  255 }, /* MU_COLOR_BASEFOCUS */
+    { 30,  30,  30,  255 }, /* MU_COLOR_SCROLLBASE */
+    { 80,  80,  80,  255 }  /* MU_COLOR_SCROLLTHUMB */
+  }
+};
+
+
+mu_Vec2 mu_vec2(int x, int y) {
+  mu_Vec2 res;
+  res.x = x, res.y = y;
+  return res;
+}
+
+
+mu_Rect mu_rect(int x, int y, int w, int h) {
+  mu_Rect res;
+  res.x = x, res.y = y, res.w = w, res.h = h;
+  return res;
+}
+
+
+mu_Color mu_color(int r, int g, int b, int a) {
+  mu_Color res;
+  res.r = r, res.g = g, res.b = b, res.a = a;
+  return res;
+}
+
+
+static mu_Rect shrink_rect(mu_Rect rect, int n) {
+  return mu_rect(rect.x + n, rect.y + n, rect.w - n * 2, rect.h - n * 2);
+}
+
+
+static mu_Rect clip_rect(mu_Rect rect, mu_Rect clip) {
+  int x1 = rect.x + rect.w;
+  int y1 = rect.y + rect.h;
+  int x2 = clip.x + clip.w;
+  int y2 = clip.y + clip.h;
+  rect.x = mu_max(rect.x, clip.x);
+  rect.y = mu_max(rect.y, clip.y);
+  rect.w = mu_min(x1, x2) - rect.x;
+  rect.h = mu_min(y1, y2) - rect.y;
+  rect.w = mu_max(0, rect.w);
+  rect.h = mu_max(0, rect.h);
+  return rect;
+}
+
+
+static int rect_overlaps_vec2(mu_Rect r, mu_Vec2 p) {
+  return p.x >= r.x && p.x < r.x + r.w && p.y >= r.y && p.y < r.y + r.h;
+}
+
+
+static int text_width(mu_Font font, const char *str, int len) {
+  unused(font);
+  if (len < 0) { len = strlen(str); }
+  return len * 8;
+}
+
+
+static int text_height(mu_Font font) {
+  unused(font);
+  return 16;
+}
+
+
+static void draw_frame(mu_Context *ctx, mu_Rect rect, int colorid) {
+  mu_draw_rect(ctx, rect, ctx->style->colors[colorid]);
+  /* draw border */
+  if (ctx->style->colors[MU_COLOR_BORDER].a) {
+    mu_draw_box(ctx, rect, ctx->style->colors[MU_COLOR_BORDER]);
+  }
+}
+
+
+void mu_init(mu_Context *ctx) {
+  memset(ctx, 0, sizeof(*ctx));
+  ctx->text_width = text_width;
+  ctx->text_height = text_height;
+  ctx->draw_frame = draw_frame;
+  ctx->_style = default_style;
+  ctx->style = &ctx->_style;
+}
+
+
+void mu_begin(mu_Context *ctx) {
+  ctx->command_list.idx = 0;
+  ctx->root_list.idx = 0;
+  ctx->scroll_target = NULL;
+  ctx->last_hover_root = ctx->hover_root;
+  ctx->hover_root = NULL;
+  ctx->mouse_delta.x = ctx->mouse_pos.x - ctx->last_mouse_pos.x;
+  ctx->mouse_delta.y = ctx->mouse_pos.y - ctx->last_mouse_pos.y;
+}
+
+
+static int compare_zindex(const void *a, const void *b) {
+  return (*(mu_Container**) a)->zindex - (*(mu_Container**) b)->zindex;
+}
+
+
+void mu_end(mu_Context *ctx) {
+  int i, n;
+  /* check stacks */
+  expect(ctx->container_stack.idx == 0);
+  expect(ctx->clip_stack.idx      == 0);
+  expect(ctx->id_stack.idx        == 0);
+  expect(ctx->layout_stack.idx    == 0);
+
+  /* handle mouse wheel scrolling */
+  if (ctx->scroll_target && ctx->mouse_wheel) {
+    ctx->scroll_target->scroll.y -= ctx->mouse_wheel * 30;
+  }
+
+  /* unset focus if focus id was not touched this frame */
+  if (!ctx->updated_focus) { ctx->focus = 0; }
+  ctx->updated_focus = 0;
+
+  /* bring hover root to front if mouse was pressed */
+  if (ctx->mouse_pressed && ctx->hover_root &&
+      ctx->hover_root->zindex < ctx->last_zindex)
+  {
+    mu_bring_to_front(ctx, ctx->hover_root);
+  }
+
+  /* reset input state */
+  ctx->key_pressed = 0;
+  ctx->text_input[0] = '\0';
+  ctx->mouse_pressed = 0;
+  ctx->mouse_wheel = 0;
+  ctx->last_mouse_pos = ctx->mouse_pos;
+
+  /* sort root containers by zindex */
+  n = ctx->root_list.idx;
+  qsort(ctx->root_list.items, n, sizeof(mu_Container*), compare_zindex);
+
+  /* set root container jump commands */
+  for (i = 0; i < n; i++) {
+    mu_Container *cnt = ctx->root_list.items[i];
+    /* if this is the first container then make the first command jump to it.
+    ** otherwise set the previous container's tail to jump to this one */
+    if (i == 0) {
+      mu_Command *cmd = (mu_Command*) ctx->command_list.items;
+      cmd->jump.dst = (char*) cnt->head + sizeof(mu_JumpCommand);
+    } else {
+      mu_Container *prev = ctx->root_list.items[i - 1];
+      prev->tail->jump.dst = (char*) cnt->head + sizeof(mu_JumpCommand);
+    }
+    /* make the last container's tail jump to the end of command list */
+    if (i == n - 1) {
+      cnt->tail->jump.dst = ctx->command_list.items + ctx->command_list.idx;
+    }
+  }
+}
+
+
+void mu_set_focus(mu_Context *ctx, mu_Id id) {
+  ctx->focus = id;
+  ctx->updated_focus = 1;
+}
+
+
+/* 32bit fnv-1a hash */
+#define MU_HASH_SEED 2166136261
+
+static void hash(mu_Id *hash, const void *data, int size) {
+  const unsigned char *p = data;
+  while (size--) {
+    *hash = (*hash ^ *p++) * 16777619;
+  }
+}
+
+
+mu_Id mu_get_id(mu_Context *ctx, const void *data, int size) {
+  int idx = ctx->id_stack.idx;
+  mu_Id res = (idx > 0) ? ctx->id_stack.items[idx - 1] : MU_HASH_SEED;
+  hash(&res, data, size);
+  ctx->last_id = res;
+  return res;
+}
+
+
+void mu_push_id(mu_Context *ctx, const void *data, int size) {
+  push(ctx->id_stack, mu_get_id(ctx, data, size));
+}
+
+
+void mu_pop_id(mu_Context *ctx) {
+  pop(ctx->id_stack);
+}
+
+
+void mu_push_clip_rect(mu_Context *ctx, mu_Rect rect) {
+  mu_Rect last = mu_get_clip_rect(ctx);
+  push(ctx->clip_stack, clip_rect(rect, last));
+}
+
+
+void mu_pop_clip_rect(mu_Context *ctx) {
+  pop(ctx->clip_stack);
+}
+
+
+mu_Rect mu_get_clip_rect(mu_Context *ctx) {
+  expect(ctx->clip_stack.idx > 0);
+  return ctx->clip_stack.items[ ctx->clip_stack.idx - 1 ];
+}
+
+
+int mu_check_clip(mu_Context *ctx, mu_Rect r) {
+  mu_Rect cr = mu_get_clip_rect(ctx);
+  if (r.x > cr.x + cr.w || r.x + r.w < cr.x ||
+      r.y > cr.y + cr.h || r.y + r.h < cr.y    ) { return MU_CLIP_ALL;  }
+  if (r.x >= cr.x && r.x + r.w <= cr.x + cr.w &&
+      r.y >= cr.y && r.y + r.h <= cr.y + cr.h  ) { return MU_CLIP_NONE; }
+  return MU_CLIP_PART;
+}
+
+
+static void push_layout(mu_Context *ctx, mu_Rect body, mu_Vec2 scroll) {
+  mu_Layout layout;
+  int width = 0;
+  memset(&layout, 0, sizeof(mu_Layout));
+  layout.body = body;
+  layout.body.x -= scroll.x;
+  layout.body.y -= scroll.y;
+  layout.max = mu_vec2(-0x1000000, -0x1000000);
+  push(ctx->layout_stack, layout);
+  mu_layout_row(ctx, 1, &width, 0);
+}
+
+
+static mu_Layout* get_layout(mu_Context *ctx) {
+  return &ctx->layout_stack.items[ctx->layout_stack.idx - 1];
+}
+
+
+static void push_container(mu_Context *ctx, mu_Container *cnt) {
+  /* push container and id */
+  push(ctx->container_stack, cnt);
+  mu_push_id(ctx, &cnt, sizeof(void*));
+  /* init */
+  cnt->body = shrink_rect(cnt->rect, ctx->style->padding);
+}
+
+
+static void pop_container(mu_Context *ctx) {
+  mu_Container *cnt = mu_get_container(ctx);
+  mu_Layout *layout = get_layout(ctx);
+  cnt->last_body = cnt->body;
+  cnt->content_size.x = layout->max.x - layout->body.x;
+  cnt->content_size.y = layout->max.y - layout->body.y;
+  /* pop container, layout and id */
+  pop(ctx->container_stack);
+  pop(ctx->layout_stack);
+  mu_pop_id(ctx);
+}
+
+
+mu_Container* mu_get_container(mu_Context *ctx) {
+  expect(ctx->container_stack.idx > 0);
+  return ctx->container_stack.items[ ctx->container_stack.idx - 1 ];
+}
+
+
+void mu_init_window(mu_Context *ctx, mu_Container *cnt, int opt) {
+  memset(cnt, 0, sizeof(*cnt));
+  cnt->inited = 1;
+  cnt->open = opt & MU_OPT_CLOSED ? 0 : 1;
+  cnt->rect = mu_rect(100, 100, 300, 300);
+  mu_bring_to_front(ctx, cnt);
+}
+
+
+void mu_bring_to_front(mu_Context *ctx, mu_Container *cnt) {
+  cnt->zindex = ++ctx->last_zindex;
+}
+
+
+/*============================================================================
+** input handlers
+**============================================================================*/
+
+void mu_input_mousemove(mu_Context *ctx, int x, int y) {
+  ctx->mouse_pos = mu_vec2(x, y);
+}
+
+
+void mu_input_mousedown(mu_Context *ctx, int x, int y, int btn) {
+  mu_input_mousemove(ctx, x, y);
+  ctx->mouse_down |= btn;
+  ctx->mouse_pressed |= btn;
+}
+
+
+void mu_input_mouseup(mu_Context *ctx, int x, int y, int btn) {
+  mu_input_mousemove(ctx, x, y);
+  ctx->mouse_down &= ~btn;
+}
+
+
+void mu_input_mousewheel(mu_Context *ctx, int y) {
+  ctx->mouse_wheel += y;
+}
+
+
+void mu_input_keydown(mu_Context *ctx, int key) {
+  ctx->key_pressed |= key;
+  ctx->key_down |= key;
+}
+
+
+void mu_input_keyup(mu_Context *ctx, int key) {
+  ctx->key_down &= ~key;
+}
+
+
+void mu_input_text(mu_Context *ctx, const char *text) {
+  int len = strlen(ctx->text_input);
+  int size = strlen(text) + 1;
+  expect(len + size <= (int) sizeof(ctx->text_input));
+  memcpy(ctx->text_input + len, text, size);
+}
+
+
+/*============================================================================
+** commandlist
+**============================================================================*/
+
+mu_Command* mu_push_command(mu_Context *ctx, int type, int size) {
+  mu_Command *cmd = (mu_Command*) (ctx->command_list.items + ctx->command_list.idx);
+  expect(ctx->command_list.idx + size < MU_COMMANDLIST_SIZE);
+  cmd->base.type = type;
+  cmd->base.size = size;
+  ctx->command_list.idx += size;
+  return cmd;
+}
+
+
+int mu_next_command(mu_Context *ctx, mu_Command **cmd) {
+  if (*cmd) {
+    *cmd = (mu_Command*) (((char*) *cmd) + (*cmd)->base.size);
+  } else {
+    *cmd = (mu_Command*) ctx->command_list.items;
+  }
+  while ((char*) *cmd != ctx->command_list.items + ctx->command_list.idx) {
+    if ((*cmd)->type != MU_COMMAND_JUMP) { return 1; }
+    *cmd = (*cmd)->jump.dst;
+  }
+  return 0;
+}
+
+
+static mu_Command* push_jump(mu_Context *ctx, mu_Command *dst) {
+  mu_Command *cmd;
+  cmd = mu_push_command(ctx, MU_COMMAND_JUMP, sizeof(mu_JumpCommand));
+  cmd->jump.dst = dst;
+  return cmd;
+}
+
+
+void mu_set_clip(mu_Context *ctx, mu_Rect rect) {
+  mu_Command *cmd;
+  cmd = mu_push_command(ctx, MU_COMMAND_CLIP, sizeof(mu_ClipCommand));
+  cmd->clip.rect = rect;
+}
+
+
+void mu_draw_rect(mu_Context *ctx, mu_Rect rect, mu_Color color) {
+  mu_Command *cmd;
+  rect = clip_rect(rect, mu_get_clip_rect(ctx));
+  if (rect.w > 0 && rect.h > 0) {
+    cmd = mu_push_command(ctx, MU_COMMAND_RECT, sizeof(mu_RectCommand));
+    cmd->rect.rect = rect;
+    cmd->rect.color = color;
+  }
+}
+
+
+void mu_draw_box(mu_Context *ctx, mu_Rect rect, mu_Color color) {
+  mu_draw_rect(ctx, mu_rect(rect.x + 1, rect.y, rect.w - 2, 1), color);
+  mu_draw_rect(ctx, mu_rect(rect.x+1, rect.y + rect.h-1, rect.w-2, 1), color);
+  mu_draw_rect(ctx, mu_rect(rect.x, rect.y, 1, rect.h), color);
+  mu_draw_rect(ctx, mu_rect(rect.x + rect.w - 1, rect.y, 1, rect.h), color);
+}
+
+
+void mu_draw_text(mu_Context *ctx, mu_Font font, const char *str, int len,
+  mu_Vec2 pos, mu_Color color)
+{
+  mu_Command *cmd;
+  mu_Rect rect = mu_rect(
+    pos.x, pos.y, ctx->text_width(font, str, len), ctx->text_height(font));
+  int clipped = mu_check_clip(ctx, rect);
+  if (clipped == MU_CLIP_ALL ) { return; }
+  if (clipped == MU_CLIP_PART) { mu_set_clip(ctx, mu_get_clip_rect(ctx)); }
+  /* add command */
+  if (len < 0) { len = strlen(str); }
+  cmd = mu_push_command(ctx, MU_COMMAND_TEXT, sizeof(mu_TextCommand) + len);
+  memcpy(cmd->text.str, str, len);
+  cmd->text.str[len] = '\0';
+  cmd->text.pos = pos;
+  cmd->text.color = color;
+  cmd->text.font = font;
+  /* reset clipping if it was set */
+  if (clipped) { mu_set_clip(ctx, unclipped_rect); }
+}
+
+
+void mu_draw_icon(mu_Context *ctx, int id, mu_Rect rect, mu_Color color) {
+  mu_Command *cmd;
+  /* do clip command if the rect isn't fully contained within the cliprect */
+  int clipped = mu_check_clip(ctx, rect);
+  if (clipped == MU_CLIP_ALL ) { return; }
+  if (clipped == MU_CLIP_PART) { mu_set_clip(ctx, mu_get_clip_rect(ctx)); }
+  /* do icon command */
+  cmd = mu_push_command(ctx, MU_COMMAND_ICON, sizeof(mu_IconCommand));
+  cmd->icon.id = id;
+  cmd->icon.rect = rect;
+  cmd->icon.color = color;
+  /* reset clipping if it was set */
+  if (clipped) { mu_set_clip(ctx, unclipped_rect); }
+}
+
+
+/*============================================================================
+** layout
+**============================================================================*/
+
+enum { RELATIVE = 1, ABSOLUTE = 2 };
+
+
+void mu_layout_begin_column(mu_Context *ctx) {
+  push_layout(ctx, mu_layout_next(ctx), mu_vec2(0, 0));
+}
+
+
+void mu_layout_end_column(mu_Context *ctx) {
+  mu_Layout *a, *b;
+  b = get_layout(ctx);
+  pop(ctx->layout_stack);
+  /* inherit position/next_row/max from child layout if they are greater */
+  a = get_layout(ctx);
+  a->position.x = mu_max(a->position.x, b->position.x + b->body.x - a->body.x);
+  a->next_row = mu_max(a->next_row, b->next_row + b->body.y - a->body.y);
+  a->max.x = mu_max(a->max.x, b->max.x);
+  a->max.y = mu_max(a->max.y, b->max.y);
+}
+
+
+void mu_layout_row(mu_Context *ctx, int items, const int *widths, int height) {
+  mu_Layout *layout = get_layout(ctx);
+  if (widths) {
+    expect(items <= MU_MAX_WIDTHS);
+    memcpy(layout->widths, widths, items * sizeof(widths[0]));
+  }
+  layout->items = items;
+  layout->position = mu_vec2(layout->indent, layout->next_row);
+  layout->size.y = height;
+  layout->row_index = 0;
+}
+
+
+void mu_layout_width(mu_Context *ctx, int width) {
+  get_layout(ctx)->size.x = width;
+}
+
+
+void mu_layout_height(mu_Context *ctx, int height) {
+  get_layout(ctx)->size.y = height;
+}
+
+
+void mu_layout_set_next(mu_Context *ctx, mu_Rect r, int relative) {
+  mu_Layout *layout = get_layout(ctx);
+  layout->next = r;
+  layout->next_type = relative ? RELATIVE : ABSOLUTE;
+}
+
+
+mu_Rect mu_layout_next(mu_Context *ctx) {
+  mu_Layout *layout = get_layout(ctx);
+  mu_Style *style = ctx->style;
+  mu_Rect res;
+
+  if (layout->next_type) {
+    /* handle rect set by `mu_layout_set_next` */
+    int type = layout->next_type;
+    layout->next_type = 0;
+    res = layout->next;
+    if (type == ABSOLUTE) { return res; }
+
+  } else {
+    /* handle next row */
+    if (layout->row_index == layout->items) {
+      mu_layout_row(ctx, layout->items, NULL, layout->size.y);
+    }
+
+    /* position */
+    res.x = layout->position.x;
+    res.y = layout->position.y;
+
+    /* size */
+    res.w =
+      layout->items > -1 ? layout->widths[layout->row_index] : layout->size.x;
+    res.h = layout->size.y;
+    if (res.w == 0) { res.w = style->size.x + style->padding * 2; }
+    if (res.h == 0) { res.h = style->size.y + style->padding * 2; }
+    if (res.w <  0) { res.w += layout->body.w - res.x + 1; }
+    if (res.h <  0) { res.h += layout->body.h - res.y + 1; }
+
+    layout->row_index++;
+  }
+
+  /* update position */
+  layout->position.x += res.w + style->spacing;
+  layout->next_row = mu_max(layout->next_row, res.y + res.h + style->spacing);
+
+  /* apply body offset */
+  res.x += layout->body.x;
+  res.y += layout->body.y;
+
+  /* update max position */
+  layout->max.x = mu_max(layout->max.x, res.x + res.w);
+  layout->max.y = mu_max(layout->max.y, res.y + res.h);
+
+  return (ctx->last_rect = res);
+}
+
+
+/*============================================================================
+** controls
+**============================================================================*/
+
+static int in_hover_root(mu_Context *ctx) {
+  int i = ctx->container_stack.idx;
+  while (i--) {
+    if (ctx->container_stack.items[i] == ctx->last_hover_root) { return 1; }
+    /* only root containers have their `head` field set; stop searching if we've
+    ** reached the current root container */
+    if (ctx->container_stack.items[i]->head) { break; }
+  }
+  return 0;
+}
+
+
+void mu_draw_control_frame(mu_Context *ctx, mu_Id id, mu_Rect rect,
+  int colorid, int opt)
+{
+  if (opt & MU_OPT_NOFRAME) { return; }
+  colorid += (ctx->focus == id) ? 2 : (ctx->hover == id) ? 1 : 0;
+  ctx->draw_frame(ctx, rect, colorid);
+}
+
+
+void mu_draw_control_text(mu_Context *ctx, const char *str, mu_Rect rect,
+  int colorid, int opt)
+{
+  mu_Vec2 pos;
+  mu_Font font = ctx->style->font;
+  int tw = ctx->text_width(font, str, -1);
+  mu_push_clip_rect(ctx, rect);
+  pos.y = rect.y + (rect.h - ctx->text_height(font)) / 2;
+  if (opt & MU_OPT_ALIGNCENTER) {
+    pos.x = rect.x + (rect.w - tw) / 2;
+  } else if (opt & MU_OPT_ALIGNRIGHT) {
+    pos.x = rect.x + rect.w - tw - ctx->style->padding;
+  } else {
+    pos.x = rect.x + ctx->style->padding;
+  }
+  mu_draw_text(ctx, font, str, -1, pos, ctx->style->colors[colorid]);
+  mu_pop_clip_rect(ctx);
+}
+
+
+int mu_mouse_over(mu_Context *ctx, mu_Rect rect) {
+  return rect_overlaps_vec2(rect, ctx->mouse_pos) &&
+    rect_overlaps_vec2(mu_get_clip_rect(ctx), ctx->mouse_pos) &&
+    in_hover_root(ctx);
+}
+
+
+void mu_update_control(mu_Context *ctx, mu_Id id, mu_Rect rect, int opt) {
+  int mouseover = mu_mouse_over(ctx, rect);
+
+  if (ctx->focus == id) { ctx->updated_focus = 1; }
+  if (opt & MU_OPT_NOINTERACT) { return; }
+  if (mouseover && !ctx->mouse_down) { ctx->hover = id; }
+
+  if (ctx->focus == id) {
+    if (ctx->mouse_pressed && !mouseover) { mu_set_focus(ctx, 0); }
+    if (!ctx->mouse_down && ~opt & MU_OPT_HOLDFOCUS) { mu_set_focus(ctx, 0); }
+  }
+
+  if (ctx->hover == id) {
+    if (!mouseover) {
+      ctx->hover = 0;
+    } else if (ctx->mouse_pressed) {
+      mu_set_focus(ctx, id);
+    }
+  }
+}
+
+
+void mu_text(mu_Context *ctx, const char *text) {
+  const char *start, *end, *p = text;
+  int width = -1;
+  mu_Font font = ctx->style->font;
+  mu_Color color = ctx->style->colors[MU_COLOR_TEXT];
+  mu_layout_begin_column(ctx);
+  mu_layout_row(ctx, 1, &width, ctx->text_height(font));
+  do {
+    mu_Rect r = mu_layout_next(ctx);
+    int w = 0;
+    start = end = p;
+    do {
+      const char* word = p;
+      while (*p && *p != ' ' && *p != '\n') { p++; }
+      w += ctx->text_width(font, word, p - word);
+      if (w > r.w && end != start) { break; }
+      w += ctx->text_width(font, p, 1);
+      end = p++;
+    } while (*end && *end != '\n');
+    mu_draw_text(ctx, font, start, end - start, mu_vec2(r.x, r.y), color);
+    p = end + 1;
+  } while (*end);
+  mu_layout_end_column(ctx);
+}
+
+
+void mu_label(mu_Context *ctx, const char *text) {
+  mu_draw_control_text(ctx, text, mu_layout_next(ctx), MU_COLOR_TEXT, 0);
+}
+
+
+int mu_button_ex(mu_Context *ctx, const char *label, int icon, int opt) {
+  int res = 0;
+  mu_Id id = label ? mu_get_id(ctx, label, strlen(label))
+    : mu_get_id(ctx, &icon, sizeof(icon));
+  mu_Rect r = mu_layout_next(ctx);
+  mu_update_control(ctx, id, r, opt);
+  /* handle click */
+  if (ctx->mouse_pressed == MU_MOUSE_LEFT && ctx->focus == id) {
+    res |= MU_RES_SUBMIT;
+  }
+  /* draw */
+  mu_draw_control_frame(ctx, id, r, MU_COLOR_BUTTON, opt);
+  if (label) { mu_draw_control_text(ctx, label, r, MU_COLOR_TEXT, opt); }
+  if (icon) { mu_draw_icon(ctx, icon, r, ctx->style->colors[MU_COLOR_TEXT]); }
+  return res;
+}
+
+
+int mu_button(mu_Context *ctx, const char *label) {
+  return mu_button_ex(ctx, label, 0, MU_OPT_ALIGNCENTER);
+}
+
+
+int mu_checkbox(mu_Context *ctx, int *state, const char *label) {
+  int res = 0;
+  mu_Id id = mu_get_id(ctx, &state, sizeof(state));
+  mu_Rect r = mu_layout_next(ctx);
+  mu_Rect box = mu_rect(r.x, r.y, r.h, r.h);
+  mu_update_control(ctx, id, r, 0);
+  /* handle click */
+  if (ctx->mouse_pressed == MU_MOUSE_LEFT && ctx->focus == id) {
+    res |= MU_RES_CHANGE;
+    *state = !*state;
+  }
+  /* draw */
+  mu_draw_control_frame(ctx, id, box, MU_COLOR_BASE, 0);
+  if (*state) {
+    mu_draw_icon(ctx, MU_ICON_CHECK, box, ctx->style->colors[MU_COLOR_TEXT]);
+  }
+  r = mu_rect(r.x + box.w, r.y, r.w - box.w, r.h);
+  mu_draw_control_text(ctx, label, r, MU_COLOR_TEXT, 0);
+  return res;
+}
+
+
+int mu_textbox_raw(mu_Context *ctx, char *buf, int bufsz, mu_Id id, mu_Rect r,
+  int opt)
+{
+  int res = 0;
+  mu_update_control(ctx, id, r, opt | MU_OPT_HOLDFOCUS);
+
+  if (ctx->focus == id) {
+    /* handle text input */
+    int len = strlen(buf);
+    int n = mu_min(bufsz - len - 1, (int) strlen(ctx->text_input));
+    if (n > 0) {
+      memcpy(buf + len, ctx->text_input, n);
+      len += n;
+      buf[len] = '\0';
+      res |= MU_RES_CHANGE;
+    }
+    /* handle backspace */
+    if (ctx->key_pressed & MU_KEY_BACKSPACE && len > 0) {
+      /* skip utf-8 continuation bytes */
+      while ((buf[--len] & 0xc0) == 0x80 && len > 0);
+      buf[len] = '\0';
+      res |= MU_RES_CHANGE;
+    }
+    /* handle return */
+    if (ctx->key_pressed & MU_KEY_RETURN) {
+      mu_set_focus(ctx, 0);
+      res |= MU_RES_SUBMIT;
+    }
+  }
+
+  /* draw */
+  mu_draw_control_frame(ctx, id, r, MU_COLOR_BASE, opt);
+  if (ctx->focus == id) {
+    mu_Color color = ctx->style->colors[MU_COLOR_TEXT];
+    mu_Font font = ctx->style->font;
+    int textw = ctx->text_width(font, buf, -1);
+    int texth = ctx->text_height(font);
+    int ofx = r.w - ctx->style->padding - textw - 1;
+    int textx = r.x + mu_min(ofx, ctx->style->padding);
+    int texty = r.y + (r.h - texth) / 2;
+    mu_push_clip_rect(ctx, r);
+    mu_draw_text(ctx, font, buf, -1, mu_vec2(textx, texty), color);
+    mu_draw_rect(ctx, mu_rect(textx + textw, texty, 1, texth), color);
+    mu_pop_clip_rect(ctx);
+  } else {
+    mu_draw_control_text(ctx, buf, r, MU_COLOR_TEXT, opt);
+  }
+
+  return res;
+}
+
+
+static int number_textbox(mu_Context *ctx, mu_Real *value, mu_Rect r, mu_Id id) {
+  if (ctx->mouse_pressed == MU_MOUSE_LEFT &&
+      ctx->key_down & MU_KEY_SHIFT &&
+      ctx->hover == id)
+  {
+    ctx->number_editing = id;
+    sprintf(ctx->number_buf, MU_REAL_FMT, *value);
+  }
+  if (ctx->number_editing == id) {
+    int res = mu_textbox_raw(
+      ctx, ctx->number_buf, sizeof(ctx->number_buf), id, r, 0);
+    if (res & MU_RES_SUBMIT || ctx->focus != id) {
+      *value = strtod(ctx->number_buf, NULL);
+      ctx->number_editing = 0;
+    } else {
+      return 1;
+    }
+  }
+  return 0;
+}
+
+
+int mu_textbox_ex(mu_Context *ctx, char *buf, int bufsz, int opt) {
+  mu_Id id = mu_get_id(ctx, &buf, sizeof(buf));
+  mu_Rect r = mu_layout_next(ctx);
+  return mu_textbox_raw(ctx, buf, bufsz, id, r, opt);
+}
+
+
+int mu_textbox(mu_Context *ctx, char *buf, int bufsz) {
+  return mu_textbox_ex(ctx, buf, bufsz, 0);
+}
+
+
+int mu_slider_ex(mu_Context *ctx, mu_Real *value, mu_Real low, mu_Real high,
+  mu_Real step, const char *fmt, int opt)
+{
+  char buf[MU_MAX_FMT + 1];
+  mu_Rect thumb;
+  int w, res = 0;
+  mu_Real normalized, last = *value, v = last;
+  mu_Id id = mu_get_id(ctx, &value, sizeof(value));
+  mu_Rect base = mu_layout_next(ctx);
+
+  /* handle text input mode */
+  if (number_textbox(ctx, &v, base, id)) { return res; }
+
+  /* handle normal mode */
+  mu_update_control(ctx, id, base, opt);
+
+  /* handle input */
+  if (ctx->focus == id && ctx->mouse_down == MU_MOUSE_LEFT) {
+    v = low + ((mu_Real) (ctx->mouse_pos.x - base.x) / base.w) * (high - low);
+    if (step) { v = ((long) ((v + step/2) / step)) * step; }
+  }
+  /* clamp and store value, update res */
+  *value = v = mu_clamp(v, low, high);
+  if (last != v) { res |= MU_RES_CHANGE; }
+
+  /* draw base */
+  mu_draw_control_frame(ctx, id, base, MU_COLOR_BASE, opt);
+  /* draw thumb */
+  w = ctx->style->thumb_size;
+  normalized = (v - low) / (high - low);
+  thumb = mu_rect(base.x + normalized * (base.w - w), base.y, w, base.h);
+  mu_draw_control_frame(ctx, id, thumb, MU_COLOR_BUTTON, opt);
+  /* draw text  */
+  sprintf(buf, fmt, v);
+  mu_draw_control_text(ctx, buf, base, MU_COLOR_TEXT, opt);
+
+  return res;
+}
+
+
+int mu_slider(mu_Context *ctx, mu_Real *value, mu_Real low, mu_Real high) {
+  return mu_slider_ex(ctx, value, low, high, 0, MU_SLIDER_FMT, MU_OPT_ALIGNCENTER);
+}
+
+
+int mu_number_ex(mu_Context *ctx, mu_Real *value, mu_Real step,
+  const char *fmt,int opt)
+{
+  char buf[MU_MAX_FMT + 1];
+  int res = 0;
+  mu_Id id = mu_get_id(ctx, &value, sizeof(value));
+  mu_Rect base = mu_layout_next(ctx);
+  mu_Real last = *value;
+
+  /* handle text input mode */
+  if (number_textbox(ctx, value, base, id)) { return res; }
+
+  /* handle normal mode */
+  mu_update_control(ctx, id, base, opt);
+
+  /* handle input */
+  if (ctx->focus == id && ctx->mouse_down == MU_MOUSE_LEFT) {
+    *value += ctx->mouse_delta.x * step;
+  }
+  /* set flag if value changed */
+  if (*value != last) { res |= MU_RES_CHANGE; }
+
+  /* draw base */
+  mu_draw_control_frame(ctx, id, base, MU_COLOR_BASE, opt);
+  /* draw text  */
+  sprintf(buf, fmt, *value);
+  mu_draw_control_text(ctx, buf, base, MU_COLOR_TEXT, opt);
+
+  return res;
+}
+
+
+int mu_number(mu_Context *ctx, mu_Real *value, mu_Real step) {
+  return mu_number_ex(ctx, value, step, "%.03f", MU_OPT_ALIGNCENTER);
+}
+
+
+static int header(mu_Context *ctx, int *state, const char *label,
+  int istreenode)
+{
+  mu_Rect r;
+  mu_Id id;
+  int width = -1;
+  mu_layout_row(ctx, 1, &width, 0);
+  r = mu_layout_next(ctx);
+  id = mu_get_id(ctx, &state, sizeof(state));
+  mu_update_control(ctx, id, r, 0);
+  /* handle click */
+  if (ctx->mouse_pressed == MU_MOUSE_LEFT && ctx->focus == id) {
+    *state = !(*state);
+  }
+  /* draw */
+  if (istreenode) {
+    if (ctx->hover == id) { ctx->draw_frame(ctx, r, MU_COLOR_BUTTONHOVER); }
+  } else {
+    mu_draw_control_frame(ctx, id, r, MU_COLOR_BUTTON, 0);
+  }
+  mu_draw_icon(
+    ctx, *state ? MU_ICON_EXPANDED : MU_ICON_COLLAPSED,
+    mu_rect(r.x, r.y, r.h, r.h), ctx->style->colors[MU_COLOR_TEXT]);
+  r.x += r.h - ctx->style->padding;
+  r.w -= r.h - ctx->style->padding;
+  mu_draw_control_text(ctx, label, r, MU_COLOR_TEXT, 0);
+  return *state ? MU_RES_ACTIVE : 0;
+}
+
+
+int mu_header(mu_Context *ctx, int *state, const char *label) {
+  return header(ctx, state, label, 0);
+}
+
+
+int mu_begin_treenode(mu_Context *ctx, int *state, const char *label) {
+  int res = header(ctx, state, label, 1);
+  if (res & MU_RES_ACTIVE) {
+    get_layout(ctx)->indent += ctx->style->indent;
+    mu_push_id(ctx, &state, sizeof(void*));
+  }
+  return res;
+}
+
+
+void mu_end_treenode(mu_Context *ctx) {
+  get_layout(ctx)->indent -= ctx->style->indent;
+  mu_pop_id(ctx);
+}
+
+
+#define scrollbar(ctx, cnt, b, x, y, w, h)                                  \
+  do {                                                                      \
+    /* only add scrollbar if content size is larger than body */            \
+    mu_Vec2 cs = cnt->content_size;                                         \
+    int maxscroll = cs.y - b.h;                                             \
+                                                                            \
+    if (maxscroll > 0 && b.h > 0) {                                         \
+      mu_Rect base, thumb;                                                  \
+      mu_Id id;                                                             \
+                                                                            \
+      /* get sizing / positioning */                                        \
+      base = b;                                                             \
+      base.x = b.x + b.w + ctx->style->padding;                             \
+      base.w = ctx->style->scrollbar_size;                                  \
+                                                                            \
+      /* handle input */                                                    \
+      id = mu_get_id(ctx, "!scrollbar" #y, 11);                             \
+      mu_update_control(ctx, id, base, 0);                                  \
+      if (ctx->focus == id && ctx->mouse_down == MU_MOUSE_LEFT) {           \
+        cnt->scroll.y += ctx->mouse_delta.y * cs.y / base.h;                \
+      }                                                                     \
+      /* clamp scroll to limits */                                          \
+      cnt->scroll.y = mu_clamp(cnt->scroll.y, 0, maxscroll);                \
+                                                                            \
+      /* draw base and thumb */                                             \
+      ctx->draw_frame(ctx, base, MU_COLOR_SCROLLBASE);                      \
+      thumb = base;                                                         \
+      thumb.h = mu_max(16, base.h * b.h / cs.y);                            \
+      thumb.y += cnt->scroll.y * (base.h - thumb.h) / maxscroll;            \
+      ctx->draw_frame(ctx, thumb, MU_COLOR_SCROLLTHUMB);                    \
+                                                                            \
+      /* set this as the scroll_target (will get scrolled on mousewheel) */ \
+      /* if the mouse is over it */                                         \
+      if (mu_mouse_over(ctx, b)) { ctx->scroll_target = cnt; }              \
+    } else {                                                                \
+      cnt->scroll.y = 0;                                                    \
+    }                                                                       \
+  } while (0)
+
+
+static void scrollbars(mu_Context *ctx, mu_Container *cnt) {
+  /* resize body to make room for scrollbars */
+  mu_Rect b = cnt->body;
+  int sz = ctx->style->scrollbar_size + ctx->style->padding;
+  if (cnt->content_size.y > mu_max(b.h, cnt->last_body.h)) { b.w -= sz; }
+  if (cnt->content_size.x > mu_max(b.w, cnt->last_body.w)) { b.h -= sz; }
+  /* to create a horizontal or vertical scrollbar almost-identical code is
+  ** used; only the references to `x|y` `w|h` need to be switched */
+  mu_push_clip_rect(ctx, cnt->body);
+  scrollbar(ctx, cnt, b, x, y, w, h);
+  scrollbar(ctx, cnt, b, y, x, h, w);
+  mu_pop_clip_rect(ctx);
+  /* set new body */
+  cnt->body = b;
+}
+
+
+static void begin_root_container(mu_Context *ctx, mu_Container *cnt) {
+  push_container(ctx, cnt);
+
+  /* push container to roots list and push head command */
+  push(ctx->root_list, cnt);
+  cnt->head = push_jump(ctx, NULL);
+
+  /* set as hover root if the mouse is overlapping this container and it has a
+  ** higher zindex than the current hover root */
+  if (rect_overlaps_vec2(cnt->rect, ctx->mouse_pos) &&
+      (!ctx->hover_root || cnt->zindex > ctx->hover_root->zindex))
+  {
+    ctx->hover_root = cnt;
+  }
+  /* clipping is set directly here in case a root-container is made within
+  ** another root-containers's begin/end block; this prevents the inner
+  ** root-container being clipped to the outer */
+  push(ctx->clip_stack, unclipped_rect);
+}
+
+
+static void end_root_container(mu_Context *ctx) {
+  /* push tail 'goto' jump command and set head 'skip' command. the final steps
+  ** on initing these are done in mu_end() */
+  mu_Container *cnt = mu_get_container(ctx);
+  cnt->tail = push_jump(ctx, NULL);
+  cnt->head->jump.dst = ctx->command_list.items + ctx->command_list.idx;
+  /* pop base clip rect and container */
+  mu_pop_clip_rect(ctx);
+  pop_container(ctx);
+}
+
+
+int mu_begin_window_ex(mu_Context *ctx, mu_Container *cnt, const char *title,
+  int opt)
+{
+  mu_Rect rect, titlerect;
+
+  if (!cnt->inited) { mu_init_window(ctx, cnt, opt); }
+  if (!cnt->open) { return 0; }
+
+  begin_root_container(ctx, cnt);
+
+  /* draw frame */
+  if (~opt & MU_OPT_NOFRAME) {
+    ctx->draw_frame(ctx, cnt->rect, MU_COLOR_WINDOWBG);
+  }
+
+  /* do title bar */
+  rect = cnt->rect;
+  titlerect = rect;
+  titlerect.h = ctx->style->title_height;
+  if (~opt & MU_OPT_NOTITLE) {
+    ctx->draw_frame(ctx, titlerect, MU_COLOR_TITLEBG);
+
+    /* do title text */
+    if (~opt & MU_OPT_NOTITLE) {
+      mu_Id id = mu_get_id(ctx, "!title", 6);
+      mu_update_control(ctx, id, titlerect, opt);
+      mu_draw_control_text(ctx, title, titlerect, MU_COLOR_TITLETEXT, 0);
+      if (id == ctx->focus && ctx->mouse_down == MU_MOUSE_LEFT) {
+        cnt->rect.x += ctx->mouse_delta.x;
+        cnt->rect.y += ctx->mouse_delta.y;
+      }
+      cnt->body.y += titlerect.h;
+      cnt->body.h -= titlerect.h;
+    }
+
+    /* do `close` button */
+    if (~opt & MU_OPT_NOCLOSE) {
+      mu_Id id = mu_get_id(ctx, "!close", 6);
+      mu_Rect r = mu_rect(
+        titlerect.x + titlerect.w - titlerect.h,
+        titlerect.y, titlerect.h, titlerect.h);
+      titlerect.w -= r.w;
+      mu_draw_icon(ctx, MU_ICON_CLOSE, r, ctx->style->colors[MU_COLOR_TITLETEXT]);
+      mu_update_control(ctx, id, r, opt);
+      if (ctx->mouse_pressed == MU_MOUSE_LEFT && id == ctx->focus) {
+        cnt->open = 0;
+      }
+    }
+  }
+
+  /* do `resize` notch */
+  if (~opt & MU_OPT_NORESIZE) {
+    int sz = ctx->style->footer_height;
+    mu_Id id = mu_get_id(ctx, "!resize", 7);
+    mu_Rect r = mu_rect(rect.x + rect.w - sz, rect.y + rect.h - sz, sz, sz);
+    mu_update_control(ctx, id, r, opt);
+    mu_draw_icon(ctx, MU_ICON_RESIZE, r, ctx->style->colors[MU_COLOR_TEXT]);
+    if (id == ctx->focus && ctx->mouse_down == MU_MOUSE_LEFT) {
+      cnt->rect.w += ctx->mouse_delta.x;
+      cnt->rect.h += ctx->mouse_delta.y;
+      cnt->rect.w = mu_max(96, cnt->rect.w);
+      cnt->rect.h = mu_max(64, cnt->rect.h);
+    }
+    cnt->body.h -= sz;
+  }
+
+  /* do scrollbars and init clipping */
+  if (~opt & MU_OPT_NOSCROLL) { scrollbars(ctx, cnt); }
+  mu_push_clip_rect(ctx, cnt->body);
+
+  /* resize to content size */
+  if (opt & MU_OPT_AUTOSIZE) {
+    cnt->rect.w = cnt->content_size.x + (cnt->rect.w - cnt->body.w);
+    cnt->rect.h = cnt->content_size.y + (cnt->rect.h - cnt->body.h);
+  }
+
+  /* close if this is a popup window and elsewhere was clicked */
+  if ((opt & MU_OPT_POPUP) && ctx->mouse_pressed &&
+      ctx->last_hover_root != cnt)
+  {
+    cnt->open = 0;
+  }
+
+  push_layout(ctx, cnt->body, cnt->scroll);
+  return MU_RES_ACTIVE;
+}
+
+
+int mu_begin_window(mu_Context *ctx, mu_Container *cnt, const char *title) {
+  return mu_begin_window_ex(ctx, cnt, title, 0);
+}
+
+
+void mu_end_window(mu_Context *ctx) {
+  mu_pop_clip_rect(ctx);
+  end_root_container(ctx);
+}
+
+
+void mu_open_popup(mu_Context *ctx, mu_Container *cnt) {
+  /* set as hover root so popup isn't closed in begin_window_ex()  */
+  ctx->last_hover_root = ctx->hover_root = cnt;
+  /* init container if not inited */
+  if (!cnt->inited) { mu_init_window(ctx, cnt, 0); }
+  /* position at mouse cursor, open and bring-to-front */
+  cnt->rect = mu_rect(ctx->mouse_pos.x, ctx->mouse_pos.y, 0, 0);
+  cnt->open = 1;
+  mu_bring_to_front(ctx, cnt);
+}
+
+
+int mu_begin_popup(mu_Context *ctx, mu_Container *cnt) {
+  int opt = MU_OPT_POPUP | MU_OPT_AUTOSIZE | MU_OPT_NORESIZE |
+            MU_OPT_NOSCROLL | MU_OPT_NOTITLE | MU_OPT_CLOSED;
+  return mu_begin_window_ex(ctx, cnt, "", opt);
+}
+
+
+void mu_end_popup(mu_Context *ctx) {
+  mu_end_window(ctx);
+}
+
+
+void mu_begin_panel_ex(mu_Context *ctx, mu_Container *cnt, int opt) {
+  cnt->rect = mu_layout_next(ctx);
+  if (~opt & MU_OPT_NOFRAME) {
+    ctx->draw_frame(ctx, cnt->rect, MU_COLOR_PANELBG);
+  }
+  push_container(ctx, cnt);
+  if (~opt & MU_OPT_NOSCROLL) { scrollbars(ctx, cnt); }
+  mu_push_clip_rect(ctx, cnt->body);
+  push_layout(ctx, cnt->body, cnt->scroll);
+}
+
+
+void mu_begin_panel(mu_Context *ctx, mu_Container *cnt) {
+  mu_begin_panel_ex(ctx, cnt, 0);
+}
+
+
+void mu_end_panel(mu_Context *ctx) {
+  mu_pop_clip_rect(ctx);
+  pop_container(ctx);
+}
--- /dev/null
+++ b/src/microui.h
@@ -1,0 +1,292 @@
+/*
+** Copyright (c) 2018 rxi
+**
+** This library is free software; you can redistribute it and/or modify it
+** under the terms of the MIT license. See `microui.c` for details.
+*/
+
+#ifndef MICROUI_H
+#define MICROUI_H
+
+#include <stdlib.h>
+
+#define MU_VERSION "1.0"
+
+#define MU_COMMANDLIST_SIZE     (1024 * 256)
+#define MU_ROOTLIST_SIZE        32
+#define MU_CONTAINERSTACK_SIZE  32
+#define MU_CLIPSTACK_SIZE       32
+#define MU_IDSTACK_SIZE         32
+#define MU_LAYOUTSTACK_SIZE     16
+#define MU_MAX_WIDTHS           16
+#define MU_REAL                 float
+#define MU_REAL_FMT             "%.3g"
+#define MU_SLIDER_FMT           "%.02f"
+#define MU_MAX_FMT              127
+
+#define mu_stack(T, n)          struct { int idx; T items[n]; }
+#define mu_min(a, b)            ((a) < (b) ? (a) : (b))
+#define mu_max(a, b)            ((a) > (b) ? (a) : (b))
+#define mu_clamp(x, a, b)       mu_min(b, mu_max(a, x))
+
+enum {
+  MU_CLIP_NONE,
+  MU_CLIP_PART,
+  MU_CLIP_ALL
+};
+
+enum {
+  MU_COMMAND_JUMP = 1,
+  MU_COMMAND_CLIP,
+  MU_COMMAND_RECT,
+  MU_COMMAND_TEXT,
+  MU_COMMAND_ICON,
+  MU_COMMAND_MAX
+};
+
+enum {
+  MU_COLOR_TEXT,
+  MU_COLOR_BORDER,
+  MU_COLOR_WINDOWBG,
+  MU_COLOR_TITLEBG,
+  MU_COLOR_TITLETEXT,
+  MU_COLOR_PANELBG,
+  MU_COLOR_BUTTON,
+  MU_COLOR_BUTTONHOVER,
+  MU_COLOR_BUTTONFOCUS,
+  MU_COLOR_BASE,
+  MU_COLOR_BASEHOVER,
+  MU_COLOR_BASEFOCUS,
+  MU_COLOR_SCROLLBASE,
+  MU_COLOR_SCROLLTHUMB,
+  MU_COLOR_MAX
+};
+
+enum {
+  MU_ICON_CLOSE = 1,
+  MU_ICON_RESIZE,
+  MU_ICON_CHECK,
+  MU_ICON_COLLAPSED,
+  MU_ICON_EXPANDED,
+  MU_ICON_MAX
+};
+
+enum {
+  MU_RES_ACTIVE       = (1 << 0),
+  MU_RES_SUBMIT       = (1 << 1),
+  MU_RES_CHANGE       = (1 << 2)
+};
+
+enum {
+  MU_OPT_ALIGNCENTER  = (1 << 0),
+  MU_OPT_ALIGNRIGHT   = (1 << 1),
+  MU_OPT_NOINTERACT   = (1 << 2),
+  MU_OPT_NOFRAME      = (1 << 3),
+  MU_OPT_NORESIZE     = (1 << 4),
+  MU_OPT_NOSCROLL     = (1 << 5),
+  MU_OPT_NOCLOSE      = (1 << 6),
+  MU_OPT_NOTITLE      = (1 << 7),
+  MU_OPT_HOLDFOCUS    = (1 << 8),
+  MU_OPT_AUTOSIZE     = (1 << 9),
+  MU_OPT_POPUP        = (1 << 10),
+  MU_OPT_CLOSED       = (1 << 11)
+};
+
+enum {
+  MU_MOUSE_LEFT       = (1 << 0),
+  MU_MOUSE_RIGHT      = (1 << 1),
+  MU_MOUSE_MIDDLE     = (1 << 2)
+};
+
+enum {
+  MU_KEY_SHIFT        = (1 << 0),
+  MU_KEY_CTRL         = (1 << 1),
+  MU_KEY_ALT          = (1 << 2),
+  MU_KEY_BACKSPACE    = (1 << 3),
+  MU_KEY_RETURN       = (1 << 4)
+};
+
+
+typedef struct mu_Context mu_Context;
+typedef unsigned mu_Id;
+typedef MU_REAL mu_Real;
+typedef void* mu_Font;
+
+typedef struct { int x, y; } mu_Vec2;
+typedef struct { int x, y, w, h; } mu_Rect;
+typedef struct { unsigned char r, g, b, a; } mu_Color;
+
+typedef struct { int type, size; } mu_BaseCommand;
+typedef struct { mu_BaseCommand base; void *dst; } mu_JumpCommand;
+typedef struct { mu_BaseCommand base; mu_Rect rect; } mu_ClipCommand;
+typedef struct { mu_BaseCommand base; mu_Rect rect; mu_Color color; } mu_RectCommand;
+typedef struct { mu_BaseCommand base; mu_Font font; mu_Vec2 pos; mu_Color color; char str[1]; } mu_TextCommand;
+typedef struct { mu_BaseCommand base; mu_Rect rect; int id; mu_Color color; } mu_IconCommand;
+
+typedef union {
+  int type;
+  mu_BaseCommand base;
+  mu_JumpCommand jump;
+  mu_ClipCommand clip;
+  mu_RectCommand rect;
+  mu_TextCommand text;
+  mu_IconCommand icon;
+} mu_Command;
+
+
+typedef struct {
+  mu_Rect body;
+  mu_Rect next;
+  mu_Vec2 position;
+  mu_Vec2 size;
+  mu_Vec2 max;
+  int widths[MU_MAX_WIDTHS];
+  int items;
+  int row_index;
+  int next_row;
+  int next_type;
+  int indent;
+} mu_Layout;
+
+
+typedef struct {
+  mu_Command *head, *tail;
+  mu_Rect rect;
+  mu_Rect last_body;
+  mu_Rect body;
+  mu_Vec2 content_size;
+  mu_Vec2 scroll;
+  int inited;
+  int zindex;
+  int open;
+} mu_Container;
+
+
+typedef struct {
+  mu_Font font;
+  mu_Vec2 size;
+  int padding;
+  int spacing;
+  int indent;
+  int title_height;
+  int footer_height;
+  int scrollbar_size;
+  int thumb_size;
+  mu_Color colors[MU_COLOR_MAX];
+} mu_Style;
+
+
+struct mu_Context {
+  /* callbacks */
+  int (*text_width)(mu_Font font, const char *str, int len);
+  int (*text_height)(mu_Font font);
+  void (*draw_frame)(mu_Context *ctx, mu_Rect rect, int colorid);
+  /* core state */
+  mu_Style _style;
+  mu_Style *style;
+  mu_Id hover;
+  mu_Id focus;
+  mu_Id last_id;
+  mu_Rect last_rect;
+  int last_zindex;
+  int updated_focus;
+  mu_Container *hover_root;
+  mu_Container *last_hover_root;
+  mu_Container *scroll_target;
+  char number_buf[MU_MAX_FMT];
+  mu_Id number_editing;
+  /* stacks */
+  mu_stack(char, MU_COMMANDLIST_SIZE) command_list;
+  mu_stack(mu_Container*, MU_ROOTLIST_SIZE) root_list;
+  mu_stack(mu_Container*, MU_CONTAINERSTACK_SIZE) container_stack;
+  mu_stack(mu_Rect, MU_CLIPSTACK_SIZE) clip_stack;
+  mu_stack(mu_Id, MU_IDSTACK_SIZE) id_stack;
+  mu_stack(mu_Layout, MU_LAYOUTSTACK_SIZE) layout_stack;
+  /* input state */
+  mu_Vec2 mouse_pos;
+  mu_Vec2 last_mouse_pos;
+  mu_Vec2 mouse_delta;
+  int mouse_wheel;
+  int mouse_down;
+  int mouse_pressed;
+  int key_down;
+  int key_pressed;
+  char text_input[32];
+};
+
+
+mu_Vec2 mu_vec2(int x, int y);
+mu_Rect mu_rect(int x, int y, int w, int h);
+mu_Color mu_color(int r, int g, int b, int a);
+
+void mu_init(mu_Context *ctx);
+void mu_begin(mu_Context *ctx);
+void mu_end(mu_Context *ctx);
+void mu_set_focus(mu_Context *ctx, mu_Id id);
+mu_Id mu_get_id(mu_Context *ctx, const void *data, int size);
+void mu_push_id(mu_Context *ctx, const void *data, int size);
+void mu_pop_id(mu_Context *ctx);
+void mu_push_clip_rect(mu_Context *ctx, mu_Rect rect);
+void mu_pop_clip_rect(mu_Context *ctx);
+mu_Rect mu_get_clip_rect(mu_Context *ctx);
+int mu_check_clip(mu_Context *ctx, mu_Rect r);
+mu_Container* mu_get_container(mu_Context *ctx);
+void mu_init_window(mu_Context *ctx, mu_Container *cnt, int opt);
+void mu_bring_to_front(mu_Context *ctx, mu_Container *cnt);
+
+void mu_input_mousemove(mu_Context *ctx, int x, int y);
+void mu_input_mousedown(mu_Context *ctx, int x, int y, int btn);
+void mu_input_mouseup(mu_Context *ctx, int x, int y, int btn);
+void mu_input_mousewheel(mu_Context *ctx, int y);
+void mu_input_keydown(mu_Context *ctx, int key);
+void mu_input_keyup(mu_Context *ctx, int key);
+void mu_input_text(mu_Context *ctx, const char *text);
+
+mu_Command* mu_push_command(mu_Context *ctx, int type, int size);
+int mu_next_command(mu_Context *ctx, mu_Command **cmd);
+void mu_set_clip(mu_Context *ctx, mu_Rect rect);
+void mu_draw_rect(mu_Context *ctx, mu_Rect rect, mu_Color color);
+void mu_draw_box(mu_Context *ctx, mu_Rect rect, mu_Color color);
+void mu_draw_text(mu_Context *ctx, mu_Font font, const char *str, int len, mu_Vec2 pos, mu_Color color);
+void mu_draw_icon(mu_Context *ctx, int id, mu_Rect rect, mu_Color color);
+
+void mu_layout_row(mu_Context *ctx, int items, const int *widths, int height);
+void mu_layout_width(mu_Context *ctx, int width);
+void mu_layout_height(mu_Context *ctx, int height);
+void mu_layout_begin_column(mu_Context *ctx);
+void mu_layout_end_column(mu_Context *ctx);
+void mu_layout_set_next(mu_Context *ctx, mu_Rect r, int relative);
+mu_Rect mu_layout_next(mu_Context *ctx);
+
+void mu_draw_control_frame(mu_Context *ctx, mu_Id id, mu_Rect rect, int colorid, int opt);
+void mu_draw_control_text(mu_Context *ctx, const char *str, mu_Rect rect, int colorid, int opt);
+int mu_mouse_over(mu_Context *ctx, mu_Rect rect);
+void mu_update_control(mu_Context *ctx, mu_Id id, mu_Rect rect, int opt);
+void mu_draw_frame(mu_Context *ctx, mu_Rect rect, int colorid);
+
+void mu_text(mu_Context *ctx, const char *text);
+void mu_label(mu_Context *ctx, const char *text);
+int mu_button_ex(mu_Context *ctx, const char *label, int icon, int opt);
+int mu_button(mu_Context *ctx, const char *label);
+int mu_checkbox(mu_Context *ctx, int *state, const char *label);
+int mu_textbox_raw(mu_Context *ctx, char *buf, int bufsz, mu_Id id, mu_Rect r, int opt);
+int mu_textbox_ex(mu_Context *ctx, char *buf, int bufsz, int opt);
+int mu_textbox(mu_Context *ctx, char *buf, int bufsz);
+int mu_slider_ex(mu_Context *ctx, mu_Real *value, mu_Real low, mu_Real high, mu_Real step, const char *fmt, int opt);
+int mu_slider(mu_Context *ctx, mu_Real *value, mu_Real low, mu_Real high);
+int mu_number_ex(mu_Context *ctx, mu_Real *value, mu_Real step, const char *fmt, int opt);
+int mu_number(mu_Context *ctx, mu_Real *value, mu_Real step);
+int mu_header(mu_Context *ctx, int *state, const char *label);
+int mu_begin_treenode(mu_Context *ctx, int *state, const char *label);
+void mu_end_treenode(mu_Context *ctx);
+int mu_begin_window_ex(mu_Context *ctx, mu_Container *cnt, const char *title, int opt);
+int mu_begin_window(mu_Context *ctx, mu_Container *cnt, const char *title);
+void mu_end_window(mu_Context *ctx);
+void mu_open_popup(mu_Context *ctx, mu_Container *cnt);
+int mu_begin_popup(mu_Context *ctx, mu_Container *cnt);
+void mu_end_popup(mu_Context *ctx);
+void mu_begin_panel_ex(mu_Context *ctx, mu_Container *cnt, int opt);
+void mu_begin_panel(mu_Context *ctx, mu_Container *cnt);
+void mu_end_panel(mu_Context *ctx);
+
+#endif