[
  {
    "path": ".gitattributes",
    "content": "# Auto detect text files and perform LF normalization\n* text=auto\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "content": "# This is a basic workflow to help you get started with Actions\n\nname: M5EzBuild\n\n# Triggers the workflow on push or pull request\non:\n  push: # see: https://help.github.com/en/actions/reference/events-that-trigger-workflows#pull-request-event-pull_request\n    paths:\n    - '**.ino'\n    - '**.cpp'\n    - '**.h'\n    - '**main.yml'\n  pull_request:    \n# A workflow run is made up of one or more jobs that can run sequentially or in parallel\njobs:\n  build:\n    name: Test compiling examples\n    runs-on: ubuntu-latest\n\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v2\n      \n    - name: Compile all examples\n      uses: ArminJo/arduino-test-compile@v2\n      with:\n        arduino-board-fqbn: esp32:esp32:m5stack-core-esp32  \n        platform-url: https://dl.espressif.com/dl/package_esp32_index.json\n        required-libraries: ezTime,M5Stack\n        sketch-names-find-start: examples\n        sketches-exclude: z-sysInfo\n"
  },
  {
    "path": ".gitignore",
    "content": "\n.development\n"
  },
  {
    "path": "LICENSE",
    "content": "GNU LESSER GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\n  This version of the GNU Lesser General Public License incorporates\nthe terms and conditions of version 3 of the GNU General Public\nLicense, supplemented by the additional permissions listed below.\n\n  0. Additional Definitions.\n\n  As used herein, \"this License\" refers to version 3 of the GNU Lesser\nGeneral Public License, and the \"GNU GPL\" refers to version 3 of the GNU\nGeneral Public License.\n\n  \"The Library\" refers to a covered work governed by this License,\nother than an Application or a Combined Work as defined below.\n\n  An \"Application\" is any work that makes use of an interface provided\nby the Library, but which is not otherwise based on the Library.\nDefining a subclass of a class defined by the Library is deemed a mode\nof using an interface provided by the Library.\n\n  A \"Combined Work\" is a work produced by combining or linking an\nApplication with the Library.  The particular version of the Library\nwith which the Combined Work was made is also called the \"Linked\nVersion\".\n\n  The \"Minimal Corresponding Source\" for a Combined Work means the\nCorresponding Source for the Combined Work, excluding any source code\nfor portions of the Combined Work that, considered in isolation, are\nbased on the Application, and not on the Linked Version.\n\n  The \"Corresponding Application Code\" for a Combined Work means the\nobject code and/or source code for the Application, including any data\nand utility programs needed for reproducing the Combined Work from the\nApplication, but excluding the System Libraries of the Combined Work.\n\n  1. Exception to Section 3 of the GNU GPL.\n\n  You may convey a covered work under sections 3 and 4 of this License\nwithout being bound by section 3 of the GNU GPL.\n\n  2. Conveying Modified Versions.\n\n  If you modify a copy of the Library, and, in your modifications, a\nfacility refers to a function or data to be supplied by an Application\nthat uses the facility (other than as an argument passed when the\nfacility is invoked), then you may convey a copy of the modified\nversion:\n\n   a) under this License, provided that you make a good faith effort to\n   ensure that, in the event an Application does not supply the\n   function or data, the facility still operates, and performs\n   whatever part of its purpose remains meaningful, or\n\n   b) under the GNU GPL, with none of the additional permissions of\n   this License applicable to that copy.\n\n  3. Object Code Incorporating Material from Library Header Files.\n\n  The object code form of an Application may incorporate material from\na header file that is part of the Library.  You may convey such object\ncode under terms of your choice, provided that, if the incorporated\nmaterial is not limited to numerical parameters, data structure\nlayouts and accessors, or small macros, inline functions and templates\n(ten or fewer lines in length), you do both of the following:\n\n   a) Give prominent notice with each copy of the object code that the\n   Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the object code with a copy of the GNU GPL and this license\n   document.\n\n  4. Combined Works.\n\n  You may convey a Combined Work under terms of your choice that,\ntaken together, effectively do not restrict modification of the\nportions of the Library contained in the Combined Work and reverse\nengineering for debugging such modifications, if you also do each of\nthe following:\n\n   a) Give prominent notice with each copy of the Combined Work that\n   the Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the Combined Work with a copy of the GNU GPL and this license\n   document.\n\n   c) For a Combined Work that displays copyright notices during\n   execution, include the copyright notice for the Library among\n   these notices, as well as a reference directing the user to the\n   copies of the GNU GPL and this license document.\n\n   d) Do one of the following:\n\n       0) Convey the Minimal Corresponding Source under the terms of this\n       License, and the Corresponding Application Code in a form\n       suitable for, and under terms that permit, the user to\n       recombine or relink the Application with a modified version of\n       the Linked Version to produce a modified Combined Work, in the\n       manner specified by section 6 of the GNU GPL for conveying\n       Corresponding Source.\n\n       1) Use a suitable shared library mechanism for linking with the\n       Library.  A suitable mechanism is one that (a) uses at run time\n       a copy of the Library already present on the user's computer\n       system, and (b) will operate properly with a modified version\n       of the Library that is interface-compatible with the Linked\n       Version.\n\n   e) Provide Installation Information, but only if you would otherwise\n   be required to provide such information under section 6 of the\n   GNU GPL, and only to the extent that such information is\n   necessary to install and execute a modified version of the\n   Combined Work produced by recombining or relinking the\n   Application with a modified version of the Linked Version. (If\n   you use option 4d0, the Installation Information must accompany\n   the Minimal Corresponding Source and Corresponding Application\n   Code. If you use option 4d1, you must provide the Installation\n   Information in the manner specified by section 6 of the GNU GPL\n   for conveying Corresponding Source.)\n\n  5. Combined Libraries.\n\n  You may place library facilities that are a work based on the\nLibrary side by side in a single library together with other library\nfacilities that are not Applications and are not covered by this\nLicense, and convey such a combined library under terms of your\nchoice, if you do both of the following:\n\n   a) Accompany the combined library with a copy of the same work based\n   on the Library, uncombined with any other library facilities,\n   conveyed under the terms of this License.\n\n   b) Give prominent notice with the combined library that part of it\n   is a work based on the Library, and explaining where to find the\n   accompanying uncombined form of the same work.\n\n  6. Revised Versions of the GNU Lesser General Public License.\n\n  The Free Software Foundation may publish revised and/or new versions\nof the GNU Lesser General Public License from time to time. Such new\nversions will be similar in spirit to the present version, but may\ndiffer in detail to address new problems or concerns.\n\n  Each version is given a distinguishing version number. If the\nLibrary as you received it specifies that a certain numbered version\nof the GNU Lesser General Public License \"or any later version\"\napplies to it, you have the option of following the terms and\nconditions either of that published version or of any later version\npublished by the Free Software Foundation. If the Library as you\nreceived it does not specify a version number of the GNU Lesser\nGeneral Public License, you may choose any version of the GNU Lesser\nGeneral Public License ever published by the Free Software Foundation.\n\n  If the Library as you received it specifies that a proxy can decide\nwhether future versions of the GNU Lesser General Public License shall\napply, that proxy's public statement of acceptance of any version is\npermanent authorization for you to choose that version for the\nLibrary."
  },
  {
    "path": "README.md",
    "content": "# `M5ez` The easy way to program on the M5Stack\n\n>*M5ez (pronounced \"M5 easy\") is a complete interface builder library for the M5Stack ESP32 system. It allows even novice programmers to create good looking interfaces. It comes with menus as text or as images, message boxes, very flexible button setup (including different length presses and multi-button functions), 3-button text input (you have to see it to believe it) and built-in Wifi support. Now you can concentrate on what your program does, and let M5ez worry about everything else.*\n\n![M5EzBuild](https://github.com/M5ez/M5ez/workflows/M5EzBuild/badge.svg?branch=master)\n\n*written by Rop Gonggrijp, with help and contributions from many others*\n\n[![](images/M5ez.png)](https://youtu.be/132gvdlwKZw)\n\n## Introduction\n\nThe M5Stack is a small computer that is a tinkerer's dream. It is based on Espressif's ESP32 chip (with WiFi and Bluetooth), it has a 320x240 pixel color screen, three buttons, a speaker, an SD slot and it allows you to stack boards below it, each in their own plastic enclosure. The makers sell boards for GSM, GPS and LoRa (LOng RAnge radio) as well as a motor controller board and an empty experimenter board. The Chinese operation that makes them appears to sell a lot of them and I could get mine off of Amazon in a week. If you like to build things that you can hold in your hand and not just write code for yet another naked-looking board plugged into your USB port, this thing is your friend.\n\nOn the software side, the easiest way to program these is using the Arduino IDE. M5Stack provides a library which, when you include it, creates an m5 object instance that allows access to the various hardware components in the device. For instance: the display driver is accessible through commands all starting with `m5.lcd.`.\n\nMaking something that looks good and allows users to interact with it is not simple though: you have to program everything yourself. If you try to make something a little more complex, you quickly get bogged down in figuring out where things go on the display, what state your interface is in, etc etc.\n\nIn the budding M5Stack community, there have been some initiatives to make it easier to create user interfaces. Most notably a M5Stack forum user named Calin make something called \"M5Stack MultiApp\" which allows more easy integration of multiple existing programs into one app. His work serves as an inspiration for my work. But as much as you could have multiple programs have a common user interface, creating the programs still was nowhere near simple enough.\n\nEnter M5ez, our contribution to making programming on the M5Stack *a lot* easier. We hope you'll enjoy programming with this.\n\n### Other products by M5\n\nM5 is not only making the M5stack anymore. There's now an M5Stick that is an even smaller ESP32 system with a smaller screen, there's the M5 Atom which has no screen and just LEDs, and soon there will be an M5stack Core2 which has a capacitive touch screen. We plan to support some of these devices, the stick support will be rolled out soon.\n\n### Alternatives\n\n#### UiFlow\n\nSince writing M5ez, there has been another interface toolkit for the M5Stack, called UiFlow. It uses a web-and-cloud-based IDE that can be seen as \"blocky\" symbols or as python and creates micropython code. UiFlow supports a lot of the hardware sold in conjunction with the M5Stack and is very much geared towards learning and education.\n\nThat said, building the functionality that comes \"packaged\" with M5ez would take quite a bit of work with UiFlow. If you have existing things that run on Arduino, like programming in C and/or with the Arduino IDE, then M5ez might be the better choice. Also it is generally easier to create consistent and visually pleasing interfaces in M5ez, and complex things can take surprisingly little work.\n\n&nbsp;\n\n## Getting started\n\nM5ez is an Arduino library. To start using it with the Arduino IDE:\n\n* Choose Sketch -> Include Library -> Manage Libraries...\n* Type **`M5ez`** into the search box.\n* Click the row to select the library.\n* Click the Install button to install the library.\n* Repeat this process for the **`ezTime`** library\n\nin File -> Examples you will now see an M5ez heading down under \"Examples from custom libraries\"\n\nYou'll have your first application on the screen in no time. You can also start with one of the sketches below in the \"Menus\" section of the documentation. In fact we strongly recommend that you play around with the M5ez demo application, since it is a comprehensive showcase of M5ez's functionality that will give you a good feel for what you can and cannot do with M5ez.\n\n&nbsp;\n\n### If you get `fatal error: ezTime.h: No such file or directory`\n\nNote that it says above that you need to install two libraries: *M5ez* and *ezTime*.\n\n> Alternatively, you can install M5ez without the time library (and without the on-screen clock), by commenting out `#define M5EZ_CLOCK` in file `m5ez.h` in the M5ez library directory.\n\n&nbsp;\n\n## Structure of documentation\n\nYou've now seen the [Introduction](https://github.com/M5ez/M5ez#introduction) and [Getting Started](https://github.com/M5ez/M5ez#getting-started) sections of the manual. Below is the [User Manual](https://github.com/M5ez/M5ez#m5ez-user-manual) which lists all the functions of M5ez in detail. At the end there's a [Table of Contents](https://github.com/M5ez/M5ez#table-of-contents) which may be of help finding something.\n\n### Tech Notes\n\nSeparate from this document, there is a directory [tech_notes](https://github.com/M5ez/M5ez/tree/master/tech_notes) where we keep useful technical notes that may be a bit too obscure or in-depth for a general user manual.\n\n&nbsp;\n\n# M5ez User Manual\n\nM5ez is a complete system for building appliance-grade interfaces for the M5Stack. It comes with a lot of the common functionality built-in that a programmer would otherwise have to create. While it is very easy to create functional programs &mdash; just have a look at the examples that come with the library &mdash; the entire library can be a bit overwhelming because of how much it offers. The following is a reference for programmers that want to get the most out of M5ez. It is certainly not necessary to know or fully understand every function, but at some point you probably want to go through this document very quickly to see what M5ez can do for you.\n\nIf you feel anything is still unclear after reading this document, please file an issue in the repository. I take documentation seriously &mdash; if something is not clear in here, it is as much a bug as something that's wrong with the software itself. Pull requests for typos etc. gladly accepted.\n\n&nbsp;\n\n## How it all works\n\nAs you can see from the examples, the commands that activate M5ez's functionality start with `ez.`. That `ez` refers to an object `ez` that is within the \"root namespace\" of the sketch. Within it are commands like `ez.msgBox`, but also other objects. For instance: commands that deal with the entire screen are prefixed with `ez.screen.`, WiFi commands start with `ez.wifi.` and so forth.\n\nAfter you include the library with `#include <M5ez.h>`, those objects all exist. To get things going you then &mdash; in the `void setup()` part of your sketch &mdash; do `ez.begin()`. This replaces `m5.begin`, which is called from within `ez.begin()`. You still need to `#include <M5Stack.h>` before `#include <M5ez.h>` if you want to use any commands from the m5 library in your sketch.\n\n&nbsp;\n\n## Screen\n\nThe screen object deals with the entire screen, which consists of an optional header at the top, optional buttons at the bottom and an area called \"the canvas\" in between.\n\n`void ez.screen.clear()`\n\n`void ez.screen.clear(uint16_t color)`\n\n`uint16_t ez.screen.background()`\n\nIf you clear the screen, the header and buttons are hidden, the canvas is cleared, and the current background color is set to the color you specify, or to the background color from the current theme (`ez.theme->background`, see the chapter on themes) if you do not specify a color. `ez.screen.background()` will return the currently set background color.\n\nIf you clear the screen, the header and buttons are hidden, so the canvas takes up the entire screen.\n\n&nbsp;\n\n## Header\n\nThe header is the bar at the top of the screen. In the default theme it is 30 pixels high and blue, and it has text in font `&FreeSansBold9pt7b`, but all of that can be changed, either by modifying the values in the current theme on the fly or by creating your own theme.\n\n### Showing, hiding, title\n\n`void ez.header.show(String title = \"\")`\n\n`void ez.header.title(String title = \"\")`\n\n`bool ez.header.shown()`\n\n`void ez.header.clear(bool wipe = true)`\n\n`ez.header.show` will show the header, either with the present title or with a new one provided as an argument. `ez.header.title` will merely change the title, but will not change whether the header is displayed or not. `ez.header.shown()` returns true or false depending on whether the header is currently shown, and `ez.header.clear` removes the header, returning the top of the screen to the canvas. If you set `wipe` to false, it will not draw background pixels there. (This may help prevent flicker or add a bit of performance if you're about to clear the canvas anyway.)\n\n### Your own header widgets\n\nThe clock and WiFi signal strength displayed in the M5ez header are \"widgets\". You can register your own code to display widgets too.\n\n`void ez.header.insert(uint8_t position, String name, uint16_t width, void (*function)(uint16_t x, uint16_t w), bool leftover = false)`\n\n`void ez.header.remove(String name)`\n\n`uint8_t ez.header.position(String name)`\n\n`void ez.header.draw(String name = \"\")`\n\n`ez.header.insert` lets you add your own header widget. The header widget positions start at 0 (the leftmost widget), and `position` specifies t the left of which widget to insert the new one. `name` is just a name you use to refer to your widget. The names `title`, `clock` and `wifi` are reserved for use by M5ez.\n\nExactly one widget can be specified as `leftover`, meaning it gets all the pixels not claimed by any other widgets. By default, this is the widget called \"title\" that holds the header title. All other widgets must have a width in pixels specified.\n\n`function` refers to the name of the function that draws your widget. It must be a function that returns nothing (`void`) and that takes two `uint16_t` arguments: the x position and width of your widget. This function will be called by the header code whenever the header is redrawn. But you can also force a redraw with `ez.header.draw`. For instance: the clock code calls for the `clock` widget to be redrawn every minute, for instance. Note that you would never call your widget draw function directly, because your code doesn't know where all the widgets are within the header. You would only ever call it indirectly using `ez.header.draw(\"your_widget_name\")`, which will then see if the header is currently displayed, and if so lookup x position and width and call your draw function.\n\nYour widget draw function has to make sure to stay inside the lines: not lower than `ez.theme->header_height`, not further left than x, not further right than x + w. If you want to be able to use your widget with multiple themes, your code should probably also respect `ez.theme->header_bgcolor` and `ez.theme->header_fgcolor` to make sure things look pretty.\n\n`ez.header.position` will return the relative position of an existing header widget, starting with 0 for the leftmost widget, adding one for each further widget. This can be quite useful. For instance, if you want to make sure a widget is insert directly to the left of the title, you can specify `ez.header.insert(ez.header.position(\"title\"), ...`. If you specify `(ez.header.position(\"title\") + 1` your new widget gets inserted directly to the right of the title.\n\nAs the name implies, `ez.header.remove` removes the widget with the given name.\n\n&nbsp;\n\n## Canvas\n\nThe \"canvas\" is M5ez's name for the area between the header and buttons. So if there are no header and no buttons, the canvas is the whole screen. Once they are drawn, the canvas becomes smaller.\n\n`void ez.canvas.clear()`\n\nClears the canvas area to the current background color &mdash; either the default from the theme or the one specified in the most recent `ez.screen.clear` command. Sets x and y positions for the the next print command to the top left (respecting the currently set left margin).\n\n`void ez.canvas.reset()`\n\nReset does everything `ez.canvas.clear()` does, but also turns on text wrap, turns off scrolling, sets the print font and color back to the defaults from the theme and sets the left margin to 0.\n\n### Canvas dimensions\n\nBecause the canvas size differs when header or buttons are shown, your code can ask for various locations and dimensions of the canvas as follows:\n\n`uint8_t ez.canvas.top()`\n\n`uint8_t ez.canvas.bottom()`\n\n`uint16_t ez.canvas.left()`\n\n`uint16_t ez.canvas.right()`\n\n`uint8_t ez.canvas.height()`\n\n`uint16_t ez.canvas.width()`\n\n### Printing to the canvas\n\nThe M5ez canvas inherits from the Arduino `Print` object. What that means is that you can use the `print` and `println` functions in just the way you are used to using them. Here's all the different arguments taken by `printf`, `print` and `println`.\n\n```\nsize_t ez.canvas.printf(const char * format, ...)  __attribute__ ((format (printf, 2, 3)));\nsize_t ez.canvas.print(const __FlashStringHelper *);\nsize_t ez.canvas.print(const String &);\nsize_t ez.canvas.print(const char[]);\nsize_t ez.canvas.print(char);\nsize_t ez.canvas.print(unsigned char, int = DEC);\nsize_t ez.canvas.print(int, int = DEC);\nsize_t ez.canvas.print(unsigned int, int = DEC);\nsize_t ez.canvas.print(long, int = DEC);\nsize_t ez.canvas.print(unsigned long, int = DEC);\nsize_t ez.canvas.print(double, int = 2);\nsize_t ez.canvas.print(const Printable&);\nsize_t ez.canvas.print(struct tm * timeinfo, const char * format = NULL);\n\nsize_t ez.canvas.println(const __FlashStringHelper *);\nsize_t ez.canvas.println(const String &s);\nsize_t ez.canvas.println(const char[]);\nsize_t ez.canvas.println(char);\nsize_t ez.canvas.println(unsigned char, int = DEC);\nsize_t ez.canvas.println(int, int = DEC);\nsize_t ez.canvas.println(unsigned int, int = DEC);\nsize_t ez.canvas.println(long, int = DEC);\nsize_t ez.canvas.println(unsigned long, int = DEC);\nsize_t ez.canvas.println(double, int = 2);\nsize_t ez.canvas.println(const Printable&);\nsize_t ez.canvas.println(struct tm * timeinfo, const char * format = NULL);\nsize_t ez.canvas.println(void);\n```\n\n`bool ez.canvas.scroll()`\n\n`void ez.canvas.scroll(bool s)`\n\nIf you turn on scrolling with `ez.canvas.scroll(true)`, M5ez will store what has been printed to the screen, so the contents of the screen can scroll. Note that when the canvas starts scrolling, only the contents placed there with the print functions from above will scroll, everything else will be wiped. So if, for example, you have drawn something with `m5.lcs.fillRect`, it will be gone once you print beyond the last line.\n\nYou can turn scrolling off with `ez.canvas.scroll(false)`, and you can ask what the present scroll status is with `ez.canvas.scroll()`.\n\n>Note on scrolling: for scrolling to work, everything that is printed to the screen is kept in memory. It is only forgotten if it scrolls off the screen or if you clear the canvas or screen. What that means is that if you turn scrolling on and then print and overwrite something lots of times, eventually the memory will fill up and your application will crash.\n\n`bool ez.canvas.wrap()`\n\n`void ez.canvas.wrap(bool w)`\n\n`wrap` determines whether the excess from the print functions that doesn't fit the current line is wrapped to the next line.\n\n`uint16_t ez.canvas.lmargin()`\n\n`void ez.canvas.lmargin(uint16_t newmargin)`\n\nAsk for and set the left margin for printing.\n\n`void ez.canvas.font(const GFXfont* font)`\n\n`const GFXfont* ez.canvas.font()`\n\n`void ez.canvas.color(uint16_t color)`\n\n`uint16_t ez.canvas.color()`\n\nAsk for and set the font and color for printing.\n\n`uint16_t ez.canvas.x()`\n\n`void ez.canvas.x(uint16_t newx)`\n\n`uint8_t ez.canvas.y()`\n\n`void ez.canvas.y(uint8_t newy)`\n\n`void pos(uint16_t x, uint8_t y)`\n\nAsk for and set the x and y position for the next print command.\n\n&nbsp;\n\n## Buttons\n\nThere are only three buttons on the M5Stack. To make sure we can make good use of our rare buttons, we can assign two functions to each button: one for a short press and one for a slightly longer press. We can also assign functions to all three combinations of two keys being pressed simultaneously (AB, BC and AC). So there is a total of nine possible key functions we can assign. The functions for a single key are displayed in the bottom row of the display, the functions for key combinations in a row above. Each key has a 'name' (which is also what is returned to the program if it is pressed and a 'caption', which is what is displayed on the key.\n\n![](images/buttons1.png)\n\nBecause there are multiple functions that get told what buttons are going to be displayed, it would get a little hairy to give each of these function 18 possible arguments for the key names and captions. So for your convenience, all the keys you want displayed and detected are specified as one string. The different key names and captions are separated with hashes. You can specify one key name like `OK`, which means you will only use the middle button, it will say OK on it and it will also return the string \"OK\" to your code.\n\nIf you specify three keys, like `yes # no # maybe` you will get three buttons with only one function per button. If you specify six keys, they will be the short and long presses for each key. If you specify nine, the last three will specify the AB, BC and AC button-combo functions respectively. Specifying any other number of keys does not work, so the string should always contain one, three, six or nine parts, separated by hashes.\n\n![](images/buttons2.png)\n\nThe captions on the key can differ from the name. To specify this, specify a name, followed by a pipe sign  (`|`) followed by the caption. So `one | un # two | deux # three | trois` specifies three keys that each show a number in french but return the number in english. Note that any spaces around the hashes or pipe signs in the string are ignored, to allow you to make things more readable in your code.\n\nIf your button is captioned `up`, `down`, `left` or `right`, the caption is replaced by a triangle pointing in that direction.\n\nIf a button has only one function, (no long press defined), the caption will be printed in the middle. If there is a short and a long press defined, they will be printed on the left and right, the right in cyan (in the default theme) to signify that it needs a longer press.\n\n*In some cases it may be necessary to define only a long or only a short press action explicitly. In that case, defining a the key with the placeholder \"~\" will make sure its function is not interpreted. Take the key definition string `~ # up # select # # right # down`: this defines the leftmost key to have the 'up' function, but only with a long press, a short press is ignored. The caption prints on the right side of the button and not in the middle. (One might use this to signify that the user got to the left edge of something she's navigating, not causing the 'up' function to trigger when she keeps pressing short before realising she's at the left edge.)*\n\n`void ez.buttons.show(String buttons)`\n\nShows all the buttons you specified, only redrawing the buttons that have changed from the buttons displayed already to prevent flicker. If needed it updates the canvas size to account for a changed number of keyboard rows displayed on the screen.\n\n`void ez.buttons.clear(bool wipe = true)`\n\nThis hides the buttons, growing the canvas to cover the area where the buttons were printed. If you set `wipe` to false, it will not draw background pixels there. (This may help prevent flicker or add a bit of performance if you're about to clear the canvas anyway.)\n\n`String ez.buttons.poll()`\n\nIf you call `ez.buttons.poll`, it will return the name of the key pressed since you last called it, or the empty string is nothing was pressed. This function is where everyone's M5ez programs will spends most of their time: waiting for the user to make things continue. If your code is waiting in a loop that includes `ez.buttons.poll`, clock and WiFi signal updating, as well as execution of user-registered functions (see below) will continue.\n\n`String ez.buttons.wait()`\n\n `ez.buttons.wait` does the same thing as `ez.buttons.poll()` except it does not return if nothing is pressed. If you call it with no arguments, it assumes the buttons have already been drawn with `ez.drawButtons`. (And if not your program is stuck.)\n\n`String ez.buttons.wait(String buttons)`\n\nYou can specify the keys to be drawn straight into `ez.buttons.wait` for simple usages. For instance `ez.buttons.wait(\"OK\")` will display a single \"OK\" on the center button and return \"OK\" when it is pressed. (But given that you are not interested in the return value in this case, you can just specify that as a statement.)\n\n&nbsp;\n\n## Scheduling tasks within M5ez\n\nNow that we're dealing with waiting for key presses, this is a good moment to talk about scheduling, yielding and such. As discussed above, a typical program written with M5ez will spend most of its time waiting for keys to be pressed. But some things need to continue to happen while that happening: the clock and the wifi signal indicator need to update, for instance.\n\n### Yield\n\n`void ez.yield()`\n\nIt could be that your code needs to do things that take a little while. If something takes many seconds, consider putting in an \"abort\" key. But suppose your code is busy and is not using `ez.buttons.poll` or `ez.buttons.wait` to check for keys. In that case use `ez.yield()` in your loop to make sure the clock and WiFi updating (as well as user defined tasks) get executed. `ez.yield` calls the Arduino `yield` function, so you do not need to call that separately.\n\n### Your own events\n\n`void ez.addEvent(uint16_t (*function)(), uint32_t when = 1)`\n\n`void ez.removeEvent(uint16_t (*function)())`\n\nWith `addevent` you can register a function of your own to be executed periodically as part of M5ez's own loop when it is waiting for buttons. This function has to be a function that takes no arguments and returns a 16-bit unsigned integer. Make sure you just specify the name of this function without any brackets. You can optionally specify when to run this function by adding a time in `millis()`. By default, the function you specify will run immediately.\n\nThe value returned by your function is the number of milliseconds to wait before calling the function again. So a function that only needs to run once every second would simply return 1000. If your function returns 0, the event is deleted and not executed any further.\n\n> Note: These events are meant for things that need to happen frequently. The next event cannot be more than 65 seconds out as the period between them is a 16-bit unsigned integer. If you use M5ez with ezTime, you can use [ezTime's events](https://github.com/ropg/ezTime#events) for things that need to happen with more time between them.\n\nAs the name implies, `ez.removeEvent` also removes your function from the loop.\n\n#### Redrawing after an event\n\n`void ez.redraw()`\n\nSometimes code executed in an event will have changed the contents of the screen. The running menu knows nothing about this, and so when your event ends, it will not refresh the screen. To fix this, you can execute `ez.redraw()` whenever your event routine has done something on the screen. The menu code will then redraw the screen accordingly.\n\n#### Changing the menu from an event\n\nYou can get a pointer to the current menu from inside your event code by calling `M5ez::getCurrentMenu()`. Events are not related to any specific menu, so you may get a pointer to different menus at different times durring the program, or even no menu at all (`nullptr`).  \nIf you need to confirm what menu you are dealing with, you can retrieve the title you gave the menu when it was created via `ezMenu::getTitle()`, which returns a `String`.  \nAn example of a safe usage pattern is:\n\n```c\nezMenu* cur_menu = M5ez::getCurrentMenu();\n// Test to see if menu exists before testing menu's title\nif(cur_menu && cur_menu->getTitle() == \"Desired Menu Title\") {\n    cur_menu->setCaption(someItem, someCaption);\n}\n```\n\nNote: If a menu item uses a `simpleFunction` or an `advancedFunction` to display a screen which does not display any menu at all (perhaps only the canvas and buttons are rendered), `M5ez::getCurrentMenu()` will still return the last active menu. You can modify this menu even when it's not displayed, and the changes will be evident when you return from the `simpleFunction` or `advancedFunction`.\n\n&nbsp;\n\n## Showing messages with msgBox\n\n![](images/msgBox1.png)\n\n```\nString ez.msgBox(String header,\n  String msg, String buttons = \"OK\",\n  const bool blocking = true,\n  const GFXfont* font = MSG_FONT,\n  uint16_t color = MSG_COLOR)\n```\n\n`ez.msgBox` produces a screen that just has your text message centered in the middle. If your message consists of multiple lines, msgBox will word-wrap and justify to the best fit on the screen. You can indicate where to break the lines yourself with a pipe sign (`|`). The only two arguments you have to provide are the header text and the message to be printed. If you do not specify buttons, `ez.msgBox` will put a single \"OK\" button in the middle. You can specify buttons in the same way it's done with the button commands seen earlier.\n\n![](images/msgBox2.png)\n\nBy default, msgBox then waits for the user to press any of the keys specified and returns the name of that key. If you want to scan for the keys yourself with `ez.buttons.poll()` (for instance because there are other things your code need to wait for or check) then you can specify `false` with blocking, msgBox will then show the message, header and buttons and exit.\n\nThe font and color options allow you to use something other than the default (theme determined) defaults for the message printed by msgBox. They act as you would expect, see the section on fonts and colors for details.\n\n&nbsp;\n\n## ezProgressBar\n\n**`class ezProgressBar(String header = \"\", String msg = \"\", String buttons = \"\", const GFXfont* font = MSG_FONT, uint16_t color = MSG_COLOR, uint16_t bar_color = PROGRESSBAR_COLOR, bool show_val = false, uint16_t val_color = PROGRESSBAR_VAL_COLOR)`**\n\n![](images/ezProgressBar.png)\n\nIf you want to show progress on a download or something else, use the `ezProgressBar` class. It behaves very similarly to msgBox, except you need to create a class instance. To create an ezProgressBar instance called pb, one could use:\n\n```\n  ezProgressBar pb (\"This is a header\", \"Message, just like with msgBox\", \"Abort\");\n```\n\nThis will draw header, message, an empty (0 %) progress bar and the specified single \"Abort\" button. Unlike msgBox this will not block by default. In code that executes after this, one would presumably check for the \"Abort\" button with `ez.buttons.poll()`. To advance the bar, the code would simply call:\n\n```\n  pb.value(float val)\n```\n\nwhere `val` is a floating point value between 0 and 100. Check out the [Over-The-Air https update example](https://github.com/M5ez/M5ez/tree/master/examples/OTA_https) to see how the ezProgressBar object is used there. (You'll see that the `ez.wifi.update()` software update function accepts a pointer to an ezProgressBar instance to show its progress.)\n\n&nbsp;\n\n## 3-button text input\n\n**`String ez.textInput(String header = \"\", String defaultText = \"\")`**\n\nThis function will provide a text-entry field, pre-filled with `defaultText` if specified. The user can then select a group of letter and then press the letter using the short and long keypresses and multi-key presses as discussed above in the \"Buttons\" chapter. By using this method, the lower case letters can be reached in two presses, upper case letters in three. If you are in shifted or numeric mode and press lock, the keyboard will return there instead of to lower case after each successful key. Once the user presses \"done\" (buttons A and C together), the function returns the entered text.\n\n![](images/textInput.png)\n\n>Advanced users can make their own keyboard definitions by looking at the `_keydefs` keyboard definition that is part of the default theme. As you can see there are multiple lines, each holding a key definition string like we have gotten to know them by now. Any key whose name is \"KB\" followed by a number causes nothing to be added to the input but the buttons in that line of the definitions to be printed instead. A key whose name is LCK: optionally followed by a string means that if it is pressed the current keyboard is what the user comes back to after a line is entered. Pressing a key whose name is \"Back\" returns to that keyboard as well. The string is used to denote the name of that keyboard in the on-screen capslock/numlock message.\n\n&nbsp;\n\n## FACES keyboard support\n\n![](images/FACES.png)\n\n`String ez.faces.poll()`\n\n`bool ez.faces.on()`\n\nM5ez supports the M5 FACES keyboard: simply set the keyboard to \"attached\" in the M5ez settings menu. When you do, you will be able to use the `ez.faces.poll` function to get the last key pressed on the keyboard. The `textInput` and `textBox` functions will then also look for keys from that keyboard, and start with different key definitions for the M5Stack's own buttons. `ez.faces.on()` can be used to see if the keyboard is set to \"attached\" in the menu.\n\n&nbsp;\n\n## Composing or viewing longer texts: textBox\n\n```\nString ez.textBox(String header = \"\",\n  String text = \"\", bool readonly = false,\n  String buttons = \"up#Done#down\",\n  const GFXfont* font = TB_FONT, uint16_t color = TB_COLOR)\n```\n\nThis will word-wrap and display the string in `text` (up to 32 kB), allowing the user to page through it. Ideal for LoRa or SMS messages, short mails or whatever else. If a FACES keyboard is attached and `readonly` is false, the user can edit the text: a cursor appears, which can be moved with the arrow keys on the FACES keyboard. `TB_FONT` and `TB_COLOR` are the defaults from the theme, but they can be overridden by supplying a font and/or a color directly.\n\n![](images/textBox.png)\n\n&nbsp;\n\n## Fonts\n\n**`void ez.setFont(const GFXfont* font)`**\n\n**`int16_t ez.fontHeight()`**\n\nJust like when using the `m5.lcd.setFreeFont` function directly, you can specify the FreeFont fonts to `ez.setFont` with a pointer to where they are in flash. M5ez makes it possible to do the same but also use the built-in \"pre-FreeFont\" fonts that are available. Normally, you would have to pass these as a numeric parameter to `m5.lcd.setTextFont`. M5ez provides a set of \"fake pointers\" that are treated specially to make this happen, but they can only be used by M5ez functions, not with any of the `m5.lcd` functions.\n\nThe fontHeight without arguments returns the height of the current font - FreeFont or otherwise - in pixels, without needing to specify which text font like in the `m5.lcd` version.\n\nWhat that all means is that without adding any fonts of your own, you can specify the following fonts:\n\n### FreeFonts from the Adafruit library\n\n```\n  &TomThumb\n  &FreeMono9pt7b\n  &FreeMono12pt7b\n  &FreeMono18pt7b\n  &FreeMono24pt7b\n  &FreeMonoBold9pt7b\n  &FreeMonoBold12pt7b\n  &FreeMonoBold18pt7b\n  &FreeMonoBold24pt7b\n  &FreeMonoOblique9pt7b\n  &FreeMonoOblique12pt7b\n  &FreeMonoOblique18pt7b\n  &FreeMonoOblique24pt7b\n  &FreeMonoBoldOblique9pt7b\n  &FreeMonoBoldOblique12pt7b\n  &FreeMonoBoldOblique18pt7b\n  &FreeMonoBoldOblique24pt7b\n  &FreeSans9pt7b\n  &FreeSans12pt7b\n  &FreeSans18pt7b\n  &FreeSans24pt7b\n  &FreeSansBold9pt7b\n  &FreeSansBold12pt7b\n  &FreeSansBold18pt7b\n  &FreeSansBold24pt7b\n  &FreeSansOblique9pt7b\n  &FreeSansOblique12pt7b\n  &FreeSansOblique18pt7b\n  &FreeSansOblique24pt7b\n  &FreeSansBoldOblique9pt7b\n  &FreeSansBoldOblique12pt7b\n  &FreeSansBoldOblique18pt7b\n  &FreeSansBoldOblique24pt7b\n  &FreeSerif9pt7b\n  &FreeSerif12pt7b\n  &FreeSerif18pt7b\n  &FreeSerif24pt7b\n  &FreeSerifItalic9pt7b\n  &FreeSerifItalic12pt7b\n  &FreeSerifItalic18pt7b\n  &FreeSerifItalic24pt7b\n  &FreeSerifBold9pt7b\n  &FreeSerifBold12pt7b\n  &FreeSerifBold18pt7b\n  &FreeSerifBold24pt7b\n  &FreeSerifBoldItalic9pt7b\n  &FreeSerifBoldItalic12pt7b\n  &FreeSerifBoldItalic18pt7b\n  &FreeSerifBoldItalic24pt7b\n```\n\n### FreeFonts included by the M5Stack driver\n\n```\n  &Orbitron_Light_24\n  &Orbitron_Light_32\n  &Roboto_Thin_24\n  &Satisfy_24\n  &Yellowtail_32\n```\n\n### Older fonts available only through M5ez\n\n```\n  mono6x8\n  sans16\n  sans26\n  numonly48\n  numonly7seg48\n  numonly75\n\n  mono12x16\n  sans32\n  sans52\n  numonly96\n  numonly7seg96\n  numonly150\n```\n\nNote that these fonts need to be specified without the `&` in front, and that the second batch consists of scaled up versions of the first batch, but they're nice and big and they still might be quite useful.\n\n### Using your own fonts\n\nYou can convert your own TrueType fonts to font files that can be included in your project and used on the M5Stack. As a separate project, I wrote a graphical converter where you can test the fonts on a virtual M5Stack display before converting. It's an online tool, so all of the action takes place online and in your web browser. Click [here](https://rop.nl/truetype2gfx/) (or on the image below) to use it. Everything you need to know to use it is on that page also.\n\n[![](images/truetype2gfx-screenshot.png)](https://rop.nl/truetype2gfx/)\n\n&nbsp;\n\n## Menus\n\nMenus are a way of letting users choose between different options, usually to influence program flow. With ezMenu, you can create a menu, give it some options and run it for the user to choose. An ezMenu can display as a list of options, allowing the user to go up and down the list (possibly scrolling off the screen). Or it can be a set of full-screen (or really full-canvas) images, with the user scrolling left and right before choosing one. They are both instances of the ezMenu object\n\n![](images/ezMenu1.png)\n\n![](images/ezMenu2.png)\n\n\n### Let's start with text menus\n\nTo create a menu we create an instance of the `ezMenu` object. By having each menu be it's own instance of that object, we can store information that will disappear from RAM if a submenu closes and we can return to higher menus which have kept their state. let's start with a complete sketch for a very simple text menu:\n\n```\n#include <M5Stack.h>\n#include <M5ez.h>\n\nvoid setup() {\n  ez.begin();\n}\n\nvoid loop() {\n  ezMenu myMenu;\n  myMenu.addItem(\"Option 1\", mainmenu_one);\n  myMenu.addItem(\"Option 2\", mainmenu_two);\n  myMenu.addItem(\"Option 3\");\n  myMenu.run();  \n}\n\nvoid mainmenu_one() {\n  ez.msgBox(\"\", \"You pressed one\");\n}\n\nvoid mainmenu_two() {\n  Serial.println(\"Number two was pressed\");\n}\n```\n\nAs you can see we define our menu named `myMenu` and we added three items with names and optional functions to jump to. We have inserted this in the Arduino `loop` function, but we might as well have stuck it in setup, because this menu will keep running forever: the `myMenu.run()` statement will never complete. It will display the menu, call and wait for the appropriate function if the user selects a menu option, rinse and repeat.\n\nWhich is all fine and well if that's our main menu, but it doesn't work if if the menu is a submenu. This is why the `yourMenu.run()` function exits if the user selects a menu item named \"Exit\", \"Back\" or \"Done\". This may be with a capitalized first letter or all lower case. (Menu items are just like buttons in that they have a name and a caption. If you add an item with `yourMenu.addItem(\"Exit | Go back to main menu\"), it will display the longer text, but still cause the menu to exit.\n\nLet's see our sketch again, this time with a submenu added:\n\n```\n#include <M5Stack.h>\n#include <M5ez.h>\n\nvoid setup() {\n  ez.begin();\n}\n\nvoid loop() {\n  ezMenu myMenu(\"Main menu\");\n  myMenu.addItem(\"Item 1\", mainmenu_one);\n  myMenu.addItem(\"Item 2\", mainmenu_two);\n  myMenu.addItem(\"Item 3\", mainmenu_three);\n  myMenu.run();\n}\n\nvoid mainmenu_one() {\n  ez.msgBox(\"\", \"You pressed one\");\n}\n\nvoid mainmenu_two() {\n  Serial.println(\"Number two was pressed\");\n}\n\nvoid mainmenu_three() {\n  ezMenu subMenu(\"Submenu\");\n  subMenu.addItem(\"Item A\");\n  subMenu.addItem(\"Item B\");\n  subMenu.addItem(\"Item C\");\n  subMenu.addItem(\"Back | Back to main menu\");\n  subMenu.run();\n}\n```\n\nAs you can see, the submenu called `subMenu` has three items that do nothing because we did not supply functions, as well as a fourth item called \"Back\" (which displays \"Back to main menu\"), which, when selected, causes `subMenu.run()` to exit, which in turn causes `mainmenu_three` to exit which brings us back to the main menu. The main menu will sit there as if we never left, still showing \"Item 3\" highlighted. The subMenu object instance meanwhile has gone out of scope when the function exited, neatly cleaning up the RAM it used.\n\n> Did you notice we're now providing brackets and an argument when we create the menu. That is the header above our menu.\n\n### `.runOnce()`\n\nUntil now we have considered menus that run all by themselves, unless they exit when a user selects an option named \"Back\", \"Exit\" or \"Done\". But you can also call `yourMenu.runOnce()` which will exit every time a user selects an option (but still after executing the supplied function or functions). Take a look at this:\n\n```\n#include <M5Stack.h>\n#include <M5ez.h>\n\nvoid setup() {\n  ez.begin();\n}\n\nvoid loop() {\n  ezMenu myMenu(\"Main menu\");\n  myMenu.addItem(\"Item 1\");\n  myMenu.addItem(\"Item 2\");\n  myMenu.addItem(\"Item 3\");\n  myMenu.runOnce();\n  if (myMenu.pickName() == \"Item 1\") {\n    ez.msgBox(\"\", \"You pressed one\");\n  }\n  if (myMenu.pickName() == \"Item 2\") {\n    Serial.println(\"Number two was pressed\");\n  }\n}\n```\n\nThis does exactly the same as the first example we started with. Note that `.runOnce()` returns an integer that holds the position of the item selected. So the following would be yet another way to get the same functionality:\n\n```\n#include <M5Stack.h>\n#include <M5ez.h>\n\nvoid setup() {\n  ez.begin();\n}\n\nvoid loop() {\n  ezMenu myMenu(\"Main menu\");\n  myMenu.addItem(\"Item 1\");\n  myMenu.addItem(\"Item 2\");\n  myMenu.addItem(\"Item 3\");\n  while (true) {\n    switch (myMenu.runOnce()) {\n      case 1:\n        ez.msgBox(\"\", \"You pressed one\");\n        break;\n      case 2:\n        Serial.println(\"Number two was pressed\");\n        break;\n    }\n  }\n}\n```\n\n### Image menus\n\n![](images/ezMenu3.png)\n\nYou can include jpg files in the flash by creating a special .h file that holds byte arrays encoding the bytes in the JPG file. If you `#include` this file in your program and then add at least one menu items with `addItem(picture1, \"Item 1\")` where `picture1` is the name of the JPG array in the .h file, the menu's `.run()` and `.runOnce()` functions will change behavior: they will show an image menu instead of a text menu.\n\nYou can also include the images to be shown as files, either on an SD card or on the special SPIFFS partition in the flash memory of the M5Stack.\n\nThe code in the demo application to show the picture menu looks as follows:\n\n```\nvoid mainmenu_image() {\n  ezMenu images;\n\n  ...\n\n  images.addItem(sysinfo_jpg, \"System Information\", sysInfo);\n  images.addItem(wifi_jpg, \"WiFi Settings\", mainmenu_wifi);\n  images.addItem(about_jpg, \"About M5ez\", aboutM5ez);\n  images.addItem(sleep_jpg, \"Power Off\", powerOff);\n  images.addItem(return_jpg, \"Back\");\n  images.run();\n}\n```\n\nAs you can see we simply call `addItem()` with the name of the byte array that holds the encoded JPG file, a name to be used as a caption on the image and a function to be executed.\n\n### Menus: all the functions documented\n\nAs you will see in the function documentation below, there is much more you can do with menus, like adding and deleting items on the fly. And if you draw different buttons, it's important to know that any button not named \"up\" or \"down\" selects the currently highlighted item. You might, for instance, create a button or button combination named \"info\" that provides more information about the current selection. There is also an advanced function you can pass that has access to more data and that can cause the menu to exit.\n\n**`ezMenu yourMenu(String header)`**\n\n**`ezMenu yourMenu`**\n\nIf you issue on of these statements, you are creating an instance of the ezMenu object called \"yourMenu\". This will allow you to reference it when you start adding items to it, change various properties of it. Eventually your code will run the menu, which means it will display on the screen. \"yourMenu\" should of course be replaced by any name of your choice, but we'll use it in this text to show all the functions that apply to menus. These functions should be called with the name of the menu followed by a dot in front of them, as they are \"member functions\" of the ezMenu object.\n\n```\nbool addItem(String nameAndCaption,\n  void (*simpleFunction)() = NULL,\n  bool (*advancedFunction)(ezMenu* callingMenu) = NULL,\n  void (*drawFunction)(ezMenu* callingMenu, int16_t x, int16_t y, int16_t w, int16_t h) = NULL)\n```\n\n```\nbool addItem(const char *image, String nameAndCaption,\n  void (*simpleFunction)() = NULL,\n  bool (*advancedFunction)(ezMenu* callingMenu) = NULL,\n  void (*drawFunction)(ezMenu* callingMenu, int16_t x, int16_t y, int16_t w, int16_t h) = NULL)\n```\n\n```\nbool addItem(fs::FS &fs, String path, String nameAndCaption,\n  void (*simpleFunction)() = NULL,\n  bool (*advancedFunction)(ezMenu* callingMenu) = NULL,\n  void (*drawFunction)(ezMenu* callingMenu, int16_t x, int16_t y, int16_t w, int16_t h) = NULL)\n```\n\nAdds items to a menu. The first form adds a text only item, the second and third forms make image menus. You can either supply a pointer to the image which is encoded as a byte array in a special .h file that you should have included, or a file system reference and a path for a file stored on SD of SPIFFS.\n\nIn the latter case your sketch must do either `#include <SPIFFS.h>` and `SPIFFS.begin()` or `#include <SD.h>' and 'SD.begin()`, and provide both the SD or SPIFFS object reference as well as the path to the file. The \"ImagesSPIFFSorSD\" example shows how to use this feature. Images from program flash, SPIFFS and SD-card can be freely mixed in the same menu.\n\nThe `simpleFunction` should be the name of a `void` function without parameters that will simply be executed as the menu item is picked. You supply the name of the function **without the brackets** here, as you are passing a pointer to the function and not the output of it.\n\nThe string named `nameAndCaption` can (as the name implies) hold both a name and a caption. If you don't do anything special they are set to the same string you supply. But if you pass `somename | Some caption`, the name is the part before the first pipe sign (`|`), the caption is everything after it. (Spaced around the pipe sign are removed.)\n\nThe name is what is returned when you call `yourMenu.pickName()` after the menu has ran, and you can also supply it as an argument to `deleteItem()` (see below). The caption is what is printed, either in the item's line in the menu or as a caption with the image in an image menu. The caption is also returned by `yourMenu.pickCaption()`.\n\nIf you put a tab character (Represented by `\\t`) in the caption of a menu item, the text to the left of the tab will be left-aligned to the left of the menu item, and the text to the right of it will be right-aligned to the right of the item. You can see this feature in use in M5ez's settings menu where the part on the right generally represents the actual state of a setting.\n\nIf an item is named \"Back\", \"Exit\" or \"Done\" (either with first letter capitalized all all lower case), the menu will exit is this item is picked, unless an advancedFunction is supplied (see below). Note that while it has to be *named* one of these three things, it can be *captioned* something completely different.\n\nIf you want your code to have more access to what just happened in the menu, you can supply an advancedFunction pointer. This way you can have a function that has access to all the member functions of the menu that called it, and it can determine whether the menu exits or not by returning `true` (keep running) or `false` (exit).\n\n```\nbool myAdvancedFunction(ezMenu* callingMenu) {\n  Serial.print( callingMenu->pickCaption() )\n  If (msgBox(\"Wow...\", \"Are you sure?\", \"yes##no\") == \"yes\") return false;\n  return true;\n}\n```\n\nThis function will print the caption printed on the menu item that was picked, and it will ask the user whether she really wants to exit the menu, causing the calling menu to exit by returning `false` if she presses yes. Note that items called \"Back\", \"Exit\" or \"Done\" do not cause the menu to exit immediately if they have an advancedFunction set: in that case the decision is left to the advancedFunction.\n\nIf you want your code to have access to the way the menus are drawn, you can supply an drawFunction pointer. The coordinates x, y, w (width) and h (height) define the rectangle where the menu is located.\n\n```\nvoid myDrawFunction(ezMenu* callingMenu, int16_t x, int16_t y, int16_t w, int16_t h){\n  m5.lcd.setTextDatum(CL_DATUM);\n  m5.lcd.setTextColor(ez.theme->menu_item_color);\n  // New callingMenu aspect\n  m5.lcd.fillRoundRect(x, y, w, h, 1, TFT_RED);\n  m5.lcd.drawString(\"New text\",x + ez.theme->menu_item_hmargin,y + ez.fontHeight() / 2 - 2);\n}\n```\n\nNote that to address member functions of the calling menu in this function we need to use '->' instead of '.'. That's because we were passed a pointer to the instance, not an instance itself, but don't worry too much if you don't understand that.\n\n**`bool deleteItem(int16_t index)`**\n\n**`bool deleteItem(String name)`**\n\nThe first form deletes the menu item at the position indicated, starting with 1 for the first menu item. The second form allows you to delete a menu item by name. Note that this will only delete the first menu item with that name. `deleteItem` will return true if it works, false if the name or index do not point to a valid menu item.\n\n**`bool setCaption(int16_t index, String caption)`**\n\n**`bool setCaption(String name, String caption)`**\n\nAs the name implies, changes the caption (but not the name) of the item specified either by position or by name.\n\n**`int16_t getItemNum(String name)`**\n\nReturns the index in the menu (starting at 1) of the first menu item with the specified name, or 0 if no item with that name exists.\n\n**`void buttons(String bttns)`**\n\nThis allows you to pass your own buttons to the function, using the format discussed in the chapter on buttons earlier in the documentation. By default, a text menu has the buttons `up # select # down` defined while an image menu has `left # select # right`. You can provide your own button layout, moving the buttons or adding functions for long presses or key combinations. Note that there is nothing special about the word \"Select\". Any button not named \"up\", \"down\", \"left\" or \"right\" is used to pick the current item, and you can use either an advancedFunction or `.runOnce()` and then a call to `.pickButton()` to figure out which key was pressed.\n\nButtons *captioned* \"up\", \"down\", \"left\" or \"right\" are displayed with a triangular arrow in the corresponding direction instead of that word. Buttons *named* \"Back\", \"Exit\" or \"Done\" cause the menu to exit. Note that menus without buttons named \"up and \"down\" (text menus) or \"left\" and \"right\" (image menus) become impossible to navigate.\n\nButtons named \"first\" and \"last\" ump to the first or last item of the menu respectively.\n\n**`void upOnFirst(String nameAndCaption)`**\n\n**`void leftOnFirst(String nameAndCaption)`**\n\n**`void downOnLast(String nameAndCaption)`**\n\n**`void rightOnLast(String nameAndCaption)`**\n\nThese functions allow you to replace the navigation button that would navigate off the menu with something else. Normally this button would just disappear. You can make menu rotate (like the main menu in the demo app) like this:\n\n```\n  main.upOnFirst(\"last|up\");\n  main.downOnLast(\"first|down\");\n```\n\nNote that the \"first\" and \"last\" are button *names* with special functions, and \"up\" and \"down\" are *captions* with special functions (they are replaced by triangle arrows). The first two and last two functions are actually synonyms: they do they same thing, it's just clearer to use the second form when creating an image menu (which is horizontal).\n\n**`void txtFont(const GFXfont* font)`**\n\n**`void txtBig()`**\n\n**`void txtSmall()`**\n\nThese apply to text menus only. You can set the font. The theme can supply a default big and small menu font, which can be set by simply calling `.txtBig()` or `.txtSmall()` on a menu. In the default theme, the big menu can display 6 items at a time when a header and a single row of button labels is displayed, a small menu displays eight items at a time. You can set your own font with `txtFont` or create a new theme with different defaults.\n\n**`void setSortFunction(bool (*sortFunction)(const char* s1, const char* s2))`**\n\nOrdinarily, menu items are displayed in the order in which they are added. However, if you are building a menu from data which you have no control over, such as a list of file names from an SD card, a sort function will ensure that the names are displayed in a specific order. You may define a sort function that takes two `const char*`'s and returns true when the second is greater than the first, or use one of the eight built-in sorting functions.\n\n```\nbool ascendingCaseSensitive(const char* s1, const char* s2) {\n    return 0 > strcmp(s1, s2);\n}\n...\nmenu.setSortFunction(ascendingCaseSensitive);\n```\n\nOnce set, the menu is automatically kept sorted. All calls to addItem result in a sorted menu without further interaction. If setSortFunction is called after the menu has been populated, it's immediately resorted and maintained in its new order as items are added and deleted.\n\nNote that if your menus use Captions as well as Names, sorting is a bit more complicated. A set of functions is provided for sorting text in most typical manners:\n\n| Function                       | Purpose                                                                  |\n| :----------------------------- | :----------------------------------------------------------------------- |\n| `ezMenu::sort_asc_name_cs`\t\t | Sort ascending by menu name, case sensitive                              |\n| `ezMenu::sort_asc_name_ci`\t\t | Sort ascending by menu name, case insensitive                            |\n| `ezMenu::sort_dsc_name_cs`\t\t | Sort descending by menu name, case sensitive                             |\n| `ezMenu::sort_dsc_name_ci`\t\t | Sort descending by menu name, case insensitive                           |\n| `ezMenu::sort_asc_caption_cs`\t | Sort ascending by menu caption or name if no caption, case sensitive     |\n| `ezMenu::sort_asc_caption_ci`\t | Sort ascending by menu caption or name if no caption, incase sensitive   |\n| `ezMenu::sort_dsc_caption_cs`\t | Sort descending by menu caption or name if no caption, case sensitive    |\n| `ezMenu::sort_dsc_caption_ci`\t | Sort descending by menu caption or name if no caption, case insensitive  |\n\nSee the example program SortedMenus for typical usage.\n\n---\n\nThen there are some functions that only apply to image menus\n\n**`void imgBackground(uint16_t color)`**\n\nThis sets a temporary background color different from the background from the theme or set manually with `ez.background`. This is so that background between the buttons can match the background of the images displayed. The background will return to its previous setting when the menu exits or runs any of the functions supplied with `addItem`.\n\n**`void imgFromTop(int16_t offset)`**\n\nThe offset in pixels from `canvasTop()` where the top of the image is rendered.\n\n**`void imgCaptionFont(const GFXfont* font)`**\n\n**`void imgCaptionLocation(uint8_t datum)`**\n\n**`void imgCaptionColor(uint16_t color)`**\n\n**`void imgCaptionMargins(int16_t hmargin, int16_t vmargin)`**\n\nThese settings allow for the menu item caption to be printed somewhere on the canvas. The font and color options are obvious, the location is one of\n\n|     | left | middle | right |\n| ----|:-----|:-----|:------ |\n| **top** | `TL_DATUM` | `TC_DATUM` | `TR_DATUM` |\n| **middle** | `ML_DATUM` | `MC_DATUM` | `MR_DATUM` |\n| **bottom** | `BL_DATUM` | `BC_DATUM` | `BR_DATUM` |\n\nand the margins specify how far away from the edges of the canvas the caption is printed. The default is for no caption to be printed, you must specify all these options if you want captions.\n\n**`int16_t runOnce()`**\n\nIf you execute `yourMenu.runOnce()`, the menu will show and the user can interact with it until an item is picked. Then the function returns the index of the picked item (starting at one). The menu can also 'exit' (which is not the same as the `.runOnce()` function exiting, which happens when an item is picked.\n\n* If the user picks an item named \"Back\", \"Exit\" or \"Done\" that does not have an advancedFunction passed.\n* If the user picks any item using a button named \"Back\", \"Exit\" or \"Done\".\n* if the advancedFunction that was ran for a picked item returned `false`.\n\nIn all of the above cases, `.runOnce` will return 0. The index of the item picked will still be returned with `.pick()`, see below.\n\n**`void run()`**\n\nThe internal code for `.run()` is very simple:\n\n```\nvoid ezMenu::run() {\n  while (runOnce()) {}\n}\n```\n\nIn other words: all it does is just call `.runOnce()` on your menu until it exits for any of the reasons listed above. If your menu is the main menu of the program, you would simply not supply any items or buttons called \"Exit\", \"Back\" or \"Done\" and have no advancedFunctions ever return `false`. This will cause the menu to run forever.\n\n**`int16_t pick()`**\n\n**`String pickName()`**\n\n**`String pickCaption()`**\n\n**`String pickButton()`**\n\nThese functions will show the position, name and caption of the picked item. They are useful after your menu has been ran once with `.runOnce` or in an advancedFunction (see under `addItem` above).\n\n&nbsp;\n\n## Settings\n\nM5ez comes with a number of built-in settings menus. The settings are saved to flash in the `M5ez` section of the ESP32 NVS facility (using the Arduino `Preferences` library). All you need to do is create one menu item that points to `ez.settings.menu` and all settings will be available. By commenting out certain compiler defines, menu items (and all code associated with them) can be disabled. The various menus can also be accessed directly. Here's a quick table of the menus, their `#define` keyword, and their direct access function.\n\n| Menu | `#define` | function |\n|:-----|:----------|:---------|\n| Wifi menu | `M5EZ_WIFI` | `ez.wifi.menu` |\n| Battery menu | `M5EZ_BATTERY` | `ez.battery.menu` |\n| Clock menu | `M5EZ_CLOCK` | `ez.clock.menu` |\n| Backlight brightness | `M5EZ_BACKLIGHT` | `ez.backlight.menu` |\n| FACES keyboard | `M5EZ_FACES` | `ez.faces.menu` |\n| Theme chooser | n/a | `ez.theme.menu` |\n\n### Wifi\n\nThe wifi menu allows the user to connect to an Access Point. The user can also turn on and off the \"autoconnect\" feature. With this feature on, M5EZ will behave like most smartphones and automatically connect to any Access Point which has been added to the autoconnect list when it was joined.\n\nNote that this doesn't use the `WiFi.setAutoConnect` and `WiFi.setAutoReconnect` functions of the ESP32 WiFi library: they can only connect to one access point. Instead  M5ez has it's own logic for connecting, saving the ssid and password of networks you want to automatically connect to in flash.\n\nBelow you can see how to access the stored networks as well as the stored \"on/off\" toggle for the autoconnect feature from code. You probably won't need this as `ez.wifi.menu` lets the user manage all of this. Note that if you do make any changes, you have to call `ez.wifi.writeFlash()` when you are done to save them to flash.\n\n`std::vector<WifiNetwork_t> networks`\n\n`ez.wifi.networks` is a vector (think of it as an array), that holds all the stored networks after M5ez boots (or `ez.wifi.readFlash()` is executed). Here's a code example to print all the SSIDs and their passwords to the M5ez canvas.\n\n```\nfor (int8_t n = 0; n < ez.wifi.networks.size(); n++) {\n  ez.canvas.print(ez.wifi.networks[n].SSID);\n  ez.canvas.print(\": \");\n  ez.canvas.println(ez.wifi.networks[n].key);\n}\n```\n\n`void ez.wifi.add(String ssid, String key)`\n\n`bool ez.wifi.remove(int8_t index)`\n\n`bool ez.wifi.remove(String ssid)`\n\nAdds or removes a network. the index is the index in te networks array above.\n\n`int8_t indexForSSID(String ssid)`\n\nCan be used to find the index for a named SSID. -1 is returned if the name is not found.\n\n#### The weird Wifi ghost button problem\n\nwhen you connect to Wifi, on some M5Stack devices, you may notice a strange quirk of the M5Stack hardware, or possibly of the ESP32 chip. When you are connected, the left button is getting ghost clicks. If this happens to you when you are on Wifi, you will need to do the following to fix it.\n\nNavigate to the Arduino libraries directory, and then from there to `M5Stack/src/utility/Button.cpp`. In that file (around line 60) find\n\n```\n  pinVal = digitalRead(_pin);\n```\n\nand replace that line with:\n\n```\n// The digitalRead of the button pin is commented out below.\n// The two lines below fix an issue where BtnA gets spurious presses if the\n// Wifi is active. (The second line fixes it, the first remediates resulting\n// speaker noise.) For details: https://github.com/m5stack/M5Stack/issues/52\n\n//    pinVal = digitalRead(_pin);\n    dacWrite(25, 0);\n    pinVal = analogRead(_pin);\n```\n\nNow recompile and the problem is gone. It does mean that you cannot use the speaker while  `ez.buttons.poll()` is checking for button presses.\n\n#### Over-The-Air (OTA) updates via https\n\nYou might deploy hardware that needs updates but that you don't want to hook up via USB every time. But you will want this upload mechanism to offer some security against attackers that could otherwise compromise large numbers of internet-connected IoT devices. M5ez allows you to boot from a compiled binary file that is downloaded from the internet over https.\n\n`bool ez.wifi.update(String url, const char* root_cert, ezProgressBar* pb = NULL)`\n\n`String ez.wifi.updateError()`\n\nTakes a URL and a root certificate. A shell script called `get_cert` is provided in the `/tools` directory of this repository to get the right (non-forwarded) URL and create an include file to provide the correct certificate. The optional third argument is a pointer to the `ezProgressBar` instance that will show the progress of the firmware download. It must be provided with a leading ampersand.\n\n`ez.wifi.update` returns `true` if the file is downloaded and everything is set up. The next reboot - which can be forced with `ESP.restart()` - will start the new binary. If `ez.wifi.update` returns `false`, you can use `ez.wifi.updateError()` to return a String with a human-readable error message. (The way the https stream data is handled by the underlying ESP32 `Update` library does not seem terribly robust: stream timeouts happen, even on otherwise good internet connections.)\n\nThe [README.rd file of the OTA_https sample sketch](https://github.com/M5ez/M5ez/tree/master/examples/OTA_https) provides a step-by-step recipe that describes how to determine the URL and get the certificate using `get_cert`.\n\n&nbsp;\n\n### BLE\n\nBLE, short for [Bluetooth Low Energy](https://en.wikipedia.org/wiki/Bluetooth_Low_Energy).  Is intended to provide considerably reduced power consumption and cost while maintaining a similar communication range. We implemented a device manager, so you can just focus on communicate with the target device. You can access it's interface from `ez.ble` , and can get access to connected devices from `ez.ble.getClient` function.\n\n&nbsp;\n\n### Battery\n\nThe battery menu allows you to selectively show a battery level icon in the header bar. But due to [hardware limitations](https://github.com/m5stack/M5Stack/issues/74) it can only show four different battery levels. You can access its menu from `ez.battery.menu`. The battery level icon is animated while charging via USB.\n\n&nbsp;\n\n### Clock\n\nIf M5ez is compiled with M5EZ_CLOCK (which it is by default), it will be set up to display a clock in the header bar at the top of the screen. By default this clock displays time in a 24 hour format, but this can be changed in the clock menu, which is also accessible directly via `ez.clock.menu`.\n\nThe first time M5ez goes online, it will try to look up the timezone using the GeoIP country of the IP address you are connecting to the timezone server from. If this lookup fails or if you are in a country that spans multiple timezones this lookup will fail and an official timezone name will have to be set manually in the menu. (Timezone names are of the from `Continent/Some_City`, see [here](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) for a list of timezone names. Note that the name of the timezone has to be entered in the correct case.\n\nIf you use M5ez with on-screen clock, your code can also use all the other features of [ezTime](https:://github.com.ropg/ezTime), my full-featured general purpose Arduino time library.\n\n&nbsp;\n\n### Backlight\n\nYou can set the brightness of the LCD backlight LEDs here. The menu is also directly accessible via `ez.backlight.menu`.\n\n&nbsp;\n\n### FACES keyboard\n\nHere you can set whether or not you have a FACES keyboard attached. I would have preferred to detect the keyboard automatically, but that's not easy, so it's solved with a settings menu.\n\n&nbsp;\n\n### Factory defaults\n\nThis will erase M5ez's NVS flash section and boot, setting all M5ez settings back to their defaults.\n\n&nbsp;\n\n### Adding your own settings\n\nYou can add your own settings menu. The settings menu object `ez.settings.menuObj` is a regular M5ez menu, and so your own code can, at startup, add its own submenus. To show how, let's see a snippet of M5ez's own code\n\n```\nez.settings.menuObj.addItem(\"Backlight brightness\", ez.backlight.menu);\n```\n\nThat's how the backlight menu item is added to the menu.\n\n&nbsp;\n\n## Themes\n\n### Including themes\n\nIn the `setup()` part of your code, you can include themes from the themes directory. If you include multiple themes, the settings menu will show a theme chooser where the user can choose their theme. For instance, the M5ez demo program offers both the 'default' and the 'dark' theme as follows:\n\n```\nvoid setup() {\n  #include <themes/default.h>\n  #include <themes/dark.h>\n  ez.begin();\n}\n```\n\nAnd thus the settings menu offers a \"Theme Chooser\" option for these two themes:\n\n![](images/theme-default.jpg) &nbsp;&nbsp;&nbsp; ![](images/theme-dark.jpg)\n\nIf you include no themes, the default theme is loaded as the only theme.\n\n### Making your own\n\nTo make your own theme, copy the default theme from the src/themes directory to your sketch directory, rename it and change the values you want to change. The dark theme should give you an idea how to uncomment and change some of the values. Make sure you at least change the 'name' property as that will be displayed in the theme chooser. Now include this file in the `setup()` section of your sketch. Since you're including from the sketch directory and not from a library use quotes and not pointy brackets, like `#include \"myTheme.h\"`. If you spend some time to create a cool looking theme, please send it along so it can be included for everyone else to use.\n\n&nbsp;\n\n## z-sketches\n\nWith a simple trick, you can make code that does something pretty on its own, but that can also be included to provide a submenu in a bigger program. If you look at the M5ez-demo program, you will see that its directory includes another sketch named z-sysinfo.ino. This is the same z-sysinfo.ino that can be compiled on its own. (It is in the examples directory.)\n\nNormally putting two .ino files in the same directory is a bad idea as the compiler then finds two programs that each have a `setup()` and a `loop()`. But if one of the programs (the \"master\" program) specifies `#define MAIN_DECLARED` and the slave program has `#ifndef MAIN_DECLARED` and `#endif` around its declaration of `setup()` and `loop()`, it no longer conflicts. This means the master program can call functions from it. As you can see z-sysinfo.ino also uses whether or not `MAIN_DECLARED` is defined to determine whether to provide an \"Exit\" button. After all: if it is running stand-alone there is nothing to exit to.\n\nAlso note that you do not need to `#include` any sketches placed in the same directory as your master program: the compiler combines them automatically. That also means you must ensure that no names are declared twice, or otherwise the compiler will complain.\n\n> *It's called a z-sketch and starts with a z because that way the Arduino program that turns the .ino files into .cpp files for the compiler looks at it last, which is important. Silly hack, but it is nice to able to write smaller bits of functionality that can be shown and tested individually.*\n\n&nbsp;\n\n## Table of Contents\n\n* [`M5ez` The easy way to program on the M5Stack](#m5ez-the-easy-way-to-program-on-the-m5stack)\n  * [Introduction](#introduction)\n    * [Other products by M5](#other-products-by-m5)\n    * [Alternatives](#alternatives)\n      * [UiFlow](#uiflow)\n  * [Getting started](#getting-started)\n    * [If you get `fatal error: ezTime.h: No such file or directory`](#if-you-get-fatal-error-eztimeh-no-such-file-or-directory)\n  * [Structure of documentation](#structure-of-documentation)\n    * [Tech Notes](#tech-notes)\n* [M5ez User Manual](#m5ez-user-manual)\n  * [How it all works](#how-it-all-works)\n  * [Screen](#screen)\n  * [Header](#header)\n    * [Showing, hiding, title](#showing-hiding-title)\n    * [Your own header widgets](#your-own-header-widgets)\n  * [Canvas](#canvas)\n    * [Canvas dimensions](#canvas-dimensions)\n    * [Printing to the canvas](#printing-to-the-canvas)\n  * [Buttons](#buttons)\n  * [Scheduling tasks within M5ez](#scheduling-tasks-within-m5ez)\n    * [Yield](#yield)\n    * [Your own events](#your-own-events)\n      * [Redrawing after an event](#redrawing-after-an-event)\n  * [Showing messages with msgBox](#showing-messages-with-msgbox)\n  * [ezProgressBar](#ezprogressbar)\n  * [3-button text input](#3-button-text-input)\n  * [FACES keyboard support](#faces-keyboard-support)\n  * [Composing or viewing longer texts: textBox](#composing-or-viewing-longer-texts-textbox)\n  * [Fonts](#fonts)\n    * [FreeFonts from the Adafruit library](#freefonts-from-the-adafruit-library)\n    * [FreeFonts included by the M5Stack driver](#freefonts-included-by-the-m5stack-driver)\n    * [Older fonts available only through M5ez](#older-fonts-available-only-through-m5ez)\n    * [Using your own fonts](#using-your-own-fonts)\n  * [Menus](#menus)\n    * [Let's start with text menus](#lets-start-with-text-menus)\n    * [`.runOnce()`](#runonce)\n    * [Image menus](#image-menus)\n    * [Menus: all the functions documented](#menus-all-the-functions-documented)\n  * [Settings](#settings)\n    * [Wifi](#wifi)\n      * [The weird Wifi ghost button problem](#the-weird-wifi-ghost-button-problem)\n      * [Over-The-Air (OTA) updates via https](#over-the-air-ota-updates-via-https)\n    * [BLE](#ble)\n    * [Battery](#battery)\n    * [Clock](#clock)\n    * [Backlight](#backlight)\n    * [FACES keyboard](#faces-keyboard)\n    * [Factory defaults](#factory-defaults)\n    * [Adding your own settings](#adding-your-own-settings)\n  * [Themes](#themes)\n    * [Including themes](#including-themes)\n    * [Making your own](#making-your-own)\n  * [z-sketches](#z-sketches)\n* [Table of Contents](#table-of-contents)\n"
  },
  {
    "path": "component.mk",
    "content": "#\n# Main Makefile. This is basically the same as a component makefile.\n#\n# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.)\n\nCOMPONENT_SRCDIRS := src\nCOMPONENT_ADD_INCLUDEDIRS := src\n"
  },
  {
    "path": "examples/Hello_World/Hello_World.ino",
    "content": "#include <M5ez.h>\n\nvoid setup() {\n\tez.begin();\n}\n\nvoid loop() {\n\tez.msgBox(\"M5ez minimal program\", \"Hello World !\", \"Settings\");\n\tez.settings.menu();\n}\n"
  },
  {
    "path": "examples/ImagesSPIFFSorSD/ImagesSPIFFSorSD.ino",
    "content": "/*\n *  To use this sketch, you need to use the Arduino ESP32 filesystem uploader to upload the \n *  images from the data directory to the SPIFFS partition on your ESP32. See\n *  \n *  https://github.com/me-no-dev/arduino-esp32fs-plugin for the uploader\n * \n */\n\n#include <M5Stack.h>\n#include <M5ez.h>\n#include <SPIFFS.h>\n\n#include \"images.h\"\n\nvoid setup() {\n\t#include <themes/dark.h>\n\t#include <themes/default.h>\n\tez.begin();\n\tSPIFFS.begin();\n}\n\nvoid loop() {\n\tezMenu images;\n\timages.imgBackground(TFT_BLACK);\n\timages.imgFromTop(40);\n\timages.imgCaptionFont(&FreeSansBold12pt7b);\n\timages.imgCaptionLocation(TC_DATUM);\n\timages.imgCaptionColor(TFT_WHITE);\n\timages.imgCaptionMargins(10,10);\n\timages.addItem(system_jpg, \"Settings\", ez.settings.menu);\t\t// This image comes from images.h file\n\timages.addItem(SPIFFS, \"/rose.jpg\", \"Rose\");\t\t\t\t\t// This and image below come from SPIFFS\n\timages.addItem(SPIFFS, \"/galaxy.jpg\", \"Galaxy\");\n\timages.run();\n}\n"
  },
  {
    "path": "examples/ImagesSPIFFSorSD/images.h",
    "content": "#pragma once\n\nconst char system_jpg[] PROGMEM =\n{\n    0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x60, \n    0x00, 0x60, 0x00, 0x00, 0xFF, 0xE1, 0x00, 0x22, 0x45, 0x78, 0x69, 0x66, 0x00, 0x00, 0x4D, 0x4D, \n    0x00, 0x2A, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x01, 0x12, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, \n    0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x02, 0x01, 0x01, \n    0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x05, 0x03, 0x03, 0x03, \n    0x03, 0x03, 0x06, 0x04, 0x04, 0x03, 0x05, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 0x08, \n    0x09, 0x0B, 0x09, 0x08, 0x08, 0x0A, 0x08, 0x07, 0x07, 0x0A, 0x0D, 0x0A, 0x0A, 0x0B, 0x0C, 0x0C, \n    0x0C, 0x0C, 0x07, 0x09, 0x0E, 0x0F, 0x0D, 0x0C, 0x0E, 0x0B, 0x0C, 0x0C, 0x0C, 0xFF, 0xDB, 0x00, \n    0x43, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x06, 0x03, 0x03, 0x06, 0x0C, 0x08, 0x07, 0x08, \n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, \n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, \n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, \n    0x0C, 0x0C, 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x00, 0xB5, 0x01, 0x40, 0x03, 0x01, 0x22, 0x00, 0x02, \n    0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, 0x00, 0x1F, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, \n    0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, \n    0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, \n    0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04, \n    0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, \n    0x91, 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, 0x33, 0x62, 0x72, 0x82, \n    0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, \n    0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, \n    0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, \n    0x77, 0x78, 0x79, 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, \n    0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, \n    0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, \n    0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, \n    0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xC4, 0x00, \n    0x1F, 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, \n    0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, \n    0x00, 0xB5, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, \n    0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, \n    0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 0x23, \n    0x33, 0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, \n    0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, \n    0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, \n    0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84, \n    0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, \n    0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, \n    0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, \n    0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, \n    0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, \n    0x00, 0x3F, 0x00, 0xFE, 0x7F, 0xE8, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xAB, 0x7A, 0x3E, 0x81, 0x7D, 0xE2, 0x1B, 0x9F, 0x27, 0x4F, \n    0xB2, 0xBB, 0xBE, 0x9B, 0x19, 0xD9, 0x6F, 0x0B, 0x4A, 0xDF, 0x92, 0x82, 0x6A, 0x1B, 0xDB, 0x19, \n    0xB4, 0xDB, 0xA6, 0x86, 0xE2, 0x19, 0x6D, 0xE6, 0x8C, 0xE1, 0xE3, 0x91, 0x0A, 0xB2, 0x9F, 0x70, \n    0x79, 0x14, 0xEC, 0xED, 0x70, 0xF3, 0x22, 0xA2, 0x8A, 0x29, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x52, 0x5B, 0x5B, 0x49, 0x79, 0x3A, 0xC5, 0x0C, 0x72, 0x4B, 0x24, 0x87, 0x6A, 0xA2, 0x29, 0x66, \n    0x63, 0xE8, 0x00, 0xAE, 0xCB, 0x40, 0xFD, 0x9E, 0x3C, 0x5F, 0xE2, 0x06, 0x1B, 0x74, 0x79, 0xEC, \n    0xD3, 0x38, 0xDD, 0x77, 0xFB, 0x9C, 0x7F, 0xC0, 0x5B, 0xE6, 0xFC, 0x85, 0x69, 0x4E, 0x8D, 0x4A, \n    0x8E, 0xD4, 0xD3, 0x7E, 0x85, 0xC6, 0x9C, 0xA5, 0xA4, 0x55, 0xCE, 0x26, 0x8A, 0xF6, 0xE8, 0xBF, \n    0xE0, 0x9F, 0x5F, 0x13, 0x2F, 0xF4, 0x76, 0xBC, 0xB2, 0xD0, 0x6F, 0x2E, 0xD5, 0x53, 0xCC, 0x03, \n    0xC8, 0x78, 0x96, 0x61, 0xFF, 0x00, 0x4C, 0xD9, 0xC0, 0x0D, 0xFA, 0x57, 0x8D, 0xEB, 0x9A, 0x1D, \n    0xEF, 0x86, 0x75, 0x7B, 0x8D, 0x3F, 0x51, 0xB3, 0xB9, 0xB0, 0xBE, 0xB3, 0x90, 0xC5, 0x3D, 0xBD, \n    0xC4, 0x46, 0x39, 0x61, 0x71, 0xD5, 0x59, 0x5B, 0x90, 0x47, 0xA1, 0xAD, 0xB1, 0x18, 0x1C, 0x45, \n    0x04, 0x9D, 0x68, 0x38, 0xA7, 0xB5, 0xD6, 0xE5, 0xD5, 0xC3, 0xD5, 0xA6, 0x93, 0xA9, 0x16, 0xAE, \n    0x55, 0xA2, 0x8A, 0x2B, 0x94, 0xC4, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, \n    0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, \n    0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, \n    0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x92, 0xCE, 0xCE, 0x6D, 0x42, 0xEE, 0x2B, 0x7B, 0x78, 0xA4, \n    0x9E, 0xE2, 0x77, 0x11, 0xC7, 0x1C, 0x6A, 0x59, 0xE4, 0x62, 0x70, 0x14, 0x01, 0xC9, 0x24, 0xF0, \n    0x00, 0xAF, 0x45, 0xF0, 0x7F, 0xEC, 0x93, 0xE3, 0xCF, 0x18, 0x4B, 0x16, 0xDD, 0x0E, 0x5D, 0x36, \n    0x29, 0x24, 0xF2, 0xCC, 0x9A, 0x8B, 0x0B, 0x63, 0x19, 0xF5, 0x31, 0x9F, 0xDE, 0x63, 0xE8, 0x87, \n    0x3D, 0xAB, 0xD8, 0x7F, 0xE0, 0x92, 0x5A, 0x95, 0xAF, 0x85, 0x3F, 0x68, 0x69, 0xB5, 0xE9, 0x34, \n    0xDB, 0x5D, 0x4A, 0xFA, 0xCE, 0x18, 0xEC, 0xAD, 0x16, 0xE1, 0x03, 0x2C, 0x0D, 0x70, 0xE5, 0x1A, \n    0x45, 0xC8, 0xE1, 0xB6, 0x82, 0xB9, 0x1F, 0xC2, 0xEE, 0x3B, 0xD7, 0xE9, 0xC6, 0x95, 0xA6, 0xDA, \n    0x8D, 0x52, 0x4B, 0xB8, 0xEC, 0xED, 0x20, 0x9E, 0xE1, 0x8B, 0xBB, 0x45, 0x10, 0x53, 0xEB, 0x8C, \n    0xF5, 0xC0, 0xAF, 0xBB, 0xE1, 0x7E, 0x0F, 0x59, 0x95, 0x2F, 0xAC, 0x56, 0x93, 0x51, 0xE9, 0x6F, \n    0x5B, 0x1F, 0x49, 0x93, 0xE4, 0x4B, 0x17, 0x0F, 0x6B, 0x51, 0xD9, 0x79, 0x1F, 0x9C, 0xFF, 0x00, \n    0x09, 0xBF, 0xE0, 0x90, 0x5E, 0x24, 0xF1, 0x59, 0x59, 0x35, 0x9B, 0xDB, 0xA8, 0xD4, 0x72, 0xD1, \n    0xDA, 0xDB, 0xF9, 0x2A, 0x47, 0xAA, 0xCB, 0x36, 0x33, 0xF8, 0x21, 0xAF, 0xA9, 0xFE, 0x0D, 0x7F, \n    0xC1, 0x1D, 0xFC, 0x0B, 0xE1, 0x37, 0x86, 0x6D, 0x4A, 0xCE, 0xCE, 0xFA, 0x64, 0x4C, 0x17, 0xBB, \n    0x2F, 0x7C, 0x64, 0xCF, 0x5D, 0xC8, 0xDB, 0x62, 0x07, 0xDC, 0x21, 0xF6, 0xAF, 0xA8, 0xB4, 0x61, \n    0x8A, 0xEA, 0x74, 0x96, 0xE1, 0x6B, 0xF4, 0x7C, 0x17, 0x04, 0xE5, 0x54, 0x35, 0xE4, 0xE6, 0x7E, \n    0x7A, 0x9F, 0x55, 0x87, 0xE1, 0xFC, 0x1D, 0x3D, 0x79, 0x6F, 0xEA, 0x72, 0x7F, 0x0F, 0x7F, 0x63, \n    0xAF, 0x03, 0x78, 0x4F, 0x4A, 0xB7, 0xB1, 0x8B, 0x49, 0x59, 0xED, 0x6D, 0x70, 0x22, 0x81, 0xB1, \n    0x1C, 0x31, 0xFB, 0x08, 0xE3, 0x0A, 0x9B, 0x7D, 0x88, 0x35, 0x0F, 0xED, 0x0D, 0xFF, 0x00, 0x04, \n    0xDA, 0xF8, 0x4F, 0xFB, 0x4F, 0x78, 0x1A, 0x4D, 0x27, 0x56, 0xF0, 0xBE, 0x9F, 0xA4, 0xDE, 0xC6, \n    0xAC, 0x6C, 0xB5, 0x5D, 0x2A, 0x05, 0xB4, 0xBC, 0xB1, 0x72, 0x31, 0xB8, 0x15, 0x00, 0x3A, 0xFA, \n    0xA3, 0x86, 0x53, 0xD7, 0x19, 0x00, 0x8F, 0x58, 0xD2, 0xEE, 0x15, 0x40, 0xE6, 0xB7, 0x2C, 0xF5, \n    0x38, 0xE3, 0xEE, 0x2B, 0xE8, 0x25, 0x94, 0xE0, 0x65, 0x49, 0xD1, 0x95, 0x28, 0xB8, 0xB5, 0x6B, \n    0x59, 0x7F, 0x5F, 0xE4, 0x7A, 0x8F, 0x05, 0x86, 0x70, 0xE4, 0x70, 0x56, 0xF4, 0x3F, 0x9F, 0x6F, \n    0xDA, 0xF7, 0xFE, 0x09, 0xE5, 0xF1, 0x23, 0xF6, 0x3E, 0xF8, 0x99, 0x36, 0x87, 0xAB, 0x68, 0xB7, \n    0xDA, 0xC6, 0x97, 0x31, 0x32, 0x69, 0x9A, 0xD6, 0x9F, 0x69, 0x24, 0x96, 0x7A, 0x94, 0x59, 0xE0, \n    0xE4, 0x03, 0xE5, 0xC8, 0x3A, 0x3C, 0x4C, 0x77, 0x29, 0xE4, 0x6E, 0x52, 0xAE, 0xDC, 0x67, 0x83, \n    0xBF, 0x65, 0x4F, 0x88, 0x9E, 0x3B, 0x69, 0x3E, 0xC1, 0xE1, 0x3D, 0x59, 0x16, 0x35, 0x0C, 0x64, \n    0xBC, 0x8C, 0x59, 0xA1, 0x07, 0xD1, 0xA6, 0x2A, 0x1B, 0xE8, 0xB9, 0x35, 0xFD, 0x1F, 0x6B, 0x53, \n    0x69, 0x3E, 0x22, 0xD2, 0xA4, 0xB1, 0xD5, 0x2C, 0xEC, 0x75, 0x2B, 0x19, 0x86, 0x24, 0xB7, 0xBB, \n    0x85, 0x26, 0x86, 0x4F, 0xAA, 0x30, 0x20, 0xFE, 0x22, 0xB9, 0x6B, 0x1F, 0x0A, 0x78, 0x27, 0xC0, \n    0xD2, 0x79, 0xDA, 0x5F, 0x86, 0xFC, 0x3F, 0xA7, 0xCC, 0x3A, 0x49, 0x05, 0x8C, 0x4A, 0xEB, 0xF4, \n    0x60, 0x32, 0x3F, 0x0A, 0xFC, 0xDF, 0x15, 0xE1, 0xCD, 0x1F, 0x6E, 0xE5, 0x4A, 0xB5, 0xA9, 0xBE, \n    0x8F, 0x75, 0xE5, 0x7E, 0xBF, 0x87, 0xEA, 0x7C, 0x9D, 0x6E, 0x15, 0xA7, 0xED, 0x2F, 0x0A, 0x96, \n    0x8F, 0x6E, 0xAB, 0xFC, 0xCF, 0xC6, 0x2F, 0x84, 0xBF, 0xF0, 0x47, 0x7F, 0x88, 0x7F, 0x10, 0xCD, \n    0xBC, 0x97, 0x52, 0xAC, 0x36, 0xF7, 0x00, 0x15, 0x7B, 0x2B, 0x59, 0x27, 0x4C, 0xF7, 0x56, 0x95, \n    0xFC, 0xB8, 0xD7, 0x1E, 0xBB, 0x88, 0xCF, 0xAD, 0x7D, 0x23, 0xF0, 0xD7, 0xFE, 0x08, 0x6F, 0xA2, \n    0x68, 0xB0, 0xC7, 0x37, 0x88, 0x26, 0x59, 0x1F, 0x78, 0x2D, 0xF6, 0xCB, 0xB6, 0x9A, 0x44, 0x23, \n    0xB8, 0x8E, 0x1D, 0x91, 0x95, 0x3E, 0x8C, 0xE7, 0xDE, 0xBE, 0xFA, 0xF1, 0x37, 0xC5, 0x68, 0x60, \n    0x0D, 0xFB, 0xC5, 0xFC, 0xFA, 0x57, 0x9C, 0x78, 0xAF, 0xE3, 0x24, 0x6B, 0xBB, 0xF7, 0x9F, 0xAD, \n    0x7A, 0x18, 0x7E, 0x0F, 0xCA, 0x70, 0xDA, 0xD4, 0xBC, 0xDF, 0x9E, 0xDF, 0x77, 0xFC, 0x13, 0xAA, \n    0x96, 0x45, 0x81, 0xA5, 0xF1, 0xFB, 0xCC, 0xF3, 0x9F, 0x0A, 0xFE, 0xC1, 0xDF, 0x0D, 0xFE, 0x19, \n    0xDA, 0x49, 0x1A, 0x5A, 0x79, 0xCB, 0x21, 0xCB, 0xC5, 0x02, 0x2D, 0x94, 0x2E, 0x47, 0x7D, 0xB1, \n    0x00, 0xD9, 0xFA, 0xB9, 0xAE, 0x82, 0x1D, 0x23, 0xC3, 0x5E, 0x02, 0x19, 0xD1, 0xF4, 0x9D, 0x33, \n    0x4F, 0x91, 0x53, 0x67, 0x9B, 0x0C, 0x0A, 0x25, 0x65, 0xF4, 0x2F, 0xF7, 0x9B, 0xF1, 0x26, 0xB9, \n    0x9F, 0x15, 0xFC, 0x65, 0x04, 0x37, 0xEF, 0x47, 0xE7, 0x5E, 0x67, 0xE2, 0x9F, 0x8C, 0x41, 0x8B, \n    0x6D, 0x91, 0x9F, 0x9C, 0x00, 0xBC, 0xE6, 0xBD, 0x48, 0xE2, 0xB0, 0x58, 0x55, 0x6A, 0x30, 0x51, \n    0xFC, 0xFE, 0xFD, 0xCE, 0xCF, 0x6D, 0x87, 0xA2, 0xAD, 0x4E, 0x29, 0x1E, 0x99, 0xE2, 0x4F, 0x88, \n    0x31, 0xA1, 0x6F, 0x9F, 0xF5, 0xAF, 0xCF, 0x7F, 0xF8, 0x2A, 0x96, 0x91, 0xA7, 0xDC, 0x7C, 0x43, \n    0xF0, 0xDF, 0x88, 0x2D, 0x95, 0x56, 0xF3, 0x56, 0xB5, 0x9A, 0xDA, 0xEB, 0x6A, 0x80, 0x24, 0xF2, \n    0x0A, 0x6C, 0x73, 0xEA, 0xD8, 0x97, 0x6E, 0x4F, 0x64, 0x51, 0xDA, 0xBE, 0xB0, 0xB0, 0xF0, 0x0F, \n    0xC4, 0x4F, 0x88, 0x8A, 0x64, 0xD1, 0xFC, 0x29, 0xAB, 0x49, 0x0B, 0x7D, 0xC9, 0xEE, 0x57, 0xEC, \n    0xD0, 0xBF, 0xD1, 0xE4, 0x2A, 0xAD, 0xF8, 0x35, 0x4F, 0xAE, 0x7F, 0xC1, 0x32, 0xF5, 0x6F, 0x8A, \n    0xD7, 0xB6, 0x97, 0x3E, 0x36, 0xD4, 0xB4, 0x28, 0x57, 0x4F, 0x46, 0x36, 0xB1, 0xC5, 0x0B, 0xDE, \n    0x34, 0x6C, 0xFB, 0x77, 0x86, 0x53, 0xB1, 0x7F, 0x85, 0x79, 0xCB, 0x74, 0xE3, 0xDF, 0xCB, 0xCE, \n    0x30, 0xF8, 0x9C, 0xDB, 0x0A, 0xF0, 0xF4, 0x60, 0xDD, 0xDA, 0x69, 0xB5, 0x64, 0xAC, 0xFB, 0xBF, \n    0x2B, 0x9C, 0x78, 0xFA, 0x75, 0xB1, 0xB4, 0x5D, 0x28, 0x47, 0x7B, 0x59, 0xF4, 0xFB, 0xFD, 0x0F, \n    0xC9, 0xEA, 0x2B, 0xF6, 0x23, 0x46, 0xFF, 0x00, 0x82, 0x6F, 0xFC, 0x34, 0xF0, 0xF5, 0xA8, 0x8A, \n    0xFB, 0x4F, 0xBA, 0xD6, 0x97, 0xCB, 0xD8, 0xF1, 0x4F, 0x39, 0x82, 0x02, 0x7B, 0x90, 0x90, 0xEC, \n    0x20, 0x7B, 0x16, 0x3F, 0x8D, 0x7C, 0x51, 0xFF, 0x00, 0x05, 0x27, 0xFD, 0x86, 0x34, 0x6F, 0xD9, \n    0xB2, 0x3D, 0x2F, 0xC5, 0x1E, 0x13, 0x69, 0xA0, 0xF0, 0xFE, 0xAD, 0x74, 0x6C, 0x6E, 0x2C, 0x67, \n    0x94, 0xCA, 0x6C, 0xEE, 0x0A, 0xB3, 0xA7, 0x96, 0xC7, 0xE6, 0x31, 0xB2, 0xA3, 0xF0, 0xC4, 0x95, \n    0x29, 0xD4, 0x86, 0x01, 0x7E, 0x1B, 0x35, 0xE0, 0x9C, 0x76, 0x07, 0x0C, 0xF1, 0x53, 0x6A, 0x51, \n    0x5B, 0xA5, 0xBA, 0xF3, 0xFF, 0x00, 0x86, 0x67, 0xCE, 0xE3, 0x38, 0x7F, 0x13, 0x87, 0xA3, 0xED, \n    0x9D, 0x9A, 0x5B, 0xF7, 0x47, 0xC9, 0xD4, 0x51, 0x45, 0x7C, 0x71, 0xE0, 0x85, 0x14, 0x51, 0x40, \n    0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, \n    0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, \n    0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x1F, 0x4E, 0x7F, 0xC1, 0x30, 0x8E, 0x3E, 0x2A, \n    0xDD, 0x7F, 0xD7, 0xD6, 0x9F, 0xFF, 0x00, 0xA3, 0x9A, 0xBF, 0x52, 0x74, 0xDB, 0x81, 0x18, 0x5A, \n    0xFC, 0xB5, 0xFF, 0x00, 0x82, 0x62, 0xB6, 0xDF, 0x8A, 0x57, 0x87, 0xD2, 0xE6, 0xC3, 0xFF, 0x00, \n    0x47, 0x35, 0x7E, 0x95, 0xDC, 0x6B, 0x02, 0xD6, 0x2F, 0xBD, 0x8C, 0x57, 0xEE, 0x5C, 0x09, 0x2E, \n    0x5C, 0xAA, 0x2D, 0xF7, 0x7F, 0x9B, 0x3F, 0x44, 0xE1, 0xB7, 0x6C, 0x12, 0xF5, 0x7F, 0x99, 0xDD, \n    0x5A, 0x6B, 0xC9, 0x07, 0xF1, 0x7E, 0xB5, 0xA3, 0x07, 0x8E, 0x23, 0xB6, 0x1F, 0x7D, 0x7F, 0x3A, \n    0xF1, 0x0D, 0x73, 0xE2, 0x38, 0xB2, 0xDD, 0x87, 0xAE, 0x53, 0x55, 0xF8, 0xDF, 0x15, 0xA3, 0x36, \n    0xEB, 0x85, 0x04, 0x1C, 0x60, 0x1C, 0x9F, 0xC8, 0x57, 0xD0, 0x57, 0xCD, 0x23, 0x07, 0x63, 0xD4, \n    0xA9, 0x8C, 0x51, 0x76, 0x47, 0xD4, 0x27, 0xE2, 0x9C, 0x36, 0xEB, 0xFE, 0xB3, 0xF5, 0xAA, 0xB7, \n    0x7F, 0x1B, 0x23, 0x88, 0x71, 0x2F, 0xEB, 0x5F, 0x30, 0xE8, 0xDE, 0x3E, 0xD7, 0xBC, 0x73, 0x2E, \n    0xCD, 0x0B, 0x47, 0xD5, 0xB5, 0x6F, 0x9C, 0x46, 0x5E, 0x08, 0x19, 0xA3, 0x52, 0x7D, 0x58, 0x02, \n    0x17, 0xF1, 0xC5, 0x77, 0x7E, 0x1E, 0xFD, 0x9B, 0xFE, 0x24, 0x78, 0xB2, 0x37, 0x92, 0xFA, 0x5D, \n    0x2B, 0xC3, 0xF0, 0xAB, 0x81, 0xB6, 0x79, 0xFC, 0xE9, 0x58, 0x77, 0x20, 0x47, 0xBD, 0x78, 0xF7, \n    0x2A, 0x7F, 0x9D, 0x71, 0xFD, 0x7F, 0x13, 0x5B, 0xF8, 0x30, 0x6F, 0xD1, 0x7E, 0xA6, 0x1F, 0x59, \n    0xAB, 0x3F, 0x82, 0x2D, 0x9E, 0x93, 0xAA, 0x7C, 0x7B, 0xD8, 0x1B, 0x12, 0xFE, 0xB5, 0xC7, 0xEB, \n    0xFF, 0x00, 0xB4, 0x27, 0x9C, 0x4A, 0xAD, 0xC6, 0xF3, 0xE8, 0xA7, 0x35, 0xA3, 0xA3, 0xFE, 0xCA, \n    0xFE, 0x1D, 0xD2, 0x2E, 0x55, 0xB5, 0xED, 0x77, 0x55, 0xD6, 0x99, 0x0F, 0x0A, 0xB8, 0xB6, 0x88, \n    0x9E, 0xFC, 0x7C, 0xCD, 0xF9, 0x30, 0xAF, 0x5A, 0xF0, 0x47, 0x85, 0xBC, 0x17, 0xE0, 0xAD, 0x3A, \n    0x39, 0x34, 0x9F, 0x0E, 0xE9, 0x96, 0xF7, 0x16, 0xC7, 0xF7, 0x77, 0x4D, 0x17, 0x9D, 0x3A, 0x31, \n    0x07, 0x91, 0x2B, 0xEE, 0x70, 0x4E, 0x0F, 0xF1, 0x7A, 0xD7, 0x7D, 0x1C, 0x87, 0x36, 0xC4, 0x59, \n    0xCA, 0xD0, 0x4F, 0xBB, 0xBB, 0xFB, 0x96, 0x9F, 0x89, 0xBC, 0x32, 0xFC, 0x65, 0x5D, 0x5D, 0xA2, \n    0xBE, 0xFF, 0x00, 0xCB, 0xFC, 0xCF, 0x9F, 0x2D, 0xEF, 0xFC, 0x4D, 0xE3, 0xA4, 0x57, 0xD3, 0xF4, \n    0xCB, 0xE9, 0xA1, 0x99, 0x8A, 0x24, 0xC6, 0x32, 0xB1, 0x13, 0xDF, 0xE7, 0x38, 0x5F, 0xD6, 0xBA, \n    0x0D, 0x0F, 0xF6, 0x5B, 0xD7, 0xBC, 0x4D, 0x74, 0x91, 0xEB, 0x1E, 0x20, 0xD2, 0x74, 0x56, 0x98, \n    0x7C, 0x96, 0xFE, 0x61, 0xB8, 0xB9, 0x6F, 0x70, 0x8B, 0x80, 0x47, 0xB8, 0x7A, 0xF5, 0xEB, 0x9B, \n    0x5B, 0x8F, 0x88, 0xBE, 0x23, 0x8F, 0x48, 0xB1, 0x79, 0x05, 0xC6, 0xA1, 0xBA, 0x14, 0x68, 0xCF, \n    0xCC, 0x9F, 0x29, 0x25, 0x87, 0xB8, 0x00, 0x9F, 0xC2, 0xBD, 0x6B, 0xFE, 0x09, 0xD7, 0xFB, 0x19, \n    0x2D, 0xB7, 0xC4, 0x8D, 0x56, 0xD7, 0x59, 0xB0, 0x30, 0xD8, 0xE9, 0xA8, 0x2E, 0x56, 0xE4, 0x03, \n    0xBA, 0x76, 0x2F, 0x80, 0x8C, 0x0F, 0x73, 0xC9, 0xCE, 0x7A, 0x0E, 0x95, 0xCB, 0xC5, 0x39, 0x7E, \n    0x03, 0x20, 0xA5, 0x4E, 0xA6, 0x3E, 0x73, 0xAB, 0x29, 0xAF, 0x85, 0x35, 0x15, 0xF7, 0x6A, 0xED, \n    0xE7, 0x7F, 0xBC, 0xE7, 0xCD, 0xA8, 0x61, 0xB2, 0xE8, 0x46, 0x78, 0x99, 0x4A, 0x6E, 0x5D, 0x15, \n    0x97, 0xFC, 0x1F, 0xC4, 0xF9, 0x81, 0xBF, 0x65, 0x0F, 0x07, 0xF8, 0x52, 0xFD, 0x53, 0x55, 0x9B, \n    0x54, 0xD6, 0xAE, 0x23, 0x05, 0x24, 0x49, 0xA4, 0xFB, 0x3C, 0x45, 0xBD, 0x76, 0xA7, 0xCE, 0xA4, \n    0x7A, 0x17, 0x3E, 0xF9, 0xAF, 0x5B, 0xF8, 0x41, 0xF0, 0xBB, 0x40, 0xD2, 0x74, 0x49, 0xAF, 0xBC, \n    0x39, 0xE1, 0xED, 0x36, 0x38, 0xF4, 0x86, 0x11, 0x4F, 0x77, 0x6B, 0x6E, 0xB2, 0x4D, 0x6A, 0x5B, \n    0x20, 0x09, 0xA4, 0x19, 0x75, 0x2D, 0xB5, 0xB1, 0xBC, 0xFC, 0xC0, 0x71, 0x91, 0x5F, 0x73, 0x7E, \n    0xD7, 0xFF, 0x00, 0xB3, 0x07, 0x87, 0x3E, 0x27, 0x69, 0x3A, 0x0D, 0xD5, 0xAE, 0x8F, 0x63, 0x65, \n    0xA9, 0x68, 0xF7, 0x01, 0x64, 0xB8, 0x82, 0x32, 0xB3, 0x5E, 0xDB, 0x88, 0x9F, 0x31, 0x39, 0x07, \n    0xE6, 0xF9, 0x84, 0x64, 0x16, 0x04, 0xA8, 0x56, 0x0A, 0x40, 0x63, 0x5F, 0x32, 0xFE, 0xCF, 0xDF, \n    0xB1, 0x8E, 0xB1, 0xA8, 0x7E, 0xD5, 0x8B, 0xE2, 0xCF, 0xB6, 0xEA, 0x1A, 0x2E, 0x83, 0xA0, 0xE4, \n    0xDE, 0x0B, 0x69, 0x1A, 0x1F, 0xED, 0x62, 0x4E, 0x56, 0xCD, 0xB1, 0xC3, 0xC6, 0xCC, 0xA1, 0xA4, \n    0x52, 0x08, 0xDA, 0x98, 0xF9, 0x59, 0x91, 0x87, 0x8D, 0x2E, 0x38, 0xC8, 0x68, 0x60, 0x29, 0xD6, \n    0xC1, 0xE1, 0xED, 0x56, 0xF6, 0x94, 0x5E, 0xAD, 0x79, 0xF3, 0x3D, 0x5E, 0xDA, 0x1C, 0x3F, 0xEB, \n    0x0E, 0x5D, 0x4F, 0x0D, 0x1A, 0x94, 0x69, 0xDA, 0x7D, 0x57, 0x5F, 0xBC, 0xE2, 0xB5, 0x42, 0xAC, \n    0x1A, 0xB9, 0xAD, 0x5A, 0x3E, 0xB5, 0xEF, 0xDF, 0xB6, 0xCF, 0xC2, 0x1F, 0x0A, 0xFC, 0x18, 0xF0, \n    0xAA, 0xF8, 0xA2, 0xD2, 0xEA, 0xFE, 0xC6, 0x5B, 0xCB, 0xB5, 0xB7, 0xFB, 0x18, 0x22, 0x4B, 0x72, \n    0x4A, 0xB3, 0xB3, 0x01, 0x8D, 0xEB, 0x80, 0xA7, 0x80, 0x5B, 0x24, 0x81, 0x81, 0xD6, 0xBE, 0x75, \n    0xB4, 0xF1, 0x0D, 0x9F, 0x89, 0xF4, 0xA4, 0xBC, 0xB1, 0xB8, 0x8E, 0xEA, 0xDE, 0x4F, 0xE3, 0x43, \n    0x9C, 0x1E, 0xE0, 0x8E, 0xA0, 0x8E, 0xE0, 0xE0, 0x8E, 0xF5, 0xF5, 0x79, 0x4E, 0x71, 0x86, 0xCC, \n    0xB0, 0xEB, 0x11, 0x87, 0x7B, 0xF4, 0x7B, 0xAB, 0x7F, 0x5B, 0x9E, 0xE6, 0x0B, 0x1F, 0x4B, 0x17, \n    0x49, 0x55, 0xA5, 0xF7, 0x3D, 0xCC, 0x3D, 0x61, 0x7E, 0x66, 0xAF, 0x8A, 0x3F, 0xE0, 0xB3, 0x63, \n    0x1F, 0xB3, 0x2E, 0x8B, 0xFF, 0x00, 0x63, 0x3D, 0xBF, 0xFE, 0x92, 0xDD, 0xD7, 0xDB, 0x1A, 0xC1, \n    0xF9, 0x9A, 0xBE, 0x28, 0xFF, 0x00, 0x82, 0xCE, 0x9C, 0xFE, 0xCC, 0xBA, 0x27, 0xFD, 0x8C, 0xF6, \n    0xFF, 0x00, 0xFA, 0x4B, 0x77, 0x5E, 0x77, 0x16, 0x7F, 0xC8, 0xA6, 0xBF, 0xF8, 0x4E, 0x5C, 0xEB, \n    0xFD, 0xC6, 0xA7, 0xA1, 0xF9, 0x97, 0x45, 0x14, 0x57, 0xF3, 0x99, 0xF9, 0x58, 0x51, 0x45, 0x14, \n    0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, \n    0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, \n    0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x01, 0xF4, 0xC7, 0xFC, 0x13, 0x31, 0xB6, 0xFC, \n    0x4C, 0xBE, 0x3E, 0x97, 0x16, 0x3F, 0xFA, 0x35, 0xAB, 0xF4, 0x13, 0xC4, 0xBA, 0x99, 0x8A, 0xD9, \n    0xB9, 0xAF, 0xCF, 0x9F, 0xF8, 0x26, 0x93, 0x6D, 0xF8, 0x8D, 0xA8, 0x9F, 0x49, 0xAC, 0x7F, 0xF4, \n    0x6B, 0x57, 0xDD, 0xDE, 0x2F, 0xBA, 0xFF, 0x00, 0x46, 0x6E, 0x7B, 0x57, 0xED, 0x1C, 0x1D, 0x2B, \n    0x65, 0x0B, 0xD5, 0xFE, 0x6C, 0xFB, 0xEC, 0x85, 0xDB, 0x02, 0xBD, 0x5F, 0xE6, 0x71, 0x37, 0xDE, \n    0x36, 0x8F, 0x44, 0xF1, 0x3D, 0xA5, 0xD5, 0xD5, 0xB2, 0x5F, 0x5B, 0xDB, 0x4C, 0xB2, 0x3D, 0xBB, \n    0x9F, 0x96, 0x60, 0x0E, 0x76, 0x9F, 0x51, 0xED, 0xDF, 0xA5, 0x7D, 0x0D, 0xE1, 0x4F, 0x87, 0x3E, \n    0x13, 0xD6, 0x67, 0x87, 0x5E, 0x8B, 0xC3, 0xBA, 0x72, 0xCD, 0xA9, 0x46, 0x97, 0x00, 0x4D, 0x10, \n    0x97, 0xCA, 0xDC, 0xA0, 0xFC, 0xA1, 0xB2, 0x01, 0x19, 0xEA, 0x06, 0x7D, 0xEB, 0xE4, 0xBF, 0x16, \n    0xCF, 0xBE, 0xFC, 0x2F, 0xB9, 0xAF, 0xAF, 0xBE, 0x19, 0xDC, 0x63, 0xC1, 0x7A, 0x38, 0xCF, 0xFC, \n    0xB9, 0x43, 0xFF, 0x00, 0xA2, 0xD6, 0xBD, 0xBC, 0x96, 0x94, 0x2A, 0x56, 0x9D, 0x49, 0xAB, 0xB4, \n    0x7A, 0x39, 0x7C, 0x23, 0x29, 0xCA, 0x52, 0xDC, 0xF4, 0x8D, 0x1A, 0x45, 0x82, 0x28, 0xD1, 0x42, \n    0xAC, 0x68, 0x30, 0xAA, 0xA3, 0x01, 0x47, 0xA0, 0x15, 0xB5, 0x3D, 0xD7, 0xFA, 0x03, 0x61, 0x87, \n    0x4F, 0x5A, 0xF3, 0xFD, 0x4B, 0xC5, 0x2B, 0xA4, 0x5B, 0x6E, 0xDD, 0xFA, 0xD7, 0x2F, 0x7D, 0xF1, \n    0xB1, 0x62, 0x76, 0x8C, 0x4D, 0xED, 0xD2, 0xBE, 0xDF, 0x0D, 0x42, 0x53, 0x7E, 0xE9, 0xEE, 0xD3, \n    0x8B, 0x7B, 0x1A, 0xBE, 0x29, 0xBE, 0x8A, 0x6D, 0x7E, 0xDD, 0x6E, 0xEF, 0x3E, 0xC5, 0x6A, 0xF2, \n    0x05, 0x96, 0x72, 0x86, 0x41, 0x0A, 0xE7, 0x05, 0xB6, 0x8E, 0x4E, 0x2B, 0xED, 0x5F, 0x80, 0xFF, \n    0x00, 0x0F, 0xFC, 0x1F, 0xE1, 0xAF, 0x86, 0x66, 0xE3, 0x54, 0xFB, 0x0C, 0xDE, 0x17, 0x92, 0x20, \n    0xD3, 0x4D, 0x29, 0x13, 0x0B, 0xEC, 0x8E, 0x08, 0x23, 0xEF, 0x31, 0xED, 0xB7, 0xA1, 0xC6, 0x31, \n    0x8E, 0x3F, 0x3C, 0xDF, 0x5E, 0xB8, 0xF1, 0xBE, 0xBD, 0x6B, 0x63, 0x63, 0x1B, 0x5C, 0x5D, 0x5D, \n    0xCA, 0xB1, 0xC5, 0x18, 0xC6, 0x5D, 0x89, 0xC0, 0xEB, 0xC6, 0x3D, 0xCF, 0x00, 0x7B, 0x57, 0xDC, \n    0xDA, 0x17, 0xC3, 0xAD, 0x37, 0x55, 0xFD, 0x9C, 0xEE, 0x61, 0xD2, 0x75, 0x08, 0x5F, 0x52, 0xF0, \n    0xF5, 0xC2, 0xCD, 0x7D, 0xA6, 0xAC, 0xA7, 0x74, 0x28, 0xF8, 0x43, 0x2A, 0xA7, 0xF1, 0x26, 0xF2, \n    0x8B, 0xBC, 0x0F, 0xE3, 0x00, 0xE0, 0x9C, 0x57, 0xCC, 0x78, 0xA5, 0x98, 0x63, 0xB0, 0x79, 0x75, \n    0x15, 0x86, 0x9F, 0x2C, 0x5B, 0xD6, 0xDA, 0x3B, 0xAD, 0x53, 0xB9, 0xE2, 0xF1, 0x6E, 0x2B, 0x11, \n    0x47, 0x0B, 0x0F, 0x62, 0xEC, 0x9B, 0xD6, 0xDB, 0x9C, 0x8E, 0xA7, 0xA6, 0x5A, 0xFC, 0x0D, 0xF1, \n    0xD4, 0xBE, 0x3E, 0xF0, 0x15, 0x95, 0xC5, 0xFD, 0x9D, 0x84, 0xB2, 0x49, 0x6D, 0xA7, 0xDE, 0xFF, \n    0x00, 0xA5, 0x35, 0x9C, 0x6E, 0x85, 0x1C, 0x38, 0x18, 0x67, 0x4D, 0xAC, 0xC3, 0x70, 0x3B, 0x95, \n    0x58, 0x64, 0xE4, 0x6F, 0x3F, 0x74, 0x7E, 0xCE, 0xFE, 0x3F, 0x83, 0xE2, 0x2F, 0x80, 0x6C, 0x75, \n    0xA3, 0xE1, 0x0D, 0x4B, 0xC1, 0x7A, 0x8E, 0xA1, 0xFF, 0x00, 0x1F, 0x9A, 0x7D, 0xF3, 0x23, 0xC8, \n    0xA5, 0x73, 0xB5, 0x95, 0x97, 0xE6, 0xD8, 0x77, 0x1E, 0x24, 0x54, 0x7C, 0x83, 0xF2, 0xE3, 0x6B, \n    0x1F, 0xCF, 0xFF, 0x00, 0x87, 0x1F, 0x13, 0xE4, 0xF0, 0xA7, 0x8A, 0x7E, 0xC7, 0x70, 0xCC, 0x9F, \n    0x3E, 0x39, 0x3D, 0x79, 0xFF, 0x00, 0x3E, 0xDF, 0x5A, 0xFB, 0x9B, 0xF6, 0x77, 0xF1, 0x19, 0xF1, \n    0x25, 0x84, 0x3E, 0x58, 0xDD, 0xF2, 0x8A, 0xFC, 0x2B, 0x3C, 0xE2, 0x4C, 0x76, 0x6F, 0xEC, 0xE5, \n    0x8F, 0x97, 0x34, 0xA0, 0xB9, 0x53, 0xEB, 0x6F, 0x3E, 0xE7, 0xE7, 0xF9, 0x86, 0x6B, 0x88, 0xC6, \n    0xF2, 0xBC, 0x43, 0xBB, 0x8A, 0xB2, 0x7D, 0x7E, 0x7D, 0xCE, 0xBB, 0xE3, 0x97, 0xC3, 0x7D, 0x27, \n    0xE3, 0x0F, 0x81, 0xEE, 0xBC, 0x3B, 0xAE, 0x47, 0x75, 0x2E, 0x9B, 0x75, 0x2C, 0x13, 0xB8, 0xB6, \n    0xBD, 0x96, 0xCE, 0x74, 0x78, 0x66, 0x8E, 0x78, 0xD9, 0x26, 0x85, 0x96, 0x48, 0xD9, 0x64, 0x8D, \n    0x0E, 0xE4, 0x60, 0x78, 0xEB, 0xCD, 0x53, 0xB5, 0xB3, 0x87, 0x42, 0xD3, 0x23, 0xB5, 0xB7, 0x56, \n    0x58, 0x61, 0x5C, 0x6E, 0x77, 0x32, 0x3B, 0x9C, 0x63, 0x73, 0xBB, 0x12, 0xCC, 0xC7, 0x8C, 0xB3, \n    0x12, 0x4E, 0x06, 0x49, 0xAE, 0xCB, 0x58, 0xF0, 0xCD, 0xE5, 0xDC, 0x9B, 0x96, 0x36, 0x6C, 0x7B, \n    0x1A, 0xE2, 0xFC, 0x5C, 0x64, 0xF0, 0xD5, 0xBC, 0x92, 0xDC, 0xAF, 0x96, 0xAB, 0x92, 0x58, 0xF1, \n    0x5E, 0x15, 0xF4, 0xB1, 0xE6, 0x9E, 0x1B, 0xFB, 0x5C, 0x7C, 0x2E, 0xBE, 0xF8, 0xCD, 0x25, 0xBE, \n    0x9A, 0xF6, 0xD0, 0xC7, 0xA7, 0xDA, 0xDA, 0x19, 0x6D, 0xEF, 0x9E, 0xE5, 0x76, 0x2C, 0xCC, 0xE4, \n    0x48, 0x8E, 0x9D, 0x46, 0x11, 0x62, 0x65, 0x65, 0xDD, 0xBB, 0xF7, 0x80, 0x85, 0x21, 0x3C, 0xCF, \n    0x9A, 0x7C, 0x2F, 0xFB, 0x28, 0x78, 0x3F, 0xE0, 0x9D, 0x96, 0xB1, 0x1F, 0xDB, 0x2F, 0xB5, 0x2F, \n    0x10, 0x6B, 0x28, 0xA1, 0xEF, 0x5A, 0x67, 0x8E, 0xD6, 0xCD, 0x94, 0xEE, 0x02, 0x38, 0x01, 0xDA, \n    0xD9, 0x3F, 0x29, 0x79, 0x03, 0x36, 0x07, 0xCA, 0x23, 0xDC, 0xC0, 0xFB, 0x4F, 0xC7, 0x7F, 0xDA, \n    0x22, 0xDD, 0x6E, 0x25, 0xB5, 0xB7, 0x91, 0x4C, 0xA3, 0x23, 0xE4, 0x3D, 0x3B, 0x7F, 0x9F, 0xF1, \n    0xAF, 0x16, 0xF1, 0x7A, 0xEB, 0xBA, 0x97, 0x82, 0xA4, 0xD6, 0x96, 0xD5, 0xCD, 0x8B, 0x4C, 0xD0, \n    0x19, 0xF7, 0x0F, 0x94, 0x80, 0x09, 0xC0, 0xCE, 0x7A, 0x30, 0xE7, 0xA7, 0x26, 0xBD, 0x5C, 0x9E, \n    0xB6, 0x25, 0x62, 0xE9, 0xC3, 0x0D, 0x53, 0x91, 0xDD, 0x59, 0xB7, 0x64, 0xBC, 0xDF, 0xF9, 0x75, \n    0xD8, 0xED, 0xC0, 0xD4, 0xAA, 0xAB, 0x46, 0x34, 0xA5, 0xCA, 0xEF, 0xBD, 0xEC, 0xBF, 0xAF, 0xCC, \n    0xF3, 0x3F, 0x10, 0x2B, 0x5A, 0xDD, 0xCD, 0x13, 0xED, 0xDF, 0x13, 0x14, 0x6C, 0x1C, 0x8C, 0x83, \n    0x8E, 0x0D, 0x7C, 0x51, 0xFF, 0x00, 0x05, 0x99, 0x7D, 0xDF, 0xB3, 0x36, 0x89, 0xFF, 0x00, 0x63, \n    0x3D, 0xBF, 0xFE, 0x92, 0xDD, 0xD7, 0xD8, 0x77, 0xBA, 0x8C, 0x77, 0x51, 0x79, 0x91, 0xC8, 0xB2, \n    0x23, 0x64, 0x06, 0x53, 0x91, 0xC7, 0x07, 0xF2, 0x35, 0xF1, 0xB7, 0xFC, 0x16, 0x46, 0x5D, 0xFF, \n    0x00, 0xB3, 0x56, 0x8A, 0x3F, 0xEA, 0x66, 0xB7, 0xFF, 0x00, 0xD2, 0x5B, 0xBA, 0xFD, 0xD3, 0x8A, \n    0x2F, 0xFD, 0x8F, 0x5F, 0x5B, 0xFB, 0xBF, 0xE4, 0x7E, 0x8F, 0x9C, 0x7F, 0xB8, 0xD4, 0xF4, 0x3F, \n    0x35, 0x28, 0xA2, 0x8A, 0xFE, 0x75, 0x3F, 0x2B, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, \n    0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, \n    0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, \n    0x0A, 0x28, 0xA2, 0x80, 0x3E, 0x92, 0xFF, 0x00, 0x82, 0x6D, 0xBE, 0xCF, 0x88, 0x1A, 0x91, 0xFF, \n    0x00, 0xA6, 0xB6, 0x5F, 0xFA, 0x35, 0xAB, 0xEE, 0x0F, 0x16, 0xDD, 0x7E, 0xE1, 0xBE, 0x95, 0xF0, \n    0xDF, 0xFC, 0x13, 0x91, 0xF6, 0x78, 0xF7, 0x53, 0xFF, 0x00, 0xAE, 0x96, 0x7F, 0xFA, 0x31, 0xAB, \n    0xED, 0x3F, 0x17, 0x5C, 0xFE, 0xE1, 0xF9, 0xF5, 0xAF, 0xD9, 0x38, 0x43, 0xFE, 0x45, 0x0B, 0xD5, \n    0xFE, 0x6C, 0xFB, 0xDC, 0x8F, 0xFD, 0xC5, 0x7C, 0xFF, 0x00, 0x33, 0xCD, 0x3C, 0x41, 0x3E, 0xFD, \n    0x59, 0x47, 0xD7, 0xF9, 0x1A, 0xFA, 0xE3, 0xE1, 0xD5, 0xD6, 0x3C, 0x1D, 0xA4, 0x7B, 0x59, 0xC3, \n    0xFF, 0x00, 0xA0, 0x0A, 0xF8, 0xEF, 0x57, 0x9F, 0x76, 0xB6, 0x9F, 0x56, 0xFE, 0x46, 0xBE, 0xB0, \n    0xF0, 0x2D, 0xFF, 0x00, 0x91, 0xE0, 0xFD, 0x2D, 0xBD, 0x2C, 0xE2, 0xFF, 0x00, 0xD0, 0x05, 0x7D, \n    0x0E, 0x43, 0xF1, 0xD4, 0x3D, 0x3C, 0xB7, 0xE2, 0x91, 0xB9, 0xE3, 0x18, 0xE4, 0xBA, 0xB1, 0x62, \n    0xB9, 0x3C, 0x76, 0x3D, 0x2B, 0x37, 0xF6, 0x75, 0xF8, 0x6C, 0xDE, 0x26, 0xF1, 0xEC, 0xD3, 0x4D, \n    0x12, 0xDC, 0x44, 0x9F, 0xB9, 0x54, 0x75, 0xDC, 0xAC, 0x5B, 0xA8, 0x20, 0xFB, 0x7F, 0x33, 0x59, \n    0xDE, 0x29, 0xF8, 0x93, 0x15, 0x85, 0xBB, 0x29, 0x65, 0xFA, 0x9A, 0xE4, 0xBE, 0x1D, 0xFE, 0xD1, \n    0x1A, 0xEF, 0xC3, 0x0F, 0x89, 0x36, 0x3A, 0x97, 0x86, 0x42, 0x5D, 0x5E, 0x79, 0xCA, 0x3E, 0xC5, \n    0x24, 0x46, 0x68, 0x6F, 0x8E, 0xE1, 0x88, 0xD9, 0x01, 0x04, 0xE7, 0xA0, 0x2A, 0x43, 0x0C, 0xF0, \n    0x46, 0x6B, 0xEB, 0xEA, 0x7D, 0x66, 0x58, 0x4A, 0x90, 0xC2, 0xB4, 0xA6, 0xD3, 0xE5, 0x6F, 0x6B, \n    0xF4, 0x3D, 0x6A, 0x8E, 0xA7, 0xB2, 0x92, 0xA5, 0xF1, 0x5B, 0x4F, 0x53, 0xF4, 0xDF, 0xE0, 0xC7, \n    0xEC, 0xAF, 0xE1, 0xFF, 0x00, 0x84, 0x86, 0xD6, 0xE9, 0x24, 0x7F, 0x2E, 0xF6, 0x2F, 0x32, 0x7D, \n    0x32, 0x45, 0x59, 0x22, 0x4C, 0xF6, 0x04, 0xF2, 0x01, 0x1F, 0xC2, 0x73, 0x8F, 0x5C, 0x10, 0x07, \n    0x47, 0x67, 0xF0, 0x23, 0xC2, 0x7A, 0x07, 0x8C, 0x75, 0x2D, 0x63, 0x47, 0xB7, 0xBA, 0xB7, 0xFB, \n    0x74, 0x22, 0x28, 0x6D, 0xE7, 0xB8, 0xFB, 0x42, 0xD9, 0x13, 0x9F, 0x30, 0xC6, 0xC5, 0x43, 0x7C, \n    0xE3, 0x6A, 0x8C, 0x92, 0xC0, 0x07, 0x1B, 0x88, 0x7C, 0x0F, 0x38, 0xD3, 0xFF, 0x00, 0x69, 0xC5, \n    0xF1, 0x6E, 0xBA, 0xD6, 0xB7, 0x91, 0xFD, 0x97, 0x58, 0x65, 0x2D, 0x25, 0xBA, 0x39, 0x92, 0x30, \n    0x15, 0x72, 0x7C, 0xB6, 0xC7, 0x2A, 0xAA, 0x3B, 0x80, 0x40, 0x1D, 0x30, 0x33, 0x5B, 0x36, 0x9F, \n    0x1A, 0x6D, 0xA3, 0x9D, 0x56, 0x49, 0x82, 0xFB, 0x67, 0xF0, 0x3F, 0x95, 0x7F, 0x2F, 0xE6, 0x78, \n    0x9C, 0x73, 0xAA, 0xE8, 0x63, 0x67, 0x26, 0xE2, 0xED, 0x66, 0xEF, 0x66, 0x8F, 0xC9, 0x71, 0x95, \n    0xB1, 0x2E, 0x6E, 0x9E, 0x22, 0x4D, 0xB8, 0xF4, 0x6C, 0xE5, 0xFE, 0x2C, 0x7E, 0xC7, 0xDA, 0xC7, \n    0x8C, 0x35, 0x4F, 0xB6, 0x68, 0x2A, 0xCB, 0x34, 0x67, 0x7F, 0xCA, 0x3A, 0x81, 0xD7, 0xF4, 0xAE, \n    0xF3, 0xC1, 0xDF, 0xB5, 0xDC, 0x9F, 0xB3, 0xF7, 0xC3, 0xB8, 0xF4, 0x9D, 0x0F, 0x4F, 0xB3, 0xBA, \n    0xD7, 0xA3, 0x4D, 0xB3, 0xDE, 0xDD, 0x65, 0xE1, 0x81, 0x87, 0x1C, 0x28, 0x20, 0xBB, 0x75, 0xE4, \n    0x90, 0x07, 0x1F, 0x7B, 0x90, 0x36, 0xBE, 0x30, 0x7E, 0xD2, 0xD1, 0x78, 0x13, 0xE0, 0x58, 0xB3, \n    0xD1, 0xE5, 0x68, 0xF5, 0x7F, 0x12, 0x66, 0xDC, 0x5C, 0x2F, 0x0D, 0x6D, 0x00, 0x1F, 0xBD, 0x65, \n    0x3D, 0x98, 0xE5, 0x54, 0x1E, 0xA0, 0x39, 0x20, 0x82, 0x01, 0xAF, 0x8E, 0x3C, 0x69, 0xE3, 0xA8, \n    0xF4, 0xDB, 0x07, 0x1B, 0xFE, 0x62, 0x3A, 0x66, 0xBE, 0xEF, 0x81, 0xB8, 0x46, 0x8E, 0x36, 0x1F, \n    0x5E, 0xC6, 0xAE, 0x68, 0xDE, 0xD1, 0x8F, 0x47, 0x6D, 0xDB, 0xF2, 0xBE, 0x89, 0x79, 0x3B, 0xE8, \n    0x7D, 0x1F, 0x0E, 0xE4, 0x74, 0xEB, 0xC7, 0xEB, 0x38, 0x85, 0x78, 0xF4, 0x5D, 0xED, 0xD5, 0xFF, \n    0x00, 0x97, 0xDE, 0x74, 0xBF, 0x17, 0x3F, 0xE0, 0xA7, 0x3F, 0x1A, 0xF4, 0x7F, 0x11, 0xFF, 0x00, \n    0x68, 0x5A, 0xF8, 0xFE, 0xFE, 0xDE, 0x58, 0xA4, 0xDC, 0xB1, 0x47, 0x69, 0x6A, 0xB6, 0xF8, 0x18, \n    0xF9, 0x4C, 0x5E, 0x56, 0xC2, 0x3B, 0x72, 0xA7, 0x3D, 0xF3, 0xCD, 0x7D, 0x29, 0xE0, 0x6F, 0xDB, \n    0x73, 0x58, 0xFD, 0xA9, 0xFE, 0x1D, 0x5F, 0x78, 0x57, 0x56, 0xB0, 0x81, 0x7C, 0x71, 0x6B, 0x68, \n    0x2E, 0xED, 0xEE, 0xAD, 0x63, 0xF2, 0xA1, 0xD5, 0x6D, 0x9B, 0x00, 0x3E, 0xCE, 0x76, 0x48, 0xA5, \n    0x94, 0x30, 0x1C, 0x1D, 0xDB, 0x94, 0x00, 0x18, 0x0F, 0xCC, 0xCB, 0xE8, 0xB5, 0x1F, 0x8C, 0x5F, \n    0x12, 0x34, 0xAF, 0x0D, 0xE8, 0xB1, 0xBD, 0xD6, 0xA7, 0xAE, 0x5E, 0xC5, 0x63, 0x6B, 0x1A, 0x02, \n    0xDB, 0xA4, 0x91, 0xC2, 0x83, 0xEC, 0x01, 0x39, 0x27, 0xA0, 0x00, 0x9E, 0x82, 0xBF, 0x49, 0x3F, \n    0x67, 0x8F, 0x84, 0x51, 0x7C, 0x2D, 0xFD, 0xB4, 0x3C, 0x3B, 0x37, 0x96, 0xD1, 0xE9, 0x7A, 0x5D, \n    0x85, 0xE4, 0x12, 0x99, 0x3A, 0x18, 0xC5, 0x9C, 0xA8, 0x9B, 0xBF, 0xE0, 0x7E, 0x5F, 0xE3, 0x5F, \n    0x43, 0xE2, 0x76, 0x57, 0x96, 0x61, 0xB0, 0x14, 0x5D, 0x0A, 0x71, 0x85, 0x4B, 0xFD, 0x94, 0x95, \n    0xD7, 0x9D, 0xAD, 0x7F, 0x2F, 0x99, 0xE8, 0x71, 0x5E, 0x13, 0x09, 0x4F, 0x0D, 0x07, 0x4E, 0x2A, \n    0x32, 0xBF, 0x44, 0x96, 0x9F, 0x23, 0x8A, 0xF0, 0x17, 0xEC, 0x99, 0xAC, 0x6A, 0xBE, 0x21, 0x7B, \n    0xAD, 0x64, 0x49, 0xBB, 0xCC, 0xDC, 0x15, 0x87, 0x41, 0xFE, 0x7F, 0xA5, 0x7B, 0xF6, 0x85, 0xF0, \n    0x37, 0x4B, 0xB3, 0xF0, 0xE4, 0x9A, 0x6D, 0xE5, 0xAD, 0xBD, 0xC5, 0x9C, 0xC4, 0x19, 0x21, 0x90, \n    0x65, 0x58, 0x8E, 0x3F, 0xCF, 0xFF, 0x00, 0x5A, 0xB7, 0x3C, 0x7D, 0xF1, 0x97, 0x4A, 0xB0, 0xD5, \n    0xA7, 0x5B, 0x76, 0x8D, 0x42, 0xE7, 0xEE, 0xD7, 0x86, 0xFE, 0xD0, 0x5F, 0xB6, 0xB3, 0x7C, 0x34, \n    0x8A, 0x1B, 0x6D, 0x36, 0xCE, 0x2B, 0xED, 0x4A, 0xEE, 0x36, 0x91, 0x4C, 0xD2, 0x11, 0x14, 0x03, \n    0x38, 0x05, 0x94, 0x72, 0xD9, 0x21, 0xB8, 0x04, 0x74, 0xEB, 0x5F, 0x8E, 0x65, 0xF8, 0x1A, 0xF8, \n    0xCA, 0xF1, 0xC3, 0xE1, 0x95, 0xE4, 0xFE, 0x5F, 0x89, 0xF1, 0x18, 0x5C, 0x35, 0x4A, 0xF5, 0x15, \n    0x2A, 0x4A, 0xED, 0x9C, 0x0F, 0xFC, 0x14, 0x07, 0xE1, 0x3F, 0x85, 0x3E, 0x14, 0x68, 0x1E, 0x19, \n    0x6F, 0x0D, 0xE8, 0x3A, 0x4E, 0x8D, 0x26, 0xA1, 0x71, 0x72, 0xD7, 0x4F, 0x67, 0x6C, 0xB1, 0x35, \n    0xC1, 0x0B, 0x16, 0x37, 0x95, 0x19, 0x6C, 0x64, 0xF5, 0xF5, 0xAF, 0xCA, 0x9F, 0xF8, 0x2C, 0x1C, \n    0xDE, 0x67, 0xEC, 0xDD, 0xA3, 0x7F, 0xD8, 0xCB, 0x01, 0xFF, 0x00, 0xC9, 0x5B, 0xAA, 0xFB, 0x53, \n    0xE2, 0xCF, 0xC6, 0x7F, 0x10, 0xFC, 0x5B, 0xD5, 0x85, 0xD6, 0xBD, 0xA9, 0x4F, 0x7A, 0x63, 0xCF, \n    0x93, 0x11, 0x3B, 0x61, 0xB7, 0x07, 0xA8, 0x44, 0x18, 0x55, 0xEC, 0x33, 0x8C, 0x9C, 0x0C, 0x93, \n    0x8A, 0xF8, 0x83, 0xFE, 0x0A, 0xE9, 0x3F, 0x99, 0xFB, 0x39, 0x68, 0xE3, 0xFE, 0xA6, 0x38, 0x3F, \n    0xF4, 0x9A, 0xEA, 0xBF, 0x63, 0xC5, 0x65, 0xF5, 0xB0, 0x3C, 0x35, 0x53, 0x0B, 0x5E, 0x5C, 0xD2, \n    0x8C, 0x5D, 0xDA, 0xBF, 0x57, 0x7B, 0x6B, 0xD8, 0xFB, 0xBA, 0xD8, 0x69, 0xE1, 0xF2, 0x99, 0x51, \n    0xA8, 0xEE, 0xD2, 0x7F, 0x8B, 0x3F, 0x3A, 0x28, 0xA2, 0x8A, 0xFC, 0x3C, 0xFC, 0xF0, 0x28, 0xA2, \n    0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, \n    0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, \n    0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0xFA, 0x2B, 0xFE, 0x09, 0xDA, 0xDB, \n    0x7C, 0x75, 0xA9, 0xFF, 0x00, 0xD7, 0x4B, 0x3F, 0xFD, 0x18, 0xD5, 0xF6, 0x3F, 0x8B, 0xAE, 0x3F, \n    0x70, 0xDF, 0x4A, 0xF8, 0xD3, 0xFE, 0x09, 0xE8, 0xD8, 0xF1, 0xDE, 0xA5, 0xFF, 0x00, 0x5D, 0x2C, \n    0xFF, 0x00, 0xF4, 0x63, 0x57, 0xD8, 0x5E, 0x2F, 0xDD, 0xE5, 0x35, 0x7E, 0xC5, 0xC2, 0x1F, 0xF2, \n    0x28, 0x5E, 0xAF, 0xF3, 0x67, 0xDE, 0x64, 0x7F, 0xEE, 0x2B, 0xE7, 0xF9, 0x9E, 0x6B, 0xA8, 0xCF, \n    0x9D, 0x7E, 0x3F, 0x72, 0xDF, 0xC8, 0xD7, 0xD4, 0x5E, 0x19, 0xBA, 0x63, 0xE0, 0xCD, 0x3D, 0x57, \n    0xFE, 0x7D, 0x22, 0xFF, 0x00, 0xD0, 0x05, 0x7C, 0xAB, 0x7D, 0xB8, 0x6B, 0xD1, 0xE7, 0xD5, 0xBF, \n    0xF4, 0x13, 0x5F, 0x4E, 0x78, 0x3E, 0xEB, 0x3E, 0x19, 0xD3, 0x87, 0xFD, 0x3A, 0xC5, 0xFF, 0x00, \n    0xA0, 0x8A, 0xFA, 0x0C, 0x87, 0x49, 0xD4, 0x3D, 0x2C, 0xB7, 0xE2, 0x91, 0xC5, 0x7C, 0x42, 0xB2, \n    0xB8, 0x94, 0x34, 0x9B, 0x88, 0x8D, 0x14, 0xB1, 0x19, 0xEC, 0x2B, 0xE9, 0x0F, 0xF8, 0x27, 0x4A, \n    0xBE, 0x85, 0xA9, 0x58, 0xEA, 0x1E, 0x1F, 0xF0, 0x9D, 0xC5, 0xE5, 0xF5, 0xCE, 0x03, 0x6A, 0xDE, \n    0x47, 0x9A, 0xD1, 0x03, 0x85, 0x60, 0x65, 0xFB, 0xB0, 0xAF, 0x38, 0x3C, 0xA8, 0xE8, 0x4E, 0x7A, \n    0xD7, 0x8D, 0x78, 0xD5, 0xED, 0x8E, 0x93, 0x3C, 0x6F, 0xD6, 0x68, 0xD9, 0x32, 0x3A, 0x8C, 0x8C, \n    0x57, 0xB1, 0x7E, 0xC1, 0x5F, 0xB5, 0x57, 0x87, 0xBE, 0x03, 0xFC, 0x09, 0xD7, 0x74, 0x79, 0xB5, \n    0x6B, 0x77, 0xD7, 0xA4, 0xD4, 0x2D, 0xED, 0xED, 0xAC, 0x4F, 0xCB, 0x3D, 0xD0, 0x6D, 0xF8, 0x68, \n    0xD7, 0xF8, 0xF9, 0x01, 0x48, 0x5C, 0x90, 0x58, 0x64, 0x72, 0x33, 0x3C, 0x61, 0x8F, 0xCC, 0xA8, \n    0x60, 0xFF, 0x00, 0xD8, 0x13, 0xB3, 0xD2, 0x56, 0x57, 0x69, 0x7E, 0x7F, 0x33, 0x2C, 0xF3, 0x11, \n    0x8A, 0xA5, 0x47, 0xFD, 0x9F, 0xAE, 0x8E, 0xCA, 0xED, 0x1F, 0x62, 0xFC, 0x62, 0xF8, 0x5F, 0x6F, \n    0xF1, 0x57, 0x53, 0xB1, 0xD5, 0x2C, 0xF4, 0x7B, 0x5D, 0x07, 0x5E, 0x48, 0xD9, 0x2F, 0x75, 0x65, \n    0x9B, 0x61, 0xBB, 0x0C, 0x39, 0x0D, 0x10, 0x1B, 0x59, 0x86, 0x48, 0xDE, 0x7E, 0x62, 0x38, 0x39, \n    0x00, 0x63, 0x92, 0xB1, 0xF8, 0x2B, 0xE0, 0xEF, 0x0B, 0x5E, 0xC1, 0x37, 0x8A, 0x3C, 0x62, 0xF8, \n    0x52, 0xBB, 0x92, 0x26, 0x54, 0xDD, 0xEA, 0x32, 0x7D, 0x6B, 0xE7, 0xDF, 0xDA, 0x27, 0xF6, 0x9A, \n    0xF8, 0x91, 0xE1, 0xFB, 0x98, 0x61, 0xD4, 0x34, 0xAD, 0x57, 0xC3, 0xB0, 0x5F, 0xC6, 0x64, 0xB7, \n    0x6B, 0x88, 0x5A, 0x3F, 0x39, 0x3A, 0x65, 0x49, 0xE0, 0xE0, 0xF0, 0x71, 0xC8, 0xCF, 0x38, 0xAF, \n    0x1F, 0xF0, 0xDE, 0xBB, 0xAC, 0x78, 0xDF, 0xC4, 0x09, 0x35, 0xE5, 0xC5, 0xCD, 0xC1, 0x66, 0xC1, \n    0x2E, 0xF9, 0xE0, 0xE3, 0xFC, 0xFD, 0x4D, 0x7E, 0x05, 0x52, 0x52, 0x94, 0xAF, 0x2D, 0xCF, 0xCE, \n    0x25, 0x26, 0xDD, 0xD9, 0xF4, 0xE7, 0xED, 0xFD, 0xF1, 0x23, 0xC3, 0x9E, 0x0A, 0xF1, 0xAF, 0x87, \n    0x2D, 0xFC, 0x2E, 0xD7, 0x1F, 0xD9, 0x2F, 0xA1, 0x46, 0xEB, 0x24, 0xCE, 0xC4, 0x49, 0x2F, 0x9D, \n    0x30, 0x62, 0x09, 0xFF, 0x00, 0x64, 0x27, 0x4A, 0xF9, 0x17, 0xC7, 0x3F, 0x18, 0x64, 0xD5, 0xE4, \n    0x68, 0xE2, 0x66, 0x91, 0xE4, 0x3B, 0x40, 0x1D, 0x49, 0x3D, 0x80, 0xAF, 0xBB, 0xAE, 0x7F, 0x66, \n    0x2D, 0x03, 0xF6, 0xBD, 0xF8, 0x15, 0xA5, 0xE8, 0xBA, 0x85, 0xC7, 0xF6, 0x7F, 0x88, 0x7C, 0x3E, \n    0x5E, 0x6D, 0x3A, 0xE8, 0xCA, 0xC8, 0x8D, 0xBC, 0x00, 0xF1, 0x48, 0x46, 0x4F, 0x96, 0xFB, 0x53, \n    0xE6, 0x00, 0x95, 0x2A, 0x08, 0x07, 0x95, 0x6C, 0x3F, 0x83, 0x5F, 0xB1, 0xA6, 0xB1, 0xFB, 0x3F, \n    0x78, 0x9D, 0x2F, 0x34, 0xDF, 0x86, 0xF6, 0x7F, 0xDA, 0x76, 0xAE, 0x44, 0x5A, 0xAC, 0xDA, 0x95, \n    0xBD, 0xD3, 0x7A, 0x79, 0x91, 0xBC, 0x92, 0x9F, 0x2F, 0x23, 0xFB, 0xA1, 0x0E, 0x0E, 0x08, 0x1C, \n    0x8A, 0xFD, 0xB7, 0x85, 0x38, 0xCF, 0x2B, 0xC2, 0x65, 0x30, 0xA7, 0x5E, 0x5C, 0xB5, 0x29, 0xA6, \n    0xAD, 0x6D, 0xF5, 0x76, 0x6B, 0xD7, 0xAF, 0x99, 0xF7, 0xD9, 0x3E, 0x79, 0x84, 0xA5, 0x82, 0x8C, \n    0x2A, 0x3B, 0x4A, 0x3A, 0x5B, 0xBF, 0xA1, 0xEE, 0x9F, 0xF0, 0x44, 0x0F, 0xF8, 0x26, 0x05, 0xE7, \n    0xC3, 0x89, 0x87, 0xC6, 0x3F, 0x89, 0x16, 0x5E, 0x4F, 0x89, 0x2E, 0xAD, 0xDA, 0x1F, 0x0F, 0xE8, \n    0xB7, 0x0A, 0x3C, 0xCD, 0x26, 0x29, 0x57, 0x0F, 0x73, 0x3A, 0x91, 0x94, 0x9D, 0xD0, 0x94, 0x54, \n    0xE0, 0xC6, 0x8C, 0xFB, 0x86, 0xF6, 0x02, 0x3F, 0xAE, 0xBE, 0x28, 0xF8, 0x1B, 0xC3, 0x9E, 0x0C, \n    0xF1, 0x26, 0xA5, 0x7F, 0x1B, 0xDB, 0xFD, 0xB2, 0xEA, 0xDF, 0xC9, 0xE4, 0xF3, 0x08, 0x2C, 0x18, \n    0x8F, 0xA9, 0x2A, 0xBF, 0x4C, 0x7B, 0x9A, 0xF1, 0xBF, 0x0C, 0xFC, 0x61, 0xF1, 0x37, 0xC3, 0x9F, \n    0x84, 0x9A, 0xC4, 0xC3, 0x5A, 0xB5, 0x8F, 0x5E, 0x92, 0xC9, 0xD6, 0xDE, 0x3B, 0x76, 0xF3, 0x85, \n    0xB3, 0x95, 0xEA, 0x58, 0x8C, 0x16, 0x53, 0x9E, 0x00, 0x23, 0x20, 0x1C, 0x9E, 0x95, 0xF9, 0xCB, \n    0xA4, 0xFF, 0x00, 0xC1, 0x44, 0xBC, 0x63, 0x17, 0x8E, 0x2F, 0xB4, 0xBF, 0x14, 0x5F, 0x5C, 0x4D, \n    0x34, 0x37, 0x0D, 0xB9, 0xE4, 0x6C, 0xB7, 0x5E, 0x49, 0x27, 0xAE, 0x6B, 0xF2, 0xAE, 0x20, 0xCE, \n    0xEB, 0xE6, 0x98, 0xD9, 0xE2, 0xAB, 0x3D, 0xF4, 0x4B, 0xA2, 0x4B, 0x64, 0x97, 0xF5, 0xAE, 0xA7, \n    0xC7, 0x66, 0x58, 0xE9, 0xE2, 0xEB, 0xBA, 0xB3, 0x7E, 0x9E, 0x48, 0xFB, 0xA7, 0xC6, 0x3E, 0x11, \n    0xB7, 0xBD, 0xBE, 0x9A, 0x44, 0x5D, 0xDE, 0x63, 0x13, 0xC7, 0xA5, 0x79, 0x77, 0xC5, 0x1F, 0xD9, \n    0xDF, 0x47, 0xF8, 0x93, 0x16, 0x2E, 0x9A, 0x4B, 0x5B, 0xB8, 0x93, 0x6C, 0x57, 0x91, 0x7D, 0xE8, \n    0xC7, 0x27, 0xE6, 0x07, 0x86, 0x5C, 0x9C, 0xE0, 0xE3, 0xA9, 0xC1, 0x19, 0xAE, 0x1D, 0x3F, 0x6D, \n    0xF5, 0xD1, 0xB4, 0x4B, 0x79, 0xE2, 0xB3, 0x6D, 0x56, 0x69, 0x8F, 0xFA, 0xA1, 0x37, 0x94, 0x11, \n    0x71, 0xF7, 0x8B, 0x6D, 0x6E, 0x73, 0x8E, 0x31, 0xF8, 0xF1, 0x5C, 0xA7, 0xC6, 0x1F, 0xF8, 0x28, \n    0x0D, 0x8E, 0xA7, 0xF0, 0xE7, 0x54, 0xD3, 0x8D, 0x9A, 0xE8, 0x77, 0xD7, 0xF1, 0x79, 0x1F, 0x68, \n    0x6B, 0xD5, 0x93, 0xCA, 0x43, 0xC3, 0xE0, 0x05, 0x07, 0x71, 0x5D, 0xC0, 0x7A, 0x67, 0x3D, 0xAB, \n    0xD1, 0xC8, 0xB2, 0x3C, 0xE1, 0xCE, 0x9E, 0x3B, 0x09, 0x17, 0x18, 0xDF, 0x49, 0x5D, 0x24, 0x95, \n    0xEC, 0xDB, 0x4D, 0xDD, 0xAE, 0xFA, 0x6A, 0x75, 0xE5, 0xB9, 0x7E, 0x3B, 0x9A, 0x38, 0x8A, 0x0B, \n    0x95, 0x5F, 0xE2, 0xD3, 0xE7, 0xF2, 0x3C, 0x27, 0xC4, 0x8D, 0x15, 0x86, 0xAD, 0x77, 0x6F, 0x6F, \n    0x74, 0x97, 0x90, 0xC3, 0x33, 0xC7, 0x1D, 0xC2, 0x02, 0x16, 0x75, 0x04, 0x80, 0xE0, 0x1E, 0x40, \n    0x23, 0x9F, 0xC6, 0xBE, 0x47, 0xFF, 0x00, 0x82, 0xB1, 0xCA, 0x64, 0xFD, 0x9D, 0xF4, 0x7F, 0xFB, \n    0x18, 0xA0, 0xFF, 0x00, 0xD2, 0x6B, 0x9A, 0xF4, 0xDF, 0x8A, 0x1F, 0xB6, 0xD7, 0x80, 0x7E, 0x1A, \n    0x09, 0x16, 0x6D, 0x4A, 0x19, 0xAE, 0x17, 0xA2, 0x07, 0xF9, 0x8F, 0xFC, 0x04, 0x65, 0x8F, 0xE5, \n    0x5F, 0x17, 0xFE, 0xDA, 0xDF, 0xB6, 0xC9, 0xFD, 0xA4, 0x34, 0xBB, 0x2D, 0x03, 0x4F, 0xB5, 0x58, \n    0x34, 0x6B, 0x1B, 0xBF, 0xB6, 0xB4, 0xAC, 0x85, 0x5E, 0x69, 0x55, 0x5D, 0x17, 0x68, 0xEA, 0x14, \n    0x2B, 0xB7, 0x51, 0x92, 0x48, 0xE0, 0x63, 0x9F, 0xD1, 0xB8, 0xB3, 0x3B, 0xC0, 0xC7, 0x2F, 0xAB, \n    0x86, 0xF6, 0xAA, 0x53, 0x92, 0xB2, 0x4B, 0x5D, 0x7C, 0xEC, 0x7D, 0x56, 0x75, 0x98, 0x61, 0xD6, \n    0x16, 0x74, 0xB9, 0xD3, 0x93, 0x56, 0xB2, 0x3E, 0x77, 0xA2, 0x8A, 0x2B, 0xF0, 0xD3, 0xF3, 0xB0, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x03, 0xE8, 0x8F, 0xF8, 0x27, \n    0x6A, 0x79, 0xBF, 0x12, 0x6E, 0xA3, 0xFF, 0x00, 0x9E, 0x97, 0x16, 0x4B, 0xF9, 0xCA, 0x45, 0x7D, \n    0xD5, 0xE2, 0xDF, 0x07, 0x30, 0xB7, 0x6F, 0x96, 0xBF, 0x3D, 0x7F, 0x61, 0x7F, 0x12, 0x7F, 0xC2, \n    0x3D, 0xF1, 0x8F, 0x71, 0x3F, 0x2A, 0xC0, 0xB3, 0x81, 0x9F, 0xBC, 0xD1, 0xCD, 0x1B, 0x01, 0xF9, \n    0x6E, 0xAF, 0xD4, 0x5F, 0x88, 0xFA, 0x8D, 0x95, 0x9D, 0xBC, 0x8A, 0xBB, 0x49, 0xC6, 0x2B, 0xF7, \n    0x0F, 0x0F, 0xA9, 0xD3, 0xAB, 0x94, 0xCD, 0x4B, 0xEC, 0xBF, 0xCE, 0xE7, 0xE8, 0x9C, 0x31, 0x18, \n    0xD4, 0xC1, 0x49, 0x3E, 0x8F, 0xF3, 0x3E, 0x64, 0xF1, 0x76, 0x87, 0xFD, 0x9F, 0x78, 0x64, 0xC7, \n    0xDD, 0x3F, 0xFD, 0x6A, 0xF6, 0xEF, 0x09, 0x5D, 0x63, 0xC3, 0x9A, 0x7F, 0xFD, 0x7B, 0x47, 0xFF, \n    0x00, 0xA0, 0x8A, 0xF2, 0x1F, 0x89, 0x5A, 0xBC, 0x77, 0x4F, 0x22, 0xAE, 0x39, 0x23, 0xF9, 0xD7, \n    0xA7, 0x78, 0x5E, 0x7D, 0x9E, 0x1E, 0xB0, 0xFF, 0x00, 0xAF, 0x78, 0xFF, 0x00, 0xF4, 0x11, 0x5E, \n    0xD6, 0x5D, 0x18, 0xC6, 0xBC, 0xD4, 0x7C, 0x8F, 0x43, 0x0A, 0x92, 0xAB, 0x24, 0x89, 0x7C, 0x65, \n    0x6B, 0x25, 0xF5, 0xBF, 0xCB, 0xDC, 0x60, 0xD6, 0x57, 0xC1, 0x2F, 0x14, 0xE9, 0x3F, 0x07, 0x7E, \n    0x2B, 0xDB, 0xDF, 0x6A, 0x36, 0xEB, 0x36, 0xA0, 0x10, 0xBD, 0x99, 0x95, 0x3E, 0x55, 0x39, 0xC3, \n    0x32, 0x13, 0xC1, 0x61, 0x9C, 0x71, 0xCA, 0x86, 0xCF, 0x70, 0x6B, 0xA4, 0x49, 0x96, 0x41, 0x86, \n    0xE6, 0xAB, 0xEB, 0x1E, 0x17, 0xB3, 0xF1, 0x04, 0x30, 0x0B, 0x8B, 0x35, 0xB8, 0x16, 0xF2, 0x89, \n    0x90, 0x1E, 0x0A, 0xB0, 0xF4, 0x3D, 0xB2, 0x32, 0x3F, 0x1A, 0xF4, 0x71, 0xAB, 0x11, 0x2C, 0x3C, \n    0xA3, 0x85, 0x69, 0x4E, 0xDA, 0x5D, 0x5D, 0x1D, 0x18, 0x88, 0xD4, 0x74, 0xDF, 0xB1, 0xB7, 0x35, \n    0xB4, 0xB9, 0xF5, 0x07, 0xC6, 0x1F, 0xDA, 0x43, 0x50, 0xF8, 0xBF, 0xF0, 0x52, 0xCF, 0xC1, 0xB0, \n    0xD8, 0xDB, 0xCD, 0x0D, 0xFC, 0x91, 0xDE, 0x4D, 0x73, 0x3C, 0x2B, 0x23, 0xC0, 0x17, 0x95, 0x11, \n    0x12, 0x32, 0x8C, 0x7B, 0xB2, 0xE0, 0x94, 0x25, 0x73, 0xB5, 0x88, 0x3C, 0xF7, 0xC2, 0xEF, 0x85, \n    0xC9, 0x63, 0x2C, 0x47, 0xCB, 0xF9, 0xFF, 0x00, 0x8B, 0x8E, 0x95, 0x15, 0xBF, 0xC5, 0x6F, 0x07, \n    0xD9, 0x68, 0xFA, 0x5D, 0xC2, 0x4B, 0x71, 0xF6, 0xEB, 0xED, 0xB1, 0xCF, 0x66, 0x60, 0xDB, 0x25, \n    0xAC, 0x99, 0xDA, 0xC5, 0x9B, 0x01, 0x0A, 0x74, 0x60, 0x54, 0xF2, 0x18, 0x70, 0x18, 0x32, 0xAF, \n    0xD0, 0x3F, 0x0D, 0x35, 0x7F, 0x87, 0xBE, 0x32, 0xF0, 0xBC, 0xD6, 0xFA, 0x3D, 0x9D, 0xEB, 0xEB, \n    0xD6, 0x36, 0xFE, 0x73, 0xDC, 0x25, 0xE1, 0x21, 0xC6, 0xF5, 0x19, 0x78, 0xDB, 0x28, 0x14, 0x33, \n    0x81, 0xF2, 0x05, 0x6E, 0x46, 0x49, 0xC5, 0x7F, 0x3B, 0x66, 0x19, 0x6E, 0x33, 0x0B, 0x2F, 0xF6, \n    0xA8, 0x38, 0xDD, 0xBD, 0xD6, 0xFE, 0x9E, 0x5E, 0x7B, 0x76, 0x3F, 0x2D, 0xC5, 0x61, 0x6B, 0xD1, \n    0x97, 0xEF, 0xA2, 0xD7, 0xA9, 0x6F, 0xC0, 0xF7, 0x72, 0x78, 0x4E, 0xCD, 0x3C, 0xA6, 0x65, 0x38, \n    0x18, 0x20, 0xF4, 0xAA, 0x7F, 0x15, 0xBE, 0x3B, 0x6A, 0x9A, 0x7E, 0x98, 0xD1, 0xC7, 0x75, 0x22, \n    0xAE, 0x30, 0x49, 0x23, 0xFC, 0x2A, 0x0F, 0x17, 0xEB, 0xF6, 0x5E, 0x0E, 0xD0, 0xAE, 0x75, 0x0D, \n    0x4E, 0xE1, 0x2C, 0x6C, 0xED, 0x57, 0x74, 0x92, 0xCB, 0xF2, 0xAA, 0xF6, 0x1C, 0xF7, 0x24, 0x90, \n    0x00, 0xE4, 0x92, 0x40, 0x19, 0x24, 0x57, 0x9A, 0xFC, 0x53, 0xB7, 0x9E, 0xEF, 0x44, 0xB1, 0xD4, \n    0xC1, 0x76, 0xB1, 0xD5, 0x03, 0x35, 0xBB, 0xA4, 0x82, 0x4F, 0x30, 0x29, 0x19, 0xC8, 0x53, 0x91, \n    0xD4, 0x75, 0xC5, 0x79, 0xA7, 0x29, 0xE8, 0x5F, 0x07, 0x7E, 0x27, 0x5D, 0x6B, 0x91, 0x18, 0xEE, \n    0xAE, 0x1E, 0x4F, 0x34, 0x15, 0xF9, 0x8F, 0x50, 0x7F, 0xCF, 0xD2, 0xBE, 0x6C, 0xFD, 0xB4, 0xFE, \n    0x09, 0x35, 0x97, 0x8A, 0x24, 0xD6, 0xED, 0x23, 0xF2, 0x55, 0xDB, 0x2E, 0x14, 0x72, 0x5B, 0xD7, \n    0xFC, 0xF7, 0xAE, 0x17, 0xF6, 0xFF, 0x00, 0xFD, 0xA1, 0x75, 0xAF, 0xD9, 0x8B, 0xF6, 0x2D, 0xD6, \n    0xB5, 0x4F, 0x0D, 0xDF, 0x5F, 0x68, 0x9A, 0xFE, 0xB5, 0x79, 0x6F, 0xA4, 0x69, 0xFA, 0x84, 0x18, \n    0x59, 0xAD, 0x9E, 0x46, 0x32, 0x48, 0x54, 0x9C, 0xED, 0x63, 0x0C, 0x53, 0x28, 0x61, 0x82, 0xA5, \n    0x81, 0x52, 0x08, 0x06, 0xBE, 0x2B, 0xFD, 0x95, 0x3F, 0xE0, 0xB0, 0x5E, 0x34, 0xF8, 0x63, 0x0F, \n    0xF6, 0x0F, 0xC4, 0xC9, 0xB5, 0x4F, 0x89, 0x1E, 0x13, 0x78, 0xCA, 0x47, 0x2D, 0xE5, 0xC9, 0x9B, \n    0x57, 0xD3, 0x88, 0x1F, 0x2F, 0x97, 0x3C, 0x87, 0x32, 0x46, 0x38, 0x1E, 0x5C, 0x84, 0xE0, 0x00, \n    0x15, 0x90, 0x02, 0x0B, 0x5A, 0x82, 0x3D, 0x63, 0xF6, 0xC3, 0xFD, 0xA0, 0x3C, 0x5D, 0xF0, 0x2F, \n    0xE0, 0xD6, 0x9B, 0xA9, 0x68, 0xB2, 0x43, 0x1A, 0x4F, 0x7C, 0x2C, 0x65, 0x49, 0x8B, 0x65, 0x77, \n    0x46, 0xEE, 0xAD, 0xC1, 0x04, 0xFD, 0xC6, 0x07, 0x9E, 0xEB, 0x5F, 0x0B, 0xF8, 0xE3, 0xF6, 0x8B, \n    0xF1, 0xA7, 0xC4, 0x39, 0x9D, 0xB5, 0x2D, 0x7A, 0xF8, 0xA3, 0x31, 0x6F, 0x2E, 0x17, 0xF2, 0x54, \n    0x67, 0xB7, 0xCB, 0x82, 0x47, 0xFB, 0xC4, 0xD5, 0xAF, 0xDA, 0x3B, 0xF6, 0x8D, 0xD7, 0x3F, 0x69, \n    0x4F, 0x1F, 0x4D, 0xAC, 0x6A, 0xDB, 0x6D, 0x6C, 0xE3, 0x66, 0x5B, 0x0D, 0x3A, 0x27, 0x26, 0x0B, \n    0x08, 0xC9, 0xFB, 0xA3, 0xFB, 0xCC, 0x70, 0x37, 0x39, 0x19, 0x62, 0x07, 0x40, 0x15, 0x47, 0x9F, \n    0xD7, 0x6C, 0xB3, 0x2C, 0x54, 0xA9, 0x46, 0x83, 0xA8, 0xF9, 0x23, 0xA2, 0x57, 0xD0, 0xE8, 0x96, \n    0x2E, 0xB3, 0x82, 0xA6, 0xE4, 0xEC, 0xBA, 0x5C, 0x56, 0x62, 0xEC, 0x59, 0x89, 0x66, 0x63, 0x92, \n    0x4F, 0x7A, 0x4A, 0x28, 0xAE, 0x13, 0x9C, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, \n    0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, \n    0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, \n    0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0xE9, 0x7E, 0x10, 0xF8, 0xBD, 0x7C, 0x0D, 0xF1, 0x1B, \n    0x4B, 0xD4, 0xA4, 0x6D, 0xB6, 0xF1, 0xCB, 0xE5, 0xCE, 0x79, 0xC0, 0x8D, 0xC1, 0x56, 0x3C, 0x7A, \n    0x03, 0x9F, 0xC2, 0xBF, 0x41, 0x6E, 0xFE, 0x30, 0x0B, 0xBF, 0x0C, 0x5A, 0x8B, 0x89, 0x98, 0xCD, \n    0x1C, 0x42, 0x37, 0x2C, 0xD9, 0x2C, 0x40, 0xC6, 0x7F, 0x1E, 0xBF, 0x8D, 0x7E, 0x6A, 0xD7, 0xAF, \n    0x7C, 0x2F, 0xFD, 0xA4, 0xE1, 0xD1, 0xFC, 0x39, 0x0E, 0x8F, 0xE2, 0x2B, 0x5B, 0x8B, 0xAB, 0x7B, \n    0x55, 0x11, 0xC1, 0x71, 0x07, 0xFA, 0xC5, 0x41, 0xC0, 0x56, 0x19, 0x1D, 0x07, 0x19, 0x07, 0x38, \n    0x18, 0xC1, 0xEB, 0x5F, 0x5D, 0xC2, 0xF9, 0xF2, 0xC1, 0x39, 0xD1, 0xA8, 0xED, 0x19, 0x7E, 0x67, \n    0xB9, 0x93, 0x66, 0x4B, 0x0F, 0xCD, 0x4E, 0x6E, 0xC9, 0x9F, 0x48, 0x49, 0xE2, 0x43, 0xE2, 0x8D, \n    0x48, 0xC5, 0x6E, 0xA6, 0x46, 0x2C, 0x14, 0x01, 0xC9, 0x66, 0x27, 0x00, 0x0F, 0xAD, 0x7D, 0x1B, \n    0x63, 0xA4, 0x43, 0xA0, 0xE9, 0x56, 0xF1, 0x5D, 0x5C, 0xC6, 0xAB, 0x6F, 0x12, 0xA1, 0x62, 0x70, \n    0x0E, 0x00, 0x1F, 0xD2, 0xBE, 0x02, 0x6F, 0xDB, 0x26, 0xD3, 0xC1, 0xD3, 0x2B, 0x78, 0x6B, 0x46, \n    0x66, 0x9A, 0x03, 0x98, 0x66, 0xBC, 0x60, 0xAA, 0x8D, 0xFD, 0xED, 0xAA, 0x49, 0x63, 0xE8, 0x4B, \n    0x03, 0xD0, 0xF5, 0xAE, 0x13, 0xC7, 0x9F, 0xB5, 0x47, 0x8E, 0xBE, 0x22, 0x49, 0x27, 0xDB, 0x75, \n    0xEB, 0xA8, 0x21, 0x76, 0xDC, 0x22, 0xB4, 0x3E, 0x4A, 0xAF, 0xB0, 0x61, 0xF3, 0x63, 0xD8, 0xB1, \n    0xAF, 0xAA, 0xA3, 0xC6, 0x78, 0x1C, 0x1F, 0x3C, 0xA2, 0x9D, 0x49, 0x3E, 0xDA, 0x25, 0xEA, 0xDF, \n    0xE9, 0x73, 0xDA, 0x86, 0x7F, 0x86, 0xA1, 0xCC, 0xD5, 0xE4, 0xDF, 0xDC, 0x7E, 0x86, 0xF8, 0xEB, \n    0xF6, 0x90, 0xF0, 0x4F, 0xC2, 0xF8, 0x59, 0xB5, 0x0D, 0x5E, 0xD1, 0x24, 0x51, 0x90, 0x86, 0x41, \n    0xB9, 0xBE, 0x83, 0xA9, 0xFC, 0x01, 0xAF, 0x0E, 0xF8, 0x8B, 0xFF, 0x00, 0x05, 0x4E, 0xD3, 0x6C, \n    0x16, 0x48, 0x7C, 0x39, 0xA5, 0xDC, 0x5E, 0xBA, 0x9C, 0x2C, 0x8E, 0x3C, 0x98, 0xD8, 0x7A, 0xE4, \n    0xFC, 0xDF, 0xF8, 0xED, 0x7C, 0x45, 0x2C, 0xCD, 0x3C, 0xAD, 0x23, 0xB3, 0x3B, 0xB9, 0x2C, 0xCC, \n    0xC7, 0x25, 0x8F, 0xA9, 0x34, 0xDA, 0xF0, 0xF1, 0xFE, 0x20, 0xE6, 0x35, 0xBD, 0xDA, 0x09, 0x53, \n    0x5E, 0x5A, 0xBF, 0xBD, 0xFF, 0x00, 0x91, 0xE6, 0xE2, 0x78, 0x9F, 0x15, 0x53, 0x4A, 0x76, 0x8A, \n    0xFB, 0xD9, 0xEC, 0x9E, 0x3F, 0xFD, 0xBA, 0x7C, 0x7F, 0xE3, 0x8B, 0xA2, 0xD1, 0x6A, 0x2B, 0xA4, \n    0xC6, 0x1F, 0x72, 0x0B, 0x65, 0xF9, 0xC0, 0xEC, 0x0B, 0x36, 0x7A, 0x7A, 0x80, 0x2B, 0xEA, 0x1F, \n    0xF8, 0x26, 0xF7, 0xFC, 0x16, 0x3B, 0x43, 0xFD, 0x9C, 0xE5, 0xD7, 0x21, 0xF8, 0xA1, 0xA1, 0xEB, \n    0xDA, 0xCD, 0xC6, 0xA8, 0x90, 0x45, 0x6D, 0xAC, 0x69, 0x1E, 0x54, 0x92, 0xDB, 0xA2, 0x6F, 0x2E, \n    0x8F, 0x03, 0xB2, 0x29, 0x12, 0x31, 0x8D, 0x8B, 0x2B, 0x70, 0x62, 0x50, 0x13, 0x93, 0x5F, 0x9F, \n    0x54, 0x57, 0xC7, 0xE2, 0xB3, 0x0C, 0x4E, 0x26, 0x5C, 0xD8, 0x89, 0xB9, 0x7A, 0xBB, 0x9E, 0x15, \n    0x6C, 0x55, 0x5A, 0xAE, 0xF5, 0x64, 0xDF, 0xA9, 0xFA, 0x01, 0xFF, 0x00, 0x05, 0x72, 0xFF, 0x00, \n    0x82, 0xB1, 0xE9, 0xFF, 0x00, 0xB5, 0x2D, 0xA7, 0x87, 0xFC, 0x23, 0xF0, 0xC2, 0xFB, 0x52, 0x87, \n    0xC2, 0x76, 0x66, 0x2D, 0x57, 0x54, 0xBC, 0x96, 0x16, 0xB6, 0x96, 0xFA, 0xF0, 0x10, 0xD1, 0x41, \n    0xB1, 0x86, 0x42, 0x40, 0x46, 0xE2, 0x72, 0x55, 0xE4, 0x20, 0x81, 0x88, 0xD5, 0x9B, 0x7B, 0xF6, \n    0x5B, 0xFF, 0x00, 0x82, 0xD8, 0xE8, 0xDE, 0x1C, 0xF8, 0x2E, 0xDA, 0x07, 0xC4, 0xBD, 0x27, 0x58, \n    0xB9, 0xD4, 0xF4, 0xA7, 0x57, 0xB2, 0xB8, 0xD2, 0x60, 0x8E, 0x64, 0xBD, 0x1C, 0x82, 0x19, 0x5E, \n    0x44, 0xF2, 0xDB, 0x1B, 0x49, 0xE4, 0xA9, 0xC1, 0x23, 0x6F, 0xDD, 0xAF, 0xCE, 0x1A, 0x2B, 0x95, \n    0x49, 0xA5, 0x63, 0x1E, 0x6E, 0x87, 0xD4, 0x5F, 0xB7, 0x9F, 0xFC, 0x14, 0xB6, 0xFB, 0xF6, 0xCE, \n    0xF0, 0x7E, 0x93, 0xE1, 0x9B, 0x5F, 0x0C, 0xC5, 0xE1, 0xAF, 0x0F, 0xE9, 0x77, 0xE7, 0x51, 0x65, \n    0x7B, 0xCF, 0xB5, 0x5C, 0x5E, 0x4E, 0x11, 0xE3, 0x8D, 0x89, 0x08, 0x81, 0x15, 0x52, 0x47, 0xF9, \n    0x40, 0x6E, 0x5B, 0xEF, 0x70, 0x2B, 0xE5, 0xDA, 0x28, 0xA9, 0x10, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x01, 0xFF, 0xD9, \n} ;\n"
  },
  {
    "path": "examples/M5ez-demo/M5ez-demo.ino",
    "content": "#include <M5ez.h>\n\n#include <ezTime.h>\n\n#include \"images.h\"\n\n#define MAIN_DECLARED\n\nvoid setup() {\n  #include <themes/default.h>\n  #include <themes/dark.h>\n  ezt::setDebug(INFO);\n  ez.begin();\n}\n\nvoid loop() {\n  ezMenu mainmenu(\"Welcome to M5ez\");\n  mainmenu.txtSmall();\n  mainmenu.addItem(\"Flexible text menus\", mainmenu_menus);\n  mainmenu.addItem(\"Image menus\", mainmenu_image);\n  mainmenu.addItem(\"Neat messages\", mainmenu_msgs);\n  mainmenu.addItem(\"Multi-function buttons\", mainmenu_buttons);\n  mainmenu.addItem(\"3-button text entry\", mainmenu_entry);\n  mainmenu.addItem(\"Built-in wifi & other settings\", ez.settings.menu);\n  mainmenu.addItem(\"Updates via https\", mainmenu_ota);\n  mainmenu.upOnFirst(\"last|up\");\n  mainmenu.downOnLast(\"first|down\");\n  mainmenu.run();\n}\n\nvoid mainmenu_menus() { \n  ezMenu submenu(\"This is a sub menu\");\n  submenu.txtSmall();\n  submenu.buttons(\"up#Back#select##down#\");\n  submenu.addItem(\"You can make small menus\");\n  submenu.addItem(\"Or big ones\");\n  submenu.addItem(\"(Like the Main menu)\");\n  submenu.addItem(\"In this menu most options\");\n  submenu.addItem(\"Do absolutely nothing\");\n  submenu.addItem(\"They are only here\");\n  submenu.addItem(\"To demonstrate that menus\");\n  submenu.addItem(\"Can run off the screen\");\n  submenu.addItem(\"And will just scroll\");\n  submenu.addItem(\"And scroll\");\n  submenu.addItem(\"And Scroll\");\n  submenu.addItem(\"And Scroll even more\");   \n  submenu.addItem(\"more | Learn more about menus\", submenu_more);\n  submenu.addItem(\"Exit | Go back to main menu\");\n  submenu.run();\n}\n\nvoid submenu_more() {\n  ez.header.show(\"A simple menu in code...\");\n  ez.canvas.lmargin(10);\n  ez.canvas.println(\"\");\n  ez.canvas.println(\"ezMenu menu(\\\"Main menu\\\");\");\n  ez.canvas.println(\"menu.addItem(\\\"Option 1\\\");\");\n  ez.canvas.println(\"menu.addItem(\\\"Option 2\\\");\");\n  ez.canvas.println(\"menu.addItem(\\\"Option 3\\\");\");\n  ez.canvas.println(\"while ( menu.run() ) {\");\n  ez.canvas.println(\"  if (menu.pick == 1) {\");\n  ez.canvas.println(\"    ez.msgBox (\\\"One!\\\");\");\n  ez.canvas.println(\"  }\");\n  ez.canvas.println(\"}\");\n  ez.buttons.wait(\"OK\");\n  \n  ezMenu fontmenu(\"Menus can change looks\");\n  fontmenu.txtFont(&Satisfy_24);\n  fontmenu.addItem(\"Menus can use\");\n  fontmenu.addItem(\"Various Fonts\");\n  fontmenu.runOnce();\n  \n  ezMenu delmenu(\"Menus are dynamic\");\n  delmenu.txtSmall();\n  delmenu.addItem(\"You can delete items\");\n  delmenu.addItem(\"While the menu runs\");\n  delmenu.addItem(\"Delete me!\");\n  delmenu.addItem(\"Delete me!\");\n  delmenu.addItem(\"Delete me!\");\n  delmenu.addItem(\"Exit | Go back\" );\n  while (delmenu.runOnce()) {\n    if (delmenu.pickName() == \"Delete me!\") {\n      delmenu.deleteItem(delmenu.pick());\n    }\n  }\n}\n\nvoid mainmenu_image() {\n  ezMenu images;\n  images.imgBackground(TFT_BLACK);\n  images.imgFromTop(40);\n  images.imgCaptionColor(TFT_WHITE);\n  images.addItem(sysinfo_jpg, \"System Information\", sysInfo);\n  images.addItem(wifi_jpg, \"WiFi Settings\", ez.wifi.menu);\n  images.addItem(about_jpg, \"About M5ez\", aboutM5ez);\n  images.addItem(sleep_jpg, \"Power Off\", powerOff);\n  images.addItem(return_jpg, \"Back\");\n  images.run();\n}\n    \nvoid mainmenu_msgs() {\n  String cr = (String)char(13);\n  ez.msgBox(\"You can show messages\", \"ez.msgBox shows text\");\n  ez.msgBox(\"Looking the way you want\", \"In any font !\", \"OK\", true, &FreeSerifBold24pt7b, TFT_RED);\n  ez.msgBox(\"More ez.msgBox\", \"Even multi-line messages where everything lines up and is kept in the middle of the screen\");\n  ez.msgBox(\"Questions, questions...\", \"But can it also show any buttons you want?\", \"No # # Yes\"); \n  ez.textBox(\"And there's ez.textBox\", \"To present or compose longer word-wrapped texts, you can use the ez.textBox function.\" + cr + cr + \"M5ez (pronounced \\\"M5 easy\\\") is a complete interface builder library for the M5Stack ESP32 system. It allows even novice programmers to create good looking interfaces. It comes with menus as text or as images, message boxes, very flexible button setup (including different length presses and multi-button functions), 3-button text input (you have to see it to believe it) and built-in Wifi support. Now you can concentrate on what your program does, and let M5ez worry about everything else.\", true);\n}\n    \nvoid mainmenu_buttons() {\n  ez.header.show(\"Simple buttons...\");\n  ez.canvas.font(&FreeSans12pt7b);\n  ez.canvas.lmargin(20);\n  ez.canvas.println(\"\");      \n  ez.canvas.println(\"You can have three buttons\");\n  ez.canvas.println(\"with defined funtions.\");\n  ez.buttons.show(\"One # Two # Done\");\n  printButton();\n  ez.canvas.clear();\n  ez.header.show(\"More functions...\");\n  ez.canvas.println(\"\");      \n  ez.canvas.println(\"But why stop there?\");\n  ez.canvas.println(\"If you press a little longer\");\n  ez.canvas.println(\"You access the functions\");\n  ez.canvas.println(\"printed in cyan.\");\n  ez.buttons.show(\"One # Two # Three # Four # Done #\");\n  printButton();\n  ez.canvas.clear();\n  ez.header.show(\"Two keys ...\");\n  ez.canvas.y(ez.canvas.top() + 10);\n  ez.canvas.println(\"It gets even better...\");\n  ez.canvas.println(\"The purple bar shows the\");\n  ez.canvas.println(\"functions for key combis.\");\n  ez.canvas.println(\"See if you can work it out...\");\n  ez.buttons.show(\"One # Two # Three # Four # Five # Six # Seven # Eight # Done\");\n  printButton();\n}\n\nvoid printButton(){\n  while (true) {\n  String btnpressed = ez.buttons.poll();\n  if (btnpressed == \"Done\") break;\n  if (btnpressed != \"\") {\n    m5.lcd.fillRect (0, ez.canvas.bottom() - 45, TFT_W, 40, ez.theme->background); \n    ez.canvas.pos(20, ez.canvas.bottom() - 45);\n    ez.canvas.color(TFT_RED);\n    ez.canvas.font(&FreeSansBold18pt7b);\n    ez.canvas.print(btnpressed);\n    ez.canvas.font(&FreeSans12pt7b);\n    ez.canvas.color(TFT_BLACK);\n  }\n  }\n}\n\nvoid mainmenu_entry() {\n  if (ez.msgBox(\"We're gonna enter text ... !\", \"Have you learned to use the buttons? Go there first if you haven't been there. Or hit 'Go' to see if you can enter your name.\", \"Back # # Go\") == \"Go\") {\n    String your_name = ez.textInput();\n    ez.msgBox(\"Pfew...\", \"Hi \" + your_name + \"! | | Now that was a pain! But it is good enough for entering, say, a WPA key, or don't you think?\");\n    ez.msgBox(\"Don't worry\", \"(You do get better with practice...)\");\n  }\n}\n\nvoid mainmenu_ota() {\n  if (ez.msgBox(\"Get OTA_https demo\", \"This will replace the demo with a program that can then load the demo program again.\", \"Cancel#OK#\") == \"OK\") {\n    ezProgressBar progress_bar(\"OTA update in progress\", \"Downloading ...\", \"Abort\");\n    #include \"raw_githubusercontent_com.h\" // the root certificate is now in const char * root_cert\n    if (ez.wifi.update(\"https://raw.githubusercontent.com/M5ez/M5ez/master/compiled_binaries/OTA_https.bin\", root_cert, &progress_bar)) {\n      ez.msgBox(\"Over The Air updater\", \"OTA download successful. Reboot to new firmware\", \"Reboot\");\n      ESP.restart();\n    } else {\n      ez.msgBox(\"OTA error\", ez.wifi.updateError(), \"OK\");\n    }\n  }\n}\n\nvoid powerOff() { m5.powerOFF(); }\n\nvoid aboutM5ez() {\n  ez.msgBox(\"About M5ez\", \"M5ez was written by | Rop Gonggrijp | | https://github.com/M5ez/M5ez\");\n}\n"
  },
  {
    "path": "examples/M5ez-demo/images.h",
    "content": "#pragma once\n\nconst char wifi_jpg[] PROGMEM =\n{\n    0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x60, \n    0x00, 0x60, 0x00, 0x00, 0xFF, 0xE1, 0x00, 0x22, 0x45, 0x78, 0x69, 0x66, 0x00, 0x00, 0x4D, 0x4D, \n    0x00, 0x2A, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x01, 0x12, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, \n    0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x02, 0x01, 0x01, \n    0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x05, 0x03, 0x03, 0x03, \n    0x03, 0x03, 0x06, 0x04, 0x04, 0x03, 0x05, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 0x08, \n    0x09, 0x0B, 0x09, 0x08, 0x08, 0x0A, 0x08, 0x07, 0x07, 0x0A, 0x0D, 0x0A, 0x0A, 0x0B, 0x0C, 0x0C, \n    0x0C, 0x0C, 0x07, 0x09, 0x0E, 0x0F, 0x0D, 0x0C, 0x0E, 0x0B, 0x0C, 0x0C, 0x0C, 0xFF, 0xDB, 0x00, \n    0x43, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x06, 0x03, 0x03, 0x06, 0x0C, 0x08, 0x07, 0x08, \n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, \n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, \n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, \n    0x0C, 0x0C, 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x00, 0xB5, 0x01, 0x40, 0x03, 0x01, 0x22, 0x00, 0x02, \n    0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, 0x00, 0x1F, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, \n    0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, \n    0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, \n    0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04, \n    0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, \n    0x91, 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, 0x33, 0x62, 0x72, 0x82, \n    0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, \n    0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, \n    0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, \n    0x77, 0x78, 0x79, 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, \n    0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, \n    0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, \n    0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, \n    0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xC4, 0x00, \n    0x1F, 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, \n    0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, \n    0x00, 0xB5, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, \n    0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, \n    0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 0x23, \n    0x33, 0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, \n    0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, \n    0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, \n    0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84, \n    0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, \n    0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, \n    0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, \n    0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, \n    0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, \n    0x00, 0x3F, 0x00, 0xFE, 0x7F, 0xE8, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0x55, 0x2C, \n    0x70, 0x28, 0x03, 0x26, 0xBD, 0x23, 0xE0, 0x47, 0xC1, 0x0D, 0x43, 0xE2, 0x8F, 0x88, 0xED, 0xAD, \n    0x6D, 0xED, 0xE4, 0x99, 0xA6, 0x90, 0x22, 0xAA, 0xAE, 0x4B, 0x13, 0xDA, 0xBA, 0xB0, 0x78, 0x4A, \n    0xB8, 0x9A, 0xAA, 0x8D, 0x15, 0x79, 0x3D, 0x8E, 0x7C, 0x56, 0x26, 0x9E, 0x1E, 0x9B, 0xAB, 0x55, \n    0xD9, 0x2D, 0xD9, 0xC1, 0x26, 0x89, 0x73, 0x2A, 0x6E, 0x58, 0x9D, 0x86, 0x33, 0xC0, 0x27, 0x8A, \n    0x8A, 0xEB, 0x4F, 0xB8, 0xB2, 0x58, 0xDA, 0x68, 0x66, 0x89, 0x66, 0x1B, 0x90, 0xBA, 0x15, 0x0E, \n    0x3D, 0x47, 0xA8, 0xAF, 0xDB, 0x6F, 0xD9, 0x5B, 0xFE, 0x09, 0x35, 0xE0, 0xFF, 0x00, 0x82, 0xFF, \n    0x00, 0x00, 0x1B, 0xE2, 0x4F, 0xC4, 0xC8, 0x16, 0x4D, 0x3E, 0xE0, 0x1B, 0x7D, 0x2E, 0xC7, 0x03, \n    0xCE, 0xD7, 0xEE, 0x07, 0x54, 0x8C, 0x1F, 0xF9, 0x62, 0x87, 0x86, 0x7E, 0x84, 0xE7, 0xDB, 0x3F, \n    0x02, 0xFF, 0x00, 0xC1, 0x4C, 0xBE, 0x09, 0x5F, 0x5B, 0x78, 0xA9, 0x3C, 0x58, 0xDF, 0x62, 0xB3, \n    0xD3, 0x6E, 0x8F, 0xD9, 0xAD, 0x74, 0xE8, 0x02, 0xC6, 0xB6, 0x08, 0xA3, 0x21, 0x23, 0x5F, 0xE2, \n    0x5C, 0x75, 0x6E, 0xB9, 0xFA, 0x8A, 0xFA, 0x8C, 0xCB, 0x82, 0xB1, 0xD8, 0x4A, 0x33, 0xAE, 0x97, \n    0x32, 0xA7, 0xA4, 0xDA, 0xD9, 0x3E, 0xB1, 0x4F, 0xAB, 0x5F, 0x6A, 0xDA, 0x27, 0xA6, 0xF7, 0xB7, \n    0xCF, 0x65, 0xFC, 0x59, 0x82, 0xC5, 0x55, 0x8D, 0x24, 0xEC, 0xE7, 0xAC, 0x57, 0x56, 0xBA, 0x3B, \n    0x74, 0x4F, 0xEC, 0xDF, 0x75, 0xAE, 0xD6, 0x3E, 0x3D, 0xA2, 0x95, 0x97, 0x6B, 0x63, 0xD2, 0x92, \n    0xBE, 0x34, 0xFA, 0x90, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x01, \n    0xF0, 0x5B, 0xC9, 0x72, 0xFB, 0x63, 0x46, 0x91, 0xB1, 0x9C, 0x28, 0xC9, 0xAB, 0x70, 0xF8, 0x7E, \n    0xEA, 0x68, 0x3C, 0xC1, 0x0C, 0x9B, 0x48, 0xC8, 0x3B, 0x78, 0x35, 0xEC, 0xFF, 0x00, 0xB1, 0x0F, \n    0xC0, 0x5D, 0x47, 0xE2, 0x7F, 0xC4, 0x68, 0x75, 0x0B, 0x59, 0xA1, 0x8E, 0x3D, 0x1D, 0xD2, 0x69, \n    0x15, 0xC0, 0x63, 0x28, 0xCF, 0xDD, 0xDB, 0xDD, 0x4F, 0x42, 0x7B, 0x57, 0xEB, 0x5F, 0x89, 0x7F, \n    0xE0, 0x97, 0x7E, 0x04, 0xFD, 0xA8, 0x7F, 0x65, 0xFB, 0xAF, 0x14, 0x78, 0x17, 0x4F, 0x87, 0x4F, \n    0xF1, 0x07, 0x86, 0xA0, 0xF3, 0x3C, 0x41, 0xA1, 0xC6, 0xA0, 0xCD, 0x62, 0xB8, 0xFF, 0x00, 0x8F, \n    0xC8, 0x07, 0x59, 0x20, 0xCF, 0xDF, 0x03, 0x95, 0x1C, 0xF1, 0x8E, 0x7E, 0xBB, 0x25, 0xE0, 0xFC, \n    0x5E, 0x3E, 0x9A, 0xAE, 0xFD, 0xD8, 0x49, 0xD9, 0x49, 0xED, 0xCD, 0xB2, 0x4D, 0xF4, 0x4D, 0xE8, \n    0x9B, 0xD2, 0xF6, 0x4E, 0xD7, 0x47, 0xCC, 0xE6, 0xFC, 0x51, 0x85, 0xC0, 0xCD, 0xD2, 0xBF, 0x34, \n    0xE2, 0xAE, 0xE2, 0xB7, 0xB2, 0xD5, 0xB4, 0xBA, 0xD9, 0x6A, 0xD2, 0xD6, 0xD7, 0x6A, 0xF6, 0x3F, \n    0x08, 0x65, 0x89, 0xA1, 0x7D, 0xAC, 0x30, 0x69, 0xB5, 0xED, 0x9F, 0xB5, 0x1F, 0xEC, 0xD7, 0xA8, \n    0xFC, 0x1E, 0xF1, 0x4D, 0xD5, 0xBD, 0xC5, 0xBB, 0x47, 0xE5, 0x39, 0xE4, 0x0F, 0x95, 0x87, 0x62, \n    0x0F, 0xA1, 0xAF, 0x14, 0x65, 0xD8, 0xD8, 0x35, 0xF3, 0xF9, 0x96, 0x5D, 0x5F, 0x03, 0x88, 0x96, \n    0x1B, 0x11, 0x1B, 0x4A, 0x2E, 0xCD, 0x33, 0xDA, 0xC0, 0x63, 0xA8, 0xE3, 0x28, 0x47, 0x11, 0x42, \n    0x4A, 0x51, 0x92, 0xBA, 0x68, 0x4A, 0x28, 0xA2, 0xB8, 0x4E, 0xC0, 0xA2, 0x8A, 0x28, 0x00, 0xA2, \n    0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, \n    0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, \n    0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x00, 0xC9, 0xA0, 0x0D, 0x8F, 0x05, 0xF8, 0x6E, 0x4F, 0x12, 0xEB, \n    0x50, 0xC1, 0x1A, 0xEE, 0xDC, 0xC0, 0x74, 0xAF, 0xDA, 0x2F, 0xF8, 0x22, 0xAF, 0xFC, 0x13, 0xD7, \n    0x4D, 0xD7, 0x64, 0x6F, 0x13, 0x78, 0xA7, 0xFE, 0x25, 0xFE, 0x19, 0xD0, 0xAC, 0xCE, 0xAB, 0xAC, \n    0xDE, 0xB2, 0xE3, 0xEC, 0xD6, 0x6B, 0xC9, 0x55, 0x3F, 0xF3, 0xD2, 0x4F, 0xBA, 0x31, 0xCF, 0x35, \n    0xF9, 0xC7, 0xFF, 0x00, 0x04, 0xFA, 0xF8, 0x19, 0xFF, 0x00, 0x0B, 0x23, 0xE2, 0x1D, 0x92, 0xCD, \n    0x1B, 0x35, 0xBE, 0xF1, 0x24, 0xC7, 0x1D, 0x11, 0x79, 0x6F, 0xCC, 0x71, 0xF5, 0x35, 0xFB, 0xB9, \n    0xF1, 0xDA, 0x08, 0xBF, 0x66, 0x5F, 0xD9, 0x87, 0xC2, 0x7F, 0x09, 0xEC, 0x55, 0x6D, 0x75, 0xAF, \n    0x11, 0x43, 0x17, 0x88, 0xBC, 0x55, 0xB4, 0x6D, 0x65, 0x0C, 0x33, 0x6D, 0x6A, 0xDE, 0xCA, 0xB8, \n    0x6E, 0xDD, 0x2B, 0xF7, 0x6F, 0x0C, 0x78, 0x6E, 0x6E, 0x9C, 0x71, 0x51, 0xD2, 0xAD, 0x57, 0xCB, \n    0x07, 0xFC, 0xA9, 0x2B, 0xCE, 0xA7, 0xAC, 0x63, 0x65, 0x1E, 0x9C, 0xF2, 0x89, 0xF8, 0x87, 0x89, \n    0xFC, 0x49, 0x0A, 0x6E, 0x58, 0x59, 0xEB, 0x4A, 0x94, 0x54, 0xEA, 0x2F, 0xE6, 0x6D, 0xDA, 0x9D, \n    0x3F, 0x49, 0xCA, 0xEE, 0x5F, 0xDC, 0x8C, 0x8F, 0x1F, 0xFD, 0xB6, 0xFF, 0x00, 0x6B, 0x08, 0x7E, \n    0x21, 0xEB, 0x57, 0x9E, 0x28, 0xD4, 0xA3, 0x5D, 0x27, 0xC2, 0xFA, 0x1C, 0x02, 0xCB, 0x42, 0xD2, \n    0x53, 0xE5, 0x8E, 0xC2, 0xD5, 0x06, 0x22, 0x89, 0x57, 0xA6, 0xE2, 0x06, 0x5B, 0xDF, 0x3D, 0xAB, \n    0xF1, 0xAF, 0xF6, 0xCB, 0xFD, 0xA3, 0x2E, 0xBE, 0x32, 0xF8, 0xDA, 0x76, 0x76, 0xCA, 0x2B, 0x18, \n    0xE1, 0x89, 0x4F, 0xCB, 0x0A, 0x76, 0x51, 0xFD, 0x6B, 0xDE, 0xBF, 0xE0, 0xA5, 0xBF, 0xB5, 0x03, \n    0x5E, 0xEB, 0x12, 0x68, 0x1A, 0x7D, 0xC7, 0xFA, 0x2E, 0x9E, 0x4C, 0x5F, 0x2B, 0x71, 0x24, 0x9D, \n    0x19, 0xBF, 0xA0, 0xFA, 0x57, 0xCA, 0xFF, 0x00, 0x00, 0xBE, 0x10, 0xDF, 0xFC, 0x64, 0xF1, 0xC5, \n    0xBC, 0x31, 0xC2, 0xF3, 0xBD, 0xC4, 0xCA, 0xAA, 0x31, 0xD4, 0x93, 0x5A, 0x78, 0x89, 0x9E, 0xAC, \n    0x4E, 0x22, 0x1C, 0x35, 0x93, 0xC7, 0xF7, 0x70, 0xB4, 0x6C, 0xBA, 0xBF, 0xD7, 0x5F, 0xBD, 0xEB, \n    0xBB, 0x27, 0xC3, 0x8C, 0x8A, 0x78, 0x6C, 0x2C, 0xF8, 0x8F, 0x39, 0x95, 0xEA, 0xD4, 0xF7, 0xB5, \n    0xFB, 0x2B, 0x7F, 0x45, 0xA7, 0xDC, 0xAC, 0xB6, 0x47, 0x11, 0x67, 0xF0, 0xDF, 0x56, 0xD5, 0x6D, \n    0x1E, 0x6B, 0x7B, 0x49, 0xE6, 0xDA, 0xA5, 0xC8, 0x44, 0x27, 0x81, 0xC9, 0x35, 0x85, 0x35, 0xBC, \n    0x96, 0xD2, 0x32, 0xC8, 0x8C, 0x8C, 0xA7, 0x04, 0x30, 0xC6, 0x0D, 0x7E, 0xF5, 0x7F, 0xC1, 0x3E, \n    0xBF, 0xE0, 0x9B, 0x1A, 0x6E, 0xB5, 0x67, 0x75, 0x69, 0x24, 0x96, 0x3A, 0x4E, 0x87, 0xA4, 0xDA, \n    0x7D, 0xAB, 0xC5, 0x3E, 0x22, 0xB9, 0x8C, 0x18, 0xAC, 0xAD, 0xC0, 0xCB, 0x46, 0xB9, 0xEA, 0x5B, \n    0xA2, 0xAF, 0x73, 0xEB, 0x5F, 0x34, 0x7F, 0xC1, 0x6D, 0x3C, 0x03, 0xE0, 0x97, 0xF8, 0x6D, 0xA1, \n    0xE9, 0x3F, 0x09, 0xFC, 0x0F, 0xE1, 0x9F, 0x0A, 0xFC, 0x39, 0xF0, 0xC5, 0xCB, 0x88, 0xEE, 0xDA, \n    0xCA, 0x3F, 0xED, 0xED, 0x52, 0xE1, 0xCF, 0xCD, 0x3C, 0xD7, 0x04, 0x19, 0x0A, 0x3F, 0x5F, 0x2D, \n    0x48, 0x0B, 0xC0, 0xE8, 0x06, 0x3E, 0x4F, 0x3F, 0xF0, 0xD7, 0x15, 0x80, 0xA1, 0xCD, 0x4A, 0x5C, \n    0xF3, 0x84, 0x79, 0xAA, 0xA4, 0xB4, 0x82, 0x7B, 0x26, 0xEF, 0xF1, 0x3D, 0xEC, 0xB5, 0x4B, 0x57, \n    0xA5, 0x9B, 0xFA, 0xAC, 0x87, 0xC4, 0x4C, 0x26, 0x61, 0x59, 0x46, 0x6B, 0x92, 0x13, 0x93, 0x8D, \n    0x26, 0xDE, 0xB5, 0x2D, 0xBB, 0x4B, 0xF9, 0x53, 0xD2, 0xEF, 0x46, 0xF4, 0x5A, 0xDD, 0x2F, 0xCA, \n    0x8A, 0x2A, 0x4B, 0x98, 0x7C, 0x89, 0x99, 0x7F, 0xBA, 0x6A, 0x3A, 0xFC, 0xC4, 0xFD, 0x1C, 0x28, \n    0xA2, 0x95, 0x46, 0xE6, 0xC5, 0x00, 0x3E, 0x1B, 0x69, 0x2E, 0x1B, 0x08, 0xAC, 0xD9, 0x38, 0xE0, \n    0x56, 0xE3, 0x7C, 0x37, 0xD5, 0x22, 0xB1, 0x5B, 0x86, 0xB5, 0x99, 0x63, 0x71, 0xB9, 0x58, 0xA9, \n    0xC3, 0x0F, 0x6A, 0xFB, 0x1F, 0xFE, 0x08, 0xFB, 0xE0, 0xAB, 0x3B, 0x8F, 0x18, 0x6A, 0x8D, 0xE2, \n    0xAF, 0x0D, 0xE8, 0xDE, 0x2E, 0xF8, 0x7F, 0x7C, 0x82, 0xDF, 0x5A, 0xD3, 0x6E, 0xE2, 0x53, 0x70, \n    0xC0, 0xF4, 0x7B, 0x77, 0xFB, 0xF1, 0xC8, 0xBD, 0x43, 0x03, 0xDB, 0xD7, 0x06, 0xBF, 0x46, 0xFF, \n    0x00, 0x6B, 0x9F, 0xF8, 0x26, 0xEF, 0x84, 0x34, 0x9F, 0x85, 0x3A, 0x3E, 0xA1, 0xE1, 0x73, 0x1E, \n    0xB5, 0xF0, 0xCF, 0xC4, 0x10, 0xE3, 0x41, 0xD4, 0x96, 0x20, 0x27, 0xD2, 0x25, 0xC7, 0x36, 0xB3, \n    0xE3, 0xEE, 0xC8, 0xBD, 0x39, 0xE1, 0xBA, 0xD7, 0xE8, 0x7C, 0x33, 0xC0, 0x35, 0xF3, 0x48, 0x29, \n    0x55, 0x97, 0xB3, 0xF6, 0x89, 0xFB, 0x36, 0xD6, 0x93, 0x92, 0xDE, 0x37, 0xE8, 0xEC, 0x9B, 0x57, \n    0xDE, 0xCE, 0xD7, 0xB3, 0xB7, 0xC2, 0x71, 0x27, 0x1C, 0x61, 0xF2, 0xB6, 0xF9, 0x57, 0x3F, 0xB3, \n    0x6B, 0xDA, 0x24, 0xF5, 0x84, 0x5F, 0xDA, 0xB7, 0x55, 0x7B, 0x5E, 0xDB, 0x69, 0x7D, 0xD1, 0xF8, \n    0xBB, 0xFB, 0x31, 0xFC, 0x65, 0xBA, 0xF8, 0x3F, 0xE3, 0xCB, 0x4B, 0xA8, 0x64, 0x68, 0x25, 0x85, \n    0xC7, 0x3D, 0x98, 0x77, 0x07, 0xD8, 0xD7, 0xEC, 0x8F, 0xEC, 0x55, 0xFB, 0x5B, 0x5C, 0x68, 0xBA, \n    0x96, 0x8F, 0xE3, 0xCF, 0x0A, 0x4E, 0xB1, 0xDF, 0x58, 0x90, 0xB7, 0x76, 0x64, 0xFE, 0xEE, 0x65, \n    0x3F, 0xEB, 0x21, 0x90, 0x77, 0x47, 0x5C, 0x8F, 0xC7, 0xDA, 0xBF, 0x21, 0xBF, 0x6A, 0xFF, 0x00, \n    0xD9, 0xD2, 0xFF, 0x00, 0xE0, 0xA7, 0x8D, 0xAE, 0xA1, 0x78, 0x4C, 0x66, 0x17, 0xC8, 0x2A, 0x38, \n    0x61, 0xD9, 0x87, 0xB1, 0x15, 0xEA, 0x9F, 0xF0, 0x4F, 0x0F, 0xDA, 0x82, 0x4F, 0x03, 0x78, 0xC2, \n    0xDE, 0xCE, 0xF6, 0x76, 0xFB, 0x0D, 0xC6, 0x21, 0xB8, 0x52, 0x78, 0xDA, 0x7F, 0x8B, 0xFE, 0x03, \n    0xD6, 0xBE, 0xC7, 0x80, 0x73, 0xC9, 0x64, 0xD8, 0xF9, 0xE4, 0x19, 0xBC, 0x6F, 0x4A, 0xA5, 0xE3, \n    0x25, 0x2D, 0x95, 0xF4, 0xFF, 0x00, 0x80, 0xFC, 0x8F, 0x90, 0xF1, 0x03, 0x21, 0x59, 0xCE, 0x5D, \n    0x0C, 0xF3, 0x27, 0x9D, 0xAB, 0x53, 0x4A, 0x71, 0x71, 0x7B, 0xDB, 0x5F, 0xF8, 0x6F, 0x3F, 0x26, \n    0xCF, 0xD3, 0x2F, 0xF8, 0x2B, 0xFF, 0x00, 0xEC, 0x45, 0xE1, 0xDF, 0x8B, 0x3F, 0x0E, 0x34, 0xFF, \n    0x00, 0x89, 0x9E, 0x04, 0xB3, 0x1F, 0xF0, 0x8D, 0x78, 0xB2, 0x17, 0xB9, 0xB4, 0x89, 0x47, 0xCD, \n    0xA6, 0x5C, 0x8C, 0x99, 0xEC, 0x5B, 0x1D, 0x0A, 0xB6, 0x4A, 0x8F, 0x4A, 0xFC, 0x27, 0xF8, 0xA1, \n    0xE0, 0xD9, 0x3C, 0x1F, 0xE2, 0x39, 0xE1, 0x65, 0x2A, 0xAA, 0xC4, 0x0A, 0xFE, 0x93, 0x7F, 0x62, \n    0x9D, 0x6E, 0xD3, 0xE2, 0xC6, 0x89, 0xE2, 0x4F, 0x83, 0x7A, 0xBC, 0xD1, 0xFF, 0x00, 0x66, 0xF8, \n    0xEA, 0xDC, 0xDD, 0x68, 0x93, 0x49, 0xCA, 0xD9, 0x6A, 0x91, 0xAE, 0x62, 0x65, 0xFF, 0x00, 0x7F, \n    0x01, 0x48, 0x1D, 0x6B, 0xF1, 0x97, 0xFE, 0x0A, 0x91, 0xFB, 0x36, 0xCD, 0xF0, 0xD3, 0xE2, 0x4E, \n    0xA4, 0xE6, 0xCD, 0xAD, 0x4B, 0xCA, 0xEC, 0xF1, 0x15, 0xC1, 0x86, 0x40, 0xC5, 0x64, 0x8C, 0xFB, \n    0xAB, 0x86, 0xE3, 0xE9, 0x5D, 0xFE, 0x26, 0xF0, 0xCB, 0x74, 0x67, 0x53, 0x7A, 0x94, 0x2C, 0x9C, \n    0xBA, 0xCE, 0x9C, 0xAF, 0xEC, 0xE4, 0xDF, 0x56, 0xAC, 0xE1, 0x27, 0xD5, 0xC5, 0x3F, 0xB4, 0x79, \n    0xBE, 0x18, 0x71, 0x44, 0x67, 0x52, 0x34, 0xBE, 0x1A, 0x75, 0xD3, 0x6A, 0x3D, 0x21, 0x56, 0x36, \n    0xF6, 0x90, 0x4B, 0xA4, 0x5D, 0xD5, 0x48, 0x2E, 0x8A, 0x4D, 0x7D, 0x93, 0xE2, 0x6A, 0x29, 0xD2, \n    0x27, 0x97, 0x23, 0x29, 0xFE, 0x13, 0x8A, 0x6D, 0x7F, 0x3E, 0x1F, 0xBE, 0x05, 0x14, 0x51, 0x40, \n    0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, \n    0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, \n    0x05, 0x14, 0x51, 0x40, 0x05, 0x58, 0xD2, 0xED, 0xBE, 0xD7, 0x7F, 0x1C, 0x63, 0xF8, 0x8D, 0x57, \n    0xAD, 0xCF, 0x87, 0xB6, 0x5F, 0x6E, 0xF1, 0x35, 0xB2, 0x7A, 0xB8, 0xAD, 0x28, 0xC7, 0x9A, 0x6A, \n    0x3D, 0xD9, 0x15, 0x25, 0xCB, 0x16, 0xCF, 0xD7, 0xCF, 0xF8, 0x37, 0xEB, 0xF6, 0x65, 0xB5, 0xF1, \n    0xEF, 0xC5, 0x9D, 0x03, 0xFB, 0x42, 0x38, 0xD6, 0xC2, 0x4B, 0xA5, 0x9A, 0xED, 0xE4, 0x1F, 0x20, \n    0xB5, 0xB7, 0x53, 0x71, 0x3E, 0x4F, 0x60, 0x56, 0x30, 0x3F, 0x1A, 0xF6, 0x6F, 0xDB, 0xD3, 0xF6, \n    0x8B, 0x9B, 0xC4, 0x7A, 0xF7, 0x8F, 0xBC, 0x79, 0x3B, 0x04, 0x92, 0xF6, 0xE2, 0x5F, 0xB2, 0x2E, \n    0x72, 0xB1, 0x2E, 0x4A, 0x44, 0x83, 0xD8, 0x0C, 0x57, 0x47, 0xFF, 0x00, 0x04, 0x63, 0xD1, 0x63, \n    0xF8, 0x69, 0xFB, 0x2B, 0x7C, 0x46, 0xF1, 0x47, 0x92, 0x0C, 0x9A, 0x77, 0x82, 0xEE, 0x62, 0x85, \n    0xFF, 0x00, 0xE7, 0x9C, 0xD7, 0x92, 0xC7, 0x6E, 0x18, 0x7B, 0xED, 0x2D, 0x5F, 0x23, 0xFF, 0x00, \n    0xC1, 0x49, 0x3C, 0x60, 0xDE, 0x1F, 0xF8, 0x35, 0x6F, 0x68, 0xAD, 0xB5, 0xAE, 0xE4, 0x2E, 0xFC, \n    0xF5, 0x00, 0x7F, 0x8D, 0x7F, 0x5D, 0x64, 0xF6, 0xCA, 0xF2, 0xAA, 0xD8, 0xA8, 0xE9, 0xEC, 0x28, \n    0xC2, 0x11, 0xF2, 0x94, 0xD7, 0xB4, 0x93, 0xF9, 0xF3, 0x53, 0xFF, 0x00, 0xC0, 0x4F, 0xE4, 0xAC, \n    0xEA, 0x2F, 0x36, 0xCE, 0x70, 0xF8, 0x49, 0x6A, 0xAB, 0xD7, 0x9C, 0xE5, 0xE7, 0x0A, 0x5F, 0xBB, \n    0x8A, 0xF9, 0x72, 0xD4, 0x7F, 0xF6, 0xF1, 0xF9, 0xB9, 0xF1, 0x73, 0xC4, 0x53, 0xF8, 0xF3, 0xE2, \n    0x14, 0xCA, 0x5D, 0xA4, 0xDD, 0x2E, 0x3D, 0x73, 0xCD, 0x7E, 0x86, 0x7F, 0xC1, 0x2D, 0x7F, 0x66, \n    0x99, 0xA0, 0xD2, 0xAD, 0xB5, 0x28, 0x6C, 0x4D, 0xCE, 0xAB, 0xAA, 0xCD, 0x1E, 0x9F, 0xA6, 0x44, \n    0x07, 0xCD, 0x24, 0xAE, 0x42, 0xF1, 0xEE, 0x49, 0x55, 0x07, 0xDC, 0xD7, 0xE7, 0x8F, 0xC2, 0x6D, \n    0x2D, 0xBC, 0x51, 0xF1, 0x26, 0x3C, 0xFC, 0xC5, 0xA5, 0xE3, 0xEB, 0x9A, 0xFE, 0x81, 0x3F, 0xE0, \n    0x93, 0xDE, 0x00, 0xB3, 0xF0, 0x2E, 0xB3, 0x06, 0xBD, 0x73, 0x0C, 0x26, 0xCF, 0xE1, 0x9F, 0x85, \n    0xEE, 0x7C, 0x44, 0x52, 0x55, 0xF9, 0x24, 0xB8, 0x58, 0xC2, 0xC2, 0xA7, 0xDF, 0xCD, 0x95, 0x48, \n    0xFF, 0x00, 0x76, 0xBF, 0x33, 0xF0, 0xC7, 0x0F, 0x17, 0x5F, 0x15, 0x9F, 0x56, 0x8F, 0x33, 0xA2, \n    0x9B, 0x8A, 0x7D, 0x66, 0xF4, 0x8A, 0xF9, 0xBD, 0x3D, 0x4F, 0xD3, 0xBC, 0x50, 0xC4, 0xCB, 0xEA, \n    0xF8, 0x5C, 0x86, 0x8C, 0xB9, 0x15, 0x79, 0x28, 0xC9, 0xAE, 0x90, 0x5A, 0xCD, 0xFC, 0x97, 0xE0, \n    0x74, 0xDF, 0xB6, 0xEF, 0xC4, 0x4D, 0x2F, 0xF6, 0x70, 0xF8, 0x6B, 0x6F, 0xF0, 0x7F, 0x47, 0xBC, \n    0x58, 0xF4, 0x8F, 0x0A, 0xC6, 0x2F, 0xBC, 0x5D, 0x7B, 0x1E, 0x41, 0xD5, 0x75, 0x2D, 0xA0, 0xB2, \n    0x37, 0xAA, 0x46, 0x78, 0x0B, 0xCF, 0x38, 0xAF, 0xC3, 0xDF, 0xDB, 0xB3, 0xF6, 0xB0, 0xB8, 0xF8, \n    0xAB, 0xE2, 0x69, 0xED, 0xD6, 0x42, 0xB6, 0x90, 0x31, 0x48, 0x20, 0x0D, 0xF2, 0xC4, 0xBF, 0xE2, \n    0x7B, 0x9A, 0xFB, 0x0B, 0xFE, 0x0A, 0x7D, 0xF1, 0xD6, 0xEA, 0xC3, 0xC1, 0xF3, 0xAC, 0xB7, 0x12, \n    0x35, 0xF6, 0xBD, 0x3C, 0x97, 0xD7, 0x4C, 0xC7, 0xE6, 0x7C, 0xB6, 0x79, 0x3F, 0x52, 0x3F, 0x2A, \n    0xFC, 0xA1, 0xF1, 0x26, 0xAF, 0x26, 0xB1, 0xAB, 0x4D, 0x34, 0x8C, 0x58, 0xB3, 0x13, 0x5D, 0x9E, \n    0x29, 0x67, 0xD5, 0x32, 0xFA, 0x31, 0xC8, 0x68, 0x4A, 0xF2, 0xF8, 0xAA, 0xCB, 0xAC, 0xE7, 0x2D, \n    0x64, 0xDF, 0xE8, 0xBA, 0x2B, 0x2D, 0x92, 0x38, 0x3C, 0x2D, 0xC8, 0xE9, 0xE3, 0xEA, 0x4B, 0x88, \n    0x2B, 0x46, 0xC9, 0xFB, 0xB4, 0xA3, 0xD2, 0x14, 0xE3, 0xA4, 0x52, 0xF3, 0xEE, 0xFA, 0xBB, 0xBD, \n    0xDB, 0x28, 0xCD, 0x2F, 0x9D, 0x2B, 0x31, 0xFE, 0x23, 0x5E, 0xBF, 0xF0, 0x6B, 0xF6, 0x06, 0xF8, \n    0xB9, 0xF1, 0xEB, 0x49, 0x5D, 0x43, 0xC3, 0x7E, 0x0B, 0xD4, 0xAE, 0x34, 0xD7, 0x19, 0x5B, 0xBB, \n    0x82, 0x96, 0xB0, 0xB8, 0xF5, 0x53, 0x21, 0x52, 0xC3, 0xDD, 0x41, 0x15, 0xE9, 0x3F, 0xF0, 0x4B, \n    0x2F, 0xD9, 0x73, 0x4D, 0xF8, 0xDD, 0xF1, 0x5D, 0xF5, 0xEF, 0x11, 0x5B, 0xA5, 0xD6, 0x87, 0xE1, \n    0xF9, 0x13, 0x65, 0xBC, 0x83, 0x29, 0x73, 0x70, 0x79, 0x1B, 0x87, 0x75, 0x50, 0x33, 0x8F, 0x52, \n    0x2B, 0xF7, 0xB3, 0xE0, 0x77, 0x86, 0x7C, 0x3A, 0xBE, 0x0F, 0x58, 0xE4, 0x58, 0x61, 0x58, 0xE2, \n    0xC4, 0x68, 0xAA, 0x15, 0x46, 0x3A, 0x0C, 0x57, 0xF1, 0xAF, 0x13, 0xF1, 0xF4, 0xB0, 0x78, 0xE7, \n    0x96, 0x60, 0x23, 0x17, 0x52, 0x2A, 0xF2, 0x94, 0xAF, 0x65, 0x7D, 0x52, 0xB2, 0x6A, 0xEE, 0xDA, \n    0xBD, 0x74, 0xF3, 0x3F, 0xB7, 0x78, 0x47, 0xC2, 0xD5, 0x8C, 0xCA, 0xE1, 0x9D, 0x66, 0x92, 0x94, \n    0x69, 0x4D, 0xB5, 0x08, 0xC2, 0xDC, 0xD2, 0x49, 0xD9, 0xC9, 0xB6, 0x9A, 0x4A, 0xF7, 0x49, 0x59, \n    0xB7, 0xBE, 0x8A, 0xD7, 0xFE, 0x71, 0x7E, 0x2D, 0xFE, 0xC2, 0xFF, 0x00, 0x15, 0x3E, 0x08, 0xD9, \n    0xC9, 0x73, 0xAF, 0xF8, 0x46, 0xFE, 0x3B, 0x38, 0x86, 0x5E, 0x7B, 0x66, 0x4B, 0x94, 0x41, 0xDC, \n    0xB7, 0x96, 0x49, 0x00, 0x7A, 0x91, 0x8A, 0xF2, 0x45, 0x6D, 0xAD, 0x9A, 0xFE, 0x88, 0xFF, 0x00, \n    0x69, 0x7D, 0x13, 0x4F, 0x1A, 0x84, 0x91, 0xC2, 0xB1, 0xBA, 0x31, 0xDA, 0x54, 0x8C, 0x82, 0x3D, \n    0x31, 0x5F, 0x8D, 0xBF, 0xF0, 0x51, 0xAF, 0x80, 0x5A, 0x6F, 0xC3, 0x0F, 0x89, 0x4D, 0xAC, 0x68, \n    0xB0, 0xC7, 0x6B, 0x63, 0xAA, 0x48, 0xC2, 0x7B, 0x74, 0x18, 0x48, 0xA5, 0xE4, 0xE5, 0x47, 0x60, \n    0xDC, 0xF1, 0xEA, 0x3D, 0xEB, 0x8F, 0x83, 0x3C, 0x47, 0x9E, 0x67, 0x8E, 0x96, 0x59, 0x8E, 0x82, \n    0x8C, 0xFE, 0xCC, 0xA3, 0x7B, 0x3F, 0x26, 0x9B, 0x76, 0x7E, 0x77, 0xD4, 0xF4, 0xBC, 0x40, 0xF0, \n    0x82, 0x9E, 0x53, 0x95, 0x47, 0x3A, 0xCA, 0xEA, 0x4A, 0x54, 0xFE, 0xD4, 0x67, 0x6E, 0x65, 0x7E, \n    0xA9, 0xA4, 0x93, 0x5D, 0xD5, 0xAE, 0xB7, 0xBB, 0x31, 0xFF, 0x00, 0x63, 0xCF, 0xDA, 0x22, 0xF3, \n    0xE1, 0x0F, 0x8D, 0x6D, 0x67, 0xB7, 0x97, 0xCB, 0xF9, 0xB6, 0xB2, 0x93, 0xF2, 0x4A, 0xBD, 0xD5, \n    0x87, 0xA1, 0xAF, 0xDC, 0xDF, 0xF8, 0x27, 0x67, 0xED, 0x23, 0xA0, 0xF8, 0xE3, 0x45, 0x6F, 0x08, \n    0x6B, 0xF2, 0x09, 0xBE, 0x1E, 0xFC, 0x4A, 0x8D, 0x6D, 0x6E, 0xD1, 0xDB, 0xFE, 0x41, 0x17, 0xA7, \n    0x88, 0xEE, 0x50, 0xFF, 0x00, 0x0B, 0x2B, 0x60, 0x12, 0x3A, 0x8A, 0xFE, 0x70, 0x34, 0xCB, 0xD6, \n    0xB0, 0xBC, 0x49, 0x15, 0xB6, 0x95, 0x35, 0xFA, 0x51, 0xFF, 0x00, 0x04, 0xB7, 0xF8, 0xC9, 0x36, \n    0xB1, 0xA7, 0xDC, 0x68, 0x92, 0xCE, 0xDF, 0x34, 0x62, 0x78, 0x79, 0xFB, 0xB2, 0x2E, 0x39, 0xFE, \n    0x55, 0xFD, 0x91, 0xE1, 0x5E, 0x79, 0xF5, 0x97, 0x2C, 0x83, 0x16, 0xFD, 0xCA, 0x9F, 0x0B, 0xEB, \n    0x09, 0xAD, 0x63, 0x28, 0xBE, 0x8D, 0x34, 0x9A, 0xF3, 0xB1, 0xFC, 0x3F, 0xE2, 0xA6, 0x4A, 0xF0, \n    0xF4, 0xA3, 0xC4, 0x18, 0x45, 0xEF, 0xD2, 0xF8, 0x97, 0x49, 0xC1, 0xE9, 0x28, 0xC9, 0x75, 0x4D, \n    0x37, 0x7F, 0x2B, 0x9E, 0xD9, 0xFF, 0x00, 0x05, 0x58, 0xFD, 0x90, 0x6E, 0xF4, 0x2B, 0x6F, 0x10, \n    0x69, 0x3A, 0x8D, 0xBF, 0xFC, 0x4F, 0x3C, 0x1B, 0x72, 0xF6, 0xB3, 0x38, 0x4C, 0x7D, 0xA2, 0x1C, \n    0xFC, 0xB2, 0x0E, 0xF8, 0x20, 0xAB, 0x8F, 0x67, 0xAF, 0xC9, 0xDD, 0x0A, 0xEE, 0x6F, 0x87, 0xDF, \n    0x10, 0x94, 0x64, 0xA6, 0xC9, 0x70, 0x7F, 0x3A, 0xFE, 0x8B, 0xFF, 0x00, 0x6E, 0xCD, 0x32, 0x2F, \n    0x8C, 0x7F, 0x08, 0xBE, 0x19, 0xF8, 0xF6, 0x48, 0xD1, 0xA4, 0xF1, 0x97, 0x87, 0x24, 0xD1, 0x75, \n    0x46, 0x07, 0x73, 0x4B, 0x77, 0x64, 0x4C, 0x26, 0x47, 0xFF, 0x00, 0x69, 0xA3, 0x31, 0x9E, 0x7D, \n    0x05, 0x7F, 0x3E, 0xBF, 0xB5, 0x27, 0x84, 0xFF, 0x00, 0xE1, 0x0F, 0xF8, 0x9F, 0x79, 0x12, 0xAE, \n    0xDF, 0x26, 0xE1, 0x93, 0xA7, 0xA1, 0x22, 0xBA, 0xBC, 0x50, 0xC2, 0x4A, 0xA5, 0x2C, 0x36, 0x79, \n    0x6B, 0x54, 0x77, 0x85, 0x4B, 0x6D, 0xED, 0x29, 0xBE, 0x59, 0x7C, 0xAE, 0x9D, 0xBC, 0x8E, 0x5F, \n    0x0B, 0x31, 0x91, 0xA7, 0x53, 0x15, 0x91, 0xA6, 0xDD, 0x38, 0x5A, 0x74, 0xEF, 0xBF, 0xB3, 0xA9, \n    0x15, 0x38, 0xFD, 0xC9, 0xAB, 0xF9, 0x9F, 0xAB, 0x3F, 0xB0, 0xEF, 0xC6, 0xEB, 0xAD, 0x53, 0xE1, \n    0xFF, 0x00, 0x87, 0x35, 0xEB, 0x3B, 0x96, 0x8F, 0x55, 0xF0, 0xEC, 0xF1, 0xB2, 0xC8, 0xAD, 0xF3, \n    0x2B, 0x46, 0x41, 0x53, 0x9F, 0x52, 0x2B, 0xB4, 0xFF, 0x00, 0x83, 0x82, 0x7E, 0x0C, 0x59, 0xF8, \n    0xB2, 0xE9, 0x7C, 0x6B, 0xA6, 0xDA, 0xA4, 0x76, 0x3E, 0x32, 0xD3, 0xAD, 0x7C, 0x4F, 0x6E, 0xA8, \n    0x77, 0x2A, 0x7D, 0xA6, 0x30, 0x27, 0x19, 0xF5, 0x13, 0xA3, 0xF1, 0xDB, 0x35, 0xF2, 0x47, 0xFC, \n    0x12, 0xAB, 0xC6, 0x72, 0x6A, 0x7A, 0x06, 0xA5, 0xA7, 0x3B, 0x6E, 0x53, 0x0A, 0x4A, 0x06, 0x7B, \n    0x8E, 0x3F, 0x95, 0x7E, 0x88, 0xFE, 0xDB, 0x3A, 0x3C, 0x3F, 0x14, 0x7F, 0xE0, 0x99, 0x3F, 0x0E, \n    0xF5, 0x06, 0x4D, 0xF7, 0x5A, 0x40, 0xD5, 0xB4, 0x19, 0xE4, 0x3C, 0xEE, 0x58, 0xE4, 0x5B, 0x88, \n    0x87, 0xE0, 0x24, 0x22, 0xBF, 0x44, 0xF6, 0x8B, 0x36, 0xC9, 0xB0, 0x78, 0x99, 0xEA, 0xEA, 0x42, \n    0x74, 0x65, 0xFF, 0x00, 0x80, 0xB9, 0xC5, 0xBF, 0x49, 0x52, 0x56, 0xFF, 0x00, 0x13, 0xEE, 0x7E, \n    0x77, 0xEC, 0xDE, 0x4F, 0x9F, 0x63, 0x70, 0xB0, 0xD1, 0x53, 0x9D, 0x3A, 0xF1, 0xF2, 0xF7, 0xD4, \n    0x26, 0x97, 0xAC, 0x6A, 0xBB, 0xFF, 0x00, 0x85, 0x76, 0x3F, 0x9C, 0xAF, 0x14, 0xD8, 0x1D, 0x37, \n    0x5B, 0x9E, 0x32, 0x31, 0xB5, 0xC8, 0xAC, 0xEA, 0xEC, 0x3E, 0x34, 0xE9, 0xBF, 0xD9, 0xFE, 0x33, \n    0xBA, 0x5C, 0x63, 0xE7, 0x26, 0xB8, 0xFA, 0xFE, 0x49, 0xC5, 0x53, 0xF6, 0x75, 0xA5, 0x0E, 0xCC, \n    0xFE, 0xB2, 0xC3, 0xD4, 0xE7, 0xA7, 0x19, 0x77, 0x41, 0x45, 0x14, 0x57, 0x39, 0xB0, 0x51, 0x45, \n    0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, \n    0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, \n    0x14, 0x00, 0x57, 0x55, 0xF0, 0x85, 0x37, 0x78, 0xC6, 0xD7, 0xFD, 0xF1, 0x5C, 0xAD, 0x74, 0x9F, \n    0x0B, 0x6E, 0x7E, 0xCB, 0xE2, 0xDB, 0x56, 0x3F, 0xDF, 0x15, 0xD5, 0x83, 0x76, 0xAF, 0x0B, 0xF7, \n    0x46, 0x18, 0x9D, 0x69, 0x4B, 0xD0, 0xFE, 0x87, 0xBF, 0x60, 0x08, 0x57, 0x4E, 0xFF, 0x00, 0x82, \n    0x58, 0xFC, 0x59, 0x99, 0x7E, 0x69, 0x1A, 0xDB, 0x42, 0xB5, 0xC8, 0xEC, 0xAD, 0x76, 0x5C, 0xFE, \n    0x1F, 0x20, 0x15, 0xF9, 0xE3, 0xFF, 0x00, 0x05, 0x60, 0xB9, 0x92, 0x2F, 0x0F, 0x69, 0x51, 0xA9, \n    0x3B, 0x4C, 0x0E, 0x71, 0xF8, 0xD7, 0xE8, 0x07, 0xFC, 0x13, 0x2B, 0x58, 0x5F, 0x14, 0xFF, 0x00, \n    0xC1, 0x38, 0x3E, 0x2C, 0x69, 0x31, 0x0D, 0xF2, 0x49, 0xA0, 0x69, 0xF7, 0xE0, 0x0E, 0xC2, 0xDE, \n    0xF9, 0x37, 0x1F, 0xC9, 0xAB, 0xE1, 0x5F, 0xF8, 0x2A, 0x57, 0x87, 0x9B, 0x51, 0xF8, 0x7F, 0xA6, \n    0xDD, 0xA8, 0x27, 0x6A, 0xBC, 0x47, 0xDB, 0xBD, 0x7F, 0x57, 0x66, 0xD0, 0x73, 0xE1, 0xCC, 0xC5, \n    0x43, 0xBD, 0x37, 0xF2, 0xF6, 0x34, 0x3F, 0xC9, 0x9F, 0xCA, 0x99, 0x4C, 0x95, 0x3E, 0x28, 0xCB, \n    0x5C, 0xFB, 0x56, 0x5F, 0x3F, 0x6F, 0x5F, 0xFC, 0xD1, 0xF0, 0xC7, 0xEC, 0x99, 0x6E, 0xB7, 0x3F, \n    0x15, 0xEC, 0x55, 0xBB, 0xDC, 0x27, 0xFE, 0x86, 0x2B, 0xFA, 0x09, 0xFD, 0x97, 0xAD, 0x57, 0x4E, \n    0xFD, 0x90, 0xBE, 0x3D, 0x6A, 0x11, 0xF1, 0x34, 0x3A, 0x56, 0x95, 0x64, 0x84, 0x75, 0xD9, 0x25, \n    0xE2, 0x6E, 0xFF, 0x00, 0xD0, 0x45, 0x7F, 0x3C, 0xFF, 0x00, 0xB3, 0x8E, 0xAC, 0x34, 0x3F, 0x89, \n    0xD6, 0xCE, 0xDF, 0x2F, 0x97, 0x32, 0xB7, 0xE4, 0xC0, 0xD7, 0xF4, 0x21, 0xFB, 0x07, 0xDC, 0xFF, \n    0x00, 0xC2, 0xC8, 0xF8, 0x29, 0xF1, 0x6F, 0xC3, 0xB6, 0xEE, 0xBE, 0x66, 0xBD, 0xE0, 0xB4, 0xD5, \n    0x60, 0x5D, 0xDF, 0xEB, 0x1A, 0xD2, 0x68, 0xA6, 0x20, 0x7A, 0x9D, 0xBB, 0x8E, 0x3D, 0x8D, 0x7C, \n    0x67, 0x86, 0x35, 0x62, 0xB2, 0x3C, 0x4A, 0x7F, 0x66, 0xAD, 0x09, 0x3F, 0xF0, 0xC6, 0xAC, 0x5C, \n    0xBF, 0x04, 0xCF, 0xB3, 0xF1, 0x3A, 0x94, 0xDE, 0x77, 0x84, 0x6B, 0xED, 0x53, 0xC4, 0x45, 0x7F, \n    0x8A, 0x54, 0x64, 0xA3, 0xF3, 0xBB, 0x47, 0xE4, 0xCF, 0xFC, 0x15, 0x97, 0x52, 0x98, 0x78, 0x96, \n    0x28, 0x77, 0x1F, 0x2D, 0x2D, 0x53, 0x03, 0xD3, 0x35, 0xF0, 0x1C, 0xA7, 0x32, 0x37, 0xD6, 0xBF, \n    0x49, 0xBF, 0xE0, 0xAA, 0xBE, 0x00, 0x93, 0x52, 0xD3, 0xAC, 0x75, 0x48, 0xE3, 0x3B, 0x66, 0x80, \n    0xC6, 0xC4, 0x0F, 0xE2, 0x5F, 0xFE, 0xB5, 0x7E, 0x6E, 0x5E, 0x42, 0xD6, 0xF7, 0x2E, 0xAD, 0xFC, \n    0x27, 0x15, 0xF1, 0x1E, 0x2D, 0xE1, 0xEA, 0x53, 0xE2, 0x2A, 0xCE, 0xA7, 0x57, 0x75, 0xE8, 0xCF, \n    0xB4, 0xF0, 0x97, 0x11, 0x4E, 0xAF, 0x0D, 0xE1, 0xFD, 0x9F, 0x45, 0x67, 0xEA, 0xB4, 0x67, 0xDE, \n    0xBF, 0xF0, 0x49, 0xBF, 0x1C, 0x59, 0xE8, 0x7F, 0x0E, 0xF5, 0x1B, 0x56, 0x65, 0x59, 0x3E, 0xDE, \n    0xC6, 0x4E, 0x79, 0xE5, 0x53, 0x07, 0xF4, 0xFD, 0x2B, 0xF4, 0x03, 0xC3, 0x3F, 0x1B, 0xAE, 0xB4, \n    0xED, 0x3F, 0x64, 0x37, 0x28, 0xCB, 0xB7, 0xAE, 0xEC, 0x57, 0xE2, 0x67, 0xEC, 0xDB, 0xF1, 0xCE, \n    0x5F, 0x82, 0xDE, 0x2F, 0x69, 0x24, 0x69, 0x3F, 0xB3, 0x2F, 0xB0, 0x97, 0x01, 0x39, 0x31, 0x91, \n    0xF7, 0x5C, 0x0E, 0xF8, 0xC9, 0xC8, 0xF4, 0x3E, 0xD5, 0xF6, 0xCF, 0x86, 0x7E, 0x39, 0x5C, 0x6B, \n    0x3A, 0x3C, 0x37, 0x56, 0x37, 0x31, 0xDD, 0x5A, 0xCC, 0xA1, 0x92, 0x48, 0xDF, 0x86, 0x15, 0xFC, \n    0x3F, 0xE2, 0x17, 0x07, 0xE2, 0x96, 0x6D, 0x3C, 0x75, 0x19, 0x34, 0xAA, 0x6B, 0x7E, 0x9E, 0x6B, \n    0xD5, 0x7E, 0x47, 0xFA, 0x21, 0xE1, 0x57, 0x88, 0x18, 0x2A, 0xB9, 0x15, 0x2C, 0xB7, 0x11, 0x15, \n    0x29, 0x51, 0x56, 0x6B, 0xAD, 0x96, 0xCF, 0xD1, 0xAF, 0xC4, 0xFA, 0xA3, 0xE2, 0x5F, 0xC5, 0xB4, \n    0x78, 0xA5, 0x9E, 0xE2, 0xE1, 0x5E, 0x4C, 0x1C, 0x00, 0x7E, 0xED, 0x7E, 0x73, 0xFF, 0x00, 0xC1, \n    0x40, 0x7E, 0x21, 0xC3, 0xE2, 0x98, 0x1E, 0x10, 0xC1, 0xB1, 0x28, 0xDB, 0xF5, 0xCF, 0xFF, 0x00, \n    0xAE, 0xBD, 0x6B, 0xE2, 0x07, 0xC4, 0xDB, 0xA5, 0xD1, 0xAE, 0x2E, 0x2F, 0x2E, 0x96, 0xDE, 0x08, \n    0xD4, 0xB3, 0x33, 0x36, 0x30, 0x2B, 0xE2, 0x3F, 0x8B, 0xDF, 0x10, 0xFF, 0x00, 0xE1, 0x3C, 0xF1, \n    0x14, 0x8F, 0x13, 0x33, 0x5A, 0xC6, 0xC7, 0x61, 0x3F, 0xC7, 0xEF, 0x5E, 0x87, 0x86, 0xBC, 0x25, \n    0x2A, 0x78, 0xCF, 0xAD, 0xCD, 0xDD, 0xC7, 0x76, 0x71, 0x78, 0xB5, 0xC7, 0x54, 0xA5, 0x95, 0xCB, \n    0x07, 0x1B, 0x2E, 0x75, 0x65, 0x1F, 0x5D, 0xDD, 0xBB, 0x2E, 0xE7, 0x23, 0x5F, 0x62, 0x7F, 0xC1, \n    0x2E, 0x35, 0x89, 0xAD, 0x7E, 0x2A, 0xE9, 0xA8, 0xB9, 0xDA, 0xF2, 0x6C, 0x39, 0xF4, 0x23, 0x9A, \n    0xF8, 0xF6, 0x34, 0xDE, 0xE1, 0x7D, 0x4D, 0x7D, 0xDB, 0xFF, 0x00, 0x04, 0xA6, 0xF8, 0x7F, 0x34, \n    0xDE, 0x34, 0x8F, 0x50, 0x68, 0xFF, 0x00, 0x77, 0x67, 0x13, 0x4A, 0xC4, 0x8E, 0x9C, 0x60, 0x57, \n    0xF5, 0xFF, 0x00, 0x86, 0xB8, 0x7A, 0x95, 0x78, 0x83, 0x0E, 0xA9, 0xF4, 0x92, 0x7F, 0x73, 0x3F, \n    0x83, 0xFC, 0x46, 0xC4, 0x53, 0xA5, 0xC3, 0xF8, 0x99, 0x55, 0xDB, 0x92, 0x4B, 0xEF, 0x5A, 0x1F, \n    0xAF, 0xFA, 0xFC, 0x5F, 0xDA, 0x3F, 0xF0, 0x4D, 0xEF, 0x0D, 0xDC, 0x49, 0xCB, 0x69, 0x7E, 0x39, \n    0xBD, 0xB6, 0x8B, 0x3D, 0x76, 0xC9, 0x6D, 0x03, 0x9C, 0x7B, 0x66, 0xBF, 0x09, 0x7F, 0xE0, 0xA2, \n    0x76, 0xAB, 0x6D, 0xF1, 0xBF, 0x5A, 0x55, 0xE8, 0xB7, 0x8D, 0x8F, 0xD0, 0xD7, 0xEE, 0xD7, 0xC5, \n    0xF8, 0xBF, 0xE1, 0x07, 0xFD, 0x82, 0xFE, 0x15, 0x69, 0x92, 0xC8, 0xAB, 0x71, 0xE2, 0x2D, 0x57, \n    0x54, 0xF1, 0x04, 0x91, 0xFF, 0x00, 0x12, 0x44, 0xA6, 0x38, 0x10, 0x9F, 0xAF, 0x96, 0xDF, 0x95, \n    0x7E, 0x07, 0xFE, 0xDC, 0xFE, 0x24, 0x4F, 0x12, 0x7C, 0x5F, 0xD5, 0x26, 0x56, 0x0D, 0xE6, 0xDD, \n    0xB9, 0xE3, 0xD8, 0xE3, 0xFA, 0x57, 0xEB, 0x1E, 0x27, 0x54, 0x87, 0xF6, 0x13, 0xFE, 0xF6, 0x22, \n    0xB3, 0x5E, 0x8A, 0x6D, 0x3F, 0xFC, 0x9A, 0xEC, 0xFC, 0x9F, 0xC2, 0xEA, 0x53, 0x59, 0xE6, 0xBF, \n    0x67, 0x0D, 0x41, 0x4B, 0xD5, 0xC1, 0x49, 0x7F, 0xE4, 0xB6, 0x3D, 0xF7, 0xFE, 0x09, 0x2D, 0x7F, \n    0x22, 0xF8, 0xB2, 0x48, 0xBF, 0x86, 0x4B, 0x67, 0x07, 0xF0, 0x15, 0xFA, 0xCD, 0xE3, 0x0B, 0x75, \n    0xBE, 0xFF, 0x00, 0x82, 0x51, 0x5F, 0x48, 0xE0, 0x16, 0xB5, 0xF1, 0xC5, 0xCC, 0x69, 0xBB, 0xD1, \n    0xAC, 0x22, 0x27, 0x1F, 0x95, 0x7E, 0x58, 0x7F, 0xC1, 0x25, 0xFC, 0x36, 0xC9, 0x7D, 0x7D, 0x78, \n    0xCB, 0xF2, 0xC3, 0x6B, 0xD7, 0x1D, 0x0B, 0x1C, 0x57, 0xEA, 0x27, 0xC6, 0x9D, 0x41, 0xBC, 0x21, \n    0xFF, 0x00, 0x04, 0xA8, 0xD3, 0x56, 0x4F, 0x91, 0x75, 0xBF, 0x14, 0x6A, 0x77, 0xC9, 0x9F, 0xE2, \n    0x58, 0xAD, 0xA1, 0x8B, 0x23, 0xF1, 0xE2, 0xBD, 0xEE, 0x10, 0x84, 0xA1, 0xC3, 0x58, 0x15, 0x3E, \n    0xB5, 0xAE, 0xBD, 0x14, 0x64, 0xDF, 0xE0, 0x99, 0xE0, 0xF1, 0x8C, 0x94, 0xF8, 0xAB, 0x1D, 0xC9, \n    0xD2, 0x85, 0x9F, 0xAB, 0x94, 0x12, 0xFC, 0x5A, 0x3F, 0x9E, 0xFF, 0x00, 0xDA, 0x46, 0x31, 0x1F, \n    0x8F, 0x2F, 0x00, 0xFE, 0xF9, 0xFE, 0x75, 0xE7, 0x35, 0xDE, 0x7C, 0x7F, 0xBF, 0x17, 0xBE, 0x38, \n    0xBA, 0x6F, 0xF6, 0xCD, 0x70, 0x75, 0xFC, 0xB9, 0x9B, 0x49, 0x3C, 0x65, 0x46, 0xBB, 0xB3, 0xFA, \n    0x8B, 0x2F, 0x4D, 0x61, 0xA0, 0x9F, 0x64, 0x14, 0x51, 0x45, 0x79, 0xE7, 0x60, 0x51, 0x45, 0x14, \n    0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, \n    0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, \n    0x00, 0x56, 0x87, 0x86, 0x6F, 0x7E, 0xC3, 0xAC, 0xC1, 0x27, 0xF7, 0x58, 0x1A, 0xCF, 0xA7, 0x44, \n    0xFE, 0x5C, 0xAA, 0xDE, 0x86, 0xAA, 0x12, 0xE5, 0x92, 0x64, 0xCA, 0x37, 0x56, 0x67, 0xEF, 0x97, \n    0xFC, 0x1B, 0xCF, 0xF1, 0x1E, 0x2F, 0x1B, 0xA6, 0xA1, 0xE0, 0x89, 0xA6, 0x88, 0x2F, 0x8C, 0xB4, \n    0x3B, 0xFF, 0x00, 0x0F, 0x7E, 0xF4, 0xFC, 0xA8, 0xD3, 0x40, 0x64, 0x84, 0xFD, 0x7C, 0xD8, 0x80, \n    0x1E, 0xE6, 0xBC, 0xBB, 0xF6, 0xE0, 0xF8, 0x69, 0x2F, 0x89, 0x3E, 0x0D, 0x6B, 0x56, 0x4F, 0x0F, \n    0xFA, 0x5E, 0x8D, 0x2B, 0x33, 0x29, 0x1F, 0x32, 0xEC, 0x25, 0x5F, 0xF4, 0xCD, 0x7C, 0xCB, 0xFF, \n    0x00, 0x04, 0x74, 0xFD, 0xA7, 0x2E, 0x3E, 0x12, 0xFC, 0x60, 0xD1, 0xAE, 0x2D, 0xEE, 0x04, 0x77, \n    0x16, 0xD7, 0x31, 0x5C, 0x41, 0x93, 0xC7, 0x9D, 0x13, 0x89, 0x13, 0x3E, 0xC4, 0xAE, 0xDF, 0xF8, \n    0x15, 0x7E, 0xAA, 0x7F, 0xC1, 0x41, 0x3E, 0x1B, 0x69, 0xE3, 0xE2, 0xA3, 0x78, 0x93, 0x4D, 0x8D, \n    0x64, 0xF0, 0x9F, 0xC5, 0x0B, 0x05, 0xD7, 0x2C, 0x08, 0x50, 0x13, 0xF7, 0xAB, 0xFB, 0xE8, 0xB1, \n    0xD0, 0x6D, 0x72, 0x46, 0x2B, 0xFA, 0xDB, 0x82, 0xF1, 0x54, 0xB3, 0x3C, 0x0A, 0xC3, 0xCD, 0xE9, \n    0x88, 0xA5, 0xC9, 0xFF, 0x00, 0x6F, 0xD2, 0xBF, 0xE2, 0xE1, 0x28, 0xB5, 0xE5, 0x07, 0xD8, 0xFE, \n    0x4F, 0xE3, 0x8C, 0x2D, 0x5C, 0xAF, 0x30, 0xFA, 0xE5, 0x35, 0xAE, 0x1E, 0xB2, 0xA9, 0xEB, 0x4E, \n    0xAD, 0xBF, 0x05, 0x52, 0x12, 0x4F, 0xFE, 0xBE, 0x2E, 0xE7, 0xF3, 0xB7, 0x2F, 0x99, 0xE0, 0x8F, \n    0x88, 0xED, 0xB8, 0x6C, 0xD9, 0x2F, 0xF5, 0xAF, 0xDA, 0x3F, 0xF8, 0x24, 0x0F, 0xED, 0x65, 0x6B, \n    0xE1, 0x1D, 0x43, 0xC1, 0xFE, 0x20, 0xBA, 0x64, 0xB8, 0xB5, 0xD1, 0x66, 0xFE, 0xCE, 0xD5, 0xA2, \n    0x6F, 0x98, 0x49, 0x65, 0x3A, 0x98, 0xE4, 0xC8, 0xEE, 0x02, 0x3B, 0x1F, 0xAA, 0x0A, 0xFC, 0xB9, \n    0xFD, 0xBA, 0xFE, 0x03, 0x5C, 0x7C, 0x2F, 0xF8, 0x8B, 0x7C, 0xAB, 0x1B, 0x79, 0x71, 0xC9, 0x94, \n    0x7C, 0x7D, 0xF4, 0x3C, 0xA9, 0xFC, 0x46, 0x2B, 0xA3, 0xFF, 0x00, 0x82, 0x7F, 0x7E, 0xD4, 0xCD, \n    0xF0, 0xB3, 0xC5, 0x91, 0x5B, 0xDE, 0xC8, 0xCD, 0x63, 0x71, 0x88, 0x2E, 0x63, 0xCF, 0x54, 0x3D, \n    0xFE, 0xA3, 0xAF, 0xE7, 0x5F, 0x96, 0xF0, 0x86, 0x2E, 0x19, 0x26, 0x75, 0x5F, 0x29, 0xCC, 0xF4, \n    0xA5, 0x55, 0x4A, 0x9C, 0xBC, 0x93, 0xD2, 0xFF, 0x00, 0x23, 0xF5, 0x6E, 0x30, 0xC1, 0x4F, 0x3B, \n    0xC9, 0x68, 0xE6, 0xB9, 0x5B, 0xBD, 0x5A, 0x4E, 0x35, 0x21, 0xE6, 0xD6, 0xB6, 0xF9, 0xAE, 0x87, \n    0xEA, 0x37, 0xFC, 0x14, 0xC3, 0xF6, 0x41, 0xFE, 0xC6, 0xF1, 0x17, 0x89, 0xBC, 0x1F, 0xF2, 0xDC, \n    0x40, 0xE7, 0xFB, 0x4F, 0x42, 0xBA, 0xE3, 0x6D, 0xD5, 0xBC, 0x9F, 0x3C, 0x6C, 0xA7, 0xA7, 0x2A, \n    0x71, 0xED, 0x5F, 0x88, 0x7F, 0x1D, 0xFE, 0x16, 0xDD, 0x78, 0x13, 0xC5, 0x57, 0x51, 0xC9, 0x0B, \n    0xC7, 0xB6, 0x42, 0x0A, 0xB0, 0xC1, 0x07, 0xB8, 0xAF, 0xE8, 0x9F, 0xE1, 0x97, 0xC4, 0x4D, 0x0F, \n    0xF6, 0xCE, 0xFD, 0x9F, 0x34, 0xEF, 0x02, 0xEA, 0x7A, 0xA5, 0xAD, 0xBF, 0x8D, 0xFC, 0x2F, 0x6E, \n    0xD3, 0x78, 0x33, 0x55, 0x99, 0xC0, 0x8F, 0x54, 0xB6, 0xC6, 0xE3, 0x61, 0x23, 0x7A, 0xE3, 0xEE, \n    0x9F, 0x50, 0x2B, 0xF2, 0x53, 0xFE, 0x0A, 0x9F, 0xA5, 0xF8, 0x77, 0x44, 0xD4, 0x24, 0x4B, 0xC4, \n    0x6D, 0x37, 0xC5, 0xD1, 0xCA, 0x61, 0xBB, 0xB0, 0x64, 0xC3, 0x36, 0x38, 0x2C, 0xC3, 0xF8, 0x48, \n    0xF5, 0xEF, 0x5F, 0x4D, 0xE2, 0x36, 0x0E, 0x86, 0x3B, 0x03, 0xCF, 0x8A, 0x9A, 0x58, 0xAC, 0x3A, \n    0x4A, 0x5D, 0x3D, 0xA4, 0x7E, 0xCC, 0xE3, 0xDF, 0x99, 0x6B, 0xE4, 0xEF, 0x1E, 0x8A, 0xFF, 0x00, \n    0x37, 0xE1, 0xBE, 0x22, 0xBE, 0x07, 0x16, 0xE9, 0xE1, 0xA0, 0xDE, 0x16, 0xBB, 0x72, 0x8A, 0xEB, \n    0x4E, 0x5F, 0x6A, 0x9C, 0xBB, 0x72, 0xBD, 0x3C, 0xD5, 0xA5, 0xD5, 0xDB, 0xE0, 0x0A, 0xFA, 0x8B, \n    0xE1, 0xAD, 0x84, 0xBA, 0x37, 0x84, 0x34, 0xD8, 0x95, 0xA4, 0x8D, 0xA3, 0xB7, 0x5E, 0x01, 0xEF, \n    0x8C, 0xD7, 0xCD, 0x16, 0x96, 0x9F, 0x6F, 0xD6, 0x60, 0x81, 0x57, 0x77, 0x9D, 0x32, 0xA0, 0x03, \n    0xBE, 0x48, 0x15, 0xF5, 0xEE, 0x91, 0xA4, 0x79, 0x56, 0xB0, 0xC7, 0xB7, 0xEE, 0x20, 0x5C, 0x7D, \n    0x05, 0x7F, 0x1F, 0xF1, 0x8D, 0x75, 0x18, 0x53, 0xA6, 0xFA, 0xDD, 0xFD, 0xD6, 0xFF, 0x00, 0x33, \n    0xFB, 0x23, 0xC3, 0xBC, 0x2B, 0x9D, 0x5A, 0xB5, 0x57, 0x44, 0x97, 0xDF, 0x77, 0xFA, 0x1C, 0xAF, \n    0xC4, 0x8B, 0x59, 0xB5, 0x6F, 0x09, 0x6A, 0x50, 0xB4, 0x92, 0x48, 0x64, 0x81, 0x80, 0xDC, 0xD9, \n    0xC1, 0xC5, 0x7C, 0xC3, 0x5F, 0x5F, 0xEB, 0xDA, 0x57, 0x99, 0x63, 0x34, 0x78, 0xC8, 0x65, 0x23, \n    0xF3, 0x15, 0xF2, 0x45, 0xF5, 0xA7, 0xF6, 0x7E, 0xA7, 0x35, 0xBB, 0x7F, 0xCB, 0x19, 0x1A, 0x33, \n    0xF8, 0x1C, 0x55, 0x70, 0x7D, 0x65, 0x2A, 0x75, 0x20, 0xBB, 0xA6, 0x4F, 0x88, 0x58, 0x77, 0x0A, \n    0xB4, 0xAA, 0x3E, 0xA9, 0xAF, 0xBA, 0xDF, 0xE6, 0x74, 0x9F, 0x0B, 0x7C, 0x05, 0x71, 0xE3, 0x1D, \n    0x7A, 0x18, 0xE3, 0x8D, 0x99, 0x59, 0x86, 0x78, 0xAF, 0xD8, 0xEF, 0xF8, 0x27, 0x07, 0xEC, 0x89, \n    0xA8, 0x2D, 0xB7, 0x87, 0xFC, 0x2F, 0x63, 0x6B, 0x9D, 0x7B, 0xC5, 0x57, 0x11, 0xC6, 0xCA, 0x46, \n    0x3C, 0x88, 0xF8, 0xFB, 0xC7, 0xB0, 0x0B, 0x92, 0x73, 0xD2, 0xBE, 0x09, 0xFF, 0x00, 0x82, 0x67, \n    0x43, 0xE1, 0x7D, 0x4F, 0xC6, 0xAA, 0xBA, 0x83, 0x0B, 0x8D, 0x62, 0x26, 0x5F, 0xB0, 0x58, 0xEC, \n    0xCF, 0xDA, 0x18, 0xF7, 0x1F, 0xDE, 0x23, 0xB2, 0xD7, 0xED, 0xC6, 0x83, 0xAA, 0xDA, 0xFE, 0xC2, \n    0x1F, 0x04, 0x6E, 0x2E, 0xE6, 0xB8, 0x87, 0xFE, 0x17, 0x0F, 0x8D, 0xAC, 0x4C, 0x69, 0x1A, 0xB0, \n    0x27, 0xC2, 0x7A, 0x7B, 0x8F, 0x99, 0x98, 0xFF, 0x00, 0x0C, 0xEE, 0xBD, 0xBB, 0x7E, 0x15, 0xFD, \n    0x69, 0xE1, 0x7E, 0x0E, 0x86, 0x0B, 0x0F, 0xF5, 0xDA, 0x0D, 0x4F, 0x15, 0x56, 0xF1, 0xA7, 0x1F, \n    0xE5, 0x7D, 0x67, 0x2E, 0xD1, 0x8A, 0xD5, 0xF9, 0x69, 0xBC, 0x92, 0x3F, 0x90, 0x7C, 0x50, 0xC4, \n    0x57, 0xC6, 0xD5, 0x58, 0x2A, 0xC9, 0xC3, 0x0B, 0x4E, 0xD2, 0xAB, 0x2E, 0xB2, 0x4B, 0x68, 0x47, \n    0xBC, 0xA4, 0xF4, 0x5E, 0x7A, 0xEC, 0x99, 0xE4, 0xFF, 0x00, 0xF0, 0x56, 0xDF, 0xDA, 0x13, 0x48, \n    0xD0, 0x35, 0x2D, 0x5A, 0xD7, 0x45, 0xB8, 0x56, 0xD0, 0x3C, 0x0B, 0xA5, 0xC5, 0xE1, 0x3D, 0x19, \n    0x86, 0x14, 0x4E, 0x61, 0x52, 0xB2, 0x48, 0x31, 0xC6, 0x5A, 0x43, 0x2B, 0x64, 0x75, 0x00, 0x57, \n    0xE0, 0xCF, 0xC4, 0x0D, 0x5E, 0x4F, 0x1C, 0x7C, 0x45, 0x93, 0x69, 0x69, 0x37, 0xCB, 0xD7, 0xD7, \n    0x9A, 0xFA, 0xBF, 0xFE, 0x0A, 0x37, 0xFB, 0x58, 0x43, 0xE2, 0xDD, 0x45, 0xB4, 0x5D, 0x2E, 0xE3, \n    0x7E, 0x9F, 0x62, 0x0A, 0x21, 0x07, 0xFD, 0x73, 0x9F, 0xBC, 0xFF, 0x00, 0x8E, 0x30, 0x3E, 0x9E, \n    0xF5, 0xF3, 0xE7, 0xEC, 0xB1, 0xF0, 0x92, 0xF7, 0xE2, 0x87, 0xC4, 0x4B, 0x44, 0x8E, 0x16, 0x91, \n    0xE7, 0x94, 0x05, 0xE3, 0xB9, 0x3F, 0xCB, 0xBD, 0x78, 0xFC, 0x79, 0x8E, 0x86, 0x61, 0x8F, 0xC3, \n    0xE4, 0x59, 0x7B, 0x73, 0x85, 0x14, 0xA3, 0x7F, 0xE6, 0x97, 0xDA, 0x97, 0xAB, 0x7B, 0xF7, 0x3D, \n    0x7E, 0x01, 0xCB, 0xEA, 0x65, 0xF8, 0x0C, 0x46, 0x79, 0x98, 0xA5, 0x0A, 0x95, 0x9B, 0x9B, 0x5F, \n    0xCB, 0x1B, 0x7B, 0xB1, 0xF4, 0x8C, 0x74, 0xF2, 0xD8, 0xFD, 0x08, 0xFF, 0x00, 0x82, 0x75, 0x7C, \n    0x39, 0x6F, 0x07, 0xFC, 0x20, 0x92, 0xF9, 0xA3, 0x2B, 0x26, 0xA0, 0xE1, 0x63, 0xE3, 0x92, 0xAB, \n    0xC7, 0xFE, 0x85, 0x5F, 0x5A, 0x7F, 0xC1, 0x61, 0x7C, 0x5E, 0xBF, 0x06, 0x3F, 0x63, 0xAF, 0x86, \n    0xFE, 0x05, 0x69, 0x91, 0x66, 0xD2, 0xFC, 0x30, 0x2F, 0xAE, 0x10, 0x70, 0x62, 0xB9, 0xD4, 0x25, \n    0x79, 0xD9, 0x5B, 0xFD, 0xA1, 0x18, 0x4A, 0x93, 0xF6, 0x14, 0xFD, 0x9D, 0xAD, 0xFC, 0x6F, 0xF1, \n    0x3F, 0xC2, 0x7E, 0x11, 0x55, 0xF2, 0xB4, 0x4D, 0x25, 0x45, 0xE6, 0xA9, 0x37, 0xDD, 0x58, 0x6D, \n    0x60, 0x1B, 0xE5, 0x72, 0x7A, 0x64, 0x81, 0x5F, 0x1D, 0xFF, 0x00, 0xC1, 0x78, 0x7F, 0x6C, 0x25, \n    0xF8, 0xCD, 0xF1, 0x93, 0x5E, 0xBA, 0xB7, 0x93, 0x6D, 0xBD, 0xD5, 0xCB, 0xC9, 0x0C, 0x43, 0x8F, \n    0x2E, 0x10, 0x04, 0x76, 0xE9, 0x8F, 0xF6, 0x61, 0x44, 0xFC, 0xCD, 0x7E, 0xA9, 0xC4, 0x13, 0xA7, \n    0x93, 0xE5, 0xB4, 0xF0, 0x69, 0xFF, 0x00, 0xBB, 0x52, 0x72, 0x7F, 0xF5, 0xF2, 0xA2, 0x74, 0xE2, \n    0xBE, 0xE7, 0x55, 0xFA, 0x25, 0xDC, 0xFC, 0xA3, 0x86, 0xE3, 0x53, 0x3A, 0xCD, 0x6A, 0xE3, 0x9A, \n    0xFF, 0x00, 0x79, 0xAB, 0x18, 0xAF, 0xFA, 0xF7, 0x49, 0xAA, 0x92, 0x7F, 0xF8, 0x12, 0xA5, 0x1F, \n    0x56, 0xFB, 0x1F, 0x96, 0xFF, 0x00, 0x11, 0xB5, 0x2F, 0xED, 0x3F, 0x14, 0x5D, 0x49, 0x9C, 0xE5, \n    0xCD, 0x60, 0xD4, 0xD7, 0xF7, 0x06, 0xEA, 0xEE, 0x49, 0x09, 0xCE, 0xE3, 0x9A, 0x86, 0xBF, 0x91, \n    0x6B, 0x54, 0xE7, 0x9B, 0x9F, 0x76, 0x7F, 0x5A, 0xD3, 0x8F, 0x2C, 0x54, 0x42, 0x8A, 0x28, 0xAC, \n    0xCB, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, \n    0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, \n    0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x3D, 0x03, 0xE0, 0x17, 0xC4, 0x69, 0xBC, \n    0x07, 0xE3, 0x0B, 0x59, 0xE3, 0x95, 0xA2, 0x31, 0xC8, 0xAC, 0x18, 0x1F, 0xBA, 0x41, 0xC8, 0x35, \n    0xFD, 0x07, 0x7E, 0xC0, 0xDF, 0x15, 0xEC, 0x7F, 0xE0, 0xA0, 0x1F, 0xB1, 0xC4, 0xDF, 0x0E, 0x5A, \n    0x68, 0x4F, 0x8C, 0x7C, 0x3F, 0xBF, 0x57, 0xF0, 0xB1, 0x67, 0x00, 0xC9, 0x30, 0x19, 0xB8, 0xB2, \n    0xCF, 0xA3, 0x8C, 0x95, 0xC9, 0xC7, 0x4A, 0xFE, 0x6D, 0x6D, 0xE7, 0x6B, 0x79, 0x95, 0x94, 0xF2, \n    0xA6, 0xBE, 0xCE, 0xFF, 0x00, 0x82, 0x6D, 0x7E, 0xDC, 0xBA, 0x9F, 0xEC, 0xFB, 0xF1, 0x17, 0x4C, \n    0xBC, 0xB7, 0xBE, 0x9A, 0xD5, 0xAD, 0x67, 0x49, 0x15, 0xE3, 0x6C, 0x34, 0x6C, 0xA4, 0x15, 0x75, \n    0xF7, 0x07, 0xF3, 0xE9, 0x5F, 0xA7, 0xF8, 0x7B, 0xC4, 0x9F, 0x56, 0xAB, 0xF5, 0x1A, 0xB3, 0xE5, \n    0x52, 0x6A, 0x50, 0x93, 0xDA, 0x33, 0x8F, 0xC2, 0xDF, 0x93, 0xBB, 0x8C, 0x97, 0x58, 0xC9, 0xA3, \n    0xF3, 0x7E, 0x3F, 0xE1, 0xBF, 0xAE, 0x51, 0xFA, 0xDD, 0x38, 0x73, 0xB8, 0xA7, 0x19, 0x45, 0x6F, \n    0x3A, 0x72, 0xF8, 0xA2, 0x9F, 0xF3, 0x68, 0xA5, 0x07, 0xD2, 0x71, 0x8B, 0xEE, 0x7D, 0x85, 0xFB, \n    0x69, 0x7E, 0xCD, 0xAB, 0xF1, 0x93, 0xC1, 0x57, 0x1B, 0x6D, 0x9A, 0x3D, 0x73, 0x4B, 0x0C, 0x86, \n    0x27, 0x4D, 0xAE, 0xC0, 0x67, 0x74, 0x64, 0x1E, 0x43, 0x03, 0x9E, 0x3E, 0xB5, 0xF9, 0x51, 0xE3, \n    0xAF, 0x0A, 0x5F, 0x7C, 0x2D, 0xF1, 0x64, 0x98, 0x59, 0x22, 0x31, 0xC8, 0x7A, 0x8C, 0x11, 0x83, \n    0xDE, 0xBF, 0xA3, 0x7F, 0x8B, 0xDA, 0x56, 0x8B, 0xFB, 0x69, 0x7C, 0x27, 0x6F, 0x8D, 0x1F, 0x0F, \n    0x63, 0xB7, 0x6D, 0x66, 0x38, 0x56, 0x4F, 0x18, 0xE8, 0x76, 0x83, 0x2C, 0x92, 0x11, 0xFF, 0x00, \n    0x1F, 0xF0, 0xA0, 0xE4, 0xC6, 0xFD, 0x58, 0x76, 0x39, 0xEF, 0x9C, 0x7E, 0x3D, 0xFF, 0x00, 0xC1, \n    0x52, 0x7C, 0x2D, 0xE1, 0x6D, 0x35, 0xED, 0xF5, 0x3B, 0x3B, 0x88, 0x61, 0xD6, 0x2F, 0x98, 0x99, \n    0xAC, 0xD0, 0x67, 0x78, 0xC7, 0xFA, 0xDF, 0xF6, 0x7D, 0x39, 0xEB, 0xF8, 0x57, 0xE8, 0x3E, 0x25, \n    0x65, 0xB8, 0x4C, 0xCF, 0x07, 0xFD, 0xB5, 0x46, 0xD4, 0xEB, 0xD3, 0xB2, 0xA9, 0x16, 0xD5, 0xD3, \n    0xD3, 0xEF, 0xEF, 0x16, 0xB4, 0x94, 0x5A, 0x68, 0xF8, 0x1F, 0x0C, 0x71, 0xD8, 0xDC, 0xB3, 0x13, \n    0xFD, 0x8B, 0x5A, 0xF5, 0x28, 0x4F, 0x5A, 0x73, 0x4B, 0x47, 0x1F, 0x35, 0xD3, 0xB3, 0x4F, 0x58, \n    0xCA, 0xF1, 0x67, 0x91, 0xFC, 0x2F, 0xFF, 0x00, 0x82, 0x82, 0x78, 0x93, 0xE1, 0x87, 0x85, 0xE4, \n    0xB1, 0xB7, 0x91, 0xA6, 0x45, 0x1B, 0xED, 0x8B, 0x48, 0xCA, 0xD6, 0x92, 0x8E, 0x8E, 0x8C, 0x39, \n    0x18, 0x3C, 0xE3, 0xF9, 0x57, 0x09, 0xFB, 0x40, 0x7E, 0xD6, 0x3A, 0xDF, 0xED, 0x41, 0x24, 0x37, \n    0xBE, 0x33, 0x11, 0x6A, 0x1E, 0x20, 0xB5, 0x41, 0x12, 0xEA, 0xF1, 0xAF, 0x97, 0x3D, 0xCA, 0x0E, \n    0x82, 0x50, 0x38, 0x6C, 0x74, 0x07, 0xAD, 0x79, 0x44, 0x87, 0xE7, 0x6A, 0x6D, 0x7E, 0x07, 0x8E, \n    0xCE, 0x31, 0x78, 0xB8, 0x42, 0x9D, 0x79, 0xB9, 0x28, 0x2B, 0x2B, 0xF4, 0x5D, 0x8F, 0xDD, 0xF0, \n    0x99, 0x6E, 0x1B, 0x0D, 0x29, 0x4E, 0x8C, 0x14, 0x5C, 0x9D, 0xDD, 0xBA, 0xB3, 0xA4, 0xF8, 0x49, \n    0xA2, 0xC9, 0xAF, 0xFC, 0x4B, 0xD1, 0xED, 0xE3, 0x8D, 0xA6, 0xFF, 0x00, 0x49, 0x59, 0x18, 0x0E, \n    0xCA, 0xBF, 0x31, 0x3F, 0x86, 0x2B, 0xEC, 0xAD, 0x2F, 0x49, 0xDC, 0x3A, 0x7E, 0x9D, 0x6B, 0xE5, \n    0x9F, 0xD9, 0x47, 0x4B, 0x7D, 0x4F, 0xE3, 0x15, 0xA1, 0x50, 0xDB, 0x6D, 0xE1, 0x92, 0x56, 0xC1, \n    0xC7, 0x18, 0xDB, 0xFC, 0xD8, 0x57, 0xD9, 0xFA, 0x26, 0x8F, 0x91, 0xF7, 0x7B, 0x57, 0xE2, 0x7C, \n    0x7D, 0x8C, 0xE5, 0xC5, 0x42, 0x9F, 0x68, 0xFE, 0x6D, 0xFF, 0x00, 0xC0, 0x3F, 0xA1, 0xFC, 0x29, \n    0xCB, 0x9C, 0xF0, 0x35, 0x2A, 0xB5, 0xF1, 0x4E, 0xDF, 0x24, 0x97, 0xEA, 0xD9, 0xC5, 0xEB, 0x7A, \n    0x59, 0x08, 0xD9, 0x1D, 0xAB, 0xE3, 0xCF, 0x89, 0xBA, 0x33, 0xE8, 0xFE, 0x3F, 0xD5, 0x61, 0x65, \n    0xDB, 0xFE, 0x90, 0xD2, 0x0C, 0xF1, 0x90, 0xDF, 0x30, 0xFE, 0x75, 0xF7, 0x4F, 0x88, 0xF4, 0x9D, \n    0xA1, 0xBE, 0x5A, 0xF8, 0xDF, 0xF6, 0x9A, 0xD3, 0x9F, 0x4E, 0xF8, 0xB1, 0x75, 0xBB, 0x76, 0xD9, \n    0xA2, 0x8E, 0x44, 0x07, 0xB0, 0xC1, 0x1F, 0xCC, 0x1A, 0xDB, 0x80, 0xF1, 0x9C, 0xD8, 0x89, 0xD3, \n    0xEF, 0x1F, 0xC9, 0xA3, 0x0F, 0x14, 0xB2, 0xF7, 0x0C, 0x25, 0x3A, 0xA9, 0x7C, 0x32, 0xFC, 0x1A, \n    0x7F, 0xAA, 0x46, 0xA7, 0xEC, 0xCD, 0xFB, 0x49, 0xDC, 0x7E, 0xCB, 0x3E, 0x28, 0xFF, 0x00, 0x84, \n    0x93, 0x41, 0xB1, 0xB4, 0xB9, 0xF1, 0x54, 0x20, 0x8B, 0x0B, 0xDB, 0xA5, 0xF3, 0x23, 0xD3, 0x58, \n    0xF1, 0xE6, 0x22, 0x74, 0x2E, 0x3B, 0x13, 0xC0, 0x3F, 0x95, 0x7B, 0x4F, 0xC4, 0xCF, 0xF8, 0x2A, \n    0x0F, 0x8A, 0xBE, 0x26, 0xF8, 0x2D, 0xAD, 0x75, 0x0B, 0x87, 0x6D, 0x52, 0xF4, 0x16, 0xD4, 0xAF, \n    0xCC, 0xA5, 0xA6, 0xBF, 0x6F, 0x73, 0xFC, 0x23, 0xD8, 0x7E, 0x83, 0x8A, 0xF9, 0x06, 0x9D, 0xBC, \n    0xE6, 0xBF, 0x69, 0xCB, 0x33, 0xCC, 0x66, 0x5E, 0xA6, 0xB0, 0xB3, 0xE5, 0xE7, 0x56, 0x76, 0xED, \n    0xDA, 0xE7, 0xF3, 0xDE, 0x61, 0x94, 0x61, 0x71, 0xAE, 0x0F, 0x13, 0x1E, 0x6E, 0x57, 0x75, 0x7E, \n    0xFD, 0xEC, 0x76, 0x76, 0x51, 0x5F, 0xFC, 0x51, 0xF1, 0x42, 0xEE, 0xDC, 0xFE, 0x63, 0x7D, 0x78, \n    0xAF, 0xD3, 0x1F, 0xD8, 0x1F, 0xF6, 0x65, 0x87, 0xE1, 0x57, 0x84, 0xE2, 0xD7, 0xAF, 0xE0, 0xD9, \n    0x7D, 0x75, 0x17, 0xFA, 0x3A, 0x30, 0xE6, 0x34, 0x23, 0x97, 0x3E, 0xE7, 0xA7, 0xD3, 0x35, 0xF1, \n    0x1F, 0xEC, 0x06, 0xFA, 0x0D, 0xDF, 0xC4, 0xC8, 0x57, 0x57, 0x74, 0x69, 0x20, 0xC3, 0xC1, 0x6E, \n    0xC3, 0x89, 0xD8, 0x7A, 0x9F, 0x6E, 0xB8, 0xEF, 0x5F, 0xB9, 0x3F, 0xB2, 0x37, 0xC3, 0xCD, 0x03, \n    0xC1, 0x9F, 0x0F, 0x47, 0xC6, 0x4F, 0x89, 0x11, 0xC7, 0x1F, 0x83, 0xF4, 0x53, 0xBB, 0x45, 0xD2, \n    0xA4, 0x21, 0x1F, 0xC4, 0x57, 0x88, 0x32, 0x88, 0x01, 0xE9, 0x02, 0x11, 0xB9, 0x9B, 0x18, 0xC2, \n    0xFA, 0x66, 0xBF, 0x63, 0xF0, 0xB7, 0x0F, 0x81, 0xC3, 0xC6, 0x59, 0xCE, 0x2F, 0xDF, 0xAB, 0x7B, \n    0x42, 0x2B, 0x56, 0xE4, 0xF6, 0x4B, 0xCD, 0xF4, 0xE8, 0xB5, 0x93, 0xB2, 0x57, 0x3F, 0x22, 0xF1, \n    0x4A, 0xA6, 0x3F, 0x15, 0x08, 0xE4, 0xF8, 0x4F, 0xDD, 0xD3, 0x6A, 0xF3, 0x9B, 0xD1, 0x28, 0x2D, \n    0xDB, 0xF2, 0x5D, 0x7A, 0xBF, 0x85, 0x5D, 0xB3, 0x5B, 0xE2, 0xBF, 0x8B, 0x6D, 0x7F, 0xE0, 0x9F, \n    0xBF, 0xB1, 0x06, 0xA5, 0x71, 0xAA, 0x38, 0xB5, 0xF1, 0xE7, 0xC5, 0x0B, 0x31, 0x2D, 0xC4, 0x4D, \n    0xF2, 0xCD, 0xA5, 0xE9, 0x1D, 0x52, 0x33, 0xDD, 0x5E, 0x63, 0xDB, 0x82, 0x01, 0xAF, 0xE7, 0xEB, \n    0xF6, 0xB4, 0xF8, 0xCB, 0x71, 0xF1, 0x3B, 0xC7, 0x97, 0xD7, 0x12, 0x4B, 0xB9, 0xA6, 0x94, 0xBB, \n    0x60, 0xF0, 0x3D, 0x87, 0xB0, 0xE8, 0x3E, 0x95, 0xF5, 0x97, 0xFC, 0x15, 0xAB, 0xFE, 0x0A, 0x39, \n    0xAA, 0x7E, 0xD2, 0xFF, 0x00, 0x13, 0x35, 0x6B, 0xC9, 0xAF, 0xBC, 0xEF, 0xB5, 0x4C, 0xCD, 0xF2, \n    0x70, 0x9E, 0x8A, 0x14, 0x76, 0x45, 0x1C, 0x28, 0xF4, 0x15, 0xF9, 0xE1, 0xA8, 0xDF, 0x3E, 0xA3, \n    0x76, 0xF2, 0xB9, 0xCB, 0x31, 0xCF, 0x35, 0xE0, 0xF8, 0x8D, 0xC4, 0xD2, 0xAF, 0x27, 0x81, 0x8C, \n    0x94, 0xA4, 0xE4, 0xE5, 0x51, 0xAD, 0x9C, 0xDA, 0x4A, 0xCB, 0xFB, 0xB0, 0x8A, 0x51, 0x8F, 0x74, \n    0x9C, 0xB7, 0x93, 0x3D, 0xBF, 0x0E, 0xF8, 0x66, 0x38, 0x5A, 0x6B, 0x16, 0xE0, 0xE3, 0x15, 0x15, \n    0x1A, 0x71, 0x7B, 0xA8, 0x27, 0x7B, 0xCB, 0xFB, 0xF3, 0x93, 0x73, 0x97, 0x66, 0xD4, 0x76, 0x8A, \n    0x20, 0xA2, 0x8A, 0x2B, 0xF2, 0x33, 0xF5, 0x50, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xAB, 0x9A, 0x2E, 0xB3, 0x36, 0x89, 0x7A, 0x93, 0x44, 0xCC, 0xAC, 0xA7, \n    0x23, 0x06, 0xA9, 0xD1, 0x55, 0x19, 0x38, 0xBB, 0xA1, 0x4A, 0x29, 0xAB, 0x33, 0xED, 0x0F, 0xD8, \n    0xA3, 0xFE, 0x0A, 0xDF, 0xE3, 0x7F, 0xD8, 0xCB, 0x54, 0x8F, 0x51, 0xF0, 0xFD, 0xD0, 0x92, 0x48, \n    0x51, 0x97, 0xEC, 0xF3, 0x31, 0x30, 0xC8, 0x0F, 0x55, 0x71, 0xFC, 0x48, 0xDD, 0xD7, 0xA1, 0xEB, \n    0xD6, 0xB9, 0xBF, 0xDB, 0xEF, 0xE3, 0x67, 0x81, 0x7F, 0x6D, 0x0D, 0x6D, 0xFE, 0x24, 0x78, 0x3A, \n    0xDA, 0x4F, 0x09, 0x78, 0x93, 0x50, 0x01, 0xBC, 0x45, 0xE1, 0x89, 0x24, 0xDD, 0x6C, 0xB3, 0xF7, \n    0x9E, 0xD0, 0x9E, 0x91, 0xB7, 0x74, 0xED, 0xC7, 0xBD, 0x7C, 0xA6, 0x0E, 0x29, 0x55, 0x8A, 0xB6, \n    0x41, 0xC1, 0xF5, 0xAF, 0x53, 0x1B, 0x9E, 0x62, 0xF1, 0x54, 0xE3, 0x4A, 0xBC, 0xAE, 0xA2, 0xAC, \n    0xBD, 0x3A, 0x27, 0xDD, 0x2E, 0x97, 0xDA, 0xEE, 0xDB, 0x9E, 0x76, 0x13, 0x29, 0xC3, 0x61, 0xA7, \n    0x2A, 0x94, 0x63, 0x67, 0x27, 0x77, 0xEB, 0xD5, 0xF9, 0x37, 0xD6, 0xDB, 0xD9, 0x5F, 0x61, 0x08, \n    0xDA, 0x68, 0xA1, 0x9B, 0x71, 0xA2, 0xBC, 0x93, 0xD2, 0x3D, 0xDF, 0xF6, 0x10, 0xF0, 0xF9, 0xD4, \n    0x7C, 0x6D, 0xAB, 0x5E, 0x6D, 0xCA, 0xDB, 0x5B, 0x2C, 0x5B, 0xBB, 0x82, 0xED, 0x9F, 0xFD, 0x92, \n    0xBE, 0xCF, 0xF0, 0xD6, 0x85, 0xB9, 0x47, 0x1D, 0xBF, 0x3A, 0xF9, 0xC7, 0xFE, 0x09, 0xE7, 0xE0, \n    0xC9, 0xA2, 0xF0, 0x8E, 0xA9, 0xAA, 0x4B, 0x01, 0x8E, 0x3D, 0x42, 0xE9, 0x52, 0x17, 0x23, 0xFD, \n    0x62, 0xC6, 0x0E, 0x7F, 0x00, 0x58, 0xFE, 0x39, 0xAF, 0xB1, 0x3C, 0x21, 0xE1, 0xEF, 0x31, 0x07, \n    0xCB, 0xDA, 0xBF, 0x9C, 0xBC, 0x46, 0xCC, 0x97, 0xF6, 0xA5, 0x54, 0x9F, 0xC3, 0x65, 0xF7, 0x25, \n    0xFA, 0xDC, 0xFE, 0xBE, 0xF0, 0x93, 0x29, 0xFF, 0x00, 0x84, 0x3A, 0x12, 0x6B, 0x59, 0x5D, 0xFD, \n    0xF2, 0x76, 0xFC, 0x2C, 0x79, 0xAF, 0x8B, 0x74, 0x6D, 0x9B, 0xBE, 0x5A, 0xF8, 0xD3, 0xF6, 0xD3, \n    0xD1, 0x3E, 0xC1, 0xE3, 0x9D, 0x36, 0xEB, 0x1F, 0x2D, 0xC5, 0xB1, 0x8B, 0xFE, 0xF8, 0x62, 0x7F, \n    0xF6, 0x7A, 0xFB, 0xEF, 0xC7, 0x7A, 0x0F, 0x96, 0x24, 0xF9, 0x7D, 0x6B, 0xE3, 0x5F, 0xDB, 0xCF, \n    0x40, 0x6F, 0xEC, 0xBD, 0x1E, 0xF4, 0x03, 0xB6, 0xDE, 0x79, 0x22, 0x27, 0xD3, 0x78, 0x07, 0xFF, \n    0x00, 0x64, 0xAE, 0xCF, 0x0E, 0xF3, 0x0B, 0xE6, 0x14, 0xD5, 0xF7, 0xBA, 0xFC, 0x1F, 0xEA, 0x79, \n    0xFE, 0x2D, 0x65, 0x76, 0xC9, 0xEB, 0x4A, 0xDF, 0x0F, 0x2B, 0xFF, 0x00, 0xC9, 0x97, 0xE9, 0x73, \n    0xE6, 0x7A, 0x28, 0x14, 0xE6, 0xDA, 0x07, 0x1F, 0x9D, 0x7F, 0x40, 0x9F, 0xCA, 0x27, 0xA5, 0x7E, \n    0xCD, 0x7A, 0xDF, 0x86, 0x7E, 0x1E, 0x78, 0xDE, 0xCF, 0xC4, 0xFE, 0x2D, 0x17, 0x17, 0x9A, 0x7E, \n    0x93, 0x20, 0x9E, 0x1D, 0x2E, 0xDD, 0xF6, 0xC9, 0xA8, 0xC8, 0xBC, 0xAA, 0x33, 0x7F, 0x0A, 0x67, \n    0xAF, 0xA8, 0xE2, 0xBE, 0x92, 0xFD, 0xA8, 0xBF, 0xE0, 0xB0, 0xBE, 0x34, 0xFD, 0xA8, 0x74, 0x0B, \n    0x5B, 0x4D, 0x41, 0x60, 0xD2, 0x6C, 0x6C, 0x60, 0xFB, 0x35, 0xB5, 0x85, 0x9B, 0x15, 0x82, 0xDE, \n    0x11, 0xF7, 0x63, 0x51, 0xD8, 0x60, 0x0C, 0xFF, 0x00, 0x78, 0x8E, 0x6B, 0xE2, 0x12, 0x73, 0x4B, \n    0xB8, 0xE2, 0xBD, 0x3C, 0xBF, 0x36, 0xC4, 0xE0, 0xB9, 0x9E, 0x1E, 0x56, 0x6D, 0x35, 0xF2, 0x7B, \n    0xDB, 0xB5, 0xF6, 0x76, 0xDD, 0x69, 0xB1, 0xC1, 0x8E, 0xCB, 0x70, 0xF8, 0xB4, 0x95, 0x78, 0xDD, \n    0x26, 0x9F, 0xCD, 0x6D, 0x7E, 0xF6, 0xDD, 0x5F, 0x67, 0xAE, 0xE6, 0xA7, 0x8A, 0x7C, 0x51, 0x71, \n    0xE2, 0x6D, 0x45, 0xE6, 0x9A, 0x46, 0x6D, 0xC4, 0xF5, 0x35, 0x95, 0x45, 0x15, 0xE7, 0x4E, 0x72, \n    0x9C, 0xB9, 0xA5, 0xB9, 0xDB, 0x18, 0xA8, 0xAE, 0x54, 0x14, 0x51, 0x45, 0x49, 0x41, 0x45, 0x14, \n    0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, \n    0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, \n    0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, \n    0x50, 0x01, 0x45, 0x14, 0x01, 0x93, 0x40, 0x1F, 0xA0, 0x1F, 0xB0, 0x2E, 0x87, 0x38, 0xF8, 0x13, \n    0xA3, 0xB4, 0xCC, 0x5C, 0x4D, 0x24, 0xAF, 0x10, 0xFE, 0xEA, 0x6F, 0x23, 0x1F, 0x98, 0x27, 0xF1, \n    0xAF, 0xAD, 0xBC, 0x17, 0xA1, 0x2C, 0x16, 0xCA, 0xCE, 0x3E, 0x50, 0x2B, 0xC5, 0xFF, 0x00, 0x63, \n    0xFF, 0x00, 0x06, 0x36, 0x89, 0xF0, 0x7B, 0xC2, 0xF6, 0xAC, 0x9B, 0x58, 0x58, 0xC7, 0x23, 0x0C, \n    0x77, 0x6F, 0x9F, 0xFF, 0x00, 0x66, 0xAF, 0xA3, 0xB4, 0x2D, 0x1F, 0xED, 0x2C, 0xB6, 0xEB, 0xF7, \n    0x54, 0x65, 0x88, 0xAF, 0xE2, 0xFE, 0x36, 0xCC, 0x9E, 0x27, 0x33, 0xAC, 0xE2, 0xF7, 0x9C, 0xBE, \n    0xEB, 0xE9, 0xF8, 0x1F, 0xE8, 0x97, 0x87, 0x39, 0x3C, 0x70, 0xB9, 0x3E, 0x1E, 0x32, 0x56, 0xE5, \n    0xA7, 0x1B, 0xFA, 0xD9, 0x5F, 0xF1, 0x3C, 0xEB, 0xE2, 0x4E, 0x81, 0xE5, 0x09, 0x08, 0x1C, 0x76, \n    0x22, 0xBE, 0x3C, 0xFD, 0xB7, 0xBC, 0x22, 0xDA, 0xBF, 0xC3, 0x3B, 0xC6, 0x56, 0xDA, 0xD6, 0x32, \n    0xAD, 0xC8, 0x18, 0xFB, 0xD8, 0xC8, 0x23, 0xFF, 0x00, 0x1E, 0xCF, 0xE1, 0x5F, 0x77, 0xF8, 0xE3, \n    0x49, 0xF3, 0xF4, 0xE9, 0x15, 0x95, 0xB7, 0x45, 0xC1, 0xFA, 0x57, 0xCA, 0x3F, 0xB5, 0x1E, 0x82, \n    0x2E, 0xFC, 0x15, 0xAC, 0x42, 0xCB, 0xFE, 0xB2, 0xD6, 0x5C, 0x7D, 0x76, 0x9C, 0x57, 0xA9, 0xC0, \n    0x39, 0x84, 0xA9, 0xE3, 0x69, 0x3E, 0xAA, 0x4B, 0xF3, 0x3C, 0x9F, 0x13, 0x32, 0x98, 0xD6, 0xCB, \n    0xEB, 0xD3, 0x6B, 0x49, 0x45, 0xFE, 0x5A, 0x1F, 0x9D, 0x54, 0x53, 0x9D, 0x4C, 0x6D, 0x83, 0xF4, \n    0xA6, 0xD7, 0xF5, 0xE1, 0xFC, 0x06, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, \n    0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, \n    0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, \n    0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, \n    0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x15, 0x35, 0x9C, 0x82, 0x29, 0x95, 0x8E, 0x3E, 0x52, 0x0F, \n    0x35, 0x0D, 0x14, 0xD3, 0xB3, 0x03, 0xEF, 0x2F, 0xD9, 0x77, 0xFE, 0x0A, 0x57, 0xE1, 0x5D, 0x17, \n    0x49, 0xB2, 0xD3, 0x7C, 0x61, 0xA7, 0xDD, 0x69, 0x53, 0xDA, 0xC4, 0x90, 0xAD, 0xDD, 0x92, 0x79, \n    0xD0, 0x48, 0x14, 0x60, 0x12, 0x84, 0x86, 0x4E, 0x00, 0xCE, 0x0B, 0x7D, 0x05, 0x7D, 0x7B, 0xF0, \n    0x9F, 0xF6, 0xDD, 0xF8, 0x2F, 0x7F, 0x10, 0xB8, 0x9B, 0xE2, 0x16, 0x87, 0x6F, 0xBB, 0x24, 0x89, \n    0xFC, 0xC4, 0x61, 0xF8, 0x14, 0xAF, 0xC5, 0x25, 0x95, 0x97, 0xBD, 0x06, 0x62, 0x7F, 0xBB, 0xF9, \n    0x57, 0xE6, 0xB9, 0x97, 0x84, 0xDC, 0x3F, 0x8C, 0xC5, 0x7D, 0x69, 0x73, 0xD3, 0x6F, 0x56, 0xA3, \n    0x25, 0x6B, 0xFF, 0x00, 0xDB, 0xD1, 0x95, 0xBD, 0x13, 0xB7, 0x6B, 0x2D, 0x0F, 0xD9, 0x32, 0x9F, \n    0x1D, 0xB8, 0x9B, 0x03, 0x82, 0xFA, 0x93, 0xF6, 0x75, 0x12, 0xB2, 0x52, 0x9C, 0x5F, 0x35, 0x97, \n    0xF8, 0x25, 0x14, 0xFD, 0x5A, 0xBE, 0x9A, 0xDD, 0xDD, 0x9F, 0xB3, 0x1E, 0x3E, 0xFD, 0xB1, 0x7E, \n    0x11, 0xA5, 0xCD, 0xC3, 0xC7, 0xE3, 0xDD, 0x06, 0x58, 0x5D, 0x4F, 0x31, 0xB4, 0x8D, 0xFF, 0x00, \n    0xB2, 0xD7, 0xC7, 0x7F, 0xB5, 0x1F, 0xED, 0x9D, 0xE1, 0x0D, 0x42, 0xD2, 0xE6, 0xD7, 0xC3, 0x73, \n    0xC9, 0xAD, 0x5C, 0x4A, 0x0A, 0xAC, 0x82, 0x32, 0x90, 0x2E, 0x7B, 0x92, 0xDC, 0x9F, 0xA6, 0x2B, \n    0xE2, 0xB1, 0x31, 0x07, 0xF8, 0x7F, 0x2A, 0x1A, 0x56, 0x61, 0xD6, 0x96, 0x53, 0xE1, 0x4E, 0x49, \n    0x97, 0xE2, 0x56, 0x26, 0x9C, 0xEA, 0x4B, 0xAD, 0xA5, 0x28, 0xDB, 0xFF, 0x00, 0x25, 0x8C, 0x5F, \n    0xE2, 0x56, 0x75, 0xE3, 0xA7, 0x10, 0xE6, 0x58, 0x47, 0x85, 0xA9, 0x4E, 0x94, 0x34, 0xB7, 0x34, \n    0x63, 0x2B, 0xFF, 0x00, 0xE4, 0xD3, 0x92, 0xFC, 0x09, 0xB5, 0x09, 0x84, 0xF3, 0xB3, 0x77, 0x62, \n    0x49, 0xC5, 0x57, 0xA2, 0x8A, 0xFD, 0x2E, 0x4E, 0xEE, 0xE7, 0xE3, 0x21, 0x45, 0x14, 0x52, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x03, 0xFF, 0xD9, \n} ;\n\nconst char sysinfo_jpg[] PROGMEM =\n{\n    0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x60, \n    0x00, 0x60, 0x00, 0x00, 0xFF, 0xE1, 0x00, 0x22, 0x45, 0x78, 0x69, 0x66, 0x00, 0x00, 0x4D, 0x4D, \n    0x00, 0x2A, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x01, 0x12, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, \n    0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x02, 0x01, 0x01, \n    0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x05, 0x03, 0x03, 0x03, \n    0x03, 0x03, 0x06, 0x04, 0x04, 0x03, 0x05, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 0x08, \n    0x09, 0x0B, 0x09, 0x08, 0x08, 0x0A, 0x08, 0x07, 0x07, 0x0A, 0x0D, 0x0A, 0x0A, 0x0B, 0x0C, 0x0C, \n    0x0C, 0x0C, 0x07, 0x09, 0x0E, 0x0F, 0x0D, 0x0C, 0x0E, 0x0B, 0x0C, 0x0C, 0x0C, 0xFF, 0xDB, 0x00, \n    0x43, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x06, 0x03, 0x03, 0x06, 0x0C, 0x08, 0x07, 0x08, \n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, \n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, \n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, \n    0x0C, 0x0C, 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x00, 0xB5, 0x01, 0x40, 0x03, 0x01, 0x22, 0x00, 0x02, \n    0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, 0x00, 0x1F, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, \n    0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, \n    0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, \n    0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04, \n    0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, \n    0x91, 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, 0x33, 0x62, 0x72, 0x82, \n    0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, \n    0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, \n    0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, \n    0x77, 0x78, 0x79, 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, \n    0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, \n    0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, \n    0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, \n    0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xC4, 0x00, \n    0x1F, 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, \n    0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, \n    0x00, 0xB5, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, \n    0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, \n    0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 0x23, \n    0x33, 0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, \n    0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, \n    0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, \n    0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84, \n    0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, \n    0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, \n    0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, \n    0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, \n    0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, \n    0x00, 0x3F, 0x00, 0xFE, 0x7F, 0xE8, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0xA6, \n    0xB6, 0xB3, 0x96, 0xFA, 0x5D, 0x90, 0xC6, 0xF2, 0xB1, 0xEC, 0x8A, 0x49, 0xA0, 0x0F, 0x6E, 0xFD, \n    0x9B, 0xBF, 0x67, 0x6B, 0x7F, 0x8B, 0x1F, 0xB3, 0x57, 0xC6, 0xEF, 0x13, 0xC9, 0xE0, 0xFF, 0x00, \n    0x1B, 0x6B, 0xF7, 0xFE, 0x0B, 0xD2, 0x2C, 0xAE, 0x74, 0xAD, 0x4B, 0x47, 0xB7, 0x69, 0x34, 0xED, \n    0x1A, 0x53, 0x76, 0x8D, 0x71, 0x25, 0xFB, 0x01, 0xF2, 0xC6, 0x6C, 0xE3, 0xB9, 0x2A, 0x4F, 0x1B, \n    0x94, 0x57, 0xB6, 0x7C, 0x3F, 0xFF, 0x00, 0x82, 0x76, 0x68, 0xFA, 0xC7, 0xC7, 0xBF, 0xD9, 0x97, \n    0xC3, 0xFA, 0x97, 0x80, 0x7E, 0x2A, 0x8D, 0x33, 0xE2, 0xB7, 0x85, 0x9B, 0x52, 0xD6, 0x6D, 0xE2, \n    0xB1, 0x7F, 0xB6, 0x6A, 0x37, 0x3B, 0xAE, 0x71, 0x35, 0x90, 0xC7, 0x36, 0xE1, 0x0D, 0x9B, 0x16, \n    0xE9, 0xB5, 0x98, 0xD7, 0x8E, 0xFC, 0x00, 0xFD, 0xAF, 0x3C, 0x6D, 0xFB, 0x39, 0x7E, 0xCC, 0x7F, \n    0x13, 0xBC, 0x03, 0xE1, 0xCB, 0x89, 0x6D, 0xAC, 0x7E, 0x2A, 0x08, 0x6C, 0x35, 0x9B, 0x70, 0xAD, \n    0xFE, 0x91, 0x6A, 0xB0, 0xCE, 0x87, 0x91, 0xC7, 0x59, 0x71, 0x83, 0xEB, 0x5F, 0x4B, 0x78, 0x2F, \n    0xFE, 0x0A, 0xCB, 0xE2, 0x4D, 0x2B, 0xF6, 0x8D, 0xFD, 0x98, 0xFC, 0x55, 0x71, 0xE2, 0x07, 0x8A, \n    0x3F, 0x84, 0x5E, 0x11, 0xFF, 0x00, 0x84, 0x6E, 0x79, 0xFE, 0xCD, 0x39, 0x16, 0x11, 0x98, 0xCC, \n    0x46, 0x32, 0x02, 0xE5, 0xBE, 0x48, 0xE2, 0xFB, 0x80, 0x8A, 0x00, 0xF0, 0xFD, 0x23, 0xF6, 0x38, \n    0xD1, 0xA1, 0xFF, 0x00, 0x82, 0x7C, 0x7C, 0x4B, 0xF8, 0x81, 0xA9, 0x78, 0x77, 0xC7, 0xB1, 0x78, \n    0xBF, 0xC2, 0xFE, 0x3E, 0xB2, 0xF0, 0xE6, 0x9B, 0x7A, 0x96, 0xA4, 0x68, 0xBF, 0x67, 0x71, 0x22, \n    0x4F, 0x0C, 0x8F, 0x8F, 0x9A, 0xE0, 0x48, 0x14, 0x6D, 0x04, 0x63, 0x2B, 0xEB, 0x8A, 0xF6, 0x5D, \n    0x4B, 0xFE, 0x09, 0x7B, 0xE1, 0xB1, 0xFB, 0x69, 0xEA, 0xBE, 0x05, 0xB2, 0xF0, 0x0F, 0xC6, 0x09, \n    0xB4, 0x58, 0x7E, 0x12, 0x4B, 0xE2, 0xDB, 0x6B, 0x19, 0x2C, 0x9C, 0x6A, 0x43, 0x54, 0xFE, 0xCD, \n    0x2F, 0x1C, 0x8C, 0x02, 0x7F, 0xC7, 0xB7, 0xDB, 0x36, 0xAE, 0x3D, 0x0E, 0x33, 0x5E, 0x7D, 0xA8, \n    0xFE, 0xDF, 0x1A, 0xD6, 0xA5, 0xFB, 0x01, 0x78, 0xDB, 0xE1, 0x5C, 0xBA, 0xB4, 0x84, 0x6B, 0xBF, \n    0x12, 0x07, 0x8A, 0xE1, 0xB2, 0xF2, 0x25, 0xCC, 0xA8, 0x5D, 0x65, 0x69, 0x77, 0x6D, 0xDA, 0x3F, \n    0x78, 0xA0, 0xE0, 0x90, 0xDE, 0xD5, 0xEE, 0xB7, 0x7F, 0xF0, 0x59, 0xDD, 0x76, 0xDF, 0xF6, 0xD5, \n    0xF1, 0x47, 0xC4, 0xAB, 0x7F, 0x15, 0x31, 0x96, 0x4F, 0x85, 0xA7, 0xC2, 0x7A, 0x6D, 0xD7, 0xD9, \n    0x2E, 0x70, 0xF3, 0x84, 0x46, 0x58, 0x71, 0xB3, 0x70, 0x3E, 0x60, 0x3F, 0x31, 0x01, 0x78, 0xEB, \n    0x40, 0x1F, 0x33, 0x68, 0xDF, 0xB1, 0x28, 0xD5, 0xFF, 0x00, 0x64, 0xDF, 0x81, 0x7E, 0x32, 0x8F, \n    0xC1, 0x7E, 0x3D, 0xBA, 0xD4, 0xFE, 0x23, 0xF8, 0xFB, 0x50, 0xF0, 0xFD, 0xDD, 0xDC, 0x16, 0xCC, \n    0xD6, 0x7A, 0x95, 0xAA, 0x1B, 0x45, 0xB6, 0x86, 0xD3, 0x8F, 0x9A, 0xE1, 0x9C, 0x6A, 0x03, 0x8C, \n    0xE4, 0xC3, 0x8E, 0xD5, 0xD4, 0x78, 0xF3, 0xF6, 0x05, 0xD2, 0xB4, 0x9B, 0xFF, 0x00, 0xDA, 0xC2, \n    0x1B, 0x1F, 0x05, 0x7C, 0x46, 0xB7, 0x6F, 0x84, 0x26, 0xDA, 0xE3, 0xC3, 0xE6, 0xEA, 0xD5, 0x95, \n    0x34, 0x9B, 0x73, 0x78, 0xBE, 0x6F, 0xF6, 0x8B, 0x11, 0x85, 0x73, 0x6A, 0xDB, 0x94, 0x1E, 0xA7, \n    0x3E, 0x95, 0x63, 0xC2, 0x3F, 0xF0, 0x51, 0xAD, 0x7B, 0xC2, 0xDF, 0xB3, 0x17, 0xEC, 0xE1, 0xE0, \n    0x68, 0x75, 0xA6, 0x8E, 0xDF, 0xE1, 0x0F, 0x8D, 0xAE, 0x3C, 0x4E, 0x6D, 0xFC, 0x89, 0xBF, 0xD0, \n    0x1F, 0xED, 0x0D, 0x2C, 0x72, 0x13, 0xB7, 0x0D, 0x9F, 0xB4, 0x4E, 0x70, 0x84, 0x9F, 0x6A, 0xDA, \n    0xD7, 0x3F, 0xE0, 0xA7, 0xFA, 0xE7, 0x89, 0x5B, 0xF6, 0xB4, 0x8A, 0xF7, 0xC4, 0x05, 0xA1, 0xF8, \n    0xE7, 0x12, 0x00, 0x3E, 0xCF, 0x37, 0xFC, 0x4C, 0x99, 0x09, 0x41, 0x8F, 0x97, 0xE5, 0xFD, 0xD8, \n    0x5F, 0xBF, 0xB6, 0x80, 0x21, 0xF8, 0x7D, 0xFF, 0x00, 0x04, 0xF1, 0xF0, 0xAE, 0xA7, 0xF1, 0xDB, \n    0xF6, 0x51, 0xD1, 0x75, 0x6F, 0x07, 0x7C, 0x58, 0x8F, 0x4A, 0xF8, 0xB9, 0xA1, 0x7D, 0xB7, 0xC4, \n    0x76, 0xD1, 0x69, 0xEC, 0x2F, 0x6F, 0xA6, 0x59, 0xA6, 0x0F, 0x2D, 0x82, 0xE3, 0x26, 0x1F, 0x2C, \n    0xC0, 0xC1, 0xB9, 0x18, 0x39, 0xAE, 0x03, 0x59, 0xFD, 0x89, 0x6D, 0x74, 0x3F, 0xD8, 0xD3, 0xE3, \n    0x5F, 0x8D, 0xA6, 0xF0, 0x8F, 0x8F, 0xA2, 0xD6, 0x7C, 0x03, 0xF1, 0x0A, 0xCB, 0xC3, 0x76, 0x37, \n    0xB2, 0xDA, 0x3A, 0xE9, 0xF6, 0x16, 0x8D, 0xF6, 0x95, 0xB8, 0x8E, 0xE8, 0xED, 0xC0, 0x9C, 0x3F, \n    0xD8, 0xD7, 0x9C, 0x60, 0xC8, 0x07, 0xF1, 0x57, 0xB2, 0xF8, 0x57, 0xFE, 0x0A, 0xC9, 0xAA, 0x45, \n    0xFB, 0x40, 0xFE, 0xCA, 0xFE, 0x2C, 0xBF, 0xF1, 0x2F, 0x97, 0x27, 0xC1, 0xAF, 0x0D, 0x9D, 0x1A, \n    0xE2, 0x73, 0x6D, 0x39, 0xFE, 0xCE, 0x05, 0x7C, 0xBD, 0x84, 0x04, 0xCB, 0x7C, 0x88, 0x9F, 0x70, \n    0x30, 0xAE, 0x1B, 0xC7, 0x1F, 0xF0, 0x52, 0xED, 0x77, 0xC5, 0xBF, 0xB0, 0xE7, 0xC6, 0x5F, 0x00, \n    0x4F, 0xAE, 0x79, 0x97, 0x9F, 0x15, 0x3E, 0x24, 0x1F, 0x13, 0xDF, 0x59, 0xF9, 0x32, 0xE6, 0xEE, \n    0x12, 0xD1, 0x4C, 0x65, 0xDD, 0xB7, 0x60, 0xFD, 0xEC, 0x11, 0xF0, 0x48, 0x6E, 0x3A, 0x50, 0x06, \n    0xC6, 0xAB, 0xFF, 0x00, 0x04, 0xD5, 0xD3, 0xB4, 0xAF, 0xDA, 0xD5, 0x7C, 0x0E, 0xDF, 0x0E, 0x7E, \n    0x2C, 0xB5, 0xB9, 0xF8, 0x51, 0x17, 0x89, 0xCD, 0x88, 0xB3, 0x73, 0x7C, 0xBA, 0xAB, 0x69, 0x81, \n    0xDA, 0x76, 0x18, 0x05, 0x6D, 0x05, 0xE8, 0x75, 0xC9, 0xEC, 0x31, 0x5E, 0x5F, 0xFF, 0x00, 0x0C, \n    0x6D, 0x69, 0x7D, 0xFB, 0x16, 0xFC, 0x1F, 0xF1, 0xE5, 0xA7, 0x85, 0x3C, 0x78, 0xDA, 0xC7, 0x8B, \n    0xBC, 0x77, 0x7B, 0xE1, 0x9D, 0x4E, 0xE7, 0xEC, 0x6C, 0x6C, 0xB5, 0x28, 0xF1, 0x09, 0xB5, 0x8A, \n    0xCB, 0x8F, 0xDE, 0x4B, 0xF2, 0xDD, 0x2B, 0x63, 0xF8, 0x94, 0x0E, 0xD5, 0xEE, 0xDE, 0x23, 0xFF, \n    0x00, 0x82, 0xCA, 0xF8, 0x9E, 0xF3, 0xF6, 0xD9, 0xD5, 0xFE, 0x24, 0xC5, 0xE2, 0x7D, 0xED, 0x77, \n    0xF0, 0xD4, 0xF8, 0x41, 0x2E, 0xBC, 0x89, 0xC0, 0x6F, 0xDC, 0x16, 0xF2, 0xB0, 0x57, 0x76, 0x7C, \n    0xD6, 0x61, 0x9C, 0x6D, 0xF7, 0xC7, 0x35, 0xE7, 0x1E, 0x1E, 0xFF, 0x00, 0x82, 0x91, 0xEB, 0x1A, \n    0x2F, 0xEC, 0x4B, 0xF0, 0x57, 0xC0, 0x09, 0xAF, 0x05, 0xB9, 0xF8, 0x61, 0xF1, 0x08, 0xF8, 0x9E, \n    0x0B, 0x4F, 0x26, 0x5C, 0xDA, 0x20, 0x79, 0x24, 0x59, 0x77, 0x6D, 0xDA, 0x7E, 0x79, 0x5F, 0x85, \n    0x25, 0xBD, 0xA8, 0x03, 0xA2, 0xF1, 0x77, 0xFC, 0x13, 0x93, 0xC2, 0xF6, 0x3F, 0x1C, 0x3F, 0x6A, \n    0xDF, 0x0E, 0xE9, 0xDE, 0x0D, 0xF8, 0xAD, 0x25, 0xAF, 0xC2, 0x7F, 0x0D, 0x2E, 0xAF, 0xE1, 0xB8, \n    0x64, 0xB3, 0x6F, 0xB4, 0xE9, 0xAE, 0x5A, 0x17, 0x2F, 0xA8, 0x0D, 0xBF, 0x2C, 0x62, 0x23, 0x39, \n    0xFA, 0x21, 0xE7, 0x8C, 0xD7, 0x82, 0xFE, 0xD1, 0xFF, 0x00, 0xB3, 0x9D, 0xBF, 0xC2, 0x6F, 0xD9, \n    0xAB, 0xE0, 0x8F, 0x8A, 0x21, 0xF0, 0x9F, 0x8D, 0xB4, 0x3B, 0xEF, 0x1A, 0xE9, 0x57, 0xB7, 0x3A, \n    0xAE, 0xA3, 0xAC, 0x5A, 0xB4, 0x5A, 0x76, 0xAF, 0x28, 0xBA, 0x66, 0xB7, 0x7B, 0x06, 0x23, 0x0F, \n    0x18, 0xB4, 0x92, 0xDC, 0xB1, 0x19, 0xF9, 0x98, 0xD7, 0xD3, 0xDE, 0x2D, 0xFF, 0x00, 0x82, 0xBA, \n    0xEA, 0x37, 0x5F, 0x19, 0xBF, 0x6B, 0x2F, 0x14, 0xDA, 0x78, 0xA1, 0x64, 0xB8, 0xF8, 0xCD, 0xE1, \n    0xF8, 0x74, 0x2B, 0x49, 0x7E, 0xCD, 0x38, 0xFE, 0xD1, 0x84, 0x29, 0x89, 0xD4, 0x65, 0x32, 0x9F, \n    0xBB, 0x92, 0x4F, 0xBF, 0xB6, 0xBE, 0x64, 0xFD, 0xA0, 0xBF, 0x6D, 0x9F, 0x14, 0x7E, 0xD1, 0xBF, \n    0xB2, 0xF7, 0xC2, 0xFF, 0x00, 0x00, 0xF8, 0x8B, 0x51, 0xFB, 0x4D, 0x9F, 0xC2, 0xBF, 0x3A, 0xC3, \n    0x46, 0xB7, 0xC3, 0x7F, 0xA3, 0xDA, 0x34, 0x36, 0xE8, 0x39, 0x3C, 0x75, 0x8B, 0x18, 0x07, 0xB5, \n    0x00, 0x78, 0x45, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, \n    0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, \n    0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, \n    0x51, 0x40, 0x05, 0x14, 0x57, 0xD0, 0x1F, 0xB3, 0x17, 0xEC, 0xB7, 0xF0, 0xB7, 0xE3, 0x3C, 0x5E, \n    0x0F, 0xFF, 0x00, 0x84, 0xB3, 0xE3, 0xDF, 0x86, 0x7C, 0x07, 0x7B, 0xE2, 0x2D, 0x7D, 0x34, 0x9D, \n    0x43, 0x4D, 0xBA, 0xD1, 0xEE, 0xE4, 0x9B, 0x44, 0xB5, 0x66, 0xC7, 0xDB, 0xE5, 0xB8, 0x71, 0x1D, \n    0xA7, 0x94, 0x07, 0x24, 0x79, 0xDB, 0x87, 0xA5, 0x00, 0x78, 0x3E, 0x9B, 0xA7, 0xCB, 0xAB, 0xEA, \n    0x36, 0xF6, 0x90, 0xA9, 0x92, 0x6B, 0x99, 0x16, 0x28, 0xD4, 0x7F, 0x13, 0x31, 0xC0, 0x1F, 0x99, \n    0xAF, 0x5A, 0x3A, 0x75, 0xA7, 0x86, 0xF4, 0xE4, 0xD3, 0x2C, 0x16, 0x33, 0x0C, 0x38, 0x13, 0xCE, \n    0x17, 0xE6, 0xBB, 0x90, 0x75, 0x62, 0x7A, 0xED, 0xCF, 0xDD, 0x1D, 0x31, 0xEF, 0x5D, 0x37, 0xC7, \n    0xBF, 0x80, 0x9E, 0x03, 0xFD, 0x9C, 0xBF, 0x69, 0x89, 0x7C, 0x3F, 0xE0, 0x7F, 0x88, 0xD6, 0x5F, \n    0x14, 0xB4, 0xCD, 0x3D, 0x66, 0x92, 0x1D, 0x6F, 0x4F, 0x48, 0x92, 0xD6, 0x72, 0xB1, 0xBE, 0x0A, \n    0xEC, 0x92, 0x4E, 0x73, 0x83, 0xD6, 0xB9, 0x89, 0x17, 0x3F, 0x8D, 0x69, 0x08, 0xF5, 0x29, 0x22, \n    0xAC, 0x8B, 0x8F, 0xC2, 0xA0, 0x91, 0x6A, 0xD3, 0x8A, 0xF6, 0x0F, 0x80, 0xDF, 0xF0, 0x4F, 0x2F, \n    0x8C, 0xFF, 0x00, 0xB4, 0xFF, 0x00, 0x87, 0x9F, 0x57, 0xF0, 0x3F, 0x80, 0xB5, 0x4D, 0x63, 0x4B, \n    0x46, 0xDA, 0xB7, 0x92, 0xCF, 0x6F, 0x65, 0x04, 0xA7, 0xD1, 0x1E, 0xE2, 0x48, 0xC4, 0x98, 0xEF, \n    0xB0, 0x9C, 0x77, 0xAD, 0xA8, 0xE1, 0xEA, 0xD5, 0x97, 0x2D, 0x28, 0xB9, 0x3E, 0xC9, 0x37, 0xF9, \n    0x1B, 0x61, 0xF0, 0xB5, 0xAB, 0xCB, 0x92, 0x84, 0x1C, 0x9F, 0x64, 0x9B, 0x7F, 0x81, 0xE1, 0xD2, \n    0x2F, 0xEB, 0x50, 0x4A, 0xB5, 0xF6, 0x26, 0x9F, 0xFF, 0x00, 0x04, 0x20, 0xFD, 0xAB, 0xB5, 0xA3, \n    0x8B, 0x5F, 0x84, 0xF2, 0x4B, 0xBB, 0xA6, 0x3C, 0x47, 0xA4, 0x0F, 0xE7, 0x75, 0x5A, 0x9F, 0xF1, \n    0x0E, 0xDF, 0xED, 0x91, 0x32, 0x6E, 0x5F, 0x83, 0x17, 0x2C, 0xA4, 0x75, 0x1E, 0x24, 0xD1, 0x8F, \n    0xFE, 0xDD, 0xD1, 0x53, 0x0F, 0x56, 0x9B, 0xB5, 0x48, 0xB5, 0xEA, 0x9A, 0x0A, 0xD8, 0x5A, 0xF4, \n    0x9D, 0xAA, 0x41, 0xAF, 0x54, 0xD7, 0xE6, 0x7C, 0x3F, 0x20, 0xAA, 0xF2, 0x0C, 0x1A, 0xFB, 0x57, \n    0x55, 0xFF, 0x00, 0x83, 0x7D, 0xBF, 0x6B, 0xFD, 0x29, 0x0B, 0x5C, 0x7C, 0x1C, 0xBA, 0x8C, 0x0E, \n    0xB9, 0xF1, 0x16, 0x90, 0x7F, 0x95, 0xDD, 0x73, 0x1A, 0x97, 0xFC, 0x11, 0x1B, 0xF6, 0xA1, 0xD3, \n    0x09, 0x13, 0xFC, 0x2B, 0x9E, 0x32, 0x3A, 0xFF, 0x00, 0xC4, 0xFB, 0x4B, 0x3F, 0xCA, 0xE6, 0xA7, \n    0xD8, 0xD4, 0xDF, 0x95, 0xFD, 0xCC, 0xBA, 0x58, 0x0C, 0x4D, 0x4F, 0xE1, 0xD3, 0x93, 0xF4, 0x4D, \n    0xFE, 0x87, 0xC9, 0x52, 0x2E, 0x2A, 0x09, 0x16, 0xBE, 0xA1, 0xBE, 0xFF, 0x00, 0x82, 0x3C, 0xFE, \n    0xD1, 0xD6, 0x43, 0xF7, 0xBF, 0x0D, 0xA7, 0x5C, 0x7F, 0xD4, 0x6B, 0x4D, 0x3F, 0xCA, 0xE2, 0xB2, \n    0xAE, 0x7F, 0xE0, 0x93, 0x9F, 0xB4, 0x14, 0x04, 0xEE, 0xF8, 0x77, 0x70, 0x31, 0xFF, 0x00, 0x51, \n    0x6B, 0x03, 0xFF, 0x00, 0xB5, 0xEB, 0x1F, 0x67, 0x2E, 0xCC, 0xED, 0xA7, 0xC3, 0xF9, 0xAC, 0xFE, \n    0x0C, 0x35, 0x47, 0xE9, 0x09, 0x3F, 0xD0, 0xF9, 0xB5, 0xC7, 0x7A, 0x89, 0x86, 0x0D, 0x7D, 0x18, \n    0xDF, 0xF0, 0x4A, 0x8F, 0x8F, 0xCC, 0x70, 0x3E, 0x1E, 0x5E, 0x1C, 0xFA, 0x6A, 0x76, 0x3F, 0xFC, \n    0x7A, 0xB4, 0xB4, 0x4F, 0xF8, 0x23, 0x5F, 0xED, 0x2B, 0xE2, 0x67, 0xD9, 0x63, 0xF0, 0xBE, 0xFA, \n    0x76, 0x6E, 0x98, 0xD5, 0x74, 0xF5, 0xCF, 0xE7, 0x38, 0xAD, 0x23, 0x87, 0xAA, 0xF6, 0x8B, 0xFB, \n    0x99, 0x55, 0x78, 0x6B, 0x37, 0xA7, 0x1E, 0x6A, 0x98, 0x5A, 0x89, 0x77, 0x70, 0x92, 0x5F, 0x8A, \n    0x3E, 0x5D, 0x61, 0x83, 0x51, 0x3A, 0xF3, 0x8E, 0xD5, 0xEF, 0x9F, 0xB5, 0x37, 0xFC, 0x13, 0x2B, \n    0xE3, 0xCF, 0xEC, 0x5B, 0xE1, 0xCB, 0x1D, 0x63, 0xE2, 0x6F, 0xC3, 0x1F, 0x11, 0x78, 0x5F, 0x45, \n    0xD4, 0x8E, 0xDB, 0x7D, 0x49, 0xC4, 0x57, 0x56, 0x4C, 0xDF, 0xDD, 0x33, 0x40, 0xEF, 0x1A, 0xB7, \n    0xFB, 0x2C, 0xC0, 0xFB, 0x57, 0x83, 0x30, 0xC8, 0xAC, 0x5A, 0x69, 0xD9, 0x9E, 0x33, 0x4D, 0x3B, \n    0x32, 0xB4, 0xB6, 0xEB, 0xF7, 0xBA, 0x0E, 0xF8, 0xED, 0xEF, 0x55, 0x9D, 0x76, 0x36, 0x2A, 0xFD, \n    0x7A, 0xA7, 0xEC, 0x77, 0xF0, 0x03, 0xC1, 0xBF, 0xB4, 0x87, 0xC5, 0xDD, 0x3F, 0xC3, 0x3E, 0x2C, \n    0xF8, 0x8D, 0x61, 0xF0, 0xCE, 0xCA, 0xEC, 0xED, 0x97, 0x59, 0xD5, 0x21, 0x8D, 0xAC, 0xED, 0xF9, \n    0xC7, 0x25, 0xA5, 0x4E, 0xD8, 0xEE, 0x28, 0x11, 0xE3, 0x74, 0x57, 0xD1, 0x1F, 0xB4, 0xC7, 0xEC, \n    0x85, 0xF0, 0xE7, 0xE0, 0xA5, 0xA7, 0x8E, 0xA4, 0xF0, 0xDF, 0xC7, 0xDF, 0x04, 0xF8, 0xE6, 0xEB, \n    0xC2, 0x7A, 0xF7, 0xF6, 0x46, 0x9F, 0xA7, 0x59, 0xD8, 0xDD, 0x2D, 0xCF, 0x88, 0xA0, 0xCA, 0x03, \n    0x7B, 0x6F, 0x22, 0x2C, 0x96, 0xDE, 0x48, 0xDC, 0xC7, 0xE6, 0x98, 0x13, 0xB0, 0xE0, 0x74, 0xCF, \n    0xCE, 0xF4, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x57, 0xDD, 0x9F, 0xF0, 0x4D, \n    0xCF, 0x01, 0xF8, 0xF3, 0x54, 0xD0, 0x3E, 0x1C, 0xEA, 0x5A, 0x1F, 0xEC, 0xA7, 0xE0, 0xAF, 0x8B, \n    0x5A, 0x5C, 0x9E, 0x34, 0x8E, 0x1B, 0x5D, 0x77, 0x53, 0x13, 0x2C, 0x9A, 0xB5, 0xCE, 0xEE, 0x2C, \n    0x26, 0x73, 0x31, 0x84, 0x42, 0x3B, 0xEE, 0x84, 0xF1, 0xD4, 0xD7, 0xC2, 0x75, 0xF5, 0x4F, 0xEC, \n    0x43, 0x2F, 0xC0, 0xDB, 0x58, 0x7C, 0x13, 0x27, 0x8E, 0xBE, 0x26, 0x7C, 0x6A, 0xF0, 0xA6, 0xBA, \n    0xBE, 0x27, 0x4F, 0xED, 0x2B, 0x4F, 0x0C, 0xE9, 0xAA, 0xF6, 0x76, 0xF6, 0x39, 0x1F, 0xBE, 0x82, \n    0x64, 0x97, 0xCD, 0x17, 0x04, 0x7A, 0x44, 0xD8, 0xC7, 0x43, 0x40, 0x1E, 0xD3, 0xFF, 0x00, 0x05, \n    0x3A, 0xF0, 0xBF, 0x8E, 0x34, 0x5F, 0x8C, 0x77, 0x12, 0x78, 0xAB, 0xF6, 0x6F, 0xF0, 0x3F, 0xC0, \n    0xE8, 0xFE, 0xD4, 0xEB, 0xBB, 0x40, 0x92, 0x27, 0x50, 0xE6, 0x09, 0xF1, 0x08, 0x31, 0x90, 0xBB, \n    0x48, 0x04, 0xFD, 0xC1, 0xF7, 0x05, 0x7C, 0xA2, 0xEB, 0x5E, 0xE7, 0xFB, 0x6D, 0xDD, 0x7C, 0x19, \n    0xBC, 0xF8, 0xD5, 0x70, 0xDF, 0x0C, 0x3C, 0x75, 0xF1, 0x8F, 0xC6, 0x2C, 0x64, 0x93, 0x0F, 0xE3, \n    0x40, 0xC4, 0x18, 0xBC, 0x99, 0x77, 0x36, 0x64, 0x44, 0x93, 0x7E, 0x76, 0xE3, 0x23, 0xA1, 0x6A, \n    0xF0, 0xF7, 0x5F, 0xD2, 0xB5, 0xA7, 0xB1, 0x48, 0xF4, 0xBF, 0xD8, 0xA7, 0xE1, 0x36, 0x9B, 0xF1, \n    0xBF, 0xF6, 0xA6, 0xF0, 0x7F, 0x86, 0xB5, 0xAC, 0xB6, 0x93, 0x79, 0x71, 0x2C, 0xF7, 0x88, 0x33, \n    0xFB, 0xE8, 0xAD, 0xED, 0xE5, 0xB8, 0x68, 0xF8, 0xE4, 0x07, 0x11, 0x6D, 0xCF, 0x6D, 0xD5, 0xFA, \n    0x15, 0xF1, 0x2F, 0xF6, 0xDD, 0xD5, 0xB4, 0x7F, 0x16, 0xC9, 0xE1, 0xDF, 0x0F, 0x4A, 0x34, 0x5D, \n    0x23, 0x47, 0x22, 0xD2, 0x18, 0x2D, 0x80, 0x8C, 0x28, 0x4F, 0x97, 0x68, 0x03, 0xEE, 0x81, 0x8C, \n    0x00, 0x3D, 0x2B, 0xE1, 0xEF, 0xF8, 0x26, 0x5C, 0x26, 0x5F, 0xDB, 0x77, 0xC1, 0xEA, 0x3A, 0x98, \n    0x35, 0x43, 0xFF, 0x00, 0x94, 0xBB, 0xBA, 0xEB, 0xBE, 0x34, 0x78, 0xA9, 0xAC, 0x7E, 0x3B, 0xF8, \n    0x9D, 0x77, 0x91, 0xB7, 0x55, 0xB8, 0xFF, 0x00, 0xD1, 0xAD, 0x5F, 0xD1, 0xBE, 0x09, 0xCF, 0x09, \n    0x47, 0x07, 0x5A, 0xB5, 0x6A, 0x6A, 0x52, 0xE7, 0x4A, 0xED, 0x5F, 0x4E, 0x55, 0x6D, 0xFE, 0x67, \n    0xEA, 0xDC, 0x27, 0x8F, 0xFA, 0xAE, 0x47, 0x28, 0xD2, 0x56, 0x95, 0x4A, 0xB2, 0x52, 0x7D, 0x5C, \n    0x63, 0x18, 0x5A, 0x37, 0xED, 0x79, 0x48, 0xFB, 0x73, 0xC0, 0x1F, 0xB5, 0xA7, 0x8B, 0x24, 0x54, \n    0x78, 0xFC, 0x43, 0xA9, 0xA9, 0xF4, 0x17, 0x0D, 0xFE, 0x35, 0xEB, 0xBE, 0x19, 0xFD, 0xAF, 0x3C, \n    0x6B, 0x24, 0x08, 0xA7, 0xC4, 0x9A, 0xB1, 0x5C, 0x7F, 0xCF, 0xD3, 0xFF, 0x00, 0x8D, 0x7E, 0x7D, \n    0x7C, 0x32, 0xF8, 0x92, 0x62, 0x68, 0xF3, 0x21, 0xF7, 0xE6, 0xBD, 0xE7, 0xC1, 0x5E, 0x3B, 0x49, \n    0x96, 0x36, 0x0F, 0xC1, 0x1C, 0x8C, 0xD7, 0xEE, 0xD9, 0x9E, 0x4B, 0x82, 0xAF, 0x4F, 0xDB, 0x42, \n    0x9C, 0x5A, 0x7E, 0x48, 0xF0, 0x78, 0x8B, 0x03, 0x29, 0xC7, 0xDA, 0x41, 0xBB, 0x7C, 0xCF, 0xA5, \n    0x7C, 0x41, 0xFB, 0x40, 0xF8, 0xCB, 0x55, 0xB7, 0x27, 0xFB, 0x7F, 0x52, 0x61, 0x8E, 0xF3, 0xB1, \n    0xFE, 0x75, 0xE0, 0xBF, 0xB4, 0x07, 0xC5, 0xFF, 0x00, 0x1E, 0x59, 0x59, 0x49, 0x25, 0xBF, 0x88, \n    0x35, 0x04, 0xF9, 0x73, 0xF2, 0xBD, 0x76, 0x7E, 0x1D, 0xF1, 0x0A, 0x5D, 0x44, 0xA0, 0xB6, 0x54, \n    0xFB, 0xD5, 0x1F, 0x8B, 0xBE, 0x1C, 0x8F, 0x57, 0xF0, 0xC3, 0xBA, 0xA8, 0x6F, 0x96, 0xBE, 0x3E, \n    0x79, 0x66, 0x1A, 0x12, 0xE5, 0x74, 0xE3, 0xF7, 0x23, 0xE1, 0xB2, 0xDC, 0x4D, 0x5A, 0x38, 0x94, \n    0xA4, 0xD9, 0xF1, 0x3F, 0x88, 0x7F, 0x6B, 0x2F, 0x89, 0x56, 0x9A, 0xCC, 0xB1, 0x9F, 0x14, 0x6A, \n    0x64, 0x03, 0x8C, 0x33, 0x82, 0x3F, 0x95, 0x63, 0xEA, 0x3F, 0xB6, 0x0F, 0xC4, 0x8B, 0x5E, 0x7F, \n    0xE1, 0x22, 0xBA, 0x60, 0x7D, 0x51, 0x4F, 0xF4, 0xAB, 0x5F, 0x16, 0x7C, 0x1A, 0xDA, 0x5F, 0x88, \n    0x65, 0x7D, 0x84, 0x02, 0xC7, 0xB5, 0x71, 0x1A, 0x96, 0x9C, 0x93, 0x46, 0x46, 0x06, 0x71, 0x5F, \n    0x9E, 0xF1, 0x3E, 0x4D, 0x66, 0xE7, 0x49, 0x5B, 0xE4, 0x7E, 0xCF, 0x97, 0x62, 0xA7, 0x52, 0x95, \n    0xE1, 0x2B, 0x33, 0xA5, 0xB3, 0xFD, 0xB6, 0xBE, 0x22, 0xDA, 0xCC, 0x18, 0xEB, 0xF3, 0x1C, 0x1E, \n    0x7F, 0x76, 0x9F, 0xE1, 0x5E, 0x93, 0xF0, 0xFB, 0xFE, 0x0A, 0x25, 0xF1, 0x02, 0xCC, 0x28, 0xFE, \n    0xDF, 0x9D, 0x18, 0x0E, 0xAA, 0xAA, 0xA4, 0x7E, 0x42, 0xBE, 0x6A, 0xD5, 0x34, 0xB3, 0x6F, 0x21, \n    0xDA, 0x38, 0xAC, 0xF4, 0xBE, 0x7D, 0x31, 0x99, 0xC1, 0x60, 0x05, 0x7E, 0x5B, 0x56, 0xA5, 0x5A, \n    0x32, 0xB3, 0x3D, 0x8C, 0x36, 0x75, 0x8A, 0xC3, 0xBD, 0x64, 0xEC, 0x7E, 0xB4, 0x7F, 0xC1, 0x33, \n    0xFF, 0x00, 0xE0, 0xAD, 0x97, 0xDF, 0x15, 0xBE, 0x26, 0x37, 0xC0, 0xFF, 0x00, 0x8C, 0x96, 0xF6, \n    0xBE, 0x39, 0xF8, 0x7F, 0xF1, 0x1A, 0x37, 0xD2, 0xA5, 0xB7, 0xD4, 0x22, 0x59, 0x02, 0x16, 0x53, \n    0xF2, 0xB7, 0xAA, 0x9C, 0x70, 0x7A, 0xAB, 0x00, 0x41, 0xAF, 0xC6, 0x5F, 0xDB, 0xDF, 0xE0, 0x66, \n    0x97, 0xFB, 0x32, 0xFE, 0xDA, 0xFF, 0x00, 0x15, 0x3E, 0x1E, 0xE8, 0x77, 0x53, 0x5E, 0x68, 0xBE, \n    0x0D, 0xF1, 0x45, 0xFE, 0x93, 0x63, 0x3C, 0xA3, 0x0E, 0xF0, 0x45, 0x3B, 0x2C, 0x65, 0xBD, 0xF6, \n    0x81, 0x5E, 0xB7, 0xFB, 0x21, 0x78, 0xE2, 0x4B, 0x5F, 0xDB, 0x13, 0xE1, 0xEC, 0xCB, 0x29, 0x06, \n    0x1D, 0x72, 0xD5, 0xB3, 0xFF, 0x00, 0x6D, 0x05, 0x79, 0xD7, 0xFC, 0x14, 0xB7, 0x54, 0x3A, 0xF7, \n    0xFC, 0x14, 0x03, 0xE3, 0x1D, 0xE1, 0x3B, 0x9A, 0xEB, 0xC5, 0x97, 0xF2, 0x67, 0xD7, 0x33, 0x35, \n    0x7C, 0xD6, 0x75, 0xC9, 0x52, 0x31, 0xAF, 0x6D, 0x5B, 0xB3, 0xF3, 0x3E, 0x07, 0x8C, 0xB0, 0xF4, \n    0xF1, 0x14, 0x23, 0x9A, 0x45, 0x24, 0xDC, 0xDC, 0x1D, 0xB4, 0xBD, 0xA2, 0xA4, 0x9E, 0x9D, 0x77, \n    0xFB, 0x8F, 0x0A, 0x71, 0x83, 0x5F, 0x71, 0xFF, 0x00, 0xC1, 0x2E, 0x3C, 0x1F, 0xE2, 0xAD, 0x4B, \n    0x5A, 0xF0, 0xBD, 0xC6, 0x97, 0xFB, 0x28, 0xF8, 0x7F, 0xE3, 0x55, 0xAC, 0x86, 0x5F, 0x2E, 0x6B, \n    0xE9, 0x02, 0x7F, 0x69, 0x62, 0x77, 0x04, 0xB6, 0xF6, 0xD9, 0xF2, 0x90, 0x53, 0xA7, 0xF0, 0x57, \n    0xC3, 0xCC, 0x32, 0x2B, 0xEB, 0x7F, 0xF8, 0x26, 0xFE, 0xB3, 0xF0, 0x87, 0x46, 0xF1, 0x7F, 0x87, \n    0x26, 0xF1, 0xA7, 0xC7, 0x2F, 0x8B, 0xDF, 0x0A, 0xAF, 0x55, 0xA4, 0xFB, 0x55, 0xCF, 0x86, 0xA1, \n    0x94, 0x25, 0x91, 0xF3, 0x9B, 0x6F, 0x96, 0xF1, 0xA3, 0xB7, 0x2B, 0xB5, 0x8E, 0x17, 0xEF, 0x13, \n    0x5E, 0x01, 0xF9, 0xE9, 0xD1, 0x7F, 0xC1, 0x43, 0x7C, 0x0D, 0xE2, 0x8D, 0x37, 0xC3, 0x1F, 0x14, \n    0x6F, 0xAF, 0xBF, 0x63, 0xCD, 0x2F, 0xE1, 0x0E, 0x9F, 0x17, 0x8B, 0x7C, 0xBB, 0x9D, 0x7E, 0x0F, \n    0xB5, 0x49, 0xFF, 0x00, 0x08, 0xE4, 0xA5, 0x93, 0xFD, 0x02, 0x37, 0x0E, 0x2D, 0xB6, 0x37, 0x00, \n    0x61, 0x0F, 0xDF, 0x38, 0x35, 0xF0, 0x9D, 0x7D, 0x7D, 0xFB, 0x78, 0xDF, 0x7C, 0x21, 0xD5, 0x6E, \n    0x7E, 0x24, 0x5D, 0x78, 0x57, 0xF6, 0x87, 0xF8, 0xB5, 0xF1, 0x33, 0x5A, 0x9B, 0xC4, 0xA5, 0xF4, \n    0xDB, 0x3D, 0x7F, 0x46, 0x94, 0x5B, 0xEB, 0x76, 0xA5, 0x97, 0x37, 0x77, 0x17, 0x52, 0x4C, 0xAD, \n    0xE7, 0x0F, 0x98, 0xE0, 0xDB, 0x82, 0x76, 0x8E, 0x99, 0xAF, 0x90, 0x68, 0x00, 0xA2, 0x8A, 0x28, \n    0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, \n    0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, \n    0x00, 0xA2, 0x8A, 0x28, 0x00, 0xAF, 0xD1, 0x0F, 0xF8, 0x25, 0xBC, 0xBF, 0x1A, 0x9F, 0xC1, 0xBF, \n    0x0C, 0x21, 0xF0, 0x17, 0x8C, 0xBF, 0x67, 0xCD, 0x27, 0x4F, 0x3E, 0x3B, 0x8C, 0xE9, 0x96, 0xBE, \n    0x27, 0x93, 0x4F, 0x7D, 0x66, 0xD6, 0xF7, 0x7F, 0x13, 0x4B, 0x1B, 0x2F, 0xDA, 0x4D, 0xBE, 0x79, \n    0x18, 0x6C, 0x73, 0xC5, 0x7E, 0x77, 0xD7, 0xD6, 0x9F, 0xB0, 0xD7, 0x86, 0xFE, 0x16, 0xEB, 0x56, \n    0x9E, 0x05, 0x5F, 0x18, 0x7E, 0xCF, 0x3F, 0x17, 0x3E, 0x25, 0x5F, 0x5C, 0x78, 0xAA, 0x38, 0x6F, \n    0x75, 0x0F, 0x0F, 0xEB, 0x12, 0x47, 0x69, 0xAC, 0x5B, 0x16, 0xFF, 0x00, 0x8F, 0x18, 0xAD, 0xD6, \n    0x01, 0x99, 0x8F, 0x4C, 0x8B, 0x85, 0x27, 0xDA, 0x80, 0x3D, 0xFB, 0xFE, 0x0A, 0xD6, 0xDF, 0x18, \n    0xA3, 0xF8, 0xE3, 0x73, 0x0F, 0xC5, 0x3F, 0x1A, 0xFC, 0x20, 0xF1, 0x3C, 0xC2, 0xED, 0xCB, 0x47, \n    0xE1, 0x18, 0xE3, 0x8A, 0x41, 0x27, 0x91, 0x3E, 0x1B, 0x68, 0x1B, 0xF6, 0x01, 0xB8, 0x1C, 0x9C, \n    0x64, 0xAD, 0x7C, 0x6E, 0xE3, 0xBD, 0x7B, 0xC7, 0xED, 0xCF, 0xE1, 0x2F, 0x87, 0x5E, 0x16, 0xF8, \n    0xD5, 0x34, 0x7E, 0x03, 0xFD, 0x9F, 0xFE, 0x23, 0xFC, 0x17, 0xB7, 0x12, 0xC8, 0x15, 0x3C, 0x51, \n    0x75, 0x3B, 0x3A, 0xA7, 0x93, 0x2E, 0x62, 0x29, 0x23, 0xC9, 0x86, 0x3C, 0x1C, 0xF9, 0x87, 0xEE, \n    0x1A, 0xF0, 0xA9, 0x17, 0xF5, 0xAD, 0x69, 0xEC, 0x54, 0x4F, 0x7E, 0xFF, 0x00, 0x82, 0x55, 0xDB, \n    0x89, 0xFF, 0x00, 0x6F, 0x3F, 0x05, 0x21, 0xE4, 0x35, 0xBE, 0xAC, 0x7F, 0xF2, 0x93, 0x79, 0x55, \n    0xBF, 0x69, 0x49, 0x5A, 0xD7, 0xE3, 0xD7, 0x8A, 0xD8, 0x6E, 0x18, 0xD5, 0x2E, 0x3F, 0xF4, 0x6B, \n    0x56, 0xBF, 0xFC, 0x12, 0x3E, 0xD3, 0xED, 0xBF, 0xF0, 0x50, 0x7F, 0x02, 0xC5, 0xDD, 0xAD, 0xB5, \n    0x8F, 0xFD, 0x33, 0xDE, 0x9A, 0x8B, 0xF6, 0xB2, 0xD1, 0x24, 0x83, 0xE3, 0x77, 0x8A, 0x5B, 0x1D, \n    0x75, 0x3B, 0x83, 0xD3, 0xFE, 0x9A, 0xB5, 0x7E, 0xFF, 0x00, 0xE1, 0x4E, 0x0E, 0x75, 0x72, 0x6C, \n    0x55, 0x48, 0x6F, 0x1A, 0x91, 0xFF, 0x00, 0xD2, 0x4F, 0xB8, 0xC9, 0xE7, 0xFF, 0x00, 0x09, 0x71, \n    0x8F, 0xFD, 0x3C, 0x9B, 0xFF, 0x00, 0xC9, 0x69, 0x9C, 0xEF, 0x83, 0xFC, 0x62, 0x6D, 0x24, 0x4F, \n    0x9F, 0x1F, 0x8D, 0x7B, 0x37, 0x80, 0xBE, 0x27, 0xF9, 0x28, 0x80, 0xC9, 0xBB, 0x8F, 0x5A, 0xF9, \n    0x7C, 0x5E, 0xBD, 0x9C, 0xBD, 0x48, 0xDA, 0x6B, 0xA4, 0xF0, 0xD7, 0x8D, 0xE4, 0xB5, 0x65, 0x1B, \n    0xCF, 0xCB, 0xEF, 0x5F, 0xAE, 0xE4, 0x7C, 0x50, 0xA8, 0xFF, 0x00, 0xB3, 0xD7, 0xD8, 0xF4, 0xD6, \n    0x21, 0x4A, 0x1E, 0xCE, 0x67, 0xDD, 0x9F, 0x0D, 0xFE, 0x26, 0x25, 0xEA, 0x2A, 0xF9, 0xC0, 0x9C, \n    0xFA, 0xD7, 0xAD, 0x69, 0xFA, 0x9C, 0x7A, 0xE6, 0x8E, 0xD0, 0xB1, 0x0C, 0x08, 0xE2, 0xBC, 0x4B, \n    0xFE, 0x09, 0xFB, 0xE1, 0x1D, 0x03, 0x5B, 0xF8, 0x13, 0xF1, 0x8B, 0xE2, 0xC7, 0x8A, 0x2D, 0x64, \n    0xD7, 0xB4, 0xFF, 0x00, 0x85, 0x36, 0x5A, 0x7A, 0xDA, 0x68, 0x62, 0x79, 0x21, 0x8F, 0x50, 0xBD, \n    0xBF, 0x9D, 0xA1, 0x85, 0xE7, 0x68, 0xCA, 0xC9, 0xF6, 0x78, 0xB6, 0x33, 0x38, 0x46, 0x52, 0x49, \n    0x51, 0xB8, 0x0C, 0xE7, 0xEA, 0x9F, 0xD8, 0x6B, 0xC4, 0xDE, 0x19, 0xF8, 0xF7, 0x65, 0xE2, 0x0D, \n    0x4B, 0x59, 0xF0, 0x57, 0x86, 0x34, 0xDB, 0x7F, 0x0A, 0xF8, 0x2F, 0x50, 0xD4, 0xDE, 0xE2, 0x49, \n    0xAE, 0x2D, 0x2C, 0x6F, 0xAE, 0xCC, 0xC9, 0x15, 0x93, 0x31, 0x33, 0x05, 0x40, 0x24, 0x7D, 0x84, \n    0xEE, 0xC3, 0x04, 0x39, 0xE7, 0x9A, 0x59, 0xC6, 0x71, 0x87, 0x8A, 0xA9, 0x56, 0x8C, 0x5C, 0xA3, \n    0x4D, 0xA5, 0x26, 0xAD, 0xF1, 0x34, 0xA4, 0x92, 0xBB, 0x4D, 0xBB, 0x4A, 0x3F, 0x7A, 0xDF, 0x5B, \n    0x7C, 0x06, 0x6B, 0x85, 0x50, 0xAD, 0xCF, 0x4F, 0xA3, 0xFF, 0x00, 0x82, 0x7C, 0x81, 0xF1, 0xFB, \n    0xE1, 0xD2, 0xCB, 0x2C, 0xAE, 0xB1, 0xF7, 0x38, 0xAF, 0x9A, 0x3C, 0x5F, 0xA3, 0x4D, 0xA6, 0x5D, \n    0x36, 0xD0, 0x70, 0x2B, 0xF6, 0x2B, 0xE2, 0x8F, 0xC3, 0xFF, 0x00, 0x84, 0xB7, 0x1F, 0x0A, 0x7E, \n    0x28, 0x78, 0x93, 0x49, 0xD1, 0x74, 0x4D, 0x72, 0x3F, 0x0E, 0xF8, 0x4F, 0x49, 0x80, 0xCA, 0x97, \n    0x17, 0x32, 0xD9, 0x5A, 0x78, 0x82, 0xE1, 0xF6, 0x4C, 0xD6, 0xCF, 0xE6, 0x82, 0xF0, 0x63, 0x24, \n    0x06, 0x2C, 0xBB, 0x87, 0x07, 0x68, 0xC5, 0x7C, 0x09, 0xFB, 0x5B, 0xF8, 0x5F, 0x46, 0xD3, 0xBC, \n    0x1F, 0xE0, 0x3D, 0x2E, 0xCF, 0xC3, 0x9A, 0x4E, 0x95, 0xAC, 0xAE, 0x86, 0xB7, 0xFA, 0xB5, 0xE5, \n    0xB1, 0x9C, 0xCF, 0x7E, 0xF7, 0x12, 0x3C, 0x90, 0x99, 0x03, 0xC8, 0xCA, 0xB8, 0xB6, 0x30, 0x70, \n    0x8A, 0xBF, 0x31, 0x62, 0x7A, 0xE0, 0x78, 0xBF, 0x5C, 0xA3, 0x99, 0x47, 0x91, 0x53, 0x92, 0xD6, \n    0xDA, 0xA4, 0xAD, 0xEE, 0x29, 0xEA, 0xAF, 0x7B, 0x24, 0xD2, 0x7E, 0x6D, 0x74, 0xD4, 0xFA, 0xCE, \n    0x1F, 0xCD, 0x17, 0x2A, 0x84, 0xBF, 0xAD, 0x0F, 0x91, 0x75, 0x0D, 0x48, 0x0C, 0xEF, 0x00, 0x7D, \n    0x6B, 0x8A, 0xF1, 0x8E, 0xBE, 0x51, 0x59, 0x62, 0xE7, 0xDC, 0x57, 0xA7, 0x6B, 0xDE, 0x04, 0x96, \n    0x59, 0xD8, 0x2A, 0x1D, 0xA6, 0xB9, 0xCD, 0x7B, 0xE1, 0xAB, 0x45, 0x6C, 0xCC, 0x63, 0x24, 0x9F, \n    0x6A, 0xFC, 0xBF, 0x3E, 0xE1, 0xBC, 0x47, 0x34, 0xB9, 0x56, 0x87, 0xD4, 0x62, 0xDD, 0x5A, 0x90, \n    0x7E, 0xCC, 0xE6, 0x3F, 0x65, 0x0B, 0xB9, 0x07, 0xED, 0x4B, 0xE0, 0x77, 0x20, 0xFF, 0x00, 0xC8, \n    0x6A, 0xDB, 0xFF, 0x00, 0x46, 0x2D, 0x64, 0x7E, 0xDF, 0x24, 0xB7, 0xED, 0xAB, 0xF1, 0x45, 0x8F, \n    0x53, 0xE2, 0x5B, 0xDF, 0xFD, 0x1A, 0xD5, 0xE8, 0xBF, 0xB3, 0x07, 0x82, 0x24, 0x83, 0xF6, 0xA3, \n    0xF0, 0x37, 0xEE, 0xCE, 0x3F, 0xB6, 0x6D, 0x8F, 0x4F, 0xFA, 0x68, 0x2B, 0x80, 0xFF, 0x00, 0x82, \n    0x82, 0x41, 0xE4, 0x7E, 0xDB, 0x9F, 0x15, 0x23, 0x3C, 0x15, 0xF1, 0x35, 0xE8, 0xFF, 0x00, 0xC8, \n    0xAD, 0x5F, 0x92, 0xE7, 0x18, 0x79, 0xD1, 0xE5, 0xA7, 0x3E, 0xEC, 0xF9, 0xFC, 0xDE, 0x9C, 0xE9, \n    0xF0, 0xF2, 0x53, 0xDF, 0xDB, 0xFF, 0x00, 0xED, 0x87, 0x8C, 0xB0, 0xC1, 0xAF, 0xD0, 0xDF, 0xF8, \n    0x23, 0xAE, 0x95, 0xF1, 0xCB, 0x50, 0xF1, 0x37, 0x83, 0xD3, 0xE1, 0xAF, 0xFC, 0x28, 0xDB, 0x84, \n    0x3E, 0x77, 0xD8, 0xE0, 0xF1, 0x5A, 0xC4, 0xD3, 0x7F, 0xC7, 0xC4, 0x9B, 0xBC, 0xD0, 0x14, 0xC9, \n    0xF7, 0xF7, 0x63, 0xFD, 0x9D, 0xB5, 0xF9, 0xE8, 0xE3, 0x22, 0xBE, 0xAC, 0xFF, 0x00, 0x82, 0x76, \n    0xF8, 0x77, 0xE0, 0xCE, 0xB7, 0xE2, 0xEF, 0x0F, 0xC7, 0xF1, 0x03, 0xE0, 0xFF, 0x00, 0xC6, 0x6F, \n    0x88, 0x12, 0x48, 0x5F, 0xED, 0x7F, 0xF0, 0x8B, 0x4F, 0x26, 0xCB, 0xAF, 0xDE, 0xB6, 0xDF, 0x29, \n    0x23, 0xD8, 0xFC, 0x2E, 0xD5, 0x38, 0x7F, 0xBC, 0xA6, 0xBC, 0x33, 0xF3, 0xD3, 0xD5, 0xFF, 0x00, \n    0xE0, 0xA9, 0xBA, 0x37, 0xC7, 0x0D, 0x33, 0xC3, 0xDF, 0x18, 0x17, 0xC7, 0xFA, 0x5F, 0xEC, 0xEB, \n    0xA7, 0xD8, 0xA7, 0x8D, 0x00, 0xD5, 0xFF, 0x00, 0xE1, 0x1A, 0x7D, 0x39, 0x75, 0x83, 0x76, 0x5E, \n    0x3C, 0x1B, 0x55, 0xDC, 0x2E, 0xFE, 0xCE, 0x7E, 0x5C, 0xFC, 0xA0, 0x63, 0x76, 0x46, 0x32, 0x6B, \n    0xF3, 0x96, 0xBE, 0xB2, 0xFD, 0xB8, 0x74, 0x5F, 0x81, 0xBA, 0x4C, 0xBF, 0x11, 0x23, 0xF0, 0x2F, \n    0xC2, 0xBF, 0x8D, 0xDE, 0x11, 0xD6, 0x6D, 0xFC, 0x4A, 0x63, 0xD2, 0xE5, 0xF1, 0x25, 0xEA, 0xAD, \n    0x96, 0x8F, 0x6B, 0x95, 0xDD, 0x6B, 0x71, 0x0B, 0x23, 0xCA, 0x66, 0x1F, 0x30, 0x05, 0xA6, 0xCF, \n    0xCC, 0xB9, 0xCE, 0x30, 0x7E, 0x4D, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, \n    0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, \n    0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, \n    0xBE, 0xD8, 0xFF, 0x00, 0x82, 0x7A, 0x7C, 0x45, 0x5F, 0x0E, 0xF8, 0x7F, 0xC0, 0x36, 0x9F, 0xF0, \n    0xD7, 0xBA, 0x87, 0xC1, 0xBF, 0x2B, 0xC5, 0xA9, 0x33, 0x68, 0x5F, 0xD9, 0x77, 0x92, 0xDB, 0x68, \n    0x8B, 0xBB, 0x9D, 0x4B, 0xCD, 0xE6, 0xD8, 0x9F, 0xF6, 0x58, 0x7D, 0x6B, 0xE2, 0x7A, 0xFB, 0xCB, \n    0xFE, 0x09, 0xA5, 0xE0, 0x1F, 0x88, 0x1A, 0xF7, 0x87, 0x7E, 0x1B, 0xDE, 0x68, 0x7F, 0xB2, 0xEF, \n    0xC3, 0x3F, 0x8B, 0x1A, 0x4C, 0x9E, 0x35, 0x8E, 0x1B, 0x5D, 0x67, 0x57, 0x66, 0x8E, 0xF3, 0x55, \n    0xB9, 0xDD, 0xC5, 0x8C, 0xCE, 0x67, 0x31, 0x88, 0x01, 0xEB, 0xBA, 0xDC, 0x8C, 0x75, 0x26, 0x80, \n    0x26, 0xFF, 0x00, 0x82, 0x84, 0x78, 0xCA, 0xD7, 0xC5, 0x5F, 0x1B, 0xE7, 0x30, 0xFE, 0xD3, 0x97, \n    0x3F, 0xB4, 0x0B, 0x19, 0xA4, 0x6F, 0x31, 0xAC, 0x4C, 0x11, 0xB8, 0xF2, 0x66, 0xFD, 0xF6, 0xE5, \n    0xFD, 0xDE, 0x46, 0x71, 0x81, 0xCF, 0xCF, 0x5F, 0x3B, 0xBA, 0xF5, 0x15, 0xF5, 0x57, 0xFC, 0x14, \n    0xE7, 0xC2, 0x1E, 0x36, 0xF0, 0xE7, 0xC6, 0xD9, 0xDB, 0xC5, 0x5F, 0xB3, 0xCF, 0xC3, 0xBF, 0x82, \n    0x63, 0xED, 0x2E, 0xA5, 0x7C, 0x35, 0x2C, 0x52, 0xED, 0x7F, 0x22, 0x6C, 0x45, 0xBA, 0x3D, 0xAA, \n    0x54, 0x80, 0x49, 0xF9, 0x07, 0xDC, 0x15, 0xF2, 0xBC, 0x83, 0x22, 0xB5, 0xA7, 0xB1, 0x51, 0x3E, \n    0xA1, 0xFF, 0x00, 0x82, 0x2A, 0xE9, 0x67, 0x58, 0xFF, 0x00, 0x82, 0x97, 0x7C, 0x3B, 0xB7, 0xDB, \n    0x93, 0x25, 0xAE, 0xB7, 0xFA, 0x68, 0x97, 0xE7, 0xFA, 0x57, 0x4D, 0xFB, 0x5E, 0xF8, 0x45, 0x97, \n    0xE3, 0x07, 0x89, 0x8B, 0x27, 0x5D, 0x46, 0xE3, 0xB7, 0xFD, 0x34, 0x6A, 0x4F, 0xF8, 0x37, 0xF3, \n    0x4B, 0x1A, 0xBF, 0xFC, 0x15, 0xC3, 0xE1, 0x65, 0xB1, 0x19, 0x13, 0x5B, 0x6B, 0xE3, 0x1E, 0xFF, \n    0x00, 0xD8, 0x1A, 0x91, 0xAF, 0x71, 0xFD, 0xAE, 0xFE, 0x16, 0xFD, 0xAB, 0xE2, 0x7F, 0x88, 0x8E, \n    0xC3, 0xBC, 0x5F, 0x4F, 0xDB, 0xFE, 0x9A, 0x35, 0x7F, 0x51, 0xFD, 0x1D, 0xEA, 0x53, 0xAB, 0x4B, \n    0x1B, 0x82, 0xA9, 0xB4, 0xB9, 0x5F, 0xDE, 0x9A, 0xFD, 0x0F, 0x47, 0x0F, 0x9B, 0x2C, 0x3A, 0xA7, \n    0x45, 0xEC, 0xE5, 0x27, 0xF7, 0xA8, 0xFF, 0x00, 0x91, 0xF9, 0xF9, 0xE2, 0x7D, 0x1C, 0xDB, 0x4E, \n    0xDF, 0x29, 0x1C, 0xD6, 0x7E, 0x9F, 0x6C, 0xC9, 0x20, 0x27, 0x38, 0xCD, 0x7A, 0xC7, 0xC4, 0x9F, \n    0x87, 0xF2, 0xD8, 0x5C, 0x3E, 0xE4, 0x38, 0xCF, 0xA5, 0x70, 0xEF, 0xA2, 0x79, 0x3D, 0x31, 0xC5, \n    0x7B, 0x1C, 0x4F, 0x90, 0xD5, 0xC1, 0xE3, 0x25, 0xA6, 0x87, 0xD5, 0xC7, 0xDF, 0xD5, 0x1D, 0xFF, \n    0x00, 0xC0, 0x1F, 0xDA, 0x1B, 0xC5, 0x9F, 0x01, 0xE6, 0xD5, 0x1B, 0xC3, 0x3A, 0xB4, 0xB6, 0x10, \n    0xEB, 0xD6, 0x6D, 0xA7, 0x6A, 0x96, 0xAC, 0x8B, 0x2D, 0xB6, 0xA5, 0x6C, 0xC4, 0x13, 0x14, 0xD1, \n    0xB0, 0x2A, 0xEB, 0x90, 0x0F, 0x23, 0x20, 0x8E, 0x08, 0xAF, 0x6A, 0xF0, 0x47, 0xFC, 0x14, 0x1B, \n    0xE2, 0x2D, 0xBD, 0x96, 0xB1, 0xA5, 0xCB, 0xAE, 0x22, 0xE9, 0x9E, 0x22, 0xB2, 0x87, 0x4D, 0xBD, \n    0xB5, 0x8A, 0xD2, 0x28, 0xE1, 0x7B, 0x58, 0x7F, 0xD5, 0x42, 0xAA, 0x17, 0x08, 0x88, 0x7E, 0x60, \n    0x17, 0x1F, 0x37, 0x3C, 0x9A, 0xF1, 0x7F, 0x86, 0x9F, 0xB3, 0x47, 0x8B, 0x3E, 0x23, 0xFC, 0x27, \n    0xF1, 0x37, 0x8E, 0x34, 0xA8, 0x74, 0xD1, 0xE1, 0x7F, 0x06, 0xDC, 0x5B, 0x5A, 0xEB, 0x37, 0xB7, \n    0x37, 0xD1, 0xC0, 0x2C, 0x64, 0xB9, 0x62, 0xB6, 0xE1, 0x95, 0x8E, 0x4F, 0x98, 0xC1, 0x95, 0x70, \n    0x0E, 0x4A, 0x91, 0xDA, 0xBB, 0x2D, 0x63, 0xF6, 0x34, 0xF8, 0x8D, 0xE0, 0x4F, 0x89, 0xBA, 0xAF, \n    0x84, 0xF5, 0xCD, 0x26, 0xDB, 0x47, 0xD7, 0x34, 0x5D, 0x13, 0xFE, 0x12, 0x39, 0xD2, 0xF2, 0xF6, \n    0x38, 0xA2, 0x7D, 0x3F, 0xCB, 0x12, 0x7D, 0xA6, 0x39, 0x09, 0xDA, 0xE9, 0xB1, 0x81, 0xF9, 0x4E, \n    0x79, 0xC7, 0x5E, 0x28, 0xC9, 0x73, 0x2C, 0xBA, 0x53, 0x74, 0x71, 0x4A, 0x0E, 0x5D, 0x6F, 0x6B, \n    0xE9, 0x67, 0x7F, 0x97, 0xBB, 0xE9, 0xA7, 0x91, 0xC7, 0x8C, 0xA3, 0x4A, 0x71, 0x71, 0x76, 0xBF, \n    0xF5, 0xFF, 0x00, 0x00, 0xFA, 0x0B, 0xE1, 0x7F, 0xED, 0x6B, 0xE2, 0x0F, 0x86, 0xDA, 0x26, 0xA1, \n    0x16, 0x87, 0xA9, 0x24, 0x16, 0xBA, 0xD5, 0xBA, 0xDB, 0xDF, 0xDA, 0xCB, 0x12, 0x4F, 0x6F, 0x76, \n    0x8A, 0x77, 0x28, 0x74, 0x70, 0x41, 0x2A, 0x46, 0x41, 0xEA, 0x0D, 0x79, 0x3F, 0xC4, 0x1F, 0x1A, \n    0xDF, 0xFC, 0x4A, 0xF1, 0x85, 0xE6, 0xA7, 0xAA, 0x5D, 0xC9, 0x7F, 0x7F, 0x7B, 0x26, 0xE9, 0x66, \n    0x7C, 0x65, 0x8F, 0x40, 0x30, 0x38, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x0A, 0x93, 0x55, 0xFD, 0x96, \n    0x7E, 0x24, 0xF8, 0x0B, 0xC3, 0x9A, 0x5D, 0xC5, 0xE5, 0x8E, 0x9E, 0xED, 0xAD, 0x68, 0xB6, 0xFE, \n    0x21, 0xD3, 0x6D, 0x21, 0xD4, 0x62, 0x96, 0xEF, 0x50, 0xD3, 0xE7, 0x6D, 0xB0, 0xDC, 0x45, 0x08, \n    0x3B, 0x9D, 0x5C, 0xF0, 0x30, 0x33, 0xC1, 0xE3, 0x8A, 0xE8, 0x24, 0xFD, 0x93, 0x7C, 0x7D, 0xE0, \n    0x7B, 0x1D, 0x7E, 0xFF, 0x00, 0x57, 0xD3, 0x6D, 0x09, 0xF0, 0x84, 0x90, 0x27, 0x88, 0xAC, 0xED, \n    0xAF, 0x62, 0xB8, 0xBC, 0xF0, 0xF1, 0x99, 0xB6, 0xC7, 0xF6, 0xB8, 0x94, 0x96, 0x8B, 0x73, 0x7C, \n    0xBC, 0xF4, 0x6E, 0x0E, 0x2B, 0xDE, 0xFA, 0xC6, 0x5F, 0x1A, 0xBC, 0xF4, 0xE7, 0x0E, 0x69, 0x69, \n    0x74, 0xD5, 0xDE, 0xCB, 0x7D, 0xDE, 0xB6, 0x5F, 0x72, 0xEC, 0x78, 0x38, 0x39, 0x7B, 0x06, 0xD2, \n    0x39, 0xAD, 0x3B, 0xE1, 0xE8, 0xBF, 0xB7, 0xDD, 0xE5, 0xE4, 0x9F, 0x6A, 0xA9, 0xE2, 0x0F, 0x84, \n    0x05, 0xED, 0xF1, 0xE5, 0x93, 0xF8, 0x57, 0xB5, 0x7C, 0x2F, 0xD0, 0xE0, 0xD4, 0xAD, 0xD1, 0x70, \n    0x18, 0x91, 0xE9, 0x5D, 0xB5, 0xC7, 0xC3, 0x14, 0xB9, 0x4C, 0x94, 0x18, 0xC7, 0xA5, 0x74, 0xD6, \n    0x8D, 0x27, 0x17, 0x09, 0x9F, 0x6F, 0x91, 0xE6, 0xE9, 0x4B, 0x92, 0xA6, 0xC7, 0xCB, 0xFF, 0x00, \n    0xB3, 0xCF, 0xC1, 0x93, 0x07, 0xED, 0x29, 0xE0, 0x97, 0xF2, 0x8E, 0x06, 0xAD, 0x01, 0xCE, 0x3F, \n    0xDB, 0x15, 0xF2, 0x27, 0xFC, 0x14, 0xAA, 0xD3, 0xEC, 0x5F, 0xB7, 0xF7, 0xC6, 0x28, 0xB1, 0x83, \n    0x0F, 0x8B, 0x2F, 0xD7, 0xFF, 0x00, 0x23, 0x35, 0x7E, 0xB4, 0x7C, 0x0D, 0xF8, 0x59, 0x1B, 0x7E, \n    0xD0, 0xBE, 0x11, 0xDB, 0x18, 0xF9, 0x75, 0x28, 0x88, 0xC0, 0xF7, 0xAF, 0xCA, 0xDF, 0xF8, 0x2A, \n    0xF5, 0x97, 0xF6, 0x7F, 0xFC, 0x14, 0xAF, 0xE3, 0x9C, 0x18, 0xC7, 0x97, 0xE3, 0x4D, 0x49, 0x31, \n    0xF4, 0x9D, 0xAB, 0xF9, 0xBB, 0xC5, 0x2C, 0xB6, 0x18, 0x6C, 0x4D, 0x29, 0x53, 0xFB, 0x49, 0xFE, \n    0x67, 0xA3, 0xC7, 0xD2, 0xA3, 0x1C, 0xB3, 0x0F, 0x4E, 0x8F, 0xDA, 0x9C, 0xA5, 0xFF, 0x00, 0x92, \n    0xA4, 0x7C, 0xEC, 0xE3, 0x06, 0xBE, 0xE6, 0xFF, 0x00, 0x82, 0x54, 0x78, 0xDF, 0x5D, 0xD0, 0xBC, \n    0x43, 0xE1, 0x58, 0xF4, 0xDF, 0xDA, 0xBB, 0x41, 0xF8, 0x32, 0x23, 0x32, 0xEC, 0xB5, 0xD4, 0x6C, \n    0xC4, 0xC9, 0xA6, 0xFE, 0xFD, 0xCE, 0x0E, 0xF2, 0xA8, 0x77, 0x1F, 0x9F, 0xAF, 0xF1, 0xD7, 0xC3, \n    0x8E, 0xBD, 0x45, 0x7D, 0xAD, 0xFF, 0x00, 0x04, 0xB7, 0xF0, 0x4E, 0xA3, 0xE2, 0x0F, 0x11, 0xF8, \n    0x65, 0xA2, 0xFD, 0x93, 0x74, 0xDF, 0x8D, 0xF0, 0x49, 0xE6, 0xE2, 0x49, 0xEE, 0xCC, 0x47, 0x53, \n    0xFD, 0xFB, 0x8C, 0x90, 0xE7, 0x67, 0xCA, 0x41, 0x4F, 0xF8, 0x05, 0x7E, 0x52, 0x7E, 0x46, 0x5A, \n    0xFF, 0x00, 0x82, 0x91, 0x7C, 0x40, 0xF1, 0x66, 0xB7, 0xE1, 0x5F, 0x8A, 0xB6, 0x7A, 0xA7, 0xED, \n    0x79, 0xE1, 0x0F, 0x8A, 0xDA, 0x7D, 0xC7, 0x8B, 0xC4, 0xB2, 0xF8, 0x7B, 0x4D, 0x82, 0x58, 0xE4, \n    0xF1, 0x1B, 0x86, 0x8F, 0x1A, 0x82, 0x84, 0x8B, 0xC8, 0x01, 0x71, 0x92, 0x04, 0xA7, 0xFD, 0x5F, \n    0x04, 0xF0, 0x2B, 0xE0, 0x3A, 0xFB, 0xAB, 0xFE, 0x0A, 0x15, 0xE0, 0x19, 0x74, 0x4F, 0x0D, 0xFC, \n    0x52, 0xBC, 0x6F, 0xD8, 0xDE, 0xE3, 0xE1, 0x08, 0xB7, 0xF1, 0x6F, 0x92, 0xDE, 0x21, 0x4D, 0x4A, \n    0xEE, 0x5B, 0x7F, 0x0D, 0x36, 0xF8, 0xFF, 0x00, 0xE2, 0x5E, 0x10, 0x7F, 0xA3, 0x10, 0xD9, 0xC6, \n    0x47, 0xFC, 0xF4, 0xE3, 0xB5, 0x7C, 0x2B, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, \n    0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, \n    0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, \n    0x05, 0x7D, 0x3B, 0xFB, 0x14, 0xEA, 0x7F, 0x01, 0xEC, 0xAE, 0xFC, 0x17, 0xFF, 0x00, 0x09, 0xE6, \n    0xB9, 0xF1, 0xCF, 0x47, 0xF1, 0x02, 0x78, 0x92, 0x36, 0xD4, 0x9F, 0xC2, 0xC2, 0x06, 0xB3, 0x5B, \n    0x0C, 0xF5, 0xB7, 0x0A, 0x45, 0xC0, 0xB9, 0x3E, 0xA3, 0x38, 0xC7, 0x00, 0xD7, 0xCC, 0x55, 0xFA, \n    0x2D, 0xFF, 0x00, 0x04, 0xBA, 0xF8, 0x81, 0xF1, 0xD3, 0x47, 0xF8, 0x71, 0xF0, 0xCE, 0xC7, 0xC0, \n    0xBE, 0x3E, 0xF8, 0x0B, 0xA1, 0xF8, 0x76, 0x1F, 0x1F, 0x47, 0x3E, 0x9F, 0x65, 0xE2, 0xA7, 0xB0, \n    0xFE, 0xD1, 0xB3, 0xBE, 0xDC, 0x3F, 0xD2, 0x26, 0x0E, 0xA2, 0xE0, 0x5B, 0x8E, 0xC4, 0x38, 0x1C, \n    0xF1, 0x8A, 0x00, 0xF3, 0xBF, 0xDB, 0x23, 0x54, 0xF8, 0x2D, 0xA8, 0xFC, 0x73, 0x98, 0xFC, 0x2D, \n    0xD6, 0xBE, 0x33, 0xEA, 0xEC, 0x5A, 0x52, 0x1B, 0xC6, 0xCE, 0x5B, 0x31, 0x79, 0x32, 0xE4, 0xFE, \n    0xF0, 0x79, 0xBB, 0xF3, 0xB7, 0x19, 0xE3, 0x1B, 0xAB, 0xC8, 0x9D, 0x70, 0x7E, 0xB5, 0xF5, 0xEF, \n    0xFC, 0x15, 0x6F, 0xC6, 0x1F, 0x18, 0x3C, 0x45, 0xF1, 0xBA, 0xE2, 0x3F, 0x89, 0xBF, 0x10, 0xBE, \n    0x11, 0xF8, 0xBD, 0xBE, 0xD6, 0xEE, 0x62, 0xF0, 0x73, 0xC6, 0x40, 0x90, 0x41, 0x38, 0x0E, 0x07, \n    0x2F, 0xB0, 0x02, 0xC0, 0xE4, 0xE3, 0x2C, 0xB5, 0xF2, 0x23, 0x8C, 0x8A, 0xD6, 0x9E, 0xC5, 0x44, \n    0xFB, 0x5F, 0xFE, 0x0D, 0xC8, 0x87, 0xCF, 0xFF, 0x00, 0x82, 0xCE, 0x7C, 0x1C, 0x8F, 0xA8, 0x75, \n    0xD7, 0x54, 0xFE, 0x3A, 0x0E, 0xA3, 0x5F, 0x6F, 0xFE, 0xD6, 0xBF, 0x0D, 0xC8, 0xF8, 0xA5, 0xAF, \n    0xBF, 0x97, 0xC3, 0xDE, 0xCC, 0x7A, 0x7F, 0xB6, 0x6B, 0xE2, 0x4F, 0xF8, 0x37, 0x08, 0x67, 0xFE, \n    0x0B, 0x43, 0xF0, 0x63, 0xFE, 0xE3, 0x9F, 0xFA, 0x61, 0xD4, 0x6B, 0xF5, 0x93, 0xF6, 0xA5, 0xF8, \n    0x69, 0x1D, 0xD7, 0x8C, 0xF5, 0x57, 0xDA, 0xBF, 0x34, 0xF2, 0x1F, 0xFC, 0x78, 0xD7, 0xED, 0x9E, \n    0x0A, 0xE6, 0x8B, 0x05, 0x98, 0x57, 0xBF, 0xDA, 0x51, 0xFC, 0x1B, 0x3E, 0x67, 0x88, 0xAB, 0xCA, \n    0x8C, 0xA9, 0x4E, 0x3D, 0xDF, 0xE8, 0x7E, 0x64, 0x7C, 0x55, 0xF8, 0x58, 0xB7, 0x91, 0x4B, 0xFB, \n    0xBE, 0x7E, 0x95, 0xF3, 0x8F, 0x8E, 0xFC, 0x0B, 0x2E, 0x87, 0x76, 0xE7, 0x61, 0xDB, 0x9F, 0x4A, \n    0xFD, 0x0C, 0xF8, 0xA1, 0xE0, 0x18, 0xAD, 0x1A, 0x4C, 0x85, 0xC5, 0x7C, 0xEB, 0xF1, 0x6B, 0xC0, \n    0xB6, 0xD2, 0xC7, 0x26, 0x54, 0x12, 0x6B, 0xFA, 0xDF, 0x15, 0x84, 0xA3, 0x9C, 0x61, 0x39, 0x1F, \n    0xC4, 0x96, 0x8C, 0xFD, 0x0B, 0x86, 0x33, 0x48, 0xE2, 0x69, 0x28, 0x49, 0xEA, 0x4F, 0xF0, 0x57, \n    0xC7, 0xDF, 0x0C, 0xF4, 0x5F, 0xF8, 0x27, 0xED, 0x9F, 0x80, 0x35, 0x1F, 0x88, 0x1A, 0x1E, 0x8B, \n    0xE2, 0x5F, 0x19, 0x7C, 0x51, 0xD3, 0x75, 0xCF, 0x13, 0xC1, 0x3E, 0x97, 0xAA, 0x4D, 0xF6, 0x2D, \n    0x0E, 0xCA, 0x07, 0x58, 0x83, 0xB4, 0x56, 0xAC, 0x92, 0x3F, 0x9E, 0xF2, 0x3E, 0xC8, 0xD9, 0xBE, \n    0x56, 0x5F, 0xE2, 0xCA, 0xAF, 0x41, 0xF1, 0x5B, 0xF6, 0xF6, 0xF0, 0x3F, 0xC6, 0x8F, 0xD9, 0x73, \n    0xC6, 0x3E, 0x17, 0xF1, 0x46, 0xB1, 0x0C, 0xFF, 0x00, 0x11, 0xB4, 0x3D, 0x56, 0x4F, 0x0C, 0x78, \n    0x2F, 0xC4, 0xAF, 0x05, 0xD1, 0xB7, 0xB9, 0xF0, 0xB5, 0xE6, 0xA3, 0x1D, 0xDB, 0x2C, 0xC7, 0xCA, \n    0xF3, 0x80, 0xB4, 0xFB, 0x2A, 0xA2, 0x82, 0x81, 0xFC, 0xBB, 0x96, 0x55, 0x47, 0x39, 0x03, 0xE4, \n    0x3F, 0x89, 0x5A, 0x19, 0xD0, 0x5E, 0x46, 0x84, 0x80, 0x39, 0xAF, 0x0A, 0xF1, 0xA7, 0x89, 0xEE, \n    0x23, 0xBC, 0x2A, 0x64, 0x3D, 0x7D, 0x6B, 0xF9, 0xA3, 0x89, 0x32, 0x9A, 0x79, 0x4E, 0x21, 0xD5, \n    0xAB, 0xCD, 0xCC, 0xA5, 0xCC, 0xB6, 0xD1, 0xDD, 0x6D, 0xA6, 0xCD, 0x2B, 0x5B, 0xB7, 0x9E, 0xA7, \n    0xAD, 0x8D, 0xA7, 0x4E, 0x9B, 0xBB, 0xBD, 0xEF, 0x7F, 0xEB, 0xE5, 0xA1, 0xFA, 0xD3, 0xF1, 0x07, \n    0xFE, 0x0A, 0x73, 0xF0, 0xD7, 0xC1, 0x3F, 0xF0, 0x50, 0x2F, 0x86, 0x7A, 0xCF, 0x87, 0x61, 0xF0, \n    0xEF, 0x8D, 0x3E, 0x13, 0xFC, 0x38, 0xB6, 0xF0, 0xDE, 0x9B, 0x63, 0xAC, 0x58, 0xE8, 0x93, 0x5B, \n    0xEB, 0x31, 0xD9, 0x69, 0xF6, 0x8B, 0x14, 0x91, 0x66, 0xE6, 0x28, 0x65, 0x38, 0x9C, 0xC9, 0x20, \n    0x8C, 0xEE, 0x52, 0x02, 0x90, 0xC1, 0x89, 0x03, 0x85, 0xF0, 0xA7, 0xED, 0x31, 0xE0, 0x6F, 0xD9, \n    0xC7, 0xE1, 0xDF, 0xED, 0x0B, 0x2D, 0x9F, 0x8F, 0x2D, 0x3E, 0x24, 0xF8, 0xCB, 0xE3, 0x63, 0x7F, \n    0x63, 0xE9, 0x86, 0xC2, 0xCA, 0xF6, 0x28, 0x34, 0xFD, 0x39, 0xEE, 0xCD, 0xCC, 0xF7, 0x77, 0x6F, \n    0x75, 0x14, 0x47, 0xCF, 0x71, 0xB1, 0x12, 0x24, 0x0E, 0x54, 0xA9, 0x66, 0x6E, 0x40, 0xAF, 0xCE, \n    0xCF, 0x00, 0x6B, 0x12, 0x5C, 0x40, 0x77, 0x31, 0xC0, 0x1E, 0xB5, 0xD9, 0xD9, 0xC9, 0xBD, 0x81, \n    0x07, 0x9A, 0xF7, 0x78, 0x77, 0x09, 0x83, 0xC6, 0xE1, 0x61, 0xCA, 0xE4, 0xAC, 0xA2, 0x9E, 0xAB, \n    0xDE, 0xE4, 0x97, 0x32, 0xBE, 0x9B, 0xDF, 0x7E, 0x5B, 0x5F, 0xA9, 0xE3, 0xE2, 0x70, 0xAB, 0xD9, \n    0xA9, 0xC0, 0xFB, 0x37, 0xF6, 0x79, 0xF8, 0x82, 0x97, 0x31, 0xC3, 0x97, 0xE8, 0x3D, 0x6B, 0xE8, \n    0x4D, 0x07, 0xC4, 0x2B, 0x76, 0x8B, 0x93, 0x95, 0x35, 0xF9, 0xFF, 0x00, 0xF0, 0x83, 0xC7, 0xB2, \n    0x78, 0x6E, 0x74, 0x0C, 0xE4, 0x0C, 0xF1, 0x5F, 0x52, 0xFC, 0x30, 0xF8, 0x9F, 0x1E, 0xA3, 0x6F, \n    0x17, 0xEF, 0x06, 0x70, 0x3B, 0xD7, 0xD6, 0x4A, 0x57, 0x7A, 0x9E, 0x5E, 0x17, 0x19, 0x28, 0x55, \n    0x3E, 0xAA, 0xFD, 0x97, 0x7C, 0x3B, 0x1E, 0xAB, 0xFB, 0x44, 0xF8, 0x44, 0x80, 0x08, 0x3A, 0x84, \n    0x67, 0xF9, 0xD7, 0xE2, 0xFF, 0x00, 0xFC, 0x16, 0x46, 0xD5, 0x6D, 0x7F, 0xE0, 0xAB, 0x1F, 0xB4, \n    0x2C, 0x4B, 0xD1, 0x7C, 0x79, 0xAA, 0xA8, 0xFC, 0x2E, 0x1E, 0xBF, 0x68, 0x3F, 0x61, 0x5D, 0x6D, \n    0x75, 0x2F, 0xDA, 0x5F, 0xC1, 0xB1, 0xEE, 0xDD, 0xE6, 0x6A, 0x31, 0x8F, 0xE7, 0x5F, 0x8C, 0xFF, \n    0x00, 0xF0, 0x59, 0xC5, 0xCF, 0xFC, 0x15, 0x83, 0xF6, 0x88, 0xFF, 0x00, 0xB1, 0xFB, 0x56, 0xFF, \n    0x00, 0xD2, 0x97, 0xAF, 0xC0, 0xFC, 0x5E, 0x93, 0xFA, 0xE5, 0x08, 0x74, 0xE5, 0x7F, 0x99, 0xEF, \n    0x67, 0xF8, 0xE9, 0x57, 0xA5, 0x46, 0x2D, 0xE8, 0xAF, 0xFA, 0x1F, 0x2E, 0xB8, 0xEF, 0x5F, 0x51, \n    0x7F, 0xC1, 0x3B, 0x7C, 0x4F, 0xF0, 0x8B, 0xC3, 0x9E, 0x33, 0xD0, 0x64, 0xF1, 0xD7, 0xC7, 0x2F, \n    0x8B, 0x9F, 0x0B, 0x1A, 0x32, 0xFF, 0x00, 0x6A, 0x9B, 0xC3, 0x36, 0xEF, 0xB6, 0xCB, 0xF7, 0xAD, \n    0x8F, 0x2D, 0xD1, 0x64, 0x6E, 0x57, 0x6B, 0x1F, 0xDD, 0xF5, 0x26, 0xBE, 0x60, 0x71, 0x83, 0x5F, \n    0x7B, 0xFF, 0x00, 0xC1, 0x1F, 0xEF, 0xBE, 0x37, 0x5A, 0x78, 0xD3, 0xC2, 0x67, 0xE1, 0xB6, 0x91, \n    0xF0, 0x4F, 0x51, 0x2A, 0x65, 0xFB, 0x18, 0xF1, 0x4F, 0x90, 0x93, 0x37, 0xFA, 0x44, 0x99, 0xF3, \n    0x5B, 0xFD, 0x67, 0xDE, 0xDD, 0x8C, 0xFF, 0x00, 0x0E, 0x2B, 0xF2, 0x13, 0xE6, 0x4F, 0x1B, 0xFD, \n    0xB9, 0x7C, 0x45, 0xF0, 0x9F, 0x5B, 0x9B, 0xE2, 0x24, 0xBE, 0x11, 0xFD, 0xA0, 0xBE, 0x30, 0x7C, \n    0x48, 0xBE, 0xB8, 0xF1, 0x11, 0x7D, 0x32, 0xCF, 0x5F, 0xD1, 0x9C, 0x5A, 0x6B, 0x76, 0xBB, 0x93, \n    0xFD, 0x2E, 0xE2, 0xE5, 0xE7, 0x46, 0x13, 0x01, 0xB8, 0xE0, 0xDA, 0x8C, 0x95, 0x5E, 0x99, 0xC8, \n    0xF9, 0x2E, 0xBF, 0x45, 0xFF, 0x00, 0xE0, 0xA7, 0xED, 0xF1, 0xC6, 0xE3, 0xC2, 0x9F, 0x18, 0xA6, \n    0xF1, 0xF7, 0x81, 0x7F, 0x67, 0xBD, 0x26, 0xC5, 0xFC, 0x6B, 0x9D, 0x63, 0x52, 0xF0, 0xE4, 0x36, \n    0x0D, 0xAC, 0x45, 0x77, 0xBE, 0x3C, 0x2D, 0xAC, 0x82, 0x43, 0x73, 0xF6, 0x76, 0x3B, 0x73, 0xF2, \n    0xE3, 0x96, 0xCE, 0x39, 0xAF, 0xCE, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, \n    0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, \n    0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, \n    0x2B, 0xEB, 0xCF, 0xD8, 0x3F, 0x44, 0xF8, 0x7F, 0xAB, 0x59, 0xF8, 0x06, 0x1F, 0x11, 0x7E, 0xCB, \n    0xFF, 0x00, 0x11, 0x3E, 0x2C, 0x6A, 0x57, 0x1E, 0x2B, 0x8E, 0x39, 0xF5, 0x5D, 0x1F, 0x5D, 0xB9, \n    0x8E, 0xDF, 0x5C, 0x80, 0xB7, 0xFC, 0x83, 0xA3, 0xB5, 0x58, 0x36, 0x19, 0x4F, 0x4C, 0x89, 0x81, \n    0x3E, 0xD5, 0xF2, 0x1D, 0x7D, 0x9D, 0xFB, 0x01, 0xF8, 0xF9, 0x3C, 0x3D, 0xE1, 0xFF, 0x00, 0x01, \n    0xDB, 0xCB, 0xFB, 0x5E, 0x6B, 0x9F, 0x07, 0x6D, 0xE0, 0xF1, 0x5A, 0x4F, 0x2E, 0x83, 0x1D, 0xA5, \n    0xF4, 0x96, 0xBA, 0x22, 0xEE, 0xE7, 0x52, 0x05, 0x58, 0xDB, 0xB3, 0x77, 0xDA, 0x53, 0x3E, 0xB4, \n    0x01, 0xD2, 0x7E, 0xDE, 0x5E, 0x13, 0xF0, 0x8F, 0x86, 0x3E, 0x37, 0xCD, 0x1F, 0x85, 0xFF, 0x00, \n    0x66, 0x7F, 0x1B, 0x7C, 0x05, 0x8C, 0x4B, 0x20, 0x03, 0x5E, 0xB9, 0xB8, 0x66, 0x55, 0xF2, 0x65, \n    0xFD, 0xC9, 0x8E, 0x42, 0xCA, 0x0B, 0x70, 0x72, 0x1B, 0x3F, 0x21, 0xF7, 0xAF, 0x06, 0x61, 0x83, \n    0x5E, 0xEF, 0xFB, 0x77, 0x78, 0xD2, 0xC3, 0xC5, 0xBF, 0x1B, 0x26, 0x92, 0xC7, 0xF6, 0x9A, 0xD5, \n    0x3E, 0x3F, 0x29, 0x96, 0x46, 0x12, 0x5C, 0x59, 0x49, 0x6E, 0x8E, 0x3C, 0x99, 0x7F, 0x7D, 0xCE, \n    0x13, 0x23, 0x38, 0xE0, 0x67, 0xE7, 0x35, 0xE1, 0x4E, 0x32, 0x2B, 0x5A, 0x7B, 0x15, 0x13, 0xED, \n    0xAF, 0xF8, 0x37, 0x08, 0x7F, 0xC6, 0xE8, 0xFE, 0x0B, 0xFD, 0x75, 0xCF, 0xFD, 0x30, 0xEA, 0x35, \n    0xFB, 0x35, 0xFB, 0x4E, 0xA7, 0xFC, 0x54, 0xFA, 0x98, 0xDB, 0xC8, 0x99, 0xFB, 0x7B, 0x9A, 0xFC, \n    0x0A, 0xFF, 0x00, 0x82, 0x54, 0xFE, 0xD6, 0x3A, 0x5F, 0xEC, 0x3B, 0xFF, 0x00, 0x05, 0x07, 0xF8, \n    0x63, 0xF1, 0x43, 0x5C, 0xB7, 0x92, 0xE3, 0x44, 0xF0, 0xDE, 0xA1, 0x34, 0x7A, 0x90, 0x8D, 0x4B, \n    0x49, 0x1D, 0xAD, 0xD5, 0xAC, 0xF6, 0x73, 0x4A, 0xAA, 0x08, 0xDC, 0xD1, 0xC7, 0x70, 0xCE, 0x06, \n    0x79, 0x28, 0x07, 0x7A, 0xFE, 0x93, 0x3E, 0x37, 0xFC, 0x11, 0x8B, 0xE3, 0xFE, 0x85, 0x6F, 0xE3, \n    0x6F, 0x87, 0x7A, 0x86, 0x9F, 0xE2, 0xAD, 0x07, 0xC4, 0x50, 0x8B, 0xCB, 0x79, 0xAC, 0x6E, 0x12, \n    0x48, 0xE5, 0x0D, 0xCE, 0xE4, 0x60, 0x70, 0xC0, 0x9E, 0xDD, 0x41, 0xC8, 0x35, 0xF7, 0x3C, 0x07, \n    0x99, 0xE1, 0xF0, 0x79, 0x83, 0xFA, 0xC4, 0x94, 0x54, 0x92, 0xB3, 0x7A, 0x2D, 0x0F, 0x95, 0xE2, \n    0xCC, 0x1D, 0x7A, 0xD8, 0x78, 0xCA, 0x82, 0xBB, 0x8B, 0xD9, 0x6E, 0x7E, 0x6B, 0x7C, 0x69, 0xBA, \n    0xF2, 0x9A, 0x5C, 0xF1, 0x8A, 0xF9, 0x9B, 0xE2, 0xB6, 0xB5, 0x14, 0x51, 0x4B, 0xC8, 0x26, 0xBE, \n    0xE4, 0xFD, 0xA1, 0x7F, 0x60, 0xDF, 0x8B, 0xFA, 0xCB, 0xC8, 0x74, 0xEF, 0x04, 0x6B, 0x17, 0x2B, \n    0xDB, 0xCA, 0x8C, 0x36, 0x7F, 0x5A, 0xF9, 0x0F, 0xE2, 0xE7, 0xFC, 0x13, 0xCF, 0xE3, 0xFC, 0x46, \n    0x43, 0xFF, 0x00, 0x0A, 0xBF, 0xC5, 0xAE, 0xA4, 0xF5, 0x5B, 0x32, 0x45, 0x7F, 0x6E, 0xF0, 0x9E, \n    0x7D, 0x94, 0x4A, 0x9C, 0x5B, 0xC5, 0x53, 0xBF, 0x6E, 0x78, 0xFF, 0x00, 0x99, 0xC3, 0xC2, 0x19, \n    0x96, 0x22, 0x85, 0x55, 0x1A, 0xB0, 0x92, 0xF5, 0x4C, 0xF8, 0xA7, 0xE3, 0xA7, 0x8B, 0x44, 0x62, \n    0x45, 0x04, 0x0C, 0x83, 0x5F, 0x39, 0x6B, 0x12, 0x3E, 0xAF, 0xA9, 0x33, 0xF2, 0x54, 0x1E, 0x3D, \n    0xEB, 0xEC, 0x9F, 0x8A, 0xFF, 0x00, 0xF0, 0x4D, 0xCF, 0x8F, 0x3A, 0x9F, 0x9B, 0x9F, 0x86, 0x3E, \n    0x2B, 0xE8, 0x4F, 0x36, 0x84, 0x57, 0x9C, 0x5A, 0xFF, 0x00, 0xC1, 0x37, 0xFE, 0x33, 0x5A, 0xC8, \n    0x12, 0xE3, 0xE1, 0xCF, 0x88, 0xED, 0xCA, 0x9E, 0x7C, 0xC8, 0x02, 0xFF, 0x00, 0x33, 0x5F, 0x85, \n    0xF8, 0xAD, 0x1A, 0x98, 0xBC, 0xC9, 0xC6, 0x8B, 0x52, 0x87, 0x46, 0x9A, 0x6B, 0xEF, 0x4C, 0xFD, \n    0x92, 0xA5, 0x3A, 0xD8, 0xAB, 0x4A, 0x31, 0x6D, 0x7A, 0x33, 0xCD, 0x7E, 0x1D, 0xD8, 0x32, 0xD9, \n    0xB1, 0xC1, 0xE9, 0x5D, 0x6D, 0x81, 0xF2, 0xFF, 0x00, 0x0A, 0xF5, 0x3F, 0x0C, 0xFE, 0xC1, 0xDF, \n    0x13, 0x74, 0xBB, 0x02, 0x24, 0xF0, 0x7E, 0xA5, 0x1B, 0x63, 0xA3, 0x6C, 0x07, 0xFF, 0x00, 0x42, \n    0xA4, 0x8B, 0xF6, 0x34, 0xF8, 0x9B, 0xE7, 0x32, 0x8F, 0x07, 0xEA, 0xB8, 0xCF, 0x07, 0x09, 0xFF, \n    0x00, 0xC5, 0x57, 0x37, 0x0E, 0xDB, 0x07, 0x4E, 0x09, 0xC9, 0x5F, 0xD5, 0x7F, 0x99, 0xE8, 0x4B, \n    0x2F, 0xA9, 0x1A, 0x29, 0x34, 0x71, 0xBA, 0x56, 0xA3, 0xB7, 0x1B, 0x4E, 0x08, 0xF7, 0xAF, 0x47, \n    0xF8, 0x6D, 0xF1, 0x26, 0x5D, 0x16, 0xE6, 0x35, 0x32, 0x61, 0x46, 0x3A, 0x9A, 0xA9, 0x6B, 0xFB, \n    0x15, 0x7C, 0x55, 0x0C, 0x0C, 0x7E, 0x09, 0xD6, 0xE4, 0xFF, 0x00, 0x76, 0x35, 0x3F, 0xC8, 0xD6, \n    0xA6, 0x99, 0xFB, 0x12, 0xFC, 0x68, 0xB8, 0xBC, 0x4F, 0x23, 0xE1, 0xCF, 0x8A, 0xE5, 0xE7, 0xF8, \n    0x2C, 0xCB, 0x7F, 0x23, 0x5F, 0x63, 0x8A, 0xC5, 0xE1, 0xD7, 0xBF, 0xED, 0x22, 0xBF, 0xED, 0xE5, \n    0xFE, 0x67, 0xC4, 0xE3, 0x30, 0x75, 0x29, 0xD5, 0xBA, 0x4C, 0xFB, 0x8F, 0xFE, 0x09, 0xAD, 0xF1, \n    0x1C, 0x6B, 0x3F, 0xB5, 0x47, 0xC3, 0xF8, 0xD5, 0xF2, 0xF2, 0x6B, 0x10, 0x2E, 0x3E, 0xA7, 0x15, \n    0xF9, 0x81, 0xFF, 0x00, 0x05, 0x99, 0x5C, 0xFF, 0x00, 0xC1, 0x57, 0xBF, 0x68, 0x8F, 0xFB, 0x1F, \n    0xB5, 0x6F, 0xFD, 0x29, 0x7A, 0xFD, 0x7A, 0xFF, 0x00, 0x82, 0x48, 0xFE, 0xC0, 0xFE, 0x26, 0xFD, \n    0x9E, 0xBC, 0x45, 0x27, 0xC7, 0x0F, 0x8E, 0x26, 0x2F, 0x87, 0x3E, 0x07, 0xF8, 0x7D, 0x03, 0xEA, \n    0x61, 0xB5, 0x49, 0x96, 0x17, 0x95, 0xD5, 0x48, 0x0C, 0xC3, 0x3F, 0x2A, 0x8C, 0xF0, 0x3E, 0xF3, \n    0x31, 0x00, 0x0C, 0xF5, 0xFC, 0x4B, 0xFD, 0xBC, 0xFE, 0x3C, 0x58, 0xFE, 0xD4, 0xBF, 0xB6, 0x87, \n    0xC5, 0x2F, 0x88, 0xFA, 0x5D, 0xAC, 0xD6, 0x7A, 0x6F, 0x8D, 0xBC, 0x4F, 0x7F, 0xAC, 0x5A, 0x41, \n    0x29, 0xCC, 0x91, 0x45, 0x34, 0xEC, 0xE8, 0x1B, 0xDF, 0x69, 0x19, 0xAF, 0xE7, 0x6F, 0x12, 0xF3, \n    0x8C, 0x2E, 0x3B, 0x32, 0x85, 0x2C, 0x2C, 0xD4, 0xFD, 0x9C, 0x6C, 0xDA, 0xD5, 0x5D, 0xB6, 0xED, \n    0x75, 0xA3, 0xB2, 0xED, 0xDC, 0xD3, 0x11, 0x52, 0x4E, 0x11, 0x84, 0xB7, 0x57, 0xFC, 0x6D, 0xFE, \n    0x47, 0x8D, 0xBA, 0x73, 0x5F, 0x4C, 0x7F, 0xC1, 0x3E, 0xAC, 0x3E, 0x0B, 0xDF, 0x78, 0xC7, 0x43, \n    0x8F, 0xE2, 0x27, 0xC2, 0xEF, 0x8C, 0x3E, 0x32, 0xCB, 0x3F, 0xDB, 0x1B, 0xC2, 0xB7, 0x12, 0x7F, \n    0xA4, 0x7E, 0xF5, 0xB1, 0xE5, 0xA4, 0x65, 0x5B, 0x85, 0xDA, 0xA7, 0xE6, 0xEA, 0x0D, 0x7C, 0xD7, \n    0x22, 0xD7, 0xDA, 0xFF, 0x00, 0xF0, 0x4A, 0x5F, 0x13, 0xF8, 0xEA, 0xC3, 0xC6, 0x7E, 0x18, 0x87, \n    0xC2, 0x9F, 0xB5, 0x07, 0x81, 0xFE, 0x10, 0xCA, 0x86, 0x4F, 0x26, 0xDF, 0x5E, 0x51, 0xE5, 0x69, \n    0xD9, 0x9D, 0xC9, 0x0F, 0xE6, 0x05, 0x4F, 0x98, 0xE5, 0xFE, 0xFF, 0x00, 0x47, 0xAF, 0xCE, 0x4E, \n    0x33, 0xCB, 0x7F, 0x6D, 0x3B, 0x7F, 0x80, 0x36, 0xFF, 0x00, 0xF0, 0xB1, 0x23, 0xF0, 0x1F, 0xC3, \n    0xEF, 0x8E, 0x9E, 0x1B, 0xD7, 0x93, 0xC4, 0x84, 0x69, 0x32, 0x78, 0x96, 0xF6, 0x2F, 0xB0, 0xE9, \n    0xB6, 0x7B, 0x97, 0x74, 0x17, 0x31, 0x32, 0x19, 0xBC, 0xFC, 0x6E, 0xC6, 0xE9, 0x49, 0xCB, 0x2E, \n    0x7A, 0x60, 0xFC, 0xA5, 0x5F, 0x7E, 0x7F, 0xC1, 0x49, 0x7C, 0x75, 0xF1, 0x2A, 0xF3, 0xC3, 0xDF, \n    0x16, 0x34, 0xBF, 0x12, 0x7E, 0xD5, 0x5F, 0x0D, 0xFE, 0x27, 0xE9, 0xB2, 0x78, 0xB8, 0x49, 0x7B, \n    0xA1, 0x68, 0xAE, 0x7C, 0xCF, 0x10, 0xCF, 0xBE, 0x32, 0x2F, 0xA1, 0x09, 0x01, 0x8B, 0xCB, 0x04, \n    0x03, 0xC4, 0xE7, 0x84, 0x3D, 0x7B, 0xFC, 0x07, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, \n    0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, \n    0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, \n    0x40, 0x05, 0x7B, 0xE7, 0xEC, 0xDB, 0xFB, 0x6E, 0xD9, 0xFE, 0xCF, 0xB6, 0x1E, 0x0F, 0xB7, 0xB8, \n    0xF8, 0x47, 0xF0, 0xAF, 0xC5, 0x8D, 0xE1, 0x3F, 0x11, 0xC7, 0xE2, 0x13, 0xA8, 0x6A, 0x7A, 0x5B, \n    0x36, 0xA7, 0xAA, 0x04, 0x39, 0xFB, 0x1C, 0xF3, 0xEF, 0x2A, 0xD6, 0xC7, 0xBA, 0x79, 0x7E, 0x9C, \n    0xD7, 0x81, 0xD1, 0x40, 0x1F, 0x46, 0x7C, 0x70, 0xFD, 0xAC, 0x74, 0xBF, 0xDA, 0xD7, 0xF6, 0x9A, \n    0xFF, 0x00, 0x84, 0xAA, 0x0F, 0x01, 0xE8, 0x7E, 0x02, 0x9F, 0x56, 0x32, 0x42, 0x2C, 0x74, 0x57, \n    0x0B, 0x67, 0x19, 0x74, 0x70, 0xAA, 0xB1, 0xEC, 0x5C, 0x65, 0x8A, 0x8E, 0xB5, 0x9F, 0x5E, 0x0F, \n    0x6D, 0x71, 0x25, 0xA4, 0xC9, 0x2C, 0x6C, 0xC9, 0x24, 0x6C, 0x19, 0x58, 0x1C, 0x15, 0x23, 0x90, \n    0x6B, 0xDA, 0xBC, 0x21, 0xE2, 0xE8, 0x7E, 0x20, 0xDB, 0xAB, 0x42, 0xC8, 0xBA, 0xAE, 0x3F, 0x7F, \n    0x6A, 0x38, 0x69, 0x1B, 0xBB, 0xC6, 0x3B, 0x83, 0xD4, 0xA8, 0xE4, 0x7A, 0x63, 0xA6, 0x90, 0x7D, \n    0x0A, 0x89, 0x6D, 0x86, 0x0D, 0x7A, 0x67, 0xC1, 0x3F, 0xDB, 0x5B, 0xE2, 0xFF, 0x00, 0xEC, 0xD1, \n    0xA5, 0xCD, 0x63, 0xF0, 0xFF, 0x00, 0xE2, 0x67, 0x8E, 0x3C, 0x1B, 0x63, 0x70, 0xC5, 0xA4, 0xB6, \n    0xD2, 0x35, 0x89, 0xED, 0x61, 0x72, 0x7A, 0x9D, 0x8A, 0xC1, 0x73, 0xD3, 0x9C, 0x57, 0x9B, 0x4B, \n    0x13, 0x21, 0x21, 0x94, 0xAB, 0x0E, 0x08, 0x23, 0x04, 0x54, 0x4C, 0x32, 0x2B, 0x42, 0x8F, 0xA1, \n    0x5B, 0xFE, 0x0A, 0xEF, 0xFB, 0x51, 0x86, 0xC7, 0xFC, 0x2F, 0xEF, 0x8B, 0x1F, 0xF8, 0x51, 0xDC, \n    0xFF, 0x00, 0xF1, 0x55, 0x13, 0xFF, 0x00, 0xC1, 0x5E, 0x7F, 0x6A, 0x4C, 0x7F, 0xC9, 0xC0, 0x7C, \n    0x58, 0xFF, 0x00, 0xC2, 0x8E, 0xE7, 0xFF, 0x00, 0x8A, 0xAF, 0x9E, 0xDC, 0x64, 0x54, 0x4E, 0x3B, \n    0xD1, 0x64, 0x2B, 0x1E, 0xED, 0xA8, 0x7F, 0xC1, 0x56, 0x3F, 0x69, 0x5D, 0x47, 0x3F, 0x68, 0xF8, \n    0xE9, 0xF1, 0x3E, 0x6C, 0xF5, 0xDF, 0xAF, 0xDC, 0x1F, 0xFD, 0x9A, 0xB1, 0xAF, 0x7F, 0xE0, 0xA4, \n    0x5F, 0x1F, 0xEF, 0x39, 0x9B, 0xE3, 0x17, 0xC4, 0x49, 0x0F, 0x7D, 0xDA, 0xDC, 0xE7, 0xFF, 0x00, \n    0x66, 0xAF, 0x1C, 0x75, 0xED, 0x50, 0xB8, 0xEF, 0x5A, 0x46, 0xB5, 0x48, 0xAB, 0x46, 0x4D, 0x7C, \n    0xCD, 0xE9, 0xE3, 0x2B, 0xD3, 0xFE, 0x1C, 0xDA, 0xF4, 0x6D, 0x1E, 0xB3, 0x3F, 0xFC, 0x14, 0x27, \n    0xE3, 0x9C, 0x99, 0xDD, 0xF1, 0x67, 0xC7, 0xAD, 0xF5, 0xD6, 0x26, 0xFF, 0x00, 0x1A, 0xAC, 0xDF, \n    0xF0, 0x50, 0x3F, 0x8E, 0x08, 0x72, 0x3E, 0x2B, 0xF8, 0xEC, 0x67, 0xFE, 0xA2, 0xF2, 0xFF, 0x00, \n    0x8D, 0x79, 0x44, 0x8B, 0xFA, 0x54, 0x32, 0x2E, 0x7F, 0x1A, 0x87, 0x56, 0x7F, 0xCC, 0xCD, 0xA5, \n    0x9A, 0x63, 0x5E, 0xF5, 0x65, 0xFF, 0x00, 0x81, 0x3F, 0xF3, 0x3D, 0x82, 0x2F, 0xF8, 0x28, 0xFF, \n    0x00, 0xC7, 0xCB, 0x3F, 0xF5, 0x3F, 0x18, 0x3E, 0x20, 0xC7, 0x8F, 0xEE, 0xEB, 0x33, 0x0F, 0xEB, \n    0x57, 0x2D, 0x7F, 0xE0, 0xAA, 0x9F, 0xB4, 0xA6, 0x96, 0x73, 0x6F, 0xF1, 0xCB, 0xE2, 0x6C, 0x24, \n    0x1F, 0xE0, 0xD7, 0xA7, 0x1F, 0xFB, 0x35, 0x78, 0x64, 0x82, 0xA0, 0x91, 0x7F, 0x4A, 0x89, 0x4A, \n    0x52, 0xD2, 0x4E, 0xE6, 0x12, 0xC6, 0x62, 0x25, 0xA4, 0xA7, 0x27, 0xF3, 0x67, 0xA6, 0x7C, 0x7B, \n    0xFD, 0xBA, 0xFE, 0x34, 0x7E, 0xD4, 0x1E, 0x1E, 0xB7, 0xD2, 0x7E, 0x22, 0x7C, 0x52, 0xF1, 0xD7, \n    0x8D, 0x34, 0xBB, 0x39, 0x3C, 0xE8, 0x6C, 0xF5, 0x7D, 0x62, 0x7B, 0xA8, 0x23, 0x7E, 0x9B, 0x82, \n    0x33, 0x15, 0xCF, 0xBE, 0x2B, 0xC8, 0x24, 0x5A, 0xB7, 0x22, 0xE3, 0xF0, 0xA8, 0x24, 0x5A, 0xCD, \n    0x45, 0x45, 0x5A, 0x27, 0x31, 0x4E, 0x55, 0xAE, 0xFF, 0x00, 0xF6, 0x46, 0xF8, 0xDF, 0xF0, 0xDF, \n    0xE0, 0x2F, 0xC5, 0x9B, 0x0F, 0x11, 0x78, 0xEB, 0xE1, 0xCF, 0xFC, 0x2C, 0xCD, 0x3E, 0xD5, 0x89, \n    0xB9, 0xD1, 0xAF, 0x2E, 0xA2, 0x8A, 0xCE, 0xE7, 0xE6, 0xC8, 0xFB, 0xD1, 0x39, 0x1C, 0x60, 0x77, \n    0xEF, 0x5E, 0x79, 0xAF, 0x3C, 0x9A, 0x75, 0xA0, 0x66, 0x46, 0x4F, 0x34, 0x7C, 0x84, 0x8C, 0x67, \n    0xE9, 0xEB, 0x5C, 0xB9, 0x39, 0x35, 0x20, 0x7D, 0x05, 0xFB, 0x4A, 0xFE, 0xD3, 0xFF, 0x00, 0x0A, \n    0x7E, 0x2E, 0x41, 0xE3, 0xC4, 0xF0, 0x8F, 0xC0, 0x7F, 0x0F, 0xF8, 0x22, 0xE7, 0xC4, 0xDE, 0x20, \n    0x3A, 0xB6, 0x8D, 0xA8, 0x41, 0xAC, 0xDC, 0xBC, 0xDE, 0x1C, 0xB3, 0x3B, 0x3F, 0xE2, 0x5F, 0x1C, \n    0x0B, 0xB2, 0xDD, 0xE3, 0xF9, 0x5B, 0xE6, 0x31, 0xEE, 0x1B, 0xCF, 0x3C, 0x0A, 0xF9, 0xF6, 0x8A, \n    0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, \n    0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, \n    0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA7, 0x23, \n    0x14, 0x60, 0x54, 0xF2, 0x3A, 0x11, 0xDA, 0x9B, 0x45, 0x00, 0x7D, 0x55, 0xFB, 0x2D, 0x7E, 0xCD, \n    0x7F, 0x13, 0xFF, 0x00, 0x69, 0x3F, 0xD9, 0x2F, 0xE2, 0xD7, 0x8F, 0xBC, 0x37, 0xAA, 0xDE, 0xC9, \n    0xA7, 0xFC, 0x1E, 0x86, 0x1D, 0x4B, 0x56, 0x92, 0x49, 0x5A, 0x43, 0x15, 0xA9, 0x82, 0xE1, 0xC8, \n    0x19, 0xCE, 0x3F, 0xD4, 0xFE, 0x95, 0xF5, 0x17, 0x82, 0xFF, 0x00, 0xE0, 0x9A, 0x1F, 0x10, 0x35, \n    0x1F, 0xDA, 0x57, 0xF6, 0x59, 0xF0, 0x9D, 0xC2, 0x79, 0xD1, 0xFC, 0x61, 0xF0, 0x69, 0xF1, 0x34, \n    0xD0, 0x96, 0x6C, 0x5F, 0x46, 0x22, 0xF3, 0x8B, 0x31, 0x07, 0x20, 0xED, 0x96, 0x2F, 0xBA, 0x40, \n    0xE2, 0xBE, 0x11, 0xF8, 0x19, 0xF1, 0xCB, 0x4B, 0xF8, 0x6B, 0xF0, 0x1B, 0xE2, 0xD7, 0x87, 0x6F, \n    0x2F, 0x7C, 0x5D, 0x6D, 0xAB, 0x78, 0xC3, 0x4C, 0xB3, 0xB6, 0xD1, 0x57, 0x4A, 0xD4, 0x1E, 0xDE, \n    0xC0, 0xCC, 0xB7, 0x71, 0x9B, 0x8F, 0xB6, 0xC6, 0x18, 0x09, 0xA3, 0x6B, 0x43, 0x71, 0x1A, 0xA9, \n    0x0C, 0x03, 0x48, 0x0E, 0x3B, 0xD7, 0xAF, 0x78, 0x03, 0xF6, 0xF5, 0xF0, 0xCF, 0x87, 0xBE, 0x37, \n    0x7E, 0xCF, 0x1A, 0xFE, 0xA1, 0x79, 0xF1, 0x2A, 0x7D, 0x27, 0xE1, 0x4F, 0x87, 0x5B, 0x4E, 0xD6, \n    0x56, 0x2D, 0x6E, 0x45, 0xBA, 0x7B, 0xBD, 0xF7, 0x2C, 0x0D, 0x9B, 0xEF, 0xFD, 0xD4, 0x38, 0x6B, \n    0x55, 0x28, 0x08, 0x04, 0x44, 0x46, 0x39, 0xA7, 0x76, 0x07, 0x75, 0xAA, 0x7E, 0xC9, 0x1E, 0x34, \n    0xD3, 0x3F, 0xE0, 0x9E, 0x3E, 0x38, 0xF8, 0xAF, 0x27, 0xFC, 0xC0, 0x7E, 0x26, 0x0F, 0x09, 0xC5, \n    0x77, 0xD5, 0xA2, 0x41, 0x22, 0xC2, 0xD1, 0x63, 0xEE, 0x91, 0xE6, 0x30, 0xE4, 0x8C, 0xFB, 0xD7, \n    0xBC, 0xDE, 0xFF, 0x00, 0xC1, 0x26, 0xFC, 0x71, 0x73, 0xFB, 0x70, 0xF8, 0x9F, 0xE1, 0x8C, 0x1A, \n    0x6C, 0x5E, 0x60, 0xF8, 0x54, 0x7C, 0x5B, 0xA7, 0x5B, 0x65, 0x8A, 0xC7, 0x39, 0x44, 0x45, 0x97, \n    0x39, 0xC9, 0x3E, 0x61, 0x27, 0x04, 0x95, 0xE7, 0xA5, 0x7C, 0x41, 0xA4, 0x7E, 0xD7, 0x3E, 0x1F, \n    0x1F, 0xB0, 0x87, 0xC4, 0x4F, 0x87, 0xBA, 0x83, 0x78, 0xD2, 0xE3, 0xC6, 0x5E, 0x2A, 0xF1, 0xC5, \n    0x97, 0x88, 0xAC, 0x26, 0x5D, 0x4D, 0xC6, 0x93, 0x0D, 0xB4, 0x6B, 0x21, 0x9B, 0xCC, 0x83, 0x76, \n    0x3E, 0xD0, 0xCE, 0xC0, 0xEF, 0x0B, 0x93, 0xC7, 0x3F, 0x2D, 0x7A, 0xDE, 0xA7, 0xFF, 0x00, 0x05, \n    0x2C, 0xF0, 0x8C, 0xBF, 0xB5, 0xDE, 0xA9, 0xE3, 0x8B, 0x2D, 0x43, 0xE2, 0xB5, 0xAE, 0x87, 0x71, \n    0xF0, 0xA6, 0x5F, 0x07, 0x5B, 0x31, 0xD6, 0xA4, 0x6D, 0x44, 0x6A, 0x67, 0x4D, 0x30, 0xC6, 0xED, \n    0x27, 0x99, 0x93, 0x6C, 0x2E, 0xB0, 0xFB, 0x73, 0xD0, 0x74, 0xCF, 0x14, 0x73, 0x30, 0x34, 0xBC, \n    0x1F, 0xFB, 0x10, 0xF8, 0xE7, 0xC5, 0x9F, 0xB2, 0xCF, 0xEC, 0xD3, 0xE3, 0xC8, 0x6D, 0xE3, 0x78, \n    0x7E, 0x31, 0x78, 0xE6, 0xE3, 0xC2, 0xC6, 0x73, 0x1F, 0x37, 0xAF, 0xF6, 0x97, 0x8A, 0x38, 0xC8, \n    0xC6, 0x06, 0x3E, 0xCF, 0x38, 0xCA, 0x80, 0x7D, 0xEB, 0x67, 0xC4, 0x3F, 0xF0, 0x4F, 0xBF, 0x1A, \n    0x78, 0x5B, 0xFE, 0x1A, 0xEA, 0x4B, 0xDD, 0x3E, 0x1F, 0x27, 0xE0, 0x3C, 0x71, 0xED, 0x3E, 0x5F, \n    0xFC, 0x83, 0xD9, 0xC9, 0x90, 0x63, 0xFB, 0xDF, 0xBB, 0x2B, 0xF7, 0xF3, 0x5F, 0x3D, 0xE9, 0x5F, \n    0xB6, 0x5D, 0xAE, 0x9B, 0xFB, 0x2D, 0xFC, 0x17, 0xF0, 0x6C, 0x7A, 0xEF, 0x8E, 0xED, 0xF5, 0x4F, \n    0x87, 0x7E, 0x39, 0xD4, 0x3C, 0x43, 0x78, 0xB0, 0x6A, 0x0E, 0x96, 0x76, 0xF6, 0x92, 0x7D, 0x90, \n    0xDB, 0xB5, 0xA2, 0xEE, 0xFD, 0xDD, 0xC2, 0xB0, 0xBD, 0x25, 0x80, 0x1C, 0xCF, 0x9C, 0xF2, 0x6B, \n    0xA8, 0xF1, 0xB7, 0xED, 0xDF, 0xA2, 0x6A, 0x97, 0xFF, 0x00, 0xB5, 0x25, 0xC6, 0x9F, 0xAE, 0x7C, \n    0x47, 0x67, 0xF8, 0xC0, 0x6D, 0xE0, 0xF0, 0xF8, 0xBA, 0xD4, 0x9D, 0xD6, 0x7B, 0x61, 0x78, 0xAD, \n    0x2A, 0xEA, 0x20, 0xBE, 0x25, 0x7F, 0xB3, 0x0D, 0x8A, 0x4E, 0xEC, 0x1C, 0xFA, 0xD1, 0x76, 0x07, \n    0xBD, 0x78, 0x67, 0xFE, 0x09, 0xB1, 0xE2, 0xD6, 0xFD, 0xA1, 0x7F, 0x65, 0x3F, 0x08, 0xDF, 0xE8, \n    0xF0, 0x48, 0xFF, 0x00, 0x19, 0xFC, 0x34, 0x75, 0xBB, 0x88, 0x76, 0x10, 0x35, 0x00, 0x13, 0xCC, \n    0x2C, 0x48, 0xE5, 0x7E, 0x47, 0x8F, 0xEE, 0x15, 0x15, 0xC1, 0xF8, 0xEB, 0xF6, 0x11, 0xF1, 0xA7, \n    0x84, 0x3F, 0x61, 0xAF, 0x8D, 0x3F, 0x10, 0x66, 0xD3, 0x60, 0x4B, 0xCF, 0x84, 0xFF, 0x00, 0x12, \n    0x4F, 0x85, 0xEF, 0xAE, 0xFC, 0xA1, 0x9B, 0x68, 0x43, 0x43, 0x09, 0x8B, 0x6E, 0x36, 0x9F, 0xDE, \n    0xCF, 0x1F, 0x24, 0x6E, 0xE7, 0xAD, 0x73, 0xFF, 0x00, 0x0F, 0xBF, 0xE0, 0xA0, 0xDE, 0x11, 0xD1, \n    0xBE, 0x37, 0xFE, 0xCB, 0x5A, 0xE6, 0xA9, 0xAC, 0x7C, 0x56, 0x93, 0x48, 0xF8, 0x43, 0xA3, 0x0B, \n    0x2F, 0x11, 0x4B, 0x16, 0xAC, 0xDF, 0x6D, 0x49, 0x8C, 0xF3, 0x33, 0xAD, 0x83, 0xEF, 0xCC, 0x70, \n    0xF9, 0x7E, 0x4A, 0x85, 0xC8, 0x18, 0x52, 0x3B, 0x57, 0x0D, 0xAC, 0x7E, 0xDA, 0x36, 0x9A, 0xB7, \n    0xEC, 0x7B, 0xF1, 0x93, 0xC1, 0x33, 0x78, 0x87, 0xC7, 0xD2, 0x6B, 0x1E, 0x3E, 0xF8, 0x81, 0x65, \n    0xE2, 0x4B, 0x2B, 0x79, 0x2F, 0x9D, 0xB4, 0xFB, 0x9B, 0x45, 0x17, 0x2D, 0x3B, 0x5D, 0x2E, 0xFF, \n    0x00, 0x9A, 0x76, 0x73, 0x68, 0xC0, 0x90, 0x72, 0x62, 0xCE, 0x7E, 0x51, 0x4A, 0xE0, 0x7D, 0x2B, \n    0xE2, 0x6F, 0xF8, 0x25, 0x57, 0x8F, 0xEC, 0x7F, 0x6D, 0xBD, 0x5F, 0xE1, 0xAC, 0x5A, 0x1C, 0x2A, \n    0x6D, 0x3E, 0x1A, 0x9F, 0x18, 0x25, 0xB7, 0x96, 0x48, 0x53, 0xE4, 0x15, 0xF3, 0x72, 0x7E, 0x6F, \n    0xF5, 0xCA, 0xC7, 0x19, 0xDB, 0xED, 0x8E, 0x2B, 0xCD, 0x7C, 0x3F, 0xFB, 0x0F, 0x78, 0xC3, 0x5B, \n    0xFD, 0x89, 0x7E, 0x0A, 0xFC, 0x40, 0x4D, 0x26, 0x16, 0xB9, 0xF8, 0xA1, 0xF1, 0x08, 0xF8, 0x62, \n    0x0B, 0xBF, 0x28, 0x66, 0xED, 0x0B, 0xC9, 0x1A, 0xC5, 0xB7, 0x1B, 0x47, 0xCF, 0x13, 0xF2, 0xA0, \n    0x1F, 0x7A, 0xAF, 0xA9, 0x7F, 0xC1, 0x49, 0xB4, 0xDD, 0x47, 0xF6, 0xAF, 0x5F, 0x1C, 0x9F, 0x1D, \n    0x7C, 0x5C, 0x4B, 0x75, 0xF8, 0x57, 0x17, 0x85, 0xFE, 0xD8, 0xBA, 0x8B, 0x0B, 0xE6, 0xD5, 0x17, \n    0x4C, 0x11, 0xB4, 0x6C, 0xDB, 0x89, 0x6B, 0x33, 0x78, 0x5D, 0xF0, 0x7B, 0x36, 0x71, 0x5E, 0x6A, \n    0xBF, 0xB6, 0x4D, 0xAE, 0x9F, 0xFB, 0x19, 0xFC, 0x23, 0xF0, 0x1D, 0xA7, 0x89, 0xBC, 0x7C, 0xBA, \n    0xBF, 0x84, 0x7C, 0x77, 0x7B, 0xE2, 0x7D, 0x4E, 0x0F, 0xB6, 0xB0, 0xB1, 0xD3, 0xE3, 0xC4, 0x22, \n    0xD6, 0x4B, 0x11, 0x9F, 0xDD, 0xCB, 0xF3, 0x5D, 0x33, 0x11, 0x8F, 0x99, 0x81, 0xA2, 0xE0, 0x7D, \n    0x25, 0xE2, 0xEF, 0xF8, 0x26, 0x77, 0x8A, 0x2D, 0xFE, 0x33, 0xFE, 0xD6, 0x1E, 0x16, 0xB4, 0xF0, \n    0xFD, 0xBA, 0x5C, 0x7C, 0x18, 0xF0, 0xFC, 0x3A, 0xE5, 0x9C, 0x5B, 0x49, 0xFE, 0xCE, 0x84, 0xA9, \n    0x95, 0xDC, 0x67, 0x97, 0xFD, 0xDC, 0x72, 0x7D, 0xFD, 0xD5, 0xF3, 0x3F, 0xC7, 0xAF, 0xD9, 0xCB, \n    0xE2, 0x07, 0xEC, 0xDB, 0xFB, 0x32, 0x7C, 0x31, 0xF8, 0x81, 0xAF, 0xC3, 0x15, 0x9D, 0xAF, 0xC5, \n    0x2F, 0x3A, 0xFF, 0x00, 0x45, 0xB9, 0x16, 0xF1, 0x83, 0x71, 0x68, 0xB0, 0x5B, 0xB8, 0xFE, 0x1C, \n    0x70, 0x65, 0xEA, 0x39, 0xE6, 0xBD, 0x6B, 0xC5, 0x9F, 0xF0, 0x52, 0x2F, 0x0E, 0xDF, 0x7C, 0x6E, \n    0xFD, 0xAA, 0xBC, 0x45, 0xA6, 0xF8, 0xCB, 0xE2, 0xC4, 0x76, 0xFF, 0x00, 0x16, 0xBC, 0x36, 0xBA, \n    0x3F, 0x87, 0x66, 0x92, 0xF4, 0xFD, 0xAB, 0x51, 0x60, 0x61, 0x42, 0x9A, 0x89, 0xDD, 0xF3, 0x47, \n    0xE5, 0x09, 0xC7, 0x5E, 0x8E, 0x78, 0xE7, 0x15, 0xE0, 0xFF, 0x00, 0xB4, 0x9F, 0xED, 0x22, 0x9F, \n    0x17, 0x3F, 0x66, 0xBF, 0x82, 0x7E, 0x16, 0x5F, 0x17, 0xF8, 0xDB, 0x5E, 0xBB, 0xF0, 0x4E, 0x93, \n    0x79, 0x6D, 0xA9, 0x69, 0x9A, 0xBD, 0xC9, 0x97, 0x4D, 0xD1, 0xA5, 0x37, 0x4C, 0xB0, 0x25, 0x82, \n    0x9F, 0xB9, 0x19, 0xB4, 0x8E, 0xDC, 0x30, 0x1C, 0x6E, 0x53, 0x45, 0xC0, 0xF1, 0x5D, 0x47, 0x56, \n    0xB8, 0xD6, 0x6E, 0xDA, 0x7B, 0xA9, 0xE4, 0xB8, 0x99, 0xBA, 0xBC, 0x8C, 0x58, 0xFD, 0x3E, 0x95, \n    0x56, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x03, 0xFF, 0xD9, \n} ;\n\nconst char sleep_jpg[] PROGMEM =\n{\n    0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x60, \n    0x00, 0x60, 0x00, 0x00, 0xFF, 0xE1, 0x00, 0x22, 0x45, 0x78, 0x69, 0x66, 0x00, 0x00, 0x4D, 0x4D, \n    0x00, 0x2A, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x01, 0x12, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, \n    0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x02, 0x01, 0x01, \n    0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x05, 0x03, 0x03, 0x03, \n    0x03, 0x03, 0x06, 0x04, 0x04, 0x03, 0x05, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 0x08, \n    0x09, 0x0B, 0x09, 0x08, 0x08, 0x0A, 0x08, 0x07, 0x07, 0x0A, 0x0D, 0x0A, 0x0A, 0x0B, 0x0C, 0x0C, \n    0x0C, 0x0C, 0x07, 0x09, 0x0E, 0x0F, 0x0D, 0x0C, 0x0E, 0x0B, 0x0C, 0x0C, 0x0C, 0xFF, 0xDB, 0x00, \n    0x43, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x06, 0x03, 0x03, 0x06, 0x0C, 0x08, 0x07, 0x08, \n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, \n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, \n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, \n    0x0C, 0x0C, 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x00, 0xB5, 0x01, 0x40, 0x03, 0x01, 0x22, 0x00, 0x02, \n    0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, 0x00, 0x1F, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, \n    0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, \n    0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, \n    0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04, \n    0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, \n    0x91, 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, 0x33, 0x62, 0x72, 0x82, \n    0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, \n    0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, \n    0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, \n    0x77, 0x78, 0x79, 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, \n    0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, \n    0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, \n    0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, \n    0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xC4, 0x00, \n    0x1F, 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, \n    0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, \n    0x00, 0xB5, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, \n    0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, \n    0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 0x23, \n    0x33, 0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, \n    0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, \n    0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, \n    0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84, \n    0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, \n    0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, \n    0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, \n    0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, \n    0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, \n    0x00, 0x3F, 0x00, 0xFE, 0x7F, 0xE8, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xAB, 0x56, 0xFA, 0x1D, 0xED, 0xDD, 0xBF, 0x9D, 0x0D, 0x9D, \n    0xD4, 0xB1, 0x0E, 0xAE, 0x91, 0x33, 0x2F, 0xE7, 0x8A, 0xAA, 0x46, 0xD3, 0x55, 0x28, 0x49, 0x2B, \n    0xB4, 0x2B, 0xA7, 0xB1, 0x63, 0x4C, 0xD3, 0x2E, 0x35, 0x9D, 0x46, 0x0B, 0x4B, 0x38, 0x25, 0xB9, \n    0xBA, 0xBA, 0x91, 0x62, 0x86, 0x28, 0x94, 0xB3, 0xC8, 0xE4, 0xE0, 0x28, 0x03, 0x92, 0x49, 0x3D, \n    0x2B, 0xF4, 0xF7, 0xF6, 0x5C, 0xFF, 0x00, 0x83, 0x57, 0xBE, 0x33, 0xFC, 0x67, 0xF0, 0x7D, 0x9E, \n    0xB7, 0xE3, 0x4F, 0x11, 0xF8, 0x67, 0xE1, 0xCC, 0x57, 0xD1, 0xAC, 0xD1, 0xD8, 0x5E, 0x33, 0x5C, \n    0xDF, 0x2A, 0x30, 0xC8, 0xDF, 0x1C, 0x79, 0x31, 0x92, 0x3B, 0x37, 0x35, 0xF1, 0xE7, 0xFC, 0x12, \n    0xC7, 0xC2, 0x4B, 0xE3, 0x5F, 0xDB, 0xF3, 0xE1, 0x8D, 0x93, 0x28, 0x75, 0x5D, 0x66, 0x2B, 0x82, \n    0x08, 0xCE, 0x3C, 0xB3, 0xBF, 0xFF, 0x00, 0x65, 0xAF, 0xE9, 0xD9, 0x3E, 0x31, 0xB8, 0x92, 0x4F, \n    0x98, 0xFD, 0xE3, 0xDF, 0xF0, 0xAF, 0xD0, 0xB8, 0x67, 0x85, 0xA1, 0x8C, 0xC0, 0xFD, 0x71, 0xAE, \n    0x66, 0xE5, 0x28, 0xD9, 0xDE, 0xC9, 0x25, 0x17, 0x7D, 0x1A, 0xBB, 0x6D, 0xBD, 0xF4, 0xD3, 0x63, \n    0xE6, 0xB3, 0x8C, 0xE6, 0x58, 0x7A, 0xFE, 0xC1, 0x69, 0xA2, 0x77, 0xF5, 0x6F, 0xFC, 0x8F, 0xC5, \n    0x3F, 0xDA, 0x6B, 0xFE, 0x0D, 0x54, 0xF8, 0xC9, 0xF0, 0x8F, 0xC2, 0x37, 0x9A, 0xC7, 0x82, 0x7C, \n    0x51, 0xE1, 0x7F, 0x88, 0x9F, 0x63, 0x8C, 0xCA, 0xFA, 0x7D, 0xB1, 0x6B, 0x5B, 0xD9, 0x14, 0x0C, \n    0x9F, 0x2D, 0x64, 0xC6, 0xF6, 0xC7, 0xF0, 0x8E, 0x6B, 0xF2, 0xF7, 0x5A, 0xD1, 0x6E, 0xFC, 0x39, \n    0xAB, 0x5D, 0x69, 0xF7, 0xF6, 0xF3, 0x59, 0xDF, 0x59, 0x4A, 0xD0, 0xCF, 0x04, 0xC8, 0x52, 0x48, \n    0x5D, 0x4E, 0x19, 0x58, 0x1E, 0x41, 0x04, 0x63, 0x15, 0xFD, 0x73, 0xDE, 0x7C, 0x65, 0x91, 0x64, \n    0x5F, 0x98, 0xFD, 0xE1, 0xDF, 0xDE, 0xBF, 0x9A, 0x3F, 0xF8, 0x2B, 0xDF, 0x84, 0x47, 0x83, 0xBF, \n    0xE0, 0xA2, 0x3F, 0x13, 0x21, 0x55, 0xDA, 0x97, 0x5A, 0x9B, 0x5E, 0x80, 0x06, 0x07, 0xEF, 0x46, \n    0xF3, 0xF9, 0x92, 0x4D, 0x57, 0x13, 0x70, 0xAC, 0x30, 0x78, 0x1F, 0xAE, 0xC6, 0x3C, 0xAD, 0x49, \n    0x2B, 0x2B, 0xD9, 0xA6, 0x9E, 0xBA, 0xB7, 0x66, 0x9A, 0x5B, 0x69, 0xAE, 0xC4, 0xE4, 0xF9, 0xD4, \n    0xB1, 0x15, 0xFD, 0x84, 0x9D, 0xF4, 0x6E, 0xFE, 0x96, 0xFF, 0x00, 0x33, 0xE6, 0xAA, 0x28, 0xAB, \n    0x13, 0xE9, 0x57, 0x56, 0xB0, 0x2C, 0xB2, 0x5B, 0x5C, 0x47, 0x13, 0x7D, 0xD7, 0x68, 0xC8, 0x53, \n    0xF4, 0x35, 0xF9, 0xD2, 0x8B, 0x7B, 0x1F, 0x51, 0x72, 0xBD, 0x14, 0x51, 0x48, 0x02, 0x8A, 0x28, \n    0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, \n    0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, \n    0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, \n    0xA0, 0x02, 0x8A, 0x92, 0xD6, 0xD6, 0x4B, 0xDB, 0x88, 0xE1, 0x86, 0x37, 0x96, 0x69, 0x98, 0x22, \n    0x22, 0x0D, 0xCC, 0xEC, 0x4E, 0x00, 0x03, 0xB9, 0x26, 0xBF, 0x45, 0xBF, 0xE0, 0x9F, 0x9F, 0xF0, \n    0x4B, 0x1D, 0x2B, 0x4D, 0x8A, 0xC7, 0xC6, 0x1F, 0x16, 0x2D, 0x56, 0xEE, 0x46, 0xDB, 0x3D, 0x9E, \n    0x80, 0xE7, 0xE5, 0x1D, 0xC3, 0x5C, 0x7B, 0x7F, 0xB3, 0xDE, 0xBE, 0xAB, 0x85, 0x78, 0x43, 0x1F, \n    0x9F, 0xE2, 0x1D, 0x1C, 0x1C, 0x7D, 0xD8, 0xFC, 0x52, 0x7B, 0x45, 0x7E, 0xAD, 0xF4, 0x5F, 0x92, \n    0xBB, 0x3C, 0x8C, 0xE3, 0x3B, 0xC3, 0x65, 0xB4, 0xBD, 0xA6, 0x21, 0xEA, 0xF6, 0x5D, 0x5F, 0xF5, \n    0xDC, 0xF9, 0xD7, 0xF6, 0x2A, 0xFF, 0x00, 0x82, 0x5A, 0xFC, 0x52, 0xFD, 0xB6, 0xEE, 0xE1, 0xBB, \n    0xD1, 0x74, 0xD8, 0xF4, 0x1F, 0x0A, 0xEF, 0xDB, 0x2E, 0xBF, 0xAB, 0x6E, 0x86, 0xD7, 0x03, 0xAF, \n    0x94, 0x30, 0x5E, 0x66, 0xFF, 0x00, 0x70, 0x11, 0x91, 0x82, 0x45, 0x7E, 0xB1, 0x7E, 0xC9, 0x1F, \n    0xF0, 0x43, 0x1F, 0x81, 0x3F, 0xB3, 0xBC, 0x56, 0xB7, 0xFE, 0x26, 0xB5, 0xB8, 0xF8, 0x99, 0xE2, \n    0x28, 0x76, 0xBB, 0x4F, 0xAA, 0xFE, 0xE7, 0x4F, 0x8D, 0xC1, 0xCE, 0x52, 0xD9, 0x0F, 0x3F, 0xF0, \n    0x37, 0x39, 0xF4, 0xAF, 0x4A, 0xD3, 0x7E, 0x2D, 0x5B, 0xE8, 0x7A, 0x6C, 0x16, 0x76, 0x71, 0x41, \n    0x69, 0x67, 0x6A, 0x82, 0x38, 0x60, 0x85, 0x04, 0x71, 0xC4, 0xA3, 0x80, 0x15, 0x47, 0x00, 0x0A, \n    0x9D, 0x7E, 0x39, 0xB6, 0x7F, 0xD6, 0x1F, 0xCE, 0xBF, 0x7D, 0xCA, 0xBC, 0x28, 0xC3, 0xE0, 0xA2, \n    0x9A, 0x87, 0x3C, 0xFF, 0x00, 0x9A, 0x5A, 0xFD, 0xCB, 0x65, 0xF2, 0xD7, 0xCD, 0x9F, 0x9A, 0xE3, \n    0xB8, 0xDA, 0xAD, 0x79, 0x59, 0x3E, 0x58, 0xF6, 0x5F, 0xAB, 0xDD, 0xFE, 0x47, 0xBE, 0xE8, 0xFE, \n    0x1C, 0xF0, 0x56, 0x87, 0xA6, 0xAD, 0x95, 0x9F, 0x84, 0xFC, 0x27, 0x6B, 0x66, 0xAB, 0xB4, 0x41, \n    0x1E, 0x8B, 0x6A, 0x10, 0x0F, 0x4C, 0x79, 0x7F, 0xCE, 0xBF, 0x3F, 0xBF, 0xE0, 0xBA, 0x7F, 0xF0, \n    0x4F, 0xAF, 0x86, 0x3E, 0x26, 0xFD, 0x98, 0xB5, 0xAF, 0x8A, 0x1E, 0x19, 0xF0, 0xFE, 0x97, 0xE1, \n    0x5F, 0x17, 0xF8, 0x54, 0xC7, 0x2C, 0xF2, 0x69, 0xB0, 0x8B, 0x78, 0x35, 0x48, 0x18, 0x90, 0xCB, \n    0x24, 0x4B, 0xF2, 0xEF, 0x1D, 0x43, 0x28, 0x1D, 0x79, 0xAF, 0x45, 0xF8, 0x95, 0xFF, 0x00, 0x05, \n    0x1A, 0xF0, 0x67, 0xC2, 0xBB, 0x9F, 0xB2, 0xDF, 0xEB, 0x11, 0xDD, 0xEA, 0x4C, 0x70, 0xB6, 0x56, \n    0x6C, 0x25, 0x95, 0x8F, 0xA1, 0xEC, 0x3F, 0x1A, 0xF2, 0xEF, 0xDA, 0xD7, 0xE2, 0x96, 0xB1, 0xFB, \n    0x55, 0x7E, 0xC4, 0x3F, 0x12, 0xEF, 0x2F, 0x52, 0x3D, 0x2F, 0x41, 0xD3, 0x74, 0x49, 0x2F, 0x2D, \n    0x6C, 0x62, 0x72, 0xF3, 0x5D, 0x4C, 0x08, 0x08, 0xF3, 0x3F, 0x4C, 0x2E, 0x4E, 0x14, 0x77, 0x26, \n    0xBA, 0xF3, 0x8E, 0x0B, 0x4B, 0x2F, 0xAF, 0x52, 0xAC, 0x57, 0x2C, 0x63, 0x26, 0xFD, 0x6D, 0xA6, \n    0x9D, 0xEF, 0x6B, 0x76, 0xDC, 0xC3, 0x01, 0x9E, 0xC9, 0x62, 0x69, 0xA8, 0x5D, 0x39, 0x35, 0xF9, \n    0xEA, 0x7C, 0x1D, 0xFF, 0x00, 0x04, 0x40, 0xD1, 0xD6, 0xE7, 0xFE, 0x0A, 0x0B, 0xE0, 0xB9, 0xD8, \n    0x67, 0xC9, 0x13, 0xBA, 0x9F, 0x7F, 0x2C, 0xE2, 0xBF, 0x74, 0x86, 0xA1, 0x75, 0x1B, 0x36, 0xE8, \n    0xDB, 0xEF, 0x1E, 0x9F, 0x53, 0x5F, 0x8A, 0xBF, 0xF0, 0x43, 0xEF, 0x06, 0x6B, 0x1A, 0xCF, 0xED, \n    0xD9, 0xE0, 0x58, 0x74, 0x5D, 0x1F, 0x51, 0xD6, 0xAE, 0x9A, 0xE8, 0x89, 0x62, 0xB3, 0x84, 0xC8, \n    0xD1, 0x43, 0xE5, 0xB6, 0xF9, 0x5B, 0x1F, 0x75, 0x13, 0x82, 0xCC, 0x78, 0x02, 0xBF, 0x7D, 0xAF, \n    0xFE, 0x16, 0x5C, 0x59, 0xCE, 0xCB, 0x25, 0xB3, 0x0C, 0xB1, 0xDA, 0x40, 0xCA, 0xB7, 0x3D, 0x8F, \n    0x7A, 0xF9, 0x3E, 0x0A, 0xC5, 0x50, 0xC3, 0x65, 0x34, 0xA9, 0xC9, 0xAB, 0xBB, 0xBB, 0x75, 0xDD, \n    0xAF, 0xD0, 0xF5, 0xF8, 0x8A, 0x8D, 0x5A, 0xD8, 0xD9, 0x4D, 0x6C, 0xAC, 0xBF, 0x03, 0xCA, 0x2F, \n    0xF5, 0x1B, 0xB9, 0x4A, 0xED, 0x8D, 0xBE, 0xF0, 0xEB, 0xF5, 0x15, 0xF8, 0x99, 0xFF, 0x00, 0x05, \n    0xDE, 0xD1, 0x96, 0x0F, 0xF8, 0x28, 0x0F, 0x8A, 0x2E, 0x54, 0x7F, 0xAE, 0xB4, 0xB4, 0x66, 0xC7, \n    0xAF, 0x94, 0x33, 0x5F, 0xD1, 0xBF, 0x85, 0x7F, 0x64, 0x7B, 0xEF, 0x14, 0xF8, 0x5E, 0x6D, 0x55, \n    0xA4, 0x8E, 0xD6, 0x1B, 0x75, 0x32, 0x31, 0x90, 0xED, 0x55, 0x51, 0xC9, 0x24, 0xF6, 0x00, 0x0A, \n    0xFE, 0x73, 0xBF, 0xE0, 0xB0, 0xFE, 0x2C, 0xD3, 0x7E, 0x2E, 0x7E, 0xD7, 0x9E, 0x3C, 0xD5, 0xB4, \n    0x5B, 0x85, 0xBD, 0xD3, 0xED, 0xEF, 0x4D, 0x84, 0x37, 0x0B, 0xF7, 0x65, 0xF2, 0x62, 0x44, 0x2C, \n    0xBF, 0xEC, 0x96, 0x0D, 0x83, 0xDC, 0x73, 0x55, 0xC5, 0x99, 0x86, 0x17, 0x1F, 0x94, 0x62, 0x29, \n    0xD0, 0xB3, 0x74, 0xED, 0x7F, 0x26, 0xE4, 0xAD, 0xFA, 0xFE, 0x23, 0xC8, 0xF0, 0xB5, 0xB0, 0xD8, \n    0xDA, 0x72, 0x9F, 0xDA, 0xBF, 0xDD, 0x6F, 0xF3, 0xB1, 0xF7, 0x97, 0xFC, 0x11, 0xFB, 0xFE, 0x09, \n    0x89, 0xF0, 0xA7, 0xE1, 0x87, 0xEC, 0xFB, 0xE1, 0x7F, 0x88, 0x5E, 0x29, 0xD0, 0xF4, 0xDF, 0x1A, \n    0x78, 0xD3, 0xC5, 0x16, 0x8B, 0xA8, 0xAC, 0xBA, 0x94, 0x62, 0x7B, 0x4D, 0x2E, 0x37, 0xCE, 0xD8, \n    0xA2, 0x88, 0xFC, 0x8C, 0xD8, 0x1F, 0x33, 0xB8, 0x3D, 0xB0, 0x05, 0x7D, 0xCD, 0xAB, 0x78, 0x3B, \n    0xC0, 0x7A, 0xFE, 0x94, 0xD6, 0x37, 0xDE, 0x0D, 0xF0, 0x7D, 0xDD, 0x91, 0x5D, 0xA6, 0x09, 0x34, \n    0x4B, 0x5F, 0x2F, 0x1E, 0x98, 0x11, 0xF1, 0xF8, 0x57, 0xC9, 0xBA, 0x36, 0xA3, 0xAE, 0xFE, 0xCB, \n    0x1F, 0xB3, 0xE7, 0x81, 0x6E, 0xB4, 0x18, 0xED, 0x75, 0x6F, 0x0D, 0x5F, 0xE8, 0x16, 0x97, 0x6F, \n    0xA6, 0x4D, 0x29, 0x86, 0xE3, 0x4F, 0x91, 0xA3, 0xCC, 0x9E, 0x4B, 0xF4, 0x64, 0x6C, 0x67, 0x69, \n    0x23, 0x07, 0xEB, 0x51, 0x78, 0x03, 0xFE, 0x0A, 0x15, 0xE1, 0x5F, 0x88, 0x17, 0xDF, 0x61, 0x8F, \n    0x52, 0xFE, 0xCC, 0xD5, 0x73, 0xB5, 0xAC, 0xAF, 0x88, 0x8A, 0x4C, 0xFA, 0x29, 0xFB, 0xAD, 0xF8, \n    0x1A, 0xFA, 0xFC, 0xA7, 0x82, 0x28, 0xCB, 0x07, 0x4E, 0xA6, 0x16, 0x2B, 0x91, 0xA5, 0x6E, 0xFF, \n    0x00, 0x3F, 0x3E, 0xEF, 0xA9, 0xE1, 0xE3, 0x73, 0xEA, 0xBE, 0xDE, 0x71, 0xAA, 0xDF, 0x32, 0x7A, \n    0xFF, 0x00, 0x5D, 0x8C, 0x6F, 0xDA, 0xCF, 0xFE, 0x08, 0x4B, 0xF0, 0x33, 0xE3, 0xEC, 0x57, 0x57, \n    0xDE, 0x10, 0x8E, 0xEB, 0xE1, 0x9F, 0x88, 0x25, 0x0C, 0xC8, 0xFA, 0x76, 0x6E, 0x34, 0xE7, 0x72, \n    0x73, 0xF3, 0xDB, 0xB9, 0xDC, 0x07, 0xFB, 0x8E, 0x31, 0xE9, 0x5F, 0x94, 0x7F, 0xB6, 0x77, 0xFC, \n    0x13, 0x13, 0xE2, 0x97, 0xEC, 0x4B, 0x7B, 0x25, 0xC7, 0x88, 0x34, 0xB8, 0xF5, 0x7F, 0x0C, 0xEF, \n    0xDB, 0x0E, 0xBD, 0xA5, 0x16, 0x9A, 0xCD, 0x87, 0x6F, 0x33, 0x80, 0xD1, 0x37, 0xB3, 0x80, 0x33, \n    0xD0, 0x9A, 0xFD, 0xB6, 0x4F, 0x8E, 0x4C, 0x0F, 0xFA, 0xC3, 0xF9, 0xD4, 0x7A, 0xC7, 0xC5, 0x6B, \n    0x5F, 0x12, 0x69, 0x37, 0x16, 0x1A, 0x84, 0x16, 0xF7, 0xD6, 0x37, 0x48, 0x63, 0x9E, 0xDE, 0xE1, \n    0x04, 0x91, 0xCA, 0xA7, 0x82, 0x19, 0x4F, 0x04, 0x57, 0x9F, 0x9B, 0x78, 0x4D, 0x87, 0xC6, 0x45, \n    0xBE, 0x4E, 0x49, 0xFF, 0x00, 0x34, 0x74, 0xFB, 0xD6, 0xCF, 0xF3, 0xF3, 0x47, 0x56, 0x07, 0x8D, \n    0xAA, 0xE1, 0xDD, 0x9B, 0xE6, 0x8F, 0x67, 0xFA, 0x3D, 0xD7, 0xE5, 0xE4, 0x7F, 0x38, 0xB4, 0x57, \n    0xE8, 0xA7, 0xED, 0xF7, 0xFF, 0x00, 0x04, 0xA9, 0xD3, 0x6E, 0x56, 0xFB, 0xC5, 0xDF, 0x09, 0x6D, \n    0xFC, 0x9D, 0xBB, 0xA7, 0xBB, 0xF0, 0xFA, 0x9C, 0xF1, 0xD4, 0x98, 0x3E, 0x9F, 0xDD, 0xAF, 0xCE, \n    0xFB, 0x8B, 0x79, 0x2D, 0x2E, 0x1A, 0x29, 0x23, 0x68, 0xE4, 0x8D, 0x8A, 0xB2, 0xB0, 0xC3, 0x29, \n    0x1C, 0x10, 0x47, 0xAD, 0x7E, 0x01, 0xC5, 0x3C, 0x23, 0x8F, 0xC8, 0x71, 0x3E, 0xC3, 0x19, 0x1D, \n    0x25, 0xAC, 0x64, 0xB6, 0x92, 0xF2, 0xEC, 0xD7, 0x55, 0xBA, 0xF4, 0x69, 0xBF, 0xD3, 0x32, 0x7C, \n    0xEB, 0x0D, 0x99, 0x52, 0xF6, 0x98, 0x77, 0xAA, 0xDD, 0x75, 0x5F, 0xD7, 0x46, 0x47, 0x45, 0x14, \n    0x57, 0xCB, 0x9E, 0xB0, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, \n    0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, \n    0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x39, 0x17, \n    0x71, 0xA0, 0x0F, 0xB4, 0x3F, 0xE0, 0x99, 0x3F, 0xB3, 0x76, 0x9F, 0x69, 0xA3, 0x5C, 0x7C, 0x56, \n    0xF1, 0x2D, 0xB4, 0x33, 0x43, 0x6B, 0x73, 0xF6, 0x1D, 0x02, 0xDE, 0x65, 0xCA, 0xC9, 0x72, 0x3E, \n    0x67, 0x9F, 0x07, 0xAE, 0xC0, 0x30, 0x3D, 0xCF, 0xB5, 0x7D, 0x9C, 0xDF, 0x17, 0xB7, 0x1C, 0x99, \n    0xB2, 0x4F, 0x27, 0xE6, 0xEB, 0x5E, 0x11, 0xF1, 0xAB, 0x56, 0x1F, 0xB3, 0xF7, 0xC1, 0x4F, 0x83, \n    0x7E, 0x10, 0xB3, 0x85, 0x9A, 0x18, 0x7C, 0x30, 0x35, 0x29, 0x0A, 0xB6, 0xD0, 0xF2, 0xCE, 0xE0, \n    0xB1, 0x3E, 0xA7, 0xB5, 0x79, 0x8C, 0x9F, 0x1C, 0xEF, 0x71, 0xF2, 0xC2, 0x7F, 0x16, 0xAF, 0xED, \n    0xDE, 0x08, 0xC0, 0xE0, 0xB2, 0x6C, 0x9E, 0x96, 0x12, 0x2E, 0xD2, 0xB5, 0xE7, 0xA6, 0xAE, 0x4F, \n    0x76, 0xFF, 0x00, 0x25, 0xE4, 0x92, 0x3F, 0x9E, 0xF8, 0x82, 0xB6, 0x37, 0x30, 0xC7, 0x4E, 0xBA, \n    0x8D, 0xE3, 0x7B, 0x47, 0x5E, 0x8B, 0x45, 0xFD, 0x77, 0x3E, 0xC3, 0xB4, 0xF8, 0xA1, 0x36, 0xAD, \n    0x7D, 0x0D, 0xAD, 0xA9, 0x69, 0xAE, 0x2E, 0x1C, 0x47, 0x1C, 0x69, 0xCB, 0x3B, 0x1E, 0xD5, 0xF3, \n    0xBF, 0xED, 0xAB, 0xFB, 0x5D, 0xEA, 0x1A, 0x6E, 0xA9, 0x75, 0xE0, 0xDF, 0x0E, 0x6A, 0x0C, 0xAF, \n    0x6A, 0x7C, 0xAD, 0x52, 0xF6, 0x16, 0xFF, 0x00, 0x96, 0x9D, 0xE1, 0x43, 0xED, 0xDC, 0xFA, 0xF1, \n    0x5B, 0x3F, 0xB2, 0x1F, 0xC5, 0x2B, 0xCB, 0xCD, 0x43, 0xE2, 0x1E, 0xB4, 0xF1, 0xC6, 0xD7, 0x9E, \n    0x11, 0xF0, 0x65, 0xF6, 0xA9, 0x62, 0xB8, 0x24, 0x89, 0xCB, 0x24, 0x41, 0xC7, 0xFB, 0xA1, 0xC9, \n    0xAF, 0x90, 0x6F, 0xB7, 0x49, 0x99, 0x26, 0x91, 0xA4, 0x92, 0x4F, 0x9E, 0x47, 0x63, 0x96, 0x76, \n    0x3C, 0x92, 0x4F, 0xA9, 0x24, 0x9A, 0xF5, 0x73, 0x2C, 0xF3, 0x47, 0x4E, 0x83, 0xB2, 0xEA, 0xF6, \n    0xFE, 0xBD, 0x4D, 0xF2, 0x5C, 0x9E, 0xF2, 0xF6, 0x98, 0xB4, 0xB4, 0xD9, 0x6F, 0xF7, 0xFF, 0x00, \n    0x91, 0x73, 0xC0, 0xB2, 0xC9, 0x71, 0xE3, 0x6B, 0x59, 0x26, 0x76, 0x92, 0x46, 0x7C, 0x97, 0x63, \n    0x96, 0x27, 0xEB, 0x5F, 0xA1, 0xDA, 0xC7, 0x8A, 0x34, 0xFF, 0x00, 0x0C, 0xFF, 0x00, 0xC1, 0x3B, \n    0xFE, 0x20, 0x0B, 0xFB, 0x88, 0xED, 0xCE, 0xA5, 0xA3, 0xFD, 0x86, 0xD9, 0x58, 0xE1, 0xA7, 0x99, \n    0xC8, 0xDA, 0xAA, 0x3B, 0x9E, 0x0D, 0x7E, 0x78, 0x78, 0x30, 0x6C, 0xD6, 0xA3, 0xB8, 0x57, 0xDA, \n    0xD1, 0x9E, 0x38, 0xAF, 0x42, 0xF8, 0x95, 0xE3, 0x4B, 0xCD, 0x6B, 0xC2, 0x51, 0xC3, 0x7D, 0xA8, \n    0x5C, 0x5D, 0x45, 0x6E, 0xBF, 0xBA, 0x89, 0xDF, 0xF7, 0x71, 0xFB, 0x85, 0x1C, 0x67, 0xDF, 0xAD, \n    0x7E, 0x7F, 0x9D, 0x71, 0xA6, 0x0B, 0x0F, 0x94, 0xD7, 0xC1, 0x42, 0xF3, 0x9C, 0xEF, 0xAF, 0x45, \n    0x75, 0x6D, 0x5B, 0xDF, 0xE4, 0x9F, 0xA9, 0xF4, 0x92, 0xCA, 0x2A, 0x62, 0x71, 0xF4, 0xAB, 0xA6, \n    0x94, 0x61, 0xF7, 0xEF, 0xD0, 0xEA, 0x3F, 0xE0, 0x98, 0x5E, 0x39, 0xD6, 0xBE, 0x12, 0xFE, 0xD1, \n    0x5A, 0x0E, 0xB5, 0xE1, 0xFD, 0x4A, 0xEB, 0x49, 0xD4, 0xA1, 0x96, 0x58, 0x04, 0xD6, 0xEF, 0xB5, \n    0x9A, 0x37, 0x86, 0x45, 0x74, 0x3E, 0xAA, 0xC3, 0x82, 0x0F, 0x07, 0xF2, 0xAF, 0xD0, 0x0D, 0x0E, \n    0xFF, 0x00, 0xE3, 0x07, 0xED, 0xAF, 0xF1, 0xFF, 0x00, 0x52, 0xF1, 0x47, 0x86, 0x7E, 0x33, 0x78, \n    0x83, 0xE1, 0xA5, 0xE4, 0xEE, 0xB0, 0x49, 0x65, 0x61, 0x19, 0x36, 0x00, 0xA7, 0xCA, 0x0A, 0xC4, \n    0xA4, 0x01, 0xFF, 0x00, 0xD7, 0xAF, 0xCC, 0xFF, 0x00, 0xD8, 0x97, 0xC6, 0x76, 0xBE, 0x1B, 0xF8, \n    0xC3, 0xA7, 0xDC, 0xDD, 0x48, 0x23, 0xB7, 0xB7, 0x99, 0x9C, 0x9F, 0xF8, 0x0B, 0x00, 0x3F, 0x5A, \n    0xFD, 0x4A, 0xFF, 0x00, 0x82, 0x62, 0x5C, 0x7D, 0xA7, 0xC5, 0xF7, 0x33, 0x1F, 0x95, 0x6E, 0xAE, \n    0x5A, 0x44, 0x07, 0xD0, 0x9E, 0x2B, 0xCF, 0xF0, 0xFE, 0x38, 0x0A, 0xD9, 0x15, 0x4A, 0x9E, 0xEB, \n    0xAD, 0x4D, 0x49, 0x74, 0xE6, 0x49, 0xB4, 0xF6, 0xEA, 0xBE, 0xF4, 0x79, 0x19, 0xF2, 0xC6, 0x52, \n    0xE2, 0x0E, 0x69, 0x5F, 0xD9, 0x4A, 0x30, 0xB7, 0xF2, 0xDE, 0xF3, 0x4E, 0xDD, 0x2F, 0x66, 0xAF, \n    0xD6, 0xD6, 0x1D, 0xF1, 0xBB, 0xE2, 0x2F, 0xC7, 0xFF, 0x00, 0xD9, 0x73, 0xC1, 0x3E, 0x20, 0xD0, \n    0xFC, 0x41, 0xF1, 0xEB, 0xC4, 0x9E, 0x32, 0xB5, 0xD5, 0x20, 0x68, 0xA7, 0x41, 0x6C, 0xB0, 0x82, \n    0xA4, 0x60, 0x80, 0xCD, 0xB9, 0x97, 0x3F, 0xEC, 0x91, 0x5F, 0x92, 0xFF, 0x00, 0x13, 0xAC, 0xD7, \n    0x50, 0xB4, 0xD4, 0x4E, 0xDF, 0x9A, 0x4B, 0xE9, 0x47, 0x27, 0x24, 0x92, 0x89, 0xD4, 0xD7, 0xEB, \n    0xB7, 0xFC, 0x15, 0x0A, 0x5D, 0xF7, 0x17, 0xB1, 0xAF, 0xCC, 0xC5, 0x4E, 0x00, 0xE4, 0x9A, 0xFC, \n    0x89, 0xF8, 0xA6, 0xB2, 0x68, 0x9A, 0x93, 0x41, 0x31, 0x0A, 0xD2, 0xDC, 0xB4, 0xCC, 0xA0, 0xFD, \n    0xDC, 0xE0, 0x63, 0xF4, 0xFD, 0x6B, 0xA3, 0x8D, 0xE5, 0x80, 0xC3, 0x70, 0xC4, 0x54, 0x79, 0x63, \n    0x56, 0xAB, 0x8B, 0x69, 0x59, 0x37, 0xE7, 0x65, 0xD1, 0x77, 0xDB, 0x63, 0xB3, 0x87, 0x23, 0x56, \n    0xA6, 0x6D, 0x52, 0x6E, 0xEE, 0x31, 0x56, 0x5B, 0xD9, 0x6B, 0xB2, 0xFF, 0x00, 0x80, 0x7E, 0xAF, \n    0x78, 0xBF, 0xE2, 0x36, 0x97, 0xF1, 0x57, 0xF6, 0x23, 0xF8, 0x7F, 0xAA, 0x68, 0xF3, 0xA4, 0xF6, \n    0xE9, 0xA0, 0xC3, 0x69, 0x28, 0x53, 0x96, 0x82, 0x68, 0xD4, 0xAB, 0xA3, 0x0E, 0xC4, 0x71, 0xD7, \n    0xD6, 0xBF, 0x29, 0x7F, 0x68, 0x89, 0xA4, 0xB4, 0xF1, 0xB9, 0x92, 0x27, 0x78, 0xE4, 0x59, 0x18, \n    0xAB, 0x29, 0xC1, 0x15, 0xEA, 0x3F, 0x0A, 0xFC, 0x7B, 0xA9, 0x78, 0x77, 0xC1, 0x8D, 0x06, 0x97, \n    0xAB, 0x5E, 0x59, 0xC3, 0x70, 0x37, 0x49, 0x02, 0x49, 0x98, 0x9C, 0xFA, 0x94, 0x39, 0x19, 0xF7, \n    0xEB, 0x5E, 0x51, 0xF1, 0x85, 0x2E, 0x35, 0xCD, 0x50, 0xDC, 0x3C, 0x91, 0xBC, 0x8A, 0x49, 0x3C, \n    0x6D, 0x2D, 0x5D, 0xDC, 0x3F, 0xC7, 0x18, 0x0A, 0x99, 0x34, 0x70, 0x35, 0x1B, 0x85, 0x45, 0x6D, \n    0xF6, 0x7A, 0xDF, 0x46, 0xB6, 0xF9, 0xD8, 0xDB, 0xFB, 0x1E, 0xB5, 0x1C, 0xCD, 0xE2, 0x74, 0x70, \n    0x77, 0xF5, 0x3D, 0x8B, 0xF6, 0x48, 0xFD, 0xB3, 0x35, 0xAB, 0x2B, 0xA8, 0xBC, 0x31, 0xAF, 0x5D, \n    0x4D, 0xA8, 0x24, 0xA3, 0x6E, 0x9D, 0x2C, 0x8F, 0xFB, 0xC0, 0xE0, 0x71, 0x11, 0x63, 0xEB, 0xDB, \n    0x3D, 0xEB, 0xD5, 0x6F, 0x7F, 0x6E, 0x05, 0xD3, 0xEE, 0x64, 0x85, 0xB4, 0xBB, 0xC5, 0x9A, 0x16, \n    0x28, 0xEB, 0x24, 0x81, 0x4A, 0xB0, 0xEA, 0x0F, 0x15, 0xF0, 0x95, 0xB4, 0x92, 0x59, 0xB8, 0x96, \n    0x36, 0x68, 0xA6, 0x84, 0xF9, 0x88, 0xE0, 0xE1, 0x91, 0x87, 0x20, 0x8F, 0xA1, 0x02, 0xBD, 0xD7, \n    0xF6, 0x96, 0xD5, 0xE1, 0x8B, 0x5F, 0xF0, 0xDE, 0xAD, 0x1C, 0x7E, 0x5D, 0xC7, 0x89, 0x3C, 0x3F, \n    0x6B, 0xA8, 0xDD, 0xA2, 0xF1, 0x89, 0x8E, 0xE4, 0x66, 0xFF, 0x00, 0x81, 0x6D, 0x06, 0xBE, 0xFB, \n    0x2C, 0xCE, 0x9B, 0xA2, 0xD5, 0x67, 0x7B, 0x5A, 0xCF, 0xBA, 0x67, 0x97, 0x9A, 0x64, 0x94, 0x9E, \n    0x21, 0x4E, 0x92, 0xB7, 0x35, 0xF4, 0x5D, 0xD7, 0xF9, 0xAF, 0xEB, 0x53, 0xDA, 0xE7, 0xFD, 0xBB, \n    0xEF, 0x23, 0x60, 0xD0, 0x69, 0x71, 0xAB, 0x29, 0xC8, 0x2D, 0x31, 0xE2, 0xBE, 0x7F, 0xFD, 0xBF, \n    0x7E, 0x0A, 0x69, 0xFF, 0x00, 0x13, 0x3E, 0x17, 0x58, 0xFC, 0x73, 0xF0, 0xCD, 0x8D, 0xBD, 0x82, \n    0xDE, 0x6A, 0x0D, 0xA3, 0xF8, 0xAE, 0xC2, 0xDD, 0x70, 0x96, 0xD7, 0xD8, 0xDF, 0x1D, 0xC0, 0x03, \n    0xB4, 0xC8, 0x72, 0x4F, 0xF7, 0x83, 0x57, 0x16, 0xDE, 0x2A, 0x6C, 0x74, 0x6F, 0xCE, 0xBE, 0x8A, \n    0xFD, 0x90, 0x61, 0x4F, 0x8C, 0x1F, 0xB2, 0x8F, 0xED, 0x1D, 0xE0, 0xDB, 0xAE, 0x6D, 0xE5, 0xF0, \n    0xCC, 0x1A, 0xCC, 0x1B, 0xB9, 0x11, 0xDC, 0xDB, 0xCA, 0x76, 0xB0, 0xF7, 0xDA, 0x48, 0xCD, 0x7C, \n    0xCF, 0x1F, 0x61, 0xF0, 0xD9, 0xCE, 0x4D, 0x53, 0x0A, 0xD7, 0xBC, 0xBD, 0xE8, 0xBE, 0xD2, 0x5B, \n    0x7F, 0xC1, 0xF2, 0xB9, 0xD5, 0x90, 0xE1, 0xEA, 0x65, 0xD8, 0xB8, 0xE2, 0x23, 0xB6, 0xCF, 0xCD, \n    0x3F, 0xEB, 0xEF, 0x3F, 0x39, 0xE8, 0xA0, 0x8C, 0x51, 0x5F, 0xC5, 0xFB, 0x1F, 0xB4, 0x05, 0x14, \n    0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, \n    0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, \n    0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x68, 0x68, 0x16, 0x5F, 0x6C, 0xB9, 0x55, 0xF7, 0x1F, \n    0xCE, 0xB3, 0xEB, 0xA4, 0xF0, 0x05, 0xAF, 0xDA, 0x2E, 0xEB, 0x7C, 0x32, 0xBD, 0x44, 0x99, 0x9D, \n    0x5F, 0x85, 0x9F, 0xB5, 0x5F, 0x1D, 0x7F, 0xE0, 0x94, 0xDE, 0x3C, 0xFD, 0xA2, 0x3F, 0x64, 0xBF, \n    0x05, 0xFC, 0x46, 0xD1, 0x56, 0xDE, 0x48, 0x7C, 0x1B, 0xA0, 0x0B, 0x4D, 0x42, 0x16, 0x38, 0x90, \n    0xC4, 0x22, 0x8A, 0x54, 0x70, 0x3B, 0x80, 0x09, 0xCD, 0x7E, 0x71, 0xEA, 0x5A, 0x4B, 0xE9, 0x97, \n    0xB3, 0x5B, 0x4A, 0x31, 0x2D, 0xBB, 0x94, 0x61, 0xEE, 0x2B, 0xF6, 0x5B, 0xE3, 0x8F, 0xED, 0x31, \n    0xE2, 0x9F, 0x84, 0x5F, 0xB3, 0x26, 0x83, 0xE1, 0xDD, 0x23, 0x54, 0x6B, 0x5F, 0x0C, 0xF8, 0xCF, \n    0xC2, 0x96, 0x56, 0x77, 0xE6, 0x31, 0xF3, 0x5B, 0xC8, 0xD6, 0xCA, 0xAB, 0x32, 0x9F, 0x7E, 0x87, \n    0xD7, 0x02, 0xBF, 0x28, 0x7E, 0x28, 0xFC, 0x09, 0xF1, 0x47, 0xC3, 0xAD, 0x69, 0xBF, 0xB7, 0x2C, \n    0xEE, 0x23, 0x4B, 0xB2, 0x66, 0x86, 0xE9, 0x90, 0x88, 0xEE, 0xD0, 0x9E, 0x1D, 0x0F, 0x70, 0x6B, \n    0xFB, 0x07, 0x27, 0x78, 0xDA, 0x94, 0x15, 0x6C, 0x57, 0x2D, 0xA5, 0x6E, 0x4B, 0x6F, 0x6B, 0x2D, \n    0xFC, 0xEF, 0x7D, 0xBA, 0x1F, 0x81, 0x62, 0xAB, 0x51, 0xA3, 0x8B, 0x74, 0xA1, 0x37, 0x64, 0xB5, \n    0x4E, 0xDF, 0x15, 0xDF, 0xC3, 0xD6, 0xCD, 0x5B, 0x7B, 0xEB, 0x7B, 0x16, 0xBF, 0x64, 0x9F, 0x1F, \n    0x5B, 0x7C, 0x2C, 0xF8, 0xBB, 0x1D, 0xE6, 0xAB, 0x19, 0x9B, 0xC3, 0xDA, 0xD5, 0x9C, 0xFA, 0x26, \n    0xAF, 0x1E, 0x39, 0x6B, 0x4B, 0x85, 0x0A, 0xCD, 0xFF, 0x00, 0x01, 0x60, 0xAD, 0xFF, 0x00, 0x01, \n    0xAF, 0x17, 0xFD, 0xA4, 0xBE, 0x15, 0xEA, 0x5F, 0x02, 0x3E, 0x25, 0xDD, 0x68, 0x77, 0xFF, 0x00, \n    0xBC, 0xB2, 0x53, 0xE6, 0xE9, 0x97, 0xA9, 0xCC, 0x3A, 0x8D, 0xA9, 0xFF, 0x00, 0x57, 0x2A, 0x37, \n    0x43, 0x95, 0xC6, 0x47, 0x62, 0x08, 0xAF, 0x56, 0xF0, 0xFE, 0x8E, 0x25, 0x0A, 0x36, 0xE0, 0x7A, \n    0x62, 0xBD, 0x32, 0x3F, 0x0C, 0xE9, 0xFF, 0x00, 0x16, 0x7C, 0x02, 0xBE, 0x16, 0xF1, 0x55, 0xA3, \n    0x6A, 0x1A, 0x4C, 0x24, 0x9B, 0x39, 0xC7, 0xFC, 0x7C, 0x69, 0xCC, 0x7B, 0xC6, 0xDD, 0x76, 0xFB, \n    0x0A, 0xF5, 0xB3, 0xBE, 0x15, 0xAD, 0x8E, 0xC0, 0xB8, 0xE1, 0xE7, 0xCB, 0x53, 0x7D, 0x76, 0x7E, \n    0x4F, 0xAF, 0xF5, 0xB3, 0x1E, 0x07, 0x88, 0xA1, 0x87, 0xC4, 0xA8, 0xD5, 0x57, 0x8B, 0xED, 0xBA, \n    0xF3, 0x47, 0xC4, 0x96, 0x5E, 0x37, 0x8F, 0x4A, 0x6F, 0x95, 0xAA, 0x87, 0x8B, 0x3E, 0x2A, 0xCB, \n    0xA9, 0x5B, 0x18, 0x95, 0xBE, 0x5E, 0x9D, 0x6B, 0xDE, 0x7E, 0x2B, 0x7F, 0xC1, 0x27, 0xFC, 0x75, \n    0x69, 0x04, 0xDA, 0x97, 0x81, 0x6E, 0xAD, 0xFC, 0x61, 0xA5, 0x80, 0x5C, 0x42, 0x8E, 0x12, 0xF2, \n    0x31, 0xE8, 0x57, 0xA3, 0x1F, 0xA5, 0x7C, 0xD1, 0xE3, 0xBF, 0x84, 0x1E, 0x2C, 0xF8, 0x6D, 0xA8, \n    0x49, 0x6B, 0xE2, 0x0F, 0x0F, 0x6B, 0x1A, 0x44, 0xF1, 0x9C, 0x32, 0xDD, 0x5A, 0x3C, 0x78, 0xFC, \n    0x71, 0x8A, 0xFE, 0x59, 0xE2, 0x6C, 0xBF, 0x3A, 0xC0, 0xD4, 0x74, 0xF1, 0xD4, 0x65, 0x05, 0xDF, \n    0x78, 0xBF, 0x49, 0x2D, 0x3F, 0x1B, 0x9F, 0xAF, 0x65, 0x15, 0xF0, 0x18, 0x88, 0x29, 0x61, 0xA6, \n    0xA5, 0xF9, 0xFD, 0xCF, 0x53, 0xA5, 0xF8, 0x41, 0xE3, 0xE5, 0xD0, 0xF5, 0xC8, 0xE4, 0x76, 0xC7, \n    0xCD, 0x9E, 0xB5, 0xF7, 0x67, 0xC0, 0x4F, 0xDA, 0x56, 0xC6, 0xCA, 0xC2, 0x1F, 0xF4, 0xC6, 0x86, \n    0x45, 0x51, 0xCA, 0x48, 0x54, 0x8F, 0xCA, 0xBF, 0x33, 0x2D, 0xEE, 0x1A, 0xD9, 0xF2, 0xA6, 0xBA, \n    0x0D, 0x23, 0xE2, 0x56, 0xA1, 0xA4, 0x2F, 0xEE, 0xE6, 0x91, 0x7E, 0x86, 0xBE, 0x67, 0x0B, 0x99, \n    0x4E, 0x8A, 0xB2, 0x3D, 0x2C, 0x46, 0x06, 0x35, 0x75, 0x67, 0xE9, 0x77, 0xC6, 0x5F, 0xDA, 0x6F, \n    0x4D, 0xB9, 0xD2, 0x25, 0x66, 0xBC, 0x69, 0xE4, 0x65, 0x3F, 0x33, 0xCB, 0xB8, 0xFE, 0xA6, 0xBE, \n    0x0F, 0xF8, 0xE3, 0xF1, 0x35, 0x35, 0xED, 0x7E, 0x49, 0x22, 0x6C, 0xFC, 0xD9, 0xC8, 0x35, 0xC2, \n    0xEA, 0xBF, 0x14, 0xB5, 0x2D, 0x56, 0x3D, 0xB2, 0x4D, 0x23, 0x0F, 0x73, 0x5C, 0xED, 0xD5, 0xEC, \n    0x97, 0x6F, 0xB9, 0xDB, 0x39, 0xA7, 0x89, 0xCC, 0xA7, 0x55, 0x59, 0x86, 0x1F, 0x2F, 0x8D, 0x27, \n    0x74, 0x7A, 0xB7, 0x83, 0x3E, 0x38, 0x4D, 0xA5, 0x59, 0x08, 0x59, 0xCE, 0xDE, 0x9D, 0x6A, 0xEE, \n    0xA9, 0xF1, 0x26, 0x3D, 0x68, 0x67, 0x76, 0x49, 0xAF, 0x3A, 0xF0, 0x47, 0xC2, 0x8F, 0x14, 0xFC, \n    0x42, 0xBE, 0x5B, 0x6D, 0x07, 0x41, 0xD5, 0xF5, 0x49, 0xA4, 0x38, 0x55, 0xB6, 0xB6, 0x77, 0xCF, \n    0xE3, 0x8C, 0x57, 0xBE, 0xF8, 0x13, 0xFE, 0x09, 0xBD, 0xE3, 0x08, 0x2D, 0xE3, 0xBE, 0xF1, 0xA5, \n    0xD4, 0x3E, 0x17, 0xB1, 0x38, 0x6F, 0xB3, 0x96, 0x12, 0x5E, 0x4A, 0x3D, 0x02, 0xFF, 0x00, 0x09, \n    0xAF, 0xA8, 0xE1, 0x7C, 0xA7, 0x3D, 0xCC, 0x6A, 0x2A, 0x78, 0x0A, 0x12, 0x92, 0xEF, 0x6B, 0x45, \n    0x7A, 0xC9, 0xD9, 0x7E, 0x37, 0x3C, 0xCC, 0xDB, 0x11, 0x97, 0xE1, 0xA0, 0xE5, 0x89, 0x9A, 0x8F, \n    0x97, 0x5F, 0xB9, 0x6A, 0x71, 0xBF, 0x0F, 0xBC, 0x3B, 0x2F, 0xC4, 0x3F, 0x13, 0xC3, 0x63, 0x1B, \n    0x79, 0x76, 0xEC, 0x77, 0x5D, 0xCE, 0x7E, 0xED, 0xBC, 0x23, 0xEF, 0x31, 0x3F, 0x4C, 0x81, 0xEA, \n    0x4D, 0x75, 0xFF, 0x00, 0x1A, 0x3C, 0x69, 0xFF, 0x00, 0x09, 0xBF, 0x8F, 0x25, 0xB9, 0x89, 0x5A, \n    0x2B, 0x0B, 0x58, 0x63, 0xB1, 0xB1, 0x43, 0xFC, 0x10, 0x44, 0x30, 0xBF, 0x99, 0xC9, 0xFC, 0x6B, \n    0xB8, 0xD4, 0x3C, 0x13, 0xA7, 0xF8, 0x37, 0x44, 0xFE, 0xCA, 0xD1, 0x6D, 0x5A, 0xD2, 0xC5, 0x7F, \n    0xD6, 0x33, 0x1C, 0xCD, 0x74, 0x7D, 0x5D, 0xBF, 0xA5, 0x79, 0xEF, 0x89, 0xB4, 0x66, 0x72, 0x55, \n    0x15, 0x99, 0xF3, 0xC0, 0x03, 0xAD, 0x7F, 0x51, 0xE5, 0xBC, 0x31, 0x88, 0xCB, 0x32, 0xD5, 0x4A, \n    0xB4, 0xF9, 0xA7, 0xBC, 0xAD, 0xB2, 0xF2, 0x8D, 0xF5, 0xB2, 0xEF, 0xA5, 0xDF, 0x44, 0x7E, 0x75, \n    0x4F, 0x36, 0xA7, 0x8A, 0xC4, 0x73, 0xC3, 0x48, 0xAD, 0x17, 0x7F, 0x36, 0xFC, 0xDD, 0x97, 0xA2, \n    0xF5, 0x39, 0xF6, 0x7A, 0xFA, 0xD3, 0xFE, 0x09, 0xF7, 0xA1, 0x4F, 0xA7, 0x7C, 0x0F, 0xF8, 0x9D, \n    0x78, 0xAA, 0xDE, 0x77, 0x8A, 0xEC, 0x9F, 0x47, 0xB5, 0x5C, 0x72, 0xEB, 0x1C, 0x32, 0x4B, 0x21, \n    0xFA, 0x0F, 0xE9, 0x5F, 0x29, 0x69, 0xBE, 0x1D, 0xBA, 0xD4, 0x35, 0x34, 0xB7, 0x91, 0x1A, 0xD9, \n    0x73, 0x99, 0x24, 0x90, 0x61, 0x63, 0x5E, 0xE4, 0xD7, 0xDD, 0x1F, 0xB0, 0xDC, 0xF6, 0x7A, 0x8E, \n    0x95, 0xAB, 0x2D, 0xBE, 0xD8, 0xF4, 0xAD, 0x07, 0x41, 0xBE, 0x86, 0xD5, 0x4F, 0xF1, 0x48, 0xD6, \n    0xD2, 0x6F, 0x94, 0xFB, 0x9F, 0xEB, 0x5B, 0x61, 0xF0, 0x8E, 0x74, 0x2A, 0xD7, 0x92, 0xD2, 0x31, \n    0x95, 0xBC, 0xDD, 0xBF, 0x42, 0x73, 0x6C, 0x52, 0x87, 0x25, 0x18, 0x7D, 0xA6, 0xAF, 0xE9, 0x7F, \n    0xD4, 0xFC, 0xA4, 0xD4, 0xA0, 0xFB, 0x3D, 0xDB, 0xA8, 0xE8, 0xAC, 0x40, 0xFC, 0xEA, 0xBD, 0x6B, \n    0x78, 0xA6, 0xD3, 0xEC, 0xD7, 0x6D, 0x8E, 0xEC, 0x7F, 0x9D, 0x64, 0xD7, 0xF1, 0x16, 0x25, 0x25, \n    0x55, 0xA4, 0x7E, 0xCD, 0x4E, 0x57, 0x8A, 0x61, 0x45, 0x14, 0x56, 0x06, 0x81, 0x45, 0x14, 0x50, \n    0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, \n    0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, \n    0x01, 0x5D, 0x47, 0xC3, 0x6B, 0xA5, 0x87, 0x53, 0x55, 0x6E, 0x8D, 0xC1, 0xAE, 0x5E, 0xAE, 0xE8, \n    0xB7, 0xFF, 0x00, 0x61, 0xBB, 0x56, 0xF4, 0x39, 0xAD, 0xA8, 0x4B, 0x96, 0x69, 0xB2, 0x2A, 0x2B, \n    0xC6, 0xC7, 0xEC, 0x3F, 0x87, 0x7F, 0x68, 0xE8, 0x7E, 0x36, 0xFE, 0xC3, 0x3E, 0x15, 0x76, 0x99, \n    0x64, 0xD5, 0x3C, 0x2F, 0x6E, 0x34, 0x5B, 0xE5, 0x27, 0x2C, 0x0C, 0x67, 0x31, 0xB7, 0xD1, 0x90, \n    0xF1, 0xFE, 0xE1, 0xAF, 0x54, 0xFF, 0x00, 0x82, 0x89, 0xFE, 0xD8, 0x1A, 0x3F, 0x8F, 0x3F, 0x60, \n    0x9F, 0x02, 0xF8, 0x7F, 0x5A, 0xF0, 0xDE, 0x96, 0x75, 0xED, 0x08, 0xC7, 0x15, 0xA6, 0xA3, 0x6B, \n    0x12, 0xC2, 0x4D, 0xB0, 0x4C, 0x15, 0x20, 0x74, 0x72, 0xDC, 0x93, 0xD0, 0xFA, 0x0A, 0xFC, 0x9C, \n    0xF8, 0x2F, 0xFB, 0x44, 0xDC, 0x78, 0x06, 0x2B, 0x98, 0x16, 0x46, 0x7D, 0x3F, 0x52, 0x8C, 0x45, \n    0x79, 0x08, 0x3F, 0x7B, 0x07, 0x2A, 0xE3, 0xFD, 0xA5, 0x3F, 0xA1, 0x22, 0xBD, 0xF3, 0xF6, 0xBD, \n    0xF8, 0xD3, 0x6B, 0xE3, 0x5F, 0x83, 0xDE, 0x15, 0x4B, 0x0B, 0xC8, 0xEE, 0x61, 0x31, 0x8C, 0x94, \n    0x6C, 0xF3, 0x8E, 0xF5, 0xFD, 0x5B, 0xC3, 0xB9, 0x8E, 0x13, 0x32, 0xCB, 0x30, 0xB3, 0xFF, 0x00, \n    0x97, 0xB4, 0x1B, 0xD3, 0xAD, 0xED, 0x64, 0xFC, 0xD3, 0x5B, 0xF9, 0x9F, 0xCD, 0x9C, 0x59, 0x92, \n    0xE6, 0x30, 0xE2, 0x1A, 0x11, 0xA0, 0xDA, 0xA3, 0x59, 0xB5, 0x3B, 0x2D, 0x1C, 0x74, 0x95, 0x9F, \n    0x66, 0x9A, 0xBA, 0x6A, 0xCF, 0xB3, 0xDC, 0x8B, 0xE1, 0xDC, 0x96, 0x9E, 0x28, 0x88, 0x49, 0xA7, \n    0xCE, 0xB7, 0x2A, 0xBF, 0x7E, 0x3E, 0x93, 0x45, 0xFE, 0xF2, 0xF5, 0xFC, 0x46, 0x45, 0x7B, 0x67, \n    0xC3, 0xDF, 0x0F, 0x2C, 0xA1, 0x30, 0xA3, 0xD2, 0xBE, 0x09, 0xD1, 0xBC, 0x41, 0x79, 0xA6, 0xEA, \n    0x11, 0xCD, 0x65, 0x71, 0x35, 0xBD, 0xC2, 0x30, 0x28, 0xF1, 0xB9, 0x56, 0x53, 0xF5, 0xAF, 0xA4, \n    0x3E, 0x08, 0x7E, 0xD8, 0xDA, 0xCF, 0x86, 0xDE, 0x18, 0xBC, 0x47, 0xA4, 0xC7, 0xAF, 0x5B, 0x2F, \n    0x5B, 0x8B, 0x66, 0x10, 0xDD, 0xA8, 0xF5, 0x3F, 0xC2, 0xFF, 0x00, 0x8E, 0x2B, 0xF4, 0xFC, 0xBB, \n    0x35, 0xF6, 0xEB, 0x92, 0x51, 0xD5, 0x75, 0x5B, 0x1D, 0xD8, 0xEE, 0x1B, 0x74, 0x67, 0xED, 0x29, \n    0xCA, 0xFE, 0x4F, 0x47, 0xFD, 0x7D, 0xC7, 0xDB, 0x3F, 0x0E, 0x3C, 0x2C, 0xD0, 0x4F, 0x1C, 0x90, \n    0x99, 0x21, 0x93, 0x8C, 0x3A, 0x31, 0x56, 0xFC, 0xC7, 0x35, 0xF4, 0x17, 0x82, 0x3C, 0x39, 0x3F, \n    0x8A, 0x2C, 0x56, 0xD7, 0x56, 0xB3, 0xD3, 0x75, 0xCB, 0x36, 0xFB, 0xD0, 0xEA, 0x76, 0x31, 0x5D, \n    0x2B, 0x7F, 0xDF, 0x4B, 0x9F, 0xD6, 0xBE, 0x75, 0xF8, 0x03, 0xFB, 0x51, 0xFC, 0x35, 0xF1, 0xB4, \n    0x96, 0xF1, 0x8F, 0x12, 0x43, 0xA2, 0xDC, 0xB6, 0x33, 0x6D, 0xAC, 0xC6, 0x6D, 0x18, 0x1F, 0x4D, \n    0xE7, 0xF7, 0x67, 0xFE, 0xFA, 0xAF, 0xB9, 0x3E, 0x0D, 0xF8, 0x7A, 0xD7, 0x5E, 0xD3, 0xE1, 0x9B, \n    0x4D, 0x9A, 0xD7, 0x52, 0x85, 0x80, 0x22, 0x4B, 0x49, 0x56, 0xE1, 0x08, 0xFA, 0xA1, 0x22, 0xBC, \n    0x5E, 0x28, 0xC7, 0xD3, 0xA7, 0x4B, 0x96, 0xA4, 0x6F, 0x7E, 0xEB, 0xFC, 0xC3, 0x2B, 0xC1, 0xD4, \n    0x75, 0x34, 0xBA, 0xF4, 0x3C, 0xDB, 0x51, 0xFF, 0x00, 0x82, 0x6C, 0x7C, 0x09, 0xF8, 0xA3, 0x27, \n    0x99, 0xAF, 0xFC, 0x17, 0xF0, 0x2D, 0xD4, 0xB2, 0x72, 0xCD, 0x67, 0x04, 0x96, 0x04, 0x9F, 0xFB, \n    0x62, 0xCA, 0x2B, 0x22, 0xF3, 0xFE, 0x08, 0x3D, 0xFB, 0x2A, 0xEB, 0x2C, 0xD2, 0x7F, 0xC2, 0x9F, \n    0x92, 0xD4, 0xB0, 0xE9, 0x6D, 0xE2, 0x3B, 0xD4, 0x51, 0xF4, 0x05, 0xCD, 0x7D, 0xAF, 0xE0, 0xCF, \n    0x01, 0xE4, 0x2E, 0xE8, 0x59, 0x78, 0xFE, 0x25, 0xC5, 0x7A, 0x46, 0x87, 0xF0, 0xC4, 0x5D, 0xA2, \n    0xAA, 0xC6, 0x0B, 0x1A, 0xFE, 0x7C, 0xCD, 0xAA, 0xE5, 0x9C, 0xEE, 0x53, 0xA3, 0x1F, 0xB8, 0xFD, \n    0x2B, 0x03, 0x1C, 0x5F, 0x2A, 0x51, 0x9B, 0xFB, 0xCF, 0xCD, 0x83, 0xFF, 0x00, 0x04, 0x2E, 0xFD, \n    0x96, 0x7C, 0x38, 0x77, 0xC7, 0xF0, 0x7D, 0xAE, 0x0A, 0xF3, 0x8B, 0x9F, 0x10, 0xDE, 0x48, 0xA7, \n    0xFF, 0x00, 0x1E, 0x15, 0x04, 0xDF, 0xF0, 0x4F, 0x0F, 0x82, 0x7F, 0x0C, 0x58, 0xC9, 0xE1, 0xDF, \n    0x83, 0x5E, 0x05, 0xB3, 0x92, 0x3E, 0x51, 0xAE, 0xA0, 0x96, 0xF8, 0xAF, 0xFD, 0xFD, 0x73, 0x5F, \n    0xA4, 0x1E, 0x32, 0xF8, 0x57, 0xFD, 0x9F, 0x09, 0xDF, 0x18, 0x5E, 0x3B, 0xD7, 0x8B, 0x7C, 0x42, \n    0xF0, 0x11, 0x26, 0x4F, 0x2E, 0x16, 0x93, 0x39, 0xE1, 0x57, 0x71, 0xFD, 0x2B, 0xD0, 0xE1, 0xDA, \n    0x99, 0x57, 0x3A, 0x9C, 0x28, 0xC7, 0xEE, 0x39, 0xB3, 0x48, 0xE3, 0x79, 0x5C, 0x65, 0x51, 0x9F, \n    0x0C, 0xF8, 0xEB, 0x47, 0xB9, 0xD0, 0x6C, 0xDE, 0xD3, 0x4E, 0x86, 0xC7, 0x45, 0xB5, 0x5F, 0xBB, \n    0x0E, 0x9B, 0x65, 0x1D, 0xA2, 0x8F, 0xFB, 0xE1, 0x73, 0xFA, 0xD7, 0xCE, 0xDF, 0x13, 0x3C, 0x26, \n    0xCD, 0x34, 0x92, 0x36, 0xE7, 0x91, 0xB3, 0x97, 0x62, 0x59, 0x8F, 0xD4, 0x9E, 0x6B, 0xEE, 0x4F, \n    0x8D, 0xFE, 0x0A, 0x4D, 0x16, 0xCE, 0x5B, 0x8B, 0xE6, 0xB7, 0xD3, 0xA1, 0x50, 0x4B, 0x49, 0x79, \n    0x32, 0x5B, 0xA0, 0xFC, 0x5C, 0x81, 0x5F, 0x10, 0xFC, 0x7C, 0xFD, 0xA2, 0x7E, 0x1D, 0x78, 0x25, \n    0xE6, 0x8E, 0x6F, 0x11, 0xDB, 0xEA, 0xF7, 0x4A, 0x4F, 0xFA, 0x36, 0x90, 0x86, 0xED, 0x89, 0xF4, \n    0xDE, 0x3F, 0x76, 0x3F, 0xEF, 0xAA, 0xFE, 0x90, 0xC8, 0x31, 0xF4, 0x2A, 0x61, 0xD7, 0x22, 0x4A, \n    0xDD, 0x97, 0xF9, 0x1F, 0x98, 0xE3, 0x30, 0x75, 0xDD, 0x5E, 0x5D, 0x5B, 0x3E, 0x7D, 0xF8, 0x87, \n    0xE1, 0x96, 0xB7, 0x77, 0x6F, 0x2C, 0xED, 0xF5, 0xC5, 0x73, 0x5F, 0x09, 0x35, 0x9F, 0x0B, 0xFC, \n    0x3E, 0xF8, 0xCF, 0xA2, 0xDF, 0x78, 0xD2, 0x35, 0x6D, 0x1E, 0x3B, 0x85, 0x69, 0xAD, 0xCF, 0xFA, \n    0xC9, 0x57, 0x3C, 0xE1, 0x7B, 0x7D, 0x4D, 0x7E, 0xB2, 0xFE, 0xC2, 0xBF, 0x0B, 0x7E, 0x0A, 0xFE, \n    0xD1, 0x3F, 0xB1, 0xD5, 0xD6, 0xAD, 0x7D, 0xA0, 0xDF, 0x2E, 0xAD, 0xAD, 0x59, 0xDE, 0xC4, 0xF7, \n    0x33, 0x48, 0xBE, 0x66, 0x95, 0x2C, 0x28, 0x19, 0x18, 0x1E, 0x84, 0xB0, 0x3D, 0x06, 0x71, 0x8A, \n    0xFC, 0x11, 0xF8, 0x8D, 0x72, 0xCB, 0xE3, 0xED, 0x6A, 0x3F, 0x36, 0x69, 0x96, 0x0B, 0xE9, 0xA2, \n    0x56, 0x91, 0xB7, 0x33, 0x2A, 0xB9, 0x03, 0x27, 0xE8, 0x2B, 0xC5, 0xC4, 0xF1, 0x75, 0x2C, 0x4C, \n    0xAB, 0x61, 0x21, 0x4A, 0x51, 0x70, 0x7C, 0xAD, 0xBD, 0x13, 0xDF, 0x55, 0xF7, 0x79, 0x77, 0x3D, \n    0x9C, 0xAF, 0x86, 0xE7, 0x5E, 0x9F, 0xBF, 0x51, 0x72, 0xC9, 0x74, 0xD5, 0xAF, 0x2F, 0xEA, 0xFD, \n    0x8F, 0xAA, 0xBF, 0xE0, 0xA8, 0x5F, 0x1A, 0x7E, 0x16, 0xFC, 0x48, 0xF1, 0x7D, 0xAC, 0x9F, 0x0B, \n    0xF4, 0xE1, 0xA4, 0xD8, 0xEC, 0x5D, 0xD1, 0x21, 0xEF, 0x8E, 0x49, 0x23, 0xDE, 0xB0, 0xBE, 0x0F, \n    0x7C, 0x65, 0x5F, 0x84, 0x1F, 0xB2, 0xBF, 0x89, 0xAE, 0x96, 0x5D, 0x9A, 0x86, 0xAD, 0x68, 0x74, \n    0xCB, 0x30, 0x0F, 0xCC, 0xCF, 0x2F, 0xDE, 0x3F, 0x40, 0x80, 0xE7, 0xFD, 0xE1, 0x5F, 0x2B, 0x4B, \n    0x77, 0xB1, 0x0B, 0x33, 0x60, 0x0E, 0xE7, 0xB5, 0x3B, 0x5C, 0xF8, 0x89, 0x36, 0xA7, 0xA6, 0x5A, \n    0xDA, 0xB4, 0x85, 0x6D, 0x2C, 0x90, 0xAC, 0x51, 0xE7, 0xB9, 0xEA, 0xC7, 0xDC, 0xFF, 0x00, 0x20, \n    0x2B, 0xE2, 0xB3, 0x8E, 0x24, 0xA7, 0x95, 0x65, 0xB5, 0xA1, 0x7F, 0x7E, 0x70, 0xE4, 0x8A, 0x6E, \n    0xEF, 0x5D, 0x1B, 0x6D, 0xF6, 0x5F, 0x7B, 0xB1, 0xF4, 0x98, 0x1E, 0x17, 0x54, 0xE9, 0xD2, 0xC3, \n    0xC5, 0xB9, 0x28, 0xCF, 0x99, 0xB7, 0x65, 0xD5, 0xBB, 0x24, 0xB4, 0x4A, 0xFA, 0x24, 0xB6, 0x47, \n    0x23, 0xE3, 0x67, 0x5F, 0xB6, 0x6D, 0x5F, 0xE1, 0xE2, 0xB0, 0x6A, 0xE6, 0xB3, 0x7A, 0x6F, 0x2E, \n    0x99, 0xBD, 0xEA, 0x9D, 0x7F, 0x27, 0xD7, 0x97, 0x35, 0x46, 0xD1, 0xFA, 0xB5, 0x35, 0x68, 0xD8, \n    0x28, 0xA2, 0x8A, 0xC4, 0xA0, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, \n    0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, \n    0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA0, 0x1C, 0x51, 0x45, 0x00, 0x68, 0x69, \n    0x7A, 0xA3, 0x5A, 0xB6, 0x37, 0x57, 0x41, 0x61, 0xE2, 0xE9, 0xAD, 0x55, 0x63, 0xF3, 0x19, 0xE0, \n    0x07, 0x3E, 0x59, 0x6E, 0x07, 0xD3, 0xD2, 0xB8, 0xF0, 0x70, 0x6A, 0x68, 0xEE, 0x4A, 0x1A, 0xFA, \n    0x4C, 0x97, 0x88, 0x2B, 0x60, 0x6A, 0x29, 0x41, 0xD8, 0xE3, 0xAF, 0x83, 0x85, 0x4D, 0xD1, 0xEC, \n    0x1F, 0x0F, 0xEE, 0xAD, 0xF5, 0xA9, 0xF2, 0x92, 0x29, 0x93, 0xBC, 0x64, 0xFC, 0xC3, 0xF0, 0xAF, \n    0x68, 0xF0, 0x2E, 0x81, 0xBC, 0xA7, 0x19, 0x66, 0xF6, 0xAF, 0x92, 0xB4, 0x9D, 0x58, 0xDB, 0xCE, \n    0xAE, 0xAC, 0xCB, 0x22, 0xF4, 0x65, 0x38, 0x23, 0xF1, 0xAF, 0x5E, 0xF8, 0x5D, 0xFB, 0x49, 0x6A, \n    0xDE, 0x11, 0x9A, 0x25, 0xB8, 0x8E, 0xDF, 0x54, 0xB7, 0x53, 0xF7, 0x65, 0xF9, 0x64, 0x03, 0xD9, \n    0xC7, 0xF5, 0x06, 0xBF, 0xA3, 0xB8, 0x3B, 0xC4, 0xFC, 0xBB, 0xD9, 0xAA, 0x58, 0xE8, 0xF2, 0xBF, \n    0xE6, 0x5A, 0xAF, 0x9A, 0xDD, 0x7C, 0xAF, 0xF2, 0x3F, 0x3D, 0xE2, 0x6E, 0x1E, 0xC5, 0x54, 0x8B, \n    0x96, 0x19, 0xDF, 0xC9, 0xE9, 0xF7, 0x3D, 0xBF, 0x23, 0xEC, 0xDF, 0x87, 0x1F, 0x0D, 0xED, 0xB5, \n    0x25, 0x8D, 0x6E, 0x2D, 0xA3, 0x9B, 0x77, 0x50, 0xCB, 0x9A, 0xF7, 0xAF, 0x85, 0xDF, 0x03, 0x2D, \n    0x74, 0xD9, 0xE3, 0x9B, 0x4D, 0x9F, 0x52, 0xD1, 0xE6, 0x04, 0x11, 0x25, 0x8D, 0xD3, 0xC2, 0x41, \n    0xFC, 0x0D, 0x7C, 0xDB, 0xF0, 0x17, 0xF6, 0xD7, 0xF0, 0x1D, 0xE3, 0xC3, 0x16, 0xAF, 0xF6, 0xED, \n    0x0E, 0x63, 0x8C, 0xB4, 0xD1, 0x79, 0xD0, 0x8F, 0xF8, 0x12, 0xF3, 0xFF, 0x00, 0x8E, 0xD7, 0xDB, \n    0x5F, 0x00, 0x7E, 0x26, 0xF8, 0x17, 0xC7, 0x82, 0x16, 0xD3, 0x7C, 0x59, 0xE1, 0xDB, 0x80, 0x71, \n    0x85, 0x37, 0x89, 0x13, 0xFE, 0x4F, 0xB4, 0xD7, 0xE9, 0x95, 0x38, 0x8B, 0x2D, 0xC4, 0x52, 0x73, \n    0xA1, 0x5A, 0x32, 0x5D, 0xAF, 0xAF, 0xDC, 0xF5, 0xFB, 0xD1, 0xF9, 0xBA, 0xCA, 0xF1, 0x54, 0x67, \n    0xCB, 0x52, 0x0D, 0x3F, 0x4F, 0xD7, 0x63, 0xD5, 0xBE, 0x11, 0x5C, 0xFC, 0x47, 0xF0, 0xF7, 0x94, \n    0xBA, 0x6F, 0xC4, 0xCF, 0x19, 0x43, 0x1A, 0xF0, 0x12, 0x5B, 0xC6, 0x95, 0x47, 0xFD, 0xF5, 0x9A, \n    0xFA, 0xB7, 0xE0, 0x6F, 0xC6, 0x4F, 0x88, 0x9E, 0x1E, 0x9D, 0x64, 0xD5, 0xFC, 0x5D, 0x77, 0xAC, \n    0x43, 0xB7, 0x1B, 0x67, 0x85, 0x77, 0x0F, 0xC7, 0x15, 0xE6, 0x5F, 0x0D, 0x7C, 0x27, 0x0D, 0xD5, \n    0xBC, 0x72, 0x5A, 0xB4, 0x37, 0x2B, 0x81, 0x86, 0x86, 0x45, 0x91, 0x4F, 0xFD, 0xF2, 0x4D, 0x7A, \n    0xA6, 0x8D, 0xE1, 0x7B, 0x88, 0x61, 0x18, 0x86, 0x7F, 0xFB, 0xF6, 0xDF, 0xE1, 0x5F, 0x90, 0xF1, \n    0x2D, 0x6C, 0x16, 0x26, 0xF0, 0x95, 0x38, 0x6B, 0xD7, 0x96, 0x37, 0xFB, 0xED, 0x73, 0xED, 0x32, \n    0x9A, 0x78, 0x9A, 0x56, 0x97, 0x3C, 0xBE, 0xF7, 0xFE, 0x65, 0x5F, 0xDA, 0x4B, 0xE3, 0xB7, 0x8F, \n    0xBC, 0x51, 0x64, 0xA9, 0xA1, 0xF8, 0x9A, 0xE3, 0x44, 0x8E, 0x35, 0x3B, 0x9A, 0x18, 0x57, 0x7B, \n    0x1F, 0xAE, 0x2B, 0xE2, 0x5F, 0x8D, 0x73, 0x7C, 0x49, 0xF1, 0x1B, 0x4A, 0x9A, 0x8F, 0xC4, 0xEF, \n    0x1B, 0x49, 0x1B, 0x64, 0x14, 0x8A, 0xF5, 0xE1, 0x53, 0xF8, 0x29, 0x15, 0xF6, 0xBF, 0x89, 0xBC, \n    0x2B, 0x71, 0x34, 0x4D, 0xBA, 0x09, 0x8F, 0xFD, 0xB3, 0x3F, 0xE1, 0x5E, 0x25, 0xF1, 0x5F, 0xC1, \n    0x56, 0xF6, 0xF0, 0x48, 0xF7, 0x4D, 0x05, 0xB2, 0x80, 0x7E, 0x69, 0x64, 0x58, 0xC0, 0xFF, 0x00, \n    0xBE, 0x88, 0xAE, 0xCE, 0x11, 0xAD, 0x81, 0xC2, 0x25, 0x08, 0xD3, 0x85, 0xBB, 0xF2, 0xC6, 0xFF, \n    0x00, 0x7D, 0xAE, 0x61, 0x9D, 0x47, 0x15, 0x55, 0xB9, 0xF3, 0xCB, 0xEF, 0x67, 0xE7, 0x5F, 0xC5, \n    0x3F, 0x80, 0xB1, 0x6A, 0x37, 0x12, 0x4F, 0xA8, 0x5E, 0xEA, 0xDA, 0xA4, 0xDC, 0x92, 0xF7, 0x97, \n    0x4F, 0x2B, 0x1F, 0xCC, 0xD7, 0x86, 0x78, 0xEF, 0xE1, 0x94, 0x1A, 0x21, 0x7F, 0x26, 0x15, 0x5C, \n    0x1F, 0xEE, 0xD7, 0xD9, 0x3F, 0x1E, 0xFE, 0x23, 0x78, 0x1F, 0xC0, 0xDE, 0x68, 0xD4, 0xBC, 0x55, \n    0xA0, 0x5B, 0xE3, 0x3C, 0x2D, 0xDA, 0xCA, 0xDF, 0x92, 0x6E, 0x35, 0xF1, 0x87, 0xC6, 0xEF, 0xDB, \n    0x03, 0xC0, 0xF0, 0x4B, 0x34, 0x7A, 0x48, 0xBE, 0xD6, 0xA4, 0x5C, 0x80, 0xD1, 0xC7, 0xE4, 0xC2, \n    0x7F, 0xE0, 0x4D, 0xCF, 0xFE, 0x3B, 0x5F, 0xB0, 0x4F, 0x89, 0x32, 0xCC, 0x35, 0x2E, 0x7C, 0x45, \n    0x68, 0xC5, 0x76, 0xBA, 0xBF, 0xDC, 0xB5, 0xFB, 0x91, 0xF2, 0x14, 0xF2, 0xFC, 0x6D, 0x59, 0x5A, \n    0x94, 0x24, 0xFF, 0x00, 0x2F, 0xBF, 0x63, 0xDA, 0x7E, 0x00, 0x7E, 0xD8, 0x29, 0xF0, 0x13, 0xE0, \n    0x12, 0xE8, 0x6B, 0x70, 0xD1, 0xCD, 0x24, 0xF7, 0x44, 0xAA, 0xB6, 0x30, 0x1E, 0x35, 0x51, 0xFC, \n    0xAB, 0xF3, 0x9F, 0xE2, 0x65, 0xFC, 0x36, 0xFE, 0x23, 0xBC, 0xBA, 0x67, 0x1B, 0xEE, 0x67, 0x79, \n    0x36, 0x83, 0xC9, 0xCB, 0x13, 0x5A, 0x5F, 0x10, 0xBE, 0x3F, 0x6A, 0x1E, 0x25, 0x92, 0x45, 0x8D, \n    0x21, 0xD3, 0xED, 0xD8, 0xF0, 0x91, 0x7C, 0xCC, 0x7E, 0xAC, 0x7F, 0xA0, 0x15, 0xE5, 0x7A, 0xBE, \n    0xAC, 0x6E, 0xA6, 0x66, 0x66, 0x66, 0x66, 0xEA, 0x49, 0xC9, 0x35, 0xF8, 0xDF, 0x17, 0x78, 0x8D, \n    0x95, 0xC2, 0x2E, 0x19, 0x7C, 0x6F, 0x2B, 0xB7, 0xCC, 0xF4, 0xFB, 0x96, 0xEF, 0xE7, 0x63, 0xF4, \n    0xAE, 0x15, 0xE1, 0xDC, 0x56, 0x1D, 0xBA, 0x98, 0x97, 0xBF, 0x42, 0xC6, 0xA7, 0xAE, 0x3D, 0xE3, \n    0xFC, 0xC7, 0x6A, 0x2F, 0x45, 0xCD, 0x66, 0xDD, 0xEA, 0x2C, 0xE3, 0x19, 0xE2, 0xAA, 0xC9, 0x39, \n    0x7A, 0x8C, 0x9C, 0xD7, 0xF3, 0xCE, 0x73, 0x9F, 0x56, 0xC6, 0xD4, 0x72, 0x9B, 0xBD, 0xCF, 0xD1, \n    0x69, 0xE1, 0xE3, 0x14, 0x04, 0xE4, 0xD1, 0x45, 0x15, 0xF3, 0xA7, 0x48, 0x51, 0x45, 0x14, 0x00, \n    0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, \n    0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, \n    0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0xE5, 0x72, 0xA6, 0xAD, \n    0xD9, 0xEA, 0xEF, 0x6E, 0x47, 0x35, 0x4A, 0x8A, 0xD2, 0x9D, 0x69, 0xC1, 0xDE, 0x2C, 0x99, 0x41, \n    0x4B, 0x46, 0x75, 0xDA, 0x3F, 0x8E, 0x9A, 0xD8, 0x8C, 0x9A, 0xEB, 0x34, 0x2F, 0x8A, 0x30, 0xC0, \n    0xCA, 0xDC, 0x2B, 0x7A, 0xA9, 0xDA, 0x7F, 0x31, 0x5E, 0x4A, 0x1B, 0x14, 0xF5, 0x9D, 0x97, 0xF8, \n    0x8D, 0x7A, 0x54, 0x73, 0x9C, 0x4C, 0x36, 0x67, 0x2C, 0xF0, 0x34, 0xA5, 0xD0, 0xFA, 0x77, 0xC2, \n    0x3F, 0xB5, 0x26, 0xB3, 0xE1, 0xC5, 0x5F, 0xB0, 0x78, 0x93, 0x5D, 0xB1, 0xDB, 0xD3, 0xC8, 0xD4, \n    0x65, 0x4C, 0x7E, 0x1B, 0xAB, 0xBB, 0xD3, 0xFF, 0x00, 0xE0, 0xA1, 0x3F, 0x10, 0x74, 0xD8, 0x42, \n    0xC3, 0xF1, 0x17, 0xC6, 0x11, 0xA8, 0x18, 0x00, 0x6A, 0x6E, 0x7F, 0x9D, 0x7C, 0x56, 0x9A, 0x8C, \n    0xA9, 0xD1, 0x8D, 0x3F, 0xFB, 0x66, 0xE3, 0xFB, 0xED, 0xF9, 0xD7, 0x62, 0xE2, 0x4C, 0x45, 0xAC, \n    0xD9, 0xCF, 0xFD, 0x97, 0x48, 0xFB, 0x2F, 0x56, 0xFF, 0x00, 0x82, 0x81, 0x7C, 0x40, 0xD5, 0xA3, \n    0x65, 0xB8, 0xF8, 0x89, 0xE2, 0xF9, 0x55, 0x86, 0x08, 0x3A, 0x9B, 0x8F, 0xE5, 0x5E, 0x7D, 0xE3, \n    0x0F, 0xDA, 0x57, 0x58, 0xF1, 0x26, 0xEF, 0xB7, 0xF8, 0x8B, 0x5C, 0xBE, 0xDD, 0xD7, 0xCF, 0xD4, \n    0x25, 0x7C, 0xFF, 0x00, 0xE3, 0xD5, 0xF3, 0xAF, 0xF6, 0xCD, 0xC7, 0xF7, 0xDB, 0xF3, 0xA6, 0x3E, \n    0xA1, 0x33, 0xF5, 0x63, 0x4F, 0xFD, 0x64, 0xC4, 0xDA, 0xC9, 0x87, 0xF6, 0x55, 0x2B, 0xDC, 0xF4, \n    0x9D, 0x6F, 0xE2, 0x34, 0x33, 0xBB, 0x37, 0xDE, 0x63, 0xDC, 0xF2, 0x4F, 0xE2, 0x6B, 0x97, 0xD5, \n    0x7C, 0x66, 0xD7, 0x39, 0xC5, 0x73, 0x2D, 0x33, 0x37, 0xF1, 0x53, 0x49, 0xCD, 0x71, 0x56, 0xCE, \n    0x71, 0x13, 0xDD, 0x9D, 0x14, 0xF0, 0x34, 0xA3, 0xD0, 0xB9, 0x77, 0xAA, 0x3D, 0xC1, 0xEB, 0x55, \n    0x19, 0x8B, 0x1A, 0x4A, 0x2B, 0xCD, 0xA9, 0x5A, 0x73, 0xD6, 0x4C, 0xEA, 0x8C, 0x54, 0x76, 0x0A, \n    0x28, 0xA2, 0xB3, 0x28, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, \n    0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, \n    0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, \n    0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, \n    0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, \n    0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, \n    0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, \n    0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, \n    0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, \n    0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, \n    0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, \n    0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, \n    0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, \n    0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, \n    0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, \n    0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, \n    0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0xFF, 0xD9, \n} ;\n\nconst char return_jpg[] PROGMEM =\n{\n    0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x60, \n    0x00, 0x60, 0x00, 0x00, 0xFF, 0xE1, 0x00, 0x22, 0x45, 0x78, 0x69, 0x66, 0x00, 0x00, 0x4D, 0x4D, \n    0x00, 0x2A, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x01, 0x12, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, \n    0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x02, 0x01, 0x01, \n    0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x05, 0x03, 0x03, 0x03, \n    0x03, 0x03, 0x06, 0x04, 0x04, 0x03, 0x05, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 0x08, \n    0x09, 0x0B, 0x09, 0x08, 0x08, 0x0A, 0x08, 0x07, 0x07, 0x0A, 0x0D, 0x0A, 0x0A, 0x0B, 0x0C, 0x0C, \n    0x0C, 0x0C, 0x07, 0x09, 0x0E, 0x0F, 0x0D, 0x0C, 0x0E, 0x0B, 0x0C, 0x0C, 0x0C, 0xFF, 0xDB, 0x00, \n    0x43, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x06, 0x03, 0x03, 0x06, 0x0C, 0x08, 0x07, 0x08, \n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, \n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, \n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, \n    0x0C, 0x0C, 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x00, 0xB5, 0x01, 0x40, 0x03, 0x01, 0x22, 0x00, 0x02, \n    0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, 0x00, 0x1F, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, \n    0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, \n    0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, \n    0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04, \n    0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, \n    0x91, 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, 0x33, 0x62, 0x72, 0x82, \n    0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, \n    0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, \n    0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, \n    0x77, 0x78, 0x79, 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, \n    0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, \n    0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, \n    0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, \n    0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xC4, 0x00, \n    0x1F, 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, \n    0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, \n    0x00, 0xB5, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, \n    0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, \n    0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 0x23, \n    0x33, 0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, \n    0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, \n    0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, \n    0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84, \n    0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, \n    0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, \n    0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, \n    0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, \n    0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, \n    0x00, 0x3F, 0x00, 0xFE, 0x7F, 0xE8, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xAE, 0xE3, 0xE0, 0x5F, 0xEC, 0xFD, 0xE3, 0x4F, 0xDA, 0x63, \n    0xE2, 0x25, 0xA7, 0x85, 0x7C, 0x09, 0xE1, 0xBD, 0x53, 0xC4, 0xFA, 0xE5, 0xE1, 0x01, 0x2D, 0xAC, \n    0xE2, 0x2F, 0xE5, 0xA9, 0x60, 0xBB, 0xDD, 0xBE, 0xEC, 0x69, 0xB9, 0x94, 0x6E, 0x62, 0x06, 0x58, \n    0x0C, 0xE4, 0x8A, 0xFD, 0x76, 0xFD, 0x8B, 0x7F, 0xE0, 0x84, 0x5F, 0x0E, 0xFF, 0x00, 0x65, 0x36, \n    0xB3, 0xF1, 0x27, 0xC7, 0x79, 0xED, 0xBE, 0x20, 0xF8, 0xE2, 0x1C, 0x4D, 0x0F, 0x83, 0xEC, 0xA4, \n    0xFF, 0x00, 0x89, 0x55, 0x83, 0x65, 0x19, 0x7E, 0xD5, 0x26, 0x33, 0x23, 0x00, 0x18, 0x15, 0x23, \n    0x90, 0xF8, 0x28, 0xA4, 0x07, 0xAF, 0x57, 0x2D, 0xC9, 0xF1, 0x38, 0xD9, 0x5A, 0x92, 0xD3, 0xBF, \n    0x4F, 0xEB, 0xFA, 0x76, 0x3C, 0x5C, 0xE3, 0x3F, 0xC1, 0xE5, 0xB0, 0xBD, 0x79, 0x7B, 0xDF, 0xCA, \n    0xB7, 0xFF, 0x00, 0x81, 0xF3, 0xF9, 0x5C, 0xF8, 0x1F, 0xFE, 0x09, 0xFD, 0xFF, 0x00, 0x04, 0x79, \n    0xF8, 0xA9, 0xFB, 0x7A, 0xC8, 0xBA, 0xB5, 0xAD, 0xAC, 0x5E, 0x0D, 0xF8, 0x7F, 0x6F, 0x87, 0xBC, \n    0xF1, 0x4E, 0xB4, 0x86, 0x1B, 0x55, 0x4C, 0xA8, 0x3E, 0x4A, 0x9C, 0x19, 0x8F, 0xCD, 0x91, 0x82, \n    0x14, 0xED, 0x60, 0x18, 0xB0, 0xDA, 0x7B, 0x6F, 0xF8, 0x2B, 0x67, 0xFC, 0x13, 0x4F, 0xE1, 0x5F, \n    0xEC, 0x0F, 0xE0, 0x2F, 0x03, 0xDC, 0xF8, 0x27, 0xE2, 0x07, 0x88, 0x3C, 0x51, 0xAF, 0x6B, 0x57, \n    0x33, 0x5A, 0xEA, 0x16, 0xBA, 0x9D, 0x9A, 0xC7, 0x15, 0xCA, 0xA4, 0x48, 0xCF, 0x71, 0x6C, 0xCA, \n    0xAA, 0x42, 0x46, 0xEC, 0x11, 0x96, 0x40, 0x18, 0xF9, 0xD1, 0x95, 0xCE, 0xD7, 0x35, 0xFB, 0x09, \n    0xE3, 0x0F, 0x89, 0x97, 0xFE, 0x2C, 0xB6, 0xB6, 0xB3, 0x7F, 0xB3, 0xD8, 0xE9, 0x56, 0x0A, 0x12, \n    0xCF, 0x4D, 0xB3, 0x8C, 0x43, 0x69, 0x68, 0xA3, 0x8F, 0x91, 0x07, 0x7F, 0xF6, 0x9B, 0x2C, 0x7B, \n    0x93, 0x5F, 0x85, 0x3F, 0xF0, 0x55, 0x4F, 0xDA, 0x83, 0xFE, 0x1A, 0x63, 0xF6, 0xAD, 0xD5, 0x8D, \n    0x8D, 0xD0, 0xB8, 0xF0, 0xDF, 0x84, 0xB7, 0x68, 0xBA, 0x51, 0x8E, 0x5D, 0xF0, 0xCA, 0x23, 0x63, \n    0xE7, 0x4E, 0xB8, 0x25, 0x4F, 0x99, 0x2E, 0xEC, 0x38, 0xFB, 0xC8, 0x91, 0x7A, 0x57, 0xD3, 0xE7, \n    0x19, 0x26, 0x13, 0x2D, 0xCB, 0xEF, 0x3F, 0x7A, 0xA4, 0x9A, 0x4B, 0xF3, 0x6F, 0xEE, 0xED, 0xDD, \n    0x5D, 0xB3, 0xE3, 0xF2, 0x1E, 0x22, 0xC7, 0xE6, 0xF9, 0xA2, 0xE5, 0xF7, 0x68, 0xC1, 0x36, 0xD2, \n    0xFB, 0x92, 0x6F, 0xAB, 0x6F, 0x5D, 0x7B, 0x3B, 0x24, 0x7C, 0xCB, 0x45, 0x14, 0x57, 0xC1, 0x9F, \n    0xA5, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, \n    0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, \n    0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, \n    0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x57, \n    0xB5, 0x7E, 0xC7, 0x3F, 0xB0, 0x37, 0xC5, 0x0F, 0xDB, 0xB7, 0xC7, 0x63, 0x43, 0xF8, 0x77, 0xE1, \n    0xD9, 0xF5, 0x21, 0x19, 0x22, 0xEF, 0x52, 0x9F, 0x30, 0xE9, 0xF6, 0x00, 0x00, 0x49, 0x96, 0x6C, \n    0x10, 0x38, 0x20, 0xE0, 0x02, 0xD8, 0x39, 0xC6, 0x01, 0x23, 0x4A, 0x34, 0x67, 0x56, 0x5C, 0x94, \n    0xD5, 0xD9, 0x95, 0x6A, 0xF4, 0xE8, 0xC1, 0xD4, 0xAB, 0x25, 0x18, 0xAE, 0xAC, 0xF1, 0x50, 0x0B, \n    0x1A, 0xFD, 0x05, 0xFD, 0x81, 0x3F, 0xE0, 0x82, 0x9E, 0x37, 0xFD, 0xA2, 0x74, 0xAB, 0x4F, 0x19, \n    0xFC, 0x56, 0xBC, 0x9B, 0xE1, 0x4F, 0xC3, 0x76, 0x7F, 0x96, 0x5B, 0xC8, 0x4A, 0xEA, 0xDA, 0xA0, \n    0x0D, 0xB4, 0xAD, 0xBD, 0xBB, 0x0D, 0xC0, 0xF0, 0xDC, 0xB2, 0x92, 0x36, 0xF2, 0xA1, 0x48, 0x7A, \n    0xFB, 0xAF, 0xF6, 0x36, 0xFF, 0x00, 0x82, 0x5C, 0xFC, 0x19, 0xFF, 0x00, 0x82, 0x78, 0x1B, 0x7D, \n    0x5E, 0xF1, 0x6C, 0xBE, 0x2F, 0x7C, 0x53, 0xB7, 0xF9, 0xBF, 0xB4, 0xEF, 0x21, 0x1F, 0xD8, 0xDA, \n    0x3C, 0x9B, 0x9B, 0xFD, 0x44, 0x79, 0x3E, 0x63, 0x01, 0xB7, 0xE6, 0x0C, 0x46, 0x4B, 0x7C, 0xEC, \n    0x0E, 0xDA, 0xF6, 0x8F, 0x18, 0xFC, 0x40, 0xD5, 0x3C, 0x71, 0xAA, 0x1B, 0xDD, 0x52, 0xF2, 0x5B, \n    0xC9, 0xC2, 0x84, 0x4D, 0xD8, 0x09, 0x12, 0x8E, 0x88, 0x8A, 0x30, 0xA8, 0xA3, 0xFB, 0xAA, 0x00, \n    0xF6, 0xAF, 0xBF, 0xC9, 0xB8, 0x35, 0xBB, 0x55, 0xC6, 0x7D, 0xDF, 0xD7, 0xFC, 0x37, 0xAA, 0x3F, \n    0x30, 0xCF, 0xB8, 0xFE, 0xD7, 0xA3, 0x97, 0x7F, 0xE0, 0x4F, 0xF4, 0x5D, 0x3F, 0x3F, 0x46, 0x37, \n    0xE0, 0xFF, 0x00, 0x87, 0xBC, 0x0F, 0xFB, 0x23, 0x7C, 0x3B, 0xFF, 0x00, 0x84, 0x47, 0xE0, 0xCF, \n    0x86, 0x61, 0xF0, 0x66, 0x90, 0xC3, 0x17, 0x7A, 0x97, 0x0D, 0xAB, 0xEA, 0x8D, 0xC6, 0x5E, 0x59, \n    0xF2, 0x59, 0x73, 0x80, 0x30, 0x18, 0x9C, 0x28, 0x05, 0x88, 0x18, 0xAA, 0x33, 0x5E, 0xF5, 0xE6, \n    0xA9, 0x4D, 0x7B, 0x55, 0x26, 0xBC, 0xAF, 0xD0, 0xA8, 0xD0, 0xA7, 0x46, 0x3C, 0x94, 0xD5, 0x91, \n    0xF9, 0x6D, 0x7C, 0x45, 0x4A, 0xD3, 0x75, 0x2A, 0xBB, 0xB6, 0x78, 0x9F, 0xFC, 0x14, 0x9F, 0xF6, \n    0xA3, 0x3F, 0xB3, 0x2F, 0xEC, 0xB5, 0xAD, 0x6A, 0x56, 0x77, 0x4D, 0x6F, 0xE2, 0x0D, 0x70, 0x7F, \n    0x63, 0xE8, 0xC6, 0x37, 0x2B, 0x24, 0x73, 0xCA, 0xAD, 0xBA, 0x65, 0x23, 0x95, 0x31, 0x46, 0x1E, \n    0x40, 0x7A, 0x6E, 0x54, 0x19, 0xF9, 0x85, 0x7E, 0x1D, 0x93, 0x93, 0x5F, 0xB5, 0xFF, 0x00, 0xB6, \n    0x4F, 0xFC, 0x13, 0xBE, 0xD3, 0xF6, 0xF7, 0xD4, 0xF4, 0x99, 0x35, 0x4F, 0x8B, 0x11, 0x78, 0x06, \n    0xDF, 0xC3, 0xB0, 0xBA, 0x59, 0xD9, 0xCF, 0xE1, 0xF9, 0x75, 0x1B, 0x7B, 0x99, 0x65, 0x39, 0x92, \n    0x57, 0x92, 0x27, 0x0E, 0x84, 0x04, 0x89, 0x40, 0xD8, 0xFC, 0x64, 0x8C, 0x73, 0x9F, 0x96, 0x3C, \n    0x73, 0xFF, 0x00, 0x06, 0xEF, 0xFC, 0x4A, 0xB5, 0xB9, 0x98, 0xF8, 0x37, 0xE2, 0x47, 0xC2, 0x3F, \n    0x19, 0x5B, 0xA8, 0x3E, 0x52, 0x3E, 0xB1, 0x26, 0x8F, 0x79, 0x31, 0xEC, 0x04, 0x57, 0x51, 0xA2, \n    0xE4, 0xF1, 0x80, 0x24, 0x3F, 0xD6, 0xBF, 0x39, 0xE2, 0xCC, 0x1E, 0x3F, 0x15, 0x8A, 0xE6, 0x8D, \n    0x37, 0xC9, 0x15, 0x65, 0xB7, 0xAB, 0x7B, 0xF7, 0xD3, 0xE4, 0x8F, 0xD5, 0xF8, 0x23, 0x32, 0xCA, \n    0xB0, 0x58, 0x2E, 0x49, 0xD5, 0x4A, 0xA4, 0xDD, 0xE5, 0x74, 0xF4, 0xE8, 0x95, 0xED, 0x6D, 0x16, \n    0xBB, 0xF5, 0x67, 0xE7, 0xBD, 0x15, 0xF4, 0x47, 0xC6, 0x8F, 0xF8, 0x25, 0x5F, 0xED, 0x11, 0xFB, \n    0x3F, 0x59, 0xB5, 0xE7, 0x89, 0xBE, 0x11, 0x78, 0xC6, 0x1D, 0x3C, 0x64, 0xFD, 0xBE, 0xC6, 0xD3, \n    0xFB, 0x4A, 0xD0, 0x81, 0xC9, 0x6F, 0x3A, 0xD8, 0xC8, 0x98, 0xC7, 0x39, 0x27, 0x8E, 0xF5, 0xF3, \n    0xF5, 0xE5, 0xAC, 0xB6, 0x37, 0x0F, 0x0C, 0xD1, 0xC9, 0x0C, 0xB1, 0x9D, 0xAC, 0xAE, 0xA5, 0x59, \n    0x4F, 0xA1, 0x07, 0xA5, 0x7C, 0x2D, 0x4A, 0x15, 0x29, 0xBB, 0x54, 0x8B, 0x5E, 0xAA, 0xC7, 0xE9, \n    0x34, 0x71, 0x34, 0x6B, 0x2B, 0xD1, 0x9A, 0x92, 0xF2, 0x69, 0xFE, 0x44, 0x14, 0x51, 0x45, 0x64, \n    0x6C, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, \n    0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, \n    0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, \n    0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x7D, 0xD1, 0xFF, 0x00, 0x04, 0x6F, 0xFF, \n    0x00, 0x82, 0x65, 0x68, 0x7F, 0xB6, 0x9E, 0xBB, 0xAF, 0x78, 0xDB, 0xE2, 0x25, 0xC5, 0xE5, 0xA7, \n    0xC2, 0xDF, 0x03, 0xC8, 0x91, 0x5E, 0x45, 0x67, 0x20, 0x5B, 0x8D, 0x66, 0xE9, 0xB6, 0xB0, 0xB4, \n    0x42, 0x08, 0x65, 0x24, 0x32, 0x64, 0xFC, 0xBC, 0x3E, 0x77, 0x61, 0x1F, 0x1F, 0xAE, 0x8B, 0xE3, \n    0x1D, 0x3F, 0xC1, 0xBE, 0x03, 0x83, 0xC1, 0xBE, 0x07, 0xD0, 0xB4, 0xBF, 0x03, 0x78, 0x26, 0xC8, \n    0x6C, 0x87, 0x48, 0xD2, 0xA3, 0x11, 0x2C, 0xA3, 0x73, 0x36, 0x66, 0x70, 0x01, 0x91, 0x89, 0x72, \n    0x48, 0xE1, 0x32, 0x72, 0x14, 0x1A, 0xFC, 0xE9, 0xFF, 0x00, 0x82, 0x11, 0xFE, 0xD0, 0x7A, 0x2D, \n    0x97, 0xC0, 0xCF, 0x1B, 0x7C, 0x31, 0x96, 0xF1, 0xAD, 0xF5, 0xE9, 0xBC, 0x41, 0x0F, 0x88, 0xE1, \n    0xB7, 0x72, 0xA1, 0x6F, 0xA0, 0xFB, 0x31, 0x81, 0x8A, 0x73, 0x92, 0xD1, 0x91, 0xF3, 0x0C, 0x74, \n    0x99, 0x48, 0x27, 0x9C, 0x7D, 0xCB, 0x35, 0xF7, 0xBD, 0x7E, 0xBD, 0xC2, 0x78, 0x3C, 0x34, 0x70, \n    0x51, 0xAF, 0x04, 0x9C, 0x9E, 0xEF, 0xAD, 0xFF, 0x00, 0xE0, 0x74, 0xED, 0xBF, 0x9B, 0xFC, 0x27, \n    0x8E, 0x33, 0x0C, 0x5C, 0xF3, 0x19, 0xE1, 0xEA, 0xB6, 0xA3, 0x1D, 0x97, 0x4B, 0x5B, 0x7F, 0x9F, \n    0x57, 0xF2, 0x7B, 0x24, 0xAE, 0xCD, 0x7B, 0xEF, 0x55, 0x66, 0xBE, 0xF7, 0xAA, 0x33, 0x5F, 0x7F, \n    0xB5, 0x55, 0x26, 0xBF, 0xEB, 0xCD, 0x7D, 0x67, 0x33, 0x3E, 0x26, 0xE5, 0xE9, 0xAF, 0xBD, 0xEA, \n    0xA4, 0xD7, 0xDF, 0xED, 0x55, 0x19, 0xAF, 0xBD, 0xEA, 0xAC, 0xD7, 0xDF, 0xED, 0x56, 0x7C, 0xC2, \n    0xB9, 0x76, 0x6B, 0xEE, 0xBC, 0xD5, 0x49, 0xAF, 0xBD, 0xEA, 0x94, 0xD7, 0xDE, 0xF5, 0x52, 0x6B, \n    0xEF, 0x7A, 0x39, 0x99, 0x27, 0x41, 0xE1, 0xFF, 0x00, 0x88, 0x3A, 0xC7, 0x82, 0x2E, 0x9E, 0x7D, \n    0x1B, 0x57, 0xD4, 0xF4, 0x89, 0xDF, 0xEF, 0x49, 0x65, 0x75, 0x25, 0xBB, 0xB7, 0xD4, 0xA1, 0x06, \n    0xA8, 0xFC, 0x4D, 0xD5, 0x3C, 0x37, 0xF1, 0xE6, 0xD5, 0xAD, 0xFE, 0x25, 0x78, 0x03, 0xC0, 0x3F, \n    0x10, 0xE3, 0xF2, 0x8C, 0x2B, 0x3E, 0xAD, 0xA3, 0xC7, 0x15, 0xFC, 0x40, 0xF5, 0x65, 0xBC, 0xB6, \n    0xF2, 0xAE, 0x03, 0x7B, 0x99, 0x0F, 0x3C, 0xF5, 0xE6, 0xB0, 0xA6, 0xBE, 0xF7, 0xAA, 0xB3, 0x5E, \n    0xFB, 0xD6, 0x15, 0xA8, 0x53, 0xAA, 0xAD, 0x52, 0x29, 0xFA, 0xA3, 0x6A, 0x38, 0x9A, 0xB4, 0xA5, \n    0xCD, 0x4A, 0x4D, 0x3F, 0x26, 0x78, 0x3F, 0xC6, 0x5F, 0xF8, 0x23, 0xAF, 0xC0, 0xBF, 0x8B, 0x0B, \n    0x34, 0xFE, 0x04, 0xF1, 0x37, 0x89, 0xBE, 0x12, 0x6A, 0xCC, 0xA0, 0xA5, 0x96, 0xB0, 0x0E, 0xBF, \n    0xA2, 0x31, 0xEE, 0x04, 0xD1, 0xAA, 0xDD, 0x45, 0x93, 0xEA, 0x92, 0xE0, 0x77, 0xE3, 0x9F, 0x8A, \n    0xBF, 0x6A, 0x4F, 0xF8, 0x26, 0x17, 0xC6, 0x0F, 0xD9, 0x2F, 0x4B, 0x93, 0x59, 0xD7, 0x3C, 0x3B, \n    0x1E, 0xB9, 0xE1, 0x15, 0x72, 0x8B, 0xE2, 0x6F, 0x0E, 0xDC, 0x2E, 0xAB, 0xA4, 0x12, 0x06, 0x70, \n    0xF3, 0x45, 0x9F, 0x25, 0xB0, 0x47, 0xCB, 0x28, 0x46, 0xF6, 0xAF, 0xD4, 0x29, 0xAF, 0x7D, 0xEA, \n    0xD7, 0x86, 0x3E, 0x22, 0x6A, 0xDE, 0x04, 0xD4, 0x5E, 0xEB, 0x47, 0xD4, 0x6E, 0xB4, 0xF9, 0xA5, \n    0x8C, 0xC3, 0x2F, 0x94, 0xFF, 0x00, 0x2C, 0xF1, 0x9C, 0x6E, 0x8E, 0x45, 0x3F, 0x2C, 0x88, 0x70, \n    0x32, 0x8C, 0x0A, 0x9E, 0xE0, 0xD7, 0xCC, 0x63, 0xF8, 0x47, 0x05, 0x59, 0x37, 0x4B, 0xDC, 0x7E, \n    0x5B, 0x7D, 0xC7, 0xD8, 0xE5, 0x7C, 0x7D, 0x98, 0xE1, 0x9A, 0x8D, 0x77, 0xED, 0x23, 0xE7, 0xBF, \n    0xDF, 0xFE, 0x77, 0x3F, 0x0A, 0xE8, 0xAF, 0xD6, 0xFF, 0x00, 0xDA, 0x57, 0xF6, 0x11, 0xF8, 0x47, \n    0xFB, 0x5C, 0xC3, 0x73, 0x7D, 0x15, 0x95, 0x87, 0xC2, 0x5F, 0x1F, 0xDC, 0x65, 0xC6, 0xAF, 0xA4, \n    0xDA, 0xB7, 0xF6, 0x0E, 0xA7, 0x21, 0x39, 0x3F, 0x6B, 0xB2, 0x40, 0x4C, 0x0C, 0xC7, 0x71, 0x32, \n    0xDB, 0x0C, 0x64, 0x8C, 0xC5, 0x80, 0x4D, 0x7E, 0x6D, 0xFE, 0xD3, 0x1F, 0xB2, 0xAF, 0x8D, 0xBF, \n    0x64, 0x8F, 0x88, 0x1F, 0xF0, 0x8E, 0xF8, 0xDF, 0x49, 0x3A, 0x7D, 0xCC, 0xC8, 0x67, 0xB2, 0xBB, \n    0x86, 0x55, 0xB8, 0xB1, 0xD5, 0x20, 0xDC, 0x54, 0x5C, 0x5B, 0x4E, 0x84, 0xA4, 0xB1, 0x1C, 0x70, \n    0xCA, 0x7E, 0xA0, 0x1E, 0x2B, 0xF3, 0xFC, 0xCF, 0x23, 0xC4, 0xE0, 0x9D, 0xEA, 0x2B, 0xC7, 0xBA, \n    0xDB, 0xFE, 0x01, 0xFA, 0xBE, 0x47, 0xC4, 0xD8, 0x2C, 0xCE, 0x36, 0xA2, 0xED, 0x3F, 0xE5, 0x7B, \n    0xFC, 0xBB, 0xAF, 0xC7, 0xC8, 0xF3, 0x4A, 0x28, 0xA2, 0xBC, 0x73, 0xE8, 0x42, 0x8A, 0x28, 0xA0, \n    0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, \n    0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, \n    0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x0D, 0x9F, 0x05, 0xF8, \n    0xCF, 0x54, 0xF8, 0x75, 0xE2, 0x9B, 0x1D, 0x6F, 0x44, 0xBF, 0xB8, 0xD3, 0x35, 0x6D, 0x36, 0x61, \n    0x3D, 0xAD, 0xD4, 0x0D, 0xB6, 0x48, 0x5C, 0x77, 0x1F, 0xC8, 0x83, 0xC1, 0x04, 0x83, 0x90, 0x6B, \n    0xF5, 0x67, 0xF6, 0x06, 0xFF, 0x00, 0x82, 0x8F, 0xE9, 0xBF, 0xB5, 0x2E, 0x97, 0x1F, 0x87, 0x7C, \n    0x44, 0xF6, 0x9A, 0x4F, 0x8F, 0x6D, 0x63, 0x24, 0xC2, 0xBF, 0xBB, 0x83, 0x58, 0x45, 0x04, 0x99, \n    0x20, 0x04, 0xF0, 0xE1, 0x41, 0x2F, 0x1F, 0x50, 0x01, 0x65, 0xCA, 0xEE, 0x09, 0xF9, 0x1B, 0x57, \n    0xB4, 0xAD, 0x5A, 0xE7, 0x40, 0xD4, 0xED, 0xAF, 0x6C, 0xEE, 0x67, 0xB4, 0xBD, 0xB3, 0x95, 0x67, \n    0x82, 0x78, 0x24, 0x31, 0xC9, 0x0C, 0x8A, 0x43, 0x2B, 0xAB, 0x0C, 0x15, 0x60, 0x40, 0x20, 0x8E, \n    0x41, 0x15, 0xED, 0x64, 0xD9, 0xD5, 0x6C, 0xBE, 0xAF, 0x34, 0x35, 0x8B, 0xDE, 0x3D, 0x1F, 0xF9, \n    0x3E, 0xCC, 0xF9, 0xFE, 0x20, 0xE1, 0xDC, 0x3E, 0x6B, 0x47, 0x92, 0xA6, 0x93, 0x5F, 0x0C, 0xBA, \n    0xAF, 0x2F, 0x35, 0xDD, 0x7D, 0xD6, 0x67, 0xEF, 0xCC, 0xD7, 0xDE, 0xF5, 0x56, 0x6B, 0xEC, 0x57, \n    0xC8, 0x1F, 0xB0, 0x57, 0xFC, 0x14, 0x7A, 0xDF, 0xE3, 0x9D, 0xA5, 0xB7, 0x84, 0xFC, 0x69, 0x73, \n    0x6D, 0x65, 0xE3, 0x28, 0x80, 0x4B, 0x6B, 0xA3, 0xB6, 0x28, 0x75, 0xA1, 0xD3, 0x80, 0x30, 0xAB, \n    0x37, 0xAA, 0x0E, 0x1B, 0xAA, 0x81, 0xCA, 0x8F, 0xA9, 0xA6, 0xBE, 0xFF, 0x00, 0x6A, 0xBF, 0x5F, \n    0xC0, 0xE6, 0x14, 0x71, 0x94, 0x55, 0x6A, 0x0E, 0xE9, 0xFD, 0xE9, 0xF6, 0x7E, 0x67, 0xE0, 0x39, \n    0xA6, 0x59, 0x89, 0xC0, 0x57, 0x78, 0x7C, 0x4A, 0xB3, 0x5F, 0x73, 0x5D, 0xD7, 0x75, 0xFD, 0x6E, \n    0x5E, 0x9A, 0xFA, 0xAA, 0x4D, 0x7D, 0xEF, 0x54, 0x66, 0xBD, 0xF7, 0xAA, 0xB3, 0xDE, 0xFB, 0xD7, \n    0x59, 0xE6, 0x97, 0x66, 0xBC, 0xAA, 0xB3, 0x5E, 0xFB, 0xD7, 0xC1, 0x3A, 0xCF, 0xFC, 0x15, 0xCB, \n    0xC5, 0x5E, 0x18, 0xF1, 0x05, 0xF6, 0x9D, 0xAA, 0x78, 0x1F, 0x49, 0x4B, 0xAD, 0x3E, 0x69, 0x2D, \n    0x67, 0x89, 0x6F, 0x64, 0x46, 0x8E, 0x54, 0x62, 0xAC, 0x09, 0x2A, 0x7A, 0x10, 0x45, 0x5C, 0xD3, \n    0x7F, 0xE0, 0xB1, 0xF0, 0xCA, 0xEA, 0xB7, 0xDE, 0x01, 0x96, 0x35, 0xEE, 0xD0, 0x6B, 0x02, 0x43, \n    0xFF, 0x00, 0x7C, 0x98, 0x57, 0xF9, 0xD7, 0xCE, 0xAE, 0x2A, 0xCB, 0x6F, 0x67, 0x52, 0xDE, 0xB1, \n    0x97, 0xF9, 0x1F, 0x5B, 0x2E, 0x07, 0xCE, 0x52, 0xE6, 0x8D, 0x24, 0xD7, 0x94, 0xA3, 0xFE, 0x67, \n    0xDC, 0x13, 0x5E, 0xD5, 0x49, 0xAF, 0xB9, 0xAF, 0x97, 0xBC, 0x25, 0xFF, 0x00, 0x05, 0x58, 0xF8, \n    0x73, 0xE2, 0x29, 0x16, 0x3D, 0x4A, 0xDF, 0xC4, 0x1A, 0x0B, 0x63, 0x2D, 0x24, 0xF6, 0xAB, 0x34, \n    0x40, 0xFB, 0x18, 0x99, 0x98, 0xFF, 0x00, 0xDF, 0x02, 0xBD, 0x7B, 0xC0, 0x1F, 0xB4, 0x1F, 0x83, \n    0x7E, 0x2D, 0x24, 0x7F, 0xF0, 0x8E, 0x78, 0x97, 0x49, 0xD5, 0x26, 0x96, 0x33, 0x28, 0xB7, 0x8E, \n    0x70, 0xB7, 0x2A, 0x83, 0xA9, 0x68, 0x5B, 0x12, 0x2F, 0xFC, 0x09, 0x45, 0x7A, 0x18, 0x7C, 0xD3, \n    0x09, 0x88, 0x76, 0xA3, 0x51, 0x37, 0xDA, 0xFA, 0xFD, 0xDB, 0x9E, 0x36, 0x33, 0x25, 0xC7, 0xE1, \n    0x55, 0xF1, 0x14, 0x65, 0x15, 0xDE, 0xDA, 0x7D, 0xFB, 0x1D, 0xCC, 0xD7, 0xB5, 0x56, 0x6B, 0xDA, \n    0xAA, 0xF3, 0x33, 0x9E, 0xB4, 0xCA, 0xEE, 0x3C, 0xB2, 0x59, 0x2E, 0x4B, 0xD3, 0x7C, 0x55, 0xA4, \n    0xE8, 0x7F, 0x16, 0x7E, 0x1A, 0xDD, 0x78, 0x1B, 0xC7, 0x1A, 0x69, 0xD7, 0xBC, 0x21, 0x78, 0xC6, \n    0x58, 0xE1, 0xDC, 0x16, 0xEB, 0x47, 0xB8, 0x3C, 0x7D, 0xAE, 0xCA, 0x43, 0xFE, 0xAA, 0x6E, 0xCC, \n    0x3E, 0xE4, 0xAB, 0xC3, 0x83, 0x84, 0x64, 0x65, 0x15, 0x9D, 0x5A, 0x50, 0xA9, 0x17, 0x0A, 0x8A, \n    0xE9, 0xF4, 0x35, 0xA3, 0x5A, 0xA5, 0x19, 0xAA, 0x94, 0x9B, 0x52, 0x5A, 0xA6, 0x8F, 0xCC, 0x8F, \n    0xDB, 0x2B, 0xF6, 0x44, 0xD5, 0xBF, 0x64, 0x5F, 0x89, 0x89, 0xA6, 0xDC, 0x4D, 0xFD, 0xA9, 0xE1, \n    0xDD, 0x62, 0x23, 0x79, 0xA0, 0x6B, 0x09, 0x1E, 0xD8, 0xB5, 0x3B, 0x6C, 0xE0, 0x9C, 0x7F, 0x0C, \n    0xA8, 0xD9, 0x49, 0x13, 0xAA, 0xB2, 0x91, 0xE9, 0x5E, 0x35, 0x5F, 0xAF, 0x9F, 0x1A, 0x7E, 0x11, \n    0x69, 0xFF, 0x00, 0xB4, 0x6F, 0xC1, 0xAD, 0x5B, 0xC0, 0xBA, 0xAB, 0x47, 0x17, 0xDB, 0x09, 0xBB, \n    0xD1, 0xAE, 0xE4, 0xDB, 0x8D, 0x2B, 0x51, 0x55, 0xC4, 0x72, 0x82, 0xC4, 0x04, 0x49, 0x00, 0x11, \n    0x4A, 0x72, 0x32, 0x84, 0x31, 0xC9, 0x8D, 0x45, 0x7E, 0x49, 0xEB, 0xFA, 0x1D, 0xE7, 0x86, 0x35, \n    0xBB, 0xCD, 0x36, 0xFE, 0x09, 0x2D, 0x6F, 0x74, 0xF9, 0xDE, 0xDA, 0xE2, 0x17, 0x18, 0x68, 0xA4, \n    0x46, 0x2A, 0xCA, 0x7D, 0xC1, 0x04, 0x57, 0xE4, 0xBC, 0x45, 0x93, 0x7D, 0x46, 0xBD, 0xE1, 0xF0, \n    0x4B, 0x6F, 0x2F, 0x23, 0xF7, 0xEE, 0x11, 0xE2, 0x25, 0x9A, 0x61, 0xAD, 0x53, 0xF8, 0x90, 0xF8, \n    0xBC, 0xFB, 0x3F, 0x9F, 0x5F, 0x3F, 0x54, 0x67, 0xD1, 0x45, 0x15, 0xF3, 0xA7, 0xD6, 0x85, 0x14, \n    0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, \n    0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, \n    0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x05, 0x14, 0x51, 0x40, 0x12, 0xDB, \n    0x5C, 0x49, 0x69, 0x32, 0xC9, 0x1B, 0x34, 0x72, 0x46, 0xC1, 0x95, 0x94, 0xE1, 0x94, 0x8E, 0x41, \n    0x07, 0xB1, 0xAF, 0xD0, 0x1F, 0xD8, 0x43, 0xFE, 0x0A, 0x32, 0x3C, 0x6C, 0x96, 0xBE, 0x0B, 0xF8, \n    0x81, 0x7C, 0x91, 0xEB, 0x0A, 0x16, 0x1D, 0x37, 0x58, 0x99, 0xB0, 0xBA, 0x8F, 0x61, 0x0C, 0xE4, \n    0xF0, 0x26, 0xF4, 0x73, 0xC4, 0x9D, 0x0E, 0x1F, 0x06, 0x4F, 0xCF, 0x9A, 0x2B, 0xD3, 0xCA, 0xF3, \n    0x6A, 0xF8, 0x0A, 0xDE, 0xD6, 0x8B, 0xD3, 0xAA, 0xE8, 0xD7, 0xF5, 0xB3, 0xE8, 0x78, 0xF9, 0xDE, \n    0x47, 0x86, 0xCD, 0x30, 0xFE, 0xC6, 0xBA, 0xD7, 0xA4, 0x96, 0xF1, 0x7E, 0x5F, 0xAA, 0xEB, 0xF7, \n    0x33, 0xF7, 0x0A, 0x6B, 0xEF, 0x7A, 0xAB, 0x35, 0xF7, 0xFB, 0x55, 0xF0, 0xDF, 0xEC, 0x4F, 0xFF, \n    0x00, 0x05, 0x0C, 0x92, 0xDB, 0xEC, 0x7E, 0x11, 0xF1, 0xF5, 0xF6, 0xE8, 0x78, 0x87, 0x4F, 0xD6, \n    0xA7, 0x7E, 0x63, 0xEC, 0x23, 0xB8, 0x63, 0xDB, 0xA0, 0x12, 0x1E, 0x9F, 0xC5, 0xC7, 0xCC, 0x3E, \n    0xCE, 0x96, 0xEC, 0xBF, 0x4A, 0xFD, 0x77, 0x2D, 0xCD, 0x28, 0xE3, 0xA9, 0x7B, 0x5A, 0x2F, 0xD5, \n    0x75, 0x4F, 0xB3, 0x3F, 0x9F, 0x73, 0xAC, 0x97, 0x13, 0x96, 0x62, 0x3D, 0x86, 0x21, 0x7A, 0x3E, \n    0x8D, 0x77, 0x5F, 0xAA, 0xE8, 0x7E, 0x60, 0xFE, 0xDD, 0xFE, 0x05, 0x4F, 0x01, 0x7E, 0xD5, 0x1E, \n    0x2C, 0x86, 0x14, 0x99, 0x6D, 0xB5, 0x2B, 0x85, 0xD5, 0x23, 0x2F, 0xFC, 0x66, 0x75, 0x12, 0x48, \n    0x47, 0xB0, 0x95, 0xA4, 0x03, 0xE9, 0x8A, 0xF1, 0xBA, 0xFB, 0x13, 0xFE, 0x0A, 0xCB, 0xE0, 0x8F, \n    0x2B, 0xC4, 0x3E, 0x13, 0xF1, 0x2A, 0x06, 0x6F, 0xB4, 0x5B, 0xCB, 0xA6, 0x4C, 0x71, 0xC2, 0x79, \n    0x6D, 0xE6, 0x46, 0x3F, 0x1F, 0x32, 0x5F, 0xFB, 0xE6, 0xBE, 0x3B, 0xAF, 0xC9, 0x73, 0xDC, 0x37, \n    0xB0, 0xC7, 0xD5, 0x87, 0x9D, 0xFE, 0x4F, 0x5F, 0xD4, 0xFD, 0xF3, 0x85, 0xF1, 0x9F, 0x5A, 0xCA, \n    0xA8, 0x55, 0x7B, 0xF2, 0xD9, 0xFA, 0xC7, 0x47, 0xF9, 0x5C, 0x2A, 0x48, 0x66, 0x68, 0x24, 0x57, \n    0x46, 0x65, 0x75, 0x39, 0x0C, 0x0E, 0x08, 0x35, 0x1D, 0x15, 0xE4, 0x9E, 0xF1, 0xF4, 0x27, 0xC0, \n    0x8F, 0xF8, 0x28, 0x6F, 0x8D, 0x3E, 0x14, 0xCF, 0x0D, 0xB6, 0xB5, 0x71, 0x27, 0x8B, 0x34, 0x5C, \n    0xE1, 0xE3, 0xBC, 0x90, 0x9B, 0xB8, 0x87, 0xAA, 0x4C, 0x72, 0xC7, 0xE8, 0xFB, 0x87, 0x18, 0x1B, \n    0x7A, 0xD7, 0xDD, 0xDF, 0x07, 0xBE, 0x34, 0xF8, 0x77, 0xE3, 0x9F, 0x84, 0x63, 0xD6, 0x7C, 0x3B, \n    0x7C, 0xB7, 0x50, 0x30, 0x02, 0x68, 0x5C, 0x6D, 0x9E, 0xD2, 0x42, 0x32, 0x63, 0x95, 0x3F, 0x85, \n    0x87, 0xE2, 0x0E, 0x32, 0xA4, 0x8C, 0x1A, 0xFC, 0x8D, 0xAF, 0x40, 0xFD, 0x9F, 0xBE, 0x3C, 0x6A, \n    0xDF, 0xB3, 0xD7, 0xC4, 0x4B, 0x5D, 0x73, 0x4D, 0x66, 0x92, 0xDF, 0x21, 0x6F, 0xAC, 0x8C, 0x85, \n    0x63, 0xBE, 0x87, 0x3C, 0xA1, 0xEB, 0x83, 0xDD, 0x5B, 0x07, 0x6B, 0x60, 0xE0, 0x8C, 0x83, 0xF5, \n    0x99, 0x27, 0x13, 0xD6, 0xC3, 0x4D, 0x52, 0xC4, 0x37, 0x2A, 0x7E, 0x7A, 0xB5, 0xE9, 0xFE, 0x5F, \n    0x71, 0xF0, 0x9C, 0x49, 0xC1, 0x38, 0x6C, 0x6D, 0x39, 0x56, 0xC1, 0xC5, 0x42, 0xAA, 0xD7, 0x4D, \n    0x14, 0xBC, 0x9A, 0xD9, 0x37, 0xDF, 0xBE, 0xFD, 0xD7, 0xEA, 0xE5, 0x15, 0x9B, 0xE0, 0xEF, 0x16, \n    0xD8, 0xF8, 0xF3, 0xC2, 0xBA, 0x7E, 0xB5, 0xA6, 0xCD, 0xE7, 0xE9, 0xFA, 0xA5, 0xBA, 0x5C, 0xDB, \n    0xBE, 0x30, 0x4A, 0x30, 0x04, 0x64, 0x76, 0x3D, 0x88, 0x3C, 0x82, 0x08, 0xAD, 0x2A, 0xFD, 0x4A, \n    0x32, 0x52, 0x4A, 0x51, 0xD9, 0x9F, 0x86, 0x4E, 0x12, 0x84, 0x9C, 0x64, 0xAC, 0xD6, 0x8C, 0x2B, \n    0xF3, 0xC7, 0xFE, 0x0A, 0x65, 0xF0, 0xD1, 0x7C, 0x19, 0xF1, 0xFD, 0x75, 0x98, 0x22, 0xD9, 0x6B, \n    0xE2, 0x9B, 0x55, 0xBB, 0x66, 0x03, 0x00, 0xDC, 0x21, 0xD9, 0x2F, 0xE2, 0x40, 0x8D, 0x89, 0xEE, \n    0x5C, 0x9A, 0xFD, 0x0E, 0xAF, 0x93, 0xFF, 0x00, 0xE0, 0xAC, 0x5E, 0x17, 0x86, 0xEF, 0xE1, 0xAF, \n    0x85, 0x75, 0xA2, 0xCC, 0x27, 0xB1, 0xD4, 0xE4, 0xB2, 0x51, 0xD8, 0xAC, 0xD1, 0x17, 0x39, 0xFA, \n    0x18, 0x17, 0xF3, 0x35, 0xF3, 0xFC, 0x55, 0x87, 0x55, 0x72, 0xE9, 0x3E, 0xB1, 0xB3, 0x5F, 0x93, \n    0xFC, 0x1B, 0x3E, 0xBB, 0x81, 0x71, 0x8E, 0x86, 0x6F, 0x4E, 0x3D, 0x26, 0x9C, 0x5F, 0xDD, 0x75, \n    0xF8, 0xA4, 0x7C, 0x27, 0x45, 0x14, 0x57, 0xE4, 0x27, 0xF4, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x57, \n    0xD6, 0x1F, 0xB1, 0x4F, 0xED, 0xE5, 0x27, 0x80, 0x12, 0xCF, 0xC2, 0x3E, 0x34, 0xB9, 0x69, 0xB4, \n    0x15, 0x0B, 0x0E, 0x9F, 0xA8, 0x3F, 0xCC, 0xFA, 0x68, 0xE0, 0x2C, 0x52, 0x1E, 0xF0, 0x8E, 0xC7, \n    0xAA, 0x74, 0xE5, 0x70, 0x13, 0xE4, 0xFA, 0x2B, 0xBB, 0x2F, 0xCC, 0x2B, 0x60, 0xEA, 0xAA, 0xD4, \n    0x5E, 0xBF, 0x83, 0x5D, 0x99, 0xE6, 0xE6, 0xD9, 0x4E, 0x1B, 0x31, 0xC3, 0xBC, 0x3E, 0x25, 0x5D, \n    0x74, 0x7D, 0x53, 0xEE, 0x9F, 0x7F, 0xCF, 0x66, 0x7E, 0x8D, 0xFF, 0x00, 0xC1, 0x47, 0x74, 0x6B, \n    0x3F, 0x15, 0xFE, 0xCA, 0x77, 0x3A, 0x92, 0xC9, 0x1C, 0xCB, 0xA6, 0xDD, 0xDA, 0x5F, 0xDA, 0x4B, \n    0x13, 0x86, 0x49, 0x37, 0xB8, 0x8B, 0x20, 0x8E, 0x0A, 0x94, 0x98, 0x9E, 0x38, 0x3C, 0x1A, 0xFC, \n    0xE4, 0xAD, 0xA9, 0xBC, 0x7B, 0xAE, 0x5C, 0x78, 0x4E, 0x3D, 0x0E, 0x5D, 0x6B, 0x54, 0x93, 0x45, \n    0x85, 0xFC, 0xC8, 0xF4, 0xF6, 0xBA, 0x90, 0xDA, 0xA3, 0x72, 0x77, 0x08, 0xF3, 0xB4, 0x1E, 0x4F, \n    0x6E, 0xE6, 0xB1, 0x6B, 0xAB, 0x3B, 0xCC, 0xE3, 0x8F, 0xAE, 0xAB, 0xC6, 0x3C, 0xBA, 0x24, 0xFA, \n    0xEA, 0x8E, 0x1E, 0x1B, 0xC9, 0x67, 0x95, 0xE1, 0x5E, 0x16, 0x73, 0xE7, 0xF7, 0x9B, 0x4E, 0xD6, \n    0xD1, 0xDB, 0x4F, 0xC2, 0xFF, 0x00, 0x30, 0xA2, 0x8A, 0x2B, 0xC7, 0x3E, 0x80, 0x28, 0xA2, 0x8A, \n    0x00, 0xFB, 0xF7, 0xFE, 0x09, 0x67, 0xF1, 0x06, 0x5F, 0x10, 0x7C, 0x19, 0xD5, 0xBC, 0x3F, 0x33, \n    0x33, 0x9F, 0x0E, 0x5F, 0xEE, 0x87, 0x9E, 0x12, 0x19, 0xC1, 0x70, 0xBF, 0xF7, 0xF1, 0x65, 0x3F, \n    0xF0, 0x2A, 0xFA, 0x7E, 0xBE, 0x3C, 0xFF, 0x00, 0x82, 0x49, 0xE9, 0x93, 0x43, 0xA3, 0xF8, 0xEA, \n    0xF1, 0x83, 0x79, 0x33, 0xCD, 0x65, 0x0A, 0x1E, 0xC5, 0x91, 0x67, 0x2D, 0xFA, 0x48, 0xBF, 0x98, \n    0xAF, 0xB0, 0xEB, 0xF6, 0x4E, 0x1B, 0xA9, 0x29, 0xE5, 0xB4, 0x9C, 0xB7, 0xB3, 0x5F, 0x24, 0xDA, \n    0x5F, 0x85, 0x8F, 0xE7, 0x5E, 0x32, 0xA7, 0x0A, 0x79, 0xCD, 0x78, 0xD3, 0xDA, 0xE9, 0xFC, 0xDC, \n    0x53, 0x7F, 0x8B, 0x61, 0x5F, 0x32, 0x7F, 0xC1, 0x56, 0x08, 0x1F, 0xB3, 0xFE, 0x8B, 0xEB, 0xFF, \n    0x00, 0x09, 0x04, 0x3F, 0xFA, 0x4D, 0x73, 0x5F, 0x4D, 0xD7, 0xC6, 0x9F, 0xF0, 0x56, 0x6F, 0x1B, \n    0xFC, 0xBE, 0x10, 0xF0, 0xDC, 0x53, 0x2F, 0xFC, 0xB7, 0xD4, 0xEE, 0x61, 0xFE, 0x21, 0xD2, 0x38, \n    0x5B, 0xE9, 0xFE, 0xBC, 0x7E, 0x14, 0x71, 0x25, 0x48, 0xC3, 0x2E, 0xAA, 0xE5, 0xD5, 0x25, 0xF7, \n    0xB4, 0x3E, 0x0D, 0xA3, 0x2A, 0x99, 0xC5, 0x05, 0x1E, 0x8D, 0xBF, 0x92, 0x4D, 0x9F, 0x17, 0x51, \n    0x45, 0x15, 0xF8, 0xD9, 0xFD, 0x12, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, \n    0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, \n    0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, \n    0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, \n    0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x01, 0xB8, 0xE0, 0x51, 0x5F, 0x5E, 0x7F, 0xC1, 0x3E, \n    0x7F, 0x63, 0xC9, 0xF5, 0xCD, 0x5A, 0xC7, 0xE2, 0x07, 0x89, 0x20, 0x68, 0x74, 0xEB, 0x37, 0x13, \n    0xE8, 0xD6, 0x92, 0x29, 0x0D, 0x75, 0x28, 0x39, 0x5B, 0x86, 0x1D, 0xA3, 0x53, 0xCA, 0x7F, 0x79, \n    0x86, 0x7E, 0xE8, 0x1B, 0xFB, 0xB2, 0xEC, 0xBE, 0xAE, 0x36, 0xBA, 0xA3, 0x49, 0x7A, 0xBE, 0x89, \n    0x77, 0x7F, 0xD7, 0x91, 0xE5, 0xE7, 0x19, 0xB5, 0x0C, 0xBB, 0x0D, 0x2C, 0x4D, 0x77, 0xB6, 0xCB, \n    0xAB, 0x7D, 0x12, 0xFE, 0xB4, 0x5A, 0x9F, 0x47, 0x7E, 0xC6, 0xDF, 0x06, 0x24, 0xF8, 0x1D, 0xF0, \n    0x17, 0x4B, 0xD3, 0x2E, 0xA3, 0x30, 0xEA, 0x97, 0xC5, 0xB5, 0x1D, 0x45, 0x0F, 0x54, 0x9A, 0x40, \n    0x3E, 0x43, 0xEE, 0x88, 0xA8, 0x87, 0xD4, 0xA1, 0x3D, 0xEB, 0xD4, 0xA8, 0xA2, 0xBF, 0x6C, 0xC3, \n    0x61, 0xE1, 0x42, 0x94, 0x68, 0xD3, 0xDA, 0x2A, 0xC8, 0xFE, 0x6C, 0xC6, 0x62, 0xAA, 0x62, 0x6B, \n    0xCF, 0x11, 0x57, 0xE2, 0x93, 0x6D, 0xFC, 0xFF, 0x00, 0xAD, 0x06, 0xCD, 0x32, 0x5B, 0x42, 0xF2, \n    0x48, 0xEB, 0x1C, 0x71, 0xA9, 0x66, 0x66, 0x38, 0x0A, 0x07, 0x52, 0x4F, 0x61, 0x5F, 0x95, 0xFF, \n    0x00, 0xB5, 0x67, 0xC6, 0x2F, 0xF8, 0x5E, 0x9F, 0x1C, 0xB5, 0xAD, 0x72, 0x19, 0x19, 0xB4, 0xEF, \n    0x30, 0x5A, 0xE9, 0xE1, 0x81, 0x18, 0xB6, 0x8F, 0xE5, 0x43, 0x83, 0xC8, 0xDC, 0x72, 0xE4, 0x1E, \n    0x85, 0xCD, 0x7D, 0x31, 0xFF, 0x00, 0x05, 0x11, 0xFD, 0xAE, 0x60, 0xD2, 0xF4, 0x7B, 0xCF, 0x87, \n    0xBE, 0x1D, 0xBA, 0xF3, 0x6F, 0xAF, 0x07, 0x97, 0xAD, 0x5C, 0xC4, 0xFF, 0x00, 0x2D, 0xB4, 0x5D, \n    0xED, 0xC1, 0x1D, 0x5D, 0xBA, 0x3F, 0x60, 0xB9, 0x5E, 0x4B, 0x1D, 0xBF, 0x0E, 0xD7, 0xE7, 0x9C, \n    0x5F, 0x9B, 0x46, 0xAC, 0xD6, 0x0E, 0x93, 0xBA, 0x8B, 0xBB, 0xF5, 0xED, 0xF2, 0xEB, 0xE7, 0xE8, \n    0x7E, 0xB9, 0xE1, 0xEE, 0x41, 0x3C, 0x3D, 0x37, 0x98, 0x57, 0x56, 0x73, 0x56, 0x8A, 0xFE, 0xEE, \n    0xF7, 0xF9, 0xE9, 0x6F, 0x25, 0x7D, 0x98, 0x51, 0x45, 0x15, 0xF1, 0x07, 0xE9, 0x61, 0x45, 0x14, \n    0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, \n    0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, \n    0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x62, 0x80, 0x0A, 0x29, \n    0xC2, 0x36, 0x27, 0xEE, 0x9F, 0xCA, 0x97, 0xEC, 0xF2, 0x7F, 0x71, 0xBF, 0x2A, 0x00, 0x65, 0x15, \n    0x22, 0xDA, 0x48, 0xFD, 0x23, 0x63, 0xF4, 0x14, 0xEF, 0xB0, 0x5C, 0x7F, 0xCF, 0x19, 0x3F, 0xEF, \n    0x9A, 0x00, 0x86, 0x8A, 0x9B, 0xEC, 0x17, 0x1F, 0xF3, 0xC6, 0x4F, 0xFB, 0xE6, 0x8F, 0xB0, 0x5C, \n    0x7F, 0xCF, 0x19, 0x3F, 0xEF, 0x9A, 0x00, 0x86, 0xA6, 0xB6, 0xB7, 0x92, 0xF2, 0xE1, 0x23, 0x8D, \n    0x5E, 0x49, 0x24, 0x60, 0xAA, 0x8A, 0x32, 0xCC, 0x4F, 0x00, 0x01, 0xDC, 0xD7, 0xA9, 0xFC, 0x0B, \n    0xFD, 0x8F, 0x3C, 0x6D, 0xF1, 0xEA, 0xE2, 0x19, 0x34, 0xFD, 0x3D, 0xF4, 0xFD, 0x1D, 0x88, 0xDF, \n    0xAA, 0x5F, 0x2B, 0x45, 0x6F, 0x8C, 0x90, 0x76, 0x71, 0xBA, 0x53, 0x95, 0x23, 0x08, 0x08, 0x07, \n    0x01, 0x8A, 0xF5, 0xAF, 0xB9, 0x7F, 0x67, 0x5F, 0xD8, 0xC7, 0xC2, 0x5F, 0xB3, 0xC4, 0x71, 0x5E, \n    0x5B, 0xC4, 0x75, 0x8F, 0x10, 0x85, 0xC3, 0xEA, 0x97, 0x68, 0x37, 0xA1, 0x23, 0x0C, 0x21, 0x4E, \n    0x44, 0x4A, 0x79, 0xE8, 0x4B, 0x61, 0x88, 0x2C, 0x45, 0x7D, 0x06, 0x55, 0xC3, 0xB8, 0xAC, 0x63, \n    0x52, 0xB7, 0x2C, 0x3B, 0xBF, 0xD1, 0x75, 0xFC, 0xBC, 0xCF, 0x95, 0xCF, 0x78, 0xC3, 0x03, 0x96, \n    0xA7, 0x0B, 0xF3, 0xD4, 0xFE, 0x55, 0xFA, 0xBD, 0x97, 0xE7, 0xE4, 0x78, 0x5F, 0xEC, 0x91, 0xFF, \n    0x00, 0x04, 0xEA, 0x92, 0x79, 0xAD, 0x3C, 0x49, 0xF1, 0x0A, 0xD8, 0x47, 0x6E, 0xA0, 0x4D, 0x6D, \n    0xA1, 0x38, 0xF9, 0xE4, 0x3F, 0xC2, 0xD7, 0x3E, 0x83, 0xBF, 0x95, 0xD4, 0xE4, 0x6E, 0xC6, 0x0A, \n    0x1F, 0xB4, 0x22, 0x85, 0x61, 0x8D, 0x51, 0x15, 0x51, 0x10, 0x05, 0x55, 0x51, 0x80, 0xA0, 0x76, \n    0x15, 0x9F, 0xE2, 0x9F, 0x19, 0x69, 0x1E, 0x07, 0xD3, 0x85, 0xDE, 0xB3, 0xAA, 0x69, 0xFA, 0x4D, \n    0xA9, 0x6D, 0x82, 0x5B, 0xBB, 0x84, 0x85, 0x19, 0xBD, 0x01, 0x62, 0x32, 0x7D, 0xAB, 0xE7, 0xFF, \n    0x00, 0x8B, 0x7F, 0xF0, 0x53, 0x0F, 0x08, 0x78, 0x32, 0x39, 0x20, 0xF0, 0xDD, 0x9D, 0xF7, 0x8A, \n    0x2F, 0x86, 0x40, 0x90, 0x23, 0x5A, 0xDA, 0x29, 0xE4, 0x72, 0xEE, 0x37, 0xB6, 0x0F, 0xF7, 0x53, \n    0x04, 0x7F, 0x15, 0x7E, 0x85, 0x42, 0x39, 0x76, 0x51, 0x47, 0x91, 0xC9, 0x47, 0xBD, 0xFE, 0x27, \n    0xF2, 0xDF, 0xFC, 0x8F, 0xC8, 0xF1, 0x33, 0xCD, 0xF8, 0x83, 0x11, 0xED, 0x14, 0x1C, 0xBA, 0x2B, \n    0x2B, 0x46, 0x3F, 0x37, 0xA2, 0xF5, 0x6E, 0xEF, 0xA9, 0xF4, 0x75, 0xDD, 0xDC, 0x56, 0x16, 0xB2, \n    0x5C, 0x4D, 0x2C, 0x70, 0xC3, 0x0A, 0x97, 0x92, 0x49, 0x18, 0x2A, 0xA2, 0x81, 0x92, 0x49, 0x3C, \n    0x00, 0x3D, 0x6B, 0xE4, 0x5F, 0xDA, 0xC3, 0xFE, 0x0A, 0x33, 0x6F, 0x63, 0x6B, 0x71, 0xE1, 0xFF, \n    0x00, 0x87, 0x97, 0x1F, 0x68, 0xBB, 0x62, 0x62, 0xB9, 0xD6, 0xC0, 0xCC, 0x50, 0xAE, 0x30, 0x45, \n    0xBE, 0x7E, 0xF3, 0x67, 0xFE, 0x5A, 0x1F, 0x94, 0x63, 0xE5, 0xDD, 0x90, 0xCB, 0xF3, 0x9F, 0xC7, \n    0x2F, 0xDA, 0xB7, 0xC7, 0x1F, 0x1F, 0xA5, 0x68, 0xF5, 0x8D, 0x41, 0xAD, 0xF4, 0xBD, 0xD9, 0x4D, \n    0x32, 0xCF, 0x30, 0xDA, 0x0F, 0xBA, 0x46, 0xE5, 0xC9, 0x32, 0x10, 0x54, 0x10, 0x5C, 0xB6, 0x0E, \n    0x71, 0x8C, 0xE2, 0xBC, 0xBC, 0xC6, 0xC0, 0xFD, 0xD3, 0xF9, 0x57, 0xCA, 0x67, 0x1C, 0x5D, 0x3A, \n    0xA9, 0xD2, 0xC1, 0xAE, 0x55, 0xFC, 0xCF, 0x7F, 0x97, 0x6F, 0xCF, 0xD0, 0xFB, 0xCE, 0x1F, 0xF0, \n    0xFE, 0x9D, 0x09, 0x2A, 0xF9, 0x8B, 0x53, 0x92, 0xDA, 0x2B, 0xE1, 0x5E, 0xBD, 0xFD, 0x36, 0xF5, \n    0x26, 0xB8, 0xB9, 0x92, 0xF6, 0xE1, 0xA5, 0x99, 0x9E, 0x49, 0x64, 0x62, 0xEE, 0xCE, 0x72, 0xCC, \n    0x4F, 0x24, 0x92, 0x7A, 0x93, 0x55, 0xE8, 0xC5, 0x15, 0xF1, 0x07, 0xE9, 0x41, 0x45, 0x14, 0x50, \n    0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, \n    0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, \n    0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x5D, 0xD7, 0xC0, 0xBF, 0x84, 0xD1, 0xFC, \n    0x59, 0xF1, 0x4C, 0x76, 0x12, 0x5D, 0xC5, 0x68, 0xAE, 0x71, 0xB9, 0xCE, 0x05, 0x70, 0xB5, 0x73, \n    0x48, 0xD6, 0xEE, 0xB4, 0x2B, 0x91, 0x35, 0xAC, 0xD2, 0x43, 0x20, 0xE8, 0x54, 0xE2, 0x80, 0x3E, \n    0xFC, 0xF8, 0x6F, 0xFF, 0x00, 0x04, 0x93, 0xD0, 0xF5, 0xF8, 0x62, 0x92, 0xE3, 0xC4, 0x76, 0x67, \n    0x70, 0x19, 0x02, 0x41, 0x5E, 0xB7, 0xE1, 0x7F, 0xF8, 0x23, 0x0F, 0x83, 0x01, 0x0D, 0x3E, 0xAF, \n    0x04, 0x8A, 0x7A, 0x61, 0xC5, 0x7E, 0x6E, 0x68, 0x9F, 0xB4, 0xD7, 0x8C, 0xB4, 0x11, 0x88, 0x35, \n    0xAB, 0xC5, 0x0B, 0xD3, 0xF7, 0x86, 0xBA, 0xAD, 0x37, 0xF6, 0xF4, 0xF8, 0x87, 0xA7, 0x04, 0x0B, \n    0xAD, 0xDD, 0x1D, 0x9D, 0x3E, 0x73, 0x40, 0x1F, 0xA5, 0x3A, 0x2F, 0xFC, 0x11, 0x87, 0xC0, 0x56, \n    0xD7, 0x01, 0xE4, 0xBB, 0x89, 0xD3, 0xD3, 0x70, 0xAE, 0x92, 0x2F, 0xF8, 0x23, 0xAF, 0xC3, 0x89, \n    0x17, 0xFE, 0x59, 0x37, 0xD0, 0x8A, 0xFC, 0xD4, 0x83, 0xFE, 0x0A, 0x6B, 0xF1, 0x2A, 0x18, 0x95, \n    0x7F, 0xB5, 0xA6, 0x20, 0x0C, 0x7D, 0xE3, 0x5B, 0x9A, 0x2F, 0xFC, 0x15, 0x8B, 0xE2, 0x3E, 0x95, \n    0x0E, 0xC3, 0x7F, 0x23, 0xFB, 0x96, 0x34, 0x01, 0xFA, 0x4B, 0xA0, 0xFF, 0x00, 0xC1, 0x23, 0x3E, \n    0x1B, 0x69, 0x44, 0xEF, 0x86, 0x39, 0x3E, 0xB8, 0xAD, 0x51, 0xFF, 0x00, 0x04, 0xA8, 0xF8, 0x62, \n    0x5B, 0xFE, 0x3C, 0xE0, 0xFD, 0x2B, 0xF3, 0x57, 0xFE, 0x1E, 0xF5, 0xF1, 0x1F, 0xFE, 0x7F, 0x9B, \n    0xF3, 0x35, 0x2D, 0x8F, 0xFC, 0x16, 0x07, 0xE2, 0x2D, 0xBD, 0xC2, 0xBB, 0xDD, 0xB3, 0x80, 0x7A, \n    0x64, 0xD0, 0x07, 0xE9, 0x4A, 0xFF, 0x00, 0xC1, 0x28, 0x7E, 0x1A, 0x37, 0xFC, 0xB8, 0xC5, 0xF9, \n    0x0A, 0x13, 0xFE, 0x09, 0x57, 0xF0, 0xFA, 0xC6, 0x68, 0xE6, 0xB3, 0xB4, 0xB1, 0x8E, 0x78, 0xDB, \n    0x70, 0x69, 0xED, 0x96, 0x74, 0xFF, 0x00, 0xBE, 0x49, 0x03, 0x35, 0xF9, 0xEF, 0x17, 0xFC, 0x16, \n    0xB7, 0xC7, 0x51, 0xA0, 0x19, 0xCE, 0x29, 0xDF, 0xF0, 0xFB, 0x0F, 0x1D, 0x56, 0x94, 0xAA, 0x4A, \n    0x9C, 0xD5, 0x48, 0x6E, 0xB5, 0x5D, 0x7F, 0x07, 0xA1, 0x95, 0x7A, 0x30, 0xAD, 0x4D, 0xD2, 0xA9, \n    0xB3, 0xD1, 0xD9, 0xB5, 0xF8, 0xA6, 0x9A, 0xF9, 0x33, 0xF4, 0xE2, 0xCF, 0xF6, 0x2F, 0xB5, 0x89, \n    0x71, 0x36, 0xB7, 0x33, 0xE3, 0x80, 0x23, 0x89, 0x63, 0x03, 0xF3, 0xCD, 0x17, 0xFF, 0x00, 0xB1, \n    0x36, 0x95, 0x7F, 0x19, 0x59, 0x35, 0x8D, 0x45, 0x14, 0xFF, 0x00, 0xCF, 0x39, 0xBC, 0xB3, 0xF9, \n    0xAE, 0x0D, 0x7E, 0x63, 0xFF, 0x00, 0xC3, 0xEC, 0x3C, 0x75, 0x4D, 0x97, 0xFE, 0x0B, 0x5B, 0xE3, \n    0xA9, 0x10, 0x8C, 0xE3, 0x35, 0xE8, 0xD7, 0xCF, 0x31, 0xF5, 0xB4, 0x9D, 0x59, 0x7C, 0x9D, 0xBF, \n    0x05, 0x63, 0xC8, 0xC2, 0xF0, 0xD6, 0x57, 0x87, 0xD6, 0x95, 0x08, 0xDF, 0xBB, 0x57, 0x7F, 0x7B, \n    0xB9, 0xFA, 0x19, 0xA8, 0xFF, 0x00, 0xC1, 0x2E, 0xBE, 0x1D, 0x6A, 0xD7, 0x8F, 0x71, 0x75, 0x1F, \n    0xDA, 0xAE, 0x24, 0x39, 0x79, 0x66, 0x7D, 0xEE, 0xE7, 0xD4, 0x93, 0xC9, 0xAC, 0x2D, 0x7B, 0xFE, \n    0x09, 0x19, 0xF0, 0xDB, 0x55, 0x23, 0x64, 0x31, 0xC7, 0xF4, 0xC5, 0x7E, 0x77, 0xDF, 0x7F, 0xC1, \n    0x60, 0x7E, 0x22, 0xDC, 0x5C, 0x33, 0xA5, 0xDB, 0x20, 0x27, 0xA6, 0x4D, 0x45, 0xFF, 0x00, 0x0F, \n    0x7A, 0xF8, 0x8F, 0xFF, 0x00, 0x3F, 0xCD, 0xF9, 0x9A, 0xF2, 0xDB, 0x6D, 0xDD, 0x9E, 0xDC, 0x52, \n    0x4A, 0xCB, 0x63, 0xEF, 0xF9, 0x7F, 0xE0, 0x8E, 0xBF, 0x0E, 0x23, 0x5F, 0xF9, 0x64, 0xBF, 0x52, \n    0x2B, 0x9B, 0xD6, 0xBF, 0xE0, 0x8C, 0x3E, 0x02, 0xB9, 0xB8, 0x2F, 0x1D, 0xDC, 0x48, 0x9E, 0x9B, \n    0x85, 0x7C, 0x29, 0xAD, 0x7F, 0xC1, 0x58, 0xBE, 0x23, 0xEA, 0xB0, 0xEC, 0x17, 0xF2, 0x27, 0xB8, \n    0x63, 0x58, 0x73, 0xFF, 0x00, 0xC1, 0x4D, 0x7E, 0x25, 0x4D, 0x13, 0x2F, 0xF6, 0xB4, 0xC0, 0x11, \n    0x8F, 0xBC, 0x69, 0x0C, 0xFB, 0x5F, 0xC5, 0x1F, 0xF0, 0x46, 0x1F, 0x06, 0x12, 0x5A, 0x0D, 0x5E, \n    0x08, 0xD4, 0x75, 0xCB, 0x8A, 0xF2, 0x4F, 0x89, 0x1F, 0xF0, 0x49, 0x3D, 0x0F, 0x40, 0x86, 0x59, \n    0x2D, 0xFC, 0x47, 0x66, 0x36, 0x83, 0x80, 0x64, 0x15, 0xF3, 0x0E, 0xA5, 0xFB, 0x7A, 0x7C, 0x43, \n    0xD4, 0x43, 0x86, 0xD6, 0xEE, 0x86, 0xFE, 0xBF, 0x39, 0xAE, 0x57, 0x5B, 0xFD, 0xA6, 0xBC, 0x65, \n    0xAF, 0x0C, 0x4F, 0xAD, 0x5E, 0x30, 0x6E, 0xBF, 0xBC, 0x34, 0x01, 0x0F, 0xC7, 0x4F, 0x84, 0xD1, \n    0xFC, 0x26, 0xF1, 0x4C, 0x96, 0x11, 0xDD, 0xC5, 0x76, 0xA8, 0x71, 0xB9, 0x0E, 0x45, 0x70, 0xB5, \n    0x73, 0x57, 0xD6, 0xEE, 0xB5, 0xDB, 0x93, 0x35, 0xD4, 0xD2, 0x4D, 0x21, 0xEA, 0x58, 0xE6, 0xA9, \n    0xD0, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, \n    0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, \n    0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, \n    0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, \n    0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, \n    0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, \n    0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, \n    0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, \n    0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, \n    0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, \n    0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, \n    0x50, 0x01, 0x45, 0x14, 0x50, 0x07, 0xFF, 0xD9, \n} ;\n\nconst char about_jpg[] PROGMEM =\n{\n    0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x60, \n    0x00, 0x60, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, \n    0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x05, 0x03, 0x03, 0x03, 0x03, 0x03, 0x06, 0x04, \n    0x04, 0x03, 0x05, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0B, 0x09, 0x08, \n    0x08, 0x0A, 0x08, 0x07, 0x07, 0x0A, 0x0D, 0x0A, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x0C, 0x07, 0x09, \n    0x0E, 0x0F, 0x0D, 0x0C, 0x0E, 0x0B, 0x0C, 0x0C, 0x0C, 0xFF, 0xDB, 0x00, 0x43, 0x01, 0x02, 0x02, \n    0x02, 0x03, 0x03, 0x03, 0x06, 0x03, 0x03, 0x06, 0x0C, 0x08, 0x07, 0x08, 0x0C, 0x0C, 0x0C, 0x0C, \n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, \n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, \n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xFF, 0xC0, \n    0x00, 0x11, 0x08, 0x00, 0xB5, 0x01, 0x40, 0x03, 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, \n    0x01, 0xFF, 0xC4, 0x00, 0x1F, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, \n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, \n    0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, \n    0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, \n    0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1, 0x08, 0x23, \n    0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17, \n    0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, \n    0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, \n    0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, \n    0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, \n    0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, \n    0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, \n    0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF1, \n    0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xC4, 0x00, 0x1F, 0x01, 0x00, 0x03, \n    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, \n    0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5, 0x11, 0x00, \n    0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, \n    0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, \n    0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0, 0x15, \n    0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 0x27, \n    0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, \n    0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, \n    0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, \n    0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, \n    0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, \n    0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE2, \n    0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, \n    0xFA, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3F, 0x00, 0xFE, \n    0x7F, 0xE8, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, \n    0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA9, 0x0F, \n    0x5E, 0xF4, 0xD2, 0x39, 0xEE, 0x45, 0x3B, 0x00, 0xDA, 0x2B, 0x5F, 0xC3, 0x7E, 0x12, 0xD5, 0x3C, \n    0x63, 0xAA, 0xAD, 0x8E, 0x91, 0xA7, 0xDF, 0x6A, 0x77, 0x92, 0x7D, 0xD8, 0x6D, 0x60, 0x69, 0xA4, \n    0x6F, 0xA2, 0xA8, 0x26, 0xBD, 0x53, 0xC2, 0x7F, 0xB0, 0xA7, 0x8F, 0xFC, 0x4A, 0xD1, 0xB5, 0xD5, \n    0xA5, 0x86, 0x89, 0x0C, 0x83, 0x22, 0x4B, 0xEB, 0xB5, 0x04, 0x7D, 0x52, 0x3D, 0xEE, 0xBF, 0x42, \n    0xA2, 0xBD, 0x5C, 0xBF, 0x22, 0xCC, 0x31, 0xCE, 0xD8, 0x4A, 0x32, 0x9F, 0xA4, 0x5B, 0x4B, 0xD5, \n    0xF4, 0x3C, 0xFC, 0x76, 0x6D, 0x82, 0xC1, 0xAB, 0xE2, 0xAA, 0xC6, 0x1F, 0xE2, 0x69, 0x7E, 0x67, \n    0x8A, 0x51, 0x5F, 0x51, 0x68, 0xDF, 0xF0, 0x4E, 0x1B, 0x86, 0x65, 0x1A, 0xA7, 0x8B, 0x6C, 0xED, \n    0xC6, 0x46, 0xEF, 0xB3, 0x59, 0x34, 0xF8, 0xE7, 0x9C, 0x6F, 0x68, 0xFB, 0x7D, 0x33, 0xED, 0xD6, \n    0xB4, 0x47, 0xFC, 0x13, 0x7B, 0x4B, 0xF2, 0x33, 0xFF, 0x00, 0x09, 0xC5, 0xD1, 0x97, 0x07, 0xA6, \n    0x8E, 0xBB, 0x73, 0xCE, 0x3F, 0xE5, 0xBE, 0x7D, 0x33, 0x5F, 0x51, 0x4F, 0xC3, 0x1E, 0x24, 0x9C, \n    0x79, 0xA3, 0x87, 0xFB, 0xE5, 0x14, 0xFE, 0xE7, 0x23, 0xE7, 0x6A, 0x78, 0x81, 0x90, 0x42, 0x5C, \n    0xB2, 0xC4, 0x7D, 0xD1, 0x93, 0x5F, 0x7A, 0x8B, 0x3E, 0x4C, 0xA2, 0xBE, 0xA6, 0xD5, 0xBF, 0xE0, \n    0x9B, 0x4F, 0x1A, 0x7F, 0xA0, 0x78, 0xCA, 0x2B, 0x86, 0xE3, 0x89, 0xF4, 0xE3, 0x08, 0xE8, 0x3F, \n    0xBB, 0x23, 0xF7, 0xCF, 0xE0, 0x01, 0xEF, 0x81, 0xC6, 0xF8, 0xAF, 0xF6, 0x05, 0xF1, 0xD6, 0x84, \n    0x37, 0x58, 0x8D, 0x23, 0x5B, 0x40, 0xBB, 0x8F, 0xD9, 0x2E, 0xF6, 0x30, 0xFC, 0x25, 0x08, 0x49, \n    0xF6, 0x19, 0xF6, 0xCD, 0x71, 0xE3, 0x3C, 0x3F, 0xE2, 0x0C, 0x32, 0xBD, 0x4C, 0x2C, 0xBE, 0x56, \n    0x97, 0xFE, 0x92, 0xD9, 0xD5, 0x85, 0xE3, 0x6C, 0x8F, 0x10, 0xED, 0x4F, 0x13, 0x1F, 0x9D, 0xE3, \n    0xFF, 0x00, 0xA5, 0x58, 0xF0, 0xBA, 0x2B, 0xA0, 0xF1, 0x77, 0xC3, 0xDD, 0x6F, 0xC0, 0x1A, 0x8A, \n    0xDA, 0xEB, 0x7A, 0x4E, 0xA1, 0xA5, 0xDC, 0x38, 0xDC, 0xA9, 0x75, 0x03, 0x46, 0x5C, 0x7A, 0x8C, \n    0x8E, 0x47, 0xB8, 0xC8, 0x35, 0x86, 0x41, 0x2B, 0x83, 0x5F, 0x27, 0x5B, 0x0F, 0x52, 0x94, 0xB9, \n    0x2A, 0xC5, 0xC5, 0xAD, 0xD3, 0x56, 0xB1, 0xF4, 0xD4, 0xEA, 0x42, 0x71, 0xE6, 0x83, 0xBA, 0x7B, \n    0x35, 0xA9, 0x1D, 0x14, 0xF3, 0xD0, 0xD2, 0x77, 0xFF, 0x00, 0x3C, 0x56, 0x76, 0x28, 0x6D, 0x14, \n    0x51, 0x52, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, \n    0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, \n    0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, \n    0x14, 0x50, 0x01, 0x45, 0x48, 0x48, 0x02, 0xBD, 0x8B, 0xF6, 0x6D, 0xFD, 0x94, 0x35, 0x3F, 0x8D, \n    0xB7, 0x11, 0xEA, 0x57, 0xFE, 0x76, 0x95, 0xE1, 0x88, 0xD8, 0xEE, 0xBA, 0xDB, 0xFB, 0xCB, 0xB2, \n    0x0E, 0x0A, 0x42, 0x0F, 0x04, 0xE4, 0x10, 0x5C, 0xFC, 0xAB, 0xCF, 0xDE, 0x23, 0x61, 0xF4, 0xB2, \n    0xBC, 0xA7, 0x17, 0x98, 0xE2, 0x23, 0x85, 0xC1, 0xC1, 0xCA, 0x72, 0xE8, 0xBF, 0x37, 0xD9, 0x77, \n    0x6F, 0x43, 0x8B, 0x30, 0xCC, 0x70, 0xD8, 0x1A, 0x12, 0xC4, 0xE2, 0xE4, 0xA3, 0x08, 0xEE, 0xDF, \n    0xE4, 0xBB, 0xBF, 0x24, 0x70, 0x3F, 0x0F, 0x7E, 0x16, 0xEB, 0xDF, 0x15, 0xF5, 0xBF, 0xEC, 0xFD, \n    0x07, 0x4F, 0x9F, 0x50, 0xB8, 0x03, 0x7B, 0xED, 0xC2, 0xC7, 0x0A, 0xFF, 0x00, 0x79, 0xDC, 0xE1, \n    0x51, 0x7B, 0x65, 0x88, 0x19, 0xC0, 0xEA, 0x40, 0xAF, 0xAB, 0x3E, 0x09, 0xFF, 0x00, 0xC1, 0x3B, \n    0xB4, 0xCB, 0x6B, 0xCB, 0x7F, 0xED, 0xEF, 0xB4, 0x78, 0xA3, 0x56, 0x94, 0xE5, 0x34, 0xFB, 0x20, \n    0xEB, 0x6E, 0x0F, 0xA1, 0x2A, 0x04, 0x8F, 0x8F, 0x51, 0xB0, 0x7B, 0x11, 0xCD, 0x7D, 0x7F, 0xFB, \n    0x1A, 0xFE, 0xC0, 0xB7, 0xDF, 0x11, 0xA2, 0xB4, 0xD2, 0x7C, 0x39, 0xA5, 0xAE, 0x87, 0xE1, 0xD5, \n    0xC4, 0xAF, 0x28, 0x5C, 0x34, 0xE3, 0xA1, 0x95, 0x9D, 0xB2, 0x4F, 0xA7, 0x98, 0xF9, 0xEC, 0xA8, \n    0x1B, 0x1B, 0x47, 0xE8, 0xBF, 0xC2, 0xCF, 0x80, 0x7E, 0x05, 0xFD, 0x90, 0xB4, 0x38, 0xD3, 0x4D, \n    0xB1, 0x86, 0xFB, 0xC4, 0x12, 0x20, 0x66, 0xB8, 0x65, 0xCC, 0xCC, 0x7F, 0xBD, 0x93, 0x92, 0x8B, \n    0xE8, 0x4E, 0x5B, 0x93, 0x8E, 0x38, 0x1F, 0xB5, 0x60, 0x78, 0x47, 0x26, 0xC8, 0x54, 0x5E, 0x3D, \n    0x7D, 0x67, 0x13, 0xFC, 0xAB, 0xE0, 0x8B, 0xF3, 0xEF, 0xF3, 0xD3, 0xC8, 0xFC, 0x9B, 0x19, 0xC5, \n    0x19, 0xAE, 0x72, 0xDA, 0xC0, 0xBF, 0xAB, 0xE1, 0xFF, 0x00, 0x99, 0xFC, 0x72, 0x5F, 0xA7, 0xCB, \n    0x5F, 0x33, 0xE3, 0x3F, 0xD9, 0xF3, 0xFE, 0x09, 0x33, 0xE2, 0xED, 0x63, 0x41, 0x89, 0xF5, 0x35, \n    0xD1, 0xFE, 0x1B, 0xF8, 0x6D, 0x40, 0x90, 0xC2, 0xD0, 0x2F, 0x9D, 0x8E, 0x3E, 0x6F, 0x25, 0x0A, \n    0xA8, 0x27, 0xFB, 0xCE, 0xC0, 0x9E, 0xBC, 0xD7, 0xBA, 0x78, 0x6B, 0xF6, 0x1C, 0xF8, 0x2F, 0xF0, \n    0xDD, 0x15, 0x66, 0xD3, 0xF5, 0xAF, 0x1E, 0x5F, 0xC7, 0xF7, 0xA5, 0xD4, 0x2F, 0x5E, 0xDE, 0xD4, \n    0x37, 0xB2, 0x43, 0xB3, 0x23, 0xD9, 0xB7, 0x8F, 0x7A, 0xF5, 0x3F, 0x13, 0x78, 0xB2, 0xFB, 0xC5, \n    0x97, 0x1B, 0xAF, 0x26, 0x3E, 0x5A, 0x9C, 0xA4, 0x49, 0xC4, 0x71, 0xFD, 0x07, 0x73, 0xEE, 0x72, \n    0x7D, 0xEB, 0x25, 0xE3, 0x3F, 0xE0, 0x6B, 0xD9, 0xAD, 0x9D, 0x63, 0xEA, 0xC7, 0x91, 0x4B, 0xD9, \n    0xC5, 0x6D, 0x18, 0x7B, 0xA9, 0x7C, 0xD6, 0xBF, 0x89, 0xE6, 0xD1, 0xC9, 0xF0, 0x54, 0xDF, 0x34, \n    0xA3, 0xED, 0x24, 0xF7, 0x94, 0xDF, 0x33, 0x7F, 0x7E, 0x85, 0x1B, 0x2F, 0x0A, 0xF8, 0x6F, 0x41, \n    0x00, 0x68, 0xFE, 0x0D, 0xF0, 0x4E, 0x8A, 0xAB, 0xC6, 0xEB, 0x5D, 0x12, 0xDB, 0xCE, 0x23, 0xDE, \n    0x57, 0x46, 0x72, 0x7D, 0xF3, 0x4F, 0xBB, 0x8D, 0x6E, 0xD3, 0x6C, 0xAA, 0xB2, 0x47, 0xFD, 0xC2, \n    0x83, 0x68, 0xFC, 0x3A, 0x54, 0xEC, 0xDB, 0x6A, 0x29, 0x2E, 0x23, 0x03, 0x77, 0x98, 0x9B, 0x7A, \n    0x1E, 0x7A, 0x1A, 0xF3, 0xA5, 0x52, 0x5B, 0xCA, 0x5F, 0x3B, 0xB3, 0xD3, 0x8D, 0x18, 0x2D, 0x23, \n    0x15, 0x6F, 0x4F, 0xF2, 0x39, 0xBD, 0x67, 0xE1, 0x5F, 0x85, 0xF5, 0xE0, 0x56, 0xFB, 0xC3, 0x7A, \n    0x05, 0xD6, 0xEF, 0xE2, 0x93, 0x4F, 0x85, 0x9B, 0xF0, 0x6D, 0xB9, 0x1F, 0x81, 0xAF, 0x3D, 0xF1, \n    0x9F, 0xEC, 0x43, 0xE0, 0x4F, 0x13, 0x46, 0xCD, 0x67, 0x6B, 0x7D, 0xA0, 0xDC, 0x37, 0x3B, 0xEC, \n    0x6E, 0x4B, 0x21, 0x3D, 0xB2, 0x92, 0xEF, 0x18, 0xF6, 0x5D, 0xBF, 0x51, 0x5E, 0xC6, 0xEB, 0xB8, \n    0x71, 0xF5, 0x06, 0x99, 0x5D, 0x58, 0x7C, 0xD3, 0x17, 0x45, 0xDE, 0x95, 0x46, 0xBE, 0x6C, 0xCE, \n    0xB6, 0x5B, 0x85, 0xAC, 0xAD, 0x56, 0x9A, 0x6B, 0xD1, 0x1F, 0x15, 0xFC, 0x5C, 0xFD, 0x85, 0xBC, \n    0x4F, 0xE1, 0xCD, 0x3A, 0x75, 0xB2, 0x82, 0xCF, 0xC6, 0xBA, 0x33, 0x0C, 0xC9, 0x6F, 0x1C, 0x03, \n    0xCF, 0x65, 0xEA, 0x77, 0x5A, 0xC8, 0x59, 0x64, 0x1D, 0xB0, 0x8C, 0xEC, 0x7F, 0xB9, 0x5F, 0x18, \n    0xFC, 0x54, 0xFD, 0x85, 0x7C, 0x27, 0xE3, 0x3F, 0xB5, 0x36, 0x8B, 0xE6, 0xF8, 0x5F, 0x56, 0x85, \n    0xCC, 0x6F, 0x0E, 0x19, 0xAD, 0x96, 0x51, 0x9C, 0xAC, 0xB0, 0xB7, 0xEF, 0x22, 0x6C, 0xE0, 0x1D, \n    0xA4, 0x6D, 0x03, 0xFD, 0x59, 0x3C, 0x57, 0xEC, 0xE4, 0x83, 0x03, 0xFD, 0xDA, 0xF3, 0xCF, 0x8E, \n    0x1F, 0xB3, 0x67, 0x86, 0x7E, 0x3C, 0x5A, 0x79, 0x9A, 0x84, 0x2D, 0xA7, 0xEB, 0x91, 0xC7, 0xB2, \n    0xDB, 0x59, 0xB3, 0x01, 0x6E, 0xE1, 0xC7, 0x45, 0x7E, 0xD3, 0x46, 0x3F, 0xE7, 0x9B, 0xE4, 0x63, \n    0x3B, 0x4A, 0x93, 0xBA, 0xBD, 0x1A, 0xD9, 0x8E, 0x0B, 0x32, 0x8F, 0xB1, 0xCE, 0xE8, 0x46, 0x6B, \n    0xA4, 0xD2, 0xB4, 0x97, 0xCD, 0x7F, 0x5D, 0xCF, 0x3E, 0x9E, 0x55, 0x8A, 0xC0, 0x4B, 0xDB, 0x64, \n    0xF5, 0x9D, 0x37, 0xFC, 0xAD, 0xDE, 0x2F, 0xE4, 0xCF, 0xE7, 0xFB, 0xE2, 0xC7, 0xC0, 0xEF, 0x12, \n    0x7C, 0x16, 0xD5, 0x16, 0xDF, 0x5C, 0xD3, 0xDA, 0x38, 0x67, 0x24, 0x41, 0x75, 0x19, 0xF3, 0x2D, \n    0xEE, 0x31, 0xD7, 0x6B, 0x8E, 0x33, 0xD0, 0x95, 0x38, 0x60, 0x08, 0xC8, 0x19, 0xAE, 0x2F, 0xA0, \n    0x18, 0xFC, 0xEB, 0xF5, 0x63, 0xE3, 0xD7, 0xC1, 0x2D, 0x43, 0xE1, 0x5E, 0xA3, 0x27, 0x86, 0xFC, \n    0x75, 0xA7, 0x59, 0x5F, 0x69, 0x1A, 0xB6, 0x52, 0xD2, 0xFF, 0x00, 0xCB, 0xDD, 0xA7, 0xEA, 0x80, \n    0x73, 0xDF, 0x98, 0xA6, 0x5E, 0xBB, 0x49, 0xDC, 0xA7, 0x95, 0x38, 0x2A, 0xC7, 0xE2, 0x9F, 0xDA, \n    0x6F, 0xF6, 0x37, 0xBA, 0xF8, 0x6A, 0xD3, 0xEB, 0xBE, 0x19, 0x59, 0x6F, 0xBC, 0x3D, 0xCB, 0xCF, \n    0x6E, 0x72, 0xF3, 0xE9, 0x9D, 0xCE, 0x7F, 0xBF, 0x10, 0xEC, 0xFD, 0x57, 0xA3, 0x74, 0x0E, 0xDF, \n    0x9B, 0x71, 0x77, 0x86, 0xB5, 0x30, 0x34, 0x7F, 0xB4, 0x32, 0xA9, 0x7B, 0x6A, 0x1B, 0xBF, 0xE6, \n    0x8A, 0xF3, 0xB6, 0xEB, 0xCC, 0xFB, 0x7E, 0x1C, 0xE3, 0xA8, 0x62, 0x6A, 0xAC, 0x06, 0x67, 0x1F, \n    0x65, 0x5B, 0xA7, 0xF2, 0xCB, 0xD1, 0xF4, 0x7E, 0x4F, 0xE4, 0x7C, 0xF7, 0x45, 0x49, 0xD0, 0x9E, \n    0xD4, 0x84, 0x6D, 0x18, 0x35, 0xF9, 0x55, 0x8F, 0xD0, 0x86, 0x51, 0x45, 0x14, 0x80, 0x28, 0xA2, \n    0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, \n    0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, \n    0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA7, 0xF7, 0xE9, 0x5D, 0x87, 0xC1, 0x7F, 0x85, 0x77, \n    0xDF, 0x19, 0xBC, 0x7F, 0x63, 0xA0, 0xD9, 0xFE, 0xE9, 0x66, 0x26, 0x5B, 0x89, 0xF6, 0xEE, 0x16, \n    0xB0, 0xAF, 0x2F, 0x21, 0x19, 0x1D, 0x07, 0x00, 0x64, 0x6E, 0x62, 0xAB, 0x9C, 0x91, 0x5D, 0x18, \n    0x5C, 0x25, 0x5C, 0x45, 0x68, 0xE1, 0xE8, 0xAB, 0xCA, 0x4D, 0x24, 0xBB, 0xB6, 0x65, 0x5E, 0xBD, \n    0x3A, 0x34, 0xA5, 0x5A, 0xAB, 0xB4, 0x62, 0x9B, 0x6F, 0xB2, 0x5B, 0x9D, 0xCF, 0xEC, 0x9B, 0xFB, \n    0x33, 0x3F, 0xC6, 0x8D, 0x61, 0xB5, 0x4D, 0x59, 0x26, 0x8B, 0xC3, 0x3A, 0x7B, 0xED, 0x99, 0x95, \n    0xB6, 0x35, 0xEC, 0xB8, 0x04, 0x42, 0x87, 0xB6, 0x01, 0x05, 0xC8, 0xE4, 0x29, 0x03, 0x82, 0xCA, \n    0x6B, 0xF5, 0x67, 0xF6, 0x2F, 0xFD, 0x8D, 0x25, 0xF8, 0x9F, 0xA9, 0x69, 0x8D, 0x3D, 0x8C, 0x36, \n    0xDA, 0x44, 0x51, 0xA9, 0xB3, 0xB2, 0xF2, 0xF6, 0xC0, 0x90, 0x2E, 0x00, 0x96, 0x45, 0x1D, 0x22, \n    0x1C, 0x6D, 0x4E, 0xB2, 0x1C, 0x7F, 0x09, 0xF9, 0xB8, 0x2F, 0xD9, 0x1F, 0xF6, 0x73, 0xB2, 0xD6, \n    0x4D, 0x8D, 0x9D, 0xB5, 0x8B, 0x2F, 0x86, 0x7C, 0x3F, 0xB2, 0xDA, 0x1B, 0x6C, 0x6E, 0x6B, 0xC9, \n    0x49, 0xC8, 0x8C, 0x9C, 0x0D, 0xC5, 0x98, 0xEF, 0x90, 0xF7, 0x2F, 0xD0, 0x6F, 0xC8, 0xFD, 0x22, \n    0xF0, 0xD7, 0xD9, 0x3E, 0x04, 0x7C, 0x3F, 0xE4, 0x43, 0x26, 0xA9, 0x77, 0x83, 0x26, 0x3F, 0xE5, \n    0xAC, 0xB8, 0xE1, 0x07, 0xFD, 0x33, 0x41, 0x9E, 0x9E, 0xE7, 0x82, 0xD5, 0xFD, 0x25, 0x83, 0xCB, \n    0xA8, 0xF0, 0xBE, 0x03, 0xEA, 0x78, 0x6F, 0x7B, 0x13, 0x51, 0x2E, 0x79, 0x76, 0xBF, 0xD9, 0x5E, \n    0x48, 0xFC, 0x17, 0x15, 0x8E, 0xA9, 0xC4, 0x78, 0xEF, 0xAD, 0x57, 0x6E, 0x38, 0x7A, 0x6D, 0xF2, \n    0x47, 0x6B, 0xDB, 0xED, 0x3F, 0x37, 0xF8, 0x6C, 0x8E, 0xA1, 0xAF, 0x34, 0x7F, 0x81, 0x3E, 0x14, \n    0x87, 0x45, 0xD1, 0x23, 0x8F, 0xED, 0x92, 0x28, 0x67, 0x77, 0x00, 0xB3, 0x1C, 0x63, 0xCD, 0x93, \n    0xD4, 0xFF, 0x00, 0x75, 0x7A, 0x01, 0xEC, 0x30, 0x78, 0x2B, 0xAD, 0x4F, 0xED, 0xB7, 0x12, 0x4D, \n    0x34, 0x8D, 0x34, 0xD2, 0x36, 0xE7, 0x76, 0x39, 0x66, 0x3E, 0xA6, 0xB9, 0x6B, 0xCF, 0x15, 0x4D, \n    0xA8, 0xDE, 0x49, 0x71, 0x3C, 0xAD, 0x2C, 0xD3, 0x31, 0x67, 0x72, 0x7A, 0x9A, 0x8C, 0xEB, 0x98, \n    0xFE, 0x23, 0xF9, 0xD7, 0x97, 0x47, 0x07, 0xCB, 0x79, 0xC9, 0xDE, 0x4F, 0x56, 0xFB, 0x9E, 0x9D, \n    0x4C, 0x42, 0x93, 0x51, 0x8E, 0x89, 0x6C, 0x74, 0xE6, 0xEE, 0x31, 0xDF, 0xF0, 0xA4, 0xFB, 0x74, \n    0x7F, 0xFD, 0x6A, 0xE5, 0xDB, 0x5D, 0xCF, 0xF1, 0x54, 0x72, 0x6B, 0x98, 0x1F, 0x7A, 0xB6, 0x78, \n    0x7E, 0xAC, 0x88, 0x54, 0xD6, 0xC7, 0xDA, 0x1F, 0xB1, 0x17, 0xEC, 0x89, 0xA5, 0xF8, 0xDB, 0xC3, \n    0xD1, 0xF8, 0xCB, 0xC5, 0x56, 0xA2, 0xFA, 0xD6, 0xE2, 0x42, 0x34, 0xBD, 0x3E, 0x65, 0xCC, 0x2E, \n    0x8A, 0xC5, 0x4C, 0xD2, 0xAF, 0xF1, 0x82, 0xC0, 0x85, 0x43, 0xF2, 0xE0, 0x6E, 0x21, 0xB7, 0x2E, \n    0xDF, 0xAF, 0x2C, 0xF4, 0x9B, 0x5B, 0x1D, 0x35, 0x2D, 0x21, 0xB6, 0xB7, 0x86, 0xD6, 0x34, 0xD8, \n    0xB0, 0xA4, 0x61, 0x63, 0x55, 0xF4, 0x0A, 0x38, 0xC7, 0xB5, 0x71, 0xBF, 0xB3, 0x05, 0xED, 0xBD, \n    0xFF, 0x00, 0xEC, 0xE7, 0xE0, 0x59, 0x2D, 0x48, 0xFB, 0x3B, 0x68, 0x36, 0x41, 0x39, 0xC9, 0x5C, \n    0x40, 0x80, 0x83, 0xEE, 0x08, 0x20, 0xFB, 0x83, 0x5D, 0xE8, 0x19, 0xFE, 0x95, 0xF8, 0x3E, 0x71, \n    0x98, 0x56, 0xC4, 0xE2, 0xE7, 0x3A, 0xAF, 0xAB, 0x49, 0x74, 0x49, 0x74, 0x3F, 0x5C, 0xCA, 0xF0, \n    0x74, 0xE8, 0x61, 0xE2, 0xA0, 0xB5, 0x69, 0x36, 0xFB, 0x9F, 0x2E, 0x7E, 0xD9, 0x7F, 0xB1, 0x96, \n    0x8D, 0xA9, 0xF8, 0x3B, 0x51, 0xF1, 0x67, 0x84, 0xF4, 0xF8, 0x74, 0xBD, 0x5B, 0x4B, 0x46, 0xBA, \n    0xBB, 0xB3, 0xB5, 0x8C, 0x47, 0x05, 0xFC, 0x4A, 0x33, 0x21, 0x11, 0x8E, 0x16, 0x50, 0x01, 0x60, \n    0x54, 0x7C, 0xF8, 0x20, 0x82, 0x58, 0x30, 0xF8, 0x8C, 0xDF, 0x46, 0x4E, 0x77, 0x70, 0xDC, 0xD7, \n    0xEB, 0xAD, 0xFD, 0xD4, 0x36, 0x96, 0x13, 0x4B, 0x70, 0xC9, 0x1C, 0x11, 0xA3, 0x34, 0xAC, 0xE7, \n    0x0A, 0xAA, 0x07, 0x24, 0xE7, 0xB6, 0x2B, 0xF1, 0x77, 0xFB, 0x72, 0x32, 0x9F, 0xBA, 0xDC, 0xB1, \n    0x75, 0x40, 0x4F, 0x21, 0x7B, 0x7E, 0x95, 0xF7, 0x7C, 0x13, 0x8B, 0xAD, 0x88, 0xA5, 0x3A, 0x35, \n    0x1D, 0xD4, 0x6D, 0x66, 0xF7, 0xD6, 0xFA, 0x7E, 0x07, 0xCC, 0x71, 0x26, 0x1E, 0x9D, 0x1A, 0x91, \n    0xA9, 0x05, 0x6E, 0x6B, 0xDF, 0xB6, 0x96, 0x3A, 0xA7, 0xBE, 0x8F, 0x3D, 0x6A, 0x13, 0xA8, 0x46, \n    0x0F, 0x5A, 0xE6, 0x1F, 0x5C, 0xF9, 0x7E, 0xF0, 0xA8, 0x9F, 0x5E, 0xC7, 0x7A, 0xFB, 0x6F, 0x62, \n    0x7C, 0xEC, 0x6A, 0x74, 0x34, 0x7E, 0x20, 0xF8, 0x3B, 0x43, 0xF8, 0xA1, 0xE1, 0x3B, 0xDD, 0x0B, \n    0x5E, 0xB2, 0x8B, 0x50, 0xD2, 0xEF, 0xD7, 0x12, 0xC2, 0xFC, 0x10, 0x47, 0x47, 0x53, 0xD5, 0x5D, \n    0x4F, 0x21, 0x87, 0x20, 0xD7, 0xC0, 0x7F, 0x19, 0x7E, 0x16, 0xEA, 0x5F, 0xB3, 0x57, 0x8E, 0xD7, \n    0x41, 0xD5, 0x25, 0x6D, 0x43, 0xC3, 0xFA, 0x80, 0x66, 0xD1, 0xB5, 0x59, 0x14, 0x62, 0x78, 0xFA, \n    0x18, 0xA5, 0xED, 0xBD, 0x72, 0x03, 0x0E, 0x98, 0x20, 0xFD, 0xD6, 0x18, 0xFB, 0x99, 0xF5, 0xEF, \n    0x7A, 0xE4, 0x3E, 0x35, 0xFC, 0x3F, 0xD2, 0xFE, 0x38, 0xFC, 0x3A, 0xBE, 0xF0, 0xEE, 0xAB, 0x85, \n    0x8E, 0xE3, 0xF7, 0x96, 0xD7, 0x1B, 0x77, 0x3D, 0x94, 0xEA, 0x0E, 0xC9, 0x97, 0xDC, 0x64, 0x82, \n    0x38, 0xDC, 0xAC, 0xCB, 0x91, 0x9A, 0xF7, 0xF2, 0x1C, 0xD6, 0xAE, 0x06, 0xAD, 0xA5, 0xAD, 0x39, \n    0x68, 0xD3, 0xDB, 0xEE, 0x3C, 0xCC, 0xDF, 0x2B, 0xA5, 0x8E, 0xA3, 0xCB, 0x25, 0xEF, 0x2D, 0x53, \n    0xEA, 0x8F, 0xC7, 0xCF, 0xDB, 0x07, 0xF6, 0x58, 0x8F, 0xC0, 0x2F, 0x37, 0x8A, 0x3C, 0x3D, 0x6E, \n    0x57, 0x44, 0x95, 0xB1, 0x7B, 0x6A, 0xA3, 0x3F, 0xD9, 0xD2, 0x31, 0xC2, 0xB2, 0xFF, 0x00, 0xD3, \n    0x26, 0x62, 0x14, 0x67, 0xEE, 0xB1, 0x03, 0xA1, 0x51, 0x5F, 0x3B, 0xC9, 0x13, 0x23, 0x32, 0x9D, \n    0xB9, 0x07, 0x1C, 0x1C, 0x8F, 0xCC, 0x71, 0x5F, 0xA4, 0xDA, 0x75, 0xB5, 0xCE, 0x8D, 0xAB, 0x6A, \n    0xDE, 0x0D, 0xF1, 0x2D, 0xB4, 0x66, 0xFA, 0xC7, 0xCC, 0xB3, 0x9A, 0x19, 0x7E, 0x78, 0xEE, 0x22, \n    0xC6, 0x19, 0x79, 0xFB, 0xCA, 0x50, 0xE4, 0x1F, 0xE2, 0x46, 0x07, 0xEB, 0xF1, 0x1F, 0xED, 0x35, \n    0xF0, 0x2A, 0x4F, 0x81, 0xFF, 0x00, 0x11, 0x24, 0xB5, 0x87, 0xCD, 0x93, 0x47, 0xD4, 0x14, 0xDC, \n    0x69, 0xB3, 0xBF, 0x3B, 0x93, 0x38, 0x31, 0xB1, 0xE9, 0xBD, 0x0F, 0xCA, 0x7D, 0x46, 0xD6, 0xC0, \n    0x0E, 0x31, 0xF9, 0xF7, 0x89, 0xBC, 0x13, 0x4F, 0x05, 0x25, 0x9B, 0xE5, 0xCB, 0xF7, 0x35, 0x37, \n    0x4B, 0x68, 0xC9, 0xFE, 0x8F, 0xF0, 0x67, 0xD2, 0xF0, 0x1F, 0x13, 0xD5, 0xC4, 0x73, 0x65, 0x59, \n    0x83, 0xFD, 0xF5, 0x3D, 0x9F, 0xF3, 0xC7, 0xFC, 0xD7, 0x5F, 0x2D, 0x77, 0xB9, 0xE5, 0xF4, 0x50, \n    0x46, 0x0D, 0x15, 0xF8, 0xE1, 0xFA, 0x50, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, \n    0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0xF0, \n    0xB9, 0x38, 0xEB, 0xE9, 0x5F, 0x76, 0xFE, 0xC1, 0x5F, 0x02, 0x26, 0xF0, 0xF7, 0x81, 0x2C, 0xEE, \n    0x96, 0xDC, 0xC9, 0xE2, 0x0F, 0x1A, 0x3C, 0x65, 0x01, 0xFF, 0x00, 0x96, 0x56, 0xE4, 0xFE, 0xE5, \n    0x33, 0xD8, 0x36, 0x4C, 0xAC, 0x73, 0x82, 0x0A, 0x64, 0x02, 0x95, 0xF1, 0xFF, 0x00, 0xC1, 0x2F, \n    0x87, 0xAD, 0xF1, 0x57, 0xE2, 0xA6, 0x8B, 0xA1, 0x66, 0x45, 0x8F, 0x50, 0xB9, 0x51, 0x3B, 0x22, \n    0xE5, 0x92, 0x15, 0xCB, 0xCA, 0xC3, 0xFD, 0xD8, 0xD5, 0x8F, 0xE1, 0x5F, 0xAF, 0x1F, 0xB2, 0x17, \n    0x82, 0x61, 0xBA, 0xF1, 0x25, 0xE6, 0xB1, 0xE4, 0x47, 0x15, 0xAE, 0x8F, 0x08, 0xB7, 0xB4, 0x45, \n    0x5C, 0x2C, 0x6E, 0xE0, 0x8F, 0x97, 0xD9, 0x63, 0x05, 0x71, 0xFE, 0xD8, 0xAF, 0xDA, 0x3C, 0x25, \n    0xC9, 0xE0, 0xA7, 0x5B, 0x3B, 0xAD, 0x1D, 0x29, 0x69, 0x1B, 0xFF, 0x00, 0x33, 0xFF, 0x00, 0x25, \n    0x6F, 0xBC, 0xFC, 0xAB, 0xC4, 0xCC, 0xD2, 0x4E, 0x14, 0xB2, 0x8A, 0x2E, 0xCE, 0xAB, 0xBC, 0xBF, \n    0xC2, 0xBA, 0x7C, 0xDF, 0xE4, 0x7D, 0x4F, 0xFB, 0x33, 0x7C, 0x38, 0xB3, 0xF0, 0x3E, 0x9D, 0x69, \n    0x1C, 0x2A, 0x0D, 0xBE, 0x8F, 0x1F, 0x97, 0x1B, 0x91, 0x8F, 0x3A, 0x76, 0xE5, 0xE4, 0x3E, 0xFC, \n    0x93, 0xED, 0xB9, 0x71, 0xD0, 0x52, 0x78, 0xFB, 0xE2, 0x39, 0xF1, 0x67, 0x88, 0x1E, 0x44, 0x93, \n    0x36, 0xB0, 0x66, 0x3B, 0x71, 0xD8, 0xAF, 0x76, 0xFF, 0x00, 0x81, 0x1E, 0x7E, 0x98, 0x1D, 0xAA, \n    0x3F, 0x17, 0xF8, 0xA0, 0x78, 0x2B, 0xE1, 0xCA, 0xDA, 0xC6, 0xDB, 0x2E, 0x2F, 0x07, 0x93, 0xEE, \n    0x0B, 0x72, 0xE7, 0xF0, 0x19, 0x1F, 0x88, 0xAF, 0x33, 0x8F, 0x5E, 0xC7, 0xF1, 0x0A, 0xFB, 0x6A, \n    0x74, 0xE5, 0x89, 0xAF, 0x2C, 0x55, 0x4D, 0x5F, 0x43, 0xE6, 0xA4, 0xA3, 0x87, 0xA1, 0x1C, 0x3C, \n    0x3E, 0x67, 0x74, 0xBA, 0xEE, 0x7B, 0x8A, 0x1B, 0x5D, 0xDA, 0x3A, 0x8F, 0xCE, 0xB8, 0xA5, 0xF1, \n    0x06, 0x3F, 0x8A, 0x86, 0xD7, 0xF2, 0x7E, 0xF5, 0x75, 0x3C, 0x3D, 0xCE, 0x3E, 0x77, 0x73, 0xB0, \n    0x6D, 0x77, 0x07, 0xEF, 0x54, 0x72, 0x6B, 0x99, 0xEF, 0xDA, 0xB8, 0xE7, 0xD7, 0xBF, 0xDA, 0xA8, \n    0xDB, 0x5D, 0xDA, 0x3E, 0xF0, 0xA9, 0xF6, 0x26, 0xD1, 0xAA, 0x7D, 0xBD, 0xFB, 0x01, 0x7F, 0xC1, \n    0x43, 0xF4, 0xEF, 0x82, 0x5A, 0x68, 0xF0, 0x6F, 0x8D, 0x1E, 0x64, 0xF0, 0xCF, 0x98, 0xF2, 0xE9, \n    0xFA, 0x8C, 0x71, 0x34, 0xAD, 0xA6, 0x33, 0x9D, 0xCF, 0x14, 0x88, 0xB9, 0x66, 0x85, 0x98, 0x96, \n    0x0C, 0xA0, 0xB2, 0xB3, 0x10, 0x41, 0x52, 0x0C, 0x7F, 0x70, 0x59, 0xFE, 0xD4, 0xDF, 0x0D, 0x6F, \n    0xF4, 0x66, 0xD4, 0x21, 0xF1, 0xFF, 0x00, 0x83, 0x5A, 0xC5, 0x46, 0x5A, 0x7F, 0xED, 0x9B, 0x70, \n    0x89, 0xEC, 0xC4, 0xBF, 0xCA, 0x47, 0x70, 0x70, 0x45, 0x7E, 0x1D, 0xBE, 0xBF, 0x8F, 0xE2, 0xA8, \n    0xA4, 0xD6, 0xD4, 0x9C, 0xF1, 0xBB, 0xD7, 0x15, 0xF0, 0xF9, 0xB7, 0x00, 0xE1, 0x71, 0x95, 0xDD, \n    0x7A, 0x72, 0x70, 0x72, 0xD5, 0xDB, 0x55, 0x7E, 0xFE, 0x47, 0xD6, 0x65, 0xBC, 0x55, 0x5F, 0x0F, \n    0x49, 0x51, 0x92, 0x52, 0x4B, 0x6B, 0xEE, 0x97, 0x63, 0xF4, 0x3F, 0xF6, 0xF6, 0xFF, 0x00, 0x82, \n    0x97, 0x68, 0x7E, 0x26, 0xF0, 0x6E, 0xA1, 0xE0, 0x7F, 0x87, 0xB7, 0x7F, 0xDA, 0x0B, 0xAA, 0x23, \n    0x5B, 0x6A, 0xBA, 0xCA, 0x82, 0x90, 0x2C, 0x07, 0x21, 0xE1, 0xB7, 0x27, 0x06, 0x42, 0xE3, 0x21, \n    0xA4, 0xC6, 0xC0, 0x84, 0xED, 0x2C, 0xCD, 0xB9, 0x3E, 0x1C, 0x7D, 0x77, 0x8F, 0xBD, 0xFA, 0xD7, \n    0x1C, 0xDE, 0x20, 0xC1, 0x3F, 0x35, 0x47, 0x26, 0xBD, 0x9C, 0xFC, 0xD5, 0xEF, 0xE4, 0xFC, 0x3F, \n    0x87, 0xCB, 0xA8, 0xFB, 0x1C, 0x3F, 0x5D, 0xDB, 0xDD, 0xBF, 0x33, 0xCF, 0xC7, 0xE6, 0x95, 0xB1, \n    0x75, 0x7D, 0xAD, 0x5E, 0x9B, 0x2E, 0x89, 0x1D, 0x83, 0x6B, 0xDC, 0xFD, 0xEA, 0x89, 0xF5, 0xDE, \n    0x9F, 0x35, 0x71, 0xCF, 0xAF, 0xE3, 0xF8, 0xAA, 0x39, 0x35, 0xDC, 0xFF, 0x00, 0x15, 0x7A, 0x7E, \n    0xC0, 0xC2, 0x35, 0x0E, 0xBD, 0xB5, 0xEC, 0x7F, 0x15, 0x44, 0xFA, 0xF6, 0x7F, 0x8B, 0xBD, 0x71, \n    0xFF, 0x00, 0xDB, 0xDF, 0xED, 0x54, 0x52, 0x6B, 0xDC, 0x1F, 0x9B, 0xBD, 0x4F, 0xB1, 0xD6, 0xE6, \n    0xF1, 0xA9, 0x6D, 0x51, 0xE5, 0x1F, 0xB7, 0x47, 0x81, 0x4C, 0xA9, 0xA6, 0x78, 0xE3, 0x4D, 0x1E, \n    0x5D, 0xE6, 0x9E, 0xC9, 0x6B, 0x7E, 0xC8, 0x3E, 0xF2, 0x67, 0xF7, 0x32, 0x1F, 0xF7, 0x5B, 0xE4, \n    0x39, 0xEA, 0x1D, 0x07, 0x41, 0x5E, 0x0B, 0xF1, 0xF3, 0xE1, 0xD4, 0x3F, 0xB4, 0x37, 0xC0, 0xC9, \n    0x92, 0xCE, 0x11, 0x26, 0xA9, 0x6E, 0xA6, 0xF3, 0x4F, 0x00, 0x65, 0xD6, 0x64, 0xE1, 0xE2, 0x1D, \n    0xCE, 0xF0, 0x19, 0x00, 0xE0, 0x16, 0xF2, 0xC9, 0xE8, 0x2B, 0xEB, 0xEF, 0x15, 0xC1, 0x6D, 0xE3, \n    0x1F, 0x0C, 0xEA, 0x1A, 0x4D, 0xDB, 0x7F, 0xA3, 0xEA, 0x56, 0xEF, 0x6E, 0xE7, 0x19, 0xD9, 0xB8, \n    0x60, 0x30, 0xF7, 0x53, 0x82, 0x3D, 0xC0, 0xAF, 0x94, 0xBE, 0x13, 0x5F, 0xDC, 0x68, 0x7A, 0xCE, \n    0xA3, 0xA1, 0xDD, 0x1F, 0x2E, 0x68, 0x64, 0x62, 0x13, 0x3F, 0x72, 0x54, 0x3B, 0x1C, 0x7E, 0x83, \n    0xFE, 0xF9, 0x35, 0xF5, 0x99, 0x5E, 0x1E, 0x9E, 0x63, 0x97, 0xD4, 0xCA, 0xF1, 0x3B, 0x49, 0x35, \n    0xFE, 0x5F, 0x73, 0x3E, 0x63, 0x3C, 0x75, 0x30, 0x75, 0xE9, 0xE6, 0x98, 0x7D, 0x27, 0x4D, 0xA9, \n    0x7A, 0xAE, 0xA9, 0xFA, 0xAD, 0xFE, 0x67, 0xE7, 0x93, 0x44, 0x63, 0xFB, 0xDD, 0x8E, 0x08, 0xA8, \n    0xEB, 0xD5, 0xBF, 0x6B, 0xEF, 0x87, 0x03, 0xE1, 0xBF, 0xC7, 0x2D, 0x5A, 0x38, 0x21, 0xF2, 0x6C, \n    0x35, 0x5C, 0x6A, 0x36, 0xAA, 0x06, 0xD5, 0x55, 0x97, 0x25, 0x94, 0x0E, 0xCA, 0xB2, 0x07, 0x51, \n    0xEC, 0x82, 0xBC, 0xB7, 0x18, 0xAF, 0xE4, 0x5C, 0xD3, 0x2F, 0xA9, 0x82, 0xC5, 0xD4, 0xC2, 0x55, \n    0xDE, 0x12, 0x71, 0x7F, 0x26, 0x7F, 0x40, 0xE0, 0x31, 0x90, 0xC5, 0xE1, 0xA9, 0xE2, 0xA9, 0x6D, \n    0x34, 0x9A, 0xF9, 0xAB, 0x91, 0xD1, 0x45, 0x15, 0xE7, 0x9D, 0x41, 0x45, 0x14, 0x50, 0x01, 0x45, \n    0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, \n    0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x07, 0xD2, \n    0xDF, 0xF0, 0x4E, 0x8F, 0x08, 0xAE, 0xA3, 0xE3, 0x5D, 0x7F, 0x5C, 0x91, 0x15, 0x97, 0x4A, 0xB3, \n    0x5B, 0x58, 0xD8, 0xFF, 0x00, 0x04, 0x93, 0x31, 0x20, 0x8F, 0xF8, 0x04, 0x72, 0x0F, 0xF8, 0x15, \n    0x7E, 0xAE, 0x7E, 0xCD, 0x1A, 0x02, 0xF8, 0x7B, 0xE1, 0x46, 0x98, 0xEC, 0xBB, 0x5F, 0x50, 0x91, \n    0xEF, 0x65, 0xF7, 0xDC, 0xD8, 0x5F, 0xCD, 0x11, 0x2B, 0xF3, 0x7F, 0xFE, 0x09, 0xE7, 0xA1, 0x2E, \n    0x9F, 0xF0, 0x6B, 0x54, 0xD4, 0x30, 0x04, 0x97, 0xFA, 0xA3, 0xC4, 0x7D, 0x4A, 0xC5, 0x14, 0x64, \n    0x1F, 0xA6, 0x65, 0x61, 0xF5, 0x06, 0xBF, 0x52, 0x3C, 0x1B, 0x60, 0x34, 0xBF, 0x0B, 0x69, 0x56, \n    0x20, 0x63, 0xEC, 0xB6, 0x90, 0xC0, 0x3E, 0xAA, 0x8A, 0xBF, 0xD2, 0xBF, 0xA7, 0x38, 0x5B, 0x06, \n    0xB0, 0xDC, 0x2B, 0x86, 0xA7, 0x1D, 0x1D, 0x49, 0x39, 0x3F, 0xBE, 0xDF, 0x95, 0x8F, 0xE7, 0xFE, \n    0x21, 0xC4, 0x3C, 0x47, 0x13, 0x57, 0x9C, 0xB5, 0x54, 0xD4, 0x62, 0xBE, 0xE4, 0xDF, 0xE3, 0x73, \n    0x97, 0xF8, 0xCD, 0xE3, 0x5F, 0xB6, 0x78, 0x9E, 0x3B, 0x51, 0x26, 0xE4, 0xB1, 0x88, 0x64, 0x67, \n    0xF8, 0xDF, 0x0C, 0x7F, 0xF1, 0xDD, 0x95, 0xC9, 0xAF, 0x88, 0x71, 0xFC, 0x55, 0xE2, 0xDE, 0x3A, \n    0xF8, 0xB1, 0xAA, 0x5C, 0xFC, 0x4A, 0xD7, 0xAE, 0xAD, 0xEF, 0x19, 0xAD, 0xA5, 0xD4, 0x26, 0xF2, \n    0xA3, 0x70, 0x1D, 0x44, 0x61, 0xC8, 0x40, 0x33, 0xD3, 0xE5, 0x03, 0xA6, 0x2A, 0x5D, 0x3F, 0xE3, \n    0x3C, 0xC0, 0x01, 0x75, 0x68, 0x8C, 0x7B, 0xB4, 0x4F, 0xB7, 0xF4, 0x39, 0xFE, 0x75, 0xF6, 0x74, \n    0xB2, 0x0A, 0xD4, 0xE8, 0xC5, 0x42, 0xCF, 0x4B, 0x9E, 0x1D, 0x4C, 0xF2, 0x84, 0xEA, 0x37, 0x3B, \n    0xAF, 0xEB, 0xC8, 0xF6, 0x61, 0xE2, 0x3D, 0xA3, 0xEF, 0x52, 0xB7, 0x88, 0xBF, 0xDA, 0xCD, 0x79, \n    0x75, 0xBF, 0xC5, 0x9D, 0x3E, 0x61, 0xF3, 0x49, 0x34, 0x27, 0xFE, 0x9A, 0x27, 0xFF, 0x00, 0x13, \n    0x9A, 0xBD, 0x0F, 0x8E, 0xAC, 0xEE, 0x07, 0xC9, 0x79, 0x01, 0xF6, 0xF3, 0x00, 0x3F, 0x91, 0xAC, \n    0xA7, 0x97, 0xD5, 0x8F, 0xC5, 0x16, 0x6B, 0x4F, 0x19, 0x46, 0x6E, 0xF1, 0x92, 0x67, 0xA0, 0x3F, \n    0x88, 0x3F, 0xDA, 0xFC, 0xEB, 0xEB, 0xFF, 0x00, 0xD9, 0x76, 0xDF, 0xF6, 0x44, 0xF8, 0x8D, 0xE1, \n    0xCF, 0x0D, 0xE8, 0xDE, 0x34, 0xBC, 0xF1, 0x46, 0x85, 0xE3, 0x0B, 0xAB, 0x58, 0x20, 0xBE, 0xB9, \n    0xBD, 0xBA, 0xB8, 0xB6, 0xD3, 0xE7, 0xBD, 0x20, 0x09, 0x36, 0x4A, 0x85, 0xA3, 0x8D, 0x0B, 0x67, \n    0x06, 0x42, 0x8B, 0x8C, 0x74, 0x38, 0x15, 0xF0, 0x40, 0xF1, 0x0E, 0xF5, 0xCA, 0xB6, 0xE1, 0xEA, \n    0x0E, 0x6A, 0x39, 0xB5, 0xE5, 0x91, 0x19, 0x5B, 0xE6, 0x56, 0x18, 0x39, 0xEE, 0x2B, 0xC5, 0xCD, \n    0x32, 0x79, 0x62, 0xE9, 0x72, 0xC6, 0xAC, 0xE9, 0xB5, 0xD6, 0x2E, 0xCF, 0xE7, 0xDD, 0x79, 0x1E, \n    0xBE, 0x5D, 0x98, 0x2A, 0x15, 0x39, 0xB9, 0x23, 0x34, 0xFA, 0x3D, 0x7E, 0xE3, 0xF7, 0x08, 0x7F, \n    0xC1, 0x19, 0x3E, 0x07, 0xB0, 0xCF, 0xF6, 0x6F, 0x88, 0xB0, 0x7F, 0xEA, 0x37, 0x3F, 0xF8, 0xD3, \n    0x7F, 0xE1, 0xCC, 0x1F, 0x03, 0x49, 0xFF, 0x00, 0x90, 0x6F, 0x88, 0xBF, 0xF0, 0x77, 0x3F, 0xF8, \n    0xD7, 0x69, 0xFF, 0x00, 0x04, 0xC8, 0xF8, 0x91, 0x75, 0xF1, 0x67, 0xF6, 0x0E, 0xF8, 0x65, 0xAC, \n    0x5F, 0x4D, 0x25, 0xC5, 0xD7, 0xF6, 0x42, 0xD8, 0xCB, 0x2C, 0x8C, 0x59, 0xE5, 0x6B, 0x57, 0x7B, \n    0x6D, 0xCC, 0x4F, 0x25, 0x8F, 0x93, 0x92, 0x4F, 0x24, 0x92, 0x6B, 0xDF, 0x02, 0xED, 0x61, 0x5F, \n    0xCE, 0x38, 0xBC, 0xF3, 0x36, 0xA1, 0x5E, 0x78, 0x79, 0xE2, 0x27, 0x78, 0xB6, 0xBE, 0x27, 0xD1, \n    0xD8, 0xFD, 0x9B, 0x0B, 0x96, 0xE0, 0x2B, 0x52, 0x8D, 0x58, 0xD2, 0x8D, 0xA4, 0x93, 0xDB, 0xB9, \n    0xF1, 0x0F, 0xC7, 0x2F, 0xF8, 0x24, 0x6F, 0xC1, 0x9F, 0x00, 0x7C, 0x17, 0xF1, 0x76, 0xBB, 0xA7, \n    0xE9, 0xBA, 0xF2, 0xDF, 0x68, 0xDA, 0x35, 0xE5, 0xFD, 0xB3, 0x3E, 0xB1, 0x3B, 0x2A, 0xCB, 0x14, \n    0x0E, 0xE8, 0x48, 0xCE, 0x08, 0x0C, 0xA3, 0x83, 0xD6, 0xBF, 0x24, 0x57, 0xC4, 0x25, 0xE1, 0x56, \n    0xDD, 0xF7, 0x80, 0xAF, 0xE8, 0x2B, 0xF6, 0xB5, 0x7F, 0x2F, 0xF6, 0x56, 0xF8, 0x94, 0xDF, 0xDD, \n    0xF0, 0xB6, 0xA6, 0x7F, 0xF2, 0x52, 0x5A, 0xFE, 0x6F, 0xA2, 0xF1, 0x07, 0xEE, 0x13, 0xE6, 0xE8, \n    0xA2, 0xBF, 0x4E, 0xF0, 0xDF, 0x19, 0x89, 0xC6, 0xD2, 0xAC, 0xF1, 0x53, 0x94, 0xF9, 0x5C, 0x6D, \n    0x76, 0xDD, 0xB7, 0x3E, 0x2F, 0x8B, 0xB0, 0xB4, 0x30, 0xF5, 0x29, 0xAA, 0x11, 0x51, 0xBD, 0xEF, \n    0x6D, 0x3A, 0xD8, 0xEC, 0xDF, 0x5F, 0xE7, 0xEF, 0x54, 0x6F, 0xAF, 0x7F, 0xB5, 0xFA, 0xD7, 0x1B, \n    0xFD, 0xB8, 0xC7, 0xBB, 0x1A, 0xA7, 0x79, 0xE3, 0x3B, 0x5B, 0x30, 0x7C, 0xEB, 0xBB, 0x78, 0x7F, \n    0xDF, 0x95, 0x57, 0xF9, 0x9A, 0xFD, 0x3B, 0xEA, 0xD2, 0x7B, 0x23, 0xE4, 0xD5, 0x54, 0x77, 0x27, \n    0x5F, 0xC8, 0xFB, 0xD5, 0x14, 0x9A, 0xF7, 0x1F, 0x7A, 0xBC, 0xD2, 0xFF, 0x00, 0xE3, 0x06, 0x8F, \n    0x62, 0x0E, 0xEB, 0xE5, 0x91, 0xBB, 0x08, 0x91, 0x9F, 0x3F, 0x8E, 0x31, 0xFA, 0xD6, 0x06, 0xA9, \n    0xFB, 0x43, 0x5B, 0xC6, 0x3F, 0xD1, 0x6C, 0x6E, 0xA6, 0x3D, 0x33, 0x2B, 0x88, 0xC7, 0xE9, 0xBB, \n    0xFA, 0x56, 0x91, 0xCB, 0xAA, 0xCB, 0x68, 0x8F, 0xEB, 0x94, 0xE3, 0xBB, 0x3D, 0x95, 0xB5, 0xEF, \n    0xF6, 0xAB, 0xE7, 0xCF, 0x89, 0xC7, 0xFE, 0x11, 0x6F, 0x8F, 0xAD, 0x78, 0xBF, 0x24, 0x37, 0x92, \n    0xC5, 0x72, 0x7E, 0x92, 0x0D, 0x92, 0x1F, 0xC5, 0xB7, 0x9A, 0xA5, 0xAE, 0xFC, 0x73, 0xD7, 0xEF, \n    0xD5, 0x96, 0x09, 0x20, 0xB1, 0x5F, 0xFA, 0x63, 0x1E, 0x5B, 0xFE, 0xFA, 0x6C, 0xFE, 0x63, 0x15, \n    0xC5, 0xEA, 0xFA, 0xA5, 0xD6, 0xAD, 0x76, 0x66, 0xBA, 0xB9, 0x9E, 0xEA, 0x63, 0x81, 0xE6, 0x4B, \n    0x21, 0x76, 0xFC, 0xCD, 0x7B, 0x19, 0x6E, 0x5F, 0x3C, 0x3C, 0xFD, 0xA3, 0x39, 0x31, 0x98, 0x88, \n    0x62, 0x29, 0xBA, 0x7D, 0x2D, 0x6F, 0x91, 0x91, 0xFF, 0x00, 0x05, 0x1B, 0xF0, 0x70, 0xB8, 0xF0, \n    0x9F, 0x87, 0x75, 0xF8, 0xD3, 0xE6, 0xB3, 0xB9, 0x92, 0xC2, 0x66, 0xC7, 0x24, 0x48, 0xBE, 0x64, \n    0x63, 0xF0, 0x29, 0x2F, 0xFD, 0xF5, 0xF9, 0xFC, 0x90, 0x0E, 0x14, 0x6E, 0xFF, 0x00, 0xF5, 0x57, \n    0xDE, 0x1F, 0xB6, 0x26, 0x9F, 0xFF, 0x00, 0x09, 0x27, 0xEC, 0xC1, 0xAD, 0x5D, 0x30, 0xFD, 0xE5, \n    0xA8, 0xB5, 0xBC, 0x8C, 0x75, 0xC1, 0x32, 0xC6, 0x84, 0x8F, 0xF8, 0x0C, 0xAD, 0xF8, 0x66, 0xBE, \n    0x0E, 0xDD, 0xF2, 0xFF, 0x00, 0x4A, 0xFE, 0x77, 0xF1, 0x7B, 0x02, 0xA8, 0x71, 0x0C, 0xAA, 0x47, \n    0x4F, 0x69, 0x18, 0xCB, 0xF0, 0xB7, 0xE8, 0x7E, 0x85, 0xE1, 0x7E, 0x31, 0xD6, 0xC8, 0xE3, 0x4E, \n    0x5B, 0xD3, 0x94, 0xA3, 0xF8, 0xDF, 0xF5, 0x23, 0xA2, 0x8A, 0x2B, 0xF2, 0xD3, 0xF4, 0x20, 0xA2, \n    0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, \n    0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, \n    0x8A, 0x28, 0x03, 0xEE, 0x5F, 0xD8, 0x48, 0x81, 0xFB, 0x3B, 0xC5, 0xB5, 0x55, 0x7F, 0xE2, 0x61, \n    0x71, 0xB8, 0x8F, 0xE2, 0x38, 0x8F, 0x93, 0xF8, 0x60, 0x7E, 0x15, 0xFA, 0x7B, 0x71, 0x76, 0xBA, \n    0x74, 0x52, 0x4F, 0xFC, 0x36, 0xEA, 0x64, 0xFC, 0x14, 0x67, 0xFA, 0x57, 0xE6, 0x07, 0xEC, 0x13, \n    0x74, 0x2E, 0xFF, 0x00, 0x67, 0xCD, 0x8A, 0xC0, 0x9B, 0x7D, 0x52, 0xE2, 0x3D, 0xB8, 0xE4, 0x0F, \n    0x2E, 0x06, 0xCF, 0x4E, 0xFB, 0xCF, 0xA9, 0xE3, 0xD3, 0x15, 0xFA, 0x4B, 0x3E, 0xA3, 0xFD, 0xAD, \n    0xF0, 0xFA, 0x5B, 0x94, 0x39, 0xFB, 0x56, 0x96, 0xD2, 0xAF, 0xBE, 0xE8, 0x49, 0x1F, 0xCE, 0xBF, \n    0xAB, 0xB2, 0xBB, 0x4B, 0x20, 0xCB, 0xDA, 0xDB, 0x96, 0xDF, 0x97, 0xF9, 0x1F, 0xCE, 0xB8, 0xCB, \n    0xC3, 0x3D, 0xC7, 0x45, 0xEE, 0xE5, 0x73, 0xE1, 0x78, 0x6E, 0x37, 0xAE, 0xE6, 0xCB, 0x33, 0x72, \n    0x4F, 0xBD, 0x4B, 0x1C, 0x80, 0x35, 0x50, 0xB7, 0x97, 0xE4, 0x5F, 0xA5, 0x4C, 0x92, 0xFA, 0x57, \n    0xEB, 0x14, 0xE5, 0xEE, 0xD9, 0x9F, 0x01, 0x52, 0x1E, 0xF3, 0x2E, 0x09, 0xF0, 0x29, 0xA2, 0x66, \n    0x2B, 0x55, 0xCC, 0xE5, 0x45, 0x02, 0x72, 0xD4, 0xEE, 0x8C, 0xF9, 0x09, 0xCC, 0xCC, 0xA7, 0x20, \n    0xED, 0xF7, 0xA7, 0xFF, 0x00, 0x6B, 0xDD, 0x45, 0xF7, 0x2E, 0x6E, 0x17, 0xE9, 0x21, 0x15, 0x4D, \n    0xA4, 0xCF, 0x53, 0x51, 0xBC, 0x95, 0x32, 0x51, 0x66, 0xB0, 0xE6, 0x5B, 0x1F, 0xD1, 0x57, 0xFC, \n    0x10, 0xC6, 0xE5, 0xAE, 0xBF, 0xE0, 0x96, 0xBF, 0x0B, 0xE4, 0x91, 0x9A, 0x49, 0x08, 0xD5, 0x32, \n    0xCC, 0x72, 0x4F, 0xFC, 0x4D, 0x6F, 0x07, 0x5A, 0xFA, 0xE0, 0x8C, 0xFF, 0x00, 0x3A, 0xF9, 0x17, \n    0xFE, 0x08, 0x47, 0xCF, 0xFC, 0x12, 0xB7, 0xE1, 0x6F, 0xD3, 0x55, 0xFF, 0x00, 0xD3, 0xAD, 0xE5, \n    0x7D, 0x79, 0x5F, 0xC2, 0xBC, 0x4F, 0xFF, 0x00, 0x23, 0x8C, 0x5F, 0xFD, 0x7C, 0x9F, 0xFE, 0x94, \n    0xCF, 0xEB, 0x1E, 0x1F, 0xFF, 0x00, 0x91, 0x66, 0x1F, 0xFC, 0x11, 0xFF, 0x00, 0xD2, 0x51, 0xE5, \n    0xFF, 0x00, 0xB6, 0x9C, 0xA6, 0x3F, 0xD8, 0xF7, 0xE2, 0xA3, 0x29, 0x2A, 0xCB, 0xE1, 0x0D, 0x58, \n    0x82, 0x3A, 0x83, 0xF6, 0x39, 0xAB, 0xF9, 0x5D, 0x3A, 0xFD, 0xF3, 0xC0, 0xB9, 0xBD, 0xBC, 0x23, \n    0x03, 0x8F, 0x39, 0xB1, 0xFC, 0xEB, 0xFA, 0x9F, 0xFD, 0xB5, 0xFF, 0x00, 0xE4, 0xCE, 0x3E, 0x2B, \n    0xFF, 0x00, 0xD8, 0x9F, 0xAB, 0xFF, 0x00, 0xE9, 0x14, 0xD5, 0xFC, 0xA8, 0x2B, 0xE2, 0x05, 0xFA, \n    0x0A, 0xFD, 0xA7, 0xC1, 0x18, 0xA7, 0x47, 0x15, 0x7E, 0xF1, 0xFC, 0x99, 0xF9, 0xBF, 0x89, 0x8D, \n    0xAA, 0xD4, 0x6D, 0xD9, 0xFE, 0x68, 0x5B, 0xBB, 0xB9, 0x2E, 0x8F, 0xEF, 0x24, 0x92, 0x4F, 0xF7, \n    0x98, 0x9A, 0xA7, 0x37, 0xDE, 0xA9, 0x64, 0x7A, 0xAA, 0xEF, 0xB4, 0x67, 0xF2, 0xAF, 0xDD, 0xAC, \n    0x91, 0xF9, 0xA5, 0x3B, 0x91, 0xDC, 0x38, 0xC7, 0x4A, 0xAB, 0x33, 0x11, 0xF8, 0x54, 0x8E, 0x72, \n    0xDF, 0x4A, 0xAF, 0x2B, 0x56, 0x72, 0x3B, 0x29, 0xC4, 0x86, 0x53, 0x96, 0xAA, 0xD3, 0x3F, 0xCD, \n    0x53, 0xC8, 0xFD, 0x7F, 0x2A, 0xA9, 0x2B, 0x13, 0x91, 0xE9, 0xCD, 0x66, 0xF4, 0x3B, 0xE9, 0xC6, \n    0xE7, 0x75, 0xFB, 0x43, 0xB8, 0xFF, 0x00, 0x86, 0x4C, 0xD6, 0xF7, 0x2A, 0xBE, 0xED, 0x2A, 0xD7, \n    0x82, 0x33, 0xCE, 0xE8, 0x79, 0xFC, 0x0F, 0x3F, 0x51, 0x5F, 0x01, 0x7D, 0xDF, 0xFF, 0x00, 0x5D, \n    0x7D, 0xFF, 0x00, 0xFB, 0x50, 0x49, 0xFD, 0x8B, 0xFB, 0x2A, 0xF8, 0x89, 0x5B, 0x6A, 0xB4, 0x76, \n    0x36, 0xD0, 0x00, 0x46, 0x72, 0x4C, 0xD0, 0xC6, 0x40, 0xF7, 0x00, 0x93, 0xCF, 0xA7, 0xAD, 0x7E, \n    0x7F, 0xB0, 0xDA, 0x6B, 0xF9, 0xD7, 0xC6, 0xD6, 0xBF, 0xB5, 0xE8, 0x47, 0xAA, 0xA4, 0xBF, 0xF4, \n    0xA9, 0x1F, 0x7B, 0xE1, 0x3E, 0xB9, 0x6D, 0x69, 0xF4, 0x75, 0x65, 0xF9, 0x44, 0x4A, 0x28, 0xA2, \n    0xBF, 0x17, 0x3F, 0x52, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, \n    0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, \n    0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x3E, 0xB6, 0xFF, 0x00, 0x82, 0x6F, 0xF8, 0x91, \n    0x66, 0xD0, 0x7C, 0x51, 0xA4, 0xBC, 0x80, 0x34, 0x33, 0x41, 0x79, 0x0A, 0x77, 0x21, 0x83, 0xA4, \n    0x87, 0xF0, 0xDB, 0x1F, 0xE7, 0xF4, 0xAF, 0xD3, 0x6F, 0x81, 0xFA, 0xAA, 0xF8, 0xA7, 0xE1, 0x3E, \n    0x92, 0x92, 0x37, 0xFA, 0xB8, 0x4D, 0x94, 0x9D, 0xF6, 0xEC, 0x25, 0x06, 0x7F, 0xE0, 0x1B, 0x4F, \n    0xE3, 0x5F, 0x8E, 0xFF, 0x00, 0xB1, 0x1F, 0x8E, 0xBF, 0xE1, 0x0B, 0xF8, 0xF9, 0xA7, 0xDB, 0xC9, \n    0x27, 0x97, 0x6D, 0xAF, 0xC6, 0xFA, 0x5C, 0xA7, 0x6E, 0x4B, 0x33, 0xE1, 0xA2, 0x1F, 0x8C, 0xC9, \n    0x18, 0xCF, 0xA1, 0x35, 0xFA, 0x97, 0xFB, 0x28, 0x78, 0xB0, 0x43, 0x2E, 0xA5, 0xA2, 0xC8, 0xD8, \n    0xDF, 0x8B, 0xD8, 0x07, 0xB8, 0xC2, 0xC9, 0xF8, 0xE3, 0x61, 0xFC, 0x0D, 0x7F, 0x4D, 0x70, 0x16, \n    0x2D, 0x63, 0x38, 0x59, 0x53, 0x8F, 0xC5, 0x42, 0x4D, 0x7C, 0x9E, 0xB7, 0xFC, 0x7F, 0x03, 0xF0, \n    0x7E, 0x2E, 0xC2, 0xBC, 0x27, 0x13, 0xFB, 0x47, 0xF0, 0xD7, 0x8A, 0xFB, 0xD6, 0x8F, 0xF2, 0xFC, \n    0x4F, 0x97, 0xCA, 0xB5, 0xB3, 0x34, 0x72, 0x7C, 0xB2, 0x46, 0x76, 0x30, 0x3D, 0x88, 0xE0, 0xD3, \n    0x84, 0xBF, 0x2D, 0x74, 0x1F, 0x1B, 0xBC, 0x3D, 0xFF, 0x00, 0x08, 0xB7, 0xC5, 0xEF, 0x12, 0x59, \n    0xED, 0xF2, 0xD5, 0x6F, 0xE4, 0x96, 0x31, 0xE9, 0x1C, 0x87, 0xCC, 0x4F, 0xFC, 0x75, 0xD6, 0xB9, \n    0x81, 0x21, 0x55, 0xEB, 0xC9, 0xAF, 0xD8, 0x68, 0x54, 0xE7, 0xA6, 0xA7, 0xDD, 0x5C, 0xFC, 0xFA, \n    0xBD, 0x1E, 0x59, 0xB8, 0xBE, 0x8E, 0xC5, 0xA1, 0x36, 0x28, 0x69, 0xF2, 0x3B, 0xD5, 0x5D, 0xF4, \n    0x79, 0xAD, 0x5B, 0x5D, 0x9C, 0xFE, 0xCC, 0xB0, 0x65, 0xC8, 0xA8, 0xDA, 0x5E, 0x2A, 0x12, 0xE5, \n    0xBF, 0x8A, 0x9A, 0xD2, 0x62, 0x97, 0x33, 0x2E, 0x30, 0x3F, 0xA3, 0x8F, 0xF8, 0x20, 0xE9, 0xDD, \n    0xFF, 0x00, 0x04, 0xAA, 0xF8, 0x5B, 0xF4, 0xD5, 0x7F, 0xF4, 0xED, 0x79, 0x5F, 0x5F, 0x57, 0xC7, \n    0xDF, 0xF0, 0x41, 0x93, 0xFF, 0x00, 0x1A, 0xA6, 0xF8, 0x55, 0xF4, 0xD5, 0x7F, 0xF4, 0xED, 0x7B, \n    0x5F, 0x60, 0x81, 0x83, 0x5F, 0xC3, 0x5C, 0x4D, 0xFF, 0x00, 0x23, 0x8C, 0x5F, 0xFD, 0x7D, 0x9F, \n    0xFE, 0x94, 0xCF, 0xEA, 0x8C, 0x85, 0x5B, 0x2D, 0xC3, 0xFF, 0x00, 0x82, 0x3F, 0xFA, 0x4A, 0x3C, \n    0xB7, 0xF6, 0xDA, 0x3F, 0xF1, 0x87, 0x3F, 0x16, 0x3F, 0xEC, 0x4F, 0xD5, 0xFF, 0x00, 0xF4, 0x8A, \n    0x6A, 0xFE, 0x52, 0x55, 0xFF, 0x00, 0x74, 0xBF, 0x41, 0x5F, 0xD5, 0xA7, 0xED, 0xB9, 0xFF, 0x00, \n    0x26, 0x6D, 0xF1, 0x6B, 0xFE, 0xC4, 0xED, 0x5F, 0xFF, 0x00, 0x48, 0xA6, 0xAF, 0xE5, 0x15, 0x24, \n    0xCC, 0x0B, 0xFE, 0xE8, 0xFC, 0x2B, 0xF6, 0x9F, 0x04, 0x7F, 0x83, 0x8A, 0xF5, 0x8F, 0xE4, 0xCF, \n    0xCE, 0x7C, 0x4A, 0x57, 0xAD, 0x45, 0xF9, 0x3F, 0xD0, 0x24, 0x7D, 0xC6, 0xAB, 0x4F, 0x2E, 0xFA, \n    0x7C, 0xD2, 0xED, 0x18, 0xAA, 0xCC, 0xDC, 0xE7, 0xF2, 0xAF, 0xDD, 0x59, 0xF9, 0xBD, 0x38, 0x8D, \n    0x66, 0xCD, 0x56, 0x99, 0xE9, 0xF2, 0xBD, 0x57, 0x77, 0xE7, 0x3F, 0x95, 0x65, 0x29, 0x1D, 0x94, \n    0xE2, 0x32, 0x79, 0x36, 0xD4, 0xFE, 0x19, 0xD3, 0x06, 0xB5, 0xE2, 0x2B, 0x2B, 0x56, 0xFF, 0x00, \n    0x96, 0xF3, 0x22, 0xB7, 0xB2, 0xE7, 0x9F, 0xC8, 0x66, 0xA9, 0xCA, 0xE5, 0x8E, 0x3D, 0x2B, 0xB3, \n    0xF8, 0x21, 0xA1, 0xFD, 0xB7, 0x5F, 0x9B, 0x50, 0x75, 0xF9, 0x2C, 0x93, 0x6A, 0x1F, 0xF6, 0x9F, \n    0x23, 0xF4, 0x5D, 0xDF, 0x98, 0xA2, 0x9C, 0x5C, 0xE6, 0x97, 0x73, 0x4C, 0x5D, 0x65, 0x43, 0x0F, \n    0x3A, 0xBE, 0x5F, 0x8F, 0x4F, 0xC4, 0xC1, 0xFF, 0x00, 0x82, 0x81, 0xF8, 0x9D, 0x34, 0xBF, 0x82, \n    0x70, 0xD8, 0x09, 0x19, 0x67, 0xD5, 0xF5, 0x18, 0xD7, 0x67, 0xF7, 0xA3, 0x8D, 0x5D, 0xD8, 0xFE, \n    0x0D, 0xE5, 0x7E, 0x75, 0xF1, 0x30, 0x38, 0x26, 0xBE, 0x87, 0xFF, 0x00, 0x82, 0x87, 0xF8, 0xE4, \n    0x6B, 0x9F, 0x12, 0x74, 0xCF, 0x0F, 0xC5, 0x23, 0x34, 0x3A, 0x0D, 0xA7, 0x99, 0x2A, 0x9F, 0xE1, \n    0x9E, 0x7C, 0x39, 0x1F, 0xF7, 0xED, 0x62, 0xFC, 0x73, 0x5F, 0x3C, 0x02, 0x46, 0x2B, 0xF9, 0x37, \n    0xC5, 0x0C, 0xD2, 0x38, 0xDE, 0x21, 0xAC, 0xE0, 0xEF, 0x18, 0x5A, 0x2B, 0xFE, 0xDD, 0xDF, 0xF1, \n    0xB9, 0xFA, 0xF7, 0x87, 0x99, 0x7B, 0xC2, 0x64, 0x54, 0x63, 0x25, 0x67, 0x3B, 0xC9, 0xFF, 0x00, \n    0xDB, 0xCF, 0x4F, 0xC2, 0xC3, 0x28, 0xA2, 0x8A, 0xFC, 0xF4, 0xFB, 0x60, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, \n    0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x02, \n    0xE6, 0x9F, 0x7D, 0x36, 0x9D, 0x79, 0x0C, 0xF0, 0xB3, 0xC7, 0x2C, 0x2E, 0x1D, 0x1D, 0x5B, 0x6B, \n    0x29, 0x07, 0x20, 0x83, 0xD8, 0x83, 0xDE, 0xBF, 0x4B, 0xFF, 0x00, 0x67, 0x6F, 0x8D, 0x0D, 0xE2, \n    0x8F, 0x0E, 0x78, 0x6F, 0xC6, 0x76, 0x7E, 0x5B, 0x5C, 0x32, 0x87, 0xB9, 0x85, 0x08, 0x50, 0x25, \n    0x5C, 0xA4, 0xF1, 0x60, 0x7D, 0xD0, 0x4E, 0xFC, 0x03, 0xCE, 0xD7, 0x53, 0xDC, 0x57, 0xE6, 0x36, \n    0x77, 0x37, 0x5A, 0xFA, 0x0B, 0xF6, 0x13, 0xF8, 0xDC, 0xBE, 0x09, 0xF1, 0xA4, 0x9E, 0x17, 0xD4, \n    0x66, 0xDB, 0xA5, 0xF8, 0x81, 0xD4, 0x5B, 0xB3, 0x1F, 0x96, 0xDE, 0xEF, 0xA2, 0x1F, 0x61, 0x20, \n    0xF9, 0x0F, 0x1F, 0x7B, 0xCB, 0x24, 0x80, 0xA6, 0xBF, 0x4F, 0xF0, 0xBF, 0x89, 0x21, 0x96, 0xE6, \n    0x6F, 0x0B, 0x88, 0x76, 0xA5, 0x59, 0x72, 0xBE, 0xC9, 0xF4, 0x7F, 0x8B, 0x5F, 0x33, 0xF3, 0xFF, \n    0x00, 0x11, 0x32, 0x19, 0xE3, 0xF2, 0xEF, 0xAC, 0x61, 0xD7, 0xEF, 0x68, 0xBE, 0x65, 0xE6, 0xBA, \n    0xAF, 0xD7, 0xE4, 0x7D, 0xC9, 0xFB, 0x67, 0xE8, 0xB0, 0xCD, 0xE2, 0x7D, 0x17, 0xC5, 0x16, 0x27, \n    0xCC, 0xB1, 0xF1, 0x15, 0x88, 0x5F, 0x30, 0x0E, 0xB2, 0x47, 0x8C, 0x13, 0xE8, 0x4C, 0x6E, 0x83, \n    0x07, 0xFB, 0x87, 0xD2, 0xBC, 0x54, 0x4F, 0xC7, 0x5A, 0xF6, 0xA9, 0xA6, 0x3E, 0x3B, 0xF8, 0x5D, \n    0xA8, 0x78, 0x46, 0x7F, 0x9A, 0xE6, 0x27, 0xFE, 0xD0, 0xD1, 0x49, 0xEA, 0x2E, 0x13, 0x3B, 0xA0, \n    0xFF, 0x00, 0xB6, 0xAA, 0x5D, 0x54, 0x7F, 0x7D, 0x87, 0x5C, 0xF1, 0xE1, 0x69, 0x2E, 0xEE, 0x41, \n    0xAF, 0xEA, 0x2C, 0x1D, 0x39, 0x51, 0x83, 0xA1, 0x2F, 0xB3, 0xB7, 0x9A, 0x7B, 0x1F, 0x88, 0xFB, \n    0x68, 0x62, 0x52, 0xAD, 0x1E, 0xBB, 0xF9, 0x3E, 0xA5, 0xC1, 0x2E, 0x7B, 0xD0, 0x65, 0xC7, 0x7A, \n    0xAB, 0xE6, 0x37, 0xAD, 0x1E, 0x63, 0x7A, 0xD7, 0x59, 0x9F, 0x21, 0x68, 0xCD, 0xC7, 0x5A, 0x8D, \n    0xA7, 0xAA, 0xFE, 0x66, 0x7B, 0xD3, 0x5E, 0x5D, 0x87, 0xEB, 0x46, 0x85, 0x46, 0x9F, 0x43, 0xFA, \n    0x48, 0xFF, 0x00, 0x82, 0x0A, 0xB6, 0xEF, 0xF8, 0x25, 0x17, 0xC2, 0x93, 0xFE, 0xCE, 0xAB, 0xFF, \n    0x00, 0xA7, 0x6B, 0xDA, 0xFB, 0x0A, 0xBE, 0x3E, 0xFF, 0x00, 0x82, 0x0D, 0xDB, 0x3D, 0x9F, 0xFC, \n    0x12, 0x8B, 0xE1, 0x32, 0xC8, 0xBB, 0x59, 0xA1, 0xD4, 0xA4, 0x19, 0xEE, 0x1B, 0x54, 0xBC, 0x60, \n    0x7F, 0x10, 0x41, 0xAF, 0xAF, 0xC7, 0x2B, 0x5F, 0xC3, 0xBC, 0x4C, 0xFF, 0x00, 0xE1, 0x63, 0x17, \n    0xFF, 0x00, 0x5F, 0x27, 0xFF, 0x00, 0xA5, 0x33, 0xFA, 0x73, 0x24, 0x56, 0xCB, 0xE8, 0x2F, 0xEE, \n    0x47, 0xF2, 0x47, 0x96, 0xFE, 0xDC, 0x3F, 0xF2, 0x66, 0x3F, 0x16, 0xBF, 0xEC, 0x4E, 0xD6, 0x3F, \n    0xF4, 0x8A, 0x6A, 0xFE, 0x4F, 0x44, 0xD8, 0x81, 0x7E, 0x82, 0xBF, 0xAC, 0x4F, 0xDB, 0x42, 0xCA, \n    0x4B, 0xEF, 0xD9, 0x0B, 0xE2, 0xA5, 0xBC, 0x6B, 0xBA, 0x4B, 0x8F, 0x08, 0x6A, 0xD1, 0xAA, 0x8E, \n    0xE4, 0xD9, 0x4C, 0x00, 0xAF, 0xE4, 0xCE, 0x29, 0x7F, 0x72, 0xA7, 0x76, 0x37, 0x28, 0x20, 0x57, \n    0xED, 0x1E, 0x08, 0xBF, 0xDC, 0xE2, 0xBD, 0x63, 0xF9, 0x33, 0xF3, 0xDF, 0x11, 0x23, 0x7A, 0xB4, \n    0x7D, 0x18, 0xE7, 0x7A, 0x82, 0x47, 0xC9, 0xA2, 0x59, 0x33, 0x50, 0x48, 0xFB, 0xCD, 0x7E, 0xE6, \n    0xDD, 0xCF, 0xCE, 0xE1, 0x00, 0x91, 0xF7, 0x1F, 0x6A, 0xAD, 0x3C, 0xB9, 0xA7, 0xCA, 0xF9, 0x1F, \n    0xEC, 0xD5, 0x79, 0x5C, 0x03, 0x9F, 0xCA, 0xA2, 0x52, 0x5B, 0x1D, 0x74, 0xE2, 0x18, 0x69, 0x4E, \n    0xC5, 0x0C, 0xCC, 0xC7, 0x18, 0x03, 0x24, 0x9F, 0x4A, 0xF6, 0x3D, 0x25, 0x2C, 0xFE, 0x11, 0xFC, \n    0x36, 0x9A, 0xF3, 0x50, 0x61, 0x1C, 0x3A, 0x75, 0xBB, 0xDF, 0x5F, 0x30, 0x61, 0x92, 0xC0, 0x64, \n    0xA8, 0x3D, 0xCF, 0x0A, 0x8B, 0xEA, 0x71, 0xDC, 0xD7, 0x2D, 0xF0, 0x67, 0xC0, 0xED, 0x79, 0x76, \n    0xBA, 0xBD, 0xC0, 0xFD, 0xCC, 0x04, 0xFD, 0x98, 0x1F, 0xE3, 0x71, 0xFC, 0x7F, 0x45, 0xED, 0xFE, \n    0xD7, 0xFB, 0xB5, 0xE5, 0x9F, 0xB7, 0xE7, 0xC7, 0x15, 0x71, 0x0F, 0x81, 0xF4, 0xD9, 0x81, 0x2A, \n    0x56, 0xE3, 0x57, 0x65, 0x27, 0x93, 0xC1, 0x8E, 0x1C, 0xFB, 0x7F, 0xAC, 0x61, 0xC8, 0xC9, 0x8F, \n    0xA1, 0x52, 0x2B, 0xC3, 0xE2, 0x6C, 0xFA, 0x96, 0x4B, 0x95, 0xD4, 0xC7, 0xD4, 0x7E, 0xFD, 0xAD, \n    0x05, 0xDE, 0x4F, 0x6F, 0xF3, 0xF4, 0x32, 0xC3, 0x65, 0xF2, 0xCE, 0x73, 0x3A, 0x79, 0x5D, 0x2F, \n    0x82, 0x2F, 0x9A, 0x6F, 0xB2, 0x5D, 0x3F, 0x4F, 0x56, 0x8F, 0x9C, 0xBC, 0x7D, 0xE2, 0xFB, 0xAF, \n    0x88, 0x1E, 0x32, 0xD4, 0xB5, 0xAB, 0xCD, 0xBF, 0x69, 0xD4, 0xEE, 0x1E, 0xE1, 0xC0, 0xFB, 0xAA, \n    0x58, 0x93, 0x81, 0xE8, 0xA3, 0xA0, 0x1D, 0x80, 0x02, 0xB1, 0x98, 0xB1, 0x38, 0xE3, 0xA6, 0x32, \n    0x3D, 0xA9, 0xD6, 0xEE, 0xA8, 0x92, 0x6E, 0x52, 0xC5, 0x97, 0x08, 0x77, 0x63, 0x69, 0xC8, 0xE7, \n    0xDF, 0x8C, 0x8C, 0x7B, 0xD4, 0x15, 0xFC, 0x5B, 0x5A, 0xB4, 0xEA, 0xCD, 0xD4, 0x9B, 0xBB, 0x6E, \n    0xEF, 0xD5, 0xEA, 0x7F, 0x49, 0x53, 0xA7, 0x18, 0x45, 0x42, 0x0A, 0xC9, 0x69, 0xF7, 0x05, 0x14, \n    0x51, 0x59, 0x94, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, \n    0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, \n    0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x38, 0x6E, 0x22, 0x9C, 0xAE, 0xC8, 0xC1, 0x87, 0x50, \n    0x78, 0x3E, 0x95, 0x1D, 0x15, 0x49, 0xD8, 0x0F, 0xBA, 0x3F, 0x64, 0x4F, 0xDA, 0x5A, 0x3F, 0x8B, \n    0x5E, 0x1F, 0x8F, 0x45, 0xD5, 0xAE, 0x76, 0xF8, 0xA3, 0x4B, 0x88, 0x65, 0xDD, 0xBE, 0x6D, 0x4E, \n    0x25, 0xE3, 0xCD, 0x07, 0xBC, 0x8A, 0x31, 0xBC, 0x1E, 0x4F, 0xDF, 0xE7, 0xE7, 0xD9, 0xD7, 0x7C, \n    0x40, 0xF0, 0xA4, 0xB6, 0x97, 0x73, 0x6A, 0x10, 0xEE, 0x92, 0x0B, 0x87, 0x32, 0x4C, 0x00, 0xE6, \n    0x36, 0x27, 0x24, 0xFF, 0x00, 0xBA, 0x4F, 0xE5, 0xF9, 0x57, 0xE7, 0xDF, 0x86, 0xFC, 0x43, 0x79, \n    0xE1, 0x1D, 0x6A, 0xD7, 0x52, 0xD3, 0xEE, 0x24, 0xB5, 0xBE, 0xB2, 0x95, 0x65, 0x82, 0x64, 0x38, \n    0x68, 0xDD, 0x4E, 0x41, 0x15, 0xF7, 0x17, 0xEC, 0xD3, 0xFB, 0x54, 0x69, 0x7F, 0x1D, 0x2C, 0x06, \n    0x97, 0x7E, 0xB0, 0xE9, 0xDE, 0x28, 0x85, 0x3E, 0x7B, 0x6C, 0xE2, 0x3D, 0x41, 0x42, 0xFC, 0xD2, \n    0x43, 0xFE, 0xD7, 0x52, 0xD1, 0xF5, 0x03, 0x91, 0x95, 0x0D, 0xB3, 0xFA, 0x5B, 0xC3, 0x5F, 0x10, \n    0xA9, 0x63, 0x69, 0x47, 0x2A, 0xCC, 0xE7, 0x6A, 0xAB, 0x48, 0x49, 0xFD, 0xAE, 0xC9, 0xBE, 0xFF, \n    0x00, 0x9F, 0xA9, 0xF8, 0x3F, 0x1B, 0x70, 0x6D, 0x6C, 0x05, 0x79, 0x66, 0xB9, 0x64, 0x79, 0xA9, \n    0x4B, 0x59, 0xC1, 0x74, 0xF3, 0x4B, 0xB7, 0xE5, 0xE8, 0x56, 0xF3, 0xBF, 0xDA, 0x1F, 0x95, 0x2F, \n    0x9B, 0xFE, 0xD7, 0xE9, 0x5D, 0x7F, 0x8B, 0x3E, 0x1B, 0x6F, 0xDD, 0x71, 0xA5, 0xF0, 0x7A, 0xB5, \n    0xBE, 0x71, 0xFF, 0x00, 0x7C, 0x1F, 0xE8, 0x7F, 0x0E, 0xC2, 0xB8, 0x89, 0xD2, 0x4B, 0x59, 0x9A, \n    0x39, 0x15, 0x92, 0x44, 0x38, 0x65, 0x6C, 0xAB, 0x29, 0xF7, 0x15, 0xFB, 0x14, 0xA2, 0xE3, 0xB9, \n    0xF1, 0x78, 0x5A, 0xB4, 0xB1, 0x11, 0xE6, 0xA6, 0xFE, 0x5D, 0x51, 0x3F, 0x99, 0x91, 0xF7, 0xB1, \n    0x8A, 0xFA, 0x1F, 0xF6, 0x6C, 0xFF, 0x00, 0x82, 0x53, 0x7C, 0x7C, 0xFD, 0xAB, 0xAE, 0x34, 0x79, \n    0x3C, 0x2D, 0xF0, 0xEF, 0x59, 0xB7, 0xD1, 0x35, 0xC4, 0x8A, 0x7B, 0x7D, 0x7F, 0x58, 0x4F, 0xB0, \n    0x69, 0x4B, 0x6D, 0x26, 0x0A, 0xDC, 0xF9, 0xB2, 0x7C, 0xD2, 0xC5, 0xB4, 0x86, 0xFD, 0xCA, 0xC8, \n    0xEC, 0x3E, 0xEA, 0xB5, 0x7C, 0xDC, 0x64, 0xC0, 0xFB, 0xC2, 0xBE, 0x84, 0xF8, 0x73, 0xFF, 0x00, \n    0x05, 0x63, 0xFD, 0xA3, 0x3E, 0x12, 0xF8, 0x17, 0x49, 0xF0, 0xCF, 0x86, 0xFE, 0x2B, 0x6B, 0xDA, \n    0x4E, 0x81, 0xA0, 0xD9, 0xC7, 0x61, 0xA7, 0xD9, 0xC5, 0x69, 0x66, 0xD1, 0xDB, 0x41, 0x1A, 0x85, \n    0x48, 0xC1, 0x68, 0x4B, 0x10, 0x14, 0x01, 0xC9, 0x26, 0xBC, 0x3C, 0xED, 0x66, 0x92, 0xA1, 0x6C, \n    0xAD, 0xC1, 0x4B, 0xAB, 0x9D, 0xEC, 0x97, 0x74, 0x91, 0xEE, 0x65, 0x90, 0xC1, 0xAA, 0x97, 0xC6, \n    0x73, 0x72, 0xFF, 0x00, 0x77, 0xFE, 0x09, 0xFD, 0x29, 0x7E, 0xCB, 0x7F, 0x01, 0x6C, 0x3F, 0x65, \n    0xCF, 0xD9, 0xD7, 0xC1, 0x3F, 0x0F, 0x74, 0xD9, 0x9E, 0xF2, 0xD7, 0xC1, 0xFA, 0x3D, 0xB6, 0x96, \n    0x2E, 0x99, 0x3C, 0xB6, 0xBC, 0x78, 0xD0, 0x09, 0x27, 0x65, 0xC9, 0xDA, 0xD2, 0x3E, 0xE7, 0x2A, \n    0x09, 0x00, 0xB9, 0x03, 0x8A, 0xF4, 0x20, 0xDC, 0xD7, 0xF3, 0x08, 0xDF, 0xF0, 0x5A, 0xFF, 0x00, \n    0xDA, 0xA0, 0x7F, 0xCD, 0x68, 0xF1, 0x1F, 0xFE, 0x01, 0x58, 0xFF, 0x00, 0xF1, 0x8A, 0x63, 0x7F, \n    0xC1, 0x6C, 0x3F, 0x6A, 0x81, 0xFF, 0x00, 0x35, 0xA7, 0xC4, 0x7F, 0xF8, 0x09, 0x63, 0xFF, 0x00, \n    0xC6, 0x2B, 0xF0, 0x2A, 0xBE, 0x0F, 0xE7, 0x15, 0x66, 0xEA, 0xD4, 0xAD, 0x07, 0x29, 0x3B, 0xB7, \n    0x79, 0x6A, 0xDE, 0xFD, 0x0F, 0xD4, 0xA9, 0x71, 0xDE, 0x02, 0x11, 0x50, 0x8C, 0x25, 0x64, 0xAD, \n    0xB2, 0xFF, 0x00, 0x33, 0xFA, 0x73, 0xD5, 0xF4, 0xCB, 0x6D, 0x73, 0x4A, 0xBA, 0xB3, 0xBA, 0x89, \n    0x27, 0xB5, 0xBC, 0x89, 0xA0, 0x9A, 0x27, 0x19, 0x59, 0x11, 0x81, 0x56, 0x53, 0xEC, 0x41, 0x22, \n    0xBF, 0x9A, 0xBF, 0xDA, 0xFF, 0x00, 0xFE, 0x08, 0x7F, 0xF1, 0xEB, 0xF6, 0x5C, 0xF8, 0x8B, 0xAB, \n    0x58, 0xE9, 0x3E, 0x05, 0xD7, 0xBC, 0x79, 0xE0, 0xDB, 0x7B, 0x89, 0x3F, 0xB2, 0x75, 0xDD, 0x0A, \n    0x1F, 0xB7, 0x9B, 0xAB, 0x51, 0xCA, 0x34, 0xF0, 0x47, 0x99, 0x62, 0x95, 0x50, 0x80, 0xE1, 0x90, \n    0x26, 0xF0, 0xDB, 0x19, 0xD7, 0x0C, 0x79, 0xB6, 0xFF, 0x00, 0x82, 0xD8, 0xFE, 0xD5, 0x4B, 0xFF, \n    0x00, 0x35, 0xA7, 0xC4, 0xBF, 0xF8, 0x09, 0x63, 0xFF, 0x00, 0xC6, 0x2A, 0xBE, 0xA1, 0xFF, 0x00, \n    0x05, 0xA4, 0xFD, 0xA9, 0xB5, 0x1B, 0x39, 0xAD, 0xEE, 0x3E, 0x32, 0xF8, 0x8E, 0x48, 0x6E, 0x23, \n    0x68, 0xE4, 0x4F, 0xB1, 0xD9, 0x7C, 0xCA, 0xC3, 0x04, 0x7F, 0xA8, 0xEE, 0x0D, 0x7D, 0x4F, 0x09, \n    0xF0, 0x4F, 0x11, 0x64, 0x35, 0xA5, 0x3C, 0x35, 0x5A, 0x52, 0x8C, 0xED, 0xCC, 0x9F, 0x37, 0x4D, \n    0x9A, 0xB2, 0xDD, 0x5D, 0x9E, 0x56, 0x75, 0x9F, 0x65, 0x99, 0x9C, 0x23, 0x1A, 0x91, 0x9A, 0x71, \n    0xD9, 0xAB, 0x75, 0x3E, 0x61, 0x33, 0xF9, 0xAA, 0x19, 0x5B, 0xE5, 0x23, 0x20, 0x8A, 0x86, 0x69, \n    0x70, 0x29, 0x37, 0xED, 0x45, 0x55, 0xE0, 0x28, 0xC0, 0x14, 0xC6, 0x72, 0x5B, 0x6E, 0x37, 0x31, \n    0x38, 0x0A, 0x2B, 0xF6, 0x8E, 0x66, 0xAD, 0x73, 0xE1, 0x23, 0x4C, 0x6B, 0x49, 0xC7, 0x26, 0xBA, \n    0x6F, 0x87, 0x3F, 0x0E, 0xE5, 0xF1, 0x7D, 0xD7, 0x9F, 0x71, 0xBA, 0x3D, 0x3E, 0x33, 0x87, 0x71, \n    0xC1, 0x90, 0x8F, 0xE0, 0x5F, 0xEA, 0x7B, 0x7D, 0x71, 0x5A, 0x5E, 0x07, 0xF8, 0x35, 0x3E, 0xA7, \n    0x22, 0x5D, 0x6B, 0x0A, 0xF6, 0xF6, 0xEB, 0xCA, 0xDB, 0x67, 0x12, 0x4B, 0xFE, 0xF7, 0x74, 0x1F, \n    0xF8, 0xF7, 0xD3, 0xAD, 0x5F, 0xF8, 0xED, 0xFB, 0x41, 0x68, 0x7F, 0xB3, 0xD7, 0x86, 0x92, 0x39, \n    0x12, 0x1B, 0x8D, 0x52, 0x58, 0xBF, 0xD0, 0x34, 0xC8, 0xDB, 0x66, 0xE5, 0xE8, 0x1D, 0xF1, 0xF7, \n    0x22, 0x1C, 0xFB, 0xB1, 0x04, 0x2F, 0x76, 0x5E, 0x7C, 0x6E, 0x2F, 0x0D, 0x97, 0xE1, 0xA5, 0x8D, \n    0xC7, 0xC9, 0x42, 0x11, 0xEF, 0xD7, 0xC9, 0x2E, 0xAD, 0xF4, 0x38, 0x25, 0x8A, 0xAF, 0x89, 0xAE, \n    0xB0, 0x19, 0x64, 0x79, 0xEA, 0x4B, 0xB6, 0xCB, 0xCE, 0xFB, 0x69, 0xD5, 0xEC, 0x88, 0x3F, 0x68, \n    0x9F, 0x8F, 0x3A, 0x7F, 0xEC, 0xFD, 0xE0, 0x75, 0x5B, 0x7F, 0x25, 0xB5, 0xDB, 0xB8, 0x8C, 0x7A, \n    0x5D, 0x92, 0xE0, 0xF9, 0x40, 0x0C, 0x79, 0xCE, 0xBD, 0xA3, 0x4E, 0xC0, 0xFD, 0xF6, 0x1B, 0x46, \n    0x40, 0x72, 0xBF, 0x06, 0x6A, 0xDA, 0x9D, 0xC6, 0xBB, 0xA8, 0xDC, 0x5E, 0xDD, 0x4D, 0x2D, 0xC5, \n    0xCD, 0xD4, 0x8D, 0x34, 0xF3, 0x48, 0xC5, 0x9E, 0x47, 0x63, 0x92, 0xCC, 0x4F, 0x24, 0x92, 0x72, \n    0x4F, 0x72, 0x6B, 0x47, 0xE2, 0x07, 0x8F, 0xF5, 0x6F, 0x89, 0x9E, 0x29, 0xB8, 0xD6, 0x75, 0x8B, \n    0xA6, 0xBC, 0xBD, 0xBB, 0x3C, 0xB6, 0x30, 0xA8, 0xA3, 0xA2, 0x28, 0xE8, 0xAA, 0xA3, 0x80, 0x07, \n    0x00, 0x56, 0x09, 0xE7, 0xA5, 0x7F, 0x26, 0xF1, 0xCF, 0x18, 0xD6, 0xCF, 0xF1, 0xBE, 0xD3, 0xE1, \n    0xA5, 0x1B, 0xA8, 0x47, 0xB2, 0xEE, 0xFC, 0xD9, 0xFB, 0x97, 0x08, 0xF0, 0xB5, 0x2C, 0x97, 0x09, \n    0xEC, 0xD7, 0xBD, 0x56, 0x5A, 0xCE, 0x5D, 0xDF, 0x65, 0xE4, 0xBA, 0x7D, 0xE3, 0x58, 0xF3, 0xFF, \n    0x00, 0xD6, 0xA6, 0xD1, 0x45, 0x7C, 0x39, 0xF5, 0x61, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, \n    0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, \n    0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, \n    0x01, 0x45, 0x14, 0x50, 0x03, 0xB6, 0x73, 0x56, 0xAC, 0x6F, 0xE6, 0xD3, 0xEE, 0xA3, 0x9E, 0x09, \n    0x9A, 0x19, 0xA1, 0x60, 0xC9, 0x22, 0x31, 0x0C, 0x84, 0x1C, 0x82, 0x08, 0xE4, 0x10, 0x79, 0xE2, \n    0xA9, 0xD1, 0x55, 0x19, 0x38, 0xBE, 0x65, 0xB8, 0x3D, 0x77, 0x3E, 0xAA, 0xF8, 0x0B, 0xFB, 0x7B, \n    0x2C, 0x51, 0x43, 0xA4, 0xF8, 0xE7, 0xCC, 0x9B, 0x6E, 0x12, 0x3D, 0x66, 0x24, 0xDC, 0xE0, 0x7F, \n    0xD3, 0x78, 0xC0, 0xCB, 0xE0, 0x7F, 0x1A, 0xFC, 0xDC, 0x72, 0xAE, 0x49, 0x35, 0xF4, 0x59, 0xB2, \n    0xD1, 0x7E, 0x23, 0xE8, 0x76, 0xFA, 0x84, 0x32, 0x5B, 0xEA, 0x16, 0x77, 0x2B, 0xFE, 0x8F, 0x7B, \n    0x6C, 0xE1, 0x83, 0x63, 0x82, 0x03, 0x8F, 0x43, 0x90, 0x54, 0xE7, 0x07, 0x20, 0x80, 0x6B, 0xF3, \n    0x38, 0xF4, 0xAE, 0x8F, 0xC0, 0x5F, 0x14, 0xBC, 0x41, 0xF0, 0xBB, 0x52, 0x37, 0x7A, 0x0E, 0xAD, \n    0x77, 0xA6, 0xC8, 0xC4, 0x6F, 0x11, 0xB6, 0x63, 0x97, 0x1D, 0x03, 0xA1, 0xCA, 0xB8, 0xF6, 0x60, \n    0x45, 0x7E, 0xC1, 0xC2, 0xBE, 0x2E, 0x63, 0x70, 0x10, 0x58, 0x5C, 0xCA, 0x2E, 0xB5, 0x3E, 0xFF, \n    0x00, 0x69, 0x2F, 0x5E, 0xBF, 0x3F, 0xBC, 0xFC, 0xC7, 0x88, 0xBC, 0x33, 0xC2, 0xE3, 0x26, 0xF1, \n    0x39, 0x74, 0xBD, 0x8D, 0x5F, 0x2F, 0x85, 0xFC, 0x96, 0xDF, 0x2D, 0x3C, 0x8F, 0xB8, 0xF5, 0x9F, \n    0x84, 0x57, 0x96, 0xA5, 0x9A, 0xC6, 0x68, 0xEE, 0xD3, 0xB2, 0x39, 0xF2, 0xE4, 0x1F, 0xFB, 0x29, \n    0xFC, 0xC5, 0x73, 0x1A, 0xAE, 0x89, 0x7F, 0xA3, 0x1F, 0xF4, 0xAB, 0x3B, 0x88, 0x57, 0xFB, 0xCC, \n    0x84, 0x29, 0xFA, 0x1E, 0x87, 0xF0, 0x35, 0xC0, 0x7C, 0x3D, 0xFF, 0x00, 0x82, 0x8B, 0x5C, 0x42, \n    0xB1, 0xDB, 0xF8, 0xA3, 0x43, 0x8E, 0xEB, 0x6E, 0x03, 0x5D, 0xE9, 0xEF, 0xE5, 0x3E, 0x31, 0xC9, \n    0x68, 0xDB, 0x2A, 0xCC, 0x7F, 0xD9, 0x64, 0x1E, 0xD5, 0xEB, 0xFE, 0x14, 0xFD, 0xB0, 0xBE, 0x1E, \n    0x78, 0xA5, 0x17, 0x66, 0xBE, 0x34, 0xD9, 0x64, 0x38, 0xF2, 0x75, 0x08, 0x5E, 0x06, 0xFC, 0x5C, \n    0x06, 0x8F, 0x8E, 0x3F, 0x8F, 0xBD, 0x7E, 0xD5, 0x96, 0x71, 0xE7, 0x0F, 0x66, 0x11, 0x4E, 0x96, \n    0x21, 0x42, 0x5D, 0xA7, 0xEE, 0xDB, 0xEF, 0xD3, 0xEE, 0x6C, 0xFC, 0xDF, 0x19, 0x90, 0xF1, 0x0E, \n    0x5E, 0xED, 0x5F, 0x0F, 0xED, 0x17, 0x78, 0x6B, 0xF9, 0x7E, 0xA9, 0x1C, 0x81, 0x9B, 0x7F, 0x45, \n    0x26, 0xA3, 0x67, 0x23, 0xAE, 0x7F, 0x0A, 0xF5, 0xDB, 0x7F, 0x10, 0xF8, 0x4F, 0xC4, 0x9C, 0xDB, \n    0xEA, 0x3E, 0x17, 0xD4, 0x0B, 0x67, 0x26, 0x3B, 0xAB, 0x79, 0xB1, 0xC6, 0x4F, 0x42, 0x71, 0xC7, \n    0x35, 0x3C, 0x9E, 0x18, 0xD0, 0x56, 0x7D, 0x8D, 0x67, 0xA5, 0xAC, 0x99, 0xC6, 0xD2, 0x10, 0x37, \n    0xE5, 0x5F, 0x4F, 0x4E, 0xA6, 0x1E, 0x6B, 0x9A, 0x95, 0x58, 0xC9, 0x79, 0x34, 0x79, 0x32, 0xCD, \n    0x65, 0x49, 0xF2, 0xD6, 0xA3, 0x38, 0xBF, 0x4F, 0xF3, 0xB1, 0xE2, 0xF2, 0x4B, 0xB7, 0xB1, 0x5F, \n    0xC2, 0xA5, 0xB0, 0xD2, 0x2F, 0x35, 0xA6, 0xDB, 0x6B, 0x6B, 0x71, 0x71, 0xCF, 0xFC, 0xB3, 0x8C, \n    0xB0, 0x1F, 0x5C, 0x74, 0xFC, 0x6B, 0xD7, 0xEE, 0xAF, 0x3C, 0x2F, 0xE1, 0xB9, 0x1B, 0xED, 0x17, \n    0x1E, 0x1B, 0xD3, 0xCA, 0x1C, 0x31, 0x9E, 0x68, 0x20, 0xDA, 0x72, 0x47, 0x25, 0x88, 0xC7, 0x20, \n    0x8E, 0x7B, 0x8A, 0xE6, 0x7C, 0x4F, 0xFB, 0x57, 0x7C, 0x3D, 0xF0, 0x9A, 0xB4, 0x73, 0x78, 0x96, \n    0xCE, 0xEA, 0x48, 0x87, 0x10, 0xD9, 0xA3, 0xDC, 0x97, 0xF6, 0x0C, 0x80, 0xC7, 0xED, 0xCB, 0x0E, \n    0xBF, 0x5A, 0xE4, 0xC5, 0x66, 0x99, 0x76, 0x19, 0x73, 0x62, 0xB1, 0x31, 0x8A, 0xF3, 0x92, 0xFF, \n    0x00, 0x33, 0xAB, 0x0F, 0x8A, 0xC7, 0x62, 0x1D, 0xB0, 0x98, 0x49, 0xCB, 0xCE, 0xCF, 0xFC, 0xBF, \n    0x53, 0x37, 0x43, 0xF8, 0x2B, 0xA9, 0x5F, 0x30, 0x6B, 0xC7, 0x86, 0xC6, 0x3E, 0xFC, 0xF9, 0xB2, \n    0x1F, 0xC1, 0x4E, 0x3F, 0x33, 0xF8, 0x57, 0x71, 0xA2, 0xF8, 0x2B, 0x47, 0xF0, 0x1D, 0xAC, 0x97, \n    0x84, 0x45, 0x17, 0xD9, 0xD0, 0xC9, 0x35, 0xED, 0xDC, 0x8A, 0xA2, 0x25, 0xEE, 0xC5, 0x8E, 0x15, \n    0x07, 0xBF, 0x1E, 0xE4, 0xD7, 0xCF, 0xFE, 0x3F, 0xFF, 0x00, 0x82, 0x8B, 0xDB, 0x42, 0xB2, 0x41, \n    0xE1, 0x7D, 0x05, 0xA4, 0x6F, 0xE1, 0xBA, 0xD5, 0x1F, 0x00, 0x7F, 0xDB, 0x18, 0xCF, 0x5F, 0x43, \n    0xE6, 0x63, 0xD4, 0x1A, 0xF0, 0x5F, 0x89, 0x3F, 0x1B, 0xBC, 0x55, 0xF1, 0x6E, 0x75, 0x6D, 0x7B, \n    0x56, 0xBA, 0xBC, 0x86, 0x36, 0xDE, 0x96, 0xEB, 0x88, 0xED, 0xE1, 0x3D, 0x32, 0xB1, 0xA8, 0x08, \n    0x0E, 0x08, 0x19, 0xC6, 0x4F, 0x19, 0x26, 0xBF, 0x3D, 0xCE, 0xBC, 0x5C, 0xC9, 0xB0, 0x31, 0x71, \n    0xCB, 0x93, 0xAD, 0x3E, 0x8F, 0x68, 0xAF, 0x9B, 0xD5, 0xFC, 0x95, 0xBC, 0xCF, 0xA7, 0xC0, 0x70, \n    0x0E, 0x79, 0x98, 0xBB, 0xE6, 0x12, 0x54, 0x69, 0xF5, 0x4B, 0x59, 0x35, 0xF2, 0xFD, 0x5F, 0xC8, \n    0xFA, 0x33, 0xE3, 0xAF, 0xED, 0xE3, 0x61, 0xE1, 0xF1, 0x36, 0x9B, 0xE0, 0xBF, 0x2F, 0x51, 0xBE, \n    0xE5, 0x5F, 0x52, 0x96, 0x3F, 0xF4, 0x78, 0x0F, 0xFD, 0x33, 0x46, 0x1F, 0xBC, 0x60, 0x7F, 0x89, \n    0x86, 0xCE, 0x3A, 0x38, 0x39, 0x1F, 0x28, 0xEB, 0xBA, 0xFD, 0xF7, 0x8A, 0xB5, 0x99, 0xEF, 0xF5, \n    0x0B, 0xAB, 0x8B, 0xCB, 0xBB, 0xA6, 0xDF, 0x2C, 0xF3, 0xB9, 0x91, 0xDC, 0xFA, 0x96, 0x3C, 0x9E, \n    0x9F, 0xA5, 0x66, 0x81, 0x86, 0xF5, 0xFA, 0x50, 0xCD, 0xBB, 0xFA, 0x0F, 0x4A, 0xFE, 0x7F, 0xE2, \n    0x4E, 0x2C, 0xCC, 0x73, 0xBA, 0xDE, 0xD7, 0x1B, 0x3D, 0x16, 0xD1, 0x5A, 0x45, 0x7A, 0x2F, 0xD7, \n    0x73, 0xF5, 0xDC, 0x87, 0x86, 0xF0, 0x19, 0x3D, 0x1F, 0x65, 0x83, 0x86, 0xAF, 0x79, 0x3D, 0x5B, \n    0xF5, 0x7F, 0xA2, 0xB2, 0x24, 0x27, 0x00, 0x01, 0xF8, 0x9A, 0x61, 0x66, 0xDC, 0x09, 0xA6, 0x67, \n    0x34, 0x57, 0xCD, 0x5C, 0xF7, 0x82, 0x8A, 0x28, 0xA4, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, \n    0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, \n    0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, \n    0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x03, 0xBE, 0xEB, 0x50, 0x5F, 0xF0, 0xA6, \n    0xD1, 0x4E, 0xE0, 0x38, 0x9E, 0x7D, 0xAA, 0x48, 0xA5, 0x78, 0x81, 0x55, 0x6C, 0x06, 0xEA, 0x3B, \n    0x1F, 0xAD, 0x43, 0x45, 0x17, 0x02, 0x6F, 0xB4, 0x3F, 0x62, 0x7B, 0xF7, 0xA7, 0x19, 0xF2, 0x7F, \n    0x8C, 0xFD, 0x5B, 0xFF, 0x00, 0xAD, 0x55, 0xE8, 0xAA, 0x55, 0x24, 0xB4, 0x4C, 0x2C, 0xAF, 0x72, \n    0x4F, 0x39, 0x89, 0xFB, 0xCF, 0xF9, 0xD1, 0x91, 0xE6, 0x0C, 0xEE, 0xDB, 0xF5, 0xE6, 0xA3, 0xA2, \n    0x93, 0x93, 0x7B, 0x81, 0x21, 0x6D, 0xCD, 0xDA, 0x87, 0x95, 0x9B, 0xD7, 0x81, 0x81, 0xEC, 0x2A, \n    0x3A, 0x29, 0x5C, 0x02, 0x8A, 0x28, 0xA4, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, \n    0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, \n    0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, \n    0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, \n    0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, \n    0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, \n    0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, \n    0x45, 0x14, 0x50, 0x07, 0xFF, 0xD9, \n} ;\n"
  },
  {
    "path": "examples/M5ez-demo/raw_githubusercontent_com.h",
    "content": "// This is the root certificate include file for raw.githubusercontent.com\n// as obtained by the get_cert script on: Wed Aug 15 20:22:14 CEST 2018\n//\n//\n// Certificate info:\n//     issuer= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV Root CA\n//     notAfter=Oct 22 12:00:00 2028 GMT\n//\n\nconst char* root_cert = \\\n  \"-----BEGIN CERTIFICATE-----\\n\" \\\n  \"MIIEsTCCA5mgAwIBAgIQBOHnpNxc8vNtwCtCuF0VnzANBgkqhkiG9w0BAQsFADBs\\n\" \\\n  \"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\\n\" \\\n  \"d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j\\n\" \\\n  \"ZSBFViBSb290IENBMB4XDTEzMTAyMjEyMDAwMFoXDTI4MTAyMjEyMDAwMFowcDEL\\n\" \\\n  \"MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3\\n\" \\\n  \"LmRpZ2ljZXJ0LmNvbTEvMC0GA1UEAxMmRGlnaUNlcnQgU0hBMiBIaWdoIEFzc3Vy\\n\" \\\n  \"YW5jZSBTZXJ2ZXIgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2\\n\" \\\n  \"4C/CJAbIbQRf1+8KZAayfSImZRauQkCbztyfn3YHPsMwVYcZuU+UDlqUH1VWtMIC\\n\" \\\n  \"Kq/QmO4LQNfE0DtyyBSe75CxEamu0si4QzrZCwvV1ZX1QK/IHe1NnF9Xt4ZQaJn1\\n\" \\\n  \"itrSxwUfqJfJ3KSxgoQtxq2lnMcZgqaFD15EWCo3j/018QsIJzJa9buLnqS9UdAn\\n\" \\\n  \"4t07QjOjBSjEuyjMmqwrIw14xnvmXnG3Sj4I+4G3FhahnSMSTeXXkgisdaScus0X\\n\" \\\n  \"sh5ENWV/UyU50RwKmmMbGZJ0aAo3wsJSSMs5WqK24V3B3aAguCGikyZvFEohQcft\\n\" \\\n  \"bZvySC/zA/WiaJJTL17jAgMBAAGjggFJMIIBRTASBgNVHRMBAf8ECDAGAQH/AgEA\\n\" \\\n  \"MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw\\n\" \\\n  \"NAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy\\n\" \\\n  \"dC5jb20wSwYDVR0fBEQwQjBAoD6gPIY6aHR0cDovL2NybDQuZGlnaWNlcnQuY29t\\n\" \\\n  \"L0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUVWUm9vdENBLmNybDA9BgNVHSAENjA0MDIG\\n\" \\\n  \"BFUdIAAwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQ\\n\" \\\n  \"UzAdBgNVHQ4EFgQUUWj/kK8CB3U8zNllZGKiErhZcjswHwYDVR0jBBgwFoAUsT7D\\n\" \\\n  \"aQP4v0cB1JgmGggC72NkK8MwDQYJKoZIhvcNAQELBQADggEBABiKlYkD5m3fXPwd\\n\" \\\n  \"aOpKj4PWUS+Na0QWnqxj9dJubISZi6qBcYRb7TROsLd5kinMLYBq8I4g4Xmk/gNH\\n\" \\\n  \"E+r1hspZcX30BJZr01lYPf7TMSVcGDiEo+afgv2MW5gxTs14nhr9hctJqvIni5ly\\n\" \\\n  \"/D6q1UEL2tU2ob8cbkdJf17ZSHwD2f2LSaCYJkJA69aSEaRkCldUxPUd1gJea6zu\\n\" \\\n  \"xICaEnL6VpPX/78whQYwvwt/Tv9XBZ0k7YXDK/umdaisLRbvfXknsuvCnQsH6qqF\\n\" \\\n  \"0wGjIChBWUMo0oHjqvbsezt3tkBigAVBRQHvFwY+3sAzm2fTYS5yh+Rp/BIAV0Ae\\n\" \\\n  \"cPUeybQ=\\n\" \\\n  \"-----END CERTIFICATE-----\\n\";\n"
  },
  {
    "path": "examples/M5ez-demo/z-sysInfo.ino",
    "content": "/*\n * \n * This is a \"z-sketch\". It means you can run this sketch on its own, or use it as a sub-sketch of some bigger program\n * See the M5ez user manual under z-sketches at https://github.com/M5ez/M5ez\n *\n */\n\n#ifndef MAIN_DECLARED\n\n#include <M5Stack.h>\n#include <M5ez.h>\n\nvoid setup() {\n  ez.begin();\n  sysInfo();\n}\n\nvoid loop() {\n\n}\n\nString exit_button = \"\";\n\n#else\n\nString exit_button = \"Exit\";\n\n#endif  // #ifndef MAIN_DECLARED\n\n\n\nvoid sysInfo() {\n  sysInfoPage1();\n  while(true) {\n    String btn = ez.buttons.poll();\n    if (btn == \"up\") sysInfoPage1();\n    if (btn == \"down\") sysInfoPage2();\n    if (btn == \"Exit\") break;\n  }\n}\n\n#include <SPIFFS.h>\n\nvoid sysInfoPage1() {\n  const byte tab = 120;\n  ez.screen.clear();\n  ez.header.show(\"System Info  (1/2)\");\n  ez.buttons.show(\"#\" + exit_button + \"#down\");\n  ez.canvas.font(&FreeSans9pt7b);\n  ez.canvas.lmargin(10);\n  ez.canvas.println(\"\");\n  ez.canvas.print(\"CPU freq:\");  ez.canvas.x(tab); ez.canvas.println(String(ESP.getCpuFreqMHz()) + \" MHz\");\n  ez.canvas.print(\"CPU cores:\");  ez.canvas.x(tab); ez.canvas.println(\"2\");    //   :)\n  ez.canvas.print(\"Chip rev.:\");  ez.canvas.x(tab); ez.canvas.println(String(ESP.getChipRevision()));\n  ez.canvas.print(\"Flash speed:\");  ez.canvas.x(tab); ez.canvas.println(String(ESP.getFlashChipSpeed() / 1000000) + \" MHz\");\n  ez.canvas.print(\"Flash size:\");  ez.canvas.x(tab); ez.canvas.println(String(ESP.getFlashChipSize() / 1000000) + \" MB\");\n  ez.canvas.print(\"ESP SDK:\");  ez.canvas.x(tab); ez.canvas.println(String(ESP.getSdkVersion()));\n  ez.canvas.print(\"M5ez:\");  ez.canvas.x(tab); ez.canvas.println(String(ez.version()));\n}\n\nvoid sysInfoPage2() {\n  const String SD_Type[5] = {\"NONE\", \"MMC\", \"SD\", \"SDHC\", \"UNKNOWN\"};\n  const byte tab = 140;\n  ez.screen.clear();\n  ez.header.show(\"System Info  (2/2)\");\n  ez.buttons.show(\"up#\" + exit_button + \"#\");\n  ez.canvas.font(&FreeSans9pt7b);\n  ez.canvas.lmargin(10);\n  ez.canvas.println(\"\");\n  ez.canvas.print(\"Free RAM:\");  ez.canvas.x(tab);  ez.canvas.println(String((long)ESP.getFreeHeap()) + \" bytes\");\n  ez.canvas.print(\"Min. free seen:\");  ez.canvas.x(tab); ez.canvas.println(String((long)esp_get_minimum_free_heap_size()) + \" bytes\");\n  const int sd_type = SD.cardType();\n  \n  SPIFFS.begin();\n  ez.canvas.print(\"SPIFFS size:\"); ez.canvas.x(tab); ez.canvas.println(String((long)SPIFFS.totalBytes()) + \" bytes\");\n  ez.canvas.print(\"SPIFFS used:\"); ez.canvas.x(tab); ez.canvas.println(String((long)SPIFFS.usedBytes()) + \" bytes\");\n  ez.canvas.print(\"SD type:\"); ez.canvas.x(tab); ez.canvas.println(SD_Type[sd_type]);\n  if (sd_type != 0) {\n    ez.canvas.print(\"SD size:\"); ez.canvas.x(tab); ez.canvas.println(String((long)SD.cardSize()  / 1000000) + \" MB\");\n    ez.canvas.print(\"SD used:\"); ez.canvas.x(tab); ez.canvas.println(String((long)SD.usedBytes()  / 1000000) + \" MB\");\n  }\n}\n"
  },
  {
    "path": "examples/OTA_https/OTA_https.ino",
    "content": "#include <M5Stack.h>\n#include <M5ez.h>\n\nvoid setup() {\n  ez.begin();\n  ezMenu OTA_menu (\"OTA via https demo\");\n  OTA_menu.addItem(\"Settings\", ez.settings.menu);\n  OTA_menu.addItem(\"Get M5ez demo\", OTA_demo);\n  OTA_menu.run();\n}\n\nvoid loop() {\n}\n\nvoid OTA_demo() {  \n  if (ez.msgBox(\"Get M5ez demo program\", \"This will download and replace the current sketch with the M5ez demo program.\", \"Cancel#OK#\") == \"OK\") {\n    ezProgressBar progress_bar(\"OTA update in progress\", \"Downloading ...\", \"Abort\");\n    #include \"raw_githubusercontent_com.h\" // the root certificate is now in const char * root_cert\n    if (ez.wifi.update(\"https://raw.githubusercontent.com/M5ez/M5ez/master/compiled_binaries/M5ez-demo.bin\", root_cert, &progress_bar)) {\n      ez.msgBox(\"Over The Air updater\", \"OTA download successful. Reboot to new firmware\", \"Reboot\");\n      ESP.restart();\n    } else {\n      ez.msgBox(\"OTA error\", ez.wifi.updateError(), \"OK\");\n    }\n  }\n}\n"
  },
  {
    "path": "examples/OTA_https/README.md",
    "content": "## Over The Air (OTA) firmware updates via https\n\nOTA stands for Over The Air, and in the context of the M5Stack usually means we're upgrading compiled firmware via the WiFi network, without hooking the USB port to a computer and running the Arduino IDE. The ez.wifi.update routine that we will be using to update the firmware uses https to transport the firmware, because code that is going to be running on all sorts of devices should be encrypted.\n\n![](../../images/ezProgressBar.png)\n\n### Using the demo\n\nLoad this program in your Arduino IDE and load it to your M5Stack. The menu will allow you to get the larger M5ez-demo program from the `/compiled_binaries` directory on the M5ez Github repository and replaces this `OTA_http` demo sketch with it. There's a menu item that points to M5ez's built-in WiFi menu in case you haven't set up any autoconnecting networks with M5ez before.\n\n(As it happens the M5ez-demo program allows you to load a compiled version of this demo program again, so you can Over-The-Air update back and forth. Not because that's a useful things to do, but it does serve to demonstrate the mechanism.)\n\n### Using `ez.wifi.update` in your own code\n\nThe steps below may seem a bit complicated. Most of that is due to the need to include a root certyificate for the server we will be connecting to. This is to prevent evildoers on the internet from swapping their malicious firmware for yours, somewhere along the way. And that was the whole point of using https over some unencrypted method in the first place. \n\nIn case you want to use it from your own code, follow the follwing steps:\n\n* Export your firmare binary by selecting \"Sketch / Export compiled binary in the Arduino IDE. The binary will be in the sketch directory once compilation is done.\n\n* Put it on the web at some server that supports https. Someplace on Github works well.\n\n* Let's assume we want our code to get the `M5ez-demo.bin` image from the `/compiled_binaries` directory of this repository. We then [browse](https://github.com/M5ez/M5ez/blob/master/compiled_binaries/M5ez-demo.bin) to that, and get a download link called \"[view raw](https://github.com/M5ez/M5ez/blob/master/compiled_binaries/M5ez-demo.bin?raw=true)\" which, if we right-click and hit \"save link as\" points to `https://github.com/M5ez/M5ez/blob/master/compiled_binaries/M5ez-demo.bin?raw=true`.\n\n* Download the `get_cert` script from the `/tools` directory on this repository to a MacOS or Linux computer, or a linux-like shell on your windows machine.\n\n* Make the script executable with `chmod a+x get_cert`.\n\n* Make sure you have the `opensll` command-line utility, or download and install it if you don't. \n\n* Run `./get_cert https://github.com/M5ez/M5ez/blob/master/compiled_binaries/M5ez-demo.bin?raw=true`, or in other words, supply the URL that you want to download from.\n\n```\nyour_prompt$ ./get_cert https://github.com/M5ez/M5ez/blob/master/compiled_binaries/M5ez-demo.bin?raw=true\nThe effective download URL (after resolving forwards) is:\n    https://raw.githubusercontent.com/M5ez/M5ez/master/compiled_binaries/M5ez-demo.bin\n\nThe root certificate include file is saved as:\n    raw_githubusercontent_com.h\n```\n\n* As you can see the script tells you two things. First it will tell you what the \"real\" URL is. That is: what site and path does the first URL evetually redirect to. That is the URL you will want to use in your code, and that is the domain you want the root certificate for.\n\n* It will also have saved a `.h` include file named after the domain (with dots replaced by underscores) that holds the root certificate in a format ready to be used by our code. Including that anywhere in your code will be replaced by a definition of a `const char *` variable called `root_cert` that can be passed to `ez.wifi.update`. Here's what that file looks like:\n\n```\nyour_prompt$ cat raw_githubusercontent_com.h \n// This is the root certificate include file for raw.githubusercontent.com\n// as obtained by the get_cert script on: Wed Aug 15 21:34:20 CEST 2018\n//\n//\n// Certificate info:\n//     issuer= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV Root CA\n//     notAfter=Oct 22 12:00:00 2028 GMT\n//\n\nconst char* root_cert = \\\n  \"-----BEGIN CERTIFICATE-----\\n\" \\\n  \"MIIEsTCCA5mgAwIBAgIQBOHnpNxc8vNtwCtCuF0VnzANBgkqhkiG9w0BAQsFADBs\\n\" \\\n  \"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\\n\" \\\n  \"d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j\\n\" \\\n  \"ZSBFViBSb290IENBMB4XDTEzMTAyMjEyMDAwMFoXDTI4MTAyMjEyMDAwMFowcDEL\\n\" \\\n  \"MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3\\n\" \\\n  \"LmRpZ2ljZXJ0LmNvbTEvMC0GA1UEAxMmRGlnaUNlcnQgU0hBMiBIaWdoIEFzc3Vy\\n\" \\\n  \"YW5jZSBTZXJ2ZXIgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2\\n\" \\\n  \"4C/CJAbIbQRf1+8KZAayfSImZRauQkCbztyfn3YHPsMwVYcZuU+UDlqUH1VWtMIC\\n\" \\\n  \"Kq/QmO4LQNfE0DtyyBSe75CxEamu0si4QzrZCwvV1ZX1QK/IHe1NnF9Xt4ZQaJn1\\n\" \\\n  \"itrSxwUfqJfJ3KSxgoQtxq2lnMcZgqaFD15EWCo3j/018QsIJzJa9buLnqS9UdAn\\n\" \\\n  \"4t07QjOjBSjEuyjMmqwrIw14xnvmXnG3Sj4I+4G3FhahnSMSTeXXkgisdaScus0X\\n\" \\\n  \"sh5ENWV/UyU50RwKmmMbGZJ0aAo3wsJSSMs5WqK24V3B3aAguCGikyZvFEohQcft\\n\" \\\n  \"bZvySC/zA/WiaJJTL17jAgMBAAGjggFJMIIBRTASBgNVHRMBAf8ECDAGAQH/AgEA\\n\" \\\n  \"MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw\\n\" \\\n  \"NAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy\\n\" \\\n  \"dC5jb20wSwYDVR0fBEQwQjBAoD6gPIY6aHR0cDovL2NybDQuZGlnaWNlcnQuY29t\\n\" \\\n  \"L0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUVWUm9vdENBLmNybDA9BgNVHSAENjA0MDIG\\n\" \\\n  \"BFUdIAAwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQ\\n\" \\\n  \"UzAdBgNVHQ4EFgQUUWj/kK8CB3U8zNllZGKiErhZcjswHwYDVR0jBBgwFoAUsT7D\\n\" \\\n  \"aQP4v0cB1JgmGggC72NkK8MwDQYJKoZIhvcNAQELBQADggEBABiKlYkD5m3fXPwd\\n\" \\\n  \"aOpKj4PWUS+Na0QWnqxj9dJubISZi6qBcYRb7TROsLd5kinMLYBq8I4g4Xmk/gNH\\n\" \\\n  \"E+r1hspZcX30BJZr01lYPf7TMSVcGDiEo+afgv2MW5gxTs14nhr9hctJqvIni5ly\\n\" \\\n  \"/D6q1UEL2tU2ob8cbkdJf17ZSHwD2f2LSaCYJkJA69aSEaRkCldUxPUd1gJea6zu\\n\" \\\n  \"xICaEnL6VpPX/78whQYwvwt/Tv9XBZ0k7YXDK/umdaisLRbvfXknsuvCnQsH6qqF\\n\" \\\n  \"0wGjIChBWUMo0oHjqvbsezt3tkBigAVBRQHvFwY+3sAzm2fTYS5yh+Rp/BIAV0Ae\\n\" \\\n  \"cPUeybQ=\\n\" \\\n  \"-----END CERTIFICATE-----\\n\";\n```\n\n* Place this certificate include file in the directory of your sketch. In your code, you can now use something like below to do the actual upgrade.\n\n```\nezProgressBar pb(\"OTA update in progress\", \"Downloading ...\", \"Abort\");\nString url = \"https://raw.githubusercontent.com/M5ez/M5ez/master/compiled_binaries/M5ez-demo.bin\";\n#include \"raw_githubusercontent_com.h\"\nif (ez.wifi.update(url, root_cert, &pb)) {\n    ez.msgBox(\"Over The Air updater\", \"OTA download successful. Reboot to new firmware\", \"Reboot\");\n    ESP.restart();\n} else {\n    ez.msgBox(\"OTA error\", ez.wifi.updateError(), \"OK\");\n}\n```\n\n* And presto: you have Over The Air updates using https.\n\n### Finer points\n\n* The above example is actually from the `OTA_https` demo. Naturally you would replace the certificate and URL with your own.\n\n* Over the Air updates only work if your partition table allows for two concurrent firmwares to be present. This means that if you do not plan to use OTA, you can have twice as much space for your programs. (Tools / Partition Scheme / No OTA in the Arduino IDE.)\n\n* As you can see, the `ez.wifi.update` function takes three arguments: the first one is the https url for the firmware, the second one is the root certificate and the (optional) third one is a pointer to the ezProgressBar instance that will show progress for this download. (Don't forget the ampersand - `&` - in front.)\n\n* Should `ez.wifi.update` return `false`: the human-readable error is provided when you call `ez.wifi.updateError()`.\n \n* If your download is much more sneaky and silent, you can also just do something like:\n\n```\n#include \"updates_com.h\"\nif (ez.wifi.update(\"https://updates.com/path/firmware.bin\", root_cert)) {\n  ESP.restart;\n}\n```\n\n* For simplicity's sake, this ignores the obvious need to figure out whether there actually are any new updates that the user hasn't installed yet. This will just get the file, put it in flash and switch to it.\n\n* If the certificate on the server is signed by a different root certificate - which may happen before the cert expiration date - updates will not work anymore. If you plan to deploy lots of IoT appliances using this update method it is probably best to control your own server and have a root certificate on it that expires sometime well after you will have sold your startup.\n\n* `ez.wifi.update` cannot be used to pass basic auth credentials with the user:pass@host notation.\n\n* Various other limitations of the WifiClientSecure class apply: this is IoT land..."
  },
  {
    "path": "examples/OTA_https/raw_githubusercontent_com.h",
    "content": "// This is the root certificate include file for raw.githubusercontent.com\n// as obtained by the get_cert script on: Wed Aug 15 20:22:14 CEST 2018\n//\n//\n// Certificate info:\n//     issuer= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV Root CA\n//     notAfter=Oct 22 12:00:00 2028 GMT\n//\n\nconst char* root_cert = \\\n  \"-----BEGIN CERTIFICATE-----\\n\" \\\n  \"MIIEsTCCA5mgAwIBAgIQBOHnpNxc8vNtwCtCuF0VnzANBgkqhkiG9w0BAQsFADBs\\n\" \\\n  \"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\\n\" \\\n  \"d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j\\n\" \\\n  \"ZSBFViBSb290IENBMB4XDTEzMTAyMjEyMDAwMFoXDTI4MTAyMjEyMDAwMFowcDEL\\n\" \\\n  \"MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3\\n\" \\\n  \"LmRpZ2ljZXJ0LmNvbTEvMC0GA1UEAxMmRGlnaUNlcnQgU0hBMiBIaWdoIEFzc3Vy\\n\" \\\n  \"YW5jZSBTZXJ2ZXIgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2\\n\" \\\n  \"4C/CJAbIbQRf1+8KZAayfSImZRauQkCbztyfn3YHPsMwVYcZuU+UDlqUH1VWtMIC\\n\" \\\n  \"Kq/QmO4LQNfE0DtyyBSe75CxEamu0si4QzrZCwvV1ZX1QK/IHe1NnF9Xt4ZQaJn1\\n\" \\\n  \"itrSxwUfqJfJ3KSxgoQtxq2lnMcZgqaFD15EWCo3j/018QsIJzJa9buLnqS9UdAn\\n\" \\\n  \"4t07QjOjBSjEuyjMmqwrIw14xnvmXnG3Sj4I+4G3FhahnSMSTeXXkgisdaScus0X\\n\" \\\n  \"sh5ENWV/UyU50RwKmmMbGZJ0aAo3wsJSSMs5WqK24V3B3aAguCGikyZvFEohQcft\\n\" \\\n  \"bZvySC/zA/WiaJJTL17jAgMBAAGjggFJMIIBRTASBgNVHRMBAf8ECDAGAQH/AgEA\\n\" \\\n  \"MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw\\n\" \\\n  \"NAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy\\n\" \\\n  \"dC5jb20wSwYDVR0fBEQwQjBAoD6gPIY6aHR0cDovL2NybDQuZGlnaWNlcnQuY29t\\n\" \\\n  \"L0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUVWUm9vdENBLmNybDA9BgNVHSAENjA0MDIG\\n\" \\\n  \"BFUdIAAwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQ\\n\" \\\n  \"UzAdBgNVHQ4EFgQUUWj/kK8CB3U8zNllZGKiErhZcjswHwYDVR0jBBgwFoAUsT7D\\n\" \\\n  \"aQP4v0cB1JgmGggC72NkK8MwDQYJKoZIhvcNAQELBQADggEBABiKlYkD5m3fXPwd\\n\" \\\n  \"aOpKj4PWUS+Na0QWnqxj9dJubISZi6qBcYRb7TROsLd5kinMLYBq8I4g4Xmk/gNH\\n\" \\\n  \"E+r1hspZcX30BJZr01lYPf7TMSVcGDiEo+afgv2MW5gxTs14nhr9hctJqvIni5ly\\n\" \\\n  \"/D6q1UEL2tU2ob8cbkdJf17ZSHwD2f2LSaCYJkJA69aSEaRkCldUxPUd1gJea6zu\\n\" \\\n  \"xICaEnL6VpPX/78whQYwvwt/Tv9XBZ0k7YXDK/umdaisLRbvfXknsuvCnQsH6qqF\\n\" \\\n  \"0wGjIChBWUMo0oHjqvbsezt3tkBigAVBRQHvFwY+3sAzm2fTYS5yh+Rp/BIAV0Ae\\n\" \\\n  \"cPUeybQ=\\n\" \\\n  \"-----END CERTIFICATE-----\\n\";\n"
  },
  {
    "path": "examples/SortedMenus/SortedMenus.ino",
    "content": "#include <M5ez.h>\n\n// A sorting method takes the form:\n// bool func(const char* s1, const char* s2) { return s1 comparedTo s2; }\n// Built-in sorting methos include:\n// For sorting by Names as quickly as possible\n// ezMenu::sort_asc_name_cs\t\tSort ascending by menu name, case sensitive\n// ezMenu::sort_asc_name_ci\t\tSort ascending by menu name, case insensitive\n// ezMenu::sort_dsc_name_cs\t\tSort descending by menu name, case sensitive\n// ezMenu::sort_dsc_name_ci\t\tSort descending by menu name, case insensitive\n\n// For sorting by Caption if there is one, falling back to sorting by Name if no Caption is provided (all purpose)\n// ezMenu::sort_asc_caption_cs\t\tSort ascending by menu caption or name if no caption, case sensitive\n// ezMenu::sort_asc_caption_ci\t\tSort ascending by menu caption or name if no caption, incase sensitive\n// ezMenu::sort_dsc_caption_cs\t\tSort descending by menu caption or name if no caption, case sensitive\n// ezMenu::sort_dsc_caption_ci\t\tSort descending by menu caption or name if no caption, case insensitive\n\n\nvoid setup() {\n\tez.begin();\n}\n\n\nvoid loop() {\n\tezMenu menu(\"Menu Sorting Demo\");\n\tmenu.txtSmall();\n\t// You can simply call setSortFunction once here, and the menu will always stay sorted.\n\t// menu.setSortFunction(yourSortingFunction);\n\tmenu.buttons(\"asc # Asc # dsc # Dsc # Unsorted #\");\n\tmenu.addItem(\"Just a few\");\n\tmenu.addItem(\"words of\");\n\tmenu.addItem(\"random text in\");\n\tmenu.addItem(\"No Particular Order.\");\n\tmenu.addItem(\"Press buttons\");\n\tmenu.addItem(\"to re-sort\");\n\tmenu.addItem(\"NAME IS IGNORED! Value is sorted. | as you like.\");\n\n\t// Or, you can call setSortFunction any time to re-sort the menu.\n\t// Once set, additional insertions are made in sorted order as well.\n\t// No need to call setSortFunction again unless you want to change to a different order.\n\twhile(true) {\n\t\tmenu.runOnce();\n\t\tString result = menu.pickButton();\n\t\tif     (result == \"asc\")      menu.setSortFunction(ezMenu::sort_asc_caption_ci);\n\t\telse if(result == \"Asc\")      menu.setSortFunction(ezMenu::sort_asc_caption_cs);\n\t\telse if(result == \"dsc\")      menu.setSortFunction(ezMenu::sort_dsc_caption_ci);\n\t\telse if(result == \"Dsc\")      menu.setSortFunction(ezMenu::sort_dsc_caption_cs);\n\t\telse if(result == \"Unsorted\") menu.setSortFunction(nullptr);\n\t}\n}\n"
  },
  {
    "path": "examples/SubMenu/SubMenu.ino",
    "content": "#include <M5ez.h>\n\n// This example is intended to show how to nest menus within menus, even when\n// special button processing is needed on menu selections.\n\n\n// Standard Arduino setup function. ez.begin() takes care of startup and initialization\nvoid setup() {\n  #include <themes/default.h>                         // per https://github.com/M5ez/M5ez#themes\n  #include <themes/dark.h>                            // makes both themes available\n  ez.begin();                                         // initializes everything\n}\n\n\n// Although the Arduino loop is usually called repeatedly, using an M5ez menu with no exit results in it being called once only\n//\nvoid loop() {\n  Serial.println(\"entering loop()\");                  // Shows what function we're in on the Serial Monitor\n  ezMenu topmenu(\"Top Menu\");                         // creates the menu but does nothing else\n  topmenu.txtSmall();                                 // makes menu text smaller, neater\n  topmenu.buttons(\"up # select # down\");              // 'select' sets pickName and pickCaption, all set pickButton\n  topmenu.addItem(\"dark | Dark Theme\",  dark);        // ignore in while loop, calls dark() automatically\n  topmenu.addItem(\"light | Light Theme\", light);      // ignore in while loop, calls light() automatically\n  topmenu.addItem(\"Red\");                             // does nothing; handled manually in while loop\n  topmenu.addItem(\"Green\");                           // does nothing; handled manually in while loop\n  topmenu.addItem(\"Blue\");                            // does nothing; handled manually in while loop\n  topmenu.addItem(\"Black\");                            // does nothing; handled manually in while loop\n  topmenu.addItem(\"SubMenu\");                         // does nothing; handled manually in while loop\n  while(topmenu.runOnce()) {                          // runOnce displays the menu and returns when a button is pressed\n    // you can watch the results in the Serial Monitor\n    Serial.printf(\"topmenu.pick        = %d\\n\",   topmenu.pick());\n    Serial.printf(\"topmenu.pickButton  = %s\\n\",   topmenu.pickButton().c_str());\n    Serial.printf(\"topmenu.pickName    = %s\\n\",   topmenu.pickName().c_str());\n    Serial.printf(\"topmenu.pickCaption = %s\\n\\n\", topmenu.pickCaption().c_str());\n    \n    String result  = topmenu.pickName();              // find out what menu was selected when 'select' button was pressed\n    if(     result == \"Red\")     ez.theme->menu_item_color = RED;\n    else if(result == \"Green\")   ez.theme->menu_item_color = GREEN;\n    else if(result == \"Blue\")    ez.theme->menu_item_color = BLUE;\n    else if(result == \"Black\")   ez.theme->menu_item_color = BLACK;\n    else if(result == \"SubMenu\") subMenu();           // create a sub menu, but we can return to this menu when it exits\n  }\n}\n\n\n// Function called automatically by selecting the 'Dark Theme' menu\n//\nvoid dark() { ez.theme->select(\"Dark\"); }             // called automatically when 'Dark Theme' menu is selected\n\n\n// Function called automatically by selecting the 'Light Theme' menu\n//\nvoid light() { ez.theme->select(\"Default\"); }         // called automatically when 'Light Theme' menu is selected\n\n\n// Display the submenu. When 'back' is selected, this menu is terminated and mainmenu resumes\n// the foo, bar and baz menus are just dummies; normally they would call a function of be handled in a runOnce loop\n//\nvoid subMenu() {\n  Serial.println(\"entering subMenu()\");               // Shows what function we're in on the Serial Monitor\n  ezMenu submenu(\"Sub Menu\");                         // creates the menu but does nothing else\n  submenu.txtSmall();                                 // makes menu text smaller, neater\n  submenu.buttons(\"up # back # select ## down #\");    // standard buttons for a submenu; long press on button A pops up one level\n  submenu.addItem(\"foo\");                             // not handled at all, so nothing happens when this menu is selected except a redraw\n  submenu.addItem(\"bar\");                             // not handled at all, so nothing happens when this menu is selected except a redraw\n  submenu.addItem(\"baz\");                             // not handled at all, so nothing happens when this menu is selected except a redraw\n  submenu.addItem(\"sub | subSubMenu\");                // returns the name \"sub\" but displays the caption \"subSubMenu\"\n  while(submenu.runOnce()) {                          // runOnce displays the menu and returns when a button is pressed\n    // you can watch the results in the Serial Monitor\n    Serial.printf(\"submenu.pick        = %d\\n\",   submenu.pick());\n    Serial.printf(\"submenu.pickButton  = %s\\n\",   submenu.pickButton().c_str());\n    Serial.printf(\"submenu.pickName    = %s\\n\",   submenu.pickName().c_str());\n    Serial.printf(\"submenu.pickCaption = %s\\n\\n\", submenu.pickCaption().c_str());\n    \n    if(submenu.pickName() == \"sub\") subSubMenu();     // submenu.pickName() == \"sub\", or submenu.pickCaption() == \"subSubMenu\", or submenu.pick == 4\n  }\n}\n\n\n// Display an even more deaply nested menu. When 'back' is selected this menu is terminated and submenu resumes\n// the tic, tac and toe menus are just dummies; normally they would call a function of be handled in a runOnce loop\n//\nvoid subSubMenu() {\n  Serial.println(\"entering subSubMenu()\");            // Shows what function we're in on the Serial Monitor\n  ezMenu subsubmenu(\"Sub Sub Menu\");                  // creates the menu but does nothing else\n  subsubmenu.txtSmall();                              // makes menu text smaller, neater\n  subsubmenu.buttons(\"up # back # select ## down #\"); // standard buttons for a submenu; long press on button A pops up one level\n  subsubmenu.addItem(\"tic\");                          // not handled at all, so nothing happens when this menu is selected except a redraw\n  subsubmenu.addItem(\"tac\");                          // not handled at all, so nothing happens when this menu is selected except a redraw\n  subsubmenu.addItem(\"toe\");                          // not handled at all, so nothing happens when this menu is selected except a redraw\n  subsubmenu.run();                                   // display menu and handle menus until 'back' is selected, then exit, returning to subMenu()\n}\n"
  },
  {
    "path": "examples/z-ezTimeLog/z-ezTimeLog.ino",
    "content": "/*\n * \n * This is a \"z-sketch\". It means you can run this sketch on its own, or use it as a sub-sketch of some bigger program\n * See the M5ez user manual under z-sketches at https://github.com/M5ez/M5ez\n * \n * This program sets the ezTime NTP interval to 20 seconds (way too often, use only for demonstration purposes) and\n * then show the debug log of ezTime so you can see it update its clock. The output will scroll when it reaches the\n * bottom of the screen.\n * \n */\n\n\n#ifndef MAIN_DECLARED\n\n#include <M5Stack.h>\n#include <M5ez.h>\n#include <ezTime.h>\n\nvoid setup() {\n  ez.begin();\n  ezTimeLog();\n\n  while(true) {\n    ez.yield();\n  }\n}\n\nvoid loop() {\n\n}\n\n#endif  // #ifndef MAIN_DECLARED\n\n\n\nvoid ezTimeLog() {\n\n  ez.header.show(\"ezTime log\");\n  ez.canvas.scroll(true);\n  ezt::setDebug(INFO, ez.canvas);\n  ezt::setInterval(20);\n\n  #ifdef MAIN_DECLARED\n    ez.buttons.wait(\"Abort\");\n    ezt::setDebug(NONE, Serial);\n    ezt::setInterval(600);\n  #endif\n  \n}\n"
  },
  {
    "path": "examples/z-sysInfo/z-sysInfo.ino",
    "content": "/*\n * \n * This is a \"z-sketch\". It means you can run this sketch on its own, or use it as a sub-sketch of some bigger program\n * See the M5ez user manual under z-sketches at https://github.com/M5ez/M5ez\n *\n */\n\n#ifndef MAIN_DECLARED\n\n#include <M5Stack.h>\n#include <M5ez.h>\n\nvoid setup() {\n  ez.begin();\n  sysInfo();\n}\n\nvoid loop() {\n\n}\n\nString exit_button = \"\";\n\n#else\n\nString exit_button = \"Exit\";\n\n#endif  // #ifndef MAIN_DECLARED\n\n\n\nvoid sysInfo() {\n  sysInfoPage1();\n  while(true) {\n    String btn = ez.buttons.poll();\n    if (btn == \"up\") sysInfoPage1();\n    if (btn == \"down\") sysInfoPage2();\n    if (btn == \"Exit\") break;\n  }\n}\n\n#include <SPIFFS.h>\n\nvoid sysInfoPage1() {\n  const byte tab = 120;\n  ez.screen.clear();\n  ez.header.show(\"System Info  (1/2)\");\n  ez.buttons.show(\"#\" + exit_button + \"#down\");\n  ez.canvas.font(&FreeSans9pt7b);\n  ez.canvas.lmargin(10);\n  ez.canvas.println(\"\");\n  ez.canvas.print(\"CPU freq:\");  ez.canvas.x(tab); ez.canvas.println(String(ESP.getCpuFreqMHz()) + \" MHz\");\n  ez.canvas.print(\"CPU cores:\");  ez.canvas.x(tab); ez.canvas.println(\"2\");    //   :)\n  ez.canvas.print(\"Chip rev.:\");  ez.canvas.x(tab); ez.canvas.println(String(ESP.getChipRevision()));\n  ez.canvas.print(\"Flash speed:\");  ez.canvas.x(tab); ez.canvas.println(String(ESP.getFlashChipSpeed() / 1000000) + \" MHz\");\n  ez.canvas.print(\"Flash size:\");  ez.canvas.x(tab); ez.canvas.println(String(ESP.getFlashChipSize() / 1000000) + \" MB\");\n  ez.canvas.print(\"ESP SDK:\");  ez.canvas.x(tab); ez.canvas.println(String(ESP.getSdkVersion()));\n  ez.canvas.print(\"M5ez:\");  ez.canvas.x(tab); ez.canvas.println(String(ez.version()));\n}\n\nvoid sysInfoPage2() {\n  const String SD_Type[5] = {\"NONE\", \"MMC\", \"SD\", \"SDHC\", \"UNKNOWN\"};\n  const byte tab = 140;\n  ez.screen.clear();\n  ez.header.show(\"System Info  (2/2)\");\n  ez.buttons.show(\"up#\" + exit_button + \"#\");\n  ez.canvas.font(&FreeSans9pt7b);\n  ez.canvas.lmargin(10);\n  ez.canvas.println(\"\");\n  ez.canvas.print(\"Free RAM:\");  ez.canvas.x(tab);  ez.canvas.println(String((long)ESP.getFreeHeap()) + \" bytes\");\n  ez.canvas.print(\"Min. free seen:\");  ez.canvas.x(tab); ez.canvas.println(String((long)esp_get_minimum_free_heap_size()) + \" bytes\");\n  const int sd_type = SD.cardType();\n  \n  SPIFFS.begin();\n  ez.canvas.print(\"SPIFFS size:\"); ez.canvas.x(tab); ez.canvas.println(String((long)SPIFFS.totalBytes()) + \" bytes\");\n  ez.canvas.print(\"SPIFFS used:\"); ez.canvas.x(tab); ez.canvas.println(String((long)SPIFFS.usedBytes()) + \" bytes\");\n  ez.canvas.print(\"SD type:\"); ez.canvas.x(tab); ez.canvas.println(SD_Type[sd_type]);\n  if (sd_type != 0) {\n    ez.canvas.print(\"SD size:\"); ez.canvas.x(tab); ez.canvas.println(String((long)SD.cardSize()  / 1000000) + \" MB\");\n    ez.canvas.print(\"SD used:\"); ez.canvas.x(tab); ez.canvas.println(String((long)SD.usedBytes()  / 1000000) + \" MB\");\n  }\n}\n"
  },
  {
    "path": "keywords.txt",
    "content": "ez\tKEYWORD3\nbegin\tKEYWORD2\n\nscreen\tKEYWORD3\nclear\tKEYWORD2\nbackground\tKEYWORD2\n\nheader\tKEYWORD3\nshow\tKEYWORD2\nshown\tKEYWORD2\ntitle\tKEYWORD2\ninsert\tKEYWORD2\nremove\tKEYWORD2\nposition\tKEYWORD2\ndraw\tKEYWORD2\n\ncanvas\tKEYWORD3\nreset\tKEYWORD2\ntop\tKEYWORD2\nbottom\tKEYWORD2\nleft\tKEYWORD2\nright\tKEYWORD2\nheight\tKEYWORD2\nwidth\tKEYWORD2\nprint\tKEYWORD2\nprintln\tKEYWORD2\nprintf\tKEYWORD2\nscroll\tKEYWORD2\nwrap\tKEYWORD2\nlmargin\tKEYWORD2\nfont\tKEYWORD2\ncolor\tKEYWORD2\nx\tKEYWORD2\ny\tKEYWORD2\npos\tKEYWORD2\n\nbuttons\tKEYWORD3\npoll\tKEYWORD2\nwait\tKEYWORD2\n\nyield\tKEYWORD2\n\naddEvent\tKEYWORD2\nremoveEvent\tKEYWORD2\n\n\nmsgBox\tKEYWORD2\n\ntextInput\tKEYWORD2\n\ntextBox\tKEYWORD2\n\nfaces\tKEYWORD3\non\tKEYWORD2\n\n# m5.lcd wrappers that make fonts easier\nsetFont\tKEYWORD2\nfontHeight\tKEYWORD2\n\t\nsettings\tKEYWORD3\nmenu\tKEYWORD2\nadd\tKEYWORD2\nremove\tKEYWORD2\nReadFlash\tKEYWORD2\nWriteFlash\tKEYWORD2\nindexForSSID\tKEYWORD2\nupdate\tKEYWORD2\nupdateError\tKEYWORD2\n\nclock\tKEYWORD3\n\nbacklight\tKEYWORD3\n\nmenuObj\tKEYWORD2\n\n\n# Generic String object helper functions\nrightOf\tKEYWORD2\nleftOf\tKEYWORD2\nchopString\tKEYWORD2\ncharsFit\tKEYWORD2\nclipString\tKEYWORD2\nisBackExitOrDone\tKEYWORD2\n\n\n# ezProgressBar\nezProgressBar\tKEYWORD3\nvalue\tKEYWORD2\t\n\t\n# ezMenu\nezMenu\tKEYWORD3\naddItem\tKEYWORD2\ndeleteItem\tKEYWORD2\nsetCaption\tKEYWORD2\ngetItemNum\tKEYWORD2\nbuttons\tKEYWORD2\nupOnFirst\tKEYWORD2\nleftOnFirst\tKEYWORD2\ndownOnLast\tKEYWORD2\nrightOnLast\tKEYWORD2\npick\tKEYWORD2\npickName\tKEYWORD2\npickCaption\tKEYWORD2\nrun\tKEYWORD2\nrunOnce\tKEYWORD2\ntxtBig\tKEYWORD2\ntxtSmall\tKEYWORD2\ntxtFont\tKEYWORD2\nimgBackground\tKEYWORD2\nimgFromTop\tKEYWORD2\nimgCaptionFont\tKEYWORD2\t\nimgCaptionLocation\tKEYWORD2\nimgCaptionColor\tKEYWORD2\nimgCaptionMargins\tKEYWORD2\n\n# because it was forgotten in the M5Stack keywords.txt\n# (They only have it as \"Lcd\", but they made the \"lcd\" alias.)\nlcd\tKEYWORD2\n"
  },
  {
    "path": "library.json",
    "content": "{\n  \"name\": \"M5ez\",\n  \"description\": \"Complete interface builder for the M5Stack, an ESP32 based mini tinker-computer\",\n  \"keywords\": \"m5ez, m5stack, esp32\",\n  \"authors\": {\n    \"name\": \"Rop Gonggrijp\",\n    \"url\": \"https://github.com/ropg\",\n    \"maintainer\": true\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/M5ez/M5ez\"\n  },\n  \"dependencies\": [\n    { \"name\": \"M5Stack\" },\n    { \"name\": \"ezTime\" }\n  ],\n  \"version\": \"2.3.0\",\n  \"framework\": \"arduino\",\n  \"platforms\": \"espressif32\",\n  \"build\": {\n    \"libArchive\": false\n  }\n}"
  },
  {
    "path": "library.properties",
    "content": "name=M5ez\nversion=2.3.0\nauthor=Rop Gonggrijp\nmaintainer=Rop Gonggrijp\nsentence=Complete interface builder for the M5Stack, an ESP32 based mini tinker-computer\nparagraph=See more on https://github.com/M5ez/M5ez\ncategory=Display\nurl=https://github.com/M5ez/M5ez\narchitectures=esp32\nincludes=M5ez.h\ndepends=ezTime, M5Stack\n"
  },
  {
    "path": "src/M5ez.cpp",
    "content": "#include <M5ez.h>\n\n#include <Preferences.h>\n\n#ifdef M5EZ_WIFI\n\t#include <WiFi.h>\n\textern \"C\" {\n\t\t#include \"esp_wifi.h\"\n\t\t#include \"esp_wps.h\"\n\t}\n\t#include <WiFiClientSecure.h>\t\t// For ez.update\n\t#include <Update.h>\n#endif //M5EZ_WIFI\n\n#ifdef M5EZ_CLOCK\n\t#include <ezTime.h>\n#endif\n\n#ifdef M5EZ_BLE\n\t#include <BLEDevice.h>\n\t#include <BLEUtils.h>\n\t#include <BLEScan.h>\n\t#include <BLEAdvertisedDevice.h>\n#endif\n\n#include <algorithm>\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   T H E M E\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nvoid ezTheme::begin() {\n\tif (!ez.themes.size()) {\n\t\tezTheme defaultTheme;\n\t\tdefaultTheme.add();\n\t}\n\tez.theme = &ez.themes[0];\n\tPreferences prefs;\n\tprefs.begin(\"M5ez\", true);\t// read-only\n\tselect(prefs.getString(\"theme\", \"\"));\n\tprefs.end();\n}\n\nvoid ezTheme::add() {\n\tez.themes.push_back(*this);\n}\n\nbool ezTheme::select(String name) {\n\tfor (uint8_t n = 0; n < ez.themes.size(); n++) {\n\t\tif (ez.themes[n].name == name) { \n\t\t\tez.theme = &ez.themes[n];\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nvoid ezTheme::menu() {\n\tString orig_name = ez.theme->name;\n\tezMenu thememenu(\"Theme chooser\");\n\tthememenu.txtSmall();\n\tthememenu.buttons(\"up#Back#select##down#\");\n\tfor (uint8_t n = 0; n < ez.themes.size(); n++) {\n\t\tthememenu.addItem(ez.themes[n].name);\n\t}\n\twhile(thememenu.runOnce()) {\n\t\tif (thememenu.pick()) {\n\t\t\tez.theme->select(thememenu.pickName());\n\t\t}\n\t}\n\tif (ez.theme->name != orig_name) {\n\t\tPreferences prefs;\n\t\tprefs.begin(\"M5ez\");\n\t\tprefs.putString(\"theme\", ez.theme->name);\n\t\tprefs.end();\n\t}\n\treturn;\t\n}\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   S C R E E N\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nuint16_t ezScreen::_background; \n\nvoid ezScreen::begin() {\n\t_background = ez.theme->background;\n\tez.header.begin();\n\tez.canvas.begin();\n\tez.buttons.begin();\n}\n\nuint16_t ezScreen::background() { return _background; }\n\nvoid ezScreen::clear() { clear(ez.theme->background); }\n\nvoid ezScreen::clear(uint16_t color) {\n\t_background = color;\n\tez.header.clear(false);\n\tez.buttons.clear(false);\n\tez.canvas.reset();\n\tm5.lcd.fillRect(0, 0, TFT_W, TFT_H, color);\n}\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   H E A D E R\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nstd::vector<header_widget_t> ezHeader::_widgets;\nbool ezHeader::_shown;\nString ezHeader::_title;\n\nvoid ezHeader::begin() {\n\t_widgets.clear();\n\tinsert(0, \"title\", 0, _drawTitle, true);\n\t_shown = false;\n}\n\nvoid ezHeader::_recalculate() {\n\tbool we_have_leftover = false;\n\tuint16_t x = 0;\n\tfor (uint8_t n = 0; n < _widgets.size(); n++) {\t\t\t\t// start from left, set x values\n\t\t_widgets[n].x = x;\n\t\tif (_widgets[n].leftover) {\t\t\t\t\t\t\t\t// until \"leftover\" widget (usually \"title\")\n\t\t\twe_have_leftover = true;\n\t\t\tbreak;\n\t\t}\n\t\tx += _widgets[n].w;\n\t}\n\tif (we_have_leftover) {\t\t\t\t\t\t\t\t\t\t// Then start from right setting x values\n\t\tx = TFT_W;\n\t\tfor (int8_t n = _widgets.size() - 1; n >= 0 ; n--) {\n\t\t\tif (_widgets[n].leftover) {\t\t\t\t\t\t\t// and set width of leftover widget to remainder\n\t\t\t\t_widgets[n].w = x - _widgets[n].x;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx -= _widgets[n].w;\n\t\t\t_widgets[n].x = x;\n\t\t}\n\t}\n\tif (_shown) show();\n}\n\nvoid ezHeader::insert(uint8_t position, String name, uint16_t width, void (*function)(uint16_t x, uint16_t w), bool leftover /* = false */) {\n\tfor (uint8_t n = 0; n < _widgets.size(); n++) {\n\t\tif (_widgets[n].leftover) leftover = false;\t\t\t// ignore leftover if there already is one\n\t\tif (_widgets[n].name == name) return;\t\t\t\t// fail silently if trying to create two widgets with same name\n\t}\n\tif (position > _widgets.size()) position = _widgets.size();\t\t// interpret anything over current number of widgets as RIGHTMOST\n\theader_widget_t wdgt;\n\twdgt.name = name;\n\twdgt.leftover = leftover;\n\twdgt.x = 0;\n\twdgt.w = width;\n\twdgt.function = function;\n\t_widgets.insert(_widgets.begin() + position, wdgt);\n\t_recalculate();\n}\n\nvoid ezHeader::remove(String name) {\n\tfor (uint8_t n = 0; n < _widgets.size(); n++) {\n\t\tif (_widgets[n].name == name) {\n\t\t\t_widgets.erase(_widgets.begin() + n);\n\t\t\t_recalculate();\n\t\t}\n\t}\n}\n\nuint8_t ezHeader::position(String name) {\n\tfor (uint8_t n = 0; n < _widgets.size(); n++) {\n\t\tif (_widgets[n].name == name) return n;\n\t}\n\treturn 0;\n}\n\nvoid ezHeader::show(String t /* = \"\" */) {\n\t_shown = true;\n\tif (t != \"\") _title = t;\t\t\t\t\t\t\t\t\t\t\t// only change title if provided\n\tm5.lcd.fillRect(0, 0, TFT_W, ez.theme->header_height, ez.theme->header_bgcolor);\t// Clear header area\n\tfor (uint8_t n = 0; n < _widgets.size(); n++) {\n\t\t(_widgets[n].function)(_widgets[n].x, _widgets[n].w);\t\t// Tell all header widgets to draw\n\t}\n\tez.canvas.top(ez.theme->header_height);\n}\n\nvoid ezHeader::draw(String name) {\n\tif (!_shown) return;\n\tfor (uint8_t n = 0; n < _widgets.size(); n++) {\n\t\tif (_widgets[n].name == name) {\n\t\t\t(_widgets[n].function)(_widgets[n].x, _widgets[n].w);\n\t\t}\n\t}\n}\n\nvoid ezHeader::clear(bool wipe /* = true */) {\n\tif (wipe) m5.lcd.fillRect(0, 0, TFT_W, ez.theme->header_height, ez.theme->background);\n\t_shown = false;\n\tez.canvas.top(0);\n}\n\nbool ezHeader::shown() { return _shown; }\n\nString ezHeader::title() {\n//\tif (_shown)\t{\n\t\treturn _title;\n//\t} else {\n//\t\treturn \"\";\n//\t}\n}\n\nvoid ezHeader::title(String t) {\n\t_title = t;\n\tif (_shown) draw(\"title\");\n}\n\nvoid ezHeader::_drawTitle(uint16_t x, uint16_t w) {\n\tm5.lcd.fillRect(x, 0, w, ez.theme->header_height, ez.theme->header_bgcolor);\n\tm5.lcd.setTextDatum(TL_DATUM);\n\tm5.lcd.setTextColor(ez.theme->header_fgcolor);\n\tez.setFont(ez.theme->header_font);\n\tm5.lcd.drawString(ez.clipString(_title, w - ez.theme->header_hmargin), x + ez.theme->header_hmargin, ez.theme->header_tmargin);\n}\t\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   C A N V A S\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nuint8_t ezCanvas::_y, ezCanvas::_top, ezCanvas::_bottom;\nuint16_t ezCanvas::_x, ezCanvas::_left, ezCanvas::_right, ezCanvas::_lmargin;\nconst GFXfont* ezCanvas::_font;\nuint16_t ezCanvas::_color;\nbool ezCanvas::_wrap, ezCanvas::_scroll;\nstd::vector<print_t> ezCanvas::_printed;\nuint32_t ezCanvas::_next_scroll;\n\nvoid ezCanvas::begin() {\n\t_left = 0;\n\t_right = TFT_W - 1;\n\t_top = 0;\n\t_bottom = TFT_H - 1;\n\tez.addEvent(ez.canvas.loop);\n\treset();\n}\n\nvoid ezCanvas::reset() {\n\t_wrap = true;\n\t_scroll = false;\n\t_font = ez.theme->print_font;\n\t_color = ez.theme->print_color;\n\t_lmargin = 0;\n\t_next_scroll = 0;\n\tclear();\n}\n\nvoid ezCanvas::clear() {\n\tm5.lcd.fillRect(left(), top(), width(), height(), ez.screen.background());\n\t_x = _lmargin;\n\t_y = 0;\n\t_printed.clear();\n}\n\nuint8_t ezCanvas::top() { return _top; }\n\nuint8_t ezCanvas::bottom() { return _bottom; }\n\nuint16_t ezCanvas::left() { return _left; }\n\nuint16_t ezCanvas::right() { return _right; }\n\nuint8_t ezCanvas::height() { return _bottom - _top + 1;}\n\nuint16_t ezCanvas::width() { return _right - _left + 1; }\n\nbool ezCanvas::scroll() { return _scroll; }\n\nvoid ezCanvas::scroll(bool s) { _scroll = s; }\n\nbool ezCanvas::wrap() { return _wrap; }\n\nvoid ezCanvas::wrap(bool w) { _wrap = w; }\t\n\nuint16_t ezCanvas::lmargin() { return _lmargin; }\n\nvoid ezCanvas::lmargin(uint16_t newmargin) {\n\tif (_x < newmargin) _x = newmargin;\n\t_lmargin = newmargin;\n}\n\nvoid ezCanvas::font(const GFXfont* font) { _font = font; }\n\nconst GFXfont* ezCanvas::font() { return _font; }\n\nvoid ezCanvas::color(uint16_t color) { _color = color; }\n\nuint16_t ezCanvas::color() { return _color; }\n\nvoid ezCanvas::pos(uint16_t x, uint8_t y) {\n\t_x = x;\n\t_y = y;\n}\n\nuint16_t ezCanvas::x() { return _x; }\n\nvoid ezCanvas::x(uint16_t x) { _x = x; }\n\nuint8_t ezCanvas::y() { return _y; }\n\nvoid ezCanvas::y(uint8_t y) { _y = y; }\n\t\t\nvoid ezCanvas::top(uint8_t newtop) {\n\tif (_y < newtop) _y = newtop;\n\t_top = newtop;\n}\n\nvoid ezCanvas::bottom(uint8_t newbottom) {\n\t_bottom = newbottom;\n}\n\nsize_t ezCanvas::write(uint8_t c) {\n\tString tmp = String((char)c);\n\t_print(tmp);\n\treturn 1;\n}\n\nsize_t ezCanvas::write(const char *str) {\n\tString tmp = String(str);\n\t_print(tmp);\n\treturn sizeof(str);\n}\n\nsize_t ezCanvas::write(const uint8_t *buffer, size_t size) {\n\tString tmp;\n\ttmp.reserve(size);\n\tfor (uint16_t n = 0; n < size ; n++) tmp += (char)*(buffer + n);\n\t_print(tmp);\n\treturn size;\n}\n\nuint16_t ezCanvas::loop() {\n\tif (_next_scroll && millis() >= _next_scroll) {\n\t\tez.setFont(_font);\n\t\tuint8_t h = ez.fontHeight();\n\t\tuint8_t scroll_by = _y - _bottom;\n\t\tif (_x > _lmargin) scroll_by += h;\n\t\tconst GFXfont* hold_font = _font;\n\t\tconst uint16_t hold_color = _color;\n\t\tfor (uint16_t n = 0; n < _printed.size(); n++) {\n\t\t\t_printed[n].y -= scroll_by;\n\t\t}\n\t\tm5.lcd.fillRect(left(), top(), width(), height(), ez.screen.background());\n\t\t// m5.lcd.fillRect(0, 0, 320, 240, ez.screen.background());\n\t\tfor (uint16_t n = 0; n < _printed.size(); n++) {\n\t\t\tif (_printed[n].y >= _top) {\n\t\t\t\tif (_printed[n].font != _font) ez.setFont(_printed[n].font);\n\t\t\t\tif (_printed[n].color != _color) m5.lcd.setTextColor(_printed[n].color);\n\t\t\t\tm5.lcd.drawString(_printed[n].text, _printed[n].x, _printed[n].y);\n\t\t\t}\n\t\t}\n\t\t_y -= scroll_by;\n\t\t_font = hold_font;\n\t\t_color = hold_color;\n\t\t_next_scroll = 0;\n\t\t\n\t\tstd::vector<print_t> clean_copy;\n\t\tfor (uint16_t n = 0; n < _printed.size(); n++) {\n\t\t\tif (_printed[n].y >= 0) clean_copy.push_back(_printed[n]);\n\t\t}\n\t\t_printed = clean_copy;\n\t\tSerial.println(ESP.getFreeHeap());\n\t}\n\treturn 10;\n}\n\t\n\nvoid ezCanvas::_print(String text) {\n \tez.setFont(_font);\n \tm5.lcd.setTextDatum(TL_DATUM);\n\tm5.lcd.setTextColor(_color, ez.theme->background);\n \tuint8_t h = ez.fontHeight();\n \tif (_y + h > _bottom) {\n \t\tif (!_scroll) return;\n \t\tif (!_next_scroll) _next_scroll = millis() + 200;\n \t} \t\n \tint16_t crlf = text.indexOf(\"\\r\\n\");\n \tString remainder = \"\";\n \tif (crlf != -1) {\n \t\tremainder = text.substring(crlf + 2);\n \t\ttext = text.substring(0,crlf);\n \t}\n \tif (_x + m5.lcd.textWidth(text) <= _right) {\n\t\tif (text != \"\") _putString(text);\n\t} else {\n\t\tfor (uint16_t n = 0; n < text.length(); n++) {\n\t\t\tif (_x + m5.lcd.textWidth(text.substring(0, n + 1)) > _right) {\n\t\t\t\tif (n) {\n\t\t\t\t\t_putString(text.substring(0, n));\n\t\t\t\t} \n\t\t\t\tif (_wrap) {\n\t\t\t\t\t_x = _lmargin;\n\t\t\t\t\t_y += h;\n\t\t\t\t\t_print(text.substring(n));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\t\t\t\n\t}\n\tif (crlf != -1) {\n\t\t_x = _lmargin;\n\t\t_y += h;\n\t\tif (remainder != \"\") _print (remainder);\n\t}\n}\n\nvoid ezCanvas::_putString(String text) {\n\tez.setFont(_font);\n\tuint8_t h = ez.fontHeight();\n\tif (_scroll) {\n\t\tprint_t p;\n\t\tp.font = _font;\n\t\tp.color = _color;\n\t\tp.x = _x;\n\t\tp.y = _y;\n\t\tp.text = text;\n\t\t_printed.push_back(p);\n\t}\n\tif (_y + h > _bottom) {\n\t\t_x += m5.lcd.textWidth(text);\n\t} else{\n\t\t_x += m5.lcd.drawString(text, _x, _y);\n\t}\n}\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   B U T T O N S \n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nString ezButtons::_btn_a_s, ezButtons::_btn_a_l;\nString ezButtons::_btn_b_s, ezButtons::_btn_b_l;\nString ezButtons::_btn_c_s, ezButtons::_btn_c_l;\nString ezButtons::_btn_ab, ezButtons::_btn_bc, ezButtons::_btn_ac;\nbool ezButtons::_key_release_wait;\nbool ezButtons::_lower_button_row, ezButtons::_upper_button_row;  \n\nvoid ezButtons::begin() { clear(false); }\n\nvoid ezButtons::show(String buttons) {\n\tbuttons.trim();\n\tstd::vector<String> buttonVector;\n\tez.chopString(buttons, \"#\", buttonVector, true);\n\tswitch (buttonVector.size()) {\n\t\tcase 1:\n\t\t\t_drawButtons(\"\", \"\", buttons, \"\", \"\", \"\", \"\", \"\", \"\");\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\t// Three elements, so shortpress only\n\t\t\t_drawButtons(buttonVector[0], \"\", buttonVector[1], \"\", buttonVector[2], \"\", \"\", \"\", \"\");\n\t\t\tbreak;\n\t\tcase 6:\n\t\t\t// Six elements, so all buttons long and short\n\t\t\t_drawButtons(buttonVector[0], buttonVector[1], buttonVector[2], buttonVector[3], buttonVector[4], buttonVector[5], \"\", \"\", \"\");\n\t\t\tbreak;\n\t\tcase 9:\n\t\t\t// Nine elements, so all buttons long and short plus the top row of three multi-keys\n\t\t\t_drawButtons(buttonVector[0], buttonVector[1], buttonVector[2], buttonVector[3], buttonVector[4], buttonVector[5], buttonVector[6], buttonVector[7], buttonVector[8]);\n\t\t\tbreak;\n\t}\n}\n\nvoid ezButtons::clear(bool wipe /* = true */) {\n\tif (wipe && (_lower_button_row  || _upper_button_row)) {\n\t\tm5.lcd.fillRect(0, ez.canvas.bottom() + 1, TFT_H - ez.canvas.bottom() - 1, TFT_W, ez.screen.background());\n\t}\n\t_btn_a_s = _btn_a_l = _btn_b_s = _btn_b_l = _btn_c_s = _btn_c_l = \"\";\n\t_btn_ab = _btn_bc = _btn_ac = \"\";\n\t_lower_button_row = false;\n\t_upper_button_row = false;\n\tez.canvas.bottom(TFT_H - 1);\n}\n\nvoid ezButtons::_drawButtons(String btn_a_s, String btn_a_l, String btn_b_s, String btn_b_l, String btn_c_s, String btn_c_l, String btn_ab, String btn_bc, String btn_ac) {\n\tint16_t btnwidth = int16_t( (TFT_W - 4 * ez.theme->button_gap ) / 3);\n\n\t// See if any buttons are used on the bottom row\n\tif (btn_a_s != \"\" || btn_a_l != \"\" || btn_b_s != \"\" || btn_b_l != \"\" || btn_c_s != \"\" || btn_c_l != \"\") {\n\t\tif (!_lower_button_row) {\n\t\t\t// If the lower button row wasn't there before, clear the area first\n\t\t\tm5.lcd.fillRect(0, TFT_H - ez.theme->button_height - ez.theme->button_gap, TFT_W, ez.theme->button_height + ez.theme->button_gap, ez.screen.background());\n\t\t}\n\t\t// Then draw the three buttons there. (drawButton erases single buttons if unused.)\n\t\tif (_btn_a_s != btn_a_s || _btn_a_l != btn_a_l) {\n\t\t\t_drawButton(1, ez.rightOf(btn_a_s, \"|\", true), ez.rightOf(btn_a_l, \"|\", true), ez.theme->button_gap, btnwidth);\n\t\t\t_btn_a_s = btn_a_s;\n\t\t\t_btn_a_l = btn_a_l;\n\t\t}\n\t\tif (_btn_b_s != btn_b_s || _btn_b_l != btn_b_l) {\n\t\t\t_drawButton(1, ez.rightOf(btn_b_s, \"|\", true), ez.rightOf(btn_b_l, \"|\", true), btnwidth + 2 * ez.theme->button_gap, btnwidth);\n\t\t\t_btn_b_s = btn_b_s;\n\t\t\t_btn_b_l = btn_b_l;\t\t\n\t\t}\n\t\tif (_btn_c_s != btn_c_s || _btn_c_l != btn_c_l) {\n\t\t\t_drawButton(1, ez.rightOf(btn_c_s, \"|\", true), ez.rightOf(btn_c_l, \"|\", true), 2 * btnwidth + 3 * ez.theme->button_gap, btnwidth);\n\t\t\t_btn_c_s = btn_c_s;\n\t\t\t_btn_c_l = btn_c_l;\t\t\n\t\t}\n\t\t_lower_button_row = true;\n\t} else {\n\t\tif (_lower_button_row) {\n\t\t\t// If there was a lower button row before and it's now gone, clear the area\n\t\t\tm5.lcd.fillRect(0, TFT_H - ez.theme->button_height - ez.theme->button_gap, TFT_W, ez.theme->button_height + ez.theme->button_gap, ez.screen.background());\n\t\t\t_btn_a_s = _btn_a_l = _btn_b_s = _btn_b_l = _btn_c_s = _btn_c_l = \"\";\n\t\t\t_lower_button_row = false;\n\t\t}\n\t}\n\t//Now check if there are multi-buttons used (top row)\n\tif (btn_ab != \"\" || btn_bc != \"\" || btn_ac != \"\") {\n\t\tif (!_upper_button_row) {\n\t\t\t// If the upper button row wasn't there before, clear the area first\n\t\t\tm5.lcd.fillRect(0, TFT_H - 2 * (ez.theme->button_height + ez.theme->button_gap), TFT_W, ez.theme->button_height + ez.theme->button_gap, ez.screen.background());\n\t\t}\n\t\t// Then draw the buttons\n\t\tif (_btn_ab != btn_ab) {\n\t\t\t_drawButton(2, ez.rightOf(btn_ab, \"|\", true), \"\", ez.theme->button_gap + (btnwidth / 2), btnwidth);\n\t\t\t_btn_ab = btn_ab;\n\t\t}\n\t\tif (_btn_bc != btn_bc) {\n\t\t\t_drawButton(2, ez.rightOf(btn_bc, \"|\", true), \"\", (2 * ez.theme->button_gap) + btnwidth + (btnwidth / 2), btnwidth);\n\t\t\t_btn_bc = btn_bc;\n\t\t}\n\t\tif (_btn_ac != btn_ac) {\n\t\t\t// Two halves of the same button\n\n\t\t\t// ugly in code, prettier on the screen: making the buttons square on the screen edges to signal wrap-around\n\t\t\tm5.lcd.fillRect(0, TFT_H - 2 * ez.theme->button_height - ez.theme->button_gap, btnwidth / 4, ez.theme->button_height, ez.theme->button_bgcolor_t);\n\t\t\tm5.lcd.fillRect(TFT_W - (btnwidth / 4), TFT_H - 2 * ez.theme->button_height - ez.theme->button_gap, btnwidth / 4, ez.theme->button_height, ez.theme->button_bgcolor_t);\n\n\t\t\t_drawButton(2, ez.rightOf(btn_ac, \"|\", true), \"\", (3 * ez.theme->button_gap) + (2 * btnwidth) + (btnwidth / 2), (btnwidth / 2));\n\t\t\t_drawButton(2, ez.rightOf(btn_ac, \"|\", true), \"\", 0, (btnwidth / 2));\n\n\t\t\t_btn_ac = btn_ac;\n\t\t}\n\t\t_upper_button_row = true;\n\t} else {\n\t\tif (_upper_button_row) {\n\t\t\t// If there was an upper button row before and it's now gone, clear the area\n\t\t\tm5.lcd.fillRect(0, TFT_H - 2 * (ez.theme->button_height + ez.theme->button_gap), TFT_W, ez.theme->button_height + ez.theme->button_gap, ez.screen.background());\n\t\t\t_btn_ab = _btn_bc = _btn_ac = \"\";\n\t\t\t_upper_button_row = false;\n\t\t}\t\t\t\n\t}\n\n\tuint8_t button_rows = _upper_button_row ? 2 : (_lower_button_row ? 1 : 0);\n\tez.canvas.bottom(TFT_H - (button_rows * (ez.theme->button_height + ez.theme->button_gap)));\n}\n\nvoid ezButtons::_drawButton(int16_t row, String text_s, String text_l, int16_t x, int16_t w) {\n\t// row = 1 for lower and 2 for upper row\n\tint16_t y, bg_color;\n\tif (row == 1) {\n\t\ty = TFT_H - ez.theme->button_height;\n\t\tbg_color = ez.theme->button_bgcolor_b;\n\t} else {\n\t\ty = TFT_H - 2 * ez.theme->button_height - ez.theme->button_gap;\n\t\tbg_color = ez.theme->button_bgcolor_t;\n\t}\n\tif (text_s != \"\" || text_l != \"\") {\n\t\tez.setFont(ez.theme->button_font);\n\t\tm5.lcd.fillRoundRect(x, y, w, ez.theme->button_height, ez.theme->button_radius, bg_color);\n\t\tif (text_l != \"\") {\n\t\t\t_drawButtonString(text_s, x + ez.theme->button_hmargin, y + ez.theme->button_tmargin, ez.theme->button_fgcolor, TL_DATUM);\n\t\t} else {\n\t\t\t_drawButtonString(text_s, x + int16_t(w / 2), y + ez.theme->button_tmargin, ez.theme->button_fgcolor, TC_DATUM);\n\t\t}\n\t\t_drawButtonString(text_l, x + w - ez.theme->button_hmargin, y + ez.theme->button_tmargin, ez.theme->button_longcolor, TR_DATUM);\n\t} else {\n\t\tm5.lcd.fillRect(x, y, w, ez.theme->button_height, ez.screen.background());\n\t}\n}\n\nvoid ezButtons::_drawButtonString(String text, int16_t x, int16_t y, uint16_t color, int16_t datum) {\n\tif (text == \"~\") return;\n\tif (text == \"up\" || text == \"down\" || text == \"left\" || text == \"right\") {\n\t\ty+=2;\n\t\tint16_t w = m5.lcd.textWidth(\"A\") * 1.2;\n\t\tint16_t h = ez.fontHeight() * 0.6;\n\t\tif (datum == TR_DATUM) x = x - w;\n\t\tif (datum == TC_DATUM) x = x - w/2; \n\t\tif (text == \"up\") m5.lcd.fillTriangle(x, y + h, x + w, y + h, x + w/2 ,y , color);\n\t\tif (text == \"down\") m5.lcd.fillTriangle(x, y, x + w, y, x + w/2 ,y + h, color);\n\t\tif (text == \"right\") m5.lcd.fillTriangle(x, y, x, y + h, x + w, y + h/2, color);\n\t\tif (text == \"left\") m5.lcd.fillTriangle(x + w, y, x + w, y + h, x, y + h/2, color);\t\t\n\t} else {\n\t\tm5.lcd.setTextColor(color);\n\t\tm5.lcd.setTextDatum(datum);\n\t\tm5.lcd.drawString(text, x, y);\n\t}\n}\n\nvoid ezButtons::releaseWait() {\n\t_key_release_wait = true;\n}\n\nString ezButtons::poll() {\n\tString keystr = \"\";\n\n\tez.yield();\n\n\tif (!_key_release_wait) {\n\t\tif (_btn_ab != \"\" && m5.BtnA.isPressed() && m5.BtnB.isPressed() ) {\n\t\t\tkeystr = ez.leftOf(_btn_ab, \"|\", true);\n\t\t\t_key_release_wait = true;\n\t\t}\n\t\tif (_btn_bc != \"\" && m5.BtnB.isPressed() && m5.BtnC.isPressed() ) {\n\t\t\tkeystr = ez.leftOf(_btn_bc, \"|\", true);\n\t\t\t_key_release_wait = true;\n\t\t}\n\t\tif (_btn_ac != \"\" && m5.BtnA.isPressed() && m5.BtnC.isPressed() ) {\n\t\t\tkeystr = ez.leftOf(_btn_ac, \"|\", true);\n\t\t\t_key_release_wait = true;\n\t\t}\n\n\t\tif (_btn_a_l != \"\" && m5.BtnA.pressedFor(ez.theme->longpress_time) ) {\n\t\t\tkeystr = ez.leftOf(_btn_a_l, \"|\", true);\n\t\t\t_key_release_wait = true;\n\t\t}\n\t\tif (_btn_a_s != \"\" && m5.BtnA.wasReleased() ) {\n\t\t\tkeystr = ez.leftOf(_btn_a_s, \"|\", true);\n\t\t}\n\n\t\tif (_btn_b_l != \"\" && m5.BtnB.pressedFor(ez.theme->longpress_time) ) {\n\t\t\tkeystr = ez.leftOf(_btn_b_l, \"|\", true);\n\t\t\t_key_release_wait = true;\n\t\t}\n\t\tif (_btn_b_s != \"\" && m5.BtnB.wasReleased() ) {\n\t\t\tkeystr = ez.leftOf(_btn_b_s, \"|\", true);\n\t\t}\n\n\t\tif (_btn_c_l != \"\" && m5.BtnC.pressedFor(ez.theme->longpress_time) ) {\n\t\t\tkeystr = ez.leftOf(_btn_c_l, \"|\", true);\n\t\t\t_key_release_wait = true;\n\t\t}\n\t\tif (_btn_c_s != \"\" && m5.BtnC.wasReleased() ) {\n\t\t\tkeystr = ez.leftOf(_btn_c_s, \"|\", true);\n\t\t}\n\t}\n\n\tif (m5.BtnA.isReleased() && m5.BtnB.isReleased() && m5.BtnC.isReleased() ) {\n\t\t_key_release_wait = false;\n\t}\t\t\n\n\tif (keystr == \"~\") keystr = \"\";\n\t#ifdef M5EZ_BACKLIGHT\n\t\tif (keystr != \"\") ez.backlight.activity();\n\t#endif\n\treturn keystr;\n}\n\nString ezButtons::wait(String buttons /* = \"\" */) {\n\tif (buttons != \"\") show(buttons);\n\tString keystr = \"\";\n\twhile (keystr == \"\") {\n\t\tkeystr = ez.buttons.poll();\n\t}\n\treturn keystr;\n}\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   S E T T I N G S\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nezMenu ezSettings::menuObj (\"Settings menu\");\n\nvoid ezSettings::begin() {\n\tmenuObj.txtSmall();\n\tmenuObj.buttons(\"up#Back#select##down#\");\n\t#ifdef M5EZ_WIFI\n\t\tez.wifi.begin();\n\t#endif\n\t#ifdef M5EZ_BLE\n\t\tez.ble.begin();\n\t#endif\n\t#ifdef M5EZ_BATTERY\n\t\tez.battery.begin();\n\t#endif\n\t#ifdef M5EZ_CLOCK\n\t\tez.clock.begin();\n\t#endif\n\t#ifdef M5EZ_BACKLIGHT\n\t\tez.backlight.begin();\n\t#endif\n\t#ifdef M5EZ_FACES\n\t\tez.faces.begin();\n\t#endif\t\n\tif (ez.themes.size() > 1) {\n\t\tez.settings.menuObj.addItem(\"Theme chooser\", ez.theme->menu);\n\t}\n\tez.settings.menuObj.addItem(\"Factory defaults\", ez.settings.defaults);\n\t\n}\n\nvoid ezSettings::menu() {\n\tmenuObj.run();\n}\n\nvoid ezSettings::defaults() {\n\tif (ez.msgBox(\"Reset to defaults?\", \"Are you sure you want to reset all settings to factory defaults?\", \"yes##no\") == \"yes\") {\n\t\tPreferences prefs;\n\t\tprefs.begin(\"M5ez\");\n\t\tprefs.clear();\n\t\tprefs.end();\n\t\tESP.restart();\n\t}\n}\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   B A C K L I G H T\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#ifdef M5EZ_BACKLIGHT\n\tuint8_t ezBacklight::_brightness;\n\tuint8_t ezBacklight::_inactivity;\n\tuint32_t ezBacklight::_last_activity;\n\tbool ezBacklight::_backlight_off = false;\n\n\tvoid ezBacklight::begin() {\n\t\tez.addEvent(ez.backlight.loop);\n\t\tez.settings.menuObj.addItem(\"Backlight settings\", ez.backlight.menu);\n\t\tPreferences prefs;\n\t\tprefs.begin(\"M5ez\", true);\t// read-only\n\t\t_brightness = prefs.getUChar(\"brightness\", 128);\n\t\t_inactivity = prefs.getUChar(\"inactivity\", NEVER);\n\t\tprefs.end();\n\t\tm5.lcd.setBrightness(_brightness);\n\t}\n\n\tvoid ezBacklight::menu() {\n\t\tuint8_t start_brightness = _brightness;\n\t\tuint8_t start_inactivity = _inactivity;\n\t\tezMenu blmenu(\"Backlight settings\");\n\t\tblmenu.txtSmall();\n\t\tblmenu.buttons(\"up#Back#select##down#\");\n\t\tblmenu.addItem(\"Backlight brightness\");\n\t\tblmenu.addItem(\"Inactivity timeout\");\n\t\twhile(true) {\n\t\t\tswitch (blmenu.runOnce()) {\n\t\t\t\tcase 1:\t\n\t\t\t\t\t{\n\t\t\t\t\t\tezProgressBar bl (\"Backlight brightness\", \"Set brightness\", \"left#ok#right\");\n\t\t\t\t\t\twhile (true) {\n\t\t\t\t\t\t\tString b = ez.buttons.poll();\n\t\t\t\t\t\t\tif (b == \"right\" && _brightness <= 240) _brightness += 16;\n\t\t\t\t\t\t\tif (!_brightness) _brightness = 255;\n\t\t\t\t\t\t\tif (b == \"left\" && _brightness > 16) _brightness -= 16;\n\t\t\t\t\t\t\tif (_brightness == 239) _brightness = 240;\n\t\t\t\t\t\t\tbl.value((float)(_brightness / 2.55));\n\t\t\t\t\t\t\tm5.lcd.setBrightness(_brightness);\n\t\t\t\t\t\t\tif (b == \"ok\") break;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\t{\n\t\t\t\t\t\tString disp_val;\n\t\t\t\t\t\twhile (true) {\n\t\t\t\t\t\t\tif (!_inactivity) {\n\t\t\t\t\t\t\t\tdisp_val = \"Backlight will not turn off\";\n\t\t\t\t\t\t\t} else if (_inactivity == 1) {\n\t\t\t\t\t\t\t\tdisp_val = \"Backlight will turn off after 30 seconds of inactivity\";\n\t\t\t\t\t\t\t} else if (_inactivity == 2) {\n\t\t\t\t\t\t\t\tdisp_val = \"Backlight will turn off after a minute of inactivity\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdisp_val = \"Backlight will turn off after \" + String(_inactivity / 2) + ((_inactivity % 2) ? \".5 \" : \"\") + \" minutes of inactivity\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tez.msgBox(\"Inactivity timeout\", disp_val, \"-#--#ok##+#++\", false);\n\t\t\t\t\t\t\tString b = ez.buttons.wait();\n\t\t\t\t\t\t\tif (b == \"-\" && _inactivity) _inactivity--;\n\t\t\t\t\t\t\tif (b == \"+\" && _inactivity < 254) _inactivity++;\n\t\t\t\t\t\t\tif (b == \"--\") {\n\t\t\t\t\t\t\t\tif (_inactivity < 20) {\n\t\t\t\t\t\t\t\t\t_inactivity = 0;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t_inactivity -= 20;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (b == \"++\") {\n\t\t\t\t\t\t\t\tif (_inactivity > 234) {\n\t\t\t\t\t\t\t\t\t_inactivity = 254;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t_inactivity += 20;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (b == \"ok\") break;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0:\n\t\t\t\t\tif (_brightness != start_brightness || _inactivity != start_inactivity) {\n\t\t\t\t\t\tPreferences prefs;\n\t\t\t\t\t\tprefs.begin(\"M5ez\");\n\t\t\t\t\t\tprefs.putUChar(\"brightness\", _brightness);\n\t\t\t\t\t\tprefs.putUChar(\"inactivity\", _inactivity);\n\t\t\t\t\t\tprefs.end();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t//\n\t\t\t}\n\t\t}\n\t}\n\t\n\tvoid ezBacklight::inactivity(uint8_t half_minutes) {\n\t\tif (half_minutes == USER_SET) {\n\t\t\tPreferences prefs;\n\t\t\tprefs.begin(\"M5ez\", true);\n\t\t\t_inactivity = prefs.getUShort(\"inactivity\", 0);\n\t\t\tprefs.end();\n\t\t} else {\n\t\t\t_inactivity = half_minutes;\n\t\t}\n\t}\n\t\n\tvoid ezBacklight::activity() {\n\t\t_last_activity = millis();\n\t}\n\t\n\tuint16_t ezBacklight::loop() {\n\t\tif (!_backlight_off && _inactivity) {\n\t\t\tif (millis() > _last_activity + 30000 * _inactivity) {\n\t\t\t\t_backlight_off = true;\n\t\t\t\tm5.lcd.setBrightness(0);\n\t\t\t\twhile (true) {\n\t\t\t\t\tif (m5.BtnA.wasPressed() || m5.BtnB.wasPressed() || m5.BtnC.wasPressed()) break;\n\t\t\t\t\tez.yield();\n\t\t\t\t\tdelay(10);\n\t\t\t\t}\n\t\t\t\tez.buttons.releaseWait();\t// Make sure the key pressed to wake display gets ignored\n\t\t\t\tm5.lcd.setBrightness(_brightness);\n\t\t\t\tactivity();\n\t\t\t\t_backlight_off = false;\n\t\t\t}\n\t\t}\n\t\treturn 1000;\n\t}\n#endif\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   C L O C K\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#ifdef M5EZ_CLOCK\n\tTimezone ezClock::tz;\n\tbool ezClock::_on;\n\tString ezClock::_timezone;\n\tbool ezClock::_clock12;\n\tbool ezClock::_am_pm;\n\tString ezClock::_datetime;\n\tbool ezClock::_starting = true;\n\n\tvoid ezClock::begin() {\n\t\tPreferences prefs;\n\t\tprefs.begin(\"M5ez\", true);\t// read-only\n\t\t_on = prefs.getBool(\"clock_on\", true);\n\t\t_timezone = prefs.getString(\"timezone\", \"GeoIP\");\n\t\t_clock12 = prefs.getBool(\"clock12\", false);\n\t\t_am_pm = prefs.getBool(\"ampm\", false);\n\t\tprefs.end();\n\t\tez.settings.menuObj.addItem(\"Clock settings\", ez.clock.menu);\n\t\tez.addEvent(ez.clock.loop);\n\t\tez.clock.restart();\n\t}\n\t\n\tvoid ezClock::restart() {\n\t\tez.header.remove(\"clock\");\n\t\tuint8_t length;\n\t\tif (_on) {\n\t\t\tif (_clock12) {\n\t\t\t\tif (_am_pm) {\n\t\t\t\t\t_datetime = \"g:ia\";\n\t\t\t\t\tlength = 7;\n\t\t\t\t} else {\n\t\t\t\t\t_datetime = \"g:i\";\n\t\t\t\t\tlength = 5;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t_datetime = \"H:i\";\n\t\t\t\tlength = 5;\n\t\t\t}\n\t\t\tez.setFont(ez.theme->clock_font);\n\t\t\tuint8_t width = length * m5.lcd.textWidth(\"5\") + ez.theme->header_hmargin * 2;\n\t\t\tez.header.insert(RIGHTMOST, \"clock\", width, ez.clock.draw);\n\t\t}\n\t}\n\t\n\tvoid ezClock::menu() {\n\t\tbool on_orig = _on;\n\t\tbool clock12_orig = _clock12;\n\t\tbool am_pm_orig = _am_pm;\n\t\tString tz_orig = _timezone;\n\t\twhile(true) {\n\t\t\tezMenu clockmenu(\"Clock settings\");\n\t\t\tclockmenu.txtSmall();\n\t\t\tclockmenu.buttons(\"up#Back#select##down#\");\n\t\t\tclockmenu.addItem(\"on|Display clock\\t\" + (String)(_on ? \"on\" : \"off\"));\n\t\t\tif (_on) {\n\t\t\t\tclockmenu.addItem(\"tz|Timezone\\t\" + _timezone);\n\t\t\t\tclockmenu.addItem(\"1224|12/24 hour\\t\" + (String)(_clock12 ? \"12\" : \"24\"));\n\t\t\t\tif (_clock12) {\n\t\t\t\t\tclockmenu.addItem(\"ampm|am/pm indicator\\t\" + (String)(_am_pm ? \"on\" : \"off\"));\n\t\t\t\t}\n\t\t\t}\n\t\t\tswitch (clockmenu.runOnce()) {\n\t\t\t\tcase 1:\n\t\t\t\t\t_on = !_on;\n\t\t\t\t\tez.clock.restart();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\t_timezone = ez.textInput(\"Enter timezone\");\n\t\t\t\t\tif (_timezone == \"\") _timezone = \"GeoIP\";\n\t\t\t\t\tif (tz.setLocation(_timezone)) _timezone = tz.getOlsen();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:\n\t\t\t\t\t_clock12 = !_clock12;\n\t\t\t\t\tez.clock.restart();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\t\t_am_pm = !_am_pm;\n\t\t\t\t\tez.clock.restart();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0:\n\t\t\t\t\tif (_am_pm != am_pm_orig || _clock12 != clock12_orig || _on != on_orig || _timezone != tz_orig) {\n\t\t\t\t\t\t_writePrefs();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t//\n\t\t\t}\n\t\t}\n\t}\n\t\n\tuint16_t ezClock::loop() {\n\t\tezt::events();\n\t\tif (_starting && timeStatus() != timeNotSet) {\n\t\t\t_starting = false;\n\t\t\tif (tz.setLocation(_timezone)) {\n\t\t\t\tif (tz.getOlsen() != _timezone) {\n\t\t\t\t\t_timezone = tz.getOlsen();\n\t\t\t\t\t_writePrefs();\n\t\t\t\t}\n\t\t\t}\n\t\t\tez.header.draw(\"clock\");\n\t\t} else {\n\t\t\tif (_on && ezt::minuteChanged()) ez.header.draw(\"clock\");\n\t\t}\n\t\treturn 250;\n\t}\n\t\n\tvoid ezClock::draw(uint16_t x, uint16_t w) {\n\t\tif (_starting) return;\n\t\tm5.lcd.fillRect(x, 0, w, ez.theme->header_height, ez.theme->header_bgcolor);\n\t\tez.setFont(ez.theme->clock_font);\n\t\tm5.lcd.setTextColor(ez.theme->header_fgcolor);\n\t\tm5.lcd.setTextDatum(TL_DATUM);\n\t\tm5.lcd.drawString(tz.dateTime(_datetime), x + ez.theme->header_hmargin, ez.theme->header_tmargin + 2);\n\t}\n\t\n\tvoid ezClock::_writePrefs() {\n\t\tPreferences prefs;\n\t\tprefs.begin(\"M5ez\");\n\t\tprefs.putBool(\"clock_on\", _on);\n\t\tprefs.putString(\"timezone\", _timezone);\n\t\tprefs.putBool(\"clock12\", _clock12);\n\t\tprefs.putBool(\"ampm\", _am_pm);\n\t\tprefs.end();\n\t}\n\t\n\tbool ezClock::waitForSync(const uint16_t timeout /* = 0 */) {\n\n\t\tunsigned long start = millis();\n\t\tez.msgBox(\"Clock sync\", \"Waiting for clock synchronisation\", \"\", false);\t\n\t\twhile (ezt::timeStatus() != timeSet) {\n\t\t\tif ( timeout && (millis() - start) / 1000 > timeout ) return false;\n\t\t\tdelay(25);\n\t\t\tez.yield();\n\t\t}\n\t\treturn true;\n\t}\n\t\t\t\n#endif\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   F A C E S\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#ifdef M5EZ_FACES\n\n\tbool ezFACES::_on;\n\n\tvoid ezFACES::begin() {\n\t\tPreferences prefs;\n\t\tprefs.begin(\"M5ez\", true);\t// read-only\n\t\t_on = prefs.getBool(\"faces_on\", false);\n\t\tprefs.end();\n\t\tif (_on) {\n\t\t\tWire.begin();\n\t\t\tpinMode(5, INPUT);\n\t\t\tdigitalWrite(5,HIGH);\n\t\t\tWire.flush();\n\t\t}\n\t\tez.settings.menuObj.addItem(\"FACES keyboard\", ez.faces.menu);\n\t}\n\t\n\tvoid ezFACES::menu() {\n\t\tbool start_state = _on;\n\t\twhile (true) {\n\t\t\tezMenu facesmenu (\"FACES keyboard\");\n\t\t\tfacesmenu.txtSmall();\n\t\t\tfacesmenu.buttons(\"up#Back#select##down#\");\n\t\t\tfacesmenu.addItem(\"on|FACES keyboard\\t\" + (String)(_on ? \"attached\" : \"not attached\"));\n\t\t\tswitch (facesmenu.runOnce()) {\n\t\t\t\tcase 1:\n\t\t\t\t\t_on = !_on;\n\t\t\t\t\tif (_on) {\n\t\t\t\t\t\tpinMode(5, INPUT);\n\t\t\t\t\t\tdigitalWrite(5,HIGH);\n\t\t\t\t\t\tWire.flush();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0:\n\t\t\t\t\tif (_on != start_state) {\n\t\t\t\t\t\tPreferences prefs;\n\t\t\t\t\t\tprefs.begin(\"M5ez\");\n\t\t\t\t\t\tprefs.putBool(\"faces_on\", _on);\n\t\t\t\t\t\tprefs.end();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t//\n\t\t\t}\n\t\t}\n\t}\n\n\tString ezFACES::poll() {\n\t\tif (digitalRead(5) == LOW) {\n\t\t\tWire.requestFrom(0x88, 1);\n\t\t\tString out = \"\";   \n\t\t\twhile (Wire.available()) {\n\t\t\t\tout += (char) Wire.read();\n\t\t\t}\n\t\t\t#ifdef M5EZ_BACKLIGHT\n\t\t\t\tez.backlight.activity();\n\t\t\t#endif\n\t\t\treturn out;\n\t\t}\n\t\treturn \"\";\n\t}\n\t\n\tbool ezFACES::on() {\n\t\treturn _on;\n\t}\n\n#endif\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   W I F I\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#ifdef M5EZ_WIFI\n\n\tWifiState_t ezWifi::_state;\n\tuint8_t ezWifi::_current_from_scan;\n\tuint32_t ezWifi::_wait_until;\n\tuint32_t ezWifi::_widget_time;\n\tstd::vector<WifiNetwork_t> ezWifi::networks;\n\tezProgressBar* ezWifi::_update_progressbar;\n\tString ezWifi::_update_error;\n\tbool ezWifi::autoConnect;\n\t#ifdef M5EZ_WPS\n\t\tWiFiEvent_t ezWifi::_WPS_event;\n\t\tString ezWifi::_WPS_pin;\n\t\tbool ezWifi::_WPS_new_event;\n\t#endif\n\n\tvoid ezWifi::begin() {\n\t\t#ifdef M5EZ_WIFI_DEBUG\n\t\t\tSerial.println(\"EZWIFI: Initialising\");\n\t\t#endif\n\t\tWiFi.mode(WIFI_MODE_STA);\n\t\tWiFi.setAutoConnect(false);\t\t// We have our own multi-AP version of this\n\t\tWiFi.setAutoReconnect(false);\t// So we turn off the ESP32's versions\n\t\tWiFi.setHostname(\"M5Stack\");\n\t\tez.wifi.readFlash();\n\t\t_state = EZWIFI_IDLE;\n\t\tconst uint8_t cutoffs[] = { 0, 20, 40, 70 };\n\t\tez.settings.menuObj.addItem(\"Wifi settings\", ez.wifi.menu);\n\t\tez.header.insert(RIGHTMOST, \"wifi\", sizeof(cutoffs) * (ez.theme->signal_bar_width + ez.theme->signal_bar_gap) + 2 * ez.theme->header_hmargin, ez.wifi._drawWidget);\n\t\t// For handling issue #50, when initial connection attempt fails in this specific mode but will succeed if tried again.\n\t\tWiFi.onEvent([](WiFiEvent_t event, WiFiEventInfo_t info){\n\t\t\tif(WIFI_REASON_ASSOC_FAIL == info.disconnected.reason) {\n\t\t\t#ifdef M5EZ_WIFI_DEBUG\n\t\t\t\tSerial.println(\"EZWIFI: Special case: Disconnect w/ ASSOC_FAIL. Setting _state to EZWIFI_SCANNING;\");\n\t\t\t#endif\n\t\t\t_state = EZWIFI_SCANNING;\n\t\t}\n\t\t}, WiFiEvent_t::SYSTEM_EVENT_STA_DISCONNECTED);\n\t\tez.addEvent(ez.wifi.loop);\n\t}\n\n\tvoid ezWifi::_drawWidget(uint16_t x, uint16_t w) {\n\t\tconst uint8_t cutoffs[] = { 0, 20, 40, 70 };\n\t\tuint8_t max_bars = sizeof(cutoffs);\n\t\tuint8_t bars;\n\t\tuint16_t left_offset = x + ez.theme->header_hmargin;\n\t\tbars = 0;\n\t\tif (WiFi.isConnected()) {\n\t\t\tuint8_t signal = map(100 + WiFi.RSSI(), 5, 90, 0, 100);\n\t\t\tfor (uint8_t n = 0; n < sizeof(cutoffs); n++) {\t\t\t\t// Determine how many bars signal is.\n\t\t\t\tif (signal >= cutoffs[n]) bars = n + 1;\n\t\t\t}\n\t\t}\n\t\tuint8_t top = ez.theme->header_height / 10;\n\t\tuint8_t max_len = ez.theme->header_height * 0.8;\n\t\tuint8_t this_len;\n\t\tfor (uint8_t n = 0; n < max_bars; n++) {\n\t\t\tthis_len = ((float) (n + 1) / max_bars) * max_len;\n\t\t\tm5.lcd.fillRect(left_offset + n * (ez.theme->signal_bar_width + ez.theme->signal_bar_gap), top + max_len - this_len, ez.theme->signal_bar_width, this_len, (n + 1 <= bars ? ez.theme->header_fgcolor : ez.theme->header_bgcolor) );\n\t\t}\n\t}\n\n\tvoid ezWifi::add(String ssid, String key){\n\t\tWifiNetwork_t new_net;\n\t\tnew_net.SSID = ssid;\n\t\tnew_net.key = key;\n\t\tnetworks.push_back(new_net);\n\t}\n\n\tbool ezWifi::remove(int8_t index) {\n\t\tif (index < 0 || index >= networks.size()) return false;\n\t\tnetworks.erase(networks.begin() + index);\n\t\treturn true;\n\t}\n\n\tbool ezWifi::remove(String ssid) { return remove(indexForSSID(ssid)); }\n\n\tint8_t ezWifi::indexForSSID(String ssid) {\n\t\tfor (uint8_t n = 0; n < networks.size(); n++) {\n\t\t\tif (networks[n].SSID == ssid) return n;\n\t\t}\n\t\treturn -1;\n\t}\n\n\tvoid ezWifi::readFlash() {\n\t\tPreferences prefs;\n\t\tnetworks.clear();\n\t\tprefs.begin(\"M5ez\", true);\t// true: read-only\n\t\tautoConnect = prefs.getBool(\"autoconnect_on\", true);\n\t\t#ifdef M5EZ_WIFI_DEBUG\n\t\t\tSerial.println(\"wifiReadFlash: Autoconnect is \" + (String)(autoConnect ? \"ON\" : \"OFF\"));\n\t\t#endif\n\t\tWifiNetwork_t new_net;\n\t\tString idx;\n\t\tuint8_t index = 1;\n\t\twhile (true) {\n\t\t\tidx = \"SSID\" + (String)index;\n\t\t\tString ssid = prefs.getString(idx.c_str(), \"\");\n\t\t\tidx = \"key\" + (String)index;\n\t\t\tString key = prefs.getString(idx.c_str(), \"\");\n\t\t\tif (ssid != \"\") {\n\t\t\t\tnew_net.SSID = ssid;\n\t\t\t\tnew_net.key = key;\n\t\t\t\tnetworks.push_back(new_net);\n\t\t\t\t#ifdef M5EZ_WIFI_DEBUG\n\t\t\t\t\tSerial.println(\"wifiReadFlash: Read ssid:\" + ssid + \" key:\" + key);\n\t\t\t\t#endif\n\t\t\t\tindex++;\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tprefs.end();\n\t}\n\n\tvoid ezWifi::writeFlash() {\n\t\tPreferences prefs;\n\t\tString idx;\n\t\tuint8_t n = 1;\n\t\tprefs.begin(\"M5ez\", false);\n\t\t// Remove unknown number of items from NVS, sequentially named SSID1 to SSIDN, and key1 to keyN where N\n\t\t// is the total number of WiFi Networks stored (which may be different than networks.size() at this point.)\n\t\twhile (true) {\n\t\t\tidx = \"SSID\" + (String)n;\n\t\t\tif(!prefs.remove(idx.c_str())) break;\n\t\t\tidx = \"key\" + (String)n;\n\t\t\tprefs.remove(idx.c_str());\n\t\t\tn++;\n\t\t}\n\t\tprefs.putBool(\"autoconnect_on\", autoConnect);\n\t\t#ifdef M5EZ_WIFI_DEBUG\n\t\t\tSerial.println(\"wifiWriteFlash: Autoconnect is \" + (String)(autoConnect ? \"ON\" : \"OFF\"));\n\t\t#endif\n\t\tfor (n = 0; n < networks.size(); n++) {\n\t\t\tidx = \"SSID\" + (String)(n + 1);\n\t\t\tprefs.putString(idx.c_str(), networks[n].SSID);\n\t\t\tif (networks[n].key != \"\") {\n\t\t\t\tidx = \"key\" + (String)(n + 1);\n\t\t\t\tprefs.putString(idx.c_str(), networks[n].key);\n\t\t\t\t#ifdef M5EZ_WIFI_DEBUG\n\t\t\t\t\tSerial.println(\"wifiWriteFlash: Wrote ssid:\" + networks[n].SSID + \" key:\" + networks[n].key);\n\t\t\t\t#endif\n\t\t\t}\n\t\t}\n\t\tprefs.end();\n\t}\n\n\tvoid ezWifi::menu() {\n\t\t_state = EZWIFI_AUTOCONNECT_DISABLED;\n\t\t#ifdef M5EZ_WIFI_DEBUG\n\t\t\tSerial.println(\"EZWIFI: Disabling autoconnect while in Wifi menu.\");\n\t\t#endif\n\t\tezMenu wifimain (\"Wifi settings\");\n\t\twifimain.txtSmall();\n\t\twifimain.addItem(\"onoff | Autoconnect\\t\" + (String)(autoConnect ? \"ON\" : \"OFF\"), NULL, _onOff);\n\t\twifimain.addItem(\"connection | \" + (String)(WiFi.isConnected() ? \"Connected: \" + WiFi.SSID() : \"Join a network\"), NULL, _connection);\n\t\twifimain.addItem(\"Manage autoconnects\", _manageAutoconnects);\n\t\twifimain.buttons(\"up#Back#select##down#\");\n\t\twifimain.run();\n\t\t_state = EZWIFI_IDLE;\n\t\t#ifdef M5EZ_WIFI_DEBUG\n\t\t\tSerial.println(\"EZWIFI: Enabling autoconnect exiting Wifi menu.\");\n\t\t#endif\n\t}\n\n\tbool ezWifi::_onOff(ezMenu* callingMenu) {\n\t\tautoConnect = !autoConnect;\n\t\tcallingMenu->setCaption(\"onoff\", \"Autoconnect\\t\" + (String)(autoConnect ? \"ON\" : \"OFF\"));\n\t\tez.wifi.writeFlash();\n\t\treturn true;\n\t}\n\n\tvoid ezWifi::_manageAutoconnects() {\n\t\tezMenu autoconnect(\"Managing autoconnects\");\n\t\tif (!networks.size()) {\n\t\t\tez.msgBox(\"No autoconnects\", \"You have no saved autoconnect networks.\", \"OK\");\n\t\t\treturn;\n\t\t}\n\t\tfor (uint8_t n = 0; n < networks.size(); n++) {\n\t\t\tautoconnect.addItem(networks[n].SSID, NULL, _autoconnectSelected);\n\t\t}\n\t\tautoconnect.txtSmall();\n\t\tautoconnect.buttons(\"up#Back#Forget##down#\");\n\t\tautoconnect.run();\n\t}\n\n\tbool ezWifi::_autoconnectSelected(ezMenu* callingMenu) {\n\t\tif (callingMenu->pickButton() == \"Forget\") {\n\t\t\tif (ez.msgBox(\"Forgetting wifi network\", \"Are you sure you want | to forget wifi network | \" + callingMenu->pickName() + \" ?\", \"Yes##No\") == \"Yes\") {\n\t\t\t\tez.wifi.remove(callingMenu->pick() - 1);\n\t\t\t\tcallingMenu->deleteItem(callingMenu->pick());\n\t\t\t\tez.wifi.writeFlash();\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tbool ezWifi::_connection(ezMenu* callingMenu) {\n\t\tif (WiFi.isConnected()) {\n\t\t\tconst uint8_t tab = 140;\n\t\t\tez.screen.clear();\n\t\t\tez.header.show(\"Current wifi connection\");\n\t\t\tez.canvas.font(&FreeSans9pt7b);\n\t\t\tez.canvas.lmargin(10);\n\t\t\tez.canvas.y(ez.canvas.top() + 5);\n\t\t\tez.canvas.print(\"SSID:\"); ez.canvas.x(tab); ez.canvas.println(WiFi.SSID());\n\t\t\tez.canvas.print(\"Key:\"); ez.canvas.x(tab); ez.canvas.println(WiFi.psk());\n\t\t\tez.canvas.print(\"My IP:\"); ez.canvas.x(tab); ez.canvas.println(WiFi.localIP().toString());\n\t\t\tez.canvas.print(\"My MAC:\"); ez.canvas.x(tab); ez.canvas.println(WiFi.macAddress());\n\t\t\tez.canvas.print(\"My hostname:\"); ez.canvas.x(tab); ez.canvas.println(WiFi.getHostname());\n\t\t\tez.canvas.print(\"Router IP:\"); ez.canvas.x(tab); ez.canvas.println(WiFi.gatewayIP().toString());\n\t\t\tez.canvas.print(\"Router BSSID:\"); ez.canvas.x(tab); ez.canvas.println(WiFi.BSSIDstr());\n\t\t\tez.canvas.print(\"DNS IP:\"); ez.canvas.x(tab); ez.canvas.println(WiFi.dnsIP(0).toString());\n\t\t\tif (WiFi.dnsIP(1)) { ez.canvas.x(tab); ez.canvas.println(WiFi.dnsIP(1).toString()); }\n\t\t\tString pressed = ez.buttons.wait(\"Back#Disconnect#\");\n\t\t\tif (pressed == \"Back\") return true;\n\t\t\tif (pressed == \"Disconnect\") {\n\t\t\t\tWiFi.disconnect();\n\t\t\t\twhile(WiFi.isConnected()) {}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tString SSID = \"\", key = \"\";\n\t\t\tezMenu joinmenu(\"Joining a network\");\n\t\t\tjoinmenu.txtSmall();\n\t\t\tjoinmenu.addItem(\"Scan and join\");\n\t\t\tjoinmenu.addItem(\"SmartConfig\");\n\t\t\t#ifdef M5EZ_WPS\n\t\t\t\tjoinmenu.addItem(\"WPS Button\");\n\t\t\t\tjoinmenu.addItem(\"WPS Pin Code\");\n\t\t\t#endif\n\t\t\tjoinmenu.buttons(\"up#Back#select##down#\");\n\t\t\tjoinmenu.runOnce();\n\n\t\t\tif (joinmenu.pickName() == \"Scan and join\") {\n\t\t\t\tez.msgBox(\"WiFi setup menu\", \"Scanning ...\", \"\");\n\t\t\t\tWiFi.disconnect();\n\t\t\t\tWiFi._setStatus(WL_IDLE_STATUS);\n\t\t\t\tdelay(100);\n\t\t\t\tint16_t n = WiFi.scanNetworks();\n\t\t\t\tif (n == 0) {\n\t\t\t\t\tez.msgBox(\"WiFi setup menu\", \"No networks found\", \"OK\");\n\t\t\t\t} else {\n\t\t\t\t\tezMenu networks(\"Select your netork\");\n\t\t\t\t\tnetworks.txtSmall();\n\t\t\t\t\tfor (uint16_t i = 0; i < n; ++i) {\n\t\t\t\t\t\t// No duplicates (multiple BSSIDs on same SSID)\n\t\t\t\t\t\t// because we're only picking an SSID here\n\t\t\t\t\t\tif (!networks.getItemNum(WiFi.SSID(i))) {\n\t\t\t\t\t\t\tnetworks.addItem(WiFi.SSID(i));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnetworks.buttons(\"up#Back#select##down#\");\n\t\t\t\t\tif (networks.runOnce()) {\n\t\t\t\t\t\tSSID = networks.pickName();\n\t\t\t\t\t\tif ( WiFi.encryptionType(networks.pick() - 1) == WIFI_AUTH_OPEN) {\n\t\t\t\t\t\t\tWiFi.mode(WIFI_MODE_STA);\n\t\t\t\t\t\t\tWiFi.begin(SSID.c_str());\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tkey = ez.textInput(\"Enter wifi password\");\n\t\t\t\t\t\t\tWiFi.mode(WIFI_MODE_STA);\n\t\t\t\t\t\t\tWiFi.begin(SSID.c_str(), key.c_str());\n\t\t\t\t\t\t}\n\t\t\t\t\t\tez.msgBox(\"WiFi setup menu\", \"Connecting ...\", \"Abort\", false);\n\t\t\t\t\t\tString button;\n\t\t\t\t\t\tint16_t status;\n\t\t\t\t\t\twhile (button = ez.buttons.poll()) {\n\t\t\t\t\t\t\tif (button == \"Abort\") {\n\t\t\t\t\t\t\t\tWiFi.disconnect();\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstatus = WiFi.status();\n\t\t\t\t\t\t\tif (status == WL_CONNECTED) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (status == WL_CONNECT_FAILED || status == WL_NO_SSID_AVAIL) {\n\t\t\t\t\t\t\t\tez.msgBox(\"WiFi setup menu\", \"Connect failed. | | (Wrong password?)\", \"OK\");\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tWiFi.scanDelete();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (joinmenu.pickName() == \"SmartConfig\") {\n\t\t\t\tez.msgBox(\"SmartConfig setup\", \"Waiting for SmartConfig\", \"Abort\", false);\n\t\t\t\tWiFi.mode(WIFI_MODE_STA);\n\t\t\t\tWiFi.beginSmartConfig();\n\t\t\t\tbool done_already = false;\n\t\t\t\twhile (!WiFi.isConnected()) {\n\t\t\t\t\tif (ez.buttons.poll() == \"Abort\") {\n\t\t\t\t\t\tWiFi.stopSmartConfig();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (WiFi.smartConfigDone() && !done_already) {\n\t\t\t\t\t\tez.msgBox(\"SmartConfig setup\", \"SmartConfig received | Connecting ...\", \"Abort\", false);\n\t\t\t\t\t\tdone_already = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t#ifdef M5EZ_WPS\n\t\t\t\tif (joinmenu.pickName().substring(0,3) == \"WPS\") {\n\t\t\t\t\tez.msgBox(\"WPS setup\", \"Waiting for WPS\", \"Abort\", false);\n\t\t\t\t\tWiFi.mode(WIFI_MODE_STA);\n\t\t\t\t\tstatic esp_wps_config_t config;\n\t\t\t\t\tconfig.crypto_funcs = &g_wifi_default_wps_crypto_funcs;\n\t\t\t\t\tstrcpy(config.factory_info.manufacturer, \"ESPRESSIF\");\n\t\t\t\t\tstrcpy(config.factory_info.model_number, \"ESP32\");\n\t\t\t\t\tstrcpy(config.factory_info.model_name, \"ESPRESSIF IOT\");\n\t\t\t\t\tstrcpy(config.factory_info.device_name, \"ESP STATION\");\n\t\t\t\t\tif (joinmenu.pickName() == \"WPS Button\") {\n\t\t\t\t\t\tconfig.wps_type = WPS_TYPE_PBC;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconfig.wps_type = WPS_TYPE_PIN;\n\t\t\t\t\t}\n\t\t\t\t\tWiFi.onEvent(_WPShelper);\n\t\t\t\t\tesp_wifi_wps_enable(&config);\n\t\t\t\t\tesp_wifi_wps_start(0);\n\n\t\t\t\t\t_WPS_new_event = false;\n\t\t\t\t\twhile (!WiFi.isConnected()) {\n\t\t\t\t\t\tif (ez.buttons.poll() == \"Abort\") {\n\t\t\t\t\t\t\tesp_wifi_wps_disable();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (_WPS_new_event) {\n\t\t\t\t\t\t\tswitch(_WPS_event) {\n\t\t\t\t\t\t\t\tcase SYSTEM_EVENT_STA_WPS_ER_SUCCESS:\n\t\t\t\t\t\t\t\t\tez.msgBox(\"WPS setup\", \"WPS successful | Connecting ...\", \"Abort\", false);\n\t\t\t\t\t\t\t\t\tesp_wifi_wps_disable();\n\t\t\t\t\t\t\t\t\tdelay(10);\n\t\t\t\t\t\t\t\t\tWiFi.begin();\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase SYSTEM_EVENT_STA_WPS_ER_FAILED:\n\t\t\t\t\t\t\t\tcase SYSTEM_EVENT_STA_WPS_ER_TIMEOUT:\n\t\t\t\t\t\t\t\t\tez.msgBox(\"WPS setup\", \"WPS failed or timed out | Retrying ...\", \"Abort\", false);\n\t\t\t\t\t\t\t\t\tesp_wifi_wps_disable();\n\t\t\t\t\t\t\t\t\tesp_wifi_wps_enable(&config);\n\t\t\t\t\t\t\t\t\tesp_wifi_wps_start(0);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase SYSTEM_EVENT_STA_WPS_ER_PIN:\n\t\t\t\t\t\t\t\t\tez.msgBox(\"WPS setup\", \"WPS PIN: \" + _WPS_pin, \"Abort\", false);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t_WPS_new_event = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t#endif\n\n\t\t\tif (WiFi.isConnected()) _askAdd();\n\t\t}\n\t\tcallingMenu->setCaption(\"connection\", (String)(WiFi.isConnected() ? \"Connected: \" + WiFi.SSID() : \"Join a network\"));\n\t\treturn true;\n\t}\n\n\t#ifdef M5EZ_WPS\n\t\tvoid ezWifi::_WPShelper(WiFiEvent_t event, system_event_info_t info) {\n\t\t\t_WPS_event = event;\n\t\t\t_WPS_new_event = true;\n\t\t\tif (event == SYSTEM_EVENT_STA_WPS_ER_PIN) {\n\t\t\t\tchar wps_pin[9];\n\t\t\t\tfor (int8_t i = 0; i < 8; i++) {\n\t\t\t\t\twps_pin[i] = info.sta_er_pin.pin_code[i];\n\t\t\t\t}\n\t\t\t\twps_pin[8] = '\\0';\n\t\t\t\t_WPS_pin = String(wps_pin);\n\t\t\t}\n\t\t}\n\t#endif\n\n\tvoid ezWifi::_askAdd() {\n\t\tfor (uint8_t n = 0; n < networks.size(); n++) {\n\t\t\tif (networks[n].SSID == WiFi.SSID()) return;\n\t\t}\n\t\tif (ez.msgBox(\"Wifi settings\", \"Save this network | to your autoconnects?\", \"no##yes\") == \"yes\") {\n\t\t\tez.wifi.add(WiFi.SSID(), WiFi.psk());\n\t\t\tez.wifi.writeFlash();\n\t\t}\n\t}\n\n\tuint16_t ezWifi::loop() {\n\t\tif (millis() > _widget_time + ez.theme->signal_interval) {\n\t\t\tez.header.draw(\"wifi\");\n\t\t\t_widget_time = millis();\n\t\t}\n\t\tif (WiFi.isConnected() && _state != EZWIFI_AUTOCONNECT_DISABLED && _state != EZWIFI_IDLE) {\n\t\t\t_state = EZWIFI_IDLE;\n\t\t\t#ifdef M5EZ_WIFI_DEBUG\n\t\t\t\tSerial.println(\"EZWIFI: Connected, returning to IDLE state\");\n\t\t\t#endif\n\t\t}\n\t\tif (!autoConnect || WiFi.isConnected() || networks.size() == 0) return 250;\n\t\tint8_t scanresult;\n\t\tswitch(_state) {\n\t\t\tcase EZWIFI_WAITING:\n\t\t\t\t#ifdef M5EZ_WIFI_DEBUG\n\t\t\t\t\tSerial.println(\"EZWIFI: State Machine: _state = EZWIFI_WAITING\");\n\t\t\t\t#endif\n\t\t\t\tif (millis() < _wait_until) return 250;\n\t\t\t\t// intentional fall-through\n\t\t\tcase EZWIFI_IDLE:\n\t\t\t\t#ifdef M5EZ_WIFI_DEBUG\n\t\t\t\t\tSerial.println(\"EZWIFI: State Machine: _state = EZWIFI_IDLE\");\n\t\t\t\t\tSerial.println(\"EZWIFI: Starting scan\");\n\t\t\t\t#endif\n\t\t\t\tWiFi.mode(WIFI_MODE_STA);\n\t\t\t\tWiFi.scanNetworks(true);\n\t\t\t\t_current_from_scan = 0;\n\t\t\t\t_state = EZWIFI_SCANNING;\n\t\t\t\t_wait_until = millis() + 10000;\n\t\t\t\tbreak;\n\t\t\tcase EZWIFI_SCANNING:\n\t\t\t\t#ifdef M5EZ_WIFI_DEBUG\n\t\t\t\t\tSerial.println(\"EZWIFI: State Machine: _state = EZWIFI_SCANNING\");\n\t\t\t\t#endif\n\t\t\t\tscanresult = WiFi.scanComplete();\n\t\t\t\tswitch(scanresult) {\n\t\t\t\t\tcase WIFI_SCAN_RUNNING:\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase WIFI_SCAN_FAILED:\n\t\t\t\t\t\t#ifdef M5EZ_WIFI_DEBUG\n\t\t\t\t\t\t\tSerial.println(\"EZWIFI: Scan failed\");\n\t\t\t\t\t\t#endif\n\t\t\t\t\t\t_state = EZWIFI_WAITING;\n\t\t\t\t\t\t_wait_until = millis() + 60000;\n\t\t\t\t\t\tWiFi.scanDelete();\n\t\t\t\t\t\treturn 250;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t#ifdef M5EZ_WIFI_DEBUG\n\t\t\t\t\t\t\tSerial.println(\"EZWIFI: Scan got \" + (String)scanresult + \" networks\");\n\t\t\t\t\t\t#endif\n\t\t\t\t\t\tfor (uint8_t n = _current_from_scan; n < scanresult; n++) {\n\t\t\t\t\t\t\tfor (uint8_t m = 0; m < networks.size(); m++) {\n\t\t\t\t\t\t\t\tString ssid = networks[m].SSID;\n\t\t\t\t\t\t\t\tString key = networks[m].key;\n\t\t\t\t\t\t\t\tif (ssid == WiFi.SSID(n)) {\n\t\t\t\t\t\t\t\t\t#ifdef M5EZ_WIFI_DEBUG\n\t\t\t\t\t\t\t\t\t\tSerial.println(\"EZWIFI: Match: \" + WiFi.SSID(n) + \", connecting...\");\n\t\t\t\t\t\t\t\t\t#endif\n\t\t\t\t\t\t\t\t\tWiFi.mode(WIFI_MODE_STA);\n\t\t\t\t\t\t\t\t\tWiFi.begin(ssid.c_str(), key.c_str());\n\t\t\t\t\t\t\t\t\t_state = EZWIFI_CONNECTING;\n\t\t\t\t\t\t\t\t\t_wait_until = millis() + 7000;\n\t\t\t\t\t\t\t\t\treturn 250;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t#ifdef M5EZ_WIFI_DEBUG\n\t\t\t\t\t\t\tSerial.println(\"EZWIFI: No (further) matches, waiting...\");\n\t\t\t\t\t\t#endif\n\t\t\t\t\t\t_state = EZWIFI_WAITING;\n\t\t\t\t\t\t_wait_until = millis() + 60000;\n\t\t\t\t\t\tWiFi.scanDelete();\n\t\t\t\t\t//\n\t\t\t\t}\n\t\t\tcase EZWIFI_CONNECTING:\n\t\t\t\t#ifdef M5EZ_WIFI_DEBUG\n\t\t\t\t\tSerial.println(\"EZWIFI: State Machine: _state = EZWIFI_CONNECTING\");\n\t\t\t\t#endif\n\t\t\t\tif (millis() > _wait_until) {\n\t\t\t\t\t#ifdef M5EZ_WIFI_DEBUG\n\t\t\t\t\t\tSerial.println(\"EZWIFI: Connect timed out...\");\n\t\t\t\t\t#endif\n\t\t\t\t\tWiFi.disconnect();\n\t\t\t\t\t_current_from_scan++;\n\t\t\t\t\t_state = EZWIFI_SCANNING;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase EZWIFI_AUTOCONNECT_DISABLED:\n\t\t\t\t#ifdef M5EZ_WIFI_DEBUG\n\t\t\t\t\tSerial.println(\"EZWIFI: State Machine: _state = EZWIFI_AUTOCONNECT_DISABLED\");\n\t\t\t\t#endif\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t#ifdef M5EZ_WIFI_DEBUG\n\t\t\t\t\tSerial.println(\"EZWIFI: State Machine: default case! _state = \" + String(_state));\n\t\t\t\t#endif\n\t\t\t\tbreak;\n\t\t}\n\t\treturn 250;\n\t}\n\n\tbool ezWifi::update(String url, const char* root_cert, ezProgressBar* pb /* = NULL */) {\n\n\t\t_update_progressbar = pb;\n\n\t\tif (!WiFi.isConnected()) {\n\t\t\t_update_error = \"No WiFi connection.\";\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!url.startsWith(\"https://\")) {\n\t\t\t_update_error = \"URL must start with 'https://'\";\n\t\t\treturn false;\n\t\t}\n\n\t\turl = url.substring(8);\n\n\t\tString host, file;\n\t\tuint16_t port;\n\t\tint16_t first_slash_pos = url.indexOf(\"/\");\n\t\tif (first_slash_pos == -1) {\n\t\t\thost = url;\n\t\t\tfile = \"/\";\n\t\t} else {\n\t\t\thost = url.substring(0, first_slash_pos);\n\t\t\tfile = url.substring(first_slash_pos);\n\t\t}\n\t\tint16_t colon = host.indexOf(\":\");\n\n\t\tif (colon == -1) {\n\t\t\tport = 443;\n\t\t} else {\n\t\t\thost = host.substring(0, colon);\n\t\t\tport = host.substring(colon + 1).toInt();\n\t\t}\n\n\t\tWiFiClientSecure client;\n\t\tclient.setTimeout(20000);\n\t\tclient.setCACert(root_cert);\n\n\t\tint contentLength = 0;\n\n\t\tif (!client.connect(host.c_str(), port)) {\n\t\t\t_update_error = \"Connection to \" + String(host) + \" failed.\";\n\t\t\treturn false;\n\t\t}\n\n\t\tclient.print(String(\"GET \") + file + \" HTTP/1.1\\r\\n\" +\n\t\t\t\"Host: \" + host + \"\\r\\n\" +\n\t\t\t\"Cache-Control: no-cache\\r\\n\" +\n\t\t\t\"Connection: close\\r\\n\\r\\n\");\n\n\t\tunsigned long timeout = millis();\n\t\twhile (!client.available()) {\n\t\t\tif (millis() - timeout > 10000) {\n\t\t\t\t_update_error = \"Client Timeout\";\n\t\t\t\tclient.stop();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Process header\n\t\twhile (client.available()) {\n\t\t\tString line = client.readStringUntil('\\n');\n\t\t\tline.trim();\n\t\t\tif (!line.length()) break; // empty line, assume headers done\n\n\t\t\tif (line.startsWith(\"HTTP/1.1\")) {\n\t\t\t\tString http_response = line.substring(line.indexOf(\" \") + 1);\n\t\t\t\thttp_response.trim();\n\t\t\t\tif (http_response.indexOf(\"200\") == -1) {\n\t\t\t\t\t_update_error = \"Got response: \\\"\" + http_response + \"\\\", must be 200\";\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (line.startsWith(\"Content-Length: \")) {\n\t\t\t\tcontentLength = atoi(line.substring(  line.indexOf(\":\") + 1  ).c_str());\n\t\t\t\tif (contentLength <= 0) {\n\t\t\t\t\t_update_error = \"Content-Length zero\";\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (line.startsWith(\"Content-Type: \")) {\n\t\t\t\tString contentType = line.substring(line.indexOf(\":\") + 1);\n\t\t\t\tcontentType.trim();\n\t\t\t\tif (contentType != \"application/octet-stream\") {\n\t\t\t\t\t_update_error = \"Content-Type must be \\\"application/octet-stream\\\", got \\\"\" + contentType + \"\\\"\";\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Process payload\n\t\tUpdate.onProgress(_update_progress);\n\n\t\tif (!Update.begin(contentLength)) {\n\t\t\t_update_error = \"Not enough space to begin OTA\";\n\t\t\tclient.flush();\n\t\t\treturn false;\n\t\t}\n\n\t\tsize_t written = Update.writeStream(client);\n\n\t\tif (!Update.end()) {\n\t\t\t_update_error = \"Error: \" + String(_update_err2str(Update.getError())) + \" | (after \" + String(written) + \" of \" + String(contentLength) + \" bytes)\";\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!Update.isFinished()) {\n\t\t\t_update_error = \"Update not finished. Something went wrong.\";\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tvoid ezWifi::_update_progress(int done, int total) {\n\t\tif (ez.buttons.poll() != \"\") {\n\t\t\tUpdate.abort();\n\t\t} else {\n\t\t\tif (total && _update_progressbar != NULL) {\n\t\t\t\t_update_progressbar->value((done * 100) / total);\n\t  \t\t}\n\t  \t}\n\t}\n\n\tString ezWifi::updateError() { return _update_error; }\n\n\t// Stupid Updater library only wants to print readable errors to a Stream object, \n\t// so we just copied its _err2str function. Bleh...\n\tString ezWifi::_update_err2str(uint8_t _error) {\n\t\tif(_error == UPDATE_ERROR_OK){\n\t\t\treturn (\"No Error\");\n\t\t} else if(_error == UPDATE_ERROR_WRITE){\n\t\t\treturn (\"Flash Write Failed\");\n\t\t} else if(_error == UPDATE_ERROR_ERASE){\n\t\t\treturn (\"Flash Erase Failed\");\n\t\t} else if(_error == UPDATE_ERROR_READ){\n\t\t\treturn (\"Flash Read Failed\");\n\t\t} else if(_error == UPDATE_ERROR_SPACE){\n\t\t\treturn (\"Not Enough Space\");\n\t\t} else if(_error == UPDATE_ERROR_SIZE){\n\t\t\treturn (\"Bad Size Given\");\n\t\t} else if(_error == UPDATE_ERROR_STREAM){\n\t\t\treturn (\"Stream Read Timeout\");\n\t\t} else if(_error == UPDATE_ERROR_MD5){\n\t\t\treturn (\"MD5 Check Failed\");\n\t\t} else if(_error == UPDATE_ERROR_MAGIC_BYTE){\n\t\t\treturn (\"Wrong Magic Byte\");\n\t\t} else if(_error == UPDATE_ERROR_ACTIVATE){\n\t\t\treturn (\"Could Not Activate The Firmware\");\n\t\t} else if(_error == UPDATE_ERROR_NO_PARTITION){\n\t\t\treturn (\"Partition Could Not be Found\");\n\t\t} else if(_error == UPDATE_ERROR_BAD_ARGUMENT){\n\t\t\treturn (\"Bad Argument\");\n\t\t} else if(_error == UPDATE_ERROR_ABORT){\n\t\t\treturn (\"Aborted\");\n\t\t}\n\t\treturn (\"UNKNOWN\");\n\t}\n\n\n#endif\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   B L E\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#ifdef M5EZ_BLE\n\n\tclass M5ezClientCallback : public BLEClientCallbacks {\n\t\tvoid onConnect(BLEClient*) {}\n\t\tvoid onDisconnect(BLEClient*) {\n\t\t\tez.ble._cleanup();\n\t\t}\n\t} _bleClientCallback;\n\n\t// https://www.bluetooth.com/specifications/gatt/services/\n\tconst std::vector<std::pair<uint16_t, String>> ezBLE::_gattUuids = {\n\t\t{ 0x1800, \"Generic Access\" }, \n\t\t{ 0x1811, \"Alert Notification Service\" }, \n\t\t{ 0x1815, \"Automation IO\" }, \n\t\t{ 0x180F, \"Battery Service\" }, \n\t\t{ 0x183B, \"Binary Sensor\" }, \n\t\t{ 0x1810, \"Blood Pressure\" }, \n\t\t{ 0x181B, \"Body Composition\" }, \n\t\t{ 0x181E, \"Bond Management Service\" }, \n\t\t{ 0x181F, \"Continuous Glucose Monitoring\" }, \n\t\t{ 0x1805, \"Current Time Service\" }, \n\t\t{ 0x1818, \"Cycling Power\" }, \n\t\t{ 0x1816, \"Cycling Speed and Cadence\" }, \n\t\t{ 0x180A, \"Device Information\" }, \n\t\t{ 0x183C, \"Emergency Configuration\" }, \n\t\t{ 0x181A, \"Environmental Sensing\" }, \n\t\t{ 0x1826, \"Fitness Machine\" }, \n\t\t{ 0x1801, \"Generic Attribute\" }, \n\t\t{ 0x1808, \"Glucose\" }, \n\t\t{ 0x1809, \"Health Thermometer\" }, \n\t\t{ 0x180D, \"Heart Rate\" }, \n\t\t{ 0x1823, \"HTTP Proxy\" }, \n\t\t{ 0x1812, \"Human Interface Device\" }, \n\t\t{ 0x1802, \"Immediate Alert\" }, \n\t\t{ 0x1821, \"Indoor Positioning\" }, \n\t\t{ 0x183A, \"Insulin Delivery\" }, \n\t\t{ 0x1820, \"Internet Protocol Support Service\" }, \n\t\t{ 0x1803, \"Link Loss\" }, \n\t\t{ 0x1819, \"Location and Navigation\" }, \n\t\t{ 0x1827, \"Mesh Provisioning Service\" }, \n\t\t{ 0x1828, \"Mesh Proxy Service\" }, \n\t\t{ 0x1807, \"Next DST Change Service\" }, \n\t\t{ 0x1825, \"Object Transfer Service\" }, \n\t\t{ 0x180E, \"Phone Alert Status Service\" }, \n\t\t{ 0x1822, \"Pulse Oximeter Service\" }, \n\t\t{ 0x1829, \"Reconnection Configuration\" }, \n\t\t{ 0x1806, \"Reference Time Update Service\" }, \n\t\t{ 0x1814, \"Running Speed and Cadence\" }, \n\t\t{ 0x1813, \"Scan Parameters\" }, \n\t\t{ 0x1824, \"Transport Discovery\" }, \n\t\t{ 0x1804, \"Tx Power\" }, \n\t\t{ 0x181C, \"User Data\" }, \n\t\t{ 0x181D, \"Weight Scale\" }, \n\t};\n\n\tbool ezBLE::_on = false;\n\tbool ezBLE::_initialized = false;\n\tstd::vector<BLEClient*> ezBLE::_clients;\n\n\tvoid ezBLE::begin() {\n\t\tez.ble.readFlash();\n\t\tez.settings.menuObj.addItem(\"BLE settings\", ez.ble.menu);\n\t\tif (_on) {\n\t\t\t_refresh();\n\t\t}\n\t}\n\n\tvoid ezBLE::readFlash() {\n\t\tPreferences prefs;\n\t\tprefs.begin(\"M5ez\", true);\t// true: read-only\n\t\t_on = prefs.getBool(\"ble_on\", false);\n\t\tprefs.end();\n\t}\n\n\tvoid ezBLE::writeFlash() {\n\t\tPreferences prefs;\n\t\tprefs.begin(\"M5ez\");\n\t\tprefs.putBool(\"ble_on\", _on);\n\t\tprefs.end();\n\t}\n\n\tvoid ezBLE::menu() {\n\t\tbool on_orig = _on;\n\t\twhile(true) {\n\t\t\tezMenu blemenu(\"BLE Settings\");\n\t\t\tblemenu.txtSmall();\n\t\t\tblemenu.addItem(\"on|Turn On\\t\" + (String)(_on ? \"on\" : \"off\"));\n\t\t\tif (_on) {\n\t\t\t\tblemenu.addItem(\"Scan and connect\", NULL, _scan);\n\t\t\t\tblemenu.addItem(\"Clients\", NULL, _listClients);\n\t\t\t}\n\t\t\tblemenu.buttons(\"up#Back#select##down#\");\n\t\t\tswitch (blemenu.runOnce()) {\n\t\t\t\tcase 1:\n\t\t\t\t\t_on = !_on;\n\t\t\t\t\t_refresh();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0:\n\t\t\t\t\tif (_on != on_orig) {\n\t\t\t\t\t\twriteFlash();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid ezBLE::disconnect() {\n\t\tfor (auto& client : _clients) {\n\t\t\tif (client->isConnected())\n\t\t\t\tclient->disconnect();\n\t\t}\n\t\t_clients.clear();\n\t}\n\n\tBLEClient* ezBLE::getClient(uint16_t index) {\n\t\tif (index >= _clients.size())\n\t\t\treturn nullptr;\n\t\treturn _clients[index];\n\t}\n\n\tuint16_t ezBLE::getClientCount() {\n\t\treturn static_cast<uint16_t>(_clients.size());\n\t}\n\n\tbool ezBLE::_scan(ezMenu* callingMenu) {\n\t\tBLEScan* bleScan = BLEDevice::getScan(); //create new scan\n\t\tbleScan->setActiveScan(true); //active scan uses more power, but get results faster\n\t\tbleScan->setInterval(100);\n\t\tbleScan->setWindow(99);  // less or equal setInterval value\n\t\tez.msgBox(\"Bluetooth\", \"Scanning ...\", \"\");\n\t\tBLEScanResults foundDevices = bleScan->start(5, false);\n\t\tezMenu devicesmenu(\"Found \" + String(foundDevices.getCount()) + \" devices\");\n\t\tdevicesmenu.txtSmall();\n\t\tfor (int i = 0; i < foundDevices.getCount(); i++) {\n\t\t\tconst char* name = nullptr;\n\t\t\tif (foundDevices.getDevice(i).getName().size() == 0)\n\t\t\t\tname = foundDevices.getDevice(i).getAddress().toString().c_str();\n\t\t\telse\n\t\t\t\tname = foundDevices.getDevice(i).getName().c_str();\n\t\t\tdevicesmenu.addItem(name);\n\t\t}\n\t\tdevicesmenu.buttons(\"up#Back#select##down#\");\n\t\tif (devicesmenu.runOnce()) {\n\t\t\tBLEAdvertisedDevice device = foundDevices.getDevice(devicesmenu.pick() - 1);\n\t\t\t_connect(device);\n\t\t}\n\t\tbleScan->clearResults();\n\t\treturn true;\n\t}\n\n\tvoid ezBLE::_connect(class BLEAdvertisedDevice& device) {\n\t\tez.msgBox(\"Bluetooth\", \"Connecting ...\", \"\");\n\t\tBLEClient* client = BLEDevice::createClient();\n\t\tclient->setClientCallbacks(&_bleClientCallback);\n\t\tif (client->connect(&device)) {\n\t\t\t_clients.push_back(client);\n\t\t\tez.msgBox(\"Bluetooth\", \"Device connected.\");\n\t\t} else {\n\t\t\tdelete client;\n\t\t\tez.msgBox(\"Bluetooth\", \"Connection failed!\");\n\t\t}\n\t}\n\n\tbool ezBLE::_listClients(ezMenu* callingMenu) {\n\t\tezMenu clientsmenu(\"Clients\");\n\t\tclientsmenu.txtSmall();\n\t\tfor (auto& client : _clients) {\n\t\t\tclientsmenu.addItem(client->getPeerAddress().toString().c_str());\n\t\t}\n\t\tclientsmenu.buttons(\"up#Back#select##down#\");\n\t\twhile (clientsmenu.runOnce()) {\n\t\t\tif (!_showClient(_clients[clientsmenu.pick() - 1]))\n\t\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\tbool ezBLE::_showClient(BLEClient* client) {\n\t\tezMenu clientmenu(String(client->getPeerAddress().toString().c_str()));\n\t\tclientmenu.txtSmall();\n\t\tclientmenu.buttons(\"up#Back#select##down#\");\n\t\tauto& services = *client->getServices();\n\t\tfor (auto& service : services) {\n\t\t\tbool found = false;\n\t\t\tfor (auto& pair : _gattUuids) {\n\t\t\t\tif (BLEUUID(pair.first).equals(service.second->getUUID())) {\n\t\t\t\t\tclientmenu.addItem(pair.second);\n\t\t\t\t\tfound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!found)\n\t\t\t\tclientmenu.addItem(service.first.c_str());\n\t\t}\n\t\tclientmenu.addItem(\"Disconnect\");\n\t\twhile (clientmenu.runOnce()) {\n\t\t\tif (clientmenu.pickName() == \"Disconnect\") {\n\t\t\t\tclient->disconnect();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tvoid ezBLE::_cleanup() {\n\t\tif (_clients.size() > 0) {\n\t\t\t_clients.erase(std::remove_if(_clients.begin(), _clients.end(), [](BLEClient* client) {\n\t\t\t\tbool shouldRemove = !client->isConnected();\n\t\t\t\tif (shouldRemove)\n\t\t\t\t\tdelete client;\n\t\t\t\treturn shouldRemove;\n\t\t\t}), _clients.end());\n\t\t}\n\t}\n\n\tvoid ezBLE::_refresh() {\n\t\tif (_on) {\n\t\t\tif (!_initialized) {\n\t\t\t\t_initialized = true;\n\t\t\t\tBLEDevice::init(M5EZ_BLE_DEVICE_NAME);\n\t\t\t}\n\t\t} else {\n\t\t\tdisconnect();\n\t\t\tif (_initialized) {\n\t\t\t\t_initialized = false;\n\t\t\t\t_cleanup();\n\t\t\t\tBLEDevice::deinit(false);\n\t\t\t}\n\t\t}\n\t}\n\n#endif\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   B A T T E R Y\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#ifdef M5EZ_BATTERY\n\tbool ezBattery::_on = false;\n\t#define BATTERY_CHARGING_OFF (255)\n\tuint8_t ezBattery::_numChargingBars = BATTERY_CHARGING_OFF;\n\n\tvoid ezBattery::begin() {\n\t\tWire.begin();\n\t\tez.battery.readFlash();\n\t\tez.settings.menuObj.addItem(\"Battery settings\", ez.battery.menu);\n\t\tif (_on) {\n\t\t\t_refresh();\n\t\t}\n\t}\n\n\tvoid ezBattery::readFlash() {\n\t\tPreferences prefs;\n\t\tprefs.begin(\"M5ez\", true);\t// true: read-only\n\t\t_on = prefs.getBool(\"battery_icon_on\", false);\n\t\tprefs.end();\n\t}\n\n\tvoid ezBattery::writeFlash() {\n\t\tPreferences prefs;\n\t\tprefs.begin(\"M5ez\");\n\t\tprefs.putBool(\"battery_icon_on\", _on);\n\t\tprefs.end();\n\t}\n\n\tvoid ezBattery::menu() {\n\t\tbool on_orig = _on;\n\t\twhile(true) {\n\t\t\tezMenu clockmenu(\"Battery settings\");\n\t\t\tclockmenu.txtSmall();\n\t\t\tclockmenu.buttons(\"up#Back#select##down#\");\n\t\t\tclockmenu.addItem(\"on|Display battery\\t\" + (String)(_on ? \"on\" : \"off\"));\n\t\t\tswitch (clockmenu.runOnce()) {\n\t\t\t\tcase 1:\n\t\t\t\t\t_on = !_on;\n\t\t\t\t\t_refresh();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0:\n\t\t\t\t\tif (_on != on_orig) {\n\t\t\t\t\t\twriteFlash();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tuint16_t ezBattery::loop() {\n\t\tif (!_on) return 0;\n\t\tez.header.draw(\"battery\");\n\t\treturn (_numChargingBars != BATTERY_CHARGING_OFF ? 1000 : 5000);\n\t}\n\n\t//Transform the M5Stack built in battery level into an internal format.\n\t// From [100, 75, 50, 25, 0] to [4, 3, 2, 1, 0]\n\tuint8_t ezBattery::getTransformedBatteryLevel()\n\t{\n\t\tswitch (m5.Power.getBatteryLevel()) \n\t\t{\n\t\t\tcase 100:\n\t\t\t\treturn 4;\n\t\t\tcase 75:\n\t\t\t\treturn 3;\n\t\t\tcase 50:\n\t\t\t\treturn 2;\n\t\t\tcase 25:\n\t\t\t\treturn 1;\n\t\t\tdefault:\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\n\t//Return the theme based battery bar color according to its level\n\tuint32_t ezBattery::getBatteryBarColor(uint8_t batteryLevel)\n\t{\n\t\tswitch (batteryLevel) {\n\t\t\tcase 0:\n\t\t\t\treturn ez.theme->battery_0_fgcolor;\t\t\t\t\n\t\t\tcase 1:\n\t\t\t\treturn ez.theme->battery_25_fgcolor;\t\t\t\t\n\t\t\tcase 2:\n\t\t\t\treturn ez.theme->battery_50_fgcolor;\t\t\t\t\n\t\t\tcase 3:\n\t\t\t\treturn ez.theme->battery_75_fgcolor;\t\t\t\t\n\t\t\tcase 4:\n\t\t\t\treturn ez.theme->battery_100_fgcolor;\n\t\t\tdefault:\n\t\t\t\treturn ez.theme->header_fgcolor;\t\n\t\t}\n\t}\n\n\tvoid ezBattery::_refresh() {\n\t\tif (_on) {\n\t\t\tez.header.insert(RIGHTMOST, \"battery\", ez.theme->battery_bar_width + 2 * ez.theme->header_hmargin, ez.battery._drawWidget);\n\t\t\tez.addEvent(ez.battery.loop);\n\t\t} else {\n\t\t\tez.header.remove(\"battery\");\n\t\t\tez.removeEvent(ez.battery.loop);\n\t\t}\n\t}\n\n\tvoid ezBattery::_drawWidget(uint16_t x, uint16_t w) {\n\t\tuint8_t currentBatteryLevel = getTransformedBatteryLevel();\n\t\tif((M5.Power.isChargeFull() == false) && (M5.Power.isCharging() == true)) {\n\t\t\tif(_numChargingBars < currentBatteryLevel) {\n\t\t\t\t_numChargingBars++;\n\t\t\t} else {\n\t\t\t\t_numChargingBars = 0;\n\t\t\t}\n\t\t} else {\n\t\t\t_numChargingBars = BATTERY_CHARGING_OFF;\n\t\t}\n\t\tuint16_t left_offset = x + ez.theme->header_hmargin;\n\t\tuint8_t top = ez.theme->header_height / 10;\n\t\tuint8_t height = ez.theme->header_height * 0.8;\n\t\tm5.lcd.fillRoundRect(left_offset, top, ez.theme->battery_bar_width, height, ez.theme->battery_bar_gap, ez.theme->header_bgcolor);\n\t\tm5.lcd.drawRoundRect(left_offset, top, ez.theme->battery_bar_width, height, ez.theme->battery_bar_gap, ez.theme->header_fgcolor);\n\t\tuint8_t bar_width = (ez.theme->battery_bar_width - ez.theme->battery_bar_gap * 5) / 4.0;\n\t\tuint8_t bar_height = height - ez.theme->battery_bar_gap * 2;\n\t\tleft_offset += ez.theme->battery_bar_gap;\n\t\tfor (uint8_t n = 0; n < (_numChargingBars != BATTERY_CHARGING_OFF ? _numChargingBars : currentBatteryLevel); n++) {\n\t\t\tm5.lcd.fillRect(left_offset + n * (bar_width + ez.theme->battery_bar_gap), top + ez.theme->battery_bar_gap, \n\t\t\t\tbar_width, bar_height, getBatteryBarColor(currentBatteryLevel));\n\t\t}\n\t}\n\n#endif\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   E Z\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nstd::vector<ezTheme> M5ez::themes;\nezTheme* M5ez::theme = NULL;\nezScreen M5ez::screen;\nconstexpr ezScreen& M5ez::s;\nezHeader M5ez::header;\nconstexpr ezHeader& M5ez::h;\nezCanvas M5ez::canvas;\nconstexpr ezCanvas& M5ez::c;\nezButtons M5ez::buttons;\nconstexpr ezButtons& M5ez::b;\nezSettings M5ez::settings;\nezMenu* M5ez::_currentMenu = nullptr;\nbool M5ez::_in_event = false;\n#ifdef M5EZ_WIFI\n\tezWifi M5ez::wifi;\n\tconstexpr ezWifi& M5ez::w;\n#endif\t\n#ifdef M5EZ_BLE\n\tezBLE M5ez::ble;\n#endif\n#ifdef M5EZ_BATTERY\n\tezBattery M5ez::battery;\n#endif\n#ifdef M5EZ_BACKLIGHT\n\tezBacklight M5ez::backlight;\n#endif\n#ifdef M5EZ_CLOCK\n\tezClock M5ez::clock;\n#endif\n#ifdef M5EZ_FACES\n\tezFACES M5ez::faces;\n#endif\t\nstd::vector<event_t> M5ez::_events;\n\n// ez.textInput\nint16_t M5ez::_text_cursor_x, M5ez::_text_cursor_y, M5ez::_text_cursor_h, M5ez::_text_cursor_w;\nbool M5ez::_text_cursor_state;\nlong  M5ez::_text_cursor_millis;\n\nvoid M5ez::begin() {\n\tm5.begin();\n\tezTheme::begin();\n\tez.screen.begin();\n\tez.settings.begin();\n}\n\nvoid M5ez::yield() {\n\t::yield();\t\t\t// execute the Arduino yield in the root namespace\n\tM5.update();\n\tif(M5ez::_in_event) return;\t\t\t// prevent reentrancy\n\tfor (uint8_t n = 0; n< _events.size(); n++) {\n\t\tif (millis() > _events[n].when) {\n\t\t\tM5ez::_in_event = true;\t\t// prevent reentrancy\n\t\t\tuint16_t r = (_events[n].function)();\n\t\t\tM5ez::_in_event = false;\t// prevent reentrancy\n\t\t\tif (r) {\n\t\t\t\t_events[n].when = millis() + r - 1;\n\t\t\t} else {\n\t\t\t\t_events.erase(_events.begin() + n);\n\t\t\t\tbreak;\t\t// make sure we don't go beyond _events.size() after deletion\n\t\t\t}\n\t\t}\n\t}\n#ifdef M5EZ_CLOCK\n\tevents();\t\t//TMP\t\n#endif\n}\n\nvoid M5ez::addEvent(uint16_t (*function)(), uint32_t when /* = 1 */) {\n\tevent_t n;\n\tn.function = function;\n\tn.when = millis() + when - 1;\n\t_events.push_back(n);\n}\n\nvoid M5ez::removeEvent(uint16_t (*function)()) {\n\tuint8_t n = 0;\n\twhile (n < _events.size()) {\n\t\tif (_events[n].function == function) {\n\t\t\t_events.erase(_events.begin() + n);\n\t\t}\n\t\tn++;\n\t}\n}\n\nbool M5ez::_redraw;\n\nvoid M5ez::redraw() { _redraw = true; }\n\nezMenu* M5ez::getCurrentMenu() { return _currentMenu; }\n\n\nstatic const char * _keydefs[] PROGMEM = {\n\t\"KB3|qrstu.#SP#KB4|vwxyz,#Del#KB5|More#LCK:|Lock#KB1|abcdefgh#KB2|ijklmnop#Done\",\t//KB0\n\t\"c#d#e#f#g#h#a#b#Back\",\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//KB1\n\t\"k#l#m#n#o#p#i#j#Back\",\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//KB2\n\t\"s#t#u#.###q#r#Back\",\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//KB3\n\t\"x#y#z#,###v#w#Back\",\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//KB4\n\t\"KB8|Q-U.#SP#KB9|V-Z,#Del#KB10|More#LCK:CAPS|Lock#KB6|A-H#KB7|I-P#Done\",\t\t\t//KB5\n\t\"C#D#E#F#G#H#A#B#Back\",\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//KB6\n\t\"K#L#M#N#O#P#I#J#Back\",\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//KB7\n\t\"S#T#U#.###Q#R#Back\",\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//KB8\n\t\"X#Y#Z#,###V#W#Back\",\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//KB9\n\t\"KB11|1-5.#SP#KB12|6-0,#Del#KB13|More#LCK:NUM|Lock###Done\",\t\t\t\t\t\t\t//KB10\n\t\"1#2#3#4#5#,###Back\",\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//KB11\n\t\"6#7#8#9#0#.###Back\",\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//KB12\n\t\"KB14|!?:;\\\\#$^&#SP#KB15|*()_-+=\\\\|#Del#KB0|More#LCK:SYM|Lock#KB16|'\\\"`@%\\\\/#KB17|<>{}[]()#Done\",\t//KB13\n\t\"!#?#:#;#\\\\##$#^#&#Back\",\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//KB14\n\t\"*#(#)#_#-#+#=#\\\\|#Back\",\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//KB15\n\t\"'#\\\"#`#@#%#/###Back\",\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//KB16\n\t\"<#>#{#}#[#]#(#)#Back\",\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//KB17\n\t\".#,#Del##Done#\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//KB18\n\t\n};\n\n// ez.msgBox\n\nString M5ez::msgBox(String header, String msg, String buttons /* = \"OK\" */, const bool blocking /* = true */, const GFXfont* font /* = NULL */, uint16_t color /* = NO_COLOR */) {\n\tif (ez.header.title() != header) {\n\t\tez.screen.clear();\n\t\tif (header != \"\") ez.header.show(header);\n\t} else {\n\t\tez.canvas.clear();\n\t}\n\tif (!font) font = ez.theme->msg_font;\n\tif (color == NO_COLOR) color = ez.theme->msg_color;\t\n\tez.buttons.show(buttons);\n\tstd::vector<line_t> lines;\n\tmsg.replace(\"|\", (String)char(13));\t\n\tm5.lcd.setTextDatum(CC_DATUM);\n\tm5.lcd.setTextColor(color);\n\tez.setFont(font);\n\t_fitLines(msg, ez.canvas.width() - 2 * ez.theme->msg_hmargin, ez.canvas.width() / 3, lines);\n\tint16_t font_h = ez.fontHeight();\n\tfor (int8_t n = 0; n < lines.size(); n++) {\n\t\tint16_t y = ez.canvas.top() + ez.canvas.height() / 2 - ( (lines.size() - 1) * font_h / 2) + n * font_h;\n\t\tm5.lcd.drawString(lines[n].line, TFT_W / 2, y);\n\t}\n\tif (buttons != \"\" && blocking) {\n\t\tString ret = ez.buttons.wait();\n\t\tez.screen.clear();\n\t\treturn ret;\n\t} else {\n\t\treturn \"\";\n\t}\n}\n\n\n// ez.textInput\n\nString M5ez::textInput(String header /* = \"\" */, String defaultText /* = \"\" */) {\n\n\tint16_t current_kb = 0, prev_kb = 0, locked_kb = 0;\n\t#ifdef M5EZ_FACES\n\t\tif (ez.faces.on()) {\n\t\t\tcurrent_kb = locked_kb = prev_kb = ez.theme->input_faces_btns;\n\t\t\tez.faces.poll(); \t// flush key buffer in FACES\n\t\t}\n\t#endif\n\tString tmpstr;\t\n\tString text = defaultText;\n\tez.screen.clear();\n\tif (header != \"\") ez.header.show(header);\n\t_drawTextInputBox(text);\n\tString key;\n\tez.buttons.show(_keydefs[current_kb]);\n\n\twhile (true) {\n\t\tkey = ez.buttons.poll();\n\t\t#ifdef M5EZ_FACES\n\t\t\tif (ez.faces.on() && key == \"\") key = ez.faces.poll();\n\t\t#endif\n\t\tif (key == \"Done\" || key == (String)char(13)) return text;\n\t\tif (key.substring(0, 2) == \"KB\") {\n\t\t\tprev_kb = current_kb;\n\t\t\ttmpstr = key.substring(2);\n\t\t\tcurrent_kb = tmpstr.toInt();\n\t\t\tez.buttons.show(_keydefs[current_kb]);\n\t\t\tkey = \"\";\n\t\t}\n\t\tif (key.substring(0, 4) == \"LCK:\") {\n\t\t\tif (locked_kb != current_kb) {\n\t\t\t\t_drawTextInputLockString( key.substring(4) );\n\t\t\t\tlocked_kb = current_kb;\n\t\t\t} else {\n\t\t\t\t_drawTextInputLockString( \"\" );\n\t\t\t\tlocked_kb = 0;\n\t\t\t\tcurrent_kb = 0;\n\t\t\t\tez.buttons.show(_keydefs[current_kb]);\n\t\t\t}\n\t\t\tkey = \"\";\n\t\t}\n\t\tif (key == \"Back\") {\n\t\t\tcurrent_kb = prev_kb;\n\t\t\tez.buttons.show(_keydefs[current_kb]);\n\t\t\tkey = \"\";\n\t\t}\n\t\tif (key == \"Del\" || key == (String)char(8) || key == (String)char(127)) {\n\t\t\ttext = text.substring(0, text.length() - 1);\n\t\t\t_drawTextInputBox(text);\n\t\t\tkey = \"\";\n\t\t}\n\t\tif (key == \"SP\") key = \" \";\n\t\tif (key >= \" \" && key <= \"~\") {\n\t\t\tcurrent_kb = locked_kb;\n\t\t\tez.buttons.show(_keydefs[current_kb]);\n\t\t\ttext += key;\n\t\t\t_drawTextInputBox(text);\n\t\t}\n\t\n\t\t_textCursor();\n\t}\n}\n\nvoid M5ez::_drawTextInputLockString(String text) {\n\tm5.lcd.setTextColor(TFT_RED);\n\tez.setFont(ez.theme->input_keylock_font);\n\tm5.lcd.setTextDatum(TR_DATUM);\n\tint16_t text_h = ez.fontHeight();\n\tm5.lcd.fillRect(0, _text_cursor_y + ez.theme->input_vmargin + 10 + text_h, TFT_W, text_h, ez.screen.background());\n\tm5.lcd.drawString(text, TFT_W - ez.theme->input_hmargin - 10, _text_cursor_y + ez.theme->input_vmargin + text_h + 10);\n}\n\nvoid M5ez::_drawTextInputBox(String text) {\n\tint16_t text_w;\n\tint16_t box_w = TFT_W - 2 * ez.theme->input_hmargin;\n\tez.setFont(ez.theme->input_font);\n\tint16_t text_h = ez.fontHeight();\n\t_text_cursor_y = ez.canvas.top() + ez.theme->input_top + ez.theme->input_vmargin;\n\t_text_cursor_h = text_h;\n\t_text_cursor_w = m5.lcd.textWidth(\"A\");\n\tm5.lcd.fillRoundRect(ez.theme->input_hmargin, ez.canvas.top() + ez.theme->input_top, box_w, text_h + ez.theme->input_vmargin * 2, 8, ez.theme->input_bgcolor);\n\t_text_cursor_y = ez.canvas.top() + ez.theme->input_top + ez.theme->input_vmargin;\n\tm5.lcd.setTextColor(ez.theme->input_fgcolor);\n\tString disp_text = text;\n\t// chop off characters from the beginning of displayed string until it fits\n\twhile (true) {\n\t\ttext_w = M5.lcd.textWidth(disp_text);\n\t\tif (text_w + _text_cursor_w > box_w) { \n\t\t\tdisp_text = disp_text.substring(1);\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// For some reason the text rendering prints a monospace font with a space at the end with a very narrow space\n\tif (disp_text.substring(disp_text.length() - 1) == \" \") disp_text += \"  \";\n\n\tm5.lcd.setTextDatum(TC_DATUM);\n\tm5.lcd.drawString(disp_text, TFT_W / 2 - _text_cursor_w / 2, ez.canvas.top() + ez.theme->input_top + ez.theme->input_vmargin);\n\t_text_cursor_x = TFT_W / 2 + text_w / 2 - _text_cursor_w / 2 + 2;\n\t_textCursor (true);\t// draw the  cursor block\n}\n\nvoid M5ez::_textCursor() {\n\tif (ez.theme->input_cursor_blink > 0) {\n\t\tif (millis() - _text_cursor_millis > ez.theme->input_cursor_blink) { \n\t\t\t_textCursor(!_text_cursor_state);\n\t\t}\n\t}\n}\n\nvoid M5ez::_textCursor(bool state) {\n\tif (state) M5.lcd.fillRect(_text_cursor_x, _text_cursor_y, _text_cursor_w, _text_cursor_h, ez.theme->input_fgcolor);\n\tif (!state) M5.lcd.fillRect(_text_cursor_x, _text_cursor_y, _text_cursor_w, _text_cursor_h, ez.theme->input_bgcolor);\n\t_text_cursor_state = state;\n\t_text_cursor_millis = millis();\n}\n\nString M5ez::textBox(String header /*= \"\"*/, String text /*= \"\" */, bool readonly /*= false*/, String buttons /*= \"up#Done#down\"*/, const GFXfont* font /* = NULL */, uint16_t color /* = NO_COLOR */) {\n\tif (!font) font = ez.theme->tb_font;\n\tif (color == NO_COLOR) color = ez.theme->tb_color;\n\t#ifdef M5EZ_FACES\n\t\tif (ez.faces.on()) {\n\t\t\tez.faces.poll(); \t// flush key buffer in FACES\n\t\t} else {\n\t\t\treadonly = true;\n\t\t}\n\t#endif\n\tstd::vector<line_t> lines;\n\tez.screen.clear();\n\tuint16_t cursor_pos = text.length();\n\tbool cursor_state = false;\n\tlong cursor_time = 0;\n\tif (header != \"\") ez.header.show(header);\n\tint8_t per_line_h = ez.fontHeight();\n\tString tmp_buttons = buttons;\n\ttmp_buttons.replace(\"up\", \"\");\n\ttmp_buttons.replace(\"down\", \"\");\t\n\tez.buttons.show(tmp_buttons); \t//we need to draw the buttons here to make sure ez.canvas.height() is correct\n\tuint8_t lines_per_screen = (ez.canvas.height()) / per_line_h;\n\tuint8_t remainder = (ez.canvas.height()) % per_line_h;\n\t_wrapLines(text, ez.canvas.width() - 2 * ez.theme->tb_hmargin, lines);\n\tuint16_t offset = 0;\n\tbool redraw = true;\n\tez.setFont(font);\n\tuint8_t cursor_width = m5.lcd.textWidth(\"|\");\n\tuint8_t cursor_height = per_line_h * 0.8;\n\tint16_t cursor_x = 0;\n\tint16_t cursor_y = 0;\n\twhile (true) {\n\t\tif (redraw) {\n\t\t\tif (!readonly && cursor_x && cursor_y) m5.lcd.fillRect(cursor_x, cursor_y, cursor_width, cursor_height, ez.screen.background());\t\t//Remove current cursor\n\t\t\tcursor_x = cursor_y = 0;\n\t\t\ttmp_buttons = buttons;\n\t\t\tif (offset >= lines.size() - lines_per_screen) {\n\t\t\t\ttmp_buttons.replace(\"down\", \"\");\n\t\t\t}\n\t\t\tif (offset <= 0) {\n\t\t\t\toffset = 0;\n\t\t\t\ttmp_buttons.replace(\"up\", \"\");\n\t\t\t}\n\t\t\tez.buttons.show(tmp_buttons);\n\t\t\tez.setFont(font);\n\t\t\tm5.lcd.setTextColor(color, ez.screen.background());\n\t\t\tm5.lcd.setTextDatum(TL_DATUM);\n\t\t\tuint16_t x, y;\n\t\t\tint16_t sol, eol;\n\t\t\tString this_line;\n\t\t\tif (lines.size() > 0) {\n\t\t\t\tfor (int8_t n = offset; n < offset + lines_per_screen; n++) {\n\t\t\t\t\tif (n < lines.size() - 1) {\n\t\t\t\t\t\tthis_line = lines[n].line;\n\t\t\t\t\t\tsol = lines[n].position;\n\t\t\t\t\t\teol = lines[n + 1].position - 1;\n\t\t\t\t\t} else if (n == lines.size() - 1) {\n\t\t\t\t\t\tthis_line = lines[n].line;\n\t\t\t\t\t\tsol = lines[n].position;\n\t\t\t\t\t\teol = text.length();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis_line = \"\";\n\t\t\t\t\t\tsol = -1;\n\t\t\t\t\t\teol = text.length();\n\t\t\t\t\t}\n\t\t\t\t\ty = ez.canvas.top() + remainder * 0.7 + (n - offset) * per_line_h;\n\t\t\t\t\tx = ez.theme->tb_hmargin;\n\t\t\t\t\tif (!readonly && sol != -1 && cursor_pos >= sol && cursor_pos <= eol && n < lines.size()) { \t\t// if cursor is on current line\n\t\t\t\t\t\tx += m5.lcd.drawString(this_line.substring(0, cursor_pos - sol), x, y);\n\t\t\t\t\t\tcursor_x = x;\n\t\t\t\t\t\tcursor_y = y;\n\t\t\t\t\t\tx += cursor_width;\n\t\t\t\t\t\tx += m5.lcd.drawString(this_line.substring(cursor_pos - sol), x, y);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tx += m5.lcd.drawString(this_line, x, y);\n\t\t\t\t\t}\n\t\t\t\t\tm5.lcd.fillRect(x, y, ez.canvas.width() - x, per_line_h, ez.screen.background());\n\t\t\t\t}\n\t\t\t\tredraw = false;\n\t\t\t}\n\t\t}\n\t\tif (!readonly && cursor_x && cursor_y && millis() - cursor_time > ez.theme->input_cursor_blink) {\n\t\t\tcursor_time = millis();\n\t\t\tif (cursor_state) {\n\t\t\t\tm5.lcd.fillRect(cursor_x, cursor_y, cursor_width, cursor_height, ez.screen.background());\n\t\t\t\tcursor_state = false;\n\t\t\t} else {\n\t\t\t\tm5.lcd.fillRect(cursor_x, cursor_y, cursor_width, cursor_height, color);\n\t\t\t\tcursor_state = true;\n\t\t\t}\n\t\t}\n\t\tString key = ez.buttons.poll();\n\t\t#ifdef M5EZ_FACES\n\t\t\tif (ez.faces.on() && key == \"\") key = ez.faces.poll();\n\t\t#endif\n\t\tif (key == \"down\") {\n\t\t\toffset += lines_per_screen;\n\t\t\tez.canvas.clear();\n\t\t\tredraw = true;\n\t\t\tkey = \"\";\n\t\t}\n\t\tif (key == \"up\") {\n\t\t\toffset -= lines_per_screen;\n\t\t\tez.canvas.clear();\n\t\t\tredraw = true;\n\t\t\tkey = \"\";\n\t\t}\n\t\tif (key == \"Done\") {\n\t\t\tez.screen.clear();\n\t\t\treturn text;\n\t\t}\n\t\tif (key == (String)char(8)) {\t\t// Delete\n\t\t\tif (cursor_pos > 0) {\n\t\t\t\ttext = text.substring(0, cursor_pos - 1) + text.substring(cursor_pos);\n\t\t\t\tcursor_pos--;\n\t\t\t\t_wrapLines(text, ez.canvas.width() - 2 * ez.theme->tb_hmargin, lines);\n\t\t\t\tredraw = true;\n\t\t\t}\n\t\t\tkey = \"\";\n\t\t}\n\t\tif (key == (String)char(191)) {\t\t// left arrow on FACES keyboard\n\t\t\tif (cursor_pos > 0) {\n\t\t\t\tcursor_pos--;\n\t\t\t\tredraw = true;\n\t\t\t}\n\t\t\tkey = \"\";\n\t\t}\n\t\tif (key == (String)char(193)) {\t\t// right arrow on FACES keyboard\n\t\t\tif (cursor_pos < text.length()) {\n\t\t\t\tcursor_pos++;\n\t\t\t\tredraw = true;\n\t\t\t}\n\t\t\tkey = \"\";\n\t\t}\n\t\tif (key == (String)char(183) || key == (String)char(192)) {\t\t// up or down arrow on FACES keyboard\n\t\t\tuint16_t cursor_line = lines.size() - 1;\n\t\t\tfor (uint16_t n = 0; n < lines.size(); n++) {\n\t\t\t\tif (cursor_pos < lines[n].position) {\n\t\t\t\t\tcursor_line = n - 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfloat relative_pos = (float)(cursor_pos - lines[cursor_line].position) / lines[cursor_line].line.length();\n\t\t\tif (key == (String)char(183)) {\t\t//up\n\t\t\t\tif (cursor_line >= 1) {\n\t\t\t\t\tcursor_pos = lines[cursor_line - 1].position + lines[cursor_line - 1].line.length() * relative_pos;\n\t\t\t\t\tredraw = true;\n\t\t\t\t}\n\t\t\t} else {\t//down\n\t\t\t\tif (cursor_line < lines.size() - 1) {\n\t\t\t\t\tcursor_pos = lines[cursor_line + 1].position + lines[cursor_line + 1].line.length() * relative_pos;\n\t\t\t\t\tredraw = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tkey = \"\";\n\t\t}\n\t\t\n\t\tif (!readonly) {\n\t\t\tif (key >= \" \" && key <= \"~\") {\n\t\t\t\tif (cursor_pos == text.length()) {\n\t\t\t\t\ttext = text + key;\n\t\t\t\t} else {\n\t\t\t\t\ttext = text.substring(0, cursor_pos) + key + text.substring(cursor_pos);\n\t\t\t\t}\n\t\t\t\tcursor_pos++;\n\t\t\t\t_wrapLines(text, ez.canvas.width() - 2 * ez.theme->tb_hmargin, lines);\n\t\t\t\tredraw = true;\n\t\t\t}\n\t\t} \n\t}\n}\n\nvoid M5ez::_wrapLines(String text, uint16_t width, std::vector<line_t>& lines) {\n\tlines.clear();\n\tint16_t offset = 0;\n\tint16_t last_space = 0;\n\tint16_t cur_space = 0;\n\tint16_t newline = 0;\n\tbool all_done = false;\n\tline_t new_line;\n\t\n\t//If there are no return chars, it's either a single line,\n\t//Or it's using linux/mac line endings which are a single char\n\tchar nlchar = 13;\n\tif (text.indexOf(13)==-1) nlchar = 10;\n\t\n\twhile (!all_done) {\n\t\tcur_space = text.indexOf(\" \", last_space + 1);\n\t\tif (cur_space == -1) {\n\t\t\tcur_space = text.length();\n\t\t\tall_done = true;\n\t\t}\n\t\tnewline = text.indexOf(char(nlchar), last_space + 1);\n\t\tif (newline != -1 && newline < cur_space) cur_space = newline;\n\t\tif (m5.lcd.textWidth(text.substring(offset, cur_space)) > width || text.substring(last_space, last_space + 1) == (String)char(nlchar)) {\n\t\t\tif (m5.lcd.textWidth(text.substring(offset, last_space)) <= width) {\n\t\t\t\tnew_line.position = offset;\n\t\t\t\tnew_line.line = text.substring(offset, last_space);\n\t\t\t\tlines.push_back(new_line);\n\t\t\t\toffset = last_space + 1;\n\t\t\t\tlast_space = cur_space;\n\t\t\t} else {\n\t\t\t\tfor (uint16_t n = offset; n < text.length(); n++) {\n\t\t\t\t\tif (m5.lcd.textWidth(text.substring(offset, n + 1)) > width) {\n\t\t\t\t\t\tnew_line.position = offset;\n\t\t\t\t\t\tnew_line.line = text.substring(offset, n);\n\t\t\t\t\t\tlines.push_back(new_line);\n\t\t\t\t\t\toffset = n;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tlast_space = cur_space;\n\t\t}\n\n\t\t//Special case handle the last line\n\t\tif (all_done && offset < text.length()) {\n\t\t\twhile(text.indexOf(char(nlchar), offset) > offset) {\n\t\t\t\tif(offset < text.length()) {\n\t\t\t\t\tnew_line.line = text.substring(offset, text.indexOf(char(nlchar), offset));\n\t\t\t\t\tnew_line.position = offset;\n\t\t\t\t\toffset = text.indexOf(char(nlchar), offset);\n\t\t\t\t\tlines.push_back(new_line);\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\t\t\n\t\t\t}\n\t\t}\t\n\t\t\n\t\tif (all_done && offset < text.length()) {\n\t\t\tnew_line.position = offset;\n\t\t\tnew_line.line = text.substring(offset);\n\t\t\tlines.push_back(new_line);\n\t\t}\n\t\t\n\t}\t\t\n}\n\nvoid M5ez::_fitLines(String text, uint16_t max_width, uint16_t min_width, std::vector<line_t>& lines) {\n\tuint8_t\tprev_num_lines = 100;\n\tfor (int16_t n = max_width; n > min_width; n -= 10) {\n\t\t_wrapLines(text, n, lines);\n\t\tif (lines.size() > prev_num_lines) {\n\t\t\t_wrapLines(text, n + 10, lines);\n\t\t\treturn;\n\t\t}\n\t\tprev_num_lines = lines.size();\n\t}\n}\n\n// Some generic String object helper functions. Made public because they might be useful in user code\n\nString M5ez::rightOf(String input, String separator, bool trim /* = true */ ) {\n\tinput.replace(\"\\\\\" + separator, (String)char(255));\t\t// allow for backslash escaping of the separator\n\tint16_t sep_pos = input.indexOf(separator);\n\tinput.replace((String)char(255), separator);\n\tString out = input.substring(sep_pos + 1);\n\tif (trim) out.trim();\n\treturn out;\n}\t\n\nString M5ez::leftOf(String input, String separator, bool trim /* = true */ ) {\n\tinput.replace(\"\\\\\" + separator, (String)char(255));\t\t// allow for backslash escaping of the separator\n\tint16_t sep_pos = input.indexOf(separator);\n\tinput.replace((String)char(255), separator);\n\tif (sep_pos == -1) sep_pos = input.length();\n\tString out = input.substring(0, sep_pos);\n\tif (trim) out.trim();\n\treturn out;\n}\t\n\nint16_t M5ez::chopString(String input, String separator, std::vector<String>& chops, bool trim /* = true */) {\n\tinput.replace(\"\\\\\" + separator, (String)char(255));\t\t// allow for backslash escaping of the separator\n\tint16_t next_sep, offset = 0;\n\tbool done = false;\n\twhile (!done) {\n\t\tnext_sep = input.indexOf(separator, offset);\n\t\tif (next_sep == -1) {\n\t\t\tnext_sep = input.length();\n\t\t\tdone = true;\n\t\t}\n\t\tString chop = input.substring(offset, next_sep);\n\t\tchop.replace((String)char(255), separator);\n\t\tif (trim) chop.trim();\n\t\tchops.push_back(chop);\n\t\toffset = next_sep + 1;\n\t}\t\n\treturn chops.size();\n}\n\nint16_t M5ez::charsFit(String input, int16_t cutoff) {\n\tint16_t measured;\n\tfor (int16_t n = input.length(); n >= 0; n--) {\n\t\tmeasured = m5.lcd.textWidth(input.substring(0, n));\n\t\tif (measured <= cutoff) {\n\t\t\treturn n;\n\t\t}\n\t}\n\treturn 0;\n}\n\nString M5ez::clipString(String input, int16_t cutoff, bool dots /* = true */ ) {\n\tif (m5.lcd.textWidth(input) <= cutoff) {\n\t\treturn input;\n\t} else {\n\t\tfor (int16_t n = input.length(); n >= 0; n--) {\n\t\t\tString toMeasure = input.substring(0, n);\n\t\t\tif (dots) toMeasure = toMeasure + \"..\";\n\t\t\tif (m5.lcd.textWidth(toMeasure) <= cutoff) return toMeasure;\n\t\t}\n\t\treturn \"\";\n\t}\n}\n\nbool M5ez::isBackExitOrDone(String str) {\n\tif (str == \"back\" || str == \"exit\" || str == \"done\" || str == \"Back\" || str == \"Exit\" || str == \"Done\") return true;\n\treturn false;\n}\n\n// Font related m5.lcd wrappers\n\nvoid M5ez::setFont(const GFXfont* font) {\n\tlong ptrAsInt = (long) font;\n\tint16_t size = 1;\n\tif (ptrAsInt <= 16) {\n \t\tif (ptrAsInt > 8) {\n \t\t\tptrAsInt -= 8;\n \t\t\tsize++;\n \t\t}\n\t\tm5.lcd.setTextFont(ptrAsInt);\n\t} else {\n\t\tm5.lcd.setFreeFont(font);\n\t}\n\tm5.lcd.setTextSize(size);\n}\n\nint16_t M5ez::fontHeight() { return m5.lcd.fontHeight(m5.lcd.textfont); }\n\nString M5ez::version() { return M5EZ_VERSION; } \n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   M E N U\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nezMenu::ezMenu(String hdr /* = \"\" */) {\n\t_img_background = NO_COLOR;\n\t_offset = 0;\n\t_selected = -1;\n\t_header = hdr;\n\t_buttons = \"\";\n\t_font = NULL;\n\t_img_from_top = 0;\n\t_img_caption_location = TC_DATUM;\n\t_img_caption_font = &FreeSansBold12pt7b;\n\t_img_caption_color = TFT_RED;\n\t_img_caption_hmargin = 10;\n\t_img_caption_vmargin = 10;\n\t_sortFunction = NULL;\n}\n\nezMenu::~ezMenu() {\n\tif(this == M5ez::_currentMenu) M5ez::_currentMenu = nullptr;\n}\n\nvoid ezMenu::txtBig() { _font = ez.theme->menu_big_font; }\n\nvoid ezMenu::txtSmall() { _font = ez.theme->menu_small_font; }\n\nvoid ezMenu::txtFont(const GFXfont* font) { _font = font; }\n\nbool ezMenu::addItem(String nameAndCaption, void (*simpleFunction)() /* = NULL */, bool (*advancedFunction)(ezMenu* callingMenu) /* = NULL */, void (*drawFunction)(ezMenu* callingMenu, int16_t x, int16_t y, int16_t w, int16_t h) /* = NULL */) {\n\treturn addItem(NULL, nameAndCaption, simpleFunction, advancedFunction, drawFunction);\n}\n\nbool ezMenu::addItem(const char *image, String nameAndCaption , void (*simpleFunction)() /* = NULL */, bool (*advancedFunction)(ezMenu* callingMenu) /* = NULL */, void (*drawFunction)(ezMenu* callingMenu, int16_t x, int16_t y, int16_t w, int16_t h) /* = NULL */) {\n\tMenuItem_t new_item;\n\tnew_item.image = image;\n\tnew_item.fs = NULL;\n\tnew_item.nameAndCaption = nameAndCaption;\n\tnew_item.simpleFunction = simpleFunction;\n\tnew_item.advancedFunction = advancedFunction;\n\tnew_item.drawFunction = drawFunction;\n\tif (_selected == -1) _selected = _items.size();\n\t_items.push_back(new_item);\n\t_sortItems();\n\tM5ez::_redraw = true;\n\treturn true;\n}\n\nbool ezMenu::addItem(fs::FS &fs, String path, String nameAndCaption, void (*simpleFunction)() /* = NULL */, bool (*advancedFunction)(ezMenu* callingMenu) /* = NULL */, void (*drawFunction)(ezMenu* callingMenu, int16_t x, int16_t y, int16_t w, int16_t h) /* = NULL */) {\n\tMenuItem_t new_item;\n\tnew_item.image = NULL;\n\tnew_item.fs = &fs;\n\tnew_item.path = path;\n\tnew_item.nameAndCaption = nameAndCaption;\n\tnew_item.simpleFunction = simpleFunction;\n\tnew_item.advancedFunction = advancedFunction;\n\tnew_item.drawFunction = drawFunction;\n\tif (_selected == -1) _selected = _items.size();\n\t_items.push_back(new_item);\n\t_sortItems();\n\tM5ez::_redraw = true;\n\treturn true;\n}\n\nbool ezMenu::deleteItem(int16_t index) {\n\tif (index < 1 || index > _items.size()) return false;\n\tindex--;\t// internally we work with zero-referenced items\n\t_items.erase(_items.begin() + index);\n\tif (_selected >= _items.size()) _selected = _items.size() - 1;\n\t_fixOffset();\n\tM5ez::_redraw = true;\n\treturn true;\n}\n\nbool ezMenu::deleteItem(String name) { return deleteItem(getItemNum(name)); }\n\nString ezMenu::getTitle() { return _header; }\n\nbool ezMenu::setCaption(int16_t index, String caption) {\n\tif (index < 1 || index > _items.size()) return false;\n\tindex--;\t// internally we work with zero-referenced items\n\tString currentName = ez.leftOf(_items[index].nameAndCaption, \"|\");\n\tString currentCaption = ez.rightOf(_items[index].nameAndCaption, \"|\");\n\t_items[index].nameAndCaption = currentName + \"|\" + caption;\n\tM5ez::_redraw = true;\n\treturn true;\n}\n\nbool ezMenu::setCaption(String name, String caption) { return setCaption(getItemNum(name), caption); }\n\nint16_t ezMenu::getItemNum(String name) {\n\tString itemName;\n\tfor (int16_t n = 0; n < _items.size(); n++) {\n\t\titemName = ez.leftOf(_items[n].nameAndCaption, \"|\");\n\t\tif (itemName == name) return n + 1;\n\t}\n\treturn 0;\n}\n\nvoid ezMenu::setSortFunction(bool (*sortFunction)(const char* s1, const char* s2)) {\n\t_sortFunction = sortFunction;\n\t_sortItems();\t// In case the menu is already populated\n}\n\nvoid ezMenu::buttons(String bttns) {\n\t_buttons = bttns;\n}\t\n\nvoid ezMenu::upOnFirst(String nameAndCaption) {\n\t_up_on_first = nameAndCaption;\n}\n\nvoid ezMenu::leftOnFirst(String nameAndCaption) {\n\t_up_on_first = nameAndCaption;\n}\n\nvoid ezMenu::downOnLast(String nameAndCaption) {\n\t_down_on_last = nameAndCaption;\n}\n\nvoid ezMenu::rightOnLast(String nameAndCaption) {\n\t_down_on_last = nameAndCaption;\n}\n\nvoid ezMenu::run() {\n\twhile (runOnce()) {}\n}\n\nint16_t ezMenu::runOnce() {\n\tint16_t result;\n\tM5ez::_currentMenu = this;\n\tif(_items.size() == 0) return 0;\n\tif (_selected == -1) _selected = 0;\n\tif (!_font)\t_font = ez.theme->menu_big_font;\t// Cannot be in constructor: ez.theme not there yet\n\tfor (int16_t n = 0; n < _items.size(); n++) {\n\t\tif (_items[n].image != NULL || _items[n].fs != NULL) {\n\t\t\tresult = _runImagesOnce();\n\t\t\tif(0 == result) M5ez::_currentMenu = nullptr;\n\t\t\treturn result;\n\t\t}\n\t}\n\tresult = _runTextOnce();\n\tif(0 == result) M5ez::_currentMenu = nullptr;\n\treturn result;\n}\n\nint16_t ezMenu::_runTextOnce() {\n\tif (_buttons == \"\") _buttons = \"up # select # down\";\n\tez.screen.clear();\n\tif (_header != \"\") ez.header.show(_header);\n\tez.setFont(_font);\n\t_per_item_h = ez.fontHeight();\n\tez.buttons.show(_buttons); \t//we need to draw the buttons here to make sure ez.canvas.height() is correct\n\t_items_per_screen = (ez.canvas.height() - 5) / _per_item_h;\n\t_drawItems();\n\twhile (true) {\n\t\tint16_t old_selected = _selected;\n\t\tint16_t old_offset = _offset;\n\t\tString tmp_buttons = _buttons;\n\t\tif (_selected <= 0) tmp_buttons.replace(\"up\", _up_on_first); \n\t\tif (_selected >= _items.size() - 1) tmp_buttons.replace(\"down\", _down_on_last); \n\t\tez.buttons.show(tmp_buttons);\n\t\tString name = ez.leftOf(_items[_selected].nameAndCaption, \"|\");\n\t\tString pressed;\n\t\twhile (true) {\n\t\t\tpressed = ez.buttons.poll();\n\t\t\tif (M5ez::_redraw) _drawItems();\n\t\t\tif (pressed != \"\") break;\n\t\t}\n\t\tif (pressed == \"up\") {\n\t\t\t_selected--;\n\t\t\t_fixOffset();\n\t\t} else if (pressed == \"down\") {\n\t\t\t_selected++;\n\t\t\t_fixOffset();\n\t\t} else if (pressed == \"first\") {\n\t\t\t_selected = 0;\n\t\t\t_offset = 0;\n\t\t} else if (pressed == \"last\") {\n\t\t\t_selected = _items.size() - 1;\n\t\t\t_offset = 0;\n\t\t\t_fixOffset();\n\t\t} else if ( (ez.isBackExitOrDone(name) && !_items[_selected].advancedFunction) || ez.isBackExitOrDone(pressed) ) {\n\t\t\t_pick_button = pressed;\n\t\t\t_selected = -1;\n\t\t\tez.screen.clear();\n\t\t\treturn 0;\n\t\t} else {\n\t\t\t// Some other key must have been pressed. We're done here!\n\t\t\tez.screen.clear();\n\t\t\t_pick_button = pressed;\n\t\t\tif (_items[_selected].simpleFunction) {\n\t\t\t\t(_items[_selected].simpleFunction)();\n\t\t\t}\n\t\t\tif (_items[_selected].advancedFunction) {\n\t\t\t\tif (!(_items[_selected].advancedFunction)(this)) return 0;\n\t\t\t}\n\t\t\treturn _selected + 1; \t// We return items starting at one, but work starting at zero internally\n\t\t}\n\n\t\t// Flicker prevention, only redraw whole menu if scrolled\n\t\tif (_offset == old_offset) {\n\t\t\tint16_t top_item_h = ez.canvas.top() + (ez.canvas.height() % _per_item_h) / 2;   // remainder of screen left over by last item not fitting split to center menu\n\t\t\tif (_items[old_selected].drawFunction) {\n\t\t\t\tez.setFont(_font);\n\t\t\t\t(_items[old_selected].drawFunction)(this, ez.theme->menu_lmargin, top_item_h + (old_selected - _offset) * _per_item_h, TFT_W - ez.theme->menu_lmargin - ez.theme->menu_rmargin, _per_item_h);\n\t\t\t} else {\n\t\t\t\t_drawItem(old_selected - _offset, ez.rightOf(_items[old_selected].nameAndCaption, \"|\"), false);\n\t\t\t};\n\t\t\tif (_items[_selected].drawFunction) {\n\t\t\t\tez.setFont(_font);\n\t\t\t\t(_items[_selected].drawFunction)(this, ez.theme->menu_lmargin, top_item_h + (_selected - _offset) * _per_item_h, TFT_W - ez.theme->menu_lmargin - ez.theme->menu_rmargin, _per_item_h);\n\t\t\t} else {\n\t\t\t\t_drawItem(_selected - _offset, ez.rightOf(_items[_selected].nameAndCaption, \"|\"), true);\n\t\t\t};\n\t\t} else {\n\t\t\tez.canvas.clear();\n\t\t\t_drawItems();\n\t\t}\n\t}\t\t\t\n}\n\nvoid ezMenu::_drawItems() {\n\tfor (int16_t n = 0; n < _items_per_screen; n++) {\n\t\tint16_t item_ref = _offset + n;\n\t\tif (item_ref < _items.size()) {\n\t\t\tif (_items[item_ref].drawFunction) {\n\t\t\t\tint16_t top_item_h = ez.canvas.top() + (ez.canvas.height() % _per_item_h) / 2;   // remainder of screen left over by last item not fitting split to center menu\n\t\t\t\tez.setFont(_font);\n\t\t\t\t(_items[item_ref].drawFunction)(this, ez.theme->menu_lmargin, top_item_h + n * _per_item_h, TFT_W - ez.theme->menu_lmargin - ez.theme->menu_rmargin, _per_item_h);\n\t\t\t} else {\n\t\t\t\t_drawItem(n, ez.rightOf(_items[item_ref].nameAndCaption, \"|\"), (item_ref == _selected));\n\t\t\t}\n\t\t}\n\t}\n\t_Arrows();\n\tM5ez::_redraw = false;\n}\n\nvoid ezMenu::_drawItem(int16_t n, String text, bool selected) {\n\tuint16_t fill_color;\n\tez.setFont(_font);\n\tint16_t top_item_h = ez.canvas.top() + (ez.canvas.height() % _per_item_h) / 2;   // remainder of screen left over by last item not fitting split to center menu\n\tm5.lcd.setTextDatum(CL_DATUM);\n\tif (selected) {\n\t\tfill_color = ez.theme->menu_sel_bgcolor;\n\t\tm5.lcd.setTextColor(ez.theme->menu_sel_fgcolor);\n\t} else {\n\t\tfill_color = ez.screen.background();\n\t\tm5.lcd.setTextColor(ez.theme->menu_item_color);\n\t}\n\ttext = ez.clipString(text, TFT_W - ez.theme->menu_lmargin - 2 * ez.theme->menu_item_hmargin - ez.theme->menu_rmargin);\n\tm5.lcd.fillRoundRect(ez.theme->menu_lmargin, top_item_h + n * _per_item_h, TFT_W - ez.theme->menu_lmargin - ez.theme->menu_rmargin, _per_item_h, ez.theme->menu_item_radius, fill_color);\n\tm5.lcd.drawString(ez.leftOf(text, \"\\t\"), ez.theme->menu_lmargin + ez.theme->menu_item_hmargin, top_item_h + _per_item_h / 2 + n * _per_item_h - 2);\n\tif (text.indexOf(\"\\t\") != -1) {\n\t\tm5.lcd.setTextDatum(CR_DATUM);\n\t\tm5.lcd.drawString(ez.rightOf(text, \"\\t\"),  TFT_W - ez.theme->menu_rmargin - ez.theme->menu_item_hmargin, top_item_h + _per_item_h / 2 + n * _per_item_h - 2);\n\t}\n}\n\nvoid ezMenu::imgBackground(uint16_t color) {\n\t_img_background = color;\n}\n\nvoid ezMenu::imgFromTop(int16_t offset) { _img_from_top = offset; }\n\nvoid ezMenu::imgCaptionFont(const GFXfont* font) { _img_caption_font = font; }\n\nvoid ezMenu::imgCaptionLocation(uint8_t datum) { _img_caption_location = datum; }\n\nvoid ezMenu::imgCaptionColor(uint16_t color) { _img_caption_color = color; }\n\nvoid ezMenu::imgCaptionMargins(int16_t hmargin, int16_t vmargin) {\n\t_img_caption_hmargin = hmargin;\n\t_img_caption_vmargin = vmargin;\n}\n\nvoid ezMenu::imgCaptionMargins(int16_t margin) {\n\t_img_caption_hmargin = margin;\n\t_img_caption_vmargin = margin;\n}\n\nint16_t ezMenu::_runImagesOnce() {\n\tif (_buttons == \"\") _buttons = \"left # select # right\";\n\tif (_img_background == NO_COLOR) _img_background = ez.theme->background;\n\tez.screen.clear(_img_background);\n\tString tmp_buttons = _buttons;\n\ttmp_buttons.replace(\"left\", \"\"); \n\ttmp_buttons.replace(\"right\", \"\");\n\tez.buttons.show(tmp_buttons);\n\tez.screen.clear(_img_background);\n\tif (_header != \"\") ez.header.show(_header);\n\t_drawImage(_items[_selected]);\n\t_drawCaption();\t\n\twhile (true) {\n\t\ttmp_buttons = _buttons;\n\t\tif (_selected <= 0) tmp_buttons.replace(\"left\", \"\"); \n\t\tif (_selected >= _items.size() - 1) tmp_buttons.replace(\"right\", \"\"); \n\t\tez.buttons.show(tmp_buttons);\n\t\tString name = ez.leftOf(_items[_selected].nameAndCaption, \"|\");\n\t\tString pressed;\n\t\twhile (true) {\n\t\t\tpressed = ez.buttons.poll();\n\t\t\tif (pressed != \"\") break;\n\t\t}\n\t\tif (pressed == \"left\") {\n\t\t\t_selected--;\n\t\t\tez.canvas.clear();\n\t\t\t_drawImage(_items[_selected]);\n\t\t\t_drawCaption();\n\t\t} else if (pressed == \"right\") {\n\t\t\t_selected++;\n\t\t\tez.canvas.clear();\n\t\t\t_drawImage(_items[_selected]);\n\t\t\t_drawCaption();\n\t\t} else if ( (ez.isBackExitOrDone(name) && !_items[_selected].advancedFunction) || ez.isBackExitOrDone(pressed) ) {\n\t\t\t_pick_button = pressed;\n\t\t\t_selected = -1;\n\t\t\tez.screen.clear();\n\t\t\treturn 0;\n\t\t} else {\n\t\t\t// Some other key must have been pressed. We're done here!\n\t\t\tez.screen.clear();\n\t\t\t_pick_button = pressed;\n\t\t\tif (_items[_selected].simpleFunction != NULL) {\n\t\t\t\t(_items[_selected].simpleFunction)();\n\t\t\t\tez.screen.clear();\n\t\t\t}\n\t\t\tif (_items[_selected].advancedFunction != NULL) {\n\t\t\t\tif (!(_items[_selected].advancedFunction)(this)) {\n\t\t\t\t\tez.screen.clear();\n\t\t\t\t\treturn 0;\n\t\t\t\t} else {\n\t\t\t\t\tez.screen.clear();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn _selected + 1; \t// We return items starting at one, but work starting at zero internally\n\t\t}\n\t}\t\t\t\n}\n\nvoid ezMenu::_drawImage(MenuItem_t &item) {\n\tif (item.image) {\n\t\tm5.lcd.drawJpg((uint8_t *)item.image, (sizeof(item.image) / sizeof(item.image[0])), 0, ez.canvas.top() + _img_from_top, TFT_W, ez.canvas.height() - _img_from_top);\n\t}\n\tif (item.fs) {\n\t\tm5.lcd.drawJpgFile(*(item.fs), item.path.c_str(), 0, ez.canvas.top() + _img_from_top, TFT_W, ez.canvas.height() - _img_from_top);\n\t}\n}\n\nvoid ezMenu::_drawCaption() {\n\tint16_t x, y;\n\tString caption = ez.rightOf(_items[_selected].nameAndCaption, \"|\");\n\tif (_img_caption_font == NULL || caption == \"\") return;\n\tez.setFont(_img_caption_font);\n\tm5.lcd.setTextColor(_img_caption_color);\n\tm5.lcd.setTextDatum(_img_caption_location);\n\t// Set X and Y for printing caption seperately, less code duplication\n\tswitch(_img_caption_location) {\n\t\tcase TL_DATUM:\n\t\tcase ML_DATUM:\n\t\tcase BL_DATUM:\n\t\t\tx = ez.canvas.left() + _img_caption_hmargin;\n\t\t\tbreak;\n\t\tcase TC_DATUM:\n\t\tcase MC_DATUM:\n\t\tcase BC_DATUM:\n\t\t\tx = ez.canvas.left() + ez.canvas.width() / 2;\n\t\t\tbreak;\n\t\tcase TR_DATUM:\n\t\tcase MR_DATUM:\n\t\tcase BR_DATUM:\n\t\tdefault:\n\t\t\tx = ez.canvas.right() - _img_caption_hmargin;\n\t\t\tbreak;\n\t\t\treturn;\n\t\t//\n\t}\n\tswitch(_img_caption_location) {\n\t\tcase TL_DATUM:\n\t\tcase TC_DATUM:\n\t\tcase TR_DATUM:\n\t\t\ty = ez.canvas.top() + _img_caption_vmargin;\n\t\t\tbreak;\n\t\tcase ML_DATUM:\n\t\tcase MC_DATUM:\n\t\tcase MR_DATUM:\n\t\t\ty = ez.canvas.top() + ez.canvas.height() / 2;\n\t\t\tbreak;\n\t\tcase BL_DATUM:\n\t\tcase BC_DATUM:\n\t\tcase BR_DATUM:\n\t\tdefault:\n\t\t\ty = ez.canvas.bottom() - _img_caption_vmargin;\n\t\t\tbreak;\n\t\t//\n\t}\n\tm5.lcd.drawString(caption, x, y);\n}\n\nvoid ezMenu::_fixOffset() {\n\tif (_selected != -1) {\n\n\t\tif (_selected >= _offset + _items_per_screen) _offset = _selected - _items_per_screen + 1;\n\t\tif (_selected < _offset) _offset = _selected;\n\n\t\t// If there's stuff above the current screen and screen is not full (can only happen after deleteItem)\n\t\tif (_offset > 0 && _offset + _items_per_screen > _items.size()) {\n\t\t\t_offset = _items.size() - _items_per_screen;\n\t\t}\n\n\t} else {\n\t\t_offset = 0;\n\t}\n}\n\nint16_t ezMenu::pick() { return _selected + 1; }\n\nString ezMenu::pickName() { return ez.leftOf(_items[_selected].nameAndCaption, \"|\"); }\n\nString ezMenu::pickCaption() { return ez.rightOf(_items[_selected].nameAndCaption, \"|\"); }\n\nString ezMenu::pickButton() { return _pick_button; }\n\nvoid ezMenu::_Arrows() {\n\tuint16_t fill_color;\n\n\tint16_t top = ez.canvas.top();\n\tint16_t height = ez.canvas.height();\n\n\t// Up arrow\n\tif (_offset > 0) {\n\t\tfill_color = ez.theme->menu_item_color;\n\t} else {\n\t\tfill_color = ez.screen.background();\n\t}\n\tstatic uint8_t l = ez.theme->menu_arrows_lmargin;\n\tm5.lcd.fillTriangle(l, top + 25, l + 10, top + 25, l + 5, top + 10, fill_color);\n\n\t// Down arrow\n\tif (_items.size() > _offset + _items_per_screen) {\n\t\tfill_color = ez.theme->menu_item_color;\n\t} else {\n\t\tfill_color = ez.screen.background();\n\t}\n\tm5.lcd.fillTriangle(l, top + height - 25, l + 10, top + height - 25, l + 5, top + height - 10, fill_color);\t\t\n}\n\nbool ezMenu::_sortWrapper(MenuItem_t& item1, MenuItem_t& item2) {\n\t// Be sure to set _sortFunction before calling _sortWrapper(), as _sortItems ensures.\n\treturn _sortFunction(item1.nameAndCaption.c_str(), item2.nameAndCaption.c_str());\n}\n\nvoid ezMenu::_sortItems() {\n\tif(_sortFunction && _items.size() > 1) {\n\t\tusing namespace std::placeholders;\t// For _1, _2\n\t\tsort(_items.begin(), _items.end(), std::bind(&ezMenu::_sortWrapper, this, _1, _2));\n\t\tM5ez::_redraw = true;\n\t}\n}\n\n// For sorting by Names as quickly as possible\nbool ezMenu::sort_asc_name_cs (const char* s1, const char* s2) { return 0 >     strcmp(s1, s2); }\nbool ezMenu::sort_asc_name_ci (const char* s1, const char* s2) { return 0 > strcasecmp(s1, s2); }\nbool ezMenu::sort_dsc_name_cs (const char* s1, const char* s2) { return 0 <     strcmp(s1, s2); }\nbool ezMenu::sort_dsc_name_ci (const char* s1, const char* s2) { return 0 < strcasecmp(s1, s2); }\n\n// For sorting by Caption if there is one, falling back to sorting by Name if no Caption is provided (all purpose)\nconst char* captionSortHelper(const char* nameAndCaption) {\n\tchar* sub = strchr(nameAndCaption, '|');\t// Find the separator\n\tif(nullptr == sub) return nameAndCaption;\t// If none, return the entire string\n\tsub++;                          \t\t\t// move past the separator\n\twhile(isspace(sub[0])) sub++;\t\t\t\t// trim whitespace\n\treturn sub;\n}\nbool ezMenu::sort_asc_caption_cs (const char* s1, const char* s2) { return 0 >     strcmp(captionSortHelper(s1), captionSortHelper(s2)); }\nbool ezMenu::sort_asc_caption_ci (const char* s1, const char* s2) { return 0 > strcasecmp(captionSortHelper(s1), captionSortHelper(s2)); }\nbool ezMenu::sort_dsc_caption_cs (const char* s1, const char* s2) { return 0 <     strcmp(captionSortHelper(s1), captionSortHelper(s2)); }\nbool ezMenu::sort_dsc_caption_ci (const char* s1, const char* s2) { return 0 < strcasecmp(captionSortHelper(s1), captionSortHelper(s2)); }\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   P R O G R E S S B A R\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nezProgressBar::ezProgressBar(String header /* = \"\" */, String msg /* = \"\" */, String buttons /* = \"\" */, const GFXfont* font /* = NULL */, uint16_t color /* = NO_COLOR */, uint16_t bar_color /* = NO_COLOR */, bool show_val /* = false */, uint16_t val_color /* = NO_COLOR */) {\n\tif (!font) font = ez.theme->msg_font;\n\tif (color == NO_COLOR) color = ez.theme->msg_color;\n\tif (bar_color == NO_COLOR) bar_color = ez.theme->progressbar_color;\n\tif (val_color == NO_COLOR) val_color = ez.theme->progressbar_val_color;\n\t_bar_color = bar_color;\n\t_show_val = show_val;\n\t_val_color = val_color;\n\t_old_val = -1;\n\tez.screen.clear();\n\tif (header != \"\") ez.header.show(header);\n\tez.buttons.show(buttons);\n\tstd::vector<line_t> lines;\n\tmsg.replace(\"|\", (String)char(13));\t\n\tm5.lcd.setTextDatum(CC_DATUM);\n\tm5.lcd.setTextColor(color);\n\tez.setFont(font);\n\tez._fitLines(msg, ez.canvas.width() - 2 * ez.theme->msg_hmargin, ez.canvas.width() / 3, lines);\n\tuint8_t font_h = ez.fontHeight();\n\tuint8_t num_lines = lines.size() + 2;\n\tfor (uint8_t n = 0; n < lines.size(); n++) {\n\t\tint16_t y = ez.canvas.top() + ez.canvas.height() / 2 - ( (num_lines - 1) * font_h / 2) + n * font_h;\n\t\tm5.lcd.drawString(lines[n].line, TFT_W / 2, y);\n\t}\n\t_bar_y = ez.canvas.top() + ez.canvas.height() / 2 + ( (num_lines - 1) * font_h / 2) - ez.theme->progressbar_width / 2;\n\tfor (uint8_t n = 0; n < ez.theme->progressbar_line_width; n++) {\n\t\tm5.lcd.drawRect(ez.canvas.left() + ez.theme->msg_hmargin + n, _bar_y + n, ez.canvas.width() - 2 * ez.theme->msg_hmargin - 2 * n, ez.theme->progressbar_width - 2 * n, bar_color);\n\t}\n}\n\nvoid ezProgressBar::value(float val) {\n\t// Prevent flickering\n\tif (_old_val == val) {\n\t\treturn;\n\t}\n\t_old_val = val;\n\n\tuint16_t left = ez.canvas.left() + ez.theme->msg_hmargin + ez.theme->progressbar_line_width;\n\tuint16_t width = (int16_t)(ez.canvas.width() - 2 * ez.theme->msg_hmargin - 2 * ez.theme->progressbar_line_width);\n\tm5.lcd.fillRect(left, _bar_y + ez.theme->progressbar_line_width, width * val / 100, ez.theme->progressbar_width - 2 * ez.theme->progressbar_line_width, _bar_color);\n\tm5.lcd.fillRect(left + (width * val / 100), _bar_y + ez.theme->progressbar_line_width, width - (width * val / 100), ez.theme->progressbar_width - 2 * ez.theme->progressbar_line_width, ez.screen.background());\n\n\tif (_show_val == true) {\n\t\tm5.lcd.setTextDatum(CC_DATUM);\n\t\tm5.lcd.setTextColor(_val_color);\n\t\tez.setFont(ez.theme->msg_font);\n\t\tm5.lcd.drawFloat(val, 0, TFT_W / 2, _bar_y + ez.theme->progressbar_width / 2 - 1);\n\t}\n}\n\n\n\nM5ez ez;\n"
  },
  {
    "path": "src/M5ez.h",
    "content": "#ifndef _M5EZ_H_\n#define _M5EZ_H_\n\n#define M5EZ_VERSION\t\t\"2.3.0\"\n\n\n// Comment out the line below to disable WPS.\n#define M5EZ_WPS\n\n// Turn this off to compile without WiFi (no) OTA updates, no clock)\n#define M5EZ_WIFI\n\n// Turn this off if you don't have a battery attached\n#define M5EZ_BATTERY\n\n// Turn this off to compile without BLE (Bluetooth Low Energy)\n// #define M5EZ_BLE\n#ifdef M5EZ_BLE\n\t#define M5EZ_BLE_DEVICE_NAME \"M5ez\"\n#endif\n\n// Have the autoconnect logic print debug messages on the serial port\n// #define M5EZ_WIFI_DEBUG\n\n// Determines whether the backlight is settable\n#define M5EZ_BACKLIGHT\n\n// Compile in ezTime and create a settings menu for clock display\n#define M5EZ_CLOCK\n\n// FACES settings menu\n#define M5EZ_FACES\n\n#include <vector>\t\t\t// std::vector\n#ifdef M5EZ_WIFI\n\t#include <WiFi.h>\t\t\t// WiFiEvent_t, system_event_info_t\n#endif\n#include <M5Stack.h>\t\t// GFXfont*\n#ifdef M5EZ_CLOCK\n\t#include <ezTime.h>\t\t\t// events, on-screen clock\n#endif\n// Special fake font pointers to access the older non FreeFonts in a unified way.\n// Only valid if passed to ez.setFont\n// (Note that these need to be specified without the & in front, unlike the FreeFonts)\n#define mono6x8\t\t\t\t(GFXfont*) 1\n#define sans16\t\t\t\t(GFXfont*) 2\n#define sans26\t\t\t\t(GFXfont*) 4\n#define numonly48\t\t\t(GFXfont*) 6\n#define numonly7seg48\t\t(GFXfont*) 7\n#define numonly75\t\t\t(GFXfont*) 8\n// The following fonts are just scaled up from previous ones (textSize 2)\n// But they might still be useful.\n#define mono12x16\t\t\t(GFXfont*) 9\n#define sans32\t\t\t\t(GFXfont*) 10\n#define sans52\t\t\t\t(GFXfont*) 12\n#define numonly96\t\t\t(GFXfont*) 14\n#define numonly7seg96\t\t(GFXfont*) 15\n#define numonly150\t\t\t(GFXfont*) 16\n\n#define NO_COLOR\t\t\tTFT_TRANSPARENT\n\n#define TFT_W\t\t320\n#define TFT_H\t\t240\n\nstruct line_t {\n\tint16_t position;\n\tString line;\n};\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   T H E M E\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nclass ezTheme {\n\tpublic:\n\t\tstatic void begin();\n\t\tvoid add();\n\t\tstatic bool select(String name);\n\t\tstatic void menu();\n\n\t\tString name = \"Default\";\t\t\t\t\t\t\t\t// Change this when making theme\n\t\tuint16_t background = 0xEF7D;\n\t\tuint16_t foreground = TFT_BLACK;\n\t\tuint8_t header_height = 23;\n\t\tconst GFXfont* header_font = &FreeSansBold9pt7b;\n\t\tuint8_t header_hmargin = 5;\n\t\tuint8_t header_tmargin = 3;\n\t\tuint16_t header_bgcolor = TFT_BLUE;\n\t\tuint16_t header_fgcolor = TFT_WHITE;\t\t\t\t\t\n\n\t\tconst GFXfont* print_font = mono6x8;\t\t\t\t\t\n\t\tuint16_t print_color = foreground;\t\t\t\t\t\n\t\t\n\t\tconst GFXfont* clock_font = mono12x16;\n\n\t\tuint16_t longpress_time = 250;\t\t\t\t\t\t\t//milliseconds\n\n\t\tuint8_t button_height = 19;\t\t\t\t\t\t\t\t\n\t\tconst GFXfont* button_font = &FreeSans9pt7b;\t\t\t\n\t\tuint8_t button_tmargin = 1;\t\t\t\t\t\t\t\t\n\t\tuint8_t button_hmargin = 5;\t\t\t\t\t\t\t\t\n\t\tuint8_t button_gap = 3;\t\t\t\t\t\t\t\t\t\n\t\tuint8_t button_radius = 8;\t\t\t\t\t\t\t\t\n\t\tuint16_t button_bgcolor_b = TFT_BLUE;\t\t\t\t\t\n\t\tuint16_t button_bgcolor_t = TFT_PURPLE;\t\t\t\t\t\n\t\tuint16_t button_fgcolor = TFT_WHITE;\t\t\t\t\t\n\t\tuint16_t button_longcolor = TFT_CYAN;\t\t\t\t\t\n\n\t\tuint8_t input_top = 50;\t\t\t\t\t\t\t\t\t// pixels below ez.canvas.top()\n\t\tuint8_t input_hmargin = 10;\t\t\t\t\t\t\t\t// The distance between text box and edge of screen\n\t\tuint8_t input_vmargin = 10;\t\t\t\t\t\t\t\t// Vertical margin _inside_ the text box\n\t\tconst GFXfont* input_font = &FreeMonoBold12pt7b;\t\t\n\t\tconst GFXfont* input_keylock_font = &FreeSansBold9pt7b;\n\t\tuint16_t input_bgcolor = TFT_BLACK;\t\t\t\t\t\t\n\t\tuint16_t input_fgcolor = TFT_GREEN;\t\t\t\t\t\t\n\t\tuint16_t input_cursor_blink = 500;\t\t\t\t\t\t// milliseconds\n\t\tuint8_t input_faces_btns = 18;\t\t\t\t\t\t\t\n\n\t\tconst GFXfont* tb_font = &FreeSans9pt7b;\t\t\t\t\n\t\tuint16_t tb_color = foreground;\t\t\t\t\t\t\t\n\t\tuint8_t tb_hmargin = 5;\n\n\t\tuint8_t menu_lmargin = 20;\t\t\t\t\t\t\t\t\n\t\tuint8_t menu_rmargin = 10;\n\t\tuint8_t menu_arrows_lmargin = 5;\t\t\t\t\t\t\t\n\t\tuint16_t menu_item_color = foreground;\t\t\t\t\t\n\t\tuint16_t menu_sel_bgcolor = foreground;\t\t\t\t\t\n\t\tuint16_t menu_sel_fgcolor = background;\t\t\t\t\t\n\t\tconst GFXfont* menu_big_font = &FreeSans12pt7b;\t\t\t\n\t\tconst GFXfont* menu_small_font = &FreeSans9pt7b;\t\t\n\t\tuint8_t menu_item_hmargin = 10;\t\t\t\t\t\t\t\n\t\tuint8_t menu_item_radius = 8;\n\n\t\tconst GFXfont* msg_font = &FreeSans12pt7b;\t\t\t\t\n\t\tuint16_t msg_color = foreground;\t\t\t\t\t\t\n\t\tuint8_t msg_hmargin = 20;\t\t\t\t\t\t\t\t\n\n\t\tuint8_t progressbar_line_width = 4;\t\t\t\t\t\t\n\t\tuint8_t progressbar_width = 25;\t\t\t\t\t\t\t\n\t\tuint16_t progressbar_color = foreground;\t\t\t\t\n\t\tuint16_t progressbar_val_color = TFT_DARKGREY;\n\n\t\tuint16_t signal_interval = 2000;\t\t\t\t\t\t\n\t\tuint8_t signal_bar_width = 4;\t\t\t\t\t\t\t\n\t\tuint8_t signal_bar_gap = 2;\n\n\t\tuint8_t battery_bar_width = 26;\n\t\tuint8_t battery_bar_gap = 2;\n\t\tuint32_t battery_0_fgcolor = TFT_RED; \n\t\tuint32_t battery_25_fgcolor = TFT_ORANGE;\n\t\tuint32_t battery_50_fgcolor = TFT_YELLOW;\n\t\tuint32_t battery_75_fgcolor = TFT_GREENYELLOW;\n\t\tuint32_t battery_100_fgcolor = TFT_GREEN;\n\t//\t\t\t\t\t\t\n};\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   S C R E E N\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nclass ezScreen {\n\tpublic:\n\t\tstatic void begin();\n\t\tstatic void clear();\n\t\tstatic void clear(uint16_t color);\n\t\tstatic uint16_t background();\n\tprivate:\n\t\tstatic uint16_t _background;\n\t//\n};\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   H E A D E R\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nstruct header_widget_t {\n\tString name;\n\tbool leftover;\t\t// widget gets all leftover width. Used by title, only one widget can have this property\n\tuint16_t x;\n\tuint16_t w;\n\tvoid (*function)(uint16_t x, uint16_t w);\n};\t\n#define LEFTMOST\t\t0\n#define RIGHTMOST\t\t255\n\nclass ezHeader {\n\tprivate:\n\t\tstatic std::vector<header_widget_t> _widgets;\n\t\tstatic bool _shown;\n\t\tstatic String _title;\n\t\tstatic void _drawTitle(uint16_t x, uint16_t w);\n\t\tstatic void _recalculate();\n\tpublic:\n\t\tstatic void begin();\n\t\tstatic void show(String t = \"\");\n\t\tstatic bool shown();\n\t\tstatic void clear(bool wipe = true);\n\t\tstatic void insert(uint8_t position, String name, uint16_t width, void (*function)(uint16_t x, uint16_t w), bool leftover = false);\n\t\tstatic void remove(String name);\n\t\tstatic uint8_t position(String name);\n\t\tstatic void draw(String name = \"\");\n\t\tstatic String title();\n\t\tstatic void title(String title);\n\t//\n};\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   C A N V A S\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nstruct print_t {\n\tconst GFXfont* font;\n\tuint16_t color;\n\tuint16_t x;\n\tint16_t y;\n\tString text;\n};\t\n\nclass ezCanvas : public Print {\n\tfriend class ezHeader;\n\tfriend class ezButtons;\n\tpublic:\n\t\tstatic void begin();\n\t\tstatic void reset();\n\t\tstatic void clear();\n\t\tstatic uint8_t top();\n\t\tstatic uint8_t bottom();\n\t\tstatic uint16_t left();\n\t\tstatic uint16_t right();\n\t\tstatic uint8_t height();\n\t\tstatic uint16_t width();\n\t\tstatic bool scroll();\n\t\tstatic void scroll(bool s);\n\t\tstatic bool wrap();\n\t\tstatic void wrap(bool w);\t\t\n\t\tstatic uint16_t lmargin();\n\t\tstatic void lmargin(uint16_t newmargin);\n\t\tstatic void font(const GFXfont* font);\n\t\tstatic const GFXfont* font();\n\t\tstatic void color(uint16_t color);\n\t\tstatic uint16_t color();\n\t\tstatic void pos(uint16_t x, uint8_t y);\n\t\tstatic uint16_t x();\n\t\tstatic void x(uint16_t newx);\n\t\tstatic uint8_t y();\n\t\tstatic void y(uint8_t newy);\n\t\tvirtual size_t write(uint8_t c);\t\t\t\t\t\t// These three are used to inherint print and println from Print class\n\t\tvirtual size_t write(const char *str);\n\t\tvirtual size_t write(const uint8_t *buffer, size_t size);\n\t\tstatic uint16_t loop();\n\tprivate:\n\t\tstatic std::vector<print_t> _printed;\n\t\tstatic uint32_t _next_scroll;\n\t\tstatic void top(uint8_t newtop);\n\t\tstatic void bottom(uint8_t newbottom);\n\t\tstatic uint8_t _y, _top, _bottom;\n\t\tstatic uint16_t _x, _left, _right, _lmargin;\n\t\tstatic bool _wrap, _scroll;\n\t\tstatic const GFXfont* _font;\n\t\tstatic uint16_t _color;\n\t\tstatic void _print(String text);\n\t\tstatic void _putString(String text);\n\t//\n};\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   B U T T O N S\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nclass ezButtons {\n\tpublic:\n\t\tstatic void begin();\n\t\tstatic void show(String buttons);\n\t\tstatic void clear(bool wipe = true);\n\t\tstatic void releaseWait();\n\t\tstatic String poll();\n\t\tstatic String wait(String Buttons = \"\"); \n\tprivate:\n\t\tstatic String _btn_a_s, _btn_a_l;\n\t\tstatic String _btn_b_s, _btn_b_l;\n\t\tstatic String _btn_c_s, _btn_c_l;\n\t\tstatic String _btn_ab, _btn_bc, _btn_ac;\n\t\tstatic bool _key_release_wait;\n\t\tstatic bool _lower_button_row, _upper_button_row;\n\t\tstatic void _drawButtons(String btn_a_s, String btn_a_l, String btn_b_s, String btn_b_l, String btn_c_s, String btn_c_l, String btn_ab, String btn_bc, String btn_ac);\n\t\tstatic void _drawButton(int16_t row, String text_s, String text_l, int16_t x, int16_t w);\n\t\tstatic void _drawButtonString(String text, int16_t x, int16_t y, uint16_t color, int16_t datum);\n\t//\n};\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   M E N U\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nclass ezMenu {\n\tpublic:\n\t\tezMenu(String hdr = \"\");\n\t\t~ezMenu();\n\t\tbool addItem(String nameAndCaption, void (*simpleFunction)() = NULL, bool (*advancedFunction)(ezMenu* callingMenu) = NULL, void (*drawFunction)(ezMenu* callingMenu, int16_t x, int16_t y, int16_t w, int16_t h) = NULL);\n\t\tbool addItem(const char *image, String nameAndCaption, void (*simpleFunction)() = NULL, bool (*advancedFunction)(ezMenu* callingMenu) = NULL, void (*drawFunction)(ezMenu* callingMenu, int16_t x, int16_t y, int16_t w, int16_t h) = NULL);\n\t\tbool addItem(fs::FS &fs, String path, String nameAndCaption, void (*simpleFunction)() = NULL, bool (*advancedFunction)(ezMenu* callingMenu) = NULL, void (*drawFunction)(ezMenu* callingMenu, int16_t x, int16_t y, int16_t w, int16_t h) = NULL);\n\t\tbool deleteItem(int16_t index);\n\t\tbool deleteItem(String name);\n\t\tbool setCaption(int16_t index, String caption);\n\t\tbool setCaption(String name, String caption);\n\t\tvoid setSortFunction(bool (*sortFunction)(const char* s1, const char* s2));\n\t\tvoid buttons(String bttns);\n\t\tvoid upOnFirst(String nameAndCaption);\n\t\tvoid leftOnFirst(String nameAndCaption);\n\t\tvoid downOnLast(String nameAndCaption);\n\t\tvoid rightOnLast(String nameAndCaption);\n\t\tString getTitle();\n\t\tint16_t getItemNum(String name);\n\t\tint16_t pick();\n\t\tString pickName(), pickCaption(), pickButton();\n\t\tvoid run();\n\t\tint16_t runOnce();\n\t\tvoid txtBig();\n\t\tvoid txtSmall();\n\t\tvoid txtFont(const GFXfont* font);\n\t\tvoid imgBackground(uint16_t color);\n\t\tvoid imgFromTop(int16_t offset);\n\t\tvoid imgCaptionFont(const GFXfont* font);\t\n\t\tvoid imgCaptionLocation(uint8_t datum);\n\t\tvoid imgCaptionColor(uint16_t color);\n\t\tvoid imgCaptionMargins(int16_t hmargin, int16_t vmargin);\n\t\tvoid imgCaptionMargins(int16_t margin);\n\n\t\tstatic bool sort_asc_name_cs (const char* s1, const char* s2);\n\t\tstatic bool sort_asc_name_ci (const char* s1, const char* s2);\n\t\tstatic bool sort_dsc_name_cs (const char* s1, const char* s2);\n\t\tstatic bool sort_dsc_name_ci (const char* s1, const char* s2);\n\t\tstatic bool sort_asc_caption_cs (const char* s1, const char* s2);\n\t\tstatic bool sort_asc_caption_ci (const char* s1, const char* s2);\n\t\tstatic bool sort_dsc_caption_cs (const char* s1, const char* s2);\n\t\tstatic bool sort_dsc_caption_ci (const char* s1, const char* s2);\n\n\tprivate:\n\t\tstruct MenuItem_t {\n\t\t\tString nameAndCaption;\n\t\t\tconst char *image;\n\t\t\tfs::FS *fs;\n\t\t\tString path;\n\t\t\tvoid (*simpleFunction)();\n\t\t\tbool (*advancedFunction)(ezMenu* callingMenu);\n\t\t\tvoid (*drawFunction)(ezMenu* callingMenu, int16_t x, int16_t y, int16_t w, int16_t h);\n\t\t};\n\t\tstd::vector<MenuItem_t> _items;\n\t\tint16_t _selected, _offset;\n\t\tbool _redraw;\n\t\tString _header, _buttons, _pick_button;\n\t\tString _up_on_first, _down_on_last;\n\t\tint16_t _per_item_h, _vmargin;\n\t\tint16_t _items_per_screen;\n\t\tuint16_t _old_background;\n\t\tvoid _drawImage(MenuItem_t &item);\n\t\tvoid _drawCaption();\n\t\tconst GFXfont* _font;\n\t\tint16_t _runImagesOnce();\n\t\tint16_t _runTextOnce();\n\t\tvoid _fixOffset();\n\t\tvoid _drawItems();\n\t\tvoid _drawItem(int16_t n, String text, bool selected);\n\t\tvoid _Arrows();\n\t\tint16_t _img_from_top;\n\t\tuint8_t _img_caption_location;\n\t\tuint16_t _img_caption_color;\n\t\tuint16_t _img_background;\n\t\tconst GFXfont* _img_caption_font;\n\t\tint16_t _img_caption_hmargin, _img_caption_vmargin;\n\t\tbool (*_sortFunction)(const char* s1, const char* s2);\n\t\tvoid _sortItems();\n\t\tbool _sortWrapper(MenuItem_t& item1, MenuItem_t& item2);\n\t//\n};\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   P R O G R E S S B A R\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nclass ezProgressBar {\n\tpublic:\n\t\tezProgressBar(String header = \"\", String msg = \"\", String buttons = \"\", const GFXfont* font = NULL, uint16_t color = NO_COLOR, uint16_t bar_color = NO_COLOR, bool show_val = false, uint16_t val_color = NO_COLOR);\n\t\tvoid value(float val);\n\tprivate:\n\t\tint16_t _bar_y;\n\t\tuint16_t _bar_color;\n\t\tbool _show_val;\n\t\tuint16_t _val_color;\n\t\tfloat _old_val;\n};\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   S E T T I N G S\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nclass ezSettings {\n\tpublic:\n\t\tstatic void begin();\n\t\tstatic void menu();\n\t\tstatic void defaults();\n\t\tstatic ezMenu menuObj;\n\t//\n};\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   B A C K L I G H T\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#ifdef M5EZ_BACKLIGHT\n\t#define NEVER\t\t0\n\t#define USER_SET\t255\n\tclass ezBacklight {\n\t\tpublic:\n\t\t\tstatic void begin();\n\t\t\tstatic void menu();\n\t\t\tstatic void inactivity(uint8_t half_minutes);\n\t\t\tstatic void activity();\n\t\t\tstatic uint16_t loop();\n\t\tprivate:\n\t\t\tstatic uint8_t _brightness;\n\t\t\tstatic uint8_t _inactivity;\n\t\t\tstatic uint32_t _last_activity;\n\t\t\tstatic bool _backlight_off;\n\t\t//\n\t};\n#endif\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   C L O C K\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#ifdef M5EZ_CLOCK\n\tclass ezClock {\n\t\tpublic:\n\t\t\tstatic Timezone tz;\n\t\t\tstatic void begin();\n\t\t\tstatic void restart();\n\t\t\tstatic void menu();\n\t\t\tstatic uint16_t loop();\n\t\t\tstatic void clear();\n\t\t\tstatic void draw(uint16_t x, uint16_t w);\n\t\t\tstatic bool waitForSync(const uint16_t timeout = 0);\n\t\tprivate:\n\t\t\tstatic void _writePrefs();\n\t\t\tstatic bool _on;\n\t\t\tstatic String _timezone;\n\t\t\tstatic bool _clock12;\n\t\t\tstatic bool _am_pm;\n\t\t\tstatic String _datetime;\n\t\t\tstatic bool _starting;\n\t\t//\n\t};\n#endif\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   F A C E S\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#ifdef M5EZ_FACES\n\tclass ezFACES {\n\t\tpublic:\n\t\t\tstatic void begin();\n\t\t\tstatic void menu();\n\t\t\tstatic String poll();\n\t\t\tstatic bool on();\n\t\tprivate:\n\t\t\tstatic bool _on;\n\t\t//\n\t};\n#endif\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   W I F I\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#ifdef M5EZ_WIFI\n\n\tenum WifiState_t {\n\t\tEZWIFI_NOT_INIT,\n\t\tEZWIFI_WAITING,\n\t\tEZWIFI_IDLE,\n\t\tEZWIFI_SCANNING,\n\t\tEZWIFI_CONNECTING,\n\t\tEZWIFI_AUTOCONNECT_DISABLED\n\t};\n\n\tstruct WifiNetwork_t {\n\t\tString SSID;\n\t\tString key;\n\t};\n\n\tclass ezWifi {\n\t\tpublic:\n\t\t\tstatic std::vector<WifiNetwork_t> networks;\n\t\t\tstatic bool autoConnect;\n\t\t\tstatic void begin();\n\t\t\tstatic void add(String ssid, String key);\n\t\t\tstatic bool remove(int8_t index);\n\t\t\tstatic bool remove(String ssid);\n\t\t\tstatic int8_t indexForSSID(String ssid);\n\t\t\tstatic void readFlash();\n\t\t\tstatic void writeFlash();\n\t\t\tstatic void menu();\n\t\t\tstatic uint16_t loop();\n\t\t\tstatic bool update(String url, const char* root_cert, ezProgressBar* pb = NULL);\n\t\t\tstatic String updateError();\n\t\tprivate:\n\t\t\tstatic WifiState_t _state;\n\t\t\tstatic uint8_t _current_from_scan;\n\t\t\tstatic uint32_t _wait_until, _widget_time;\n\t\t\tstatic void _drawWidget(uint16_t x, uint16_t w);\n\t\t\tstatic bool _onOff(ezMenu* callingMenu);\n\t\t\tstatic void _manageAutoconnects();\n\t\t\tstatic bool _autoconnectSelected(ezMenu* callingMenu);\n\t\t\tstatic void _askAdd();\n\t\t\tstatic bool _connection(ezMenu* callingMenu);\n\t\t\tstatic void _update_progress(int done, int total);\n\t\t\tstatic String _update_err2str(uint8_t _error);\n\t\t\tstatic ezProgressBar* _update_progressbar;\n\t\t\tstatic String _update_error;\n\t\t\t#ifdef M5EZ_WPS\n\t\t\t\tstatic void _WPShelper(WiFiEvent_t event, system_event_info_t info);\n\t\t\t\tstatic WiFiEvent_t _WPS_event;\n\t\t\t\tstatic String _WPS_pin;\n\t\t\t\tstatic bool _WPS_new_event;\n\t\t\t#endif\n\t\t//\n\t};\n\n#endif\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   B L E\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#ifdef M5EZ_BLE\n\n\tclass ezBLE {\n\t\tpublic:\n\t\t\tstatic void begin();\n\t\t\tstatic void readFlash();\n\t\t\tstatic void writeFlash();\n\t\t\tstatic void menu();\n\t\t\tstatic void disconnect();\n\t\t\tstatic class BLEClient* getClient(uint16_t index);\n\t\t\tstatic uint16_t getClientCount();\n\t\tprivate:\n\t\t\tstatic const std::vector<std::pair<uint16_t, String>> _gattUuids;\n\t\t\tstatic bool _on;\n\t\t\tstatic bool _initialized;\n\t\t\tstatic std::vector<class BLEClient*> _clients;\n\t\t\tstatic bool _scan(ezMenu* callingMenu);\n\t\t\tstatic void _connect(class BLEAdvertisedDevice& device);\n\t\t\tstatic bool _listClients(ezMenu* callingMenu);\n\t\t\tstatic bool _showClient(class BLEClient* client);\n\t\t\tstatic void _cleanup();\n\t\t\tstatic void _refresh();\n\t\t\tfriend class M5ezClientCallback;\n\t};\n\n#endif\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   B A T T E R Y\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#ifdef M5EZ_BATTERY\n\n\tclass ezBattery {\n\t\tpublic:\n\t\t\tstatic void begin();\n\t\t\tstatic void readFlash();\n\t\t\tstatic void writeFlash();\n\t\t\tstatic void menu();\n\t\t\tstatic uint16_t loop();\n\t\t\tstatic uint8_t getTransformedBatteryLevel();\n\t\t\tstatic uint32_t getBatteryBarColor(uint8_t batteryLevel);\n\t\tprivate:\n\t\t\tstatic bool _on;\n\t\t\tstatic void _refresh();\n\t\t\tstatic void _drawWidget(uint16_t x, uint16_t w);\n\t\t\tstatic uint8_t _numChargingBars;\n\t};\n\n#endif\n\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//\n//   E Z\n//\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nstruct event_t {\n\tuint16_t (*function)();\n\tuint32_t when;\n};\nclass M5ez {\n\n\tfriend class ezProgressBar;\n\tfriend class ezHeader;\t\t// TMP?\n\tfriend class ezMenu;\t\t// For _redraw\n\n\tpublic:\n\t\tstatic std::vector<ezTheme> themes;\n\t\tstatic ezTheme* theme;\n\t\tstatic ezScreen screen;\n\t\tstatic constexpr ezScreen& s = screen;\n\t\tstatic ezHeader header;\n\t\tstatic constexpr ezHeader& h = header;\n\t\tstatic ezCanvas canvas;\n\t\tstatic constexpr ezCanvas& c = canvas;\n\t\tstatic ezButtons buttons;\n\t\tstatic constexpr ezButtons& b = buttons;\n\t\tstatic ezSettings settings;\n\t\t#ifdef M5EZ_WIFI\n\t\t\tstatic ezWifi wifi;\n\t\t\tstatic constexpr ezWifi& w = wifi;\n\t\t#endif\n\t\t#ifdef M5EZ_BLE\n\t\t\tstatic ezBLE ble;\n\t\t#endif\n\t\t#ifdef M5EZ_BATTERY\n\t\t\tstatic ezBattery battery;\n\t\t#endif\n\t\t#ifdef M5EZ_BACKLIGHT\n\t\t\tstatic ezBacklight backlight;\n\t\t#endif\n\t\t#ifdef M5EZ_CLOCK\n\t\t\tstatic ezClock clock;\n\t\t#endif\n\t\t#ifdef M5EZ_FACES\n\t\t\tstatic ezFACES faces;\n\t\t#endif\t\n\t\t\n\t\tstatic void begin();\n\n\t\tstatic void yield();\n\t\t\n\t\tstatic void addEvent(uint16_t (*function)(), uint32_t when = 1);\n\t\tstatic void removeEvent(uint16_t (*function)());\n\t\tstatic void redraw();\n\n\t\tstatic ezMenu* getCurrentMenu();\n\n\t\t// ez.msgBox\n\t\tstatic String msgBox(String header, String msg, String buttons = \"OK\", const bool blocking = true, const GFXfont* font = NULL, uint16_t color = NO_COLOR);\n\n\t\t// ez.textInput\n\t\tstatic String textInput(String header = \"\", String defaultText = \"\");\n\t\t\n\t\t//ez.textBox\n\t\tstatic String textBox(String header = \"\", String text = \"\", bool readonly = false, String buttons = \"up#Done#down\", const GFXfont* font = NULL, uint16_t color = NO_COLOR);\n\t\t\t\n\t\t// Generic String object helper functions\n\t\tstatic String rightOf(String input, String separator, bool trim = true);\n\t\tstatic String leftOf(String input, String separator, bool trim = true);\n\t\tstatic int16_t countStringInString(String haystack, String needle);\n\t\tstatic int16_t chopString(String input, String separator, std::vector<String>& chops, bool trim = true);\n\t\tstatic int16_t charsFit(String input, int16_t cutoff);\n\t\tstatic String clipString(String input, int16_t cutoff, bool dots = true);\n\t\tstatic bool isBackExitOrDone(String str);\n\t\t\n\t\t// m5.lcd wrappers that make fonts easier\n\t\tstatic void setFont(const GFXfont* font);\n\t\tstatic int16_t fontHeight();\n\t\t\n\t\tstatic String version();\n\n\tprivate:\n\t\tstatic std::vector<event_t> _events;\n\t\tstatic bool _redraw;\n\t\tstatic ezMenu* _currentMenu;\n\t\tstatic bool _in_event;\n\n\t\t// ez.textInput\n\t\tstatic int16_t _text_cursor_x, _text_cursor_y, _text_cursor_h, _text_cursor_w;\n\t\tstatic bool _text_cursor_state;\n\t\tstatic void _drawTextInputLockString(String text);\n\t\tstatic void _drawTextInputBox(String text);\n\t\tstatic void _textCursor();\n\t\tstatic void _textCursor(bool state);\n\t\tstatic long  _text_cursor_millis;\n\n\t\t// ez.textBox\n\t\tstatic void _wrapLines(String text, uint16_t width, std::vector<line_t>& lines);\n\t\tstatic void _fitLines(String text, uint16_t max_width, uint16_t min_width, std::vector<line_t>& lines);\n\t//\n};\n\nextern M5ez ez;\n\n\n#endif\t//_M5EZ_H_\n"
  },
  {
    "path": "src/themes/dark.h",
    "content": "//  This is the dark theme. See how little you need to change for a different look?\n\n{\n\tezTheme theme;\n\n\ttheme.name = \"Dark\";\t\t\t\t\t\t\t\t\t\t// Change this when making theme\n\ttheme.background = TFT_BLACK;\n\ttheme.foreground = TFT_WHITE;\n\t// theme.header_height = 23;\n\t// theme.GFXfont* header_font = &FreeSansBold9pt7b;\n\t// theme.header_hmargin = 5;\n\t// theme.header_tmargin = 3;\n\ttheme.header_bgcolor = TFT_DARKGREY;\n\ttheme.header_fgcolor = TFT_WHITE;\t\t\t\t\t\n\t// theme.GFXfont* print_font = mono6x8;\t\t\t\t\t\n\ttheme.print_color = theme.foreground;\t\t\t\t\t\n\t// theme.GFXfont* clock_font = mono12x16;\n\t// theme.longpress_time = 250;\t\t\t\t\t\t\t\t//milliseconds\n\t// theme.button_height = 19;\t\t\t\t\t\t\t\t\n\t// theme.GFXfont* button_font = &FreeSans9pt7b;\t\t\t\n\t// theme.button_tmargin = 1;\t\t\t\t\t\t\t\t\n\t// theme.button_hmargin = 5;\t\t\t\t\t\t\t\t\n\t// theme.button_gap = 3;\t\t\t\t\t\t\t\t\t\n\t// theme.button_radius = 8;\t\t\t\t\t\t\t\t\n\t// theme.button_bgcolor_b = TFT_BLUE;\t\t\t\t\t\n\t// theme.button_bgcolor_t = TFT_PURPLE;\t\t\t\t\t\n\t// theme.button_fgcolor = TFT_WHITE;\t\t\t\t\t\n\t// theme.button_longcolor = TFT_CYAN;\t\t\t\t\t\n\t// theme.input_top = 50;\t\t\t\t\t\t\t\t\t// pixels below ez.canvas.top()\n\t// theme.input_hmargin = 10;\t\t\t\t\t\t\t\t// The distance between text box and edge of screen\n\t// theme.input_vmargin = 10;\t\t\t\t\t\t\t\t// Vertical margin _inside_ the text box\n\t// theme.GFXfont* input_font = &FreeMonoBold12pt7b;\t\t\n\t// theme.GFXfont* input_keylock_font = &FreeSansBold9pt7b;\n\ttheme.input_bgcolor = TFT_DARKGREY;\n\t// theme.input_fgcolor = TFT_GREEN;\t\t\t\t\t\t\n\t// theme.input_cursor_blink = 500;\t\t\t\t\t\t\t// milliseconds\n\t// theme.input_faces_btns = 18;\t\t\t\t\t\t\t\n\t// theme.GFXfont* tb_font = &FreeSans9pt7b;\t\t\t\t\n\ttheme.tb_color = theme.foreground;\t\t\t\t\t\t\t\n\t// theme.tb_hmargin = 5;\n\t// theme.menu_lmargin = 20;\t\t\t\t\t\t\t\t\n\t// theme.menu_rmargin = 10;\n\t// theme.menu_arrows_lmargin = 5;\n\ttheme.menu_item_color = theme.foreground;\t\t\t\t\t\n\ttheme.menu_sel_bgcolor = theme.foreground;\t\t\t\t\t\n\ttheme.menu_sel_fgcolor = theme.background;\t\t\t\t\t\n\t// theme.GFXfont* menu_big_font = &FreeSans12pt7b;\t\t\t\n\t// theme.GFXfont* menu_small_font = &FreeSans9pt7b;\t\t\n\t// theme.menu_item_hmargin = 10;\t\t\t\t\t\t\t\n\t// theme.menu_item_radius = 8;\t\t\t\t\t\t\t\n\t// theme.GFXfont* msg_font = &FreeSans12pt7b;\t\t\t\t\n\ttheme.msg_color = theme.foreground;\t\t\t\t\t\t\n\t// theme.msg_hmargin = 20;\t\t\t\t\t\t\t\t\n\t// theme.progressbar_line_width = 4;\t\t\t\t\t\t\n\t// theme.progressbar_width = 25;\t\t\t\t\t\t\t\n\ttheme.progressbar_color = theme.foreground;\t\t\t\t\n\t// theme.signal_interval = 2000;\t\t\t\t\t\t\n\t// theme.signal_bar_width = 4;\t\t\t\t\t\t\t\n\t// theme.signal_bar_gap = 2;\n\t// theme.battery_bar_width = 26;\n\t// theme.battery_bar_gap = 2;\n\t// theme.battery_0_fgcolor = TFT_RED; \n\t// theme.battery_25_fgcolor = TFT_ORANGE;\n\t// theme.battery_50_fgcolor = TFT_YELLOW;\n\t// theme.battery_75_fgcolor = TFT_GREENYELLOW;\n\t// theme.battery_100_fgcolor = TFT_GREEN;\n\n\ttheme.add();\n}"
  },
  {
    "path": "src/themes/default.h",
    "content": "//  This is the default theme. The values you see are all commented out because they are the defaults so you \n//  do not need to specify them. Take a look at the dark.h theme file to see how another theme works.\n//\n//  (You only need to #include this file if you offer more than one theme and want the theme chooser in the \n//  settings to also offer the default theme. The original active theme at startup is the last one you\n//  included until the user has saved one in the settings.)\n\n{\n\tezTheme theme;\n\n\t// theme.name = \"Default\";\t\t\t\t\t\t\t\t// Change this when making theme\n\t// theme.background = 0xEF7D;\n\t// theme.foreground = TFT_BLACK;\n\t// theme.header_height = 23;\n\t// theme.GFXfont* header_font = &FreeSansBold9pt7b;\n\t// theme.header_hmargin = 5;\n\t// theme.header_tmargin = 3;\n\t// theme.header_bgcolor = TFT_BLUE;\n\t// theme.header_fgcolor = TFT_WHITE;\t\t\t\t\t\n\t// theme.GFXfont* print_font = mono6x8;\t\t\t\t\t\n\t// theme.print_color = theme.foreground;\t\t\t\t\t\n\t// theme.GFXfont* clock_font = mono12x16;\n\t// theme.longpress_time = 250;\t\t\t\t\t\t\t//milliseconds\n\t// theme.button_height = 19;\t\t\t\t\t\t\t\t\n\t// theme.GFXfont* button_font = &FreeSans9pt7b;\t\t\t\n\t// theme.button_tmargin = 1;\t\t\t\t\t\t\t\t\n\t// theme.button_hmargin = 5;\t\t\t\t\t\t\t\t\n\t// theme.button_gap = 3;\t\t\t\t\t\t\t\t\t\n\t// theme.button_radius = 8;\t\t\t\t\t\t\t\t\n\t// theme.button_bgcolor_b = TFT_BLUE;\t\t\t\t\t\n\t// theme.button_bgcolor_t = TFT_PURPLE;\t\t\t\t\t\n\t// theme.button_fgcolor = TFT_WHITE;\t\t\t\t\t\n\t// theme.button_longcolor = TFT_CYAN;\t\t\t\t\t\n\t// theme.input_top = 50;\t\t\t\t\t\t\t\t\t// pixels below ez.canvas.top()\n\t// theme.input_hmargin = 10;\t\t\t\t\t\t\t\t// The distance between text box and edge of screen\n\t// theme.input_vmargin = 10;\t\t\t\t\t\t\t\t// Vertical margin _inside_ the text box\n\t// theme.GFXfont* input_font = &FreeMonoBold12pt7b;\t\t\n\t// theme.GFXfont* input_keylock_font = &FreeSansBold9pt7b;\n\t// theme.input_bgcolor = TFT_BLACK;\t\t\t\t\t\t\n\t// theme.input_fgcolor = TFT_GREEN;\t\t\t\t\t\t\n\t// theme.input_cursor_blink = 500;\t\t\t\t\t\t// milliseconds\n\t// theme.input_faces_btns = 18;\t\t\t\t\t\t\t\n\t// theme.GFXfont* tb_font = &FreeSans9pt7b;\t\t\t\t\n\t// theme.tb_color = theme.foreground;\t\t\t\t\t\t\t\n\t// theme.tb_hmargin = 5;\n\t// theme.menu_lmargin = 20;\t\t\t\t\t\t\t\t\n\t// theme.menu_rmargin = 10;\n\t// theme.menu_arrows_lmargin = 5;\t\t\t\t\t\t\t\n\t// theme.menu_item_color = theme.foreground;\t\t\t\t\t\n\t// theme.menu_sel_bgcolor = theme.foreground;\t\t\t\t\t\n\t// theme.menu_sel_fgcolor = theme.background;\t\t\t\t\t\n\t// theme.GFXfont* menu_big_font = &FreeSans12pt7b;\t\t\t\n\t// theme.GFXfont* menu_small_font = &FreeSans9pt7b;\t\t\n\t// theme.menu_item_hmargin = 10;\t\t\t\t\t\t\t\n\t// theme.menu_item_radius = 8;\t\t\t\t\t\t\t\n\t// theme.GFXfont* msg_font = &FreeSans12pt7b;\t\t\t\t\n\t// theme.msg_color = theme.foreground;\t\t\t\t\t\t\n\t// theme.msg_hmargin = 20;\t\t\t\t\t\t\t\t\n\t// theme.progressbar_line_width = 4;\t\t\t\t\t\t\n\t// theme.progressbar_width = 25;\t\t\t\t\t\t\t\n\t// theme.progressbar_color = theme.foreground;\t\t\t\t\n\t// theme.signal_interval = 2000;\t\t\t\t\t\t\n\t// theme.signal_bar_width = 4;\t\t\t\t\t\t\t\n\t// theme.signal_bar_gap = 2;\n\t// theme.battery_bar_width = 26;\n\t// theme.battery_bar_gap = 2;\n\t// theme.battery_0_fgcolor = TFT_RED; \n\t// theme.battery_25_fgcolor = TFT_ORANGE;\n\t// theme.battery_50_fgcolor = TFT_YELLOW;\n\t// theme.battery_75_fgcolor = TFT_GREENYELLOW;\n\t// theme.battery_100_fgcolor = TFT_GREEN;\n\n\ttheme.add();\n}"
  },
  {
    "path": "tech_notes/converting_from_M5ez_1.x.md",
    "content": "## Converting from M5ez 1.x \n\nThis section deals with conversion of code that was written for the 1.x versions of M5ez. Since it's now 2020 and the last 1.x was released in September of 2018, this section has been moved from the user manual to a tech note. This document is of no use if you've never used M5ez 1.x.\n\n### What's new in M5ez 2.x ?\n\n> *Kept here just to show what wasn't there in 1.x*\n\n* Many user-selectable settings, including backlight, clock/timezone, FACES keyboard, etc.\n* Theme values can be changed at runtime, multiple thmes can be loaded; a theme chooser then shows up in the settings\n* Header can have user-defined widgets (internally used for clock and wifi signal display)\n* The canvas now inherits from the Print class, so everything print and println could do, you can now also do on the canvas.\n* The canvas scrolls (if you want it to)\n* you can create your own events that get ran in the M5ez button wait loops\n* Many bugs got fixed\n* Code is a lot cleaner now, easier to add things without the sometimes ad-hoc and organically grown constructs of M5ez 1.x\n\nHowever, all of this comes with some changes to the names of common functions in M5ez. Generally things are more consistent now, but that does mean they are different: your M5ez 1.x code will not run without modifications. I am not planning an M5ez 3.0 at this time, so expect no further modifications to be needed to existing code for a while.\n\n### Converting code from M5ez 1.x to 2.x\n\nTo convert code form 1.x to 2.x, first remove the `m5.begin()` at the start of your code, and replace it by `ez.begin()`. Then it is recommended you replace the following functions:\n\n| M5ez 1.x |    | M5ez 2.x |\n|:---------|:--:|:---------|\n| `ez.clearScreen()` | **&mdash;>** | `ez.screen.clear()`\n| `ez.background()` | **&mdash;>** | `ez.screen.background()`\n| `ez.drawHeader(` | **&mdash;>** | `ez.header.show(`\n| `ez.removeHeader()` | **&mdash;>** | `ez.header.hide()`\n| `ez.clearCanvas()` | **&mdash;>** | `ez.canvas.clear()`\n| `ez.canvasTop()` | **&mdash;>** | `ez.canvas.top()`\n| `ez.canvasBottom()` | **&mdash;>** | `ez.canvas.bottom()`\n| `ez.canvasLeft()` | **&mdash;>** | `ez.canvas.left()`\n| `ez.canvasRight()` | **&mdash;>** | `ez.canvas.right()`\n| `ez.canvasWidth()` | **&mdash;>** | `ez.canvas.width()`\n| `ez.canvasHeight()` | **&mdash;>** | `ez.canvas.height()`\n| `ez.print(` | **&mdash;>** | `ez.canvas.print(`\n| `ez.println(` | **&mdash;>** | `ez.canvas.println(`\n| `ez.drawButtons(` | **&mdash;>** | `ez.buttons.show(`\n| `ez.getButtons(` | **&mdash;>** | `ez.buttons.poll(`\n| `ez.waitForButtons(` | **&mdash;>** | `ez.buttons.wait(`\n\nThen, check all your print functions: they no longer support the setting of font, location or color in the statement itself: these need to be done with `ez.canvas.font`, `ez.canvas.color` etc. (Print is much nicer now because the canvas object inherited from the Print class, and because the canvas can scroll now.)\n\nThen simply fix any remaining problems by first fixing any compiler complaints with this document in hand, and then walk through all of your program's functionality to see if everything works as expected."
  },
  {
    "path": "tech_notes/obscure_errors_and_resolutions.md",
    "content": "### WPS error\n\nBy default, M5ez supports \"WPS pushbutton\" and \"WPS pincode\" as ways to connect to Wifi. If you run into an error saying ...\n\n```\nDocuments\\Arduino\\libraries\\M5ez-master\\src\\M5ez.cpp:1319:19:\nerror: 'struct esp_wps_config_t' has no member named 'factory_info'\n```\n\n... it probably means your ESP32 library is out of date. Espressif (the ESP32 people) changed how WPS is done in late June 2018. If this happens to you and you would like to have WPS, simply follow the instructions [here](https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/boards_manager.md) to make sure you have the latest ESP32 Arduino support and the problem should go away.\n\n> *Alternatively, if you do not plan to use WPS, you can also comment out `#define M5EZ_WPS` in the `M5ez.h` file in the library's directory.**"
  },
  {
    "path": "tech_notes/settings_persistence.md",
    "content": "# M5ez Settings Persistence\n\nM5ez provides UI for managing a number of settings which are persisted in NVS (Non-Volatile Storage) memory, and are accessible from other programs.\nAll settings share a single NVS namespace:\n\n> NVS NameSpace:  \"M5ez\"\n\n## Wifi Settings\n\nThe WiFi settings include Autoconnect, SSIDs, and passwords. SSIDs and passwords are grouped in pairs, but stored as individual strings.\nThe association between SSID and password is established by a numeric suffix, starting at one and incrementing for each pair.\n\n| Key Name       | Type    | Purpose                                         |\n| :------------- | :------ | :---------------------------------------------- |\n| autoconnect_on | boolean | True if ezWiFi should connect to strongest SSID |\n| SSID1          | String  | Name of first stored network (if any)           |\n| key1           | String  | Password of first stored network (if any)       |\n| ...                                                                        |\n| SSIDn          | String  | Name of last stored network                     |\n| keyn           | String  | Password of last stored network                 |\n\n## Battery Settings\n\nThe Battery settings contains only a single flag which indicates whether or not the battery icon is displayed in the header.\n\n| Key Name        | Type    | Purpose                                           |\n| :-------------- | :------ | :------------------------------------------------ |\n| battery_icon_on | boolean | True if battery icon is to be displayed in header |\n\n## Clock Settings\n\nThe Clock settings include 4 items. The timezone names are described  [here](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones).\n\n| Key Name        | Type    | Purpose                                            |\n| :-------------- | :------ | :------------------------------------------------- |\n| clock_on        | boolean | True if time is to be displayed in header          |\n| timezone        | String  | Name or description of selected timezone           |\n| clock12         | boolean | True if time should be displayed in 12 hr format   |\n| ampm            | boolean | True if am/pm should be displayed after 12 hr time |\n\n## Backlight Settings\n\nThe Backlight settings are stored as two unsigned characters (0 - 255) representing brightness and inactivity timeout.\n\n| Key Name        | Type      | Purpose                                                    |\n| :-------------- | :-------- | :--------------------------------------------------------- |\n| brightness      | uint8_t   | Lcd brightness. Default is 128.                            |\n| inactivity      | uint8_t   | Time until Lcd is blanked. 0 = never, else n * 30 seconds. |\n\n## FACES Settings\n\nThe Faces settings group currently contains a single member.\n\n| Key Name        | Type    | Purpose                                                    |\n| :-------------- | :------ | :--------------------------------------------------------- |\n| faces_on        | boolean | True if the keyboard Face should be used for text input.   |\n\n## Theme Settings\n\nThe Theme settings group also contains a single member.\n\n| Key Name        | Type    | Purpose                                                    |\n| :-------------- | :------ | :--------------------------------------------------------- |\n| theme           | String  | Name of the selected theme (if any.)                       |\n\n---\n\n## Accessing Settings\n\nUsing the Arduino Framework, access NVS settings using the Preferences library.\n\nReading preferences:\n```\n#include <Preferences.h>\nPreferences prefs;\n...\n  // Read preferences\n  prefs.begin(\"M5ez\", true);                              // Namespace = \"M5ez\", true means ReadOnly. No reason to modify settings when we're reading them.\n  String theme = prefs.getString(\"theme\", \"Default\");     // Type = String, Key name = \"theme\", default value if missing = \"Default\" (can be omitted)\n  uint8_t brightness = prefs.getUChar(\"brightness\", 128); // Type = uint8_t (UChar), Key name = \"brightness\", default value if missing = 128 (can be omitted)\n  prefs.end();                                            // Always close preferences promptly, open it only when needed.\n```\n\nWriting preferences. Be certain to write using the correct data type or an error will result.\n```\n#include <Preferences.h>\nPreferences prefs;\n...\n  // Write preferences\n  prefs.begin(\"M5ez\", false);               // Namespace = \"M5ez\", false means ReadWrite. Cannot change NVS otherwise.\n  prefs.putBool(\"autoconnect_on\", true);    // Type = bool, Key name = \"autoconnect_on\", value = true\n  prefs.end();                              // Always close preferences promptly, especially when in read/write mode.\n```\n"
  },
  {
    "path": "tools/get_cert",
    "content": "#!/bin/sh\n\n# This script will take an https URL as an argument. It will do the following:\n#\n# It will find whether this URL is the \"effective URL\", or whether it redirects\n# (possibly multiple times) to something else. It will output this \"effective URL\".\n#\n# It will then take the host part of that URL, connect to port 443 on it, and get the\n# certificate chain. It will take the last certificate on the chain (the root cert)\n# and obtain the issuer details as well as the notAfter date.\n#\n# The certicate is then saved in a format that can be included in an Arduino sketch\n# or any C/C++ environment to provide a \"const char * root_cert\" variable to hold\n# the entire root certificate.\n\n\nURL=`curl -w \"%{url_effective}\\n\" -I -L -s -S $1 -o /dev/null`\nHOST=`echo $URL | awk -F[/:] '{print $4}'`\nFILENAME=`echo $HOST | sed -e 's/\\./_/g'`.h\nTMPFILE=/tmp/cert.get_cert\nopenssl s_client -showcerts -connect $HOST:443 < /dev/null 2>/dev/null| sed -n 'H; /^-----BEGIN CERTIFICATE-----/h; ${g;p;}' |sed  -e '/-----END CERTIFICATE-----/q' > $TMPFILE          \n \nNOTAFTER=`cat $TMPFILE | openssl x509 -noout -dates | grep 'notAfter'`\nISSUER=`cat $TMPFILE | openssl x509 -noout -issuer`\n\necho \"The effective download URL (after resolving forwards) is:\"\necho \"    $URL\"\n\ncat > $FILENAME <<EOF\n// This is the root certificate include file for $HOST\n// as obtained by the get_cert script on: `date`\n//\n//\n// Certificate info:\n//     $ISSUER\n//     $NOTAFTER\n//\n\nconst char* root_cert = \\\\\nEOF\n        \ncat $TMPFILE | sed 's/^/  \"/g' | sed 's/$/\\\\n\" \\\\/g' | sed '$ s/..$/;/' >> $FILENAME\nrm $TMPFILE\n\necho \"\"\necho \"The root certificate include file is saved as:\"\necho \"    $FILENAME\""
  },
  {
    "path": "tools/gh-md-toc",
    "content": "#!/usr/bin/env bash\n\n#\n# Steps:\n#\n#  1. Download corresponding html file for some README.md:\n#       curl -s $1\n#\n#  2. Discard rows where no substring 'user-content-' (github's markup):\n#       awk '/user-content-/ { ...\n#\n#  3.1 Get last number in each row like ' ... </span></a>sitemap.js</h1'.\n#      It's a level of the current header:\n#       substr($0, length($0), 1)\n#\n#  3.2 Get level from 3.1 and insert corresponding number of spaces before '*':\n#       sprintf(\"%*s\", substr($0, length($0), 1)*3, \" \")\n#\n#  4. Find head's text and insert it inside \"* [ ... ]\":\n#       substr($0, match($0, /a>.*<\\/h/)+2, RLENGTH-5)\n#\n#  5. Find anchor and insert it inside \"(...)\":\n#       substr($0, match($0, \"href=\\\"[^\\\"]+?\\\" \")+6, RLENGTH-8)\n#\n\ngh_toc_version=\"0.5.0\"\n\ngh_user_agent=\"gh-md-toc v$gh_toc_version\"\n\n#\n# Download rendered into html README.md by its url.\n#\n#\ngh_toc_load() {\n    local gh_url=$1\n\n    if type curl &>/dev/null; then\n        curl --user-agent \"$gh_user_agent\" -s \"$gh_url\"\n    elif type wget &>/dev/null; then\n        wget --user-agent=\"$gh_user_agent\" -qO- \"$gh_url\"\n    else\n        echo \"Please, install 'curl' or 'wget' and try again.\"\n        exit 1\n    fi\n}\n\n#\n# Converts local md file into html by GitHub\n#\n# ➥ curl -X POST --data '{\"text\": \"Hello world github/linguist#1 **cool**, and #1!\"}' https://api.github.com/markdown\n# <p>Hello world github/linguist#1 <strong>cool</strong>, and #1!</p>'\"\ngh_toc_md2html() {\n    local gh_file_md=$1\n    URL=https://api.github.com/markdown/raw\n    TOKEN=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)/token.txt\"\n    if [ -f \"$TOKEN\" ]; then\n        URL=\"$URL?access_token=$(cat $TOKEN)\"\n    fi\n    curl -s --user-agent \"$gh_user_agent\" \\\n        --data-binary @\"$gh_file_md\" -H \"Content-Type:text/plain\" \\\n        $URL\n}\n\n#\n# Is passed string url\n#\ngh_is_url() {\n    case $1 in\n        https* | http*)\n            echo \"yes\";;\n        *)\n            echo \"no\";;\n    esac\n}\n\n#\n# TOC generator\n#\ngh_toc(){\n    local gh_src=$1\n    local gh_src_copy=$1\n    local gh_ttl_docs=$2\n    local need_replace=$3\n\n    if [ \"$gh_src\" = \"\" ]; then\n        echo \"Please, enter URL or local path for a README.md\"\n        exit 1\n    fi\n\n\n    # Show \"TOC\" string only if working with one document\n    if [ \"$gh_ttl_docs\" = \"1\" ]; then\n\n        echo \"Table of Contents\"\n        echo \"=================\"\n        echo \"\"\n        gh_src_copy=\"\"\n\n    fi\n\n    if [ \"$(gh_is_url \"$gh_src\")\" == \"yes\" ]; then\n        gh_toc_load \"$gh_src\" | gh_toc_grab \"$gh_src_copy\"\n        if [ \"$need_replace\" = \"yes\" ]; then\n            echo\n            echo \"!! '$gh_src' is not a local file\"\n            echo \"!! Can't insert the TOC into it.\"\n            echo\n        fi\n    else\n        local toc=`gh_toc_md2html \"$gh_src\" | gh_toc_grab \"$gh_src_copy\"`\n        echo \"$toc\"\n        if [ \"$need_replace\" = \"yes\" ]; then\n            local ts=\"<\\!--ts-->\"\n            local te=\"<\\!--te-->\"\n            local dt=`date +'%F_%H%M%S'`\n            local ext=\".orig.${dt}\"\n            local toc_path=\"${gh_src}.toc.${dt}\"\n            local toc_footer=\"<!-- Added by: `whoami`, at: `date --iso-8601='minutes'` -->\"\n            # http://fahdshariff.blogspot.ru/2012/12/sed-mutli-line-replacement-between-two.html\n            # clear old TOC\n            sed -i${ext} \"/${ts}/,/${te}/{//!d;}\" \"$gh_src\"\n            # create toc file\n            echo \"${toc}\" > \"${toc_path}\"\n            echo -e \"\\n${toc_footer}\\n\" >> \"$toc_path\"\n            # insert toc file\n            if [[ \"`uname`\" == \"Darwin\" ]]; then\n                sed -i \"\" \"/${ts}/r ${toc_path}\" \"$gh_src\"\n            else\n                sed -i \"/${ts}/r ${toc_path}\" \"$gh_src\"\n            fi\n            echo\n            echo \"!! TOC was added into: '$gh_src'\"\n            echo \"!! Origin version of the file: '${gh_src}${ext}'\"\n            echo \"!! TOC added into a separate file: '${toc_path}'\"\n            echo\n        fi\n    fi\n}\n\n#\n# Grabber of the TOC from rendered html\n#\n# $1 — a source url of document.\n# It's need if TOC is generated for multiple documents.\n#\ngh_toc_grab() {\n\t# if closed <h[1-6]> is on the new line, then move it on the prev line\n\t# for example:\n\t# \twas: The command <code>foo1</code>\n\t# \t\t </h1>\n\t# \tbecame: The command <code>foo1</code></h1>\n    sed -e ':a' -e 'N' -e '$!ba' -e 's/\\n<\\/h/<\\/h/g' |\n    # find strings that corresponds to template\n    grep -E -o '<a.*id=\"user-content-[^\"]*\".*</h[1-6]' |\n    # remove code tags\n    sed 's/<code>//' | sed 's/<\\/code>//' |\n    # now all rows are like:\n    #   <a id=\"user-content-...\" href=\"...\"><span ...></span></a> ... </h1\n    # format result line\n    #   * $0 — whole string\n    echo -e \"$(awk -v \"gh_url=$1\" '{\n    print sprintf(\"%*s\", substr($0, length($0), 1)*3, \" \") \"* [\" substr($0, match($0, /a>.*<\\/h/)+2, RLENGTH-5)\"](\" gh_url substr($0, match($0, \"href=\\\"[^\\\"]+?\\\" \")+6, RLENGTH-8) \")\"}' | sed 'y/+/ /; s/%/\\\\x/g')\"\n}\n\n#\n# Returns filename only from full path or url\n#\ngh_toc_get_filename() {\n    echo \"${1##*/}\"\n}\n\n#\n# Options hendlers\n#\ngh_toc_app() {\n    local app_name=\"gh-md-toc\"\n    local need_replace=\"no\"\n\n    if [ \"$1\" = '--help' ] || [ $# -eq 0 ] ; then\n        echo \"GitHub TOC generator ($app_name): $gh_toc_version\"\n        echo \"\"\n        echo \"Usage:\"\n        echo \"  $app_name [--insert] src [src]  Create TOC for a README file (url or local path)\"\n        echo \"  $app_name -                     Create TOC for markdown from STDIN\"\n        echo \"  $app_name --help                Show help\"\n        echo \"  $app_name --version             Show version\"\n        return\n    fi\n\n    if [ \"$1\" = '--version' ]; then\n        echo \"$gh_toc_version\"\n        return\n    fi\n\n    if [ \"$1\" = \"-\" ]; then\n        if [ -z \"$TMPDIR\" ]; then\n            TMPDIR=\"/tmp\"\n        elif [ -n \"$TMPDIR\" -a ! -d \"$TMPDIR\" ]; then\n            mkdir -p \"$TMPDIR\"\n        fi\n        local gh_tmp_md\n        gh_tmp_md=$(mktemp $TMPDIR/tmp.XXXXXX)\n        while read input; do\n            echo \"$input\" >> \"$gh_tmp_md\"\n        done\n        gh_toc_md2html \"$gh_tmp_md\" | gh_toc_grab \"\"\n        return\n    fi\n\n    if [ \"$1\" = '--insert' ]; then\n        need_replace=\"yes\"\n        shift\n    fi\n\n    for md in \"$@\"\n    do\n        echo \"\"\n        gh_toc \"$md\" \"$#\" \"$need_replace\"\n    done\n\n    echo \"\"\n    echo \"Created by [gh-md-toc](https://github.com/ekalinin/github-markdown-toc)\"\n}\n\n#\n# Entry point\n#\ngh_toc_app \"$@\"\n"
  },
  {
    "path": "tools/include_file",
    "content": "#!/bin/sh\n\nINPUT_PATH=$1\nINPUT_FILE=`basename $1`\n# The byte array is named like the file, but in lower case with dots replaced by underscores \nARRAYNAME=`echo $INPUT_FILE | sed -e 's/\\\\./_/g'`\nOUTPUT_FILE=$ARRAYNAME.h\nBYTES=`wc -c $INPUT_PATH | awk '{print $1}'`\n\necho \"Converting input file:\"\necho \"    $INPUT_PATH\"\necho \"Creating include file:\"\necho \"    $OUTPUT_FILE\"\n\ncat > $OUTPUT_FILE <<EOF\n#pragma once\n\n//\n// Include this file to use $INPUT_FILE ($BYTES bytes) in your sketch.\n//\n// File created on `date` \n// Made by the include_file script that is part of\n// \"M5ez: the easiest way to program on M5Stack.\"\n// https://github.com/M5ez/M5ez\n//\n\nconst char $ARRAYNAME[] PROGMEM = {\nEOF\n\nhexdump -v -e '\"    \" 14/1 \"0x%02x, \" \"\\n\"' $INPUT_PATH | sed -e \"s/, 0x  //g\" | sed '$ s/.$//' >> $OUTPUT_FILE\necho \"};\" >> $OUTPUT_FILE"
  }
]