From e82f73e58a4acb66c119d8021b6dc03e31346cf7 Mon Sep 17 00:00:00 2001 From: SiGool Date: Sat, 15 May 2021 22:17:49 +0800 Subject: [PATCH] init --- Indexes2JSON.c | 122 + LICENSE | 21 + README.md | 14 + assets/css/jquery.mmenu.all.css | 41 + assets/css/layout.css | 145 + assets/data.js | 10 + assets/fonts/fonts/icomoon.eot | Bin 0 -> 1896 bytes assets/fonts/fonts/icomoon.svg | 12 + assets/fonts/fonts/icomoon.ttf | Bin 0 -> 1732 bytes assets/fonts/fonts/icomoon.woff | Bin 0 -> 1808 bytes assets/fonts/style.css | 32 + assets/js/core.js | 134 + assets/js/jquery.min.js | 5 + assets/js/jquery.mmenu.all.js | 70 + assets/strapdown/LICENSE | 20 + assets/strapdown/strapdown.css | 99 + assets/strapdown/strapdown.js | 442 +++ assets/strapdown/themes/LICENSE | 174 + assets/strapdown/themes/README.md | 7 + assets/strapdown/themes/amelia.min.css | 959 ++++++ .../themes/bootstrap-responsive.min.css | 9 + assets/strapdown/themes/bootstrap.min.css | 9 + assets/strapdown/themes/cerulean.min.css | 854 +++++ assets/strapdown/themes/cyborg.min.css | 933 ++++++ assets/strapdown/themes/journal.min.css | 869 +++++ assets/strapdown/themes/readable.min.css | 905 +++++ assets/strapdown/themes/simplex.min.css | 885 +++++ assets/strapdown/themes/slate.min.css | 913 +++++ assets/strapdown/themes/spacelab.min.css | 873 +++++ assets/strapdown/themes/spruce.min.css | 920 ++++++ assets/strapdown/themes/superhero.min.css | 943 ++++++ assets/strapdown/themes/united.min.css | 845 +++++ demo/assets/css/jquery.mmenu.all.css | 41 + demo/assets/css/layout.css | 78 + demo/assets/data.js | 9 + demo/assets/fonts/fonts/icomoon.eot | Bin 0 -> 1896 bytes demo/assets/fonts/fonts/icomoon.svg | 12 + demo/assets/fonts/fonts/icomoon.ttf | Bin 0 -> 1732 bytes demo/assets/fonts/fonts/icomoon.woff | Bin 0 -> 1808 bytes demo/assets/fonts/style.css | 32 + demo/assets/images/easy.png | Bin 0 -> 1833 bytes demo/assets/images/force_me_on_github.png | Bin 0 -> 7791 bytes demo/assets/images/github.png | Bin 0 -> 3443 bytes demo/assets/images/support_mkd.png | Bin 0 -> 2538 bytes demo/assets/images/toc.png | Bin 0 -> 992 bytes demo/assets/js/core.js | 135 + demo/assets/js/jquery.min.js | 5 + demo/assets/js/jquery.mmenu.all.js | 70 + demo/assets/strapdown/LICENSE | 20 + demo/assets/strapdown/strapdown.css | 99 + demo/assets/strapdown/strapdown.js | 442 +++ demo/assets/strapdown/themes/LICENSE | 174 + demo/assets/strapdown/themes/README.md | 7 + demo/assets/strapdown/themes/amelia.min.css | 959 ++++++ .../themes/bootstrap-responsive.min.css | 9 + .../assets/strapdown/themes/bootstrap.min.css | 9 + demo/assets/strapdown/themes/cerulean.min.css | 854 +++++ demo/assets/strapdown/themes/cyborg.min.css | 933 ++++++ demo/assets/strapdown/themes/journal.min.css | 869 +++++ demo/assets/strapdown/themes/readable.min.css | 905 +++++ demo/assets/strapdown/themes/simplex.min.css | 885 +++++ demo/assets/strapdown/themes/slate.min.css | 913 +++++ demo/assets/strapdown/themes/spacelab.min.css | 873 +++++ demo/assets/strapdown/themes/spruce.min.css | 920 ++++++ .../assets/strapdown/themes/superhero.min.css | 943 ++++++ demo/assets/strapdown/themes/united.min.css | 845 +++++ demo/favicon.ico | Bin 0 -> 1150 bytes demo/index.html | 26 + demo/mkdnotes.exe | Bin 0 -> 120578 bytes demo/mkdnotes.ini | 18 + demo/mkdnotes_l | Bin 0 -> 52448 bytes demo/mkdnotes_m_ | Bin 0 -> 50064 bytes demo/notes/Documentation.html | 59 + demo/notes/Guides(en).html | 130 + demo/notes/Guides.html | 132 + demo/notes/welcome.html | 35 + favicon.ico | Bin 0 -> 1150 bytes index.html | 26 + mkdnotes.c | 339 ++ mkdnotes.exe | Bin 0 -> 120578 bytes mkdnotes.ini | 18 + mkdnotes_l | Bin 0 -> 52448 bytes mkdnotes_m_ | Bin 0 -> 50064 bytes notes/testDefault.html | 11 + notes/testOption.html | 14 + "notes/\345\212\250\347\211\251/kitten.html" | 81 + notesConfReader.c | 89 + vendor/cJSON/LICENSE | 20 + vendor/cJSON/cJSON.c | 2932 +++++++++++++++++ vendor/cJSON/cJSON.h | 285 ++ vendor/cJSON/test.c | 268 ++ vendor/inih/LICENSE.txt | 27 + vendor/inih/ini.c | 269 ++ vendor/inih/ini.h | 130 + vendor/whereami/LICENSE | 25 + vendor/whereami/whereami.c | 682 ++++ vendor/whereami/whereami.h | 65 + 97 files changed, 27987 insertions(+) create mode 100644 Indexes2JSON.c create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/css/jquery.mmenu.all.css create mode 100644 assets/css/layout.css create mode 100644 assets/data.js create mode 100644 assets/fonts/fonts/icomoon.eot create mode 100644 assets/fonts/fonts/icomoon.svg create mode 100644 assets/fonts/fonts/icomoon.ttf create mode 100644 assets/fonts/fonts/icomoon.woff create mode 100644 assets/fonts/style.css create mode 100644 assets/js/core.js create mode 100644 assets/js/jquery.min.js create mode 100644 assets/js/jquery.mmenu.all.js create mode 100644 assets/strapdown/LICENSE create mode 100644 assets/strapdown/strapdown.css create mode 100644 assets/strapdown/strapdown.js create mode 100644 assets/strapdown/themes/LICENSE create mode 100644 assets/strapdown/themes/README.md create mode 100644 assets/strapdown/themes/amelia.min.css create mode 100644 assets/strapdown/themes/bootstrap-responsive.min.css create mode 100644 assets/strapdown/themes/bootstrap.min.css create mode 100644 assets/strapdown/themes/cerulean.min.css create mode 100644 assets/strapdown/themes/cyborg.min.css create mode 100644 assets/strapdown/themes/journal.min.css create mode 100644 assets/strapdown/themes/readable.min.css create mode 100644 assets/strapdown/themes/simplex.min.css create mode 100644 assets/strapdown/themes/slate.min.css create mode 100644 assets/strapdown/themes/spacelab.min.css create mode 100644 assets/strapdown/themes/spruce.min.css create mode 100644 assets/strapdown/themes/superhero.min.css create mode 100644 assets/strapdown/themes/united.min.css create mode 100644 demo/assets/css/jquery.mmenu.all.css create mode 100644 demo/assets/css/layout.css create mode 100644 demo/assets/data.js create mode 100644 demo/assets/fonts/fonts/icomoon.eot create mode 100644 demo/assets/fonts/fonts/icomoon.svg create mode 100644 demo/assets/fonts/fonts/icomoon.ttf create mode 100644 demo/assets/fonts/fonts/icomoon.woff create mode 100644 demo/assets/fonts/style.css create mode 100644 demo/assets/images/easy.png create mode 100644 demo/assets/images/force_me_on_github.png create mode 100644 demo/assets/images/github.png create mode 100644 demo/assets/images/support_mkd.png create mode 100644 demo/assets/images/toc.png create mode 100644 demo/assets/js/core.js create mode 100644 demo/assets/js/jquery.min.js create mode 100644 demo/assets/js/jquery.mmenu.all.js create mode 100644 demo/assets/strapdown/LICENSE create mode 100644 demo/assets/strapdown/strapdown.css create mode 100644 demo/assets/strapdown/strapdown.js create mode 100644 demo/assets/strapdown/themes/LICENSE create mode 100644 demo/assets/strapdown/themes/README.md create mode 100644 demo/assets/strapdown/themes/amelia.min.css create mode 100644 demo/assets/strapdown/themes/bootstrap-responsive.min.css create mode 100644 demo/assets/strapdown/themes/bootstrap.min.css create mode 100644 demo/assets/strapdown/themes/cerulean.min.css create mode 100644 demo/assets/strapdown/themes/cyborg.min.css create mode 100644 demo/assets/strapdown/themes/journal.min.css create mode 100644 demo/assets/strapdown/themes/readable.min.css create mode 100644 demo/assets/strapdown/themes/simplex.min.css create mode 100644 demo/assets/strapdown/themes/slate.min.css create mode 100644 demo/assets/strapdown/themes/spacelab.min.css create mode 100644 demo/assets/strapdown/themes/spruce.min.css create mode 100644 demo/assets/strapdown/themes/superhero.min.css create mode 100644 demo/assets/strapdown/themes/united.min.css create mode 100644 demo/favicon.ico create mode 100644 demo/index.html create mode 100644 demo/mkdnotes.exe create mode 100644 demo/mkdnotes.ini create mode 100644 demo/mkdnotes_l create mode 100644 demo/mkdnotes_m_ create mode 100644 demo/notes/Documentation.html create mode 100644 demo/notes/Guides(en).html create mode 100644 demo/notes/Guides.html create mode 100644 demo/notes/welcome.html create mode 100644 favicon.ico create mode 100644 index.html create mode 100644 mkdnotes.c create mode 100644 mkdnotes.exe create mode 100644 mkdnotes.ini create mode 100644 mkdnotes_l create mode 100644 mkdnotes_m_ create mode 100644 notes/testDefault.html create mode 100644 notes/testOption.html create mode 100644 "notes/\345\212\250\347\211\251/kitten.html" create mode 100644 notesConfReader.c create mode 100644 vendor/cJSON/LICENSE create mode 100644 vendor/cJSON/cJSON.c create mode 100644 vendor/cJSON/cJSON.h create mode 100644 vendor/cJSON/test.c create mode 100644 vendor/inih/LICENSE.txt create mode 100644 vendor/inih/ini.c create mode 100644 vendor/inih/ini.h create mode 100644 vendor/whereami/LICENSE create mode 100644 vendor/whereami/whereami.c create mode 100644 vendor/whereami/whereami.h diff --git a/Indexes2JSON.c b/Indexes2JSON.c new file mode 100644 index 0000000..9c49e79 --- /dev/null +++ b/Indexes2JSON.c @@ -0,0 +1,122 @@ +/* +Copyright (c) 2018 石固 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +// mkdnotes --commit + +#include +#include +#include +#include +#include "./vendor/cJSON/cJSON.c" + +char* Idx2JSON_printStr(char *startDirPath); +void Idx2JSON_recursiveDir(char *dirPath, cJSON *f); + +char* Idx2JSON_printStr(char *startDirPath) +{ + cJSON *root = NULL; + if ((root = cJSON_CreateArray()) == NULL) + { + fprintf(stderr, "error: Failed to create cJSON structure!\n"); + exit(1); + } + + Idx2JSON_recursiveDir(startDirPath, root); + + char *res = NULL; + if ((res = cJSON_Print(root)) == NULL) + { + fprintf(stderr, "error: Failed to print cJSON structure!\n"); + exit(1); + } + + cJSON_Delete(root); + + return res; +} + +void Idx2JSON_recursiveDir(char *dirPath, cJSON *f) +{ + DIR *dirP = NULL; + if ((dirP = opendir(dirPath)) == NULL) + { + fprintf(stderr, "error: Failed to open directory: \"%s\"\n", dirPath); + exit(1); + } + + struct dirent *dp; + dp = readdir(dirP); + + while (dp) + { + if (errno != 0) + { + fprintf(stderr, "error: Failed to read directory: \"%s\"\n", dirPath); + exit(1); + } + + if (strcmp(dp->d_name, ".") && strcmp(dp->d_name, "..")) + { + // check the file type + char testFilePath[256] = {'\0'}; + strcpy(testFilePath, dirPath); + strcat(testFilePath, "/"); + strcat(testFilePath, dp->d_name); + + struct stat buf; + stat(testFilePath, &buf); + if (S_ISDIR(buf.st_mode)) + { + // is folder + cJSON *obj = NULL, + *arr = NULL; + + if ((obj = cJSON_CreateObject()) == NULL || (arr = cJSON_CreateArray()) == NULL || (cJSON_AddStringToObject(obj, "text", dp->d_name)) == NULL) + { + fprintf(stderr, "error: Failed to create cJSON structure!\n"); + exit(1); + } + + cJSON_AddItemToObject(obj, "nodes", arr); + cJSON_AddItemToArray(f, obj); + + // sub folder + Idx2JSON_recursiveDir(testFilePath, arr); + } + else if (strlen(dp->d_name) > 5 && strcmp(dp->d_name + (strlen(dp->d_name) - 5), ".html") == 0) + { + cJSON *obj = NULL; + if ((obj = cJSON_CreateObject()) == NULL || (cJSON_AddStringToObject(obj, "text", dp->d_name)) == NULL) + { + fprintf(stderr, "error: Failed to create cJSON structure!\n"); + exit(1); + } + + cJSON_AddItemToArray(f, obj); + } + } + + dp = readdir(dirP); + } + + closedir(dirP); +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ed33bdb --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 石固 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..9e9722d --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# mkdnotes +Guides / Documentation, see [https://sigool.github.io/mkdnotes/demo/](https://sigool.github.io/mkdnotes/demo/) + + +# Credits + +- [cJSON](https://github.com/DaveGamble/cJSON): Ultralightweight JSON parser in ANSI C +- [inih](https://github.com/benhoyt/inih): Simple .INI file parser in C, good for embedded systems +- [whereami](https://github.com/gpakosz/whereami): Locate the current executable and the current module/library on the file system +- [jQuery.mmenu](https://github.com/FrDH/jQuery.mmenu): The best jQuery plugin for app look-alike on- and off-canvas menus with sliding submenus for your website and webapp. +- [strapdown](https://github.com/arturadib/strapdown): Instant and elegant Markdown documents in the browser +- Icons from [IcoMoon app](https://icomoon.io/app) + + diff --git a/assets/css/jquery.mmenu.all.css b/assets/css/jquery.mmenu.all.css new file mode 100644 index 0000000..9a84378 --- /dev/null +++ b/assets/css/jquery.mmenu.all.css @@ -0,0 +1,41 @@ +/*! + * jQuery mmenu v7.2.2 + * @requires jQuery 1.7.0 or later + * + * mmenu.frebsite.nl + * + * Copyright (c) Fred Heusschen + * www.frebsite.nl + * + * License: CC-BY-NC-4.0 + * http://creativecommons.org/licenses/by-nc/4.0/ + */.mm-menu{--mm-line-height:20px;--mm-listitem-size:44px;--mm-navbar-size:44px;--mm-offset-top:0;--mm-offset-right:0;--mm-offset-bottom:0;--mm-offset-left:0;--mm-color-border:rgba(0, 0, 0, 0.1);--mm-color-button:rgba(0, 0, 0, 0.3);--mm-color-text:rgba(0, 0, 0, 0.75);--mm-color-text-dimmed:rgba(0, 0, 0, 0.3);--mm-color-background:#f3f3f3;--mm-color-background-highlight:rgba(0, 0, 0, 0.05);--mm-color-background-emphasis:rgba(255, 255, 255, 0.4);--mm-shadow:0 0 10px rgba( 0,0,0, 0.3 )}.mm-hidden{display:none!important}.mm-wrapper{overflow-x:hidden;position:relative}.mm-menu{background:#f3f3f3;border-color:rgba(0,0,0,.1);color:rgba(0,0,0,.75);background:var(--mm-color-background);border-color:var(--mm-color-border);color:var(--mm-color-text);line-height:20px;line-height:var(--mm-line-height);-webkit-box-sizing:border-box;box-sizing:border-box;display:block;padding:0;margin:0;position:absolute;z-index:0;top:0;right:0;bottom:0;left:0;top:var(--mm-offset-top);right:var(--mm-offset-right);bottom:var(--mm-offset-bottom);left:var(--mm-offset-left);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mm-menu a,.mm-menu a:active,.mm-menu a:hover,.mm-menu a:link,.mm-menu a:visited{color:inherit;text-decoration:none}[dir=rtl] .mm-menu{direction:rtl}.mm-panels,.mm-panels>.mm-panel{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.mm-panel,.mm-panels{-webkit-box-sizing:border-box;box-sizing:border-box;background:#f3f3f3;border-color:rgba(0,0,0,.1);color:rgba(0,0,0,.75);background:var(--mm-color-background);border-color:var(--mm-color-border);color:var(--mm-color-text)}.mm-panels{overflow:hidden}.mm-panel{-webkit-overflow-scrolling:touch;overflow:scroll;overflow-x:hidden;overflow-y:auto;width:100%;padding:0 20px;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);-webkit-transition:-webkit-transform .4s ease;transition:-webkit-transform .4s ease;-o-transition:transform .4s ease;transition:transform .4s ease;transition:transform .4s ease,-webkit-transform .4s ease}.mm-panel:not(.mm-hidden){display:block}.mm-panel:after,.mm-panel:before{content:'';display:block;height:20px}.mm-panel_has-navbar{padding-top:44px;padding-top:var(--mm-navbar-size)}.mm-panel_opened{z-index:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-panel_opened-parent{-webkit-transform:translate3d(-30%,0,0);transform:translate3d(-30%,0,0)}.mm-panel_highest{z-index:2}.mm-panel_noanimation{-webkit-transition:none!important;-o-transition:none!important;transition:none!important}.mm-panel_noanimation.mm-panel_opened-parent{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}[dir=rtl] .mm-panel:not(.mm-panel_opened){-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}[dir=rtl] .mm-panel.mm-panel_opened-parent{-webkit-transform:translate3d(30%,0,0);transform:translate3d(30%,0,0)}.mm-listitem_vertical>.mm-panel{-webkit-transform:none!important;-ms-transform:none!important;transform:none!important;display:none;width:100%;padding:10px 0 10px 10px}.mm-listitem_vertical>.mm-panel:after,.mm-listitem_vertical>.mm-panel:before{content:none;display:none}.mm-listitem_opened>.mm-panel{display:block}.mm-listitem_vertical>.mm-listitem__btn{height:44px;height:var(--mm-listitem-size);bottom:auto}.mm-listitem_vertical .mm-listitem:last-child:after{border-color:transparent}.mm-listitem_opened>.mm-listitem__btn:after{-webkit-transform:rotate(225deg);-ms-transform:rotate(225deg);transform:rotate(225deg);right:19px}.mm-btn{-webkit-box-sizing:border-box;box-sizing:border-box;width:44px;padding:0}.mm-btn:after,.mm-btn:before{border-color:rgba(0,0,0,.1);border-color:var(--mm-color-button);border-width:2px;border-style:solid}.mm-btn_close:after,.mm-btn_close:before{content:'';-webkit-box-sizing:content-box;box-sizing:content-box;display:block;width:5px;height:5px;margin:auto;position:absolute;top:0;bottom:0;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.mm-btn_close:before{border-right:none;border-bottom:none;right:18px}.mm-btn_close:after{border-left:none;border-top:none;right:25px}.mm-btn_next:after,.mm-btn_prev:before{content:'';border-bottom:none;border-right:none;-webkit-box-sizing:content-box;box-sizing:content-box;display:block;width:8px;height:8px;margin:auto;position:absolute;top:0;bottom:0}.mm-btn_prev:before{-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);left:23px;right:auto}.mm-btn_next:after{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg);right:23px;left:auto}[dir=rtl] .mm-btn_next:after{-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);left:23px;right:auto}[dir=rtl] .mm-btn_prev:before{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg);right:23px;left:auto}[dir=rtl] .mm-btn_close:after,[dir=rtl] .mm-btn_close:before{right:auto}[dir=rtl] .mm-btn_close:before{left:25px}[dir=rtl] .mm-btn_close:after{left:18px}.mm-navbar{background:#f3f3f3;border-color:rgba(0,0,0,.1);color:rgba(0,0,0,.3);background:var(--mm-color-background);border-color:var(--mm-color-border);color:var(--mm-color-text-dimmed);border-bottom-width:1px;border-bottom-style:solid;text-align:center;display:none;height:44px;height:var(--mm-navbar-size);padding:0 44px;margin:0;position:absolute;top:0;left:0;right:0;opacity:1;-webkit-transition:opacity .4s ease;-o-transition:opacity .4s ease;transition:opacity .4s ease}.mm-navbar>*{-webkit-box-sizing:border-box;box-sizing:border-box;display:block;padding:12px;padding:calc((var(--mm-navbar-size) - var(--mm-line-height)) * .5);padding-left:0;padding-right:0}.mm-navbar a,.mm-navbar a:hover{text-decoration:none}.mm-navbar__title{-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mm-navbar__btn{position:absolute;top:0;bottom:0;z-index:1}.mm-navbar__btn:first-child{text-align:left;left:0}.mm-navbar__btn:last-child{text-align:right;right:0}.mm-panel_has-navbar .mm-navbar{display:block}[dir=rtl] .mm-navbar__btn:first-child{text-align:right;right:0;left:auto}[dir=rtl] .mm-navbar__btn:last-child{text-align:left;left:0;right:auto}.mm-listitem,.mm-listview{list-style:none;display:block;padding:0;margin:0}.mm-listitem{color:rgba(0,0,0,.75);color:var(--mm-color-text);border-color:rgba(0,0,0,.1);border-color:var(--mm-color-border);position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.mm-listitem:after{content:'';border-color:inherit;border-bottom-width:1px;border-bottom-style:solid;display:block;position:absolute;left:20px;right:0;bottom:0}.mm-listitem a,.mm-listitem a:hover{text-decoration:none}.mm-listitem__btn,.mm-listitem__text{color:inherit;display:block;padding-top:12px;padding-top:calc((var(--mm-listitem-size) - var(--mm-line-height))/ 2);padding-bottom:12px;padding-bottom:calc((var(--mm-listitem-size) - var(--mm-line-height))/ 2)}.mm-listitem__text{-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;padding-left:20px;padding-right:10px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:10%;flex-basis:10%}.mm-listitem__btn{-webkit-tap-highlight-color:rgba(255,255,255,.4);tap-highlight-color:rgba(255,255,255,.4);-webkit-tap-highlight-color:var(--mm-color-background-emphasis);tap-highlight-color:var(--mm-color-background-emphasis);background:rgba(3,2,1,0);border-color:inherit;width:auto;padding-right:54px;position:relative}.mm-listitem__btn:not(.mm-listitem__text){border-left-width:1px;border-left-style:solid}.mm-listitem_selected>.mm-listitem__text{background:rgba(255,255,255,.4);background:var(--mm-color-background-emphasis)}.mm-listitem_opened>.mm-listitem__btn,.mm-listitem_opened>.mm-panel{background:rgba(0,0,0,.05);background:var(--mm-color-background-highlight)}.mm-panels>.mm-panel>.mm-listview{margin:20px -20px}.mm-panels>.mm-panel>.mm-listview:first-child,.mm-panels>.mm-panel>.mm-navbar+.mm-listview{margin-top:-20px}.mm-listitem_divider{-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;background:rgba(0,0,0,.05);background:var(--mm-color-background-highlight);font-size:75%;text-transform:uppercase;min-height:20px;min-height:var(--mm-line-height);padding:6.5px;padding:calc(((var(--mm-listitem-size) * .75) - var(--mm-line-height)) * .5);padding-right:10px;padding-left:20px}.mm-listitem_spacer{padding-top:44px;padding-top:var(--mm-listitem-size)}.mm-listitem_spacer>.mm-btn_next{top:44px;top:var(--mm-listitem-size)}[dir=rtl] .mm-listitem:after{left:0;right:20px}[dir=rtl] .mm-listitem__text{padding-left:10px;padding-right:20px}[dir=rtl] .mm-listitem__btn{padding-left:54px;border-left-width:0;border-left-style:none}[dir=rtl] .mm-listitem__btn:not(.mm-listitem__text){padding-right:0;border-right-width:1px;border-right-style:solid} +.mm-page{-webkit-box-sizing:border-box;box-sizing:border-box;position:relative}.mm-slideout{-webkit-transition:-webkit-transform .4s ease;transition:-webkit-transform .4s ease;-o-transition:transform .4s ease;transition:transform .4s ease;transition:transform .4s ease,-webkit-transform .4s ease;z-index:1}.mm-wrapper_opened{overflow-x:hidden;position:relative}.mm-wrapper_background .mm-page{background:inherit}.mm-menu_offcanvas{display:none;position:fixed;right:auto;z-index:0}.mm-menu_offcanvas.mm-menu_opened{display:block}.mm-menu_offcanvas{width:80%;min-width:240px;max-width:440px}.mm-wrapper_opening .mm-menu_offcanvas.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(80vw,0,0);transform:translate3d(80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_offcanvas.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(240px,0,0);transform:translate3d(240px,0,0)}}@media all and (min-width:550px){.mm-wrapper_opening .mm-menu_offcanvas.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(440px,0,0);transform:translate3d(440px,0,0)}}.mm-wrapper__blocker{background:rgba(3,2,1,0);overflow:hidden;display:none;width:100%;height:100%;position:fixed;top:0;left:0;z-index:2}.mm-wrapper_blocking{overflow:hidden}.mm-wrapper_blocking body{overflow:hidden}.mm-wrapper_blocking .mm-wrapper__blocker{display:block} +.mm-sronly{border:0!important;clip:rect(1px,1px,1px,1px)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important;white-space:nowrap!important;width:1px!important;min-width:1px!important;height:1px!important;min-height:1px!important;padding:0!important;overflow:hidden!important;position:absolute!important} +.mm-menu_autoheight{-webkit-transition:none .4s ease;-o-transition:none .4s ease;transition:none .4s ease;-webkit-transition-property:height,-webkit-transform;transition-property:height,-webkit-transform;-o-transition-property:transform,height;transition-property:transform,height;transition-property:transform,height,-webkit-transform}.mm-menu_autoheight:not(.mm-menu_offcanvas){position:relative}.mm-menu_autoheight.mm-menu_position-bottom,.mm-menu_autoheight.mm-menu_position-top{max-height:80%}.mm-menu_autoheight-measuring .mm-panel{display:block!important}.mm-menu_autoheight-measuring .mm-listitem_vertical:not(.mm-listitem_opened) .mm-panel{display:none!important}.mm-menu_autoheight-measuring .mm-panels>.mm-panel{bottom:auto!important;height:auto!important} +[class*=mm-menu_columns-]{-webkit-transition-property:width;-o-transition-property:width;transition-property:width}[class*=mm-menu_columns-] .mm-panels>.mm-panel{right:auto;-webkit-transition-property:width,-webkit-transform;transition-property:width,-webkit-transform;-o-transition-property:width,transform;transition-property:width,transform;transition-property:width,transform,-webkit-transform}[class*=mm-menu_columns-] .mm-panels>.mm-panel_opened,[class*=mm-menu_columns-] .mm-panels>.mm-panel_opened-parent{display:block!important}[class*=mm-panel_columns-]{border-right:1px solid;border-color:inherit}.mm-menu_columns-1 .mm-panel_columns-0,.mm-menu_columns-2 .mm-panel_columns-1,.mm-menu_columns-3 .mm-panel_columns-2,.mm-menu_columns-4 .mm-panel_columns-3{border-right:none}[class*=mm-menu_columns-] .mm-panels>.mm-panel_columns-0{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-menu_columns-0 .mm-panels>.mm-panel{z-index:0}.mm-menu_columns-0 .mm-panels>.mm-panel else{width:100%}.mm-menu_columns-0 .mm-panels>.mm-panel:not(.mm-panel_opened):not(.mm-panel_opened-parent){-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.mm-menu_columns-0{width:80%;min-width:240px;max-width:0}.mm-wrapper_opening .mm-menu_columns-0.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(80vw,0,0);transform:translate3d(80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-0.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(240px,0,0);transform:translate3d(240px,0,0)}}@media all and (min-width:0px){.mm-wrapper_opening .mm-menu_columns-0.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.mm-wrapper_opening .mm-menu_columns-0.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-80vw,0,0);transform:translate3d(-80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-0.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-240px,0,0);transform:translate3d(-240px,0,0)}}@media all and (min-width:0px){.mm-wrapper_opening .mm-menu_columns-0.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}[class*=mm-menu_columns-] .mm-panels>.mm-panel_columns-1{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.mm-menu_columns-1 .mm-panels>.mm-panel{z-index:1;width:100%}.mm-menu_columns-1 .mm-panels>.mm-panel else{width:100%}.mm-menu_columns-1 .mm-panels>.mm-panel:not(.mm-panel_opened):not(.mm-panel_opened-parent){-webkit-transform:translate3d(200%,0,0);transform:translate3d(200%,0,0)}.mm-menu_columns-1{width:80%;min-width:240px;max-width:440px}.mm-wrapper_opening .mm-menu_columns-1.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(80vw,0,0);transform:translate3d(80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-1.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(240px,0,0);transform:translate3d(240px,0,0)}}@media all and (min-width:550px){.mm-wrapper_opening .mm-menu_columns-1.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(440px,0,0);transform:translate3d(440px,0,0)}}.mm-wrapper_opening .mm-menu_columns-1.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-80vw,0,0);transform:translate3d(-80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-1.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-240px,0,0);transform:translate3d(-240px,0,0)}}@media all and (min-width:550px){.mm-wrapper_opening .mm-menu_columns-1.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-440px,0,0);transform:translate3d(-440px,0,0)}}[class*=mm-menu_columns-] .mm-panels>.mm-panel_columns-2{-webkit-transform:translate3d(200%,0,0);transform:translate3d(200%,0,0)}.mm-menu_columns-2 .mm-panels>.mm-panel{z-index:2;width:50%}.mm-menu_columns-2 .mm-panels>.mm-panel else{width:100%}.mm-menu_columns-2 .mm-panels>.mm-panel:not(.mm-panel_opened):not(.mm-panel_opened-parent){-webkit-transform:translate3d(300%,0,0);transform:translate3d(300%,0,0)}.mm-menu_columns-2{width:80%;min-width:240px;max-width:880px}.mm-wrapper_opening .mm-menu_columns-2.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(80vw,0,0);transform:translate3d(80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-2.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(240px,0,0);transform:translate3d(240px,0,0)}}@media all and (min-width:1100px){.mm-wrapper_opening .mm-menu_columns-2.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(880px,0,0);transform:translate3d(880px,0,0)}}.mm-wrapper_opening .mm-menu_columns-2.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-80vw,0,0);transform:translate3d(-80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-2.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-240px,0,0);transform:translate3d(-240px,0,0)}}@media all and (min-width:1100px){.mm-wrapper_opening .mm-menu_columns-2.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-880px,0,0);transform:translate3d(-880px,0,0)}}[class*=mm-menu_columns-] .mm-panels>.mm-panel_columns-3{-webkit-transform:translate3d(300%,0,0);transform:translate3d(300%,0,0)}.mm-menu_columns-3 .mm-panels>.mm-panel{z-index:3;width:33.34%}.mm-menu_columns-3 .mm-panels>.mm-panel else{width:100%}.mm-menu_columns-3 .mm-panels>.mm-panel:not(.mm-panel_opened):not(.mm-panel_opened-parent){-webkit-transform:translate3d(400%,0,0);transform:translate3d(400%,0,0)}.mm-menu_columns-3{width:80%;min-width:240px;max-width:1320px}.mm-wrapper_opening .mm-menu_columns-3.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(80vw,0,0);transform:translate3d(80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-3.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(240px,0,0);transform:translate3d(240px,0,0)}}@media all and (min-width:1650px){.mm-wrapper_opening .mm-menu_columns-3.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(1320px,0,0);transform:translate3d(1320px,0,0)}}.mm-wrapper_opening .mm-menu_columns-3.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-80vw,0,0);transform:translate3d(-80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-3.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-240px,0,0);transform:translate3d(-240px,0,0)}}@media all and (min-width:1650px){.mm-wrapper_opening .mm-menu_columns-3.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-1320px,0,0);transform:translate3d(-1320px,0,0)}}[class*=mm-menu_columns-] .mm-panels>.mm-panel_columns-4{-webkit-transform:translate3d(400%,0,0);transform:translate3d(400%,0,0)}.mm-menu_columns-4 .mm-panels>.mm-panel{z-index:4;width:25%}.mm-menu_columns-4 .mm-panels>.mm-panel else{width:100%}.mm-menu_columns-4 .mm-panels>.mm-panel:not(.mm-panel_opened):not(.mm-panel_opened-parent){-webkit-transform:translate3d(500%,0,0);transform:translate3d(500%,0,0)}.mm-menu_columns-4{width:80%;min-width:240px;max-width:1760px}.mm-wrapper_opening .mm-menu_columns-4.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(80vw,0,0);transform:translate3d(80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-4.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(240px,0,0);transform:translate3d(240px,0,0)}}@media all and (min-width:2200px){.mm-wrapper_opening .mm-menu_columns-4.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(1760px,0,0);transform:translate3d(1760px,0,0)}}.mm-wrapper_opening .mm-menu_columns-4.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-80vw,0,0);transform:translate3d(-80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_columns-4.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-240px,0,0);transform:translate3d(-240px,0,0)}}@media all and (min-width:2200px){.mm-wrapper_opening .mm-menu_columns-4.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-1760px,0,0);transform:translate3d(-1760px,0,0)}}[class*=mm-menu_columns-].mm-menu_position-bottom,[class*=mm-menu_columns-].mm-menu_position-top{width:100%;max-width:100%;min-width:100%}.mm-wrapper_opening [class*=mm-menu_columns-].mm-menu_position-front{-webkit-transition-property:width,min-width,max-width,-webkit-transform;transition-property:width,min-width,max-width,-webkit-transform;-o-transition-property:width,min-width,max-width,transform;transition-property:width,min-width,max-width,transform;transition-property:width,min-width,max-width,transform,-webkit-transform} +.mm-counter{color:rgba(0,0,0,.3);color:var(--mm-color-text-dimmed);text-align:right;display:block;min-width:44px;float:right}.mm-listitem_nosubitems>.mm-counter{display:none}[dir=rtl] .mm-counter{text-align:left;float:left} +.mm-listitem_divider{opacity:1;-webkit-transition:opacity .4s ease;-o-transition:opacity .4s ease;transition:opacity .4s ease}.mm-menu_dividers-light .mm-listitem_divider{background:inherit;font-size:inherit;color:rgba(0,0,0,.3);color:var(--mm-color-text-dimmed);padding-top:18px;padding-top:calc((var(--mm-listitem-size) - var(--mm-line-height)) * .75);padding-bottom:6px;padding-bottom:calc((var(--mm-listitem-size) - var(--mm-line-height)) * .25)}.mm-menu_border-none .mm-listitem_divider{border-top-width:1px;border-top-style:solid}.mm-listview_fixeddivider{background:inherit;display:none;width:100%;position:absolute;top:0;left:0;right:0;z-index:10}.mm-listview_fixeddivider:after{content:none!important;display:none!important}.mm-panel_dividers .mm-listview_fixeddivider{display:block} +.mm-wrapper_opened.mm-dragging .mm-menu,.mm-wrapper_opened.mm-dragging .mm-slideout{-webkit-transition-duration:0s;-o-transition-duration:0s;transition-duration:0s} +.mm-menu_dropdown{-webkit-box-shadow:0 2px 10px rgba(0,0,0,.3);box-shadow:0 2px 10px rgba(0,0,0,.3);height:80%}.mm-wrapper_dropdown .mm-slideout{-webkit-transform:none!important;-ms-transform:none!important;transform:none!important;z-index:0}.mm-wrapper_dropdown .mm-wrapper__blocker{-webkit-transition-delay:0s!important;-o-transition-delay:0s!important;transition-delay:0s!important;z-index:1}.mm-wrapper_dropdown .mm-menu_dropdown{z-index:2}.mm-wrapper_dropdown.mm-wrapper_opened:not(.mm-wrapper_opening) .mm-menu_dropdown{display:none}[class*=mm-menu_tip-]:before{content:'';background:inherit;-webkit-box-shadow:0 2px 10px rgba(0,0,0,.3);box-shadow:0 2px 10px rgba(0,0,0,.3);display:block;width:15px;height:15px;position:absolute;z-index:0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.mm-menu_tip-left:before{left:22px}.mm-menu_tip-right:before{right:22px}.mm-menu_tip-top:before{top:-8px}.mm-menu_tip-bottom:before{bottom:-8px} +.mm-menu{--mm-iconbar-size:44px}.mm-iconbar{color:rgba(0,0,0,.3);color:var(--mm-color-text-dimmed);border:0 solid rgba(0,0,0,.1);border-color:var(--mm-color-border);border-right-width:1px;text-align:center;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;width:44px;width:var(--mm-iconbar-size);position:absolute;top:0;left:0;bottom:0;z-index:2}.mm-menu_iconbar .mm-navbars_bottom,.mm-menu_iconbar .mm-navbars_top,.mm-menu_iconbar .mm-panels{left:44px;left:var(--mm-iconbar-size)}.mm-iconbar__bottom,.mm-iconbar__top{width:inherit;position:absolute}.mm-iconbar__bottom>*,.mm-iconbar__top>*{-webkit-box-sizing:border-box;box-sizing:border-box;display:block;padding:11px 0}.mm-iconbar__bottom a,.mm-iconbar__bottom a:hover,.mm-iconbar__top a,.mm-iconbar__top a:hover{text-decoration:none}.mm-iconbar__top{top:0}.mm-iconbar__bottom{bottom:0}.mm-iconbar__tab_selected{background:rgba(255,255,255,.4);background:var(--mm-color-background-emphasis)} +.mm-menu{--mm-iconpanel-size:44px}.mm-panel_iconpanel-1,.mm-panel_iconpanel-1.mm-panel_opened~.mm-listview_fixeddivider{width:calc(100% - (44px * 1));width:calc(100% - (var(--mm-iconpanel-size) * 1))}.mm-panel_iconpanel-2,.mm-panel_iconpanel-2.mm-panel_opened~.mm-listview_fixeddivider{width:calc(100% - (44px * 2));width:calc(100% - (var(--mm-iconpanel-size) * 2))}.mm-panel_iconpanel-3,.mm-panel_iconpanel-3.mm-panel_opened~.mm-listview_fixeddivider{width:calc(100% - (44px * 3));width:calc(100% - (var(--mm-iconpanel-size) * 3))}.mm-panel_iconpanel-first~.mm-panel,.mm-panel_iconpanel-first~.mm-panel_opened~.mm-listview_fixeddivider{width:calc(100% - 44px);width:calc(100% - var(--mm-iconpanel-size))}.mm-menu_iconpanel .mm-panels>.mm-listview_fixeddivider,.mm-menu_iconpanel .mm-panels>.mm-panel{left:auto;-webkit-transition-property:width,-webkit-transform;transition-property:width,-webkit-transform;-o-transition-property:transform,width;transition-property:transform,width;transition-property:transform,width,-webkit-transform}.mm-menu_iconpanel .mm-panels>.mm-panel:not(.mm-panel_iconpanel-first):not(.mm-panel_iconpanel-0){border-left-width:1px;border-left-style:solid}.mm-menu_iconpanel .mm-panels>.mm-panel_opened,.mm-menu_iconpanel .mm-panels>.mm-panel_opened-parent{display:block!important}.mm-menu_iconpanel .mm-panels>.mm-panel_opened-parent{overflow-y:hidden;-webkit-transform:unset;-ms-transform:unset;transform:unset}.mm-menu_hidedivider .mm-panel_opened-parent .mm-listitem_divider,.mm-menu_hidenavbar .mm-panel_opened-parent .mm-navbar{opacity:0}.mm-panel__blocker{background:inherit;opacity:0;display:block;position:absolute;top:0;right:0;left:0;z-index:3;-webkit-transition:opacity .4s ease;-o-transition:opacity .4s ease;transition:opacity .4s ease}.mm-panel_opened-parent .mm-panel__blocker{opacity:.6;bottom:-100000px}[dir=rtl] .mm-menu_iconpanel .mm-panels>.mm-listview_fixeddivider,[dir=rtl] .mm-menu_iconpanel .mm-panels>.mm-panel{left:0;right:auto;-webkit-transition-property:width,-webkit-transform;transition-property:width,-webkit-transform;-o-transition-property:transform,width;transition-property:transform,width;transition-property:transform,width,-webkit-transform}[dir=rtl] .mm-menu_iconpanel .mm-panels>.mm-panel:not(.mm-panel_iconpanel-first):not(.mm-panel_iconpanel-0){border-left:none;border-right:1px solid;border-color:inherit} +.mm-menu_keyboardfocus a:focus,.mm-menu_keyboardfocus.mm-menu_opened~.mm-wrapper__blocker a:focus{outline:0;background:rgba(255,255,255,.4);background:var(--mm-color-background-emphasis)}.mm-wrapper__blocker .mm-tabstart{cursor:default;display:block;width:100%;height:100%}.mm-wrapper__blocker .mm-tabend{opacity:0;position:absolute;bottom:0} +.mm-navbars_bottom,.mm-navbars_top{background:inherit;border-color:inherit;border-width:0;position:absolute;left:0;right:0;z-index:1}.mm-navbars_bottom>.mm-navbar,.mm-navbars_top>.mm-navbar{border-width:0;display:-webkit-box;display:-ms-flexbox;display:flex;position:relative}.mm-navbars_bottom>.mm-navbar:not(.mm-navbar_has-btns),.mm-navbars_top>.mm-navbar:not(.mm-navbar_has-btns){padding:0}.mm-navbars_bottom>.mm-navbar>:not(img):not(.mm-btn),.mm-navbars_top>.mm-navbar>:not(img):not(.mm-btn){-webkit-box-flex:1;-ms-flex:1;flex:1}.mm-navbars_top{border-bottom-style:solid;border-bottom-width:1px;top:0;bottom:auto}.mm-menu_navbar_top-1 .mm-panels{top:44px;top:calc(var(--mm-navbar-size) * 1)}.mm-menu_navbar_top-2 .mm-panels{top:88px;top:calc(var(--mm-navbar-size) * 2)}.mm-menu_navbar_top-3 .mm-panels{top:132px;top:calc(var(--mm-navbar-size) * 3)}.mm-menu_navbar_top-4 .mm-panels{top:176px;top:calc(var(--mm-navbar-size) * 4)}.mm-navbars_bottom{border-top-style:solid;border-top-width:1px;bottom:0;top:auto}.mm-menu_navbar_bottom-1 .mm-panels{bottom:44px;bottom:calc(var(--mm-navbar-size) * 1)}.mm-menu_navbar_bottom-2 .mm-panels{bottom:88px;bottom:calc(var(--mm-navbar-size) * 2)}.mm-menu_navbar_bottom-3 .mm-panels{bottom:132px;bottom:calc(var(--mm-navbar-size) * 3)}.mm-menu_navbar_bottom-4 .mm-panels{bottom:176px;bottom:calc(var(--mm-navbar-size) * 4)}.mm-navbar_size-2{height:88px;height:calc(var(--mm-navbar-size) * 2)}.mm-navbar_size-3{height:132px;height:calc(var(--mm-navbar-size) * 3)}.mm-navbar_size-4{height:176px;height:calc(var(--mm-navbar-size) * 4)}.mm-navbar__breadcrumbs{-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;-webkit-overflow-scrolling:touch;overflow-x:auto;text-align:left;padding:0 0 0 20px}.mm-navbar__breadcrumbs>*{display:inline-block;padding-right:6px;padding-top:12px;padding-top:calc((var(--mm-navbar-size) - var(--mm-line-height)) * .5);padding-bottom:12px;padding-bottom:calc((var(--mm-navbar-size) - var(--mm-line-height)) * .5)}.mm-navbar__breadcrumbs>a{text-decoration:underline}.mm-navbar_has-btns .mm-navbar__breadcrumbs{margin-left:-44px}.mm-navbar_has-btns .mm-btn:not(.mm-hidden)+.mm-navbar__breadcrumbs{margin-left:0;padding-left:0}.mm-navbar__tab_selected{background:inherit!important;color:inherit!important;border-width:1px;border-style:solid;border-color:inherit}.mm-navbar__tab_selected:first-child{border-left:none}.mm-navbar__tab_selected:last-child{border-right:none}.mm-navbars_top.mm-navbars_has-tabs .mm-navbar_tabs,.mm-navbars_top.mm-navbars_has-tabs .mm-navbar_tabs~.mm-navbar{background:inherit!important;color:inherit!important}.mm-navbars_top .mm-navbar_tabs:not(:last-child){border-bottom-width:1px;border-bottom-style:solid}.mm-navbars_top .mm-navbar__tab_selected{border-bottom:none;margin-bottom:-1px}.mm-navbars_top .mm-navbar_tabs:first-child .mm-navbar__tab_selected{border-top:none}.mm-navbars_bottom.mm-navbars_has-tabs .mm-navbar{background:inherit;color:inherit}.mm-navbars_bottom .mm-navbar_tabs:not(:first-child){border-top-width:1px;border-top-style:solid}.mm-navbars_bottom .mm-navbar__tab_selected{border-top:none;margin-top:-1px}.mm-navbars_bottom .mm-navbar_tabs:last-child .mm-navbar__tab_selected{border-bottom:none}.mm-navbar_tabs>a:not(.mm-navbar__tab_selected),.mm-navbars_bottom.mm-navbars_has-tabs .mm-navbar_tabs~.mm-navbar,.mm-navbars_top.mm-navbars_has-tabs>.mm-navbar:not(.mm-navbar_tabs){background:rgba(255,255,255,.4);background:var(--mm-color-background-emphasis);color:rgba(0,0,0,.3);color:var(--mm-color-text-dimmed)} +.mm-searchfield{height:44px;height:var(--mm-navbar-size);padding:0;display:-webkit-box;display:-ms-flexbox;display:flex}.mm-searchfield input{border:none!important;outline:0!important;-webkit-box-shadow:none!important;box-shadow:none!important;border-radius:4px;background:rgba(0,0,0,.05);background:var(--mm-color-background-highlight);color:rgba(0,0,0,.75);color:var(--mm-color-text);font:inherit;font-size:inherit;line-height:35.2px;line-height:calc(var(--mm-navbar-size) * .7);display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;max-width:100%;height:24px;height:calc(var(--mm-navbar-size) * .7);min-height:unset;max-height:unset;margin:0;padding:0 10px}.mm-searchfield input::-ms-clear{display:none}.mm-searchfield__input{padding:6.6px 10px 0 10px;padding-top:calc(var(--mm-navbar-size) * .15);position:relative}.mm-panel__noresultsmsg{color:rgba(0,0,0,.3);color:var(--mm-color-text-dimmed);text-align:center;font-size:150%;padding:44px 0}.mm-searchfield__btn{position:absolute;right:0;top:0;bottom:0}.mm-panel_search{left:0!important;right:0!important;width:100%!important;border-left:none!important}.mm-searchfield__input{-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;max-width:100%}.mm-searchfield__cancel{line-height:44px;line-height:var(--mm-navbar-size);text-decoration:none;display:block;padding-right:10px;margin-right:-100px;-webkit-transition:margin .4s ease;-o-transition:margin .4s ease;transition:margin .4s ease}.mm-searchfield__cancel-active{margin-right:0}.mm-panel>.mm-searchfield{width:100%;position:absolute;top:0;left:0}.mm-panel_has-searchfield{padding-top:44px;padding-top:var(--mm-navbar-size)}.mm-panel_has-navbar.mm-panel_has-searchfield{padding-top:88px;padding-top:calc(var(--mm-navbar-size) * 2)}.mm-panel_has-navbar.mm-panel_has-searchfield>.mm-searchfield{top:44px;top:var(--mm-navbar-size)}.mm-listitem_nosubitems>.mm-listitem__btn{display:none}.mm-listitem_nosubitems>.mm-listitem__text{padding-right:10px} +.mm-sectionindexer{background:inherit;text-align:center;font-size:12px;-webkit-box-sizing:border-box;box-sizing:border-box;width:20px;position:absolute;top:0;bottom:0;right:-20px;z-index:15;-webkit-transition:right .4s ease;-o-transition:right .4s ease;transition:right .4s ease;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:space-evenly;-ms-flex-pack:space-evenly;justify-content:space-evenly}.mm-sectionindexer a{color:rgba(0,0,0,.3);color:var(--mm-color-text-dimmed);line-height:1;text-decoration:none;display:block}.mm-sectionindexer~.mm-panels{-webkit-transition:right .4s ease;-o-transition:right .4s ease;transition:right .4s ease}.mm-menu_has-sectionindexer .mm-sectionindexer{right:0}.mm-menu_has-sectionindexer .mm-panels{right:20px}.mm-menu_navbar_top-1 .mm-sectionindexer{top:46px;top:calc((var(--mm-navbar-size) * 1) + 2px)}.mm-menu_navbar_top-2 .mm-sectionindexer{top:90px;top:calc((var(--mm-navbar-size) * 2) + 2px)}.mm-menu_navbar_top-3 .mm-sectionindexer{top:134px;top:calc((var(--mm-navbar-size) * 3) + 2px)}.mm-menu_navbar_top-4 .mm-sectionindexer{top:178px;top:calc((var(--mm-navbar-size) * 4) + 2px)}.mm-menu_navbar_bottom-1 .mm-sectionindexer{bottom:46px;bottom:calc((var(--mm-navbar-size) * 1) + 2px)}.mm-menu_navbar_bottom-2 .mm-sectionindexer{bottom:90px;bottom:calc((var(--mm-navbar-size) * 2) + 2px)}.mm-menu_navbar_bottom-3 .mm-sectionindexer{bottom:134px;bottom:calc((var(--mm-navbar-size) * 3) + 2px)}.mm-menu_navbar_bottom-4 .mm-sectionindexer{bottom:178px;bottom:calc((var(--mm-navbar-size) * 4) + 2px)} +.mm-menu_selected-hover .mm-listitem>.mm-listitem__btn,.mm-menu_selected-hover .mm-listitem>.mm-listitem__text,.mm-menu_selected-parent .mm-listitem>.mm-listitem__btn,.mm-menu_selected-parent .mm-listitem>.mm-listitem__text{-webkit-transition:background .4s ease;-o-transition:background .4s ease;transition:background .4s ease}.mm-menu_selected-hover .mm-listview:hover>.mm-listitem_selected .mm-listitem__text{background:0 0}.mm-menu_selected-hover .mm-listitem__btn:hover,.mm-menu_selected-hover .mm-listitem__text:hover{background:rgba(255,255,255,.4);background:var(--mm-color-background-emphasis)}.mm-menu_selected-parent .mm-panel_opened-parent .mm-listitem:not(.mm-listitem_selected-parent) .mm-listitem__text{background:0 0}.mm-menu_selected-parent .mm-listitem_selected-parent>.mm-listitem__btn,.mm-menu_selected-parent .mm-listitem_selected-parent>.mm-listitem__text{background:rgba(255,255,255,.4);background:var(--mm-color-background-emphasis)} +.mm-menu,.mm-slideout{--mm-sidebar-collapsed-size:44px;--mm-sidebar-expanded-size:440px}.mm-wrapper_sidebar-collapsed body,.mm-wrapper_sidebar-expanded body{position:relative}.mm-wrapper_sidebar-collapsed .mm-slideout,.mm-wrapper_sidebar-expanded .mm-slideout{-webkit-transition-property:width,-webkit-transform;transition-property:width,-webkit-transform;-o-transition-property:width,transform;transition-property:width,transform;transition-property:width,transform,-webkit-transform}.mm-wrapper_sidebar-collapsed .mm-page,.mm-wrapper_sidebar-expanded .mm-page{background:inherit;-webkit-box-sizing:border-box;box-sizing:border-box;min-height:100vh}.mm-wrapper_sidebar-collapsed .mm-menu_sidebar-collapsed,.mm-wrapper_sidebar-expanded .mm-menu_sidebar-expanded{display:block!important;top:0!important;right:auto!important;bottom:0!important;left:0!important}.mm-wrapper_sidebar-collapsed:not(.mm-wrapper_opening) .mm-menu_hidedivider .mm-listitem_divider,.mm-wrapper_sidebar-collapsed:not(.mm-wrapper_opening) .mm-menu_hidenavbar .mm-navbar{opacity:0}.mm-wrapper_sidebar-collapsed .mm-slideout{width:calc(100% - 44px);width:calc(100% - var(--mm-sidebar-collapsed-size));-webkit-transform:translate3d(44px,0,0);transform:translate3d(44px,0,0);-webkit-transform:translate3d(var(--mm-sidebar-collapsed-size),0,0);transform:translate3d(var(--mm-sidebar-collapsed-size),0,0)}.mm-wrapper_sidebar-expanded .mm-menu_sidebar-expanded{border-right-width:1px;border-right-style:solid;min-width:0!important;max-width:100000px!important}.mm-wrapper_sidebar-expanded .mm-menu_sidebar-expanded.mm-menu_pageshadow:after{content:none;display:none}.mm-wrapper_sidebar-expanded.mm-wrapper_blocking,.mm-wrapper_sidebar-expanded.mm-wrapper_blocking body{overflow:visible}.mm-wrapper_sidebar-expanded .mm-wrapper__blocker{display:none!important}.mm-wrapper_sidebar-expanded:not(.mm-wrapper_sidebar-closed) .mm-menu_sidebar-expanded.mm-menu_opened~.mm-slideout{width:calc(100% - 440px);width:calc(100% - var(--mm-sidebar-expanded-size));-webkit-transform:translate3d(440px,0,0);transform:translate3d(440px,0,0);-webkit-transform:translate3d(var(--mm-sidebar-expanded-size),0,0);transform:translate3d(var(--mm-sidebar-expanded-size),0,0)}.mm-wrapper_sidebar-expanded .mm-menu_sidebar-expanded{width:440px;width:var(--mm-sidebar-expanded-size)}.mm-menu__blocker{background:rgba(3,2,1,0);display:block;position:absolute;top:0;right:0;bottom:0;left:0;z-index:3}.mm-menu_opened .mm-menu__blocker{display:none}[dir=rtl].mm-wrapper_sidebar-collapsed .mm-slideout{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}[dir=rtl].mm-wrapper_sidebar-expanded .mm-slideout{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}[dir=rtl].mm-wrapper_sidebar-expanded:not(.mm-wrapper_sidebar-closed) .mm-menu_sidebar-expanded.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)} +label.mm-toggle{border-radius:34px;min-width:58px;width:58px;height:34px;margin:0 10px;margin-top:5px;margin-top:calc((var(--mm-listitem-size) - 34px)/ 2)}label.mm-toggle:before{content:'';display:block;border-radius:34px;width:32px;height:32px;margin:1px}input.mm-toggle{position:absolute;left:-10000px}input.mm-toggle:checked~label.mm-toggle:before{float:right}label.mm-toggle{background:rgba(0,0,0,.1);background:var(--mm-color-border)}label.mm-toggle:before{background:#f3f3f3;background:var(--mm-color-background)}input.mm-toggle:checked~label.mm-toggle{background:#4bd963}label.mm-check{width:34px;height:34px}label.mm-check:before{border-color:rgba(0,0,0,.75);border-color:var(--mm-color-text);content:'';display:block;border-left:3px solid;border-bottom:3px solid;width:40%;height:20%;margin:25% 0 0 20%;opacity:.1;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg)}input.mm-check{position:absolute;left:-10000px}input.mm-check:checked~label.mm-check:before{opacity:1}[dir=rtl] input.mm-toggle:checked~label.mm-toggle:before{float:left} +.mm-menu_border-none .mm-listitem:after,.mm-panel_border-none .mm-listitem:after{content:none}.mm-menu_border-full .mm-listitem:after,.mm-panel_border-full .mm-listitem:after{left:0!important}.mm-menu_border-offset .mm-listitem:after,.mm-panel_border-offset .mm-listitem:after{right:20px} +.mm-menu_fx-menu-zoom{-webkit-transition:-webkit-transform .4s ease;transition:-webkit-transform .4s ease;-o-transition:transform .4s ease;transition:transform .4s ease;transition:transform .4s ease,-webkit-transform .4s ease}.mm-wrapper_opened .mm-menu_fx-menu-zoom{-webkit-transform:scale(.7,.7) translate3d(-30%,0,0);transform:scale(.7,.7) translate3d(-30%,0,0);-webkit-transform-origin:left center;-ms-transform-origin:left center;transform-origin:left center}.mm-wrapper_opening .mm-menu_fx-menu-zoom{-webkit-transform:scale(1,1) translate3d(0,0,0);transform:scale(1,1) translate3d(0,0,0)}.mm-wrapper_opened .mm-menu_fx-menu-zoom.mm-menu_position-right{-webkit-transform:scale(.7,.7) translate3d(30%,0,0);transform:scale(.7,.7) translate3d(30%,0,0);-webkit-transform-origin:right center;-ms-transform-origin:right center;transform-origin:right center}.mm-wrapper_opening .mm-menu_fx-menu-zoom.mm-menu_position-right{-webkit-transform:scale(1,1) translate3d(0,0,0);transform:scale(1,1) translate3d(0,0,0)}.mm-menu_fx-menu-slide{-webkit-transition:-webkit-transform .4s ease;transition:-webkit-transform .4s ease;-o-transition:transform .4s ease;transition:transform .4s ease;transition:transform .4s ease,-webkit-transform .4s ease}.mm-wrapper_opened .mm-menu_fx-menu-slide{-webkit-transform:translate3d(-30%,0,0);transform:translate3d(-30%,0,0)}.mm-wrapper_opening .mm-menu_fx-menu-slide{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-wrapper_opened .mm-menu_fx-menu-slide.mm-menu_position-right{-webkit-transform:translate3d(30%,0,0);transform:translate3d(30%,0,0)}.mm-wrapper_opening .mm-menu_fx-menu-slide.mm-menu_position-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-menu_fx-menu-fade{opacity:0;-webkit-transition:opacity .4s ease;-o-transition:opacity .4s ease;transition:opacity .4s ease}.mm-wrapper_opening .mm-menu_fx-menu-fade{opacity:1}.mm-menu_fx-panels-none .mm-panel,.mm-panel_fx-none{-webkit-transition-property:none;-o-transition-property:none;transition-property:none}.mm-menu_fx-panels-none .mm-panel.mm-panel_opened-parent,.mm-panel_fx-none.mm-panel_opened-parent{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-menu_fx-panels-zoom .mm-panel,.mm-panel_fx-zoom{-webkit-transform-origin:left center;-ms-transform-origin:left center;transform-origin:left center;-webkit-transform:scale(1.5,1.5) translate3d(100%,0,0);transform:scale(1.5,1.5) translate3d(100%,0,0)}.mm-menu_fx-panels-zoom .mm-panel.mm-panel_opened,.mm-panel_fx-zoom.mm-panel_opened{-webkit-transform:scale(1,1) translate3d(0,0,0);transform:scale(1,1) translate3d(0,0,0)}.mm-menu_fx-panels-zoom .mm-panel.mm-panel_opened-parent,.mm-panel_fx-zoom.mm-panel_opened-parent{-webkit-transform:scale(.7,.7) translate3d(-30%,0,0);transform:scale(.7,.7) translate3d(-30%,0,0)}.mm-menu_fx-panels-slide-0 .mm-panel_opened-parent,.mm-panel_fx-slide-0.mm-panel_opened-parent{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-menu_fx-panels-slide-100 .mm-panel_opened-parent,.mm-panel_fx-slide-100.mm-panel_opened-parent{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.mm-menu_fx-panels-slide-up .mm-panel,.mm-panel_fx-slide-up{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.mm-menu_fx-panels-slide-up .mm-panel_opened,.mm-menu_fx-panels-slide-up .mm-panel_opened-parent,.mm-panel_fx-slide-up.mm-panel_opened{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mm-menu_fx-panels-slide-right .mm-panel,.mm-panel_fx-slide-right{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.mm-menu_fx-panels-slide-right .mm-panel_opened,.mm-menu_fx-panels-slide-right .mm-panel_opened-parent,.mm-panel_fx-slide-right.mm-panel_opened{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}[class*=mm-menu_fx-listitems-] .mm-listitem{-webkit-transition:none .4s ease;-o-transition:none .4s ease;transition:none .4s ease}[class*=mm-menu_fx-listitems-] .mm-listitem:nth-child(1){-webkit-transition-delay:50ms;-o-transition-delay:50ms;transition-delay:50ms}[class*=mm-menu_fx-listitems-] .mm-listitem:nth-child(2){-webkit-transition-delay:.1s;-o-transition-delay:.1s;transition-delay:.1s}[class*=mm-menu_fx-listitems-] .mm-listitem:nth-child(3){-webkit-transition-delay:150ms;-o-transition-delay:150ms;transition-delay:150ms}[class*=mm-menu_fx-listitems-] .mm-listitem:nth-child(4){-webkit-transition-delay:.2s;-o-transition-delay:.2s;transition-delay:.2s}[class*=mm-menu_fx-listitems-] .mm-listitem:nth-child(5){-webkit-transition-delay:250ms;-o-transition-delay:250ms;transition-delay:250ms}[class*=mm-menu_fx-listitems-] .mm-listitem:nth-child(6){-webkit-transition-delay:.3s;-o-transition-delay:.3s;transition-delay:.3s}[class*=mm-menu_fx-listitems-] .mm-listitem:nth-child(7){-webkit-transition-delay:350ms;-o-transition-delay:350ms;transition-delay:350ms}[class*=mm-menu_fx-listitems-] .mm-listitem:nth-child(8){-webkit-transition-delay:.4s;-o-transition-delay:.4s;transition-delay:.4s}[class*=mm-menu_fx-listitems-] .mm-listitem:nth-child(9){-webkit-transition-delay:450ms;-o-transition-delay:450ms;transition-delay:450ms}[class*=mm-menu_fx-listitems-] .mm-listitem:nth-child(10){-webkit-transition-delay:.5s;-o-transition-delay:.5s;transition-delay:.5s}[class*=mm-menu_fx-listitems-] .mm-listitem:nth-child(11){-webkit-transition-delay:550ms;-o-transition-delay:550ms;transition-delay:550ms}[class*=mm-menu_fx-listitems-] .mm-listitem:nth-child(12){-webkit-transition-delay:.6s;-o-transition-delay:.6s;transition-delay:.6s}[class*=mm-menu_fx-listitems-] .mm-listitem:nth-child(13){-webkit-transition-delay:650ms;-o-transition-delay:650ms;transition-delay:650ms}[class*=mm-menu_fx-listitems-] .mm-listitem:nth-child(14){-webkit-transition-delay:.7s;-o-transition-delay:.7s;transition-delay:.7s}[class*=mm-menu_fx-listitems-] .mm-listitem:nth-child(15){-webkit-transition-delay:750ms;-o-transition-delay:750ms;transition-delay:750ms}.mm-menu_fx-listitems-slide .mm-listitem{-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;-o-transition-property:transform,opacity;transition-property:transform,opacity;transition-property:transform,opacity,-webkit-transform;-webkit-transform:translate3d(50%,0,0);transform:translate3d(50%,0,0);opacity:0}.mm-wrapper_opening .mm-menu_fx-listitems-slide .mm-panel_opened .mm-listitem{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.mm-menu_fx-listitems-fade .mm-listitem{-webkit-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity;opacity:0}.mm-wrapper_opening .mm-menu_fx-listitems-fade .mm-panel_opened .mm-listitem{opacity:1}.mm-menu_fx-listitems-drop .mm-listitem{-webkit-transition-property:opacity,top;-o-transition-property:opacity,top;transition-property:opacity,top;opacity:0;top:-25%}.mm-wrapper_opening .mm-menu_fx-listitems-drop .mm-panel_opened .mm-listitem{opacity:1;top:0} +.mm-menu_fullscreen{width:100%;min-width:140px;max-width:10000px}.mm-wrapper_opening .mm-menu_fullscreen.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(100vw,0,0);transform:translate3d(100vw,0,0)}@media all and (max-width:140px){.mm-wrapper_opening .mm-menu_fullscreen.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(140px,0,0);transform:translate3d(140px,0,0)}}@media all and (min-width:10000px){.mm-wrapper_opening .mm-menu_fullscreen.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(10000px,0,0);transform:translate3d(10000px,0,0)}}.mm-wrapper_opening .mm-menu_fullscreen.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-100vw,0,0);transform:translate3d(-100vw,0,0)}@media all and (max-width:140px){.mm-wrapper_opening .mm-menu_fullscreen.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-140px,0,0);transform:translate3d(-140px,0,0)}}@media all and (min-width:10000px){.mm-wrapper_opening .mm-menu_fullscreen.mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-10000px,0,0);transform:translate3d(-10000px,0,0)}}.mm-menu_fullscreen.mm-menu_position-top{height:100vh;min-height:140px;max-height:10000px}.mm-menu_fullscreen.mm-menu_position-bottom{height:100vh;min-height:140px;max-height:10000px} +.mm-menu_listview-justify .mm-panels>.mm-panel:after,.mm-menu_listview-justify .mm-panels>.mm-panel:before,.mm-panels>.mm-panel_listview-justify:after,.mm-panels>.mm-panel_listview-justify:before{content:none;display:none}.mm-menu_listview-justify .mm-panels>.mm-panel .mm-listview,.mm-panels>.mm-panel_listview-justify .mm-listview{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%;margin-top:0;margin-bottom:0}.mm-menu_listview-justify .mm-panels>.mm-panel .mm-listitem,.mm-panels>.mm-panel_listview-justify .mm-listitem{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-height:44px}.mm-menu_listview-justify .mm-panels>.mm-panel .mm-listitem:not(.mm-listitem_divider),.mm-panels>.mm-panel_listview-justify .mm-listitem:not(.mm-listitem_divider){display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.mm-menu_listview-justify .mm-panels>.mm-panel .mm-listitem__text,.mm-panels>.mm-panel_listview-justify .mm-listitem__text{-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.mm-listview_inset{list-style:inside disc;width:100%;padding:0 30px 15px 30px;margin:0}.mm-listview_inset .mm-listitem{padding:5px 0} +.mm-menu_multiline .mm-listitem__text,.mm-panel_multiline .mm-listitem__text{-o-text-overflow:clip;text-overflow:clip;white-space:normal} +[class*=mm-menu_pagedim].mm-menu_opened~.mm-wrapper__blocker{opacity:0}.mm-wrapper_opening [class*=mm-menu_pagedim].mm-menu_opened~.mm-wrapper__blocker{opacity:.3;-webkit-transition:opacity .4s ease .4s;-o-transition:opacity .4s ease .4s;transition:opacity .4s ease .4s}.mm-menu_opened.mm-menu_pagedim~.mm-wrapper__blocker{background:inherit}.mm-menu_opened.mm-menu_pagedim-black~.mm-wrapper__blocker{background:#000}.mm-menu_opened.mm-menu_pagedim-white~.mm-wrapper__blocker{background:#fff} +.mm-menu_popup{-webkit-transition:opacity .4s ease;-o-transition:opacity .4s ease;transition:opacity .4s ease;opacity:0;-webkit-box-shadow:0 2px 10px rgba(0,0,0,.3);box-shadow:0 2px 10px rgba(0,0,0,.3);height:80%;min-height:140px;max-height:880px;top:50%;left:50%;bottom:auto;right:auto;z-index:2;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}.mm-menu_popup.mm-menu_opened~.mm-slideout{-webkit-transform:none!important;-ms-transform:none!important;transform:none!important;z-index:0}.mm-menu_popup.mm-menu_opened~.mm-wrapper__blocker{-webkit-transition-delay:0s!important;-o-transition-delay:0s!important;transition-delay:0s!important;z-index:1}.mm-wrapper_opening .mm-menu_popup{opacity:1} +.mm-menu_position-right{left:auto;right:0}.mm-wrapper_opening .mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-80vw,0,0);transform:translate3d(-80vw,0,0)}@media all and (max-width:300px){.mm-wrapper_opening .mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-240px,0,0);transform:translate3d(-240px,0,0)}}@media all and (min-width:550px){.mm-wrapper_opening .mm-menu_position-right.mm-menu_opened~.mm-slideout{-webkit-transform:translate3d(-440px,0,0);transform:translate3d(-440px,0,0)}}.mm-menu_position-bottom,.mm-menu_position-front,.mm-menu_position-top{-webkit-transition:-webkit-transform .4s ease;transition:-webkit-transform .4s ease;-o-transition:transform .4s ease;transition:transform .4s ease;transition:transform .4s ease,-webkit-transform .4s ease}.mm-menu_position-bottom.mm-menu_opened,.mm-menu_position-front.mm-menu_opened,.mm-menu_position-top.mm-menu_opened{z-index:2}.mm-menu_position-bottom.mm-menu_opened~.mm-slideout,.mm-menu_position-front.mm-menu_opened~.mm-slideout,.mm-menu_position-top.mm-menu_opened~.mm-slideout{-webkit-transform:none!important;-ms-transform:none!important;transform:none!important;z-index:0}.mm-menu_position-bottom.mm-menu_opened~.mm-wrapper__blocker,.mm-menu_position-front.mm-menu_opened~.mm-wrapper__blocker,.mm-menu_position-top.mm-menu_opened~.mm-wrapper__blocker{z-index:1}.mm-menu_position-front{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.mm-menu_position-front.mm-menu_position-right{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.mm-menu_position-bottom,.mm-menu_position-top{width:100%;min-width:100%;max-width:100%}.mm-menu_position-top{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.mm-menu_position-top{height:80vh;min-height:140px;max-height:880px}.mm-menu_position-bottom{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);top:auto}.mm-menu_position-bottom{height:80vh;min-height:140px;max-height:880px}.mm-wrapper_opening .mm-menu_position-bottom,.mm-wrapper_opening .mm-menu_position-front,.mm-wrapper_opening .mm-menu_position-top{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)} +.mm-menu_shadow-page:after{-webkit-box-shadow:0 0 10px rgba(0,0,0,.3);box-shadow:0 0 10px rgba(0,0,0,.3);-webkit-box-shadow:var(--mm-shadow);box-shadow:var(--mm-shadow);content:"";display:block;width:20px;height:120%;position:absolute;left:100%;top:-10%;z-index:100;-webkit-clip-path:polygon(-20px 0,0 0,0 100%,-20px 100%);clip-path:polygon(-20px 0,0 0,0 100%,-20px 100%)}.mm-menu_shadow-page.mm-menu_position-right:after{left:auto;right:100%;-webkit-clip-path:polygon(20px 0,40px 0,40px 100%,20px 100%);clip-path:polygon(20px 0,40px 0,40px 100%,20px 100%)}.mm-menu_shadow-page.mm-menu_position-front:after{content:none;display:none}.mm-menu_shadow-menu{-webkit-box-shadow:0 0 10px rgba(0,0,0,.3);box-shadow:0 0 10px rgba(0,0,0,.3);-webkit-box-shadow:var(--mm-shadow);box-shadow:var(--mm-shadow)}.mm-menu_shadow-panels .mm-panels>.mm-panel{-webkit-box-shadow:0 0 10px rgba(0,0,0,.3);box-shadow:0 0 10px rgba(0,0,0,.3);-webkit-box-shadow:var(--mm-shadow);box-shadow:var(--mm-shadow)} +.mm-menu_theme-white{--mm-color-border:rgba( 0,0,0, 0.1 );--mm-color-button:rgba( 0,0,0, 0.3 );--mm-color-text:rgba( 0,0,0, 0.7 );--mm-color-text-dimmed:rgba( 0,0,0, 0.3 );--mm-color-background:#fff;--mm-color-background-highlight:rgba( 0,0,0, 0.06 );--mm-color-background-emphasis:rgba( 0,0,0, 0.03 );--mm-shadow:0 0 10px rgba( 0,0,0, 0.2 )}.mm-menu_theme-dark{--mm-color-border:rgba( 0,0,0, 0.3 );--mm-color-button:rgba( 255,255,255, 0.4 );--mm-color-text:rgba( 255,255,255, 0.85 );--mm-color-text-dimmed:rgba( 255,255,255, 0.4 );--mm-color-background:#333;--mm-color-background-highlight:rgba( 255,255,255, 0.08 );--mm-color-background-emphasis:rgba( 0,0,0, 0.1 );--mm-shadow:0 0 20px rgba( 0,0,0, 0.5 )}.mm-menu_theme-black{--mm-color-border:rgba( 255,255,255, 0.25 );--mm-color-button:rgba( 255,255,255, 0.4 );--mm-color-text:rgba( 255,255,255, 0.75 );--mm-color-text-dimmed:rgba( 255,255,255, 0.4 );--mm-color-background:#000;--mm-color-background-highlight:rgba( 255,255,255, 0.2 );--mm-color-background-emphasis:rgba( 255,255,255, 0.15 );--mm-shadow:none} +.mm-menu_tileview .mm-listview,.mm-panel_tileview .mm-listview{margin:0!important}.mm-menu_tileview .mm-listview:after,.mm-panel_tileview .mm-listview:after{content:'';display:block;clear:both}.mm-menu_tileview .mm-listitem,.mm-panel_tileview .mm-listitem{padding:0;float:left;position:relative;width:50%;height:0;padding-top:50%}.mm-menu_tileview .mm-listitem:after,.mm-panel_tileview .mm-listitem:after{left:0;top:0;border-right-width:1px;border-right-style:solid;z-index:-1}.mm-menu_tileview .mm-listitem.mm-tile-xs,.mm-panel_tileview .mm-listitem.mm-tile-xs{width:12.5%;padding-top:12.5%}.mm-menu_tileview .mm-listitem.mm-tile-s,.mm-panel_tileview .mm-listitem.mm-tile-s{width:25%;padding-top:25%}.mm-menu_tileview .mm-listitem.mm-tile-l,.mm-panel_tileview .mm-listitem.mm-tile-l{width:75%;padding-top:75%}.mm-menu_tileview .mm-listitem.mm-tile-xl,.mm-panel_tileview .mm-listitem.mm-tile-xl{width:100%;padding-top:100%}.mm-menu_tileview .mm-listitem__text,.mm-panel_tileview .mm-listitem__text{line-height:1px;text-align:center;padding:50% 10px 0 10px;margin:0;position:absolute;top:0;right:1px;bottom:1px;left:0}.mm-menu_tileview .mm-listitem__btn,.mm-panel_tileview .mm-listitem__btn{width:auto}.mm-menu_tileview .mm-listitem__btn:after,.mm-menu_tileview .mm-listitem__btn:before,.mm-panel_tileview .mm-listitem__btn:after,.mm-panel_tileview .mm-listitem__btn:before{content:none;display:none}.mm-menu_tileview .mm-listitem_divider,.mm-panel_tileview .mm-listitem_divider{display:none}.mm-menu_tileview .mm-panel,.mm-panel_tileview{padding-left:0;padding-right:0}.mm-menu_tileview .mm-panel:after,.mm-menu_tileview .mm-panel:before,.mm-panel_tileview:after,.mm-panel_tileview:before{content:none;display:none} +body.modal-open .mm-slideout{z-index:unset} \ No newline at end of file diff --git a/assets/css/layout.css b/assets/css/layout.css new file mode 100644 index 0000000..6b0a239 --- /dev/null +++ b/assets/css/layout.css @@ -0,0 +1,145 @@ +/*! + * Copyright (c) SiGool + * base on mmenu demo.css + */ + +html, body +{ + padding: 0; + margin: 0; + + height: 100%; +} +body +{ + background-color: #fff; + font-family: Arial, Helvetica, Verdana; + font-size: 14px; + line-height: 22px; + color: #666; + position: relative; + -webkit-text-size-adjust: none; +} +body * +{ + text-shadow: none; +} +h1, h2, h3, h4, h5, h6 +{ + line-height: 1; + font-weight: bold; + margin: 20px 0 10px 0; +} +h1, h2, h3 +{ + font-size: 18px; +} +h4, h5, h6 +{ + font-size: 16px; +} +p +{ + margin: 0 0 10px 0; +} +a, a:link, a:active, a:visited, a:hover +{ + color: inherit; + text-decoration: underline; +} + +.header, +.content, +.footer +{ + text-align: center; +} +.header, +.footer +{ + background: #777; + font-size: 16px; + font-weight: bold; + color: #fff; + line-height: 40px; + + + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 40px; + padding: 0 50px; +} +.header.fixed +{ + position: fixed; + top: 0; + left: 0; +} +.footer.fixed +{ + position: fixed; + bottom: 0; + left: 0; +} +.header a +{ + display: block; + width: 28px; + height: 18px; + padding: 11px; + position: absolute; + top: 0; + left: 0; +} +.header a:before, +.header a:after +{ + content: ''; + display: block; + background: #fff; + height: 2px; +} +.header a span +{ + background: #fff; + display: block; + height: 2px; + margin: 6px 0; +} + +/* 100% */ +#page { + height: 100%; +} + +.content +{ + /*padding: 150px 50px 50px 50px;*/ + height: 100%; + overflow-y: hidden; +} + +/**/ + +nav:not(.mm-menu) +{ + display: none; +} + +@media (min-width: 992px) { + .header a { + display: none; + } +} + +.mm-navbar_tabs span { + display: inline-block; + margin-left: 8px; +} +@media (max-width: 450px) { + .mm-navbar_tabs span { + display: none; + } +} + diff --git a/assets/data.js b/assets/data.js new file mode 100644 index 0000000..eea6df2 --- /dev/null +++ b/assets/data.js @@ -0,0 +1,10 @@ +var data = [{ + "text": "testDefault.html" + }, { + "text": "testOption.html" + }, { + "text": "动物", + "nodes": [{ + "text": "kitten.html" + }] + }]; \ No newline at end of file diff --git a/assets/fonts/fonts/icomoon.eot b/assets/fonts/fonts/icomoon.eot new file mode 100644 index 0000000000000000000000000000000000000000..022e8015df8e5dfb889f18b7c7dcb72297ad2f54 GIT binary patch literal 1896 zcmaJ?O>7%Q6n<}JcXn;J-o}Y{qb5y^o!V(j-8etHr7iu*p~8gL( zG*4Ap1mn^)m_=HGulC7MiHbB5`aV4xqz;&%TO?`Z)eA>Pos=1X`3B#m*+zB2oBrWF zIQ7GRtzKPPK)VOFZteQ~&8w$hzyCMv8-xkwYSk;L?+_%y9=$QHo`#E zn(iklckyj9iNqc8J(v$WEkC9)j%mLw!bp3&oF;n2^8UtsIxX>`bMxnGzl>I4G##-Y zeVtZ@Uj1Yc@}@Z1*jxcF^N2T|Y;5R3z!YNM_|-EoZtJ{E3@>L3hrOSD3(^f7%(Ut$TP-T-@Uy2nbgr7V@7822Z}^M#Y#(S^J!6*-qx)=1t` zu9xI=kJfN66uFdjO9NbT{Zc=8Rmg)YV2a=*2mToQc?{R1T;BsOB7&>K`Qst(3Gr4w z^zU)UTtD!}^Hx?NSTO2O1V|yt9t`Bg_hu@U>)D*=R)XM6SCUh^&aL#OWjxh)u`lTF zKf3o~Un(xsy({IoBfBg6Ql-p3x3Bx1-CbvbpyIjN-1SOjX8jKqQWzZSZoxt**4peA zP*MnK?gf&TR#N5IG^E9bRzu1#Ow*L=Iabmz8KxndxvZYHJUQ7IKH$ndc4G4R!Qr?) zwK80CBH(KYUuVm#ue18nah&gKg-#y)5BM>y{X?2iuORQShv)ZNF}J4^0& zod+L1a9rk>xXdd#sqjaYSZ}W{OACKWViMOk!zbXb-JNdr>A432%ET7(-BtSUyg8`_R^N#ia;jEe zp06%$e{Xj5JlkrvGxb`twpeY~u4FFX%#>$a=aE~H&W2A?8>^_}k!pqyRh8OkuYkKu VH=)bn6L&s(;)?j|`sRIx{0H|1_l^Jn literal 0 HcmV?d00001 diff --git a/assets/fonts/fonts/icomoon.svg b/assets/fonts/fonts/icomoon.svg new file mode 100644 index 0000000..1ef07c6 --- /dev/null +++ b/assets/fonts/fonts/icomoon.svg @@ -0,0 +1,12 @@ + + + +Generated by IcoMoon + + + + + + + + \ No newline at end of file diff --git a/assets/fonts/fonts/icomoon.ttf b/assets/fonts/fonts/icomoon.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8ddd1e083a7cf3d22f6471968944d8b1d343be15 GIT binary patch literal 1732 zcmaJ>O>7%Q6n<}JcXn;J-o}Y{qx>2>vD22iaej77TiP^-3I|nKEsBt;in^)mM2hVw zanwcvQZ5L{0VFO|T!X|3ArS3_LvLI-A&`(-ap4pdfjA%zP={~UjtC;+t@h3Ly?OKA zo1J|_OhhrdOOnQ4x^i;DNtgjFU*WyJP%E!^^WVNr!~@_jSIcWF7>|JK(XK9U+?sji z;UD042mux=<(u8Z{5_EYPW~bc)-Cxp_-EiFi?!yR!=uy<{vCMla$}*)pYSR0pTXm` z@|_iO=u7awz*F^dt#WTJ@+Xmr{QTBRW37oa5Vfu6NyptI?B0CVk8hF$|?5bCBV*(C5VrFMAt>F#d0 zDz!r)=G~t>1MBw3Wny?a`)qQt5U&zT9;Tb!M(jU9F65j!^f?C@CBzPved+KZe&5%DeCw*1J6^AYd#$QxH| zdnjqE$>Df^)IVeO=OgwJ=^h=c&CV9v`+NG1t}d*PIl&5bh*0+mB_&GL+7p(Lx^^k~ zkTgSYcuFY^4wWGk9IzkBY~Ys^=%=FGmZOxUvpD~*9(A0jGs#RkJKZ(q7a~0FCIcMr zaZYD*5ym;EvnM(02kcJ_s{wOh-*oxUTJNCM!cU!+W?&HU8QQ`|H=IQtyi71zf;TzTjz)TkLZ7*y%9UBgX%783wk8%Su~&)xxE*uJq@ke zGi|Py=?LY*VX;k&@P-xPg;=vwwNgruY5^l2wPlLcG5Lj~~l4wk@v2OGfa z9ca;`))Sw#P2G!>)t7}V*da95gr+KQ-DsGDO>7%Q6n<}JcXn;3-o!tGJ?2gCvD@MgS$NR1flz4_iZ zZ{E+0XE(3S%m4xnqZ>kU7T-vH+_-lA>=*!=w02X9716!LdgTsr%VfVU#hL&9{aR&R za*xTDzEZktt6R5;qu88G4pVRJ{kdGNECFaTpDQIgh(9b7N!;IL4@og@^KX~yt-Anv zitJt~Cx#)q+FT?*eUj|36#N1w>y^8dSHD7bN{Iyz8kKsLII0idlX8DH@YkK@dW-t} z?O#7t67Rx~K?h*>*>|+^QD??yFpdGTj}GiUYDqi=u#bH2U=OA^2{GzSX_h0UbfcoNGHYUhmhLGgXaeaYFBC>6vl&}9nIgN7Dyo=d08q-hhqTVD=PJW z`Tw7jw`21LZ@>c7U>&w$2R?<*;VTM1<_w@?$74nq4Pl7vMA4lnW^)&@qjOnN$YUlg zjM1ziY$uHInAGH+%VQyJ7Y49kyM-k2B9|pDMePo-jtbX19CeJQzvb zNO;NQWZ#WMB*^2v+ohnzqvifcA=PguqVJyQx$Jpm$4+N9%jJdkugEylQ0XW`#so^O zM;R&37}xsu8*9wdAAvwetB>t zXwGd9opS=0&IDY;Gz~X!=2E~pH}uYR(;SGKVtg>12)gHuL_T14bNl2-eR{go>F@am zvN}~CVgv=%!IbW0f^#ZWYKIw&%i1}|F0LzY^5mRrsFcP8IZ!_wQKP>kgD8~vE+2+C zT%h~!iHXxVk%?#0*@>Q_TL|E&9rx&ZPh&cp3n1NdI(rtgu7~c}ApI-c^EhVrBi)_B zhi&W0Cr>OJ@d}o3JHrK?s9^0@dxINvQY@o09Y2eVM|MJH-3+}g&3o-%Ec@wG+oGlz zTJ7H%=1wtkN7$>dn#vl!NacM(Qk+7M+!jEw{-C{1Kg#96^Y|01n|j!t%Wd_*#AK z`dA~p;bWb?%yAzJ;$QP|5c=Rl`AyIQ#Dr<3gBjtP zk2&F2eXJ3F%f~v{kn*u0e$K~1D8lZ_Vzb_CHedx7p$T=8CN$=&YwIh`Myik>g?XsL z8htHR@-U-vw1CMBFXdB3)7qTbV literal 0 HcmV?d00001 diff --git a/assets/fonts/style.css b/assets/fonts/style.css new file mode 100644 index 0000000..057929d --- /dev/null +++ b/assets/fonts/style.css @@ -0,0 +1,32 @@ +@font-face { + font-family: 'icomoon'; + src: url('fonts/icomoon.eot?xrgxmd'); + src: url('fonts/icomoon.eot?xrgxmd#iefix') format('embedded-opentype'), + url('fonts/icomoon.ttf?xrgxmd') format('truetype'), + url('fonts/icomoon.woff?xrgxmd') format('woff'), + url('fonts/icomoon.svg?xrgxmd#icomoon') format('svg'); + font-weight: normal; + font-style: normal; +} + +[class^="icon-"], [class*=" icon-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'icomoon' !important; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-github:before { + content: "\e900"; +} +.icon-home:before { + content: "\e901"; +} diff --git a/assets/js/core.js b/assets/js/core.js new file mode 100644 index 0000000..91add13 --- /dev/null +++ b/assets/js/core.js @@ -0,0 +1,134 @@ +/* +* MIT License +* Copyright (c) 2018 石固 + + + / \/\/\/` + / \///\/\/\`\` + /-\//\/ --\\ + c| ⊙ ⊙ |] + | < 〃 | + \ _/\_ / + \ _=_ / +* +*/ + +if (typeof data === 'undefined' || typeof data !== 'object') + console.error('Can not load data, check your data file: data.js'); +else { + + var root = document.createElement('ul'); + $('nav#menu').append(root); + recursiveFolder(root, data, './notes'); +} + + +/* +* render file list +*/ +function recursiveFolder(f, folderArr, rel) { + + // empty folder + var len = folderArr.length; + if (len === 0) + return; + + for (var i = 0; i < len; i++) { + + var n = folderArr[i].text, + nxtTarget = folderArr[i].nodes; + + if (typeof nxtTarget === 'object') { + + // sub folder + var li = document.createElement('li'), + span = document.createElement('span'), + ul = document.createElement('ul'), + + nRel; + + span.innerText = n; + f.append(li); + li.append(span); + li.append(ul); + + nRel = rel + '/' + n; + + recursiveFolder(ul, nxtTarget, nRel); + } else { + + // file + var li = document.createElement('li'); + li.innerHTML = '' + n.substr(0, n.length - 5) + ''; + + f.append(li); + } + } +} + +/* +* init plugin +*/ +var $menu = $('nav#menu'); +$menu.mmenu({ + + extensions: [ 'theme-dark' ], // theme-light(Default)|theme-dark|theme-white|theme-black + setSelected: true, +/* + counters: true, +*/ + searchfield: { + placeholder: 'Search notes' + }, + iconbar: { + add: true, + size: 40, + top: [ + '', + '' + ] + }, + sidebar: { + collapsed: { + use: '(min-width: 450px)' + }, + expanded: { + use: '(min-width: 992px)' + } + }, + navbars: [ + { + content: ['searchfield'] + }, + { + content: ['prev', 'breadcrumbs', 'close'] + } + ] +}, { + navbars: { + breadcrumbs: { + removeFirst: true + } + } +}); + + +// auto open and close +var menuApi = $menu.data('mmenu'); + +$('.mm-menu__blocker').css('z-index', '-1'); + +$('.mm-iconbar').on('click mouseenter', function() { + + if (!$menu.hasClass('mm-menu_opened')) + menuApi.open(); +}); + +$menu.mouseleave(function() { + + if ($menu.hasClass('mm-menu_opened')) + menuApi.close(); +}); + + + diff --git a/assets/js/jquery.min.js b/assets/js/jquery.min.js new file mode 100644 index 0000000..006e953 --- /dev/null +++ b/assets/js/jquery.min.js @@ -0,0 +1,5 @@ +/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery.min.map +*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
a",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="
t
",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj; +return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="
",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&>(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X
","
"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l) +}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b(" + + + + + + + + \ No newline at end of file diff --git a/demo/mkdnotes.exe b/demo/mkdnotes.exe new file mode 100644 index 0000000000000000000000000000000000000000..f3f917efb2898699441ee5ff423bcc2ef872d657 GIT binary patch literal 120578 zcmd3Pdwf*Ywf{^qzyPCX#6(jKGU8YhK_H4P5zqlLN)b0+1x!Bg$w%6VwFD>SQ89=Myp(X+n74-}gB}fVZBKdv4Yo9YS31Ibe|M~IJ zoOAYLz4zK{uf5Ni8-Gyg$aOdzF8tro;c%?OmHz_r_pAR@p!&>y8_smB?)lFP*Ez@i z^TG-D-9N`SYxYC;&c5qG-w*Hl@sA%0`R=~QH#_`e-~B)KmEAnv_uxa*?-_K)8NK`# z=<=Y$G0v$uLSvj$99KIXk9K!BnjGDoy`4FI9j~B~*NOje&F4M-ugCwSj`ul=ZnO~k zaY1K1ftgXqoWhsG;Ztqdfqn2#E<>D-?LF}ja5~!DQhe$^vz(6Ipy_n~T+^J6f>TsJ zIm+pnM8ZzBnfSj3|7ZORIHm;#4^;(2FT%A2|5Fi!oAnRy0)y_JGlxZ0gyTCk zBNdKmRfFzPctw_wsiPO#x3XvEpTN6cwG&xG=F;v&rVa0ek1@AS;JuJpj&|hN-5I~M z3(XYzd~6IINV{IAXgB+wnGgNYp>zmcI;d;UN$o}tE>VIRMtBt#yu7aM0;30CUdk4Z zITzqhCF*^+p3}9Rcl6+)C8%&Xu3*)R_(MLvbBcCXUdd*TV%Aroo;EP-6z#tAT{d$F zef1W+5nbC287+;z!Jk95@zvjE`}ixD@S-;tmQ>AHGLqW3@dt@+f4*pxgIE&Xo=@LB zm%f|eQ?;S{R=IJzavf@-RiWz>Ecz|OXEpw;95H&7 z!|I`T&sX>m%rVrnYn{9%4Uh!$V0`bi4LcRq_Uu#OIQ_ra1wJx#@0J z5wZSo2ptBpgJG%;TiD?|l+38qn+L9Z7Ca=%{9XrG#?|drS63ddE`I?ot5~{7q7bHsY`*n6!N0)Yl&ScdN`~_|C-})OkY_*E_TJ{yJAh)%iIU4qWg24QMqa%MG=mHU| z-k@mF$_tfzum&Re^<9AHgO!wQfeC^rsyjv+&q>`5{YAEi2I?O;Lzk>4J$jW>TjQ-b z=3Dfs@w$G}F>jd)(Rd-6SUxS#@UD~#WWJL1Fg({vl1fyIZbHX1I7U}_@F%)Oi@Zr# z`P5`|d$^Z509>qOUHqQb$#>j2wKfj%gYmV&ok%gNPnr4M=d8D~;k}K7kg|U5RcqF4}_@-G)|=^`+G%>u@`x(#Z37e7j84Qu!v(dvS z^mky8yNx=Q6layJa>1OUheKzvq7b47w9PHR@eXe4^8*fZ;}5`1Cw(Nku@nDoI_Aw^%wN&%>^q3a#g6O4Y7VDNdnCt2&p6g*NWOLwUubUqoArgw4lVKwnk`w_%+}!iNXUx?J-B#d!3JDBRxeOU z{YZ1=zg9W~y58(Ff~LOEbcAp03J}kE76PwA@C`wRu8#%H;X&`>q58r+M`#e9bkk`B zn^Jva6PrM&vtC={7%?T>D;CT{iQ!H4(jRPc>I<735AQ*1BiNGaQJHd8LU>AxrNP!v zZ%PUZ`3>X{3$|>jRraFz_bC3M5I6XD!FEWx*$4};8WzDyXdbbk%czM5ThPpHOpvCG zkypNATL&!dBEXML^rG4mo9MyC9h)ePi9brKq6M_tkd=Lz3;qWRs=))@W^1ZDTGWx$ z*5N_--1GGZTb;NE=h~Voz*$*o={fu^y4c*LTsr!r0PP}Gp>x$;*B-kvJ;)YWO`Ug& zrXZsexS+n!;|LX6EjLzCR1_SzdiSsJZ&l%o^o6aC(CSVtAk48C`sQkB68g^!@&X8- zs+EyI`?H3cc^8_ZE?y3CLmVOo#pCVcmo!hqI7kG|%^*7w{Se-d48)_K;BNgO+`i0b zqrjNrZjYC{^bgyM>z&p52kq6#9860Mhh9iTU$lEYwHkK_upEx{z1i#CLoXP|W*9ko zO%D74%M-z7UXs`3z<~x^obhNL%z&a<*y0QqDV>Zs5WWC+GMhR^yc|AD9&%`>uZE$M z)?5@&PQ8GR*Bf~iE1*V|C?TlpDX7?AC`&E+Pw=U&5n7?kNeUD0Zc-$`sOOF$SQ)V7 zh=PoZM3gM^fC*w0ZxCG!XyUe_Vcfw&;l`2=$StjE#N_Y;LbQ`Z{zm$0kl7%{3a7P? zO{Rt~$DJ}tu!@H6%OM&fv(TbTe-Kiq1f1-h#_7!9Jd7?jFIt3gCNbU&jARB7e%J}= z$k3S<`l}GtNneWuw%vf~3a$YyKoI;aL7@#m?PhgBHYkV=gGzOl+Rf5=x7GF`JlQP8 zf=!Am5i0;ZR%{{XC=*MQ3iwt;AY-R1~&hg)zizCuP(YGN#iQRg%!w!>nU1rO*C zw$X1%5$tT@fo0x`g$H_t`sfdO;Ici=MLqR}ZI19}ndy|rgY#@RFc;z4W|X@!4g;eN zSV4^Ncf+5AKgE*m!If*K2fwf{#IpsnqAi{{W@wl!rS!WCXl>%Ts$s9us)vWJ90!N0 zR|TkInnAH;m{0|ylL;J|-v>tAv&f9%9#b>iJ?ygummXjfF7PBkoJxq(0#rdj-Yh^P z1Q4c(X7D_*g$z$@HOiqQ+pR0MTUU-?j0)N2^9HE;0;3%nw_>>jL?8)w>7~c-#2SRp z%l;@HdJsu@L5jUJl5^DR7b5^6QPNyZN%tPBwIdF7g(wyOS?0rXF)3NN+* zElmTW0$X7;1obl76V0;8!d*wQ6OpGU%KNJ#QIShZC^_gKQRygh|hT1NuqleWI zii-ujTWVYm8NWrq?R6`Gd3va;q;*KsX3zxk1AuJ4@CPIzc_%m#dFSa1-D-F_!o7r= zWCi*I{_vnD>{IA|f=3LsNE-h%&e=M`BvoNe{<|eyFlu4-Xx*u>v^Mne*KJ!|Yc%Ma z@+MnCu)_yyt|Yy-7!bvYe17+P$cMfeA&)2KplxHJQ;%Vc2{hdrK?Nr=8a;g@Mik9t z3;N<#4Pe6dCAzt>2&mW$sde+A3(Eq~8KXkp zts<;MH^Sk+m25qdSi;ukcyZB6(ZAD;jm$IQjl)R2o83KmR_M5 zF=y;nuL#?2m?I!nLtp2HK51xow0gA~K{s`(MehX0O3S3zF~|}FSkk-UlmP0!({ibgF2< z+kmUIX7;10Tv;Tjo{Tf&*2EutR_t%G!vWr~$cP7@Ev>N`cpQvEqIX1KdKrRK8+N^)2lr*kR@q+@X1|MD;pnt zIySKqAdGSZ5CG(%-w<*!KQtNJz+>??W2>-$DI(*c^kxcC=4DLR?KV+u*_dsj+D=bY zTjRpRAnLFX)!O)A>#nISjSn8iw3H@lPp}PK<8e=*U`vh1_HpSoGzdnV3BLuk%Lufk z_A{uRMKbQh24#*@ny^gcL22W`d~6j=u{yCS7JlMLC}Z{tdgk@vEjZ`EaMmXW*(f*) zEC}bJY{^0on7?K&jUZYzzo%O2FHZGQ26;pY*;%Dxi&%hT;}(JH<0$GAyRn5?Da&!m z2-l(*$%>ysX=4wx^gQfVQ?o+xq}{lHQ@nD3Dl$Vz2I{{CjMR8pTwSQRMI68z2UnNM zV~T(I&y}Yn%8Dz{0q$4irG`SiJ=OTr0~VUQQXoSH19_7cujQL2aS(BIy#6f4OCDA> zFjqIiH+_@eo);!rt0vUJO!iD|vcOyOgt-P`*|OkXj!fG;Mng|~f=!K|zrUsN^S#MO zdhzd`hR}JboIMTk;A;uTkHa%()*;FPEV|UxEHvLUMFn(K9|SOVUn5!5K^91j2iI{z zq5n-}Dz8B$vbN!K_XO9WJMi?D3lLpML|GtT&-6M=fu#KBBie2K)*{Qe;-CZ4pjpbS zC6U&CSyo7n$es-Evlvf(CqD5t%xL1}h6VSA&p_BG&vlMLseJ39CVrzd+RP9-hl@_& zC=IsEuF13(uaNO)U7bN9$mk8CYRkGLtMEW$4YsKq%HX+|W=?-IIIVNX8K>!ZJ3CtO)cIH+5n(^UXKKvH)vzlm+{hY!ifbLk@As>N9;$q4N>w+|% zVS=X_svI#zi(aOlU@$BQYtcfxK*+d8$S{{IG)acGl-q=SASsU>6ojqSO}#F5v}+Qu zniqHEIvhRgyEzapP-eYA0W(Lq*B7=gp4S~xaHfVYS=ioz&~qNDkLN%bRjDEtby!8Y zC~8XOOOY3tIKiQ%3&ky%PLCr=vn+TlRRoFaP1hLJSaQX@s5l1e*ivC^UFNNRu)RAA zRLhEm#~k796$_6$=OSupXK3w>IeJZOTjot^nF9U8#mnGb6s+T%)Vv149!>SBO!cZv zC-KCETB;t#*$|yDgS#O`$(5a4)RGA91`n`*N#0~NP=?=Mi*`paWCbmj@>1W0Iz><6 zVo|JC+RZ`aDd75t|8VLSn*Nw*U$xSr5A%sr zttZCmj&s^(;vT@9W|Nd)h1jImIIS7P%0rha8$$Xc`GK+#;R2buiLLR`D)inRAL}%3 z+^wzYv&@@hhO935X^tRkB?{!5RxsjJ&J5ip1naN2jn^Ja5hlVg_(O(ayJaoEyUyWG zJ(Tt2N!^w8)GIYU>*%H~~-svKcHf-;6u1q|3RK?yNjnQd6ihb$V=%nYy+z<*meC zLbk;*Yr}Otnj^*BEaH~g7f)&(leP)M0baFe)0>B-XF72RmfueV_pyy-j@i@RaG0Si zn?`V^!e9mmGK)NSn3*k=WVdD;4Q-L%o{@0$?_U?lai}HXQBfPSF>tkZhFEVqW3i^U zc^2mBrdx;q?1LnETmMiuy=_XkyB=(Iav)0LuirfQ)#h#zFsmZ0CD#a_Zkx+yj1 zk5h=A@H{(pnOsAui_^&Lc*Orv0KCfzcP&0N1hBv_3)VZ?OAgz*}e`=Pa}s6>g3Sj*d$qH#&vu zk$%E*GL72`LDA0=$Jq7g;aFFQKYA0UA7R=U*R4UXa+TK4{+B&QyD_c9e~E6)?eHI| z(jwSOg@#~g4g3p~d!Is;$}k6;*iKRe7@x9YMgXvqxdTKU$OJHXVD3F234U=JKZ;{p z4M6sBcE@!FuNfcr68M8$#_9{bj*#DKI~r}^>)|L%Yvv4zO#~rLGIwEcUMMSCgpN|k zIf^lTYidDe$`rhCVB$n8K?~9aB5=56uvMQ3asXkru`s~xHW|U4DZtqcTCjH8Et_sT zZB+HK;7+ydM3eg1#GR`sJ0qWRQ~u9h3l>mi1WuI+5+%aB!4dYH(|NJ6wieLbpVd4b ztf!D(dy*hK0ERs6gu?QYHe!)Bl5lV!X9-vETcnVgtJg~8(XoeOy$y){H@&r zN?(#)VB85}Edw?n{j}&sMRp@{WHp+eX>_~ZTo#|WQ$Vlpi6-0{qcJ>ejo*bb0_btn zY8D#VnMs1)Df($hhhZ}PffJ4xBIbx;Vh#GTMh+HiJF}E^u?&iEo|Tc>DOiM>6o&gw zeN)+;Q9m4o<^KsfFaXmBI<;LUID3(A1D1 z%SK1Zq|ptq(G4eTN&5({IRiT3;%wAEj9rWDZR1^sIy#d3fkWv1VHW`Kd|AX2z-6JL zlgb9qJsDByye^2GDIi*6BO2BP(aAt3b3ZVf(ut5nYK)Ni?|c8WYwy28m8ovoqu$QL zi;L%eTsp0igghZ~WRxY^achy@lyIASaRI_YEmB1;+FT5RoS}Kim!#6CMI!2E@tJy? zSBu<@r{piBD4<0a;AUh6I%<)(@i$q4XPPf9jC{g^KY@f0rqNs337$LA3LY+#$5A2P zSgUjQOy@tI+_}HqdB$Bc=gdHk?H()o?Rhfp2Ttz(kpKto(CqL%%pob{y}3Wbz2$zUD@a(CbeR!81`MGl zHLA0XT!i47L1ebwTt>V3R_C(sLvp9KhBOZt)}E1{!lTZ$RuUhHI9V*S6^0*j7F|Zi zWGzaKvpj3fMBLEts()cJ=V=fz_N-xAa1xxUTBHDQq_udxOzYVk76Ki!FnvI>BnzWe zh8n#}#2x#DVzm~%T&;?EVS>cTt5(K3IQWB++QJnZFf~)y+r~z$oeg2g4w;Zl+ps4=oE*cr*kicA znXzKaZY~$~V3!^Xh)y)gW5$@0JYk5kEWu7d$~QBPk{L8VO;QIqUVsqn5rLD3yB_N} zS-`GI5R?ura-@l(M0Jr*PofSHBR!0)@<8LjG%yG?UFyTVWDJyYn(e(5Awh)Fg8i-l zv`BG~2=W0lI6DiWHK@Ox1s6M6He8M>OPfNzwJNcl^y!D?a-b8UGm@l^v`D#CkufJt zA7PbsGO3?xQNIl&ljyKG`2674Hspm`WECVYhAap&m`@(GuZUH28pyzC4cd1;%o?;Y zfr&Zc|1xMV0UP8fGiX1A$LF9OtO%jDa->m942dADw9BFOmPCLFBH>AkFtbWgXZX@| zh7K(2BvG6?+HRGf>;`|0Bcq*3G2s|V3ik2|i=@m$BN61k_m%J;HC!gqv)=@RkLT5Jf}YCE-KhB9pj+Jy<_cdVPS^6)A)C9dKapVvSTc6FFt(|{b9~+$B95}Vqp(N zj?-a}#u5G;`*G=|xeX+{H>Mdi;@BI<=CXUs={rZ*M42_sAeon0rDKEKG66|}`~uV3 zmKt~GP5Z1xL#JRBM5 zm%A#v9AwHC`+bCnp__*@Ew*J_0=f~gfgJAvK!sFduWvyN;4BgF(Ex;bPsJOujf4|@ z90KXn0j)?`;aL)QX-TMEO!59$#AVC}0=Eo63`UZwU<14END(MYk}Kk?18Fg|lXf@6 zkR5|Sk=as;pc=<|#2|p9i!iJ}MeG9ySurPpDsMVuWKvyUSRg0DMNn%2O(Jn5r@(g( z25o8(kJx3Rwz|fXWcdS0aCs{BeTnw!{$jo(17^;bM;|;Uwh{9rQ|67`s*WnLiqSEK z7H%-bL%iNB1Nb9zSt=(cC-A5dXwAdylWN&T7EUFL^obUn+M~&RWuJcn3FK$>K`IER zC;W^X6&8`ouXzSpBp`-)7P?^8PTOsfbQ&e%9iHhb3!b~s6-5%Z*mM9?7sAKd5G^u> znd7k63q^G8N_#u0H&3KPz{vTureIiN$9FRo-KPfo1s1Sh zm)a?(0Q*>r@>s&>rYus2`*>=k&~L^C7v1L9 zl6>VUaDDu4HZN9+5h)_!rS6;YGUOESqn+T}24lfDpx0iI<~!M9vF5K~=GET-Z2wb$op%bb9KtGtX8C&fCxm=FEP95z!weGZqvjB zv8DY-mwE3ms+y+%i?>B+S+1rt;Dv1h3FfLC1Lh;~P>10WvN05O?)JcGy1m+^TNlC} z$q?q~N?4bsOEXR1-r0qR0xQU(znuS2XUbki#!MZ2kryzsXMAT>$az_N*D3ZB<}-injPHNLJe- zdu!LVoo1#s{J3aIZ_(HxZMx-qQk`lBm+4c@O`Q)AvkHCX zRC80~!uN52_oa01Q^YXj$rz2erPy1_ zXb|&ZAYom>w0u79XlH)`2s>io1|hJdU%#+Kd}9`tz7`fpjM4#s<4E$-0xjq#cR%yw z?tx7AS2EpUaHqij7OA&P!NTs#bjJZh8~drdS7vp$L{xFIi0*qc4d!GKJq{56Mnsop zVX-XR2P|aBj-)MNI!6V+c8l{?D;z7aOm|{Fgz<)rSnFIs>OtU* z=S5LNB{}Q40Nu9>(H26j{)huHM_Ic8Gy{`b{5=Ga=J9IT9)N!}( z-+Yj%1a1zfcLhvGh|U7Gn6ifhK-);F~fbJB(K9F+DPP{AdI`gYBuGew|8?*+z?eTe%D_ulJp> z+!ZEF9NWT98eA9t^1war)jJyMeV~DC5%Ajnlmq4Jt$>2e*K8ti?zBfLJj$FSOVN=;;EaDpNkh##xS z5vImZ3g8qTPhTQ;gbh5CL6aK4h)+x?NX{*?f4@WG zo``~P+d-rUI8eZo;J`Fx{}c#IKBD9-XWqg{1iPKddox8nt)dB;qBE?bQJJD%R+05m z3SkWn4*@EqE7ikAonP12BDvYU_a$4E)Kuey$U6Vv{93JYPTR^t zs5j->nZ%ve+WCPb-e&^%*1lBZB`?$)`W7)MbS4dOAB;#6O~%@@MK zbKhc|yY+?&kn(N|gw7ILY)}saR3%_>m1VscJEJS~3Dy}Gr?xzZI%4=PFPiCCkkbCk>p-5aEg2N;P0;FBVIy1 zL=Cd@ZtX)skcd(_9w4HuV|X2`}-NeHQ# zVV|0oe<4-}k465|=uMtxHoKx18_XBHWpxUFXA5hM^R(tj)R zurOxQz19gxx13G1y%Rn`#Dk4^=}C&yUaQ&O{x_E~*jF?9$zKa72GjQRh!7y~5zZ2S zc)x@L(1yc2^8pHld0czFeh+)tr_KC0DgX@T&zN37Z@)!_um&Xfveu<9w0C6$IAn(!|I#7JOcy}hIx4wj%x*nO#f$J zB>CSYcYs$89L>)cNoM3!psFlTpWc@d$#L9+T)j$=eaaRfY9vaz5kFprtzDb6YWrEW zSE4rl6c1+0KwBSxXn4|9QSXXJ?K9h-+>3_tv>vMz#7@%Qc=wCH8k>*QsYfUd$>EC3}6RA5LF(=X)g5eDeK&MekocqLVENky>fiW&61-L$3ZsC{c(UMsaK zf5J+$o3nvPk60?3i9#qe`lyIQmSX0;Si)J};nV^U&$1Q=nZAJl<^Yi`fZyVtYs3tX zFJU7e>m4g}z1=6a%ax`Uy#{Pr<#%3)87h8HoBb7+eJyxH+x!KyVGG?(d~}Xq%1che zA3W!1(cgn92vM(c#Y7>VeaedGVRX|Ynp_gd7r?Sxoo%(c#cstQHOX&*X1D5VwHjcz zTF6$kr>-B^D4=M;D(WeLZ=<7m4|>_s_!;g&Z!RYew<|m=8_P8ome-~W#S^3s?|u;8 zwN~99rA~Ha>oLOc_F$VUd@1hY(6;+`n5lL6;ucwlQ{+>OJFsgun2RP??C z95%fl;9kb5mA)uI#rMe6B-LmF@5ib8WxNll`^~%`s_uOsq)B| zm5?a{uMEidzGyGNwTtare<%bU=6w_HRbTnE-Z-Pls58IkrVTam4Gav7Fq-I9c}9)C zAHny&4a|h$)>;2D?*!G6LqDqWn(gOVpUi~Sp#N^XvcdjWqCZ!5yEzq8_@s~(AylB4 z-x08c+J_|*cN_J}rPV5zwpY0{9D%^$bjRSk=FCBc`JT|6!T7EWzhsMa=b#7Xz#}yf zG9VI(_mhAixt-X94f?_cM;Ob_-LZW6tWHe;5)o?h*bsBUx6#m6(^W!QlU~(J=)4;s z6!$wb+`pRP{s_50@vTnW!<_2b`Mc8Ddha5e`?;tU&%c_<1D9*=hOwd zqrYfqvI0eP7hzk$2)+>uzQLyrcV(+?bB6e?svFgr_)W3kCiZ^>{i(W5T~)Up6|sq% zzLM0rcg^-eQA$H@-$)r!Y4oR#cXrkB z+o(V>$D=ho=dfhr&eLnXMqAtM%Z~yMe6Q{++hG{Pj_;u%&jAi`6QqMwKx7u*9+WU( z`W?jamEf|`DyFLM$YLrB=D=_dzf6#-DAV7ZccNg3sXNbk>6g4aVD~`|$Ewx-(uETx}_M6)B7M0fhDQzaB|d z98vZ+yP7dh5Q_8#6}B^f4s0ukH0=}`#G`XDa$jyk#fD!4NvyZwj*UCJ-5BR>kI#4M zpSBmb71ugz@Kr{mzS_(&-Z!cbA!#Qu;UfURN#H}{9cu!p&y26G6Tp{ecN$-|5B?5d zaD374b(;Rds6a8-W!CsQnd7#W2e~KEy9nS!`l|0pu+DwF>PbLj= zdmOh$YwUOQmD!F|PcJpIzIaF4ZAY5(0%t8*uW2iOE==Jw7Ea-ZFi*EOE$YnAlb?d0 zYtg~xXEyFFlnjH#wa9|>XMf^QYNlT7_a3F(_yIcbs60xM@v{wm+{uyNsZhU;-ZttZ zxCa=rFfCs%9){NPxqcKBvfvUFScv3X{^rw@ zKp02>0bRaFjW1`Tmyf+lpj}L@Pgd!h3Xvr}(ol z#TgJIpS6%tQs3mMt&E4h?dbY@1&~ictgmBhz@Z=S2wfQ674mfC{YIWs&TuQJteAxX z8U}8CQ^Dlgl3l4Be4BlYGnN-+D}4LBCAB5XB`F#@pR;G zhKV!UoZ|OhF~y(Pk^dYDjMqBypXW8vk^cs-b)qY_Z?f7$OC=3gKs6<1Nn1&a!g8)r zb7cD}Qeot0W83iJw_Yt9GQ?8tu>Hyn7xBK$T>joZBC zHY^A2f689`dRuOYC;Pp!poGET5Rd3THo;$HS*njtg@*M!EIzB9_4#-8dlvk5d!9bB z2;}9&%KZKiK3^ygU<%oAe1R2jd|ri*ISPQucL2}JL&`@vHu6vD`=O6x*y9N0;FIUI zuG06z2RpTd*#Kq{xuS(|B;i?%Jr6W>ZmYhZ-_>69<`FAbL!f)g{A2Ndd9(_DCxwa| zw}R6EKI~P1|H-Kr&t+8SBT6`c!u&+xOsWlp~bA0>5h&0VW@q=y1%y?^TRg zzYmH)c_8M+5?VjjZC;O<=P5@L-|NFy$pC#%z$=IXZd`cw3bU~I$X0X&Q=W8&1j3#( zLH$q$@bTZSk2>2w@z>I@?B6@!v#nfQWq1sUU0DSZqldK>?T}k+=9S)&F<38+M`RTr&_08lUI5u{Gov#MyM5iN2?6{h{eaKUCGYz!Zp<&)Gsjk5DRkXary<>o9wIEa5b^4rA*k!}wy1m#8X@+$qqS3_>y zbm>jU!+rE_q|>Qy8iJuJY~}VPJhaV&K77U)moeULOi>@p4G^*lt2*-A1TuF!Hgx2_ zNZWV$mqF$-!1_ga13jUQNn)!Otg<14`tB9zg1 z<0Grc<+^E~1ss?0kKWc}(erv+?^r&cv=wX77C)mB;ji1QXVH?Q{5vNS|A~9uy|^=` z)*D-kTZ}{1W^TN!8v8UmQ$1)FdaWDE#m58zBH)NW#=p*Y%#V>Y96oiYA*IH9;fC1M z`izlW%DCW4N;JN3pVDaD^{cq+(U>>7J#?P2K;@h88XLt=1BQRZkD7R4Im7!>g$uUW zQW0`Nd-Qt*Itp8JTJ&nU#TSC`ix%gDrT9-gOHK%<`u`xTG^W0hmUj#v_`1U#yU7)= zBSk^^N4;fJWJywnj5vU-CK+^;KL07_S#^b8bfH&}QBZAj|rts<8$u zuFvfuWjCSB=$HD72rb!2S-^Z@oG+4<@>?7ZnSbF!V!1KLNE~pens?*KI4*N0kL-qv z7OetLbdb1k2=vCqeCuWihd(Vd5W>dTn_yLR)UN|w9m%)R$ojpJkxv3j==zaQ^Rj5< zf8Y|nI13)!tixPv!&`+XDs(BXEBRY8T*@c$01fy!|93QX?K?*G4R2-z#|dZ=pqHXT z$Vq)~WM88FYgSjXW4cw>5S(`CXXwU4i-lCaMZX2jDkcfozwe6b)tdnAfAP+>!q=Ep zFNl7NdVO<8sw%5O1i93z_(R%0OR7@8%yPGtDjwmlmoz{e9r@2-5XJh|;~t>~yv5Mi zWi2ckNf*WWESF>FZB!a{9q+<>dGG@z?il>sP)s+m$?oW`@UAqpo#=$7n4eWBGuLt3 z_>#kzaaZmX;fKAL1C5r+cVKc-^B+0jxm19lu+4Gc0KU97GzLD^X8|^H@!*GZRrId3 z$Tfs+yUiGPN4|yMXaO1^*+}b2Ew=)IR{>w_Q;0!W> z{>lmnP^<;<$53tUe3Y~yUVRLdx z6(Y(Rl}5dQ37?VrOz`U|h%hfU))n0n?g8Qfe`j>pVw~*oOuj>!-kBXvSKd-Sl0P3A z$Clgd{3S`=Bl5kBSE-nnDy~Msr0=5_MkCe(;$R!&VpLiaMs|P-J0;hLe z%MC>O)$r5EKz`UmKh}NTB^~~!y!#RGjPs9Jvc=(OS&T)(Ks*h@wJ5{y^X`y)32LC= z3an&`^iAVxfvkuc#}(ymi&O7q+IOyl$J}Vc#C2%=XIEeXB+lv&^OoRU<^vr)w<5+H znEFr4Ub0$`AVtZaVqA9y+Ojw~!}3m*G9NB!=00-l*M1)2FfSbo%19m@rWWCjbj5Io z7P$yF7~~!Kf41hhwhk?VA1HM^@6{sRag8tV50tuQIWmko zd;$R!#m772&ktl3T@IJK1G#W1G+#oqijAysz+V=ICplB`r+uJe-K8j6KMH?l7`Y`? ziKYAy2DtAq-c2kmVtf2cEGc60N^JS|&Nl7iQ zG+(fu&%|@`VG!DNK0q{qf#@?I6+mbudfJC;OeaGK@s?qXN|23j9q443lDrD-;hpEG zR!B%ftkOYSVW4?@P9A@F&l4mw`UT)Tu2X>c{XH%p%;RM&p`27~VUwkcI?&)l^kgzl z5QYXP1U8yGQqQRcpWfCdG$cdM2DDE|W2!?n=N-VS$%{({%=c`@J4cHC*^J3ErBhNR zv#d=>R(?a|b9cHU!n#WoUc_Q;9U<9J9*%0G4i;^$1ZQ?wW)4L0Mj=RkF*fx{m;9X_ z-bwv@KX zJ-HS~YwR8>JWgiEcaq;B|FMwYZ{Cp&B&?t4Sa4_fvNWwB35_min^WrnAp`})*TqwP z6c#?uSHA!K(!bN*7BpK1q4bp+L+Z{ErWu2p?@0j_rrKpkRZ@e+M3~eoDet7pY zjOrQ2xAf{9WEM57=dScEqsn!ej?8v@0bh*0xIVL zvmTI**Yq#p_=0E(ss~DBJ_M0D9)=oYnC=>8jN#NV!Wcuo0>+p;T*{0w1-Ohg#xVUm z&KTp=q@G;|So$xGf&=Z}8B5loWIq_?Agz*0bz4%eii;{oD zjb-*2$M~LY1i1$+3>AMdxfvYZm#O175dZ=|^_gcEhQcTa&4M7p%@y;VIH+_GK~9o; z0=83~HA;C?aRCWKazt+PdX!Qsb!CG)#K}`MFQKsXgz=gd*#jtyG;csjvK|kljp^p( zgZNX)r{__cidk0sQ&%Dv1UnLAe7s=!fZf33@f-a3VYWjrB;Q8cYzvTlnO6*ajyFCg zFYb9Ub*5hBN(7iWbCg!k?TfVDv5ruRU*W`Z%PYZW+J6t9<6d}v{8}fplPLSUd~q<{ zhVc$oc90NwHE+Ef+>iGfiFm++=eXx7#=7zG9%ciXS1|(t*h3*_xx;Kb&zt%^=2PQc zj=>Q~uN9#s&%QF%HjuNGdN=0b;b{C_*-j{e^$#p=an`^WBPc+df!c~jpwUlUsYRaU z%>w@UDx%hC+2A9Xrhdghq6KTf zlJ<`Y|KZiY=vP{=MK%IjY^ER4J$^ZHOrGAvueb1JNm=^?rnvz#DB$zQlJW?O$Nw2| zd|&0C$N49ee1>?pm%i8oLisHx_S#nhq?<-qCZ36JfNMhZGc7U{?V?=27XTz9A_V&`pa%Rnl37Pf%~Uio)`)9K(Vx(675Jhz&Fs()PNtv=YrGMD9^<=fU zamNGgx}$M*J;!Fe3gcT;x}#FVi05r`feNTRZ&m zar*<3KU?l^MZE>EJ8swU4;;q1fWWHQD+>=7?XSoFqdidC*p#M||d}dK<$=4T*B2ExyTMZ651 z050{KJzhAlJBeiJXUcG`^)Dz!2U0zaG^DAIj)sDT%ryb$h)G)HBZz6ld@ZsISC#`X z=O;Ks1wJ0Y#9xkCeMl%3*^ZfJh!*idRtJ7?BjD4Jau#zJS7Mi*0W8E*5V$!RM8^_^%4<+$mi>?6K^*tB@hvco_r9aRj{IP6HO;CM1@Wh@}jg|gEl!I@w zK&%vIkBX~`(401?MSrXMa{orTCAS3$tzBl*#bS>%qAm#JS3!&(7M$cHQn>otXy-7@ zo^8Fsom$|cK@|&?ZD(|eavHm~ajdiA=m0IUtPf(XqnBxsGkS=`$Dz`pOig?2VU+1d zhlIavL8Io<`48JTHu8NuvIU~9$F0pl=*-f{V4{*`f?Oi>RSSaLTBCr1H_MHpwuEY zS&lI`fE&Rf|1^ssSO(qOEHt4jM4Aat!|-OGktjZb%rpczGgJ^?)zcQ}mr2SXbZqL7(NLI){69-dZ zg%pAd=H|Ai0Hr19+8V!VroVt%YrJ7S+-esk1OlI4bI#!_L*BccTJJJ0pQ5PtvGC_TC-|y|Dg*f??Ao9mXCAE&%ul znc=1HM>(?N*EvD#IBOtj(IVI_;`mW%*Nnkrjfm~Z?+{dad{T(U=fx+Sb@~a&wFZ^g zO=;3X`Ie}5dtRe#EJ5g>v}n-=Xv3eS}Yok^1)n^fg1yPGU4hP*>RkEdId*$=akY~5&?WShznbVhH4%pTf zPDZd!x*M(bG+MqVc^jTM-i{8@qJ7BPXcb>r!OKQB9NxRu9JN0_>MiUVX-jW{jo9O@ z|+;%xw0$H=^D2=47^u?;15RAvWF z3;Ybt**gkJ7D9KJ80H(*3E`%hp|Z*0{VwT^bgviyB6i@TXJ}WV*#356L9ha zr~-yQoix!#pd@ixOr1@Eznh5#G+Y6ijK$T1>ktFO{b3|D;FM+|nNj8sA%~Cl=#5cw z`rvbgo{LtNmkKrHfe-mwvDx6D3<0UV;wOOP345TJ%1;Kv=r|XE9Z-<%e1M zQ7orSAFv_fZNe3;hH@qx+YR?>V#rl9!f>Q3!lO~o;}Tb4Zz!-EKR1S%1?Sxws~Rqj z;J&e@5#L(UmLA3;U{3?zE7uLz$JqE#rnc^b>;sto79e>v-TC@}DaZ(IH5!YP&TXZ8w41lZ3(tuU^p>U!Q@g3Q zv`)LJE?TvydvR^?YsGbh0{LD}ns6_Y7={?onqY~}-0Z{i2$DU{97u66Lz@7aq55&e z!{3+baSl{~idg_HG+6*e%%6gEJP(O}wus5zA+ThT?adci<%gx*2TrB@yQW_HM?r6;D3_~z-6@&@>KXEy(bZ}0i zuH^mF2H+a1MIM8(5L7;RXf&3kd_Dqn2mXj=V#dOI~!&wW1 zS+aDplq|H9mTYn*owMwh(C*;-Oh1%jB$B_xWCtSdgL20f zHzafMh|X%#!(ct(Ln{bRIWBk~(G0HiqfYaoLR7=?+>5Ibp+WF7$LLzB#o z+4FA*Zf&*nx2)qVfYKuUnT|ljX@Sv?^}{wHC4_B#oYTu?^>XD`-^Agrbo{I@cqR`a z*+*bd-|s^jrF2_3rJryvIzK+;nY@xM`sdEr*<6I|*pHm<+1eB9(K3b+jah_DfL^B0 zI34_2g#k|rlV)u*CKAOr1SB5M%kiO{DeR}6y>saS?>k>KDMNFLy7y5Ia>d6)KVl^5A*dphylR zN~`9-Ea5V_!Bm7b*K)ZVbH_*Zt8VKS&wI>hD}8s)x#{(MR(`Q&-WU1@{j|uBfOee^ zFpD=E)kp#+e}DpeK4|R5c|$+${8p9T1b^(^y`^yrMsJmlHhCJ;!0oc_4lZ9+MiUuem-Qot*0sb2tVlstCm*5XY?pFjSe{lM7*_Gb;Bq za{fC9>S(xZ0jQPPaf{4^OLM3s1*E465R)HZz#wI9`IipZa`HEwTp z=}(s=iwlg$IJojhvtk2uqa z!t{8)0|e^If}Oa^D7KL#|Aug>^2jdRLtIW~9s$e3yuKRaCixcr*hrEF7TuNLi)7Qm zLHYv+;HtODqZX;BgH+sUD-Lt;OhFKYZ9O`mRrDRI5^Y`q4E6b$M8MIYY<<0`uYft4P38CaSBoR=-F-Mq3OV4rBqO3nGCaU zV*3~o0yM*byv(()=knhdkI5ah>$q9KS7(PR#Wvex33XeNkRV{I-J7 zc}f0GjqRWG8khb^dxsX~Pu$`N*a5h-kQaw}cQp0R!Bnk9`x7vzBkPH4l^CxTF=oqG zaYRAI%L+&+EjHPc)8|ZN8IiZ{bqLlt6_f+mG*WyN-$hA|W5IG+M{hu$)3IcW182i9 zA#Ew%n%s{$#)(LV#|KO;5&$LffrBv(j*VfppVBzZ<^3E~I=7d;#-D+8FFL>_a+`PY zf%u45ogFFDFyjw0Q9D-h188t{NeAW1Pk+Uc@v0addDVkE=m zKk^>PbeX$6kXtVd>vhcjCUf^AW49$a2liglk#xasv26DE8JL+bvS}l5i>+#rC;(eH zs0dILCJ4H20u_5#3ICbDIOC{Wrz%9dfNd!!MjtGDzkt;XIr&KjsTS$L8Yh~hP8 z@?RjsKEt5SuZ#f2<-j}ve3y>#F6hO3#@2EwU;@r!m3(HcvR((vFn|g1vD}pQ#}<3> zPETx%7q(Kwaug1XyO!t)R{JVrJz^K=371~y(yLwCS{&r$34}sz?T%brs#9KPgLA*J zV}@}{yF3`L%`irtsQ%1bI?nH#M{}D1J^Db`00J&tTG}|LD0VJ@0jjo^XZDpEm&KXF~Q`Z=!6YjAJ&z*#Oz%!vYeo zrM#7rC=b3DL5IAU0Q6B^PeSO^A)tJ z7}ZScq@0T5NP&eI)K%q{Y&WXuh1N{!fKE{pI)Ei? z0rlQCDTWU&yD0TC=%wCw*kl;TI6qnococU}RfF1Ob?HGl8>#5haHjsn6#fObN zoF~V041ZDxXnuYG1B$441c!+tC7=aomn*@1#ey8CBYYTj1BZhyZE1h5BcSqJl$0E% zjX>-n2%-^f3R4#%ja1{()>M!|Bt>^L8Ofey{(|8+Orb4(fmDX5j!_-)`#a)yx~}RD zSAL8!?W@m#WtCtcJTcVn}(KW^-=I9?v= zS#f-p7X34blYz~1H9jIGauhNygF44JM_^C!L(DcKu%&oCXPr5uPdKpTP|^{QU=gc}F3($dx>je}@B?c=qo4B^m(+zoh{YtKN;Gzt;Y%bXll_A{eH&{rS_ zM?^ ze&A2mk~yRfYsu(5uA^1J68RDC6D~1I^X=YZ9DXEesj7ta+qg1gxIiBdK>A<48&x9C zNk$KIHbOwfN%BFEVA(UNCWQE$92ivbO!k>1`j+vri5y(qv9xZ;`C`U0Nq>g3z7$E9;=ZH z%1ALuZefquAi&@Uk;!KenZaLhseLKqVJ@{Vmm4S#@3|4rgjj*`K90!X)C`ug#u0sQ z2YR<{YYUxe!NXF=N6yX7VPWWYWtFIyg)9Naj(ekQi+!2P!hZguq^2h5D{GWXHQa z?SLK0(8U5RfX|kKzjCny@Hatjz~2K9r2e`WjivylUv{#&N$)d;W$e*$l-xAm8ru07en)OMM<7l!Zz#; z9ig#eJTxU^t9YFqP1VP`!8>7lpzNt^+tGpti}$`vgEFrpKg!kt&X;_JPIpUay`UV2 z6+1k(0TuiYB6tkEJfkl48v#B*?Iuox+HulAi}2^3*eN#4%l5D06PN(VnMywnJ;(=C zF?E*C_Tq<+KkXM9iP-MNcCm%xV~p);7G28ziL5pIpP(~nW&#o!K1Pqe((B-!KEZ%` z`9ct%97dc|fFFVGaz?<=XW}{;#<(p?^gw^KQkKMpNpv<^C38>!Gy_rTNbY2q4!rDu zGwW3a__Cyr73;Ztfdi6pX&g=7%oNB1AcMns2qYxmC0rb5;O5L7ET}_4*6g2j1N4zP zidpR&0!>lxA^ImUBc2#d&P6B4C{IFRc-H7H$}}F$T#oYOaZ3r%nshpfg9w~LUj^G6VZx5&28s#J`{n+4ik*W5VCgX} zdH|Fg$1P5)k9XVgVKnai9&SwBzch^mQDaK-c)t$FWfqFZ?B#f=7U>mc-Wxzsj?<8Al-! zo>B3{XW?6nc<}BpOApO0HQognFUfF&Zi%~he5kGQ_ZWX1Q}hxo|>8{QwwObz4rVoZ~MML;wtT5`<*o5_p~uZ=YnwU+E#^-MLxs z3;hn@kCU(?_09%-Itg#H!v#B>HGnuA92!Ay=zp`oj7M8HmNfK*g^!oMH)jwsx;W^y zCDdEexUpV%(aHn5^eSKJj(IJUYq>UdZk}wNXOtJ&?8OYOlF5S)w$G!+ulK?QFIz^( zqOE!KuSnU!-6YrD1)}(VT>Sd;vg`j~*N-}N{j*m6A^SZ5E55fvd*uVc5*IC#pqLss z7ix0o)6mgCRFubWbH#>fW$!>wMezsP6Qh}!#Ri%^UnJn~usW%c__p8N12|BpMV`j^ z(AM1UL~!^yHgoduzu$PxXv2ZQBgp>L!Q@0ujJf31_B8+6n#ajH)&$XN;6Y5PJvIp= ze)vq7$qFWG=&(xPnscvyyvO3ZHz2_0UQ_`v6c)b+9Eh&sg-?-2<%ZtF-0U`vgM3fy zT;naAPp7qc@J5wUx8oDByq;ee<6&q~=LNAj z1e&=q%k(AAksMe@bBS`Y#|mO6?lIpeo0I(s%m-M);^5=r{MfnGAG-7pw4U1xE%kRx zegr@F_lfI7s#ql)aLJ69de^Ft-`Q?efrX-iiC3~)`#jMv|l{%g*0I0j1yrC-kZ0#;cR3$!CK z?kk-Mt3_ft>`ChAif*N5Xo3D2e&Y#eSVCVw7wZtVs?)F%ufbSza7Gg+M5B}8-e9D; zkR48D;6YF1B(KNSyce!9`3e5ud=1VOfyN?e_}cbRY`qWAHb8(K#YcDSzp&o8wmmr~ zTb_v^_akTo8N`rq=v&&x+p(b^?wQKhHu5VIvaCH;96ku>uPf3%omz@6YUKOT4?m!_0|p?8^Bn?wT8S zy*3R`20!=1H}~aTdpYuK+k=Dwk4Yb3I*Wk*VIg;hmZyG?cl{Ms!s*xn00_C~XWjcY z1RUmVYcLt75vQUVeXiq#rQj2G&Y@a)Bdjmq90#ORLe=>~yfq$fzpbPSJ$#Vb5OXhP zMjTsPd{xZ#k`FY1;@SF0;Wviw*+^OV1{fs2S0JG6H~e8Vg{cydWgL|8w&SC?>o-`> zV7=T1>6kBJfdgoLEojCpmodp5ddWKTfseJKDU|Gkx@s*DE63Fb9Dw5yI7ZEq{XRcL z{Z{p{-0B0l&SOiC`JkzJD{#KUS#6xb)~RRtJ+1;oJ3gFCFV=tR>bZDONtM}yGd^CV zu~^BAk~yPLUCs`juLPp}3uKe*2Wl<(bY(QP!*(R<{l1B}mu%q~diwSNggBPxypL3O z^rMtm7N5kxz0BBy0&jI2%TW;LUPqqxKMhBw;|Dz7bGDpy%s?S>v(-*yz6y|G5C9W9S9xT(?jO-U6r)f#yVxo9<1;*Rq}yZD;EG53kOUPiJr)^i4?0T~QuS1nYb`F_$;WTro0`FsO#xIMDra|UJGTy$Pc+udQ zk(dRRp0grM17|bxZQ0O$5;KN>KojMJzFC8Bqg%!O6u(KFM(4rLH&Q>hZ$r_i?I&&T z8BV0XgE^zjsVE-Xdzj*M(cB;UIVhHimaP8;jU(4b($(v#S* z;tDv82_tprl8ja5c`%Z(WIH(E_ z9>U|{DeLKhD9vbmjA~G~p^%~C(1`pufIq>T1RwXECG{u2{X8~zLq2W@^9DZ!3Db)- zl*WVTGQoA8iA8WV`0>#@(0u>)^S*;9U-2a>-v0CU?dV-J-lkM86YE&tgYXh+#s)u? zcL90#cC-&z0K6Mxs6hwa!;llw;1%!dA$7XZpR&FJtv_Vg-n(M(C=E5aKA2t=KGljh zWGBXs2u1$xcaWYS|3Z>4W)q*~5bF7q^=U{;)I-*S5C0_>{s-bg?6a|RFr#rb8g#X6f$IhF@YE^msH?_(AnudCu^m5$3U+Y&!mp)Q2~YHW2rnQJ zLwy;T>mM@T1gD-B3-W;(Dl4r*LS3}IK%=l}(!Be@H|f$c>D9p{CpRoUiFFRg`(KA2 zWx;3W44#P*42EA7hk(q)<_3dUHHXrFm<&pYG%YUmXLq`euXquE`agO1SLA}d}V<;nes3tYz-O2KJ$#pQAzV>bN+IP$wY%Y83 zI37vvGoYK5>?PTko==c{uSwfbnKt{`DeK$OAc)^x8(Nq#WKJJyJ|pAZMAs8j)^>x0 z1hGljhKpTUv13zi^bj*|->H2>^Ok`7R22LZ)Jh1A%iur?G#T+Kdja#Wd#DwjhEdh*eP_Ko z`}kR(p(RK&qj`VBfH9VZKSxW$2C~l$R-NpB3{Og_z>vOc--?>ScX=CvS9oAwJm}cq zL7J2XlEjW#w9h~W(t%1ZqbW&q{R*S){#PjWC8S6Yb1p{{=+-N^-i#5_d1%j&jh|By z%*H(fZY(x5uRn<))5l1V?n3!(Jw3%y6}V)7?&MPjpQi5M(Bm*88~p3wGjBhPYpx$^ z5+!_eC+>A&P^1vsMd>ILg+x}TtnE)0EqUAm2H`a{QU^`)P?$e|n|9NNrjtXNhgMSg$BvV6Si@V;BCTzIo#KFG|Rh@qDjY*%O zn!RR*8w>ZXn9nzV%!37LnS)P=0&MYvZzxRf{*K#E z@b5WTMp6PcvM+7*chrxi4Cq_0CBGPa4vV+>T5gPf1`lF$Fgzi~f^1B5PpLSFTAYbi z{tDYCxH0}KEx`Le65$yed};OvxJCHj;JXLkne^IVHztS&8#1SS_sJ=bynt3{eH`DY zjFk*+%Kw!xEmSplrtm7php1{bgJ)o5!8;n;FU8Un)=6O-m8&i2>G@1Z-yT|=ng$=M zy5W60M%+)lk$@>+#K%%qv`2CxVzCdlWV}spUrYXl4AMM?8E+R&d1TVMU*3|4fi^u~ zx)k?T2DTem46#nq22iDDN6< zzeJ0RG1Zf3aZ_ddTDzS~dvh zdE1J1Ht}dW%Ea|r-|I9gGkk7ZHq+|*$8{It)r{9^lJXZ#nmF%R;V6kmUxPesOG#T0 z34J#7wNe5@%g&$l_#_B;_fb6GrI+o6_K7l9j*K-7VHg9(W>hKK+w15-^pJe}M>GP+ zLB=3o(r5u&0VK^NwxbUSJiIXi4>e3#Xt6HAQ%NkHd*Vm}Mk~%s5Ce-wFQi1CIFeyF zK$RB$XQ9+_PCJa5+qHYk(FjxfhGf7sn;z+rmu8WB4&&ktt2jO+e?}9O0gGnhrt#gW zQ+{C_8hCstY*`yWdrIjuu0ws(P##l$v6LQYV(jz#!9_wRF4%|fyMta|>Tf7H+$_Tq zl&iF%C2>5A#-z#+Rz%Yx>5SW4FGpt&J}ddtovsi2KcD^T+ILQW;vM5q`9?EdgVnr` z-~S;5Dd{75TH4)^MvV>x;E{ss$!lFh({6LU9&OuDc5#53yaoS8(ICvC~44>fch$;S8-@TLn z6zq%r;C`vPJ;naDZYf9OT7B_m_OTRWuNZbc0I`1vT4482h6I&wRTC!?+UEsg$F%+XUiU_>39Y)Z4U9 z1MTRi)QbxHK1uSiU+9%@U$l_pBoGZl{P-_RAVAnAi2wN4pZ_x!pgxF>HTz1~W`qWW zwC76rmQmyz`~aOMq;e5{jjsH8%n6Z8(t(FzoOkQ`5=QeUVffM-1lsEQL2Nb6nf~?X zf2{?Afwr#pc5l?%(Qlt?%kBsUnb#ZfcLky`f5h7v@%8w=D*5$2CXLJ_y6(-#Q(J1nt~B^dH`SlUCqoq?{th%Xih^;$YXBi|Ew%XCCbw=Zhp z)Fl4hmMDt_VnII(26~r!14xW5^+#D!Y0ft;pYRY--Lfr zpm<+4NOHa`|EcC9`Lk@bWH>GyAKB@x=M6GEO!BXgcQ&%YXT> z>*0Dd4x_h<*S$DzMChAkbquh-JoY&2?L+nu@lwa5A*{^=@TS9rsbKyPeBR;gYnyrHna*U}M)_}gQl$V#_m#;oWJBr4V)g%9F8 z^nBU)Dh`YJ2V$s89jG_-MVBC3rnKW!Z|2VJ_6Nf_t?);psHFJS9_r}{#3U)zy(@gd zK!?Q_>FVq8_r{XIfv*O|*xV57i~73!ZptRJScH@;x}!W04F`QIEwS!E)I!Zlq=z>L z**uOYc33Pa4t=eNK2>Cq*mUtp70VTKLs#OAh|kjFi!AR5_4isR8B5IH z16A;YS|aFTY43|fkSE1<*+O21sUu$oIxQ!#mhOnZvk*0*)3<_vZ2Xx~l*IZkVM>J%mDiMa5-XTq zUSHO{w4uU6HK8b}Ks@nIrf60aJ6%$DQ;{D9eIMj=h2EUmmGACG{L#K3iZhCFLdX*B@u8Mr z#K0>`7(~=aj3KfX)s;)J7;6s2d_fE3j=^|t#hS+=OK>+?reO5-3jc9vNkmbR7DhWTRDaEPf;iOF#q zB5?lpm=vo&5bH*B(&4vQ2WFuzSS(U$hNJ$zju2IgP`fau3L|Q$JrtB%NYwTup7!W* z+R$W11FQT{jq|QqQ^LNDum|BKgboBN0^uVay`7Aj-IdJO%NmACSnD^&4ke%u4__4L z%hD;`FUz}8)b#-3e9=LVz-d(iCPW$8GX;U}duW{`)^@Se5i$|5AeGT`yz>#JBV2$$ zi$JpwE=HJ(Fb~0o;6T7#S26ySAmA+2-!m5f`9}|!o-6>y4^L@Xc||4jwY7KnJDJsH z&vE4D|JASPZ1HY2mg0PLMO8kXf4u4J9-K@5xW)QooHw4gclXOUJ1+cqc}f{ub0mM| zQ=T%m_0akyjumBWUtL$v6F(`#$0AzaYWYK1$*m6$ocqA(+bYGj7hiH37h%w}39O3S^-myetuj~hjGEjUw_4g;eNlUZ4+#kf8x)m)Wq zyc#D@GGmlpGr}QDJYIw|c&w{Z&1?>S2I+cwJl;VS%9EP7-dH_3q4H+aP3E-;rrV53 zPkEm4JnMNH8Z1brbhaRr%#6pWULl>dMx;adPK2rvaAF&t50XpyaDxBeiGj;4mE{_* z)rjT1HDKEXeyXc7|8mkx$REMO<&X>tI}neN!6Z4RlLm@Ov;u^U7h)+A&NAIEq)YT= z2;T?&ay8w!m@^Q4HNrvA7i#DWWcn81{{Y>truQo8?*^WBQ9RDu3Q0fXN;&>v(0f3q zc^+B6tA+T~hMh#X5%dq#`K!9wwAO5T)A*EFbl{nWkOlu(fbaHQYUtmT>Gy)}%O2fE`$4}B^j(_x56SV5fqurk zc$_z`QXVRWJdl1VRF6Uby2ge#$u^t=`c>B9{?;$2UjzEHpzqPd-_7G&kaQ6AE_*!Q zfZrM$El_N<5j@`k&l*h{t7RQ_fc{sk8;$UgvjKj^f>o=i72%JGkbeqT{MK1&_n ztHe*k0OX-j=oZAWg8rYN-=mISezVDVyU@}TPcwK5i--9M@k9h3vhx6VZUYa!7NzKU zgKX!`pnvX($5S=*B$-aDJKrvg$I~?Q6q$Yq^xt7^(9Ie0`!sv_-L>u{=;(o z%n68(Pl{axe^Kt&~FdMgZ?t;m#FEgvDYEc{{VWv znl6rgDE;PZ@fXa{{ZN>f_}e-zFnqoru6ZS zLy4Ncij(i(C<^zjd#oO4}tzH=rmrI+b5y;dHfTg9~^_8iLw9hLBDvE_)gGi z3z^aAEujB(4Eg}*e+S*IPCusPZ!_p;Hpk<%I7!yu_#HWayFlLvdZ&i2v@eH1e;IUs zqb&KqYCL%Y^pD4&XQtrZVA1IDouKD{KAQX%&{u*!ntcX9UpoeUGwArNNBntB{+?Fy z54v-4JpQzX{aREq>-?^iM7E__sCv=dE)8=>+}zOXKk!8u~pl zy#@5ySByT+7yvyR^b6Jc3&qF%b2I3UG3dKMcaM?&A<&D*h<^g~iZSS!m=Ibx2Hgqz zWn<7=KwmNjeE{?;LC;d>zfI-;p!-2j){H+AOxstbZ1|7jC~ppf3QO=CS1Z z)2O6>0`y|gpHb6|PjUv*DRT;Ae+1pBmM`2JUThk6Z&(iA53nSSHZhQ8nQoAMp#${A z?eX|!8dFsIt=UzLWp-s>ZtxHm2FD+i}jFrk0WiWR&)?%ML4Fy zMzbxI2j%1VUZowNx?llTg5X5hiF6i-b?j!c>rLbfYt596p;QM>ZAtKir{D?Cz|PO6 znk$lfQmw$nazPq->KU~sr1#NCJibZPjq7c^ zN32k#$;LI}&$8rEeXB-HrzEDH|IzuowKjE5b*lC9)H!G-y7}KSeFZ>Ti(>a?m<%i`2&Fn0wgupp;UzPa5IeLK>*RZNHHuK{_YmZ=(* zZCZ7zrCW;5Taju+<#CVWd=haFtK-HH7gfOw(=_sEJ`pIV#CV~P<|mS$-O?wvgGg8M zvrWMG{2ee00@+|IutJ`S<ClX>*l4@7Z@9;?I(VE9c~+F z)MwB!2Z5IN?*VoV0hcLqmL`dU%9G2byiz&RZX9X-@%T34NBZhIWV{lQQp&`7QKrEXT)~BGWCEln7SX;|A5hW zbOhs9Cr8Cr9U9B+{sPfoS0mY7E8z=b`bryYyg}vOc#476TdoHSlF7Ea5VovR+8`xv zpNiMRdEWx>0r0lsO!?sT0&KhnR3?8-_#yZNm7n<Fr7GQe7=bu2WrklIxWEJ6ah?<<T!edN1`XIM=<65c^G2p`WvYnHg7>YF?u;Pn9P(<{m5uEpI8T3R1RBzh&fZ- z`;VwE>bEIk9Kn8`WYf<_vMcbyk@%~Vjp%4}Z7RxfH2tW4kbY_Z5syzEJ>OZzM@Pu^ z!sG$HEzo`f%PziF}51I*j-MijQM7-Zh{RuVs5Y zey7$y)#KR))7M5Sw*|?#T|&mtX=?hL%48$P?K&7OgdQASH_5h+pD6cxqMu`|(8fmx zTKB$^_tIr5m%lVQ#Ib6z|E9K-Y`X(#@@HaAV*6OHVk;9`NUCRB5cY!iH#n=>0MuO? z-&t4lp$;{Jn(>_{*$VbU2rc)<<85MG-VW0k1MW{nDE_LE1{Ve3OMwqQaD>Sn8{-Y}9ovR1_3hWM-R$Gj)bqtrpG zv1bImDwBobphQ!5jJS`)xDjR)#=-O~bMpi7INzyhq;`q=@&AI1;myaT$;<+^=vij> zj(EHZzez{YSB%nNgZwE7o=xC+Vf1`7n1UnuI@*R>z3677xd&-l9*W057v+j&R;g;= zvoMa)M=nd|CL5j|8sAd7nW&HZknRa>y6SpaV%$7Jy0B}>2yhkBO+#8?q#ORJIERJn z(b@*`n`sC!@V<((s@&Civl{OoL0D-rzt3BSXc;>(2O-9n`>6(6u_59mR18^G18cAu*Z@AYv3nss-^3g+LM2A>MnJc^csp z{QgrNWYy!HCj=*cKQ|N4_aUe0YiLUm&Vmi?2n!K95Y{2wh46EPmk~Zdn1q4-OoSqY z#Ryj;3?lph;eLeY5ne|)fsm4GV6zYk5b6;+5LP0558-ZvUmzSp_yl26o`Gc|I1nyF zxCY^S2s;s8NBA6Ja=wAhK*&c}h~Pt5hwyI*4@=|R5wa1A5gHJ_ zh7dxy4q*u4-w+-`*n{v2!iNaSE(5y=p&X$XVF=+aghvpbLcmCt8JUThSpu7Ym6eHX z64q8GV{PSRtgW1a_A;HFhSilBSY3GrI}`WAXJLKiIjEQCvh%RQ(t;J1GqA#PCYyyd zmKR}-UfIJ{Wu>xo2sE1N_0ZM3eh#HkQUv0h%rZFYrFNiT@V6jh9B zEJAPecj7%NtW|Cf@s!mm4x@`A)kzb_C=q3WdVV3HvZfL>sSfY5$Z=Fk*7fzY`6DvL zmZxM)NJl2AA~pK@WmqkwDTY^Ex<({5;{_U-ASG26>IwTIennB??G3?FR#6ibCR?+_ zp&?S)41>x;eQiO%*5*P=yu3=ZsaN8iwb)3^)x9IaWX)ko2!@o)SCA!^saBW(j+PhL zc34&ftBwecq_V(1TJls5vgYOfpg-o9Qx-1C=_(_k9&OrMnwT%C97iIS;RTi^e{VDp z3#{r;E8f)&WLZRhRnXkGx z>W{=oXmzhpP;x!2jtYR3WOY4(6rUtxm73A+o z5J_syc>G1;8)$gNL{6&FkJrN5{UaJuLld(sTX_VcwxCDiR5_$fZt}+j`&Qv?Jb0>1 zSS-AjC%al_#IM+i-kb@wBO71sC@7)6SU67NVag_tf$dOX$Epl0u~gxacw-I(A>_XU&@G8P5 z2#FOK*C5c5jdKA)4MGb-H^M4}Zy;<&xC>zi!lMZL5MD-j1K}9L2?S#$#@ua5+K;LJ(mE!gUBYA#6n0jIb5q9)z6;Pa^C`cp2dc!aE2bA)G{*0DGn( zoQ*IOAsYevSF=)t8id6Ntq4~k#1PgX(D5(3{=c#7OHAmN%J7yNn*3ms_`cQ$tb)3P z;V|noRHBB}1ll6L$V&E%0WEZy@OC3!(rU*WVC-2vR^7p#SE0>#MbXy*kR2to5-)6e zVi**)_2D%z5AHRLKx=$ap(DW>LAtIDb@T=O#9N1#SaAz|rh-=CZBL|uS&HFU#Q@L+ zgpzvVOKOaD64DgI`*3~XYBYErb}dI%;tl_vX1v+viIODx#lBCJ=0N-MvJl>S!(En< zIvTu3hhA^Ed9qA3e%}fm%q}t2;B|k|YS3tjsTObe1xoSWTXSehpu=C*?TfI@CjN3< z1Ktp%mw+)I<|6$O)?-EkxTv?A=d+_?pxw`3tc8v!Beu%i6!iPU>=tvgKhhKEMaL}_ z2K%PDIT%F-cn8Y1m`6>7?KX>V=pin>ZO7Q-62jHO^Ek7lYI8`|pE+q81hlig{sFx8 zJRetG{usR%i8rF7xVP|PuY^F%-@5{L6<%);ucWTv2x9?U<26vPFC6y9R)+B?kTzNX z(uZzad>@msYna#9-qR86W#7WDo@kes3t~TJ-ge>F@0k~`VD^Ua^vK}t4D@!i<2^{E zHbJ=R3`C;HO^R>@HDfFTzkBckA)Z^{7lx@}y#2|F4WxQ|e+O$da1~+P9?VvH1EDtT z@?r3zGg;1JMz5IHw~gLt%ok&y(K*u57iJ4h-o9SW^^(ckFDJ~VnSE_|Ntewvql$r! z`((4A`+Re!sIAA`3F%Q*Y3`)=+F6yklfMh!$rj>QA1L)^>fLb9Z|>|zb;Yl%&4Fk% zjINojHzQeJ&`;)N?CWNs>tpO&<{p1fdrufMJ^WXAC1c;FUobOPH=9Kf>_=uUg57Br zhX(9^GrdLX3u2zY92MDinxj#?RN9GkwPs`)Lqt6N;lH{gSnJAvk*vq~FOs!~eg%;o z_7wfS_OVkOi#iC9)yX(n^^1YUP^VAK!@Zuj8NC0<9i44PnOx9%gAk zm;JBf|BeOHFprPiW?C)Qi>(f8k+s@dXAN8XtgEcoTW_^KWZh+b(rU6fYz4M*TaB&B z)?&NT_Ok6Swkh^ZdzL-VUTj}vzrlX9{hRjN?04Glvp;B0%Q+(_JI9ezm-9%@o}6cL zewFib&hK;H%lQz~v8fK5qru^GbUXSS>mA>9+~Ih@@rdJ(j)dGfx%S-B+^XEmau?@* zEjOHdZSG+1#@z4cK9u`P?i;yp=YEoF&HGl~D|xy3x8&D3A9sG>oaS2Y+T@-#{~Pn4 zD0sQxNa4xCw4&^yrA7Tk4;4LD^j6X5MYD^`i(|##F21AqiQ-p_KcL0^7CalqX|C07 zU61_TW_=&IJKHwT_Mf)LY){ypwmonAjqMfNf7#x*ePlafn{1zIpJtzqoX)l9+Fka; z_Jo|%bMDTmc62#jcbs(mD*v5)i_==jtirR@Rn~`WW_v2EvcO(%UurMOsm!@2=Rb4) z3lq_v+?BaEAXop9o1S-8-t@fhAgtGPSifey1toLBdcLjDw%&H9?Oof&_JDo6eV;uw$C>lvypQur z^UI1ZFS@zt&Z2jVCKb07UsZe?tnhI0E5#od(}U#!B=@@YW9w8~j%~Z`_qI=L8TKFA zpR&JgH|NaAsn1!Svoq&~oKJI1jwz0F92Yrq9PN&fqc*oIcSUYteog-4`LE?a<1BQo zcWrVNxhvc?(6em*viXGtO$ApMTu|sK{88cV!tF%~#Vd;MEPkr^wc_`SX#oH|C!cNg zSZ}a?$9lW<8SBf|H>@YE>9!d*J3MQJZG&x#ZJX_0l*Q||w`_^zSzdKsQ{Jk)HF+EJewg=@yq$S(=6#rVcK-Z)PyVI( z!TkRG_4(h)-<-cK|Ka@KuuM^E`vM8eGzO^ z>|W?z>0av|a{mAp`mOtOcgpo`2>1wett(SD<$8F4|jkuxL(k9_r_%#r?(W zi`gDL?}pe9^FPZsI+L8IInQ>^a9-@RJKfGw=cUd@=jF~e=T**#bCvT(=hvOzcK*Qm zW9L22hn$Z(pL9Owe8Ksu^9|=a&JUfRIgPF)*J-Y^T{B!4yX-EvtJHO=tI>72tIc(_ z>n7KCT{~RAa+%!_c0gEXnP^S1rdczrRn{77gSFX8i!rysPhYeivL3b`vA$(JYCUE> zZv6-~?j#;8nQe)-6kD1t!+iKey+dA7Vwp(o*ZJTVH;q6=D@7v+=J8U~`yKK8{FWL^-4%?2v`;Xd= z*^cv8=p-IyneB=86nmOI19f7W-D01KHffICYIoS3_5#$7a@3C+dxO2%-eO;7Z?$*W zyX`@H*dDVF*jL-v*w@)_vEORnXy0VtY~NzvYTt(T;$Hg>`%e2V`)>Ol`(Csj`|Stp zFWL{Gl{;d8%YM{;%zhm8?1cR!9;KOc5_3{=(sD9#GIOToSaJ^KAI?9L&s=6#qASIf z=E`uTxij3E?rCm|d!{=JEkc948TDkDyVc#{?sf;=VRy_u;9l)s<6h^!#eJ)LqkEHk zvwI7?WSe`t`(F1B_fGdN_ipzd_g=Jn``riJFS-x854(@J-*O*yA9Ejff8;*lK1q-9 z&=%re1t&8vIg53s6&J0TZ{wIyqWJl*;|nZ6>l}=n$ISokxxR$&RU<_s8yneA@mHWr z_`lBo92R&0*$~SgEgt4DQ2y^AWM|J)|HoEl^RQ3oT)wN#JYmz&d6<8}j-K-ZInKO! z?JK+b1HIWztjxU(({f$?`F86vzHJVEXt&OZc~|7}4Rn^ZVgH{dy`4c{7c-tm zv=m%n>Y5qPr>itXL*6J+qlJJBMD6Ru?q;Sn;&9x zy#Z#5Y@qZ=1Z^0ROqR#qVczJ0ZKxO)-S`qqlgk5 z?&_g3F}*>8B(PsX-=)+gRG45keN4)xh^7nCR-ZAN-N!N?!_UB-U?w{#bZigEOp`cC z0?~$W^t9n!GfeV!_*MpK6HPWT zER7`c5d2pw@GmX{oQ7F& zw5Xx5*N6RyC-UM?K6eS;3r+70(Q^b&dhdRV{==@Ea}i+vwE0|Q>0m-b3zMm6RT zFq0Z{3Ya-P7=k1*Rsz3b6Vm&7BcUMnp~eG^P?$|jUxCLxp@?vmm>$HFH?G_yX1WI& zC*BCtc0oa0FT*JXZCKck{js^OQ8sCzfv6(9Lczbq@d;9%h=4~^T`O5i(*D;GVDr41Wd z(({x6nTfisIo)rXlI2G^~W3h&?D-(#wKU zLBEeBy+Xgu=o12+=%&%bBpo6oQAE(=qvcBa9bqXGd+=OOc)XSL>MSIeCLq{Sk|iA` zmYEYf0xQtJvZU9Do;9&2v?2;K{GPH}Kv%19b%d@;CSvo@F4}863S0bvVwV$x-^(`) zXGw1mRK?@81yOuHX#N&qH4{+-MBtBZh-u(J6r~KoM+sRru`}$Y#8}ch6s4Q4g(Ti3 zdXTQg2=5UvFtMj+K#cJhim{FZLX_k6;JAeYVw?{N**FpVyozx?qBxs5AjJ8YQr*G< zG0vxiY^PKxS}cT|!(Y%MCjE^f@0=L4dE2ov$}g7o=Y;N>7_@89lZ5V`NHqpe^SZrl z{DEB3-wECW*PtTu_4-47QC_Qv2RrK~{e$Rxr{ckOFCvjsVDY7az z@^nr}F=U`Rb$DaG<^Eo;rYO$f3~3?*wyPeADU&m07?{b1I-W>{N0p3Md^0nhj^7+4 zKjR>l+g>bz_m4d?9$ zpotON_@tQOp3~8+w;;9VMRgV4rn0Jv@&lj* z3s7P;Rd`3?GHSV+8fvPWDWxW6QYcc~${NoCE~cs3Q&Ypt3P)}I;ue;mx~{0LZ(QoF zt!}FIG?!I*g$NTAhRQ|IsjRla>!~aEmNt6oz?5T0w<0S&5=WkcC63L}R8LAau}Q<& zJT;3{qF9nbZmjS$HPx4StLvJ*&Glp_yqFEw!Vt!`$S3JJy4yu{N8T^lPZE8r<)nbL~7 zipuIT_%u69VXY}^5Z&l(1w`SM!;-CN%P|EILexIfHLc*J69YHoy0Pzo0)BvdO;4Ymfapu8_etH60+!+Nje zMNMp`!cXRC@>Er_Sz4^Drn#J5sKrW~*+p8Us+yatvKmTcX-Q2g(rhiMva+$FqJdqk zpcO66UZ*w3neQ#DuS0`S*WAP|QOFBW>Zp3W@$oj1#;6cAY>vV~;G#My=QZ^xdK6i8 zE&OEeXk1Or_3$oPN- zx5lN=TnWrDbgsfl-T)nt5wDsfZ$u6`fqaF`-M*ozYEfk=b1JZyrqqCXD_Sbb7V##+ zr7#Je?*7d6tRt4Qr%odb(<9_ zBu~u}&(bDuB|0W_V;(TTaapm#u&55rc@0&)nuhQdRto$dx#Z{8WdKhkSje+&7!SXxdN-2KJSvo>gEbop%8hqP;2upuJ(B0 zk(COiuD%)8ZSYh#de9lL1qwy#=WHpfT2RVrwIFh2WpxTh`4BvgS|?VoPy`nfy%AjiksF4SD?K%k zgy9lzd`oMq*<}igI39t2mRIvm4n;$)RinZp*nxWnYf@mTC@&L@(X5a><(Do(K?;7u z7Ab^!jO(f^c~wQH)l|n8E3_JvJzK&O@4}$;QH%unP;;?3j^qQzPJAT?UsJ#x!)iWO z6vmP?Upss(X)t=v5XX(4Mhv&8$I)IlkmbdJqsYP`XDKERsKMi43sn_ibjYtuo0fPQ z#K9m3xY7xN(jkcCN}ENcxn_#e$y}+F0VFQpd*MEgC7o@gJfGq12;rs_YdgI$EMxTI zYa4zq5X*7CMvEL?-L%1?Obx7;I1$%jslH zFQbzwy_8Po^rmV$C#0A2^MrJCFaVk`DlMz2FD5MM`>2#R3o76Hc0(uI}+L66B-H1|qU4bkPLYMT#CL*3DD zsND`Fh3Q;pPMVR9(IkoSmcikg(2ZQcOfSF*_|4j%QR>|98kp%7{7&g;8&E#S*5eDa zq(~w$5h2epj1(0}(G?MgS06FPsa#CmS)!O^W-7vO?wLrgCrVS)E3oPq(^v4wP#aza z#N3(m;Wt#*6^Ru2bY)73uVxnJ_L3${`tvz(TQnzS7u#K z#|!l0ds~=r)-l;QQzA9Eop>BBRlmjfodU<_?J}O~pz1j$5d$8+iBH@3b1n0t%c^-D zNV$fZe$zLJB~f@HHo{}EL=)7Y?^;=e$4ACA8IYbVWy*;9ftfMQ?B#EzVpNC+Tr!UW zCjJPbXXEK8&qAD;&cg2$FDB)~?esneW|7)h%1HyU0B#Si5)h-25OZf=Z##bqH~Hc& zTql@&@b}EbCHT7%fgXx^`S81@8cn#DO`g{a7+^V#$tBQAU?xRKbxuk!vFA!y<~Qid zg{u@?{pqxR%f2hF2X6(!4{B|1S8srf372n>=+p~vtS0p=c$wN*MLTh zAsD{QQU}!%5bT2?tpTAF@MasWB{BWjV3;vu=|XE);nJnnc||j37_rHS;eN0f*>(~$ zTx^+pp0t2u-WMz&5g2pq!g(HA_+THNHmOt4F3^xT#H`VhmNB?NRj+XwgHv3m@+B+= zD@9`Xlvgynn~WTdbp%54Pb4G!7T#zQev2b5;R0_>;bAm>W9a}r9u`n~&WpBPfawVu zJ}rp{b-vyhiNTY1TB3trc(zHu<{}9q;8I$u(#=p4y4r$s>ES5Ra4FH+u|dbbj(<`M z(0a)@4phq3iP)R^7C5Cv%&W8(5L(MJ)G~UDWT+Mftbk`|rJi2N)op zV)JyEH`I0&F8Js;v!zX|UHk7_mt*t#RWC56; z`#k*~;Rq6*D0v+*tOYV#M!a~h8y^*BYemGwyus*l0PNQ?La}b6bS8kPA%jMZCw;|;A{bA z$dy>L!7~xJT?#_q)L5cHDuK}Spu*D#0dkg8t@B@j z)M}6nv~xFVkbEF7YLEsXm$=mF1SpmUSqtQM8svvSTzG3svHZ_~+^Ioc0+N8YgA|_k zf%rAZB>3QN4RQgHsc4dvSRNoZYml!2p|3J4Jl6nuPlJ3P$jm}D&t4!`XplF6+@wJ! zqd9s|gHWsQ#K&_LS=B)Pq(M4?T!?r6h)3{*>wp{-5uv=c0HF_BDd{{5^MxT8*p*@~Q?I z0z%uUDwh8tkP9`)eLxm!ke>s&T7&!s$oDkJAAtN^gM0|&O$}nkB-f;cYUxvf*fa<& z6)dPz^W*}-Q(TqK_&f<)u0a+9v0<`E$QLHX1HH&-pix3_!Fs^+ev=v*08-qnMs5Of zjRx5SWN3++XB&{0m#L8*K#pB0A<~FZ7+KK>?e?Y6#Xvephcse@OA9@|fkyvAeUW*@ zkvW=Yam0vDbJ!t`2H^-iw#l#&_4u2^xX`XZLkq?~B*A1r)f?gX6d2tBp#uO)*n~$rs(co*wt7WtXmTwi=f(PS+NG$qb-2ZZSS0;5u%-&^;$O*P z8MvlaWTbmN>0YJ*baVhC@&IO((-_84LQYYXVvk8QI;5Pwj^9E~G2=!)rOhaN2{~QU zIz~>z*?GB6Yrd>ACC-i_)*dMq_F59WHO(hkgLpm%kDLqn9z>8u`MMW8s9vf=Zy(B? z*8F<=5Rd*K`y7z%(~T>WhDox|pMVPX!FE@e*25k)?GmF@3#>d}BbSAwb0#7QWlHry zdq_H?QjS`tl0NT)N6@Dq@9(wyA|2z?$AWYOef0MED*Bw1^`QrHczUR)0}94RsPuw; zEF=1=-i8=73@=mhc5o&rUtZ@C@>SN@JhP>`jC_?!VYGXE@(m~MFDM0*0mIbc`iS#3 ziEurkEU+&b&6Etw`Pz(e|sR9;dpF9VO%G7X=%k$Cu&QJcEmxP`0= zGS4ZAVq1W;;;bO|1EH@9Qz|Ce&VtTl=X~VwOwg1=s;6JZ&aH?h*x4$nDJLZLRu(--eI7_>*HV1;_Ysl@RHMYo8W*Lh|oYy)cdFH6; zlwU6AeWbGB`jmU-Xk_6+b!4M>=#ttn498Ix)B|bTL{aC<$>)`P;X-wYJf3O5M&*I5 znU`OFIq?Xxv~nmp(r2c}X7Qi<+2~P^KBp1v*wa- ztl{25>8KJAe|{C;*eUzQ2cRW8!)qz*j6?+cSg@!@pD#l2NSeuc=Pc&}Il!%oSRBa(azuj^1EC^@(Nt}(QWlQ^ zryMHB_{w4g9~0}>TXOxvM;wN=2_%(#Y?tg~)B};O$|3pKO4)`eKyPQ*X4TrU8aXZL z5L=`XY=|gWW$Ta0JaSJYAmo`^$)v+qvBoY$|Dqm01H&DmHc@+_Ra468O>$28XJ;0cR470Pc5kUdgaaFKTd*{eZ*N<4n4 z|01Se1KBO}NUfHTGFj{ZX!$%f>CacOn4B`d@0L;!&eAA_=8_-;vOdu=h*z&eL%|xv za~V)=4@+!h`8BfTcj1asR1V4VcgU6>hz-O>9?6t+3m!U><-bba_eoYAsrM9H$OmM7 z@YGFuT%tGvdk=XR^clH@l*&udc@t6``HnRU<{*C@F<;^w$o?^OCTo(Nov1|Q|0Y8f z{z9DUknH?~oG)~_v2OJZBIllnNrxkWu{}HsJclHGc&vON=S zhrXPCM8oraAmQawEXjs~K9n!|R@p37uD)7(C~Ii2Xwr}_xUb4K%z~w~t%+nqdL}3I zp0HsL{6pmzlFki5p#(-OQ{7#gRu1VS-DMw_ET%0^uCk=hZ)JT5z8^MJj<2E*^#EVw zhl)Ph7L+7P`us`OCyWlRU2Pt&*ptvuu#aU#pC_i*$P>5?QNMVs4}fgcAciUMIt_9r zkk%f_e<)fm@o11bAgou-(?+p0NEFCM4e~7@X(1_=-l`oarwh5B(jTcs`Z8AiXpB;( z^vE-}pCQ%mTVdZ}Es5A_osccxiFel}O_cLaEcmPU&bLJ#I++Yk9gpO_^vy+~ zb}P&5z|0RRU&rKpNfhOLD)U9;NLeEBJ zN+l_j=|egO$v&B~eX#B!7V7AYXm9gBK|04nVolMd0s(a3Hd?M197qBp$CAf~0z&2W z8MshMREOTqlrQZewW4FyFKM(xPoYSHiLd{`O~SB)>YxK6gdWy`D{bZ^`^=W@(-FYu z#5Ap+m-f^Ld^|k5eeg;T_W1}zwnjuAuE*K1&z`6nnF+)alMrvr9}FVa8U=~^{mX&u zkrByz1?iO22r_fNCZCd3%YjlI8nOQp$0TD}l@cY3b;}l82Xkr1hmyr?vc-h^3-O~1 zyjPWU4);+`N6|;@PZgc1jI_s>@&vIJEtK`?7j{EY_3vI067)geq;&!=RIl@NtunZh z>`WuIQ(@<0XMM3}R?GRKH*GYI$v6UCwsJd+?pN(o&Au{tuR@5)Vxnw}#5!#s&s$Z+c zSe)-NAgvn22jqwb2~sRHv%Dpd+c7~pS!|aDb%LiR{gFJO2Ec#E6Qp*mL~h4ubz8P1 zMm|%m9FVO_&pT<{hJW*E7tb#NAKU*gU#brCK2HP~PcF%i5ZGs`5_yP`%vlb z-Js;FClFOlT8MgWM7|E(F?zm;?ML7_vQ6ZXy;q1uIc?U8MvPOP)2(t&Hz9SZ56U6s z^qX={yF2hsdO+KfVTB-aVZC$ooJyW4@KC;R!#lih65Fv;RV%kjZGr&}^#})fuR|Q) zjrCOV-;})j2YP+OAIP((k@u}%BJTnZ<( zFFS~QHQX(f=}2P|(*1StRACrQ?U|6HV?bIp$Y($-_lW6GBy6Yz9uX1z?HnMqRzyi> z77*DJcq}XNph_w{g+Q!75xtJ{Tnc2X23ZPZ8$&c&z?hep;K ziY0jzCvO0<^#LgsLEi_mV}}~q282DRMs@%>@{k&Nj1b&%DC?u1A!Mh7NOeaj3-X^w zpog}X(fbdzUBk*{NG7%09LRMNjuI$|3of3$lbe zyXc5cb`UvDdsxirh?3xA;5jbwa1rkU+3|>EAA(K*VgIQ{67ejzRYoKm3bM$CFT(N2 zlaxcUVFMuY%8`6t8b@uFe03C^$v&&6OFc*dxQ59RR~j7W8dBZSNtfrNWLYdbKuzS# z{G*9j6-^pSNbXxuSc5od#zKSSt-+;;h|*7tOZrCGvv^q5XM+a-ADSIhfh zo%BOG>1%Y-TXoVC$0hxcPCEIKCZ~?oI_Zmb($mHz{Y9Ph13KvgI_Wh!>6zn_en2OE zzfO8gC%sfB-7+re`*qUy>7>&ePnxpGbLymLjZ6AIo%Fpr>GXtGD?M8$-8wGmdv((H z=%jb+q|ekzcaBT?9-Z{vI_Vuc>1XStmyApLZk_a9I_a%C>1jIYRpXMrODBD&PWm#P z^a(oY4dar&Qzw0gPCDIjLY&eU9^{n-=dRFb648DZ`MiQIxgwA=%laHNuQ&WzELNA`?#d9(@9^W zlb)rMev?l6j&Vs}qm#Z`Cw-<)`gJ<#yT&DbwNCngPP#=WeT7c?o^eSZ&`FQ!q)*dH z59*}v8<+H$PI_1;JyR#WLnr;fxTJ@5(rLAYrhYjxbkZ-^Nk23$=|P=znt#?xPt!?n z)JZ=wF6kXQ>8(2Hi8|?So%EyQlHRJ5PERznc{l5%TXoWpk4yS8o%9x+bf%M@rIUVQ zT+&-~(wlYCPhv!=u}0o`r$~CUPI`k*`U#!%Gj!6~&&D%*(4doEqm%xTPI~Gol3t^e zUZsKaY--NNiWe!KdO^{OeZ~aT+&N) z(hGFb-_l8c;}l6R&`Eddq#w~qe_1EpGOoNkb4$aF_vxf(jZ3;iC*7)(en=<% zQJr+_xTITk(&y-;zo?VGLnqxiF6nc0(zA5Z59p-drITJVF6mi1=`(fG_v@t7ZV1}? zUNtW1Gj-A}I_dj#(!X(vq+4{-r|G2c)k&u>d};IEFs{5$(@D?NN#CQB-mR0~GA`*E zI_YUT=@>XjITfBMemjicWf>PC6dY4U?X& zNEg?)RLjq;z|6MdS(5fR14x)_Xc_T2k+ghWd3Hnb=c{5tEgV+>StF&xku@sBD6a<) zWMP)iK=0!VaXCBw=$;&n@P?!QxfL=v!a>iicFmBUTb1Bym@LsgOJw`#SG{)g&-md9 z9byX})fwx?*V^!w5fan-*hZ<8G1?t|Ncn03fwUOwdEB-!p2vw#&FmRSgG=WtY==F6 z7yQtn=q$#{Rp~6|-9JX&rRR+QgZXl7lWHi}wKlXkLeKL)c+8KA_ny2qX?Y}1KxBS=wWr%hq&g@+ z**`3mpoBQqK_D+L3CX)kDnYq^jZgX}o%D@5=}w*Wdvy1wZE7rr0+(?w3csCMh>Ds>+>%6U-F6$xwn!^F#m*7f?|tJU7kjkW4lgz<|&f?kxu%_ z;dXXx(@9S}MbeM!q@U19->Q@T2^u}oKL0JtAJa+yNGE-ZPWr2-NcvHo^y50|n|0Fn zpCak>UbbjM(d&-sq;Jwm-*t+lAJIuas*}D^Cw<2$l73hx{VkpJTXoXEeTt;hZX{aE zAJIv_MJIjW6iI(kC;hNa`Z}HTwo@eifKK`$o%A(2>5ZpI`hK1C7j@EC>!iC+k@S5! z=?8Su2XxZUJ4MoI2S)r?){5lr*GZ4*q^F)D>3ek2_vxgEb<*jLCsF7BRy)62Cw;F@ zdQd0*jZ-9jmrnW~o%C*H+nOecNgDU!ZjCw+%bI*kv(rqs&3HK$1WHl6f)b<&%4(yuy2(zoiQZ`Vn0&`EDT zMbfwEq;JznuhB^_Iz`eq>!fehNw3mLzxWhM-=veiMJK&nCwcUxj=1^XD*Nu zF&*st9f(H5zIMM7%Nylefp?bdqS*r}f3|?v z$KP2`=Ncy+Vg7h_h9KDUF%BIg20u={}s&wwZ$9;+wJ zESgw*z(a>(pTj_;bp@0Y?1c|RYW)O6+Uh`wWx*uvNzq#b9=?$&V$*DlfK-BKmpI=m zAXfr8u89=^vPZ*1JK`LWdAwe1!qppMR&j<(Naqgl(4pwF8%QhCQA+s$kZ!QU%|v}( z10p@o70M#$ZAbYEyJ`t3zpqPq!s%d0Q_DIZi1buih&7jZkdmSg?T(M(m8*!crh0b07=1>66*;d(i1~LpMyZODZdHi2%-u0AwLXa zpTI0lIv;|E4j~uba9=Ens}|XRyxzWEZ27cYSVv?L^)X`ajU#e-QTz*l(4knv0pwmy zE^2{DD>?+7mjbaM7F`KQr!JjUKwbn>w}tgTlFnNZ>t2o5 z-3MfuCgsP(loiYW5{TBvjuDT>H_T_E?r2g@2eMUTpE-ocWkJdo0Fh?!guE{VB0T|z zuXYNBu~jY$inSCx5U%osE+BL$mcI_j9*y+dbUfR2$csScARWcW{-opi2N3F;NMAwc zX_@#6gT{sz1JS1A22!PoRS9ILCRQ_$BjOu;R8O%-EI!;whmx;W@Z7736$GO2csu(e zfta6d+$FW))E@S>hgUKgA?_PAu?YDVM@m$(wgL%jWZg?VnsR?qlMdCdcC_T zbxQp^@`e2qNS*L5NkihMujESiI}l07S=c{ZBRvI3h6b?!Q9P4U#^!mfTaz+gbt;}?gWyEW=m;BR|9cqWPJn3ZjFcEMd@f_?FP~ckmLxmehEZ)PHh3=jfH}t zet!gH(au7Pv zc*}p6CSMsqNS4BL9uR2;SjdG7$R4~vsk8|dK@0I*?ydo<|pWx|_@QaV2a4;_NV$mcuy!c16u zDe*iHo&inDhk)$WAb$cPJ#P{;G|~g@N6D%}-tcu~AktV};K?Q)9Evr{fs|`fZUiFj zzKC3O(zY+iyT(`BC>^B)+kHXwJM4glrw2U8e4h}`1ALx+# zbjV&H($i!iomYUEH6H#Rkgb}0eGX)w2AM=%Fc3xhG$4ORDJ%8M2BcLJs{{xQLX>h} z3PhUw0xOPwAiI^kV^1JHoOw`ZR&3L5v~ffy8XAgj`( zvz5|OWC zPk?Nb)A2^5?Y`bl=G4S8V@r;h!b3d~?i2V+one+JKCxqeYD60j9iCeDZ`=IcBl(!404_*w`MIuxC2fs|-0wiL)} zSvqld0!h&z*NEvTvc3z1d|pBB2Vw!D^xcn%u@vdg>X0{p+@i_p`#`96i~R+^KV8Lh zs?@=MXwvawYnb-_4wk6N*HkDY?F3FWg~nPv;Y5wBOGsfHiiTAd=%dMdGZ1Osk8+D| z%K&*xQx>-Y5f1p6frj894?7;P;I0;!VzHNi5T7FbJs@-_$UiKMeWa0PnGR3TXgCkZ zb`4Spgbt;}ZUG|g?bC_2{w zQQCQ;EeFzqvr!EADxEIYZ9onwvV=hsYt_iQ7d*R>h+_Fifn;ht^JySj%l{e35kygX zVRiv_VV2YJHU<6uaEXI7RdR6}c*vuavEM8p)8tshT?m9~lTs_IfY70&6VV}G2cm5c ze*i?-^8p^t<8K49McWW1@zCt7IcB$6~17gqXB94_+$P^mGHep`hcF_+s-!~ z!p)7Z*VpCm@P)%79uA8X{wWwP7%9f+!#NnAH_`WDFi^#E%&51WKIhE5O9H*M!>Gf! zg)R2WJRT zR1+k0cm#~QeF16%YeOAJ%4jbBh`r{AHJePoMt%`SQ%XWceb_DAh)UPyU)cKA3N|p3w7CU4F%~+QJ#n^CQk0 z3l(wYKk&_S3{DMS<>%nj)t76kkFgWn?u}a`(>i_ST@l#OIoElpF6oxtz9*OWETltJ_h*)xoFh z^Yd%n@Dl}_o`C%L47JCNLv?MJy_y?d9Eyo9ZYmn!$%Po86Y4OykOhXIvARKhVA+k! zGCpXHK5z{#JUK~)+pY{XTrO$;dCnW- zDdMU&@jgC4`*GiWx3BC&*U@&C)dXDW)r@BE>!!N8aBfy@*Ewi#Z2X5N%jUVOX-R{= z^Rlr=D{kYgI$m>==YA|NTNq5Vu^r9}F6zY8__|gmQ8$hE$17yPZC$uj@E~rOX()UpYFVhFnxkSqn%s$i6M_I+&3Mu#*s*RXC!4L zjr}qf#C{>kpf`6qAUOxmY$+AF>$jECR%!axvi_6ROzxAlkmmk)!k^aj%E}xGd!^A% z%w~Tdw^<$^uNmhJKuS-T!_D`q#!Zo>ID@o)ihBT+)xobisv-e~VUaKbeoBmCR57=L z=PpyCia8wAi+Ko#>@z2-WUWCbN2Q>oOW%A8_hkc%DM=eY3mwYRQ?z`$U^!+Nj+uj^ z5>OAI=hco=_3?x$oMUr<2;a}O35)I+AB0oKF}GXj8crw3b=|-P@eueutdfi73*b55 z$MeUpU%!B)f$H`~?$RVsy37?iEdi4Oox&nQ&JN+F0`V}w!DR3>uMU43fE>DVk2>N8 zf(FMV2d;uU$~P&Ye)@J@Q2B8=Vb~(G0%HyKOPAi6mueNK8Ql|ZzRk?!EwPL~r#8vU zC6@t`(tBb-N!!ZVVAVU=SpX)1N@O2<1xf&irMGdpAu<#6 zHgqIK!2yLwZ!;;xCh?_RYC_vBY8bt!*8 zFu-|iy0IC6mU-DVh{qk7^{?7Uh8;a{p9u|XHuk`@tOn45dH_ojG@vzT1K?Z&C-}F& z{v&|$AB+M$l%dtr zq+J{eV8HU7vN_s~nvyp-;q)^;e^1tF51R2$1NOmGksh1z#gKYI+PekN7P3T@Hjn`kbgp0rt3`?o z7P?i~o*Mx+4WW}hmDM_3wWHV2(CnAi3E9zjnZAfQazmg9-}04a(C}Ce7f6O zlP9PbSc;%Xo0%lD@s1)&V{Z72M8+ZeF5+Dv_l^4@-@swm_*X*pDBmy=f4?>0Y!VneV9$pem9H+Z&diS#*`zpoD)SmvmIGE}rq2)a z2)UrA+2ncrXr`09$C0^^bu@Y0bmyJ5ohKXx;4SZ}tGGm-vD6BsgcR+qLRfz6Q$1JV{1yFa%U-Lst6C;=#&CfdtyiBMiGPCz3#kTj{7 zu@!O&$nDUMk_{)^Qf8ZSoR5uRv^ve`_Q4WPizH(k{|}kEs##PAi8EY;R~Ezs2edjb}{v#X!X{;(2TzBu6g`& zVhsF8rz$2ZMq3aYr#>($&^|Xe2q32yqTZ9Yp>q>)_M$+Rr$h(g01lSgzF}}? z7g4Vju6J@G;+S|Lmrim-+Dd1c;GGVzG+kU?(El4-?retNF*L_P{Vu6gQo8ydElD^} zaGJY-{B+{&C>9bIh7#U}@FF*y<2UB6t(q1neAku1%kW%%Va4>vR^_Ng&P{zi^!k{< z@ci^52VM~gNW}J+j*U!5v&PYMLbUm>nN6OC(;zc;@TsTGkUXP}So}-3bOp zBD=ua>#Y!Ls=Sp069?@M90t~f6;UnMuEofAmdc$4E}}uCSV}@$ikx5*iKp<0J(}UIoH6gB<`(@Atw>*OyS-!d_cz;OqudD)2=;kz3=er;hn- zvcq*so^~+37nD%(`;i?l>2$b8`Af+pyJWHX*gYIacJ5t8gyBA{I}Oql`giidc;CQf z6jd_=Rq}-JFo-us__LP>CMST*@baw1=SPB=9y(V5{w~N<1L;6jpO<9vJRJJivb(=) F_#1mDMmGQe literal 0 HcmV?d00001 diff --git a/demo/mkdnotes.ini b/demo/mkdnotes.ini new file mode 100644 index 0000000..8d70667 --- /dev/null +++ b/demo/mkdnotes.ini @@ -0,0 +1,18 @@ +; When you using "--init" command without "-o" option, it will apply the following default values: +; +; title=My Markdown Notes +; link_icon=Yes +; theme=simplex +; +; +; +; if you use "-o" option +; Don't delete any items, just change the values you want +; it will overrides the default values +; +[notes] +title=My notes ; add HTML title tag +link_icon=Yes ; link icon, Yes or No +theme=journal ; Bootswatch themes(lowercase) + + diff --git a/demo/mkdnotes_l b/demo/mkdnotes_l new file mode 100644 index 0000000000000000000000000000000000000000..bc5a576f9f5b95474c13ab5cbdc5548bafa7bda9 GIT binary patch literal 52448 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

GL4|5&jZc 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 literal 0 HcmV?d00001 diff --git a/demo/mkdnotes_m_ b/demo/mkdnotes_m_ new file mode 100644 index 0000000000000000000000000000000000000000..1875d0f02779afdd2c313d503282fd19fa8ded30 GIT binary patch literal 50064 zcmeHweSBO+x&PTTThh?Dse-p&1eQv*D6}b3XiI?vy0FEj#J1r@=-sAyX#!~y^8zgx zNZBmpWV;ZNLa!i31*w1%m6Y((vaKZv$V*TzL`7H-FK4l6E*CLyx%T({J~QX+p3Md; z`uqHTe>AY?%ro=MGtWHp%ri63%$Yv>{#$=N#4tQl45K5*Fbp4lV_w6E7=DBd<5Tzr z@e75@O3n#f}(UwR&S~ z3OAEp)1jyglE3^lg+n+ug-)O&9Snt9THDsOI8mAO_FS*%y{s{8*v^or>81E1y-;m+ zeN%NakTU7@b}4$-YM~LP+?~G({8ctKw4^GWNpDWKqBlnqAdI%0^e+^uY-w$-Ygn%_ zGU=6RdSw(k{s^bb&&4a!L!q{YE9x4mLUj!_jRL#dxA#WHpWWnyGik6K`;U4u3fY80 zOG{Rl*s*v+A4Ft@I?mP?4O358Z_PIHH`Iq(Hf>nfSRZO?ZJv~#O^)=_<;M1$t&8F- z6k6YyYK4jX6(T?RE7ExgXVUwePU9;Ss;~Gk{)#odIZ|oEAe>H*^*zBwud1T8A{CJ- zzuK=W{$^?v!s+x ze&pk^Kkh!a`Cm?c@2=eNt)KqhSN=%(72;=1&o_*Md?{OC#^DeBx`X-R7YgV+Sk6NH zn5O#E>*%JQRM{wh)uxu#>J4+xoC`kc)~T$Y#f$XU-UFI=v+jibkPqc~@b91m4ocvl z1P)5z|BeL8gXZspoA<4StqsN^WB;>%e=u5beJ7ykw4hl!9yE7af7!p^?0+54pt*Ha zUXc;Lh9bjwk*}f1UWE7;jP=J69E$MCnOZQqlgQTZuQH7A_XuEX-e@6Yo^4wGz*3Pxk3XnK;Ihe*YuicEaJqL;iEJV`?8;WSW8 z#J^~_uam>BEsNxpHdkoEz1K2fS}{`LB#{22+$5F0(At6z}HY@1TW?riadpo$T8NxooUhbJnKZz4v!nY z&JTdXrjvx7Ot&sa8rz&v;hjQ9H{J6@h8hs76h{V$-s$_RlwZ6Jhrv>ulx5ek9{kF zS1@|y-VPRVM9^F_hAzB~k!F97yta19E7pP6P~>ZP4ui;Y^A&S&x%uRBGZsYDa&v1j zUS?zop4Lym1}e^&p!saHpOL}nRw7!rAZ;kJ8bMG&s7!}~v7LVCLoga)>Ct``ggoS7 z|42}@;!4cWq0~f+#z-N&+ha-q?bSqhCu2Rn$oU`*N{sXE$lLthp8)$J#p$s@&*t|Y zk?7-G(K(yndrYD~o{A2J<5P4IP&87tzDHhQk-i{2owk?CqnNPE-Bn~ge+6QNb+JnQ znCbdgo^G@W88Mub5R+g?~l`vlErtQSFKP^wKC6#*xC)Q7T&L?hV_mDSvIEQDxk z3C9+MM7LBU{D@UCCvbO~uk#b2fXoiVi(xAiJz;VjE^&qiq~S#T<>vSaBFi z_eHo0i$)lRIik6_820Ei_#7tKqhNSnVbE+JpC9kq%>l=^D+g-ZRr(iS=iwj{j0VPi zI~H2y$V+wJx*JK|fxm1=zm{$^LnEn13XCUzDs}^7PIzzOnxADW&(HEO#NfxFsokP( z2T=gxte|HIQDd5&vEZrY<6Wh1_^vxfl>>vgI~d*#IhT(4c5K{lJqpKyFt(?w{EhCw z8xCV?bPbF_5t2Vj@#F_juJJOwPw`{6jSU6%p%j>AwpYTKVyA7B&H{NN*Ez@~#)txavpewSN&CA3 zf9MYU!QtO8^Y>rqnj=NiADFaBWEJ6|RM>GUyIiIRRPn-j%?$_pqh zVNHDxS}5dXeiGhS6pVR~V{@aOfe8Ha1o%UE(0cZ(j1PGNjk2WDU-8u$PO7EQ)~G0Ok4G)d{GsG=hy)WIxA0jyVG z1Ufcs^(ltHU|<-fstQKikvM1_KQ1*Z7L~H)k4l+s`&6A!FQG@8A4hNm6cAjQhp?h% zmd8=mVdxcY7c?fv7b_rdLxFL;j3its$^cL+k?!d#-Q~N19w(J=YrHG4t2?mE(VNvw zijsSF6qx+dk?z8-^2ekC;W&CuV7ObrcnT%nRp{H*_E`9@`MO)v1r-hK13vUF*`ahT zE=CokqZFJ+iG;zDJcQAH=+5ZUYkuZCx&!&ud^EhTIB1RsV+Feq6O2(LZ9v1%L|dAF z!I(s0Td(}D8i-@`lwxR^CJO3}bJUJ5>@%!~8{zSSDML?q%DN2z1dxE>K1uv=yM>?@ z3%Y4UQ+bQc7xiB0P-#t38MewvB?^UiDg znnYw?ip@`v_G~*rTA6Hq3Nf0^!X%A6>;s-gat0p~;sdeN6=e$0g1)1Rl|Dwj|3Sv4 zcwfLvOhl%AD-^>7gJhiw3epI!E@_V}!DzAH)_JIj9_=#b`$9`b4w?Mf%zhe_A>^@W zaOUP$Ir$F1SLnNWPseK>-;O6?#lZKPpJ{tph_Pcnn4SObfDf3Q;uS1Lo0kl*h9wWd zGi?k|nTB$Y<;x6wfbO!a9wo#I#vw&n0n(%^7TxvbAQ5h-mMYnM8_?jvXu$>YI{ZSu z%)?EP37Q4n^72OUO5Td1(9EX@g143_9M8iG(Gfo;X*37Oo zzT+vO(s8q7j&v{~NkS-~7{jbCN60*fuZ1g)ooi|nB4HeN(0KZbTeH^^ZdtD$DQdbf9R_Lxs%vPuf{f#`rx zih6&^F$Cis1URCCl;zVZ2(#VZWywOu4D_N8^rG3NuWj1org*U^Hf>CDzHg**^EwY?9^f{hTlFMK#tqXCdE9q{d-ZwXn1 z!tqEE>FTje_lxbpDS-iCV_@QdOMb?acaVxO+&N7Mw)a{-jGu_(6cvM=Eu|hvV;exi z;3UxJ3u{##0Htk7QS)$npW(Z1y29!U!nq=8l1&Y)nwcIjvn|C;Ptf#s$pDL3(;Hz> z&s$L3IF=q%g$(_`{BfWd(U_jt%K%vdJWIO!XQ1RUT@6l~Ve=O=Dp})E-PHf1+}VSBMJjO3r4*Vnv^TGJhddxcYQfiVhe6Y z6Az$CX@A)qTytTZopN3wyeig>U`e#$bBfN`Q1MJ6E0RHw+?^XVgN1rnO5TG0pS@)7 zgp!YD$<&doB_E!pWT<9($=>vmKbyp}1k1@~gCp1jVt)#y5(sOYfHAWo79 z&dFfHRsCC$sH^`amBSW1aznTje0aW-q9UWq3RRbx<%_6(#8p_EW#yj5G46w8Ns4ON z$t%s7MzzjK$)I|IuahQAwOB@4k#EbS+${3l=;G$`a}+l}B{8L3AEAzL1i7gC&s9{{ z{6kc)%Aoqq<%;SdpsJ@PYR2Tp%&14^A6%pcLwL92kn#8pU3ppaVN~q|FgLnZ{_dhZ?6Q0rtY| zGGZ#hTxe%X*$%}<_;jYk7OckbGyq$pdN5d}?HIFd$Er%*kM#JAbYU7^PB+tf2Iro? zVSY0|ZVt}>g>6o)Hnl9BWIhV~UD7pUhd+QiIJu;*YKoXKp7(+A0Zxp}-Sk=)0~D`y zdEfHrkuy=X(&!P(%{5%m^_p$BV{OY(rweFsOus0OX{?SqtmD>EwxvBBLB-Ikp&Epv zZMU0kSjY#EhDjh-R6)KI(x@h^vJ6pbs9nNd9&76ZnO^G&7@X87e2gTu_gObV@JR0o zhOgo5Z82C;)TtvFj-#bUxXc#Vhj{QNize%P5x|K2hMrsj})Jg{0^zup^ou$lTZ*G-?t|Af@BG|%N zDH^2xlOhO_r9DLlGUnZo3F;(5$V})$ z!cbs4>PHc7$I4)KEra$B2v{yd8FrTw03$!e2cP2;AxJrI&~s3Jl{3$C721J{635!=yydP}JL@g3wfNy9y>C#W9ORh$!U0B7npT znHX)~E>avPwPc>8K$O~Ff^NN*lO)?7H9;(6;usqWB$xv%b6R((3c}Ihn#7ps0%#ey zLxVHTC*j*O;Rh=p@pb+l_+pf!f#<_k4%{Zb&d;ESq~dZhH}-YXlBMGE%)nk>XQ>OX z&PZwbZcj!@aViT@6gN&zajl{_Qst(2qKjg0 za#044pPihdT9qv5%%GUKB%Q}?$v40rl|v>g=bT4@e31MFBZmT`cuDhNjKQ+eC4&3y zr07P!^*OMqmpD*5%siuQqgFS@?@8o`MGole-Ep{&WRz|4(*tQ8<6^KUdA1a!8GNBk zF{mayI`Y4Cq^uY0syww)VNRGmG*O+kzeW0Q`l!)st2b7IF!A;fVdaAM{Wi*DG z^Pm%E@prQ?4h1X_W^*OvE&b8eR7;pFBE|@#1}yZ`P9-ktH*LGDSkQ3f%1Zu9R63Br z4!PUk5s%+b59Z4W%LpWudgnul(GkAB+-k@3O%qL_6ggvsW^p$k8 zb1Qt!uXG1qaVBKCdKjL?uZ*g(iexI0d{9@<=5Wo=)O?cmU(HqMc9&hCwlPa8rX5t7 z^P8eHg+Vn`kC|W+T{U{rU87O8G^YZIvC&oj z$dOv(P@og}jTQX+T1;~1$DNvHY@vz1nlL|7 z65b$qD)X!RG4&FAsbLZm&*U*03j-6@dz~LwAatMeMNZ8(iEEO405VG!M$2J!Vb98D z(zZh83G00lx9w~3B>L-zoBBAky7FgFD)Kv^q-i2w>gcoI$)fz&;!gWK*^MoD?%zZt z<6sO;f<6u}o?cfYJZN1c4C;1t_9yN3bK85Dg^7tc&>Ek6i*tKt3gbe;+|L*&#si)k zdnj&$Nje=OnVY5xCSWf8JLW5 z3KE1XH&=xCye>UUf70@_E|yXXmS_?(Ad04-S7Sr>QH;hkKeo3WMZ?*t$Gn7ff&~WB z{fo-nOel~0CBMRC!rJl&X&Sx1q3jK$lyc2cU@&qS@}fRT|F!wu0%BqeIJ%|rJN?7? zZGYpy`8|&OzVzl~{Gv~yU8I2zfZvxO=WP65g5zl)BHyR~^T7Gtgd(itC*_ygIVr!? zN0BckfYJ8Xt#YLmpLMu~jd7$rYJLBGH`g*G+FCJc{mVqIF;J%agP{-JC%%GC*!}^# z|K&-MGMqZHs^aJ`8)*+w$kFl-=#mfMEKJ*&c{VzpxR^!g_W0@W&;6AIH$xKEmsK6s zp%^83cO72C8HjYrXVhWU?km3HiAPH10wHrPLk}=#`GydqDQc3o)uLl(NT; zeBcRUhe=qglysJ2UX@Kcd*QJ95a}#t&1|-sFX-zNpoZwUzx2Gi)?42i8(4 ze8CVguyTNa)HDIp|BE3i&JBX**?y+!HJFUb9BCi|HExTQ7W|5#Q-Ah|iS;Ljs(%M1f-YuVjFsDm)*lln+u|O0 z{U_MZ7n(?5zCyC+An&PHnx?mddV~$F+(8H99XfdBZS^_U7i* zvOKk)2n0^s9ddfA3{!_~ zwi8e*Gw_l=yu-N=Cy3mYMo<<703D@4TS=H`@f)Ir!b67%KLTaenko7JXC_Lq<`_K2Gi)couGe(iD>)-iLI2xI`?wy80oJE-K zKgH?oW0rz)J65sw@*YF5Yw>xbs=KUQUv(Cn+LJ`V(jJK|6TRBF&}xHq!rEji=2)nM zW!)tdu#Pg%UP$4pGgMrI1ZM(484oCIwEQJ-HbNQvM9BaRrA}^s7uZ_XaEmK8x!eGDSjr_8%ZcUQNyU1VwH&ifIR}9Zw;@_kHZeva;!()e zW%7?@PJ5Lp$7CT1tg23ecNgl5DJS}&Y+lGXh{o6L$NBLO&I6LvaL6iuS!{qkLDo&f znI(PrU~b$}&H&cx96y>sPXdJ=i9iFPT50oF@3J)de}3jNoWfKQ+2l+9lPgmEZ=ICBKaKu*2TWh|n`e46n{OyE0^aEs9_Cy8wOi6w)~@Dx z92nO7{CbP78%;_(B8TCK9I_98!DLmI?h7s&_T7Xt?L*yxA;(k5$-c+}*63~D=X1NP zU;Vcbv=u_kVzhnO^1!={LdMBg@?2(gJX)Ac`}I$h=RKH_{gdSR-@dOvo~9bPC&=^1 zFMbqx{)WT8a^fDaJoWkFe~!L&|M{OLAFLsBhpjp_GnycuufOn7_w-r zE`8@8lFvqVESf)=9V{8PE}cX?&HwRH#B)3ROIgKJp0zvL_Vz&gmzqjNWD@uYEo1Do z?=FK-%11>g==~hWRr+npa_aNSO05$z-tr9d9B>JUFP=9oE+Q<4Lm8u1)tw6{tk{Ax zP=v&CQ}fqY`NLc!^a313ZsaDYu*3so_IjH%I4`Ku0#|2swWnGinq@N-FN8ISCugdn zo)0=jEwmb06cSN3ew_A|EF_zXvMRD4`J_lO&EC?&p5%B4WULd53I6fT#Ut!~9B_WmKbSw~@5%ouB`w_>_#INgx<;uv96D>Oq_CMRa5Q{z06KF>J(QcZa2%fxhiqH zRN`jWp)|yy556c?!m@^$M*0VyN-ZIuf_Bl!)TOV4zCh+`A$*-Uy<*4dbt z{Rm35$!`^(0(&!#c~3h1Gt%gP(aELf9?D-;h!J5#FCj;buGlrOtoqw4nQ!3R&^@VVqs4_1S8S%*R2IGlIg`G*+}vz6&SRq90+2n!r8}&ed2l)ZH!Zf>9ylwJX@02 zkbqtp;~ghe-8J+SXH5KLxTgUuCOKH+95X%&i3u#|xc&fXC{$0VI_pRTJ|M7z2~rb| z9K3G5@EbvigLph8L*`HZk3t7(Tb!t0(i^t6patm#Vlt$NvW~;aEi6~{Ud=7ar10fn zZaTL-sH?N9L%W<~3M)3Zs3)hKirYDgTYH9>F1=FWp&h7g!{qi`db`%eEj{Emx4r2!gU@GwV;pYwEoki&T1-%Z?@5G;aw63Ib8Nj9sjtEA3H#N zztGp;+gXRG-8f7(so}H13>E>MC$nhp?@r~5ANT(Di_RyauUoqS(9Hxvj9Ii?&>ssg zMvhr0KPT;t-jzmhjUsrHLvTxqAifk=1jnp5hmco#Cie}*f3bO=UwW5!h2*6`A(5Sy z%;eSW9z&5)K#BoLu&PMVlxW2U?I!BAAB!B+>rll8ZcHH=RPV1R+SQ93ix}%Az&O%P zvevPR)(FD9O9wBE9*bcutyW-(7g|#vR@8sEn3)%*sQ0F*^9~B@YM~xc6yt}3uYTr) zQ|$#(gxEUwNS)JBZq_J2wNYr`^s)b7Z0i^Z)khKnF>&M;$zEbhxvT)#*x zx>FLPTP5Yi`6xEFUe*}~XY0=mSQNp_qm#@Pk1~EH@Sbs57 z92(=WUDi8DS?YT*vJ^=rn-j(uNNyfCiZN0}-T{Iy@@qEFP-Gzxq#1|g;u8j~2f4dy zN|H2XX9;7!EL(GerDDZ37F*DQu^bIYLO7(axP*jp2xfnR98)FPMN#WsQ9AGbh0H-6 ze-Enz^%-oJ;u6qGsrAk|69x40E69;9pld{Lyf0()Qvw==o@)WUPR@1!PKkjetxfR5iTTqu zP<5eKiHPf{fRP*!r-_QM69T8TN(pCRMUDHko;4#05cfrx|ff|dB> zWXXsCQ*h@H?`N_ZzXY^kA}z6HWc;-g9L6o{X8=-+ z=i?wbpyFc-c0mA6GA12ZCRoQXOKibUB`J^qpF$LA+pPsmlXH%=amO(!wjfH(sP_n| z0Y;?qI4V8^nEJYhJFT~2IMXVNDuv_u7>Z1s<2OsUS!E;}j{CCIs>k{w64Nrb_poke zX_r+4s+=95$~`Ex3ygJGb&QNHI7)c3CVC)-tsrGYUeZ)?UVD zm2ix+JnK%$wUgl}*{7VhS-<|g6#FBZQCr-CgTnZgmi2QY*eN(M8MRX{WaDMInb2pfMJ&rycb}zO_CA;`s70>i zW*`46^hI0tlW4|Y0*q0si=?7E<)ts)Dke#OfgY7H#J6kuA--LQ{~D6#I$6{%GoQ?P z@>2N-59S_{(j2q@)55cwuGGLQ3#L0%*?d_)Cp+w6v5kz)t^#?){Ejfbli{eQ3N28C zpTofKv~$0vPfV0%F!L}GVhakWMz%f(DImy1<~s`EJ20#h5M;{GK?HrvoF2aKS5YFv zXumKyhA1{i=kHW6y`8dg6=PNOS`>_u)Dk3S)O?73ep=$+QT{dT5K`7i>HLB3*N)}GR$z{T{_iY-&Siu|e zI{X>F@Rg?!m7DyaBTYhEQJZO3K_nYv3l8Rbp!3c(fTeL>Oz^;GK}fZW^*X}lpxMuP zvfcYCV}#UQnULTrGNU_KD#^EN!G)0hqPKmKqm+o3gFmOF_PF&1rX}F87vhP^JRCd6 zFi0Ssya^@;9CRUU<$wdQ$bB`4ZP=YuyA(V~G{1g#l3r?pBJF2M>nuNMSkTEE2 zrQ%SjB~l-e(iSWBTI1_9DN*k?s5P?IhyhU>+$v_g3@~nDf!t!0TQJt&t9az%0^NX$ zhARxIVUX#0EJm$zpx?|tUt*Mbl!3)BMWqIoOMsO=u#8|vsOQr~7)*xHII(hmNjHv0 zF|3lid1&SxIlgp54Pv4I@QqyMxHX2H7|$_rl3R%&bPDcS+OVki$5K%aDfa?R&ocH| zTbPIR;Wglqzt_IcT4B(tY#$rUUCim6J^#E;5vp|vtxFMl-8zeexQ8KIWccc#j}g+x z+DG+ZR0@_j7#&H@Qn({lX9{AnVhNnc=8oxP*E9pf^N#Wg=FCiC{OJq(<$f&MqJ${pe_cmeS5;-&#-1gxw5y5 zH;*HZ`oe2eY(ivliLVpJoLGs})>%S!@kUY+BVC0_-fu7%crZs-Btd4vSe>eaoEJJo zu~WJGWpg;3Tm?S2o27U9u78###JrmY2RAZR9@Z7~?AiYsNTnAtXyhe-pqOz-Pfy;I zEjmAWRkrAYWL384X~|L*o#+no&?So4gF8W>mE|K{dGbXcdhrMpHUZTcwQf5U{{Tne zLEnzj2j!DAk?2=JA}OKu2>Esd9z+A+%+yHG^BfijiR4x>X@QYJk*S9XQ#<1^? z7NcX^r3m(6=CrFtY>#RQbIXRleK!J|eGa%BroU7UJAP7?0Jbx!YG;D;i81!!_JhH5 zppSpg@1x}Td+7h)z@3ceEgALyUIv`W%flJz&uQ4g`_qu4>wG!ZFI0;Q;utNinoSi@ zqX{l2f$`hMk7#;exw?R4Sc?m&VAsR3wGng}h4$Qrd62fp+tTlhx{v9}HDdW3e6{@| zmvfxa6}y7mgsCukTV@-!WiDrAryr5fyKS%#^ui zq)PInHWO8z_(<5wSBqHRwTm*d1megR8!KT;kc5w9wRwFk?H}Pz0LZNzJc#0@J=` zUQS~=SFF_ht1RJ{I`geEXZ+7Ru*!jX^VKu0Dd-^APDfeVI3=%FgB|P|j!?_3u{=u6 zL-A}gyzHyDF4p7!si_Q@SMZuy)B*DhYq%fdEH}?d*;kcqEw|lWw zvlfBt%*DEIg)oGY{VjbKD%T$FP(k@}FEp-%x`R2T&{U+r;kci>Agw}KM@HK%Qch10+fx-QQG>6NJ79&mvclnK>?&gEH1M0|Q99gm|A zygci{?!bdIAO>_tOA_v4Et<^s&?h)1Qd^^&Jcz7zXJ%cgC}3L@g@deLkxqb@F&-_> z6p1~YqEE72A?eO(k_G40R^BJ)@d4@^Tg%eUkFWjv^?4OET$i8HXSJRC5hQSxmcVP1 zDg7^hq6Lgr{AfzwuGMe}i%^WBTW4>o>`EVSGsl)uO`w(j8eD=7_FPIoLzVVVRr(=z zu5_iZ!4dV8(yP7+rT?~rca2|ltW68$JyhaH&6O0`D}3B6&Mt}Yq)NM3H`zS5DM1{V<(Pr*Dq;iP*NM_07BgR^Pn)0Q%ksN^tUZTf#*>snhlF`Ty{Pf7{bbB5WmOq+sk;^khb9< z7K!2ar|K0EqwqtJ|jGB7|9;P#0C;1G%DZM zg1f1}J19lQz zp;g>fl>CH7f;a9Or;x5Z5`h+@#2LZLv7qPepgE(syZ!OvuJ--OT;v%Hz!SV9fKIiS zg9!fI`*%2~r~jP?sA>Wk=*LiR3`)7a@W)jPkFgYW-zaYX#D)f0PK(5~pV~sFBHt{U zQjUx1_9gF}fL`L;g58h|8fW`%)J~)njXn9{H%l~`3n%2L$VR4S5;7HX>36VENLClQNayb)j`;Wb=K6NT-S;gNIrhL7 ztm}I>du=tAcY?Czyb*GcZyU7#i3G^ zyA&=2w+{u_J*h$ziXrD8y8^eOE&~v;>MTz&B}rosPl9jG@Y}wNO1H~`Fan>H;p>L& zHj>m&>`u@Qz=+2RnhpcmSo;W;o=<`fPR}MI87ONs3fKv3@AFvS1s>enr4o&eY~)5Z z5cm|NMQa)1e3{r?Ty1XmeOUR2W)Kf(CO`q_Kkmdola{YSpYq*+BrN})Vv_#0rF{T5 z>fNb&{h&3E=V*8rrn-7H9sN4wv84ymZo~JAck+A1@VQJtgm1@k?+6BjTj?g(<7gjR zb=zQW-dx+VZ|epUu#r%{t!sLrP*NsmTko=7R8V)x=@0(GJ7}1Rc>sUTt>eoWan z{ChW(+cPn~x3u zRqnij4^{p9H{byOP>pzIU$ACR&i4bt1-dC_Eb1SdK^2Z?6~Y^jMPZzR2qQ1>=b7z$3{|qWuRj7}(c(eg_xmOd`9YY-OxTl|gAzddMG~sTZNj8w*P^ zaeffqS2pSR_2KP3j7ixPp*SDhM#6od23 zhTpgl{m`;*MF|shd4n(vU497XGSg+;ZbdIRR^QlEiB3&t3u}VSg9df9C!xkDZP!(I zJ4)5x&FkX7Axzc<)YIA4-ES#YNE2A*ZHnZ@nhKV2gE2sX6~E>lU*Nf5<@?|iI)8G| z?tqxl;$K8c)q;C=)}8N8swS(I;XvQUzG3$6_P4qtmE>=AM;^scf>rtk7O^f*Ip5Hp z%5wL~(RkH!cViLLXU``4kR7{bgVu}cljLm8a=q%wS}m6mvbPx3N1JHaWhe;;3_03N zs&R46Ogy<48fSChZteC|twD7X1ECfW?)8KE_e~}>5t*B)b_FI558q}Fmv4pSD@Juc zyt>5rr|(FE!vd%OD`=31k*s5`*n&B*^v*c~99`Rx>wI~Et~QW7lW3fOaqfurl`lH) zR`SKFCJz@y?->ujImIk}z%1|cUAvUDSwJ-KKsf%6To-+x?^@1nooH*8d?Lh8%~Elf z@DriPC+#?tm6HB3h-KljqW1e@9Gx@*{z(daw*Xj?B9^n) z1B=`bU98H&pu9V{pS=lNnwL;iz8!_!^2syHZ#LWTVbpE59HW7o!`3wUFzP{9T)uo5 z6?Mf;mk*;ZbHx?lAf>Of(G@q#jC>7E;_Kw@hHiNjbBX>pZ6X)h(PSGO+6SHyo|XJ6 z5>@;<<-HJ`8v7C<;568q!U#7fOC0>xBv(5;H&SrgG&bTMFrg+g5W!O44jurm6cND} zFaN$u>4+I=1yXj!A{$!CMv|-OcT)x(EuO~~7wb;IX>s)dO%K@Mn!}zy`kl_NzVzdQ z0NR!|{R2}*^81Wt7j$j{vUgjyFd08d=D)7FM%BXd?O24HWULhcaWUeeA@vWtl8DwR z*Cu9Yg0jU{@^%pzb1$^slk!Sc842r6fY@d~ZV0y`s@aeqU&!vCjeCuZ z{j;x>=hx(UwLClId96G<<$0YvyX4s|&n@!2L7qMGyh)xn%kvg_ZjhF)Um3k>~&p)(j7W{9WalDimU7Pc?YM*52TE@XGX(Tr?MByhJ7^0s!$=%o5sc7`%R~R~sAs+p$J(i)f89I@n zB@CUx(1{FDO_FmM`ZtD-VrTTg+HW$%`-*CLyMA&XL%SJzjiFyL zG|JFl7F zA=Fm>;^5|$5*1GDrgIG?rv5Z=>Sv5K#%YUqQx(C@{QSbbLD><`)r49Wpi~!Yqh`f+*RkT z@VB%!w^g>bHCG?w&`n`BHPY?`wbk`acwJuI+=AL8RN1&;LtU#~rDYA5SJc;4 z`74^&w{56yXw3&kT?5ijXf)bdD%Mvo&d)deenrPW;csbOOH+NtCVy*fU5mf2p{B8U zgGhO<%A`xp$Yy8Sa9LGDV{3Jb-$t8AfUNj0KA~}qG+RT(hHBC}OG&@NzoDY}vZ}@_ z8vLZ=Z>`<{W)NT#gByQkTXQq&loFS)mBEbz*46koHMaRHs;d06PH3FvZ)~Ez9FMx8 zp(pCe6?OIX{&m%UHi)jS60Ji}2Ub?EuWqP@_Er0#NXaDdj>L69hK9YOegBZ=BWGw5hpneQm3M&RNI#Pb`|h(7&qgoW{ob zd}CfkOG|ZY%RF7UafRLXDJ9kFObp>|v43_8GD_*O)6QHV^?b~TH7eyDy;(6rSXq2=?8 zCG~X;mqG0Hr_E}qZES9>1kpM)&@6v#b9K#W=r=VLmos869ssrpPoLegWS$D;qtZ(@ZfIhQY^WxoSrGrGdIYPKo-b}_Y^XjJH1n6t z10vromCbcct^StgN@mcahDE4oqGHZ-LTL6`r!SeO(80qzVZylL3&whJZ3bs)z=#}74hm%Eo~hseh>Q>BJt%>L5;!PfrAn_D1n0#I4FUG5;!Pfqzs2 zGiDX9<=M^|#i3BBrM05+vQTC1Wuf(L70p$~mzxWFR6N{Y%}oY?8aO;!B+y)4ZS=-- z5VxVCzP_>2=-`+5^5^O8V?4ZZDuEXV=!5|zRBfuSLRoF=LhI@pK-uWvN7V{}8#nxG zE+$7SR-IGb8rWD3w^GHr`s%WZ)>@;-XbuXu;ut1aCg6tZ4V6us$UWmOwBz7zv*XrE zT#I;tYwXBc73tKx27YA{Xwvb`l@$(wjZR#upbn26*^pLz7h@~dK~hF@55tx9jV;yi zC^KRkBdY4*+!U~vVD(1$d6BlAK#gD%>=TggXhH)5DgFt^72L)aF`9=3VzU4kA%M23 zyrPQWD8agxmZpkINlp;f?S^DaKnQRH8rf(bv%#iK1jjW9Q4;LPL0+Kwal#d%8u zC!fUlF2<*r>mf*oYzEpk9beys);xA;$;u0stq27!T)k=qiS#nHrKPf>p@!gg0b46t z(+lcTkLBW~j z%a$($d3 z@n?^b10SgITMu2^#u&iriVeme!2WvUec<;V1^mPp@aR3B4;&@PISbzQ^Thk!V*Go~ znedY@g%*z$OfhHTtKPR8<)dPd&@{N#4q8Y$Q}xOZ;Pp zmO|7un~X=MYvqj=)KKHUUSQ+~xZzZW`u%Fks#fgutUte^9?sR5r<61|S8OsiPfaV} zwyCJz0@N{%4eOj1Ls4Dpb)F78(QjG>n^W0`j9;K zZ%hf{V+qNz;}D4I#ym=Ib)y#4J<~*}4*bA0O4R{>shh!xcw-s_>p+owMaGG^F<&I= zz<1>vIjb9upC7WansscbM9Ie6hZs3Z@Gl>t+4$Wd(Do23Q{g#lmGKt9zA98$p+)jE zT6Z2QRRy%3^+>Ew@%h6%sIsJ7AVpejK}jDH^3%T8@Q7`A2PUgnrP7d)6O;? zlKL8>wz}P(eSSlGGb_O=J1SYbdv)j@96! z?@~O*E(IH+x6e$&wyP%cJ!od)G9>rb_^-q(@d*M`{M%hO_S1&`;~Rg^VCIl<&}`J%cnKy?$BJ2Fn%RlW|Lp?9Mb zzxhxt`(DI%Yy$1RO&O|o8&bw3<;skdexxL>M4q0jKroGmUmm)w!5BsA$k&{b{$Q6h z##~n;SNxg`dXee5#>i%mk!$pY`RwWBb4;Ei5r%ua_>6b+nb^W-$Bh#I4SD{%#LKf6 z+xfuZraoKnjp@>YZ=r-<{BsRRk!SDi5|(E#jwGQpdG_AT@Ccqpj*KKQSH@2{n6zO> z`Es$$4;7$veBlIcf52z_$HbLhP@a34AAe(??8)t&(lf28$1~ztTioGU+mkcmiBIvD z6|YTr#ylOK-rTh#Qxl%Jr>JNow`j~W;*EQn%6dFSy*Wk2MSY&)zMSH+5g;}d%YS7} zeI8Kb|A>ft))o~P7Zt@lJvnQO5}x8-Pg&vGwaD9>Bmd=gOfA-bWqs3%K(HsTcS;8k zy(80+rz5{(>WH`ZkUsB7PT^Q?A6S^uo7a&i+#AN6I>RXQ3_!kB5)o@~_f}hr~->=}`+W9s7riOV(59#IPYkrPZ z@C*%)U^372nHnxWPQkM^+=DTl=?gSmhI`8hpRM6S4C;h0(y)OOaD+E#IF2u(2w$V& zF`T#|e5;+mM8UAZA}`}i1@Ex&&rsE+6PE)%2i7 z0x#4sPl5Va@M=ZBSi^l9zJM_DFVXlAtH8w?4hw!Eo+|&X0z?1tF&fF(Q9$TT(JrFR<^JAWcmvNYeo6b~lk%lqTlk_t+ zTpUpF#Trg%c{FI)zf`4Pr{R$^6@0sfJ2XE((s0=+Dt(WJn{@qN&~V|ID*eChbY0(E z8~`ByO}f4_HN5t0g+E`zeI*KBq2VIU?^+G_;P3(K-=JYkDFrrd{L>VCmxkAB_!$lR zHGWdVeH!*c_sHLvhUaQ{t(Nz>8tynp(Z5*3#oB%~YIx*$l^)h`@4qVe77hEgeY;n~ zOH_cY?FEwl&rC`g(*Xe)O zaM>J{oaT$%x2k^xs_z?WsfEgA5p40v+}%rndB{NI=X z^NezO`nNOSyE5P(X23j&oSvU2kkjG84EUK0_=ODkjSTot8L)x*Tsr+}8L&SCo|6He zoB^Mn0iT@#ugHMU&wxW2@cIn6DFeP9TG@r4i65p6Mijp-_}z$K4}O@Y7&qbf4g7A# zZ!3Pc;I|FGf5-2e_}zxz?f88QzdP{zHh#VMeFwkq;`crL?!@o=_}z`)cKm*T-#z%< zi{E|t{Sdz&;deiNefZ(8IEKd!_;Jp{GD!O_{QiIB*>8lhy7)rbT!JCTqv)*uQcpBGm&Ya*?RM;>;^_-=Tn4Kfl^?1C@-cvD&-k+#XC+XS1e`cE?s$X-Er=QQ(UUJNvc4{ zm#ZA@fz1+^MK}t164K&s({z?ri&NDFQBCNSa?w?Yc9Od~+0xwpPlvwkyUjvBJt>p^ z#I(ObKh3*km+iQcbp-tIQbX3s7PTEGuH6)#<3UeFDGoF8rXsVl2kNR}lmlK9b9?x8 zsjW@L|DNaxoba-@a#D(;ZUdFzf9i6tjmVIj)Tj*+28iBO!Xa(6D z(cEWOyQH!OO%UB)ZM)0nvnxhz#7mUggO{MQDXk&B9jzc|A6hn`Q#;T0mb2Pxwl|se zj((^{Hkm^;iZufPZYzgW>!D4!k?ias+gry{OKiL9+RB@|#1poM?S0`18^X>Z0SQdp z61Mk(DWudUFk6?qzw&1JfVtnxH#d6umK|OOxV7u-=}tI%5UOvvtPVMwfys9bjwGOA z(33-r%^`k8gs+w~!KO_`O2wdTXbln<9jnDhLiO0>&|1Et`ihXUn6f7v!dG3`It;Co zEw>Ph3tdrLhfi^2H(o`wwbm>Qt;6P?l9YbgSt0*W1$Qw+$Oat3jj~;;Be2UZA=FbL z8lm(kg$w?q-$B%RUkue&yQ?a5U4y1-*8~+5u~t^JfPpJeKE7pXp*T>Nx{VHYTN6H4 zstz^Q)JW^AYTMFLP=oCGqF%I-HjfIhxq}SmpB$=36`L#SSrZDy&QV*v@g!C8s_M!* z7?MyEx0Z|$HXrf1pDi$_7#doqfkdgDLM6#AR3#~1LrvIE38AvpFeEMZt|qDQw18@v zxmDFQ6>ascPIGd1G_=0HaUEEymAzgY(zZZNrM1PGd%4~W4{4?0hgPll?C(l!zT)ry E03(>92><{9 literal 0 HcmV?d00001 diff --git a/demo/notes/Documentation.html b/demo/notes/Documentation.html new file mode 100644 index 0000000..10d57b4 --- /dev/null +++ b/demo/notes/Documentation.html @@ -0,0 +1,59 @@ + + +Documentation + + +

+ +# 生成器命令 + +- --help 列出帮助信息 + +- --version 当前生成器版本号 + +- --init [-o] filename 在当前目录下创建一个笔记模板文件,添加"-o"选项,你的配置文件将会被读取 + +- --commit 根据当前的笔记目录结构重新生成数据文件data.js + +# 笔记主题 + +- amelia + +- bootstrap + +- bootstrap-responsive + +- cerulean + +- cyborg + +- journal + +- readable + +- simplex + +- slate + +- spacelab + +- spruce + +- superhero + +- united + +# 笔记目录主题 + +- theme-light + +- theme-dark + +- theme-white + +- theme-black + + + + + \ No newline at end of file diff --git a/demo/notes/Guides(en).html b/demo/notes/Guides(en).html new file mode 100644 index 0000000..10bbfd6 --- /dev/null +++ b/demo/notes/Guides(en).html @@ -0,0 +1,130 @@ + + +Guides(en) + + + +# What's mkdnotes? +> Mkdnotes is a local notebook that provides features such as notes browsing and searching. All you need is to focus on writing your notes.Of course you can submit your code to any repositorys that support the deployment of static projects so that your notes can be seen anywhere. + +# How it works? +> The core is the mkdnotes generator which is located in the root directory. You need to use it to create a note template file in the notes directory (Don't leave directory: /notes). This template is similar to Strapdown's.Then you can write something to your template file using the markdown syntax, and finally, like Git, you need to submit your update. Once submitted, the generator will regenerate the data file (/assets/data.js) based on your current note directory structure, and data.js file will be use for home page. + +# Getting started + +- You don't need to install, just copy the demo folder under the project. + + The directory structure is as follows, do not change them. + + / + index.html // Home Page, quick find and view your notes + + favicon.ico // mkdnotes logo + + mkdnotes.ini // configuration file + + mkdnotes.exe // the generator(Windows version), if is not this platform, you can delete it. + + mkdnotes_l // the generator(Linux version), if is not this platform, you can delete it. + + mkdnotes_m_ // the generator(Mac version), if is not this platform, you can delete it. + + assets/ // Data.js is stored in this directory, and also some core files, so don't change them. + + notes/ // Your note directory + +- Use the generator to create a primitive template file (* current working directory must be in the notes directory (/notes)) + + ``` + ..\mkdnotes --init hello // Created a note template file called hello.html + + ``` + +- Create a template file with your own configuration + + *Here is the items in the configuration file(/mkdnotes.ini).*: + + **title** --- The content of the HTML title tag(Defaults: My Markdown Notes) + + **link_icon** --- Whether to display the icon which is located in the root directory,Yes or No(Defaults: Yes) + + **theme** --- The name of Bootstrap themes, all available themes are located in /assets/strapdown/themes, the name needs to be remove the .min.css suffix and be converted to lowercase (defaults: simplex) + + ``` + ..\mkdnotes --init -o hello // 用自己的配置项创建一个笔记模板 + + ``` + +- Generating the data file(/assets/data.js) + + *once your note directory structure changes: rename files, add new files or delete files, like Git, you need to use command to regenerate the new data file.* + + ``` + ..\mkdnotes --commit + + // Now open the homepage(/index.html), you can see all your notes in the navigation bar on the left. + + ``` + +- Now make the cover of the homepage iframe + + *You can modify the /notes/welcome.html directly. This file needs to be located in the notes directory. If the file name is not "welcome.html", you need to modify the homepage core file (/assets/js/core.js) * + + ``` + // core.js: near line 60, modify the value of cover + + var cover = 'welcome.html'; + if (rel === './notes' && n === cover) + continue; + + ``` + +- alter the left navigation bar style + + *you also need to modify the homepage core file (/assets/js/core.js)* + + ``` + // core.js: near line 80, Optional theme: theme-dark,theme-dark,theme-white, theme-black + + // counters(Whether to display the number of notes), detail or develop, see: https://github.com/FrDH/jQuery.mmenu + + extensions: [ 'theme-dark' ], // theme-light(Default)|theme-dark|theme-white|theme-black + setSelected: true, + /* + counters: true, + */ + + ``` + +# Tips + +> When creating a template file, the working directory must be in the notes directory. It is recommended to add the generator's directory to the global environment. + +> Generator encountered errors, doesn't work? compile it (any compiler that supports C89) + +``` + gcc -o mkdnotes mkdnotes.c + +``` + + + +# Have any questions or want to contribute? + +> MIT License + +> Fork me on [GitHub](https://github.com/SiGool/mkdnotes) or Submit issues. + +# Credits + +- [cJSON](https://github.com/DaveGamble/cJSON): Ultralightweight JSON parser in ANSI C +- [inih](https://github.com/benhoyt/inih): Simple .INI file parser in C, good for embedded systems +- [whereami](https://github.com/gpakosz/whereami): Locate the current executable and the current module/library on the file system +- [jQuery.mmenu](https://github.com/FrDH/jQuery.mmenu): The best jQuery plugin for app look-alike on- and off-canvas menus with sliding submenus for your website and webapp. +- [strapdown](https://github.com/arturadib/strapdown): Instant and elegant Markdown documents in the browser +- Icons from [IcoMoon app](https://icomoon.io/app) + + + + + \ No newline at end of file diff --git a/demo/notes/Guides.html b/demo/notes/Guides.html new file mode 100644 index 0000000..7612805 --- /dev/null +++ b/demo/notes/Guides.html @@ -0,0 +1,132 @@ + + +Guides + + + +# mkdnotes是什么? +> mkdnotes是一个本地的笔记本,它提供了笔记浏览搜索等功能,你需要的只是认真的写你的笔记。当然你可以提交你代码到支持部署静态项目的代码仓库,这样你的笔记就可以随处可见了。 + +# 它是如何工作的? +> 最核心的就是根目录下的mkdnotes生成器, 你需要用它在笔记目录下(/notes)通过命令创建一个笔记模板,这个模板和[Strapdown](https://strapdownjs.com/)的类似。 +> 然后你可以往你的模板写入markdown语法的笔记,最后像Git一样用命令提交更新。 +> 提交后,该生成器会根据你当前的笔记目录结构重新生成一个数据文件(/assets/data.js)用于首页。 + +# 快速入门 + +- 你无需安装,直接复制该项目下的demo文件夹即可 + + 目录结构如下,不应随意更改它 + + / + index.html // 首页,快速查找和切换查看你的笔记 + + favicon.ico // mkdnotes logo + + mkdnotes.ini // 笔记模板配置文件 + + mkdnotes.exe // Windows版本生成器,如果不是该平台可以删除 + + mkdnotes_l // Linux版本生成器,如果不是该平台可以删除 + + mkdnotes_m_ // Mac 版本生成器,如果不是该平台可以删除 + + assets/ // data.js存放目录和笔记核心文件,不应随意更改 + + notes/ // 你的笔记目录 + +- 利用生成器创建一个最原始的笔记模板(* **生成笔记模板时工作区域需位于笔记目录(/notes)内**) + + ``` + ..\mkdnotes --init hello // 创建了一个名为 hello.html的笔记模板文件 + + ``` + +- 使用自己的配置创建笔记模板 + + *配置文件(/mkdnotes.ini)各项*: + + **title** --- 生成的模板文件的HTML title内容(默认值: My Markdown Notes) + + **link_icon** --- 是否显示根目录下的icon,Yes or No(默认值: Yes) + + **theme** --- 当前笔记的Bootwatch主题名,所有可用主题位于 /assets/strapdown/themes,主题名需去除.min.css后缀并转化为小写(默认值: simplex) + + ``` + ..\mkdnotes --init -o hello // 用自己的配置项创建一个笔记模板 + + ``` + +- 生成数据文件(/assets/data.js) + + *只要你的笔记目录结构有变化: 重命令文件,新增文件还是删除文件,你就需要像Git一样使用命令重新生成新的数据文件* + + ``` + ..\mkdnotes --commit + + // 现在打开你的首页,左边的导航条已经可以看到你所有的笔记了 + + ``` + +- 现在制作首页(/index.html)右侧的Cover + + *你可以直接修改 /notes/welcome.html 内容,文件需位于笔记根目录,如果文件名不为welcome.html,你需要修改首页加载的核心文件(/assets/js/core.js)代码* + + ``` + // core.js: 第 60行左右,请按实际修改cover的值 + + var cover = 'welcome.html'; + if (rel === './notes' && n === cover) + continue; + + ``` + +- 修改左侧导航条 + + *左侧导航条配置项同样需修改/assets/js/core.js代码* + + ``` + // core.js: 第80行左右,可设置的主题: theme-dark,theme-dark,theme-white, theme-black + + // counters是否显示笔记数,详细或开发参照: https://github.com/FrDH/jQuery.mmenu + + extensions: [ 'theme-dark' ], // theme-light(Default)|theme-dark|theme-white|theme-black + setSelected: true, + /* + counters: true, + */ + + ``` + +# Tips + +> 创建模板文件时工作区域需位于笔记目录内,建议将生成器的目录添加到全局环境。 + +> 生成器有错,无法工作?编译自己的版本(任何支持C89的编译器) + +``` + gcc -o mkdnotes mkdnotes.c + +``` + + + +# 有任何疑问,需要贡献? + +> MIT License + +> Fork me on [GitHub](https://github.com/SiGool/mkdnotes) or Submit issues. + +# Credits + +- [cJSON](https://github.com/DaveGamble/cJSON): Ultralightweight JSON parser in ANSI C +- [inih](https://github.com/benhoyt/inih): Simple .INI file parser in C, good for embedded systems +- [whereami](https://github.com/gpakosz/whereami): Locate the current executable and the current module/library on the file system +- [jQuery.mmenu](https://github.com/FrDH/jQuery.mmenu): The best jQuery plugin for app look-alike on- and off-canvas menus with sliding submenus for your website and webapp. +- [strapdown](https://github.com/arturadib/strapdown): Instant and elegant Markdown documents in the browser +- Icons from [IcoMoon app](https://icomoon.io/app) + + + + + \ No newline at end of file diff --git a/demo/notes/welcome.html b/demo/notes/welcome.html new file mode 100644 index 0000000..fa02da8 --- /dev/null +++ b/demo/notes/welcome.html @@ -0,0 +1,35 @@ + + +
+

mkdnotes

+

Your protable and open notebook.

+ +
+
+

Simple: without installation, just write!

+ Easy +
+
+

Selectable: markdown syntax support, many Bootwatch themes.

+ Support markdown +
+
+

Integrated: responsive TOC, convenient generator.

+ Table of Contents +
+
+

Protable: preview in localhost or deploy to github pages.

+ Github +
+
+
+ + + Fork me on GitHub + \ No newline at end of file diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8b9c3fd1e8af5e0b0c90310ea7b326b6693fbcbc GIT binary patch literal 1150 zcmZQzU<5(|0R|wcz>vYhz#zuJz@P!dKp~(AL>x%r1M`5A3y8!M&<%1@W4CZnVHZLd zCx)*h$-?5M!Tt@1e*y6^R}J9V)TR50QKyOwwCyxU@!AO%uM9JhZg65 zS9SJTrt-v@;iAr75@I6sKgUb$e~gXfe_wsxKM|Iqe?VrK5aAA>|Mk4IxgdJ=c>iqa z3j1?xR??p+D>0(XFqC0s0{Z=dmku{r@3j@V|3Mhp3_{`Itj2EOror)QN}j_Xn0}}k z|H1Ci0EUMg8{RMlhCAGhtIKo1Za{H|2Kx+Cd7{jC19Atl8G9$k{&Cmj_z#RLlFR_v ze|ACopA=`gKW+wIf82Dm{*Youf2Ivkuk0T;L;pWs?r;8ky4-@8q0Zh%D18CL)Cd?a zZ(MbazJh6KrVf-ofZ?_T7{@4j8`v2b{{LrSXb0j(AU*)X^+0UT!0rvDdj + + + + + + + + + + My Markdown Notes + + + +
+
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/mkdnotes.c b/mkdnotes.c new file mode 100644 index 0000000..bc2351a --- /dev/null +++ b/mkdnotes.c @@ -0,0 +1,339 @@ +/* +Copyright (c) 2018 石固 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + + +#include +#include +#include +#include +#ifdef _WIN32 + #include +#endif +#include "./vendor/whereami/whereami.c" +#include "./notesConfReader.c" +#include "./Indexes2JSON.c" + +void printHelp(void); +void printVersion(void); +void recreateData(void); +void createTemplate(char namePart[], int useConf); +char* getBaseDir(void); +#ifdef _WIN32 + char* getAsc2u8s(char *src); +#endif + +#define lastChar(str) str[strlen(str) - 1] + +const char DIRECTORY_SEPARATOR[] = + #ifdef _WIN32 + "\\" + #else + "/" + #endif +; + +const int MAJOR_VERSION_NUMBER = 1; +const int MINOR_VERSION_NUMBER = 0; +const int BUILD_VERSION_NUMBER = 0; + +int main(int argc, char *argv[]) +{ + if (argc == 1) + printHelp(); + else if (argc == 2) + { + if (strcmp(argv[1], "--help") == 0) + printHelp(); + else if (strcmp(argv[1], "--version") == 0) + printVersion(); + else if (strcmp(argv[1], "--commit") == 0) + recreateData(); + else + { + fprintf(stderr, "error: Invalid argument\n"); + exit(1); + } + } + else if ((argc == 3 || argc == 4) && strcmp(argv[1], "--init") == 0 && abs(strcmp(argv[2], "-o") != 0) + argc == 4) + createTemplate(argv[argc - 1], argc - 3); + else + { + fprintf(stderr, "error: Invalid argument\n"); + exit(1); + } + + return 0; +} + +void printHelp(void) +{ + printf("usage:\n\n"); + printf(" --help Display this information.\n"); + printf(" --version Display mkdnotes version information.\n"); + printf(" --init [-o] filename Create a markdown note template file in current directory.\n"); + printf(" if you add \"-o\" option, the configuration file will be read.\n"); + printf(" --commit Regenerate data.js file base on the current files and folders structure.\n"); +} + +void printVersion(void) +{ + printf("mkdnotes version %d.%d.%d\n", MAJOR_VERSION_NUMBER, MINOR_VERSION_NUMBER, BUILD_VERSION_NUMBER); + printf("Copyright (C) 2018 SiGool\n"); +} + +void recreateData(void) +{ + char *baseDir = getBaseDir(); + + char dataJsPath[strlen(baseDir) + 20]; + memset(dataJsPath, '\0', strlen(dataJsPath)); + strcpy(dataJsPath, baseDir); + strcat(dataJsPath, "/assets/data.js"); + + FILE *fp = NULL; + if ((fp = fopen(dataJsPath, "w")) == NULL) + { + fprintf(stderr, "error: Failed to create data file: %s\n", dataJsPath); + exit(1); + } + + char notesPath[strlen(baseDir + 10)]; + memset(notesPath, '\0', strlen(notesPath)); + strcpy(notesPath, baseDir); + strcat(notesPath, "/notes"); + + free(baseDir); + + char *res = Idx2JSON_printStr(notesPath); + + char dataStr[strlen(res) + 20]; + memset(dataStr, '\0', strlen(dataStr)); + strcat(dataStr, "var data = "); + strcat(dataStr, res); + strcat(dataStr, ";"); + + cJSON_free(res); + + /* + * Only support: Windows(Ascii), linux/mac(utf8) + */ + #ifdef _WIN32 + + char *u8s; + if((u8s = getAsc2u8s(dataStr)) == NULL) + fprintf(stderr, "error: Failed to create data file: %s\n", dataJsPath); + else + { + fputs(u8s, fp); + free(u8s); + } + #else + fputs(dataStr, fp); + #endif + + fclose(fp); +} + +void createTemplate(char namePart[], int useConf) +{ + // get current working directory + char *curWorkingDir; + if ((curWorkingDir = getcwd(NULL, 0)) == NULL) + { + fprintf(stderr, "error: Failed to get current working directory\n"); + exit(1); + } + + if (lastChar(curWorkingDir) == DIRECTORY_SEPARATOR[0]) + lastChar(curWorkingDir) = '\0'; + + // get basedir path + char *baseDir = getBaseDir(); + + // check working directory's location + char testPath[strlen(baseDir) + 20]; + memset(testPath, '\0', strlen(testPath)); + + strcpy(testPath, baseDir); + strcat(testPath, DIRECTORY_SEPARATOR); + strcat(testPath, "notes"); + + free(baseDir); + + if (strcmp(curWorkingDir, testPath) != 0) + { + // match: .+(\\|\/)notes(\\|\/)(.+)? + strcat(testPath, DIRECTORY_SEPARATOR); + + if (memcmp(curWorkingDir, testPath, strlen(testPath)) != 0) + { + lastChar(testPath) = '\0'; + fprintf(stderr, "error: Out of directory: %s\n", testPath); + exit(1); + } + else + { + lastChar(testPath) = '\0'; + } + } + + + // calculate configuration values + configuration conf; + + if (useConf) + { + testPath[strlen(testPath) - strlen("notes")] = '\0'; + strcat(testPath, "mkdnotes.ini"); + conf = getConfOptions(testPath); + + testPath[strlen(testPath) - strlen("mkdnotes.ini") - 1] = '\0'; + } + else + { + // default + conf.title = "My Markdown Notes"; + conf.link_icon = "Yes"; + conf.theme = "simplex"; + + testPath[strlen(testPath) - strlen("notes") - 1] = '\0'; + } + + + // create template file + char rPath[50] = {'\0'}; + int sIdx = strlen(testPath); + + while (curWorkingDir[sIdx] != '\0') + { + if (curWorkingDir[sIdx] == DIRECTORY_SEPARATOR[0]) + strcat(rPath, "../"); + sIdx++; + } + + free(curWorkingDir); + + + // create + char linkIcon[120] = {'\0'}; + + if (strcmp(conf.link_icon, "Yes") == 0) + sprintf(linkIcon, "\n", rPath); + + char templateStr[] = "\n" + "\n" + "%s\n" + "%s\n" + + "\n\n" + + "\n\n" + + "\n" + ""; + + char fileName[strlen(namePart) + 10]; + memset(fileName, '\0', strlen(fileName)); + + strcpy(fileName, namePart); + strcat(fileName, ".html"); + + FILE *fp = NULL; + if ((fp = fopen(fileName, "w+")) == NULL) + { + fprintf(stderr, "Failed to create template file\n"); + exit(1); + } + + fprintf(fp, templateStr, conf.title, linkIcon, conf.theme, rPath); + fclose(fp); +} + +/* + ***************** + Helper + **************** +*/ + +char* getBaseDir(void) +{ + char *baseDir = NULL; + int length, dirname_length; + + length = wai_getExecutablePath(NULL, 0, &dirname_length); + if (length > 0) + { + baseDir = (char*)malloc(length + 1); + if (!baseDir) + { + fprintf(stderr, "error: Failed to get the root directory\n"); + exit(1); + } + + wai_getExecutablePath(baseDir, length, &dirname_length); + baseDir[dirname_length] = '\0'; + } + else + { + + fprintf(stderr, "error: Failed to get the root directory\n"); + exit(1); + } + + if (lastChar(baseDir) == DIRECTORY_SEPARATOR[0]) + lastChar(baseDir) = '\0'; + + return baseDir; +} + +#ifdef _WIN32 + char* getAsc2u8s(char *src) + { + int srcLen = 0; + if ((srcLen = strlen(src)) == 0) + return NULL; + + int wcsLen = srcLen + 1; + wchar_t wcs[wcsLen]; + wmemset(wcs, 0, srcLen); + + if (MultiByteToWideChar(CP_ACP, 0, src, -1, wcs, wcsLen) == 0) + return NULL; + + int u8sLen = 0; + if ((u8sLen = WideCharToMultiByte(CP_UTF8, 0, wcs, -1, NULL, 0, NULL, NULL)) == 0) + return NULL; + + char *u8s; + if ((u8s = (char*)malloc(u8sLen * sizeof(char))) == NULL) + return NULL; + + if (WideCharToMultiByte(CP_UTF8, 0, wcs, -1, u8s, u8sLen, NULL, NULL) == 0) + { + + free(u8s); + return NULL; + } + + return u8s; + } +#endif diff --git a/mkdnotes.exe b/mkdnotes.exe new file mode 100644 index 0000000000000000000000000000000000000000..f3f917efb2898699441ee5ff423bcc2ef872d657 GIT binary patch literal 120578 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 F_#1mDMmGQe literal 0 HcmV?d00001 diff --git a/mkdnotes.ini b/mkdnotes.ini new file mode 100644 index 0000000..8d70667 --- /dev/null +++ b/mkdnotes.ini @@ -0,0 +1,18 @@ +; When you using "--init" command without "-o" option, it will apply the following default values: +; +; title=My Markdown Notes +; link_icon=Yes +; theme=simplex +; +; +; +; if you use "-o" option +; Don't delete any items, just change the values you want +; it will overrides the default values +; +[notes] +title=My notes ; add HTML title tag +link_icon=Yes ; link icon, Yes or No +theme=journal ; Bootswatch themes(lowercase) + + diff --git a/mkdnotes_l b/mkdnotes_l new file mode 100644 index 0000000000000000000000000000000000000000..bc5a576f9f5b95474c13ab5cbdc5548bafa7bda9 GIT binary patch literal 52448 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

GL4|5&jZc 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 literal 0 HcmV?d00001 diff --git a/mkdnotes_m_ b/mkdnotes_m_ new file mode 100644 index 0000000000000000000000000000000000000000..1875d0f02779afdd2c313d503282fd19fa8ded30 GIT binary patch literal 50064 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 E03(>92><{9 literal 0 HcmV?d00001 diff --git a/notes/testDefault.html b/notes/testDefault.html new file mode 100644 index 0000000..1b9c62e --- /dev/null +++ b/notes/testDefault.html @@ -0,0 +1,11 @@ + + +My Markdown Notes + + +

+# Default template + + + + \ No newline at end of file diff --git a/notes/testOption.html b/notes/testOption.html new file mode 100644 index 0000000..3830007 --- /dev/null +++ b/notes/testOption.html @@ -0,0 +1,14 @@ + + +My notes + + + + +``` + ..\mkdnotes --init testOption +``` + + + + \ No newline at end of file diff --git "a/notes/\345\212\250\347\211\251/kitten.html" "b/notes/\345\212\250\347\211\251/kitten.html" new file mode 100644 index 0000000..5261fdc --- /dev/null +++ "b/notes/\345\212\250\347\211\251/kitten.html" @@ -0,0 +1,81 @@ + + +My Markdown Notes + + + +# Scrolling test + +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten +# kitten + + + + \ No newline at end of file diff --git a/notesConfReader.c b/notesConfReader.c new file mode 100644 index 0000000..e517f2a --- /dev/null +++ b/notesConfReader.c @@ -0,0 +1,89 @@ +/* +Copyright (c) 2018 石固 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +// mkdnotes --init -o xxx + +#include +#include +#include +#include "./vendor/inih/ini.c" + +typedef struct { + const char *title; + const char *link_icon; + const char *theme; +} configuration; + +configuration getConfOptions(char confFilePath[]); +static int handler(void *user, const char *section, const char *name, const char *value); + +configuration getConfOptions(char confFilePath[]) +{ + configuration conf; + + if (ini_parse(confFilePath, handler, &conf) < 0) + { + fprintf(stderr, "error: failed to load configuration file\n"); + exit(1); + } + + if (conf.title == NULL || conf.link_icon == NULL || conf.theme == NULL) + { + fprintf(stderr, "error: Configuration file has error\n"); + exit(1); + } + + return conf; +} + +static int handler(void *user, const char *section, const char *name, const char *value) +{ + configuration *confP = (configuration*)user; + + static int initalized = 0; + if (!initalized++) + { + confP->title = NULL; + confP->link_icon = NULL; + confP->theme = NULL; + } + + #define MATCH(s, n) strcmp(section, s) == 0 && strcmp(name, n) == 0 + + if (MATCH("notes", "title")) + confP->title = strdup(value); + else if (MATCH("notes", "link_icon")) + { + confP->link_icon = strdup(value); + if (strcmp(confP->link_icon, "Yes") && strcmp(confP->link_icon, "No")) + { + fprintf(stderr, "error: Configuration file has error\n"); + exit(1); + } + } + else if (MATCH("notes", "theme")) + confP->theme = strdup(value); + else + return 0; + + return 1; +} \ No newline at end of file diff --git a/vendor/cJSON/LICENSE b/vendor/cJSON/LICENSE new file mode 100644 index 0000000..78deb04 --- /dev/null +++ b/vendor/cJSON/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/vendor/cJSON/cJSON.c b/vendor/cJSON/cJSON.c new file mode 100644 index 0000000..1733811 --- /dev/null +++ b/vendor/cJSON/cJSON.c @@ -0,0 +1,2932 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +/* cJSON */ +/* JSON parser in C. */ + +/* disable warnings about old C89 functions in MSVC */ +#if !defined(_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) +#define _CRT_SECURE_NO_DEPRECATE +#endif + +#ifdef __GNUC__ +#pragma GCC visibility push(default) +#endif +#if defined(_MSC_VER) +#pragma warning (push) +/* disable warning about single line comments in system headers */ +#pragma warning (disable : 4001) +#endif + +#include +#include +#include +#include +#include +#include + +#ifdef ENABLE_LOCALES +#include +#endif + +#if defined(_MSC_VER) +#pragma warning (pop) +#endif +#ifdef __GNUC__ +#pragma GCC visibility pop +#endif + +#include "cJSON.h" + +/* define our own boolean type */ +#define true ((cJSON_bool)1) +#define false ((cJSON_bool)0) + +typedef struct { + const unsigned char *json; + size_t position; +} error; +static error global_error = { NULL, 0 }; + +CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void) +{ + return (const char*) (global_error.json + global_error.position); +} + +CJSON_PUBLIC(char *) cJSON_GetStringValue(cJSON *item) { + if (!cJSON_IsString(item)) { + return NULL; + } + + return item->valuestring; +} + +/* This is a safeguard to prevent copy-pasters from using incompatible C and header files */ +#if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 7) || (CJSON_VERSION_PATCH != 8) + #error cJSON.h and cJSON.c have different versions. Make sure that both have the same. +#endif + +CJSON_PUBLIC(const char*) cJSON_Version(void) +{ + static char version[15]; + sprintf(version, "%i.%i.%i", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, CJSON_VERSION_PATCH); + + return version; +} + +/* Case insensitive string comparison, doesn't consider two NULL pointers equal though */ +static int case_insensitive_strcmp(const unsigned char *string1, const unsigned char *string2) +{ + if ((string1 == NULL) || (string2 == NULL)) + { + return 1; + } + + if (string1 == string2) + { + return 0; + } + + for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++) + { + if (*string1 == '\0') + { + return 0; + } + } + + return tolower(*string1) - tolower(*string2); +} + +typedef struct internal_hooks +{ + void *(CJSON_CDECL *allocate)(size_t size); + void (CJSON_CDECL *deallocate)(void *pointer); + void *(CJSON_CDECL *reallocate)(void *pointer, size_t size); +} internal_hooks; + +#if defined(_MSC_VER) +/* work around MSVC error C2322: '...' address of dillimport '...' is not static */ +static void * CJSON_CDECL internal_malloc(size_t size) +{ + return malloc(size); +} +static void CJSON_CDECL internal_free(void *pointer) +{ + free(pointer); +} +static void * CJSON_CDECL internal_realloc(void *pointer, size_t size) +{ + return realloc(pointer, size); +} +#else +#define internal_malloc malloc +#define internal_free free +#define internal_realloc realloc +#endif + +static internal_hooks global_hooks = { internal_malloc, internal_free, internal_realloc }; + +static unsigned char* cJSON_strdup(const unsigned char* string, const internal_hooks * const hooks) +{ + size_t length = 0; + unsigned char *copy = NULL; + + if (string == NULL) + { + return NULL; + } + + length = strlen((const char*)string) + sizeof(""); + copy = (unsigned char*)hooks->allocate(length); + if (copy == NULL) + { + return NULL; + } + memcpy(copy, string, length); + + return copy; +} + +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks) +{ + if (hooks == NULL) + { + /* Reset hooks */ + global_hooks.allocate = malloc; + global_hooks.deallocate = free; + global_hooks.reallocate = realloc; + return; + } + + global_hooks.allocate = malloc; + if (hooks->malloc_fn != NULL) + { + global_hooks.allocate = hooks->malloc_fn; + } + + global_hooks.deallocate = free; + if (hooks->free_fn != NULL) + { + global_hooks.deallocate = hooks->free_fn; + } + + /* use realloc only if both free and malloc are used */ + global_hooks.reallocate = NULL; + if ((global_hooks.allocate == malloc) && (global_hooks.deallocate == free)) + { + global_hooks.reallocate = realloc; + } +} + +/* Internal constructor. */ +static cJSON *cJSON_New_Item(const internal_hooks * const hooks) +{ + cJSON* node = (cJSON*)hooks->allocate(sizeof(cJSON)); + if (node) + { + memset(node, '\0', sizeof(cJSON)); + } + + return node; +} + +/* Delete a cJSON structure. */ +CJSON_PUBLIC(void) cJSON_Delete(cJSON *item) +{ + cJSON *next = NULL; + while (item != NULL) + { + next = item->next; + if (!(item->type & cJSON_IsReference) && (item->child != NULL)) + { + cJSON_Delete(item->child); + } + if (!(item->type & cJSON_IsReference) && (item->valuestring != NULL)) + { + global_hooks.deallocate(item->valuestring); + } + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) + { + global_hooks.deallocate(item->string); + } + global_hooks.deallocate(item); + item = next; + } +} + +/* get the decimal point character of the current locale */ +static unsigned char get_decimal_point(void) +{ +#ifdef ENABLE_LOCALES + struct lconv *lconv = localeconv(); + return (unsigned char) lconv->decimal_point[0]; +#else + return '.'; +#endif +} + +typedef struct +{ + const unsigned char *content; + size_t length; + size_t offset; + size_t depth; /* How deeply nested (in arrays/objects) is the input at the current offset. */ + internal_hooks hooks; +} parse_buffer; + +/* check if the given size is left to read in a given parse buffer (starting with 1) */ +#define can_read(buffer, size) ((buffer != NULL) && (((buffer)->offset + size) <= (buffer)->length)) +/* check if the buffer can be accessed at the given index (starting with 0) */ +#define can_access_at_index(buffer, index) ((buffer != NULL) && (((buffer)->offset + index) < (buffer)->length)) +#define cannot_access_at_index(buffer, index) (!can_access_at_index(buffer, index)) +/* get a pointer to the buffer at the position */ +#define buffer_at_offset(buffer) ((buffer)->content + (buffer)->offset) + +/* Parse the input text to generate a number, and populate the result into item. */ +static cJSON_bool parse_number(cJSON * const item, parse_buffer * const input_buffer) +{ + double number = 0; + unsigned char *after_end = NULL; + unsigned char number_c_string[64]; + unsigned char decimal_point = get_decimal_point(); + size_t i = 0; + + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; + } + + /* copy the number into a temporary buffer and replace '.' with the decimal point + * of the current locale (for strtod) + * This also takes care of '\0' not necessarily being available for marking the end of the input */ + for (i = 0; (i < (sizeof(number_c_string) - 1)) && can_access_at_index(input_buffer, i); i++) + { + switch (buffer_at_offset(input_buffer)[i]) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '+': + case '-': + case 'e': + case 'E': + number_c_string[i] = buffer_at_offset(input_buffer)[i]; + break; + + case '.': + number_c_string[i] = decimal_point; + break; + + default: + goto loop_end; + } + } +loop_end: + number_c_string[i] = '\0'; + + number = strtod((const char*)number_c_string, (char**)&after_end); + if (number_c_string == after_end) + { + return false; /* parse_error */ + } + + item->valuedouble = number; + + /* use saturation in case of overflow */ + if (number >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (number <= (double)INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)number; + } + + item->type = cJSON_Number; + + input_buffer->offset += (size_t)(after_end - number_c_string); + return true; +} + +/* don't ask me, but the original cJSON_SetNumberValue returns an integer or double */ +CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number) +{ + if (number >= INT_MAX) + { + object->valueint = INT_MAX; + } + else if (number <= (double)INT_MIN) + { + object->valueint = INT_MIN; + } + else + { + object->valueint = (int)number; + } + + return object->valuedouble = number; +} + +typedef struct +{ + unsigned char *buffer; + size_t length; + size_t offset; + size_t depth; /* current nesting depth (for formatted printing) */ + cJSON_bool noalloc; + cJSON_bool format; /* is this print a formatted print */ + internal_hooks hooks; +} printbuffer; + +/* realloc printbuffer if necessary to have at least "needed" bytes more */ +static unsigned char* ensure(printbuffer * const p, size_t needed) +{ + unsigned char *newbuffer = NULL; + size_t newsize = 0; + + if ((p == NULL) || (p->buffer == NULL)) + { + return NULL; + } + + if ((p->length > 0) && (p->offset >= p->length)) + { + /* make sure that offset is valid */ + return NULL; + } + + if (needed > INT_MAX) + { + /* sizes bigger than INT_MAX are currently not supported */ + return NULL; + } + + needed += p->offset + 1; + if (needed <= p->length) + { + return p->buffer + p->offset; + } + + if (p->noalloc) { + return NULL; + } + + /* calculate new buffer size */ + if (needed > (INT_MAX / 2)) + { + /* overflow of int, use INT_MAX if possible */ + if (needed <= INT_MAX) + { + newsize = INT_MAX; + } + else + { + return NULL; + } + } + else + { + newsize = needed * 2; + } + + if (p->hooks.reallocate != NULL) + { + /* reallocate with realloc if available */ + newbuffer = (unsigned char*)p->hooks.reallocate(p->buffer, newsize); + if (newbuffer == NULL) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + } + else + { + /* otherwise reallocate manually */ + newbuffer = (unsigned char*)p->hooks.allocate(newsize); + if (!newbuffer) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + if (newbuffer) + { + memcpy(newbuffer, p->buffer, p->offset + 1); + } + p->hooks.deallocate(p->buffer); + } + p->length = newsize; + p->buffer = newbuffer; + + return newbuffer + p->offset; +} + +/* calculate the new length of the string in a printbuffer and update the offset */ +static void update_offset(printbuffer * const buffer) +{ + const unsigned char *buffer_pointer = NULL; + if ((buffer == NULL) || (buffer->buffer == NULL)) + { + return; + } + buffer_pointer = buffer->buffer + buffer->offset; + + buffer->offset += strlen((const char*)buffer_pointer); +} + +/* Render the number nicely from the given item into a string. */ +static cJSON_bool print_number(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + double d = item->valuedouble; + int length = 0; + size_t i = 0; + unsigned char number_buffer[26]; /* temporary buffer to print the number into */ + unsigned char decimal_point = get_decimal_point(); + double test; + + if (output_buffer == NULL) + { + return false; + } + + /* This checks for NaN and Infinity */ + if ((d * 0) != 0) + { + length = sprintf((char*)number_buffer, "null"); + } + else + { + /* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */ + length = sprintf((char*)number_buffer, "%1.15g", d); + + /* Check whether the original double can be recovered */ + if ((sscanf((char*)number_buffer, "%lg", &test) != 1) || ((double)test != d)) + { + /* If not, print with 17 decimal places of precision */ + length = sprintf((char*)number_buffer, "%1.17g", d); + } + } + + /* sprintf failed or buffer overrun occured */ + if ((length < 0) || (length > (int)(sizeof(number_buffer) - 1))) + { + return false; + } + + /* reserve appropriate space in the output */ + output_pointer = ensure(output_buffer, (size_t)length + sizeof("")); + if (output_pointer == NULL) + { + return false; + } + + /* copy the printed number to the output and replace locale + * dependent decimal point with '.' */ + for (i = 0; i < ((size_t)length); i++) + { + if (number_buffer[i] == decimal_point) + { + output_pointer[i] = '.'; + continue; + } + + output_pointer[i] = number_buffer[i]; + } + output_pointer[i] = '\0'; + + output_buffer->offset += (size_t)length; + + return true; +} + +/* parse 4 digit hexadecimal number */ +static unsigned parse_hex4(const unsigned char * const input) +{ + unsigned int h = 0; + size_t i = 0; + + for (i = 0; i < 4; i++) + { + /* parse digit */ + if ((input[i] >= '0') && (input[i] <= '9')) + { + h += (unsigned int) input[i] - '0'; + } + else if ((input[i] >= 'A') && (input[i] <= 'F')) + { + h += (unsigned int) 10 + input[i] - 'A'; + } + else if ((input[i] >= 'a') && (input[i] <= 'f')) + { + h += (unsigned int) 10 + input[i] - 'a'; + } + else /* invalid */ + { + return 0; + } + + if (i < 3) + { + /* shift left to make place for the next nibble */ + h = h << 4; + } + } + + return h; +} + +/* converts a UTF-16 literal to UTF-8 + * A literal can be one or two sequences of the form \uXXXX */ +static unsigned char utf16_literal_to_utf8(const unsigned char * const input_pointer, const unsigned char * const input_end, unsigned char **output_pointer) +{ + long unsigned int codepoint = 0; + unsigned int first_code = 0; + const unsigned char *first_sequence = input_pointer; + unsigned char utf8_length = 0; + unsigned char utf8_position = 0; + unsigned char sequence_length = 0; + unsigned char first_byte_mark = 0; + + if ((input_end - first_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } + + /* get the first utf16 sequence */ + first_code = parse_hex4(first_sequence + 2); + + /* check that the code is valid */ + if (((first_code >= 0xDC00) && (first_code <= 0xDFFF))) + { + goto fail; + } + + /* UTF16 surrogate pair */ + if ((first_code >= 0xD800) && (first_code <= 0xDBFF)) + { + const unsigned char *second_sequence = first_sequence + 6; + unsigned int second_code = 0; + sequence_length = 12; /* \uXXXX\uXXXX */ + + if ((input_end - second_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } + + if ((second_sequence[0] != '\\') || (second_sequence[1] != 'u')) + { + /* missing second half of the surrogate pair */ + goto fail; + } + + /* get the second utf16 sequence */ + second_code = parse_hex4(second_sequence + 2); + /* check that the code is valid */ + if ((second_code < 0xDC00) || (second_code > 0xDFFF)) + { + /* invalid second half of the surrogate pair */ + goto fail; + } + + + /* calculate the unicode codepoint from the surrogate pair */ + codepoint = 0x10000 + (((first_code & 0x3FF) << 10) | (second_code & 0x3FF)); + } + else + { + sequence_length = 6; /* \uXXXX */ + codepoint = first_code; + } + + /* encode as UTF-8 + * takes at maximum 4 bytes to encode: + * 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ + if (codepoint < 0x80) + { + /* normal ascii, encoding 0xxxxxxx */ + utf8_length = 1; + } + else if (codepoint < 0x800) + { + /* two bytes, encoding 110xxxxx 10xxxxxx */ + utf8_length = 2; + first_byte_mark = 0xC0; /* 11000000 */ + } + else if (codepoint < 0x10000) + { + /* three bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx */ + utf8_length = 3; + first_byte_mark = 0xE0; /* 11100000 */ + } + else if (codepoint <= 0x10FFFF) + { + /* four bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx 10xxxxxx */ + utf8_length = 4; + first_byte_mark = 0xF0; /* 11110000 */ + } + else + { + /* invalid unicode codepoint */ + goto fail; + } + + /* encode as utf8 */ + for (utf8_position = (unsigned char)(utf8_length - 1); utf8_position > 0; utf8_position--) + { + /* 10xxxxxx */ + (*output_pointer)[utf8_position] = (unsigned char)((codepoint | 0x80) & 0xBF); + codepoint >>= 6; + } + /* encode first byte */ + if (utf8_length > 1) + { + (*output_pointer)[0] = (unsigned char)((codepoint | first_byte_mark) & 0xFF); + } + else + { + (*output_pointer)[0] = (unsigned char)(codepoint & 0x7F); + } + + *output_pointer += utf8_length; + + return sequence_length; + +fail: + return 0; +} + +/* Parse the input text into an unescaped cinput, and populate item. */ +static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_buffer) +{ + const unsigned char *input_pointer = buffer_at_offset(input_buffer) + 1; + const unsigned char *input_end = buffer_at_offset(input_buffer) + 1; + unsigned char *output_pointer = NULL; + unsigned char *output = NULL; + + /* not a string */ + if (buffer_at_offset(input_buffer)[0] != '\"') + { + goto fail; + } + + { + /* calculate approximate size of the output (overestimate) */ + size_t allocation_length = 0; + size_t skipped_bytes = 0; + while (((size_t)(input_end - input_buffer->content) < input_buffer->length) && (*input_end != '\"')) + { + /* is escape sequence */ + if (input_end[0] == '\\') + { + if ((size_t)(input_end + 1 - input_buffer->content) >= input_buffer->length) + { + /* prevent buffer overflow when last input character is a backslash */ + goto fail; + } + skipped_bytes++; + input_end++; + } + input_end++; + } + if (((size_t)(input_end - input_buffer->content) >= input_buffer->length) || (*input_end != '\"')) + { + goto fail; /* string ended unexpectedly */ + } + + /* This is at most how much we need for the output */ + allocation_length = (size_t) (input_end - buffer_at_offset(input_buffer)) - skipped_bytes; + output = (unsigned char*)input_buffer->hooks.allocate(allocation_length + sizeof("")); + if (output == NULL) + { + goto fail; /* allocation failure */ + } + } + + output_pointer = output; + /* loop through the string literal */ + while (input_pointer < input_end) + { + if (*input_pointer != '\\') + { + *output_pointer++ = *input_pointer++; + } + /* escape sequence */ + else + { + unsigned char sequence_length = 2; + if ((input_end - input_pointer) < 1) + { + goto fail; + } + + switch (input_pointer[1]) + { + case 'b': + *output_pointer++ = '\b'; + break; + case 'f': + *output_pointer++ = '\f'; + break; + case 'n': + *output_pointer++ = '\n'; + break; + case 'r': + *output_pointer++ = '\r'; + break; + case 't': + *output_pointer++ = '\t'; + break; + case '\"': + case '\\': + case '/': + *output_pointer++ = input_pointer[1]; + break; + + /* UTF-16 literal */ + case 'u': + sequence_length = utf16_literal_to_utf8(input_pointer, input_end, &output_pointer); + if (sequence_length == 0) + { + /* failed to convert UTF16-literal to UTF-8 */ + goto fail; + } + break; + + default: + goto fail; + } + input_pointer += sequence_length; + } + } + + /* zero terminate the output */ + *output_pointer = '\0'; + + item->type = cJSON_String; + item->valuestring = (char*)output; + + input_buffer->offset = (size_t) (input_end - input_buffer->content); + input_buffer->offset++; + + return true; + +fail: + if (output != NULL) + { + input_buffer->hooks.deallocate(output); + } + + if (input_pointer != NULL) + { + input_buffer->offset = (size_t)(input_pointer - input_buffer->content); + } + + return false; +} + +/* Render the cstring provided to an escaped version that can be printed. */ +static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffer * const output_buffer) +{ + const unsigned char *input_pointer = NULL; + unsigned char *output = NULL; + unsigned char *output_pointer = NULL; + size_t output_length = 0; + /* numbers of additional characters needed for escaping */ + size_t escape_characters = 0; + + if (output_buffer == NULL) + { + return false; + } + + /* empty string */ + if (input == NULL) + { + output = ensure(output_buffer, sizeof("\"\"")); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "\"\""); + + return true; + } + + /* set "flag" to 1 if something needs to be escaped */ + for (input_pointer = input; *input_pointer; input_pointer++) + { + switch (*input_pointer) + { + case '\"': + case '\\': + case '\b': + case '\f': + case '\n': + case '\r': + case '\t': + /* one character escape sequence */ + escape_characters++; + break; + default: + if (*input_pointer < 32) + { + /* UTF-16 escape sequence uXXXX */ + escape_characters += 5; + } + break; + } + } + output_length = (size_t)(input_pointer - input) + escape_characters; + + output = ensure(output_buffer, output_length + sizeof("\"\"")); + if (output == NULL) + { + return false; + } + + /* no characters have to be escaped */ + if (escape_characters == 0) + { + output[0] = '\"'; + memcpy(output + 1, input, output_length); + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; + } + + output[0] = '\"'; + output_pointer = output + 1; + /* copy the string */ + for (input_pointer = input; *input_pointer != '\0'; (void)input_pointer++, output_pointer++) + { + if ((*input_pointer > 31) && (*input_pointer != '\"') && (*input_pointer != '\\')) + { + /* normal character, copy */ + *output_pointer = *input_pointer; + } + else + { + /* character needs to be escaped */ + *output_pointer++ = '\\'; + switch (*input_pointer) + { + case '\\': + *output_pointer = '\\'; + break; + case '\"': + *output_pointer = '\"'; + break; + case '\b': + *output_pointer = 'b'; + break; + case '\f': + *output_pointer = 'f'; + break; + case '\n': + *output_pointer = 'n'; + break; + case '\r': + *output_pointer = 'r'; + break; + case '\t': + *output_pointer = 't'; + break; + default: + /* escape and print as unicode codepoint */ + sprintf((char*)output_pointer, "u%04x", *input_pointer); + output_pointer += 4; + break; + } + } + } + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; +} + +/* Invoke print_string_ptr (which is useful) on an item. */ +static cJSON_bool print_string(const cJSON * const item, printbuffer * const p) +{ + return print_string_ptr((unsigned char*)item->valuestring, p); +} + +/* Predeclare these prototypes. */ +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer); + +/* Utility to jump whitespace and cr/lf */ +static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) +{ + if ((buffer == NULL) || (buffer->content == NULL)) + { + return NULL; + } + + while (can_access_at_index(buffer, 0) && (buffer_at_offset(buffer)[0] <= 32)) + { + buffer->offset++; + } + + if (buffer->offset == buffer->length) + { + buffer->offset--; + } + + return buffer; +} + +/* skip the UTF-8 BOM (byte order mark) if it is at the beginning of a buffer */ +static parse_buffer *skip_utf8_bom(parse_buffer * const buffer) +{ + if ((buffer == NULL) || (buffer->content == NULL) || (buffer->offset != 0)) + { + return NULL; + } + + if (can_access_at_index(buffer, 4) && (strncmp((const char*)buffer_at_offset(buffer), "\xEF\xBB\xBF", 3) == 0)) + { + buffer->offset += 3; + } + + return buffer; +} + +/* Parse an object - create a new root, and populate. */ +CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated) +{ + parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } }; + cJSON *item = NULL; + + /* reset error position */ + global_error.json = NULL; + global_error.position = 0; + + if (value == NULL) + { + goto fail; + } + + buffer.content = (const unsigned char*)value; + buffer.length = strlen((const char*)value) + sizeof(""); + buffer.offset = 0; + buffer.hooks = global_hooks; + + item = cJSON_New_Item(&global_hooks); + if (item == NULL) /* memory fail */ + { + goto fail; + } + + if (!parse_value(item, buffer_skip_whitespace(skip_utf8_bom(&buffer)))) + { + /* parse failure. ep is set. */ + goto fail; + } + + /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */ + if (require_null_terminated) + { + buffer_skip_whitespace(&buffer); + if ((buffer.offset >= buffer.length) || buffer_at_offset(&buffer)[0] != '\0') + { + goto fail; + } + } + if (return_parse_end) + { + *return_parse_end = (const char*)buffer_at_offset(&buffer); + } + + return item; + +fail: + if (item != NULL) + { + cJSON_Delete(item); + } + + if (value != NULL) + { + error local_error; + local_error.json = (const unsigned char*)value; + local_error.position = 0; + + if (buffer.offset < buffer.length) + { + local_error.position = buffer.offset; + } + else if (buffer.length > 0) + { + local_error.position = buffer.length - 1; + } + + if (return_parse_end != NULL) + { + *return_parse_end = (const char*)local_error.json + local_error.position; + } + + global_error = local_error; + } + + return NULL; +} + +/* Default options for cJSON_Parse */ +CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value) +{ + return cJSON_ParseWithOpts(value, 0, 0); +} + +#define cjson_min(a, b) ((a < b) ? a : b) + +static unsigned char *print(const cJSON * const item, cJSON_bool format, const internal_hooks * const hooks) +{ + static const size_t default_buffer_size = 256; + printbuffer buffer[1]; + unsigned char *printed = NULL; + + memset(buffer, 0, sizeof(buffer)); + + /* create buffer */ + buffer->buffer = (unsigned char*) hooks->allocate(default_buffer_size); + buffer->length = default_buffer_size; + buffer->format = format; + buffer->hooks = *hooks; + if (buffer->buffer == NULL) + { + goto fail; + } + + /* print the value */ + if (!print_value(item, buffer)) + { + goto fail; + } + update_offset(buffer); + + /* check if reallocate is available */ + if (hooks->reallocate != NULL) + { + printed = (unsigned char*) hooks->reallocate(buffer->buffer, buffer->offset + 1); + if (printed == NULL) { + goto fail; + } + buffer->buffer = NULL; + } + else /* otherwise copy the JSON over to a new buffer */ + { + printed = (unsigned char*) hooks->allocate(buffer->offset + 1); + if (printed == NULL) + { + goto fail; + } + memcpy(printed, buffer->buffer, cjson_min(buffer->length, buffer->offset + 1)); + printed[buffer->offset] = '\0'; /* just to be sure */ + + /* free the buffer */ + hooks->deallocate(buffer->buffer); + } + + return printed; + +fail: + if (buffer->buffer != NULL) + { + hooks->deallocate(buffer->buffer); + } + + if (printed != NULL) + { + hooks->deallocate(printed); + } + + return NULL; +} + +/* Render a cJSON item/entity/structure to text. */ +CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item) +{ + return (char*)print(item, true, &global_hooks); +} + +CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item) +{ + return (char*)print(item, false, &global_hooks); +} + +CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if (prebuffer < 0) + { + return NULL; + } + + p.buffer = (unsigned char*)global_hooks.allocate((size_t)prebuffer); + if (!p.buffer) + { + return NULL; + } + + p.length = (size_t)prebuffer; + p.offset = 0; + p.noalloc = false; + p.format = fmt; + p.hooks = global_hooks; + + if (!print_value(item, &p)) + { + global_hooks.deallocate(p.buffer); + return NULL; + } + + return (char*)p.buffer; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buf, const int len, const cJSON_bool fmt) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if ((len < 0) || (buf == NULL)) + { + return false; + } + + p.buffer = (unsigned char*)buf; + p.length = (size_t)len; + p.offset = 0; + p.noalloc = true; + p.format = fmt; + p.hooks = global_hooks; + + return print_value(item, &p); +} + +/* Parser core - when encountering text, process appropriately. */ +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer) +{ + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; /* no input */ + } + + /* parse the different types of values */ + /* null */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "null", 4) == 0)) + { + item->type = cJSON_NULL; + input_buffer->offset += 4; + return true; + } + /* false */ + if (can_read(input_buffer, 5) && (strncmp((const char*)buffer_at_offset(input_buffer), "false", 5) == 0)) + { + item->type = cJSON_False; + input_buffer->offset += 5; + return true; + } + /* true */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "true", 4) == 0)) + { + item->type = cJSON_True; + item->valueint = 1; + input_buffer->offset += 4; + return true; + } + /* string */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"')) + { + return parse_string(item, input_buffer); + } + /* number */ + if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9')))) + { + return parse_number(item, input_buffer); + } + /* array */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '[')) + { + return parse_array(item, input_buffer); + } + /* object */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{')) + { + return parse_object(item, input_buffer); + } + + return false; +} + +/* Render a value to text. */ +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output = NULL; + + if ((item == NULL) || (output_buffer == NULL)) + { + return false; + } + + switch ((item->type) & 0xFF) + { + case cJSON_NULL: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "null"); + return true; + + case cJSON_False: + output = ensure(output_buffer, 6); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "false"); + return true; + + case cJSON_True: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "true"); + return true; + + case cJSON_Number: + return print_number(item, output_buffer); + + case cJSON_Raw: + { + size_t raw_length = 0; + if (item->valuestring == NULL) + { + return false; + } + + raw_length = strlen(item->valuestring) + sizeof(""); + output = ensure(output_buffer, raw_length); + if (output == NULL) + { + return false; + } + memcpy(output, item->valuestring, raw_length); + return true; + } + + case cJSON_String: + return print_string(item, output_buffer); + + case cJSON_Array: + return print_array(item, output_buffer); + + case cJSON_Object: + return print_object(item, output_buffer); + + default: + return false; + } +} + +/* Build an array from input text. */ +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer) +{ + cJSON *head = NULL; /* head of the linked list */ + cJSON *current_item = NULL; + + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + + if (buffer_at_offset(input_buffer)[0] != '[') + { + /* not an array */ + goto fail; + } + + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ']')) + { + /* empty array */ + goto success; + } + + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + /* parse next value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || buffer_at_offset(input_buffer)[0] != ']') + { + goto fail; /* expected end of array */ + } + +success: + input_buffer->depth--; + + item->type = cJSON_Array; + item->child = head; + + input_buffer->offset++; + + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; +} + +/* Render an array to text */ +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + size_t length = 0; + cJSON *current_element = item->child; + + if (output_buffer == NULL) + { + return false; + } + + /* Compose the output array. */ + /* opening square bracket */ + output_pointer = ensure(output_buffer, 1); + if (output_pointer == NULL) + { + return false; + } + + *output_pointer = '['; + output_buffer->offset++; + output_buffer->depth++; + + while (current_element != NULL) + { + if (!print_value(current_element, output_buffer)) + { + return false; + } + update_offset(output_buffer); + if (current_element->next) + { + length = (size_t) (output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ','; + if(output_buffer->format) + { + *output_pointer++ = ' '; + } + *output_pointer = '\0'; + output_buffer->offset += length; + } + current_element = current_element->next; + } + + output_pointer = ensure(output_buffer, 2); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ']'; + *output_pointer = '\0'; + output_buffer->depth--; + + return true; +} + +/* Build an object from the text. */ +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer) +{ + cJSON *head = NULL; /* linked list head */ + cJSON *current_item = NULL; + + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '{')) + { + goto fail; /* not an object */ + } + + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '}')) + { + goto success; /* empty object */ + } + + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + /* parse the name of the child */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_string(current_item, input_buffer)) + { + goto fail; /* faile to parse name */ + } + buffer_skip_whitespace(input_buffer); + + /* swap valuestring and string, because we parsed the name */ + current_item->string = current_item->valuestring; + current_item->valuestring = NULL; + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != ':')) + { + goto fail; /* invalid object */ + } + + /* parse the value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '}')) + { + goto fail; /* expected end of object */ + } + +success: + input_buffer->depth--; + + item->type = cJSON_Object; + item->child = head; + + input_buffer->offset++; + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; +} + +/* Render an object to text. */ +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + size_t length = 0; + cJSON *current_item = item->child; + + if (output_buffer == NULL) + { + return false; + } + + /* Compose the output: */ + length = (size_t) (output_buffer->format ? 2 : 1); /* fmt: {\n */ + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + + *output_pointer++ = '{'; + output_buffer->depth++; + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + output_buffer->offset += length; + + while (current_item) + { + if (output_buffer->format) + { + size_t i; + output_pointer = ensure(output_buffer, output_buffer->depth); + if (output_pointer == NULL) + { + return false; + } + for (i = 0; i < output_buffer->depth; i++) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += output_buffer->depth; + } + + /* print key */ + if (!print_string_ptr((unsigned char*)current_item->string, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + length = (size_t) (output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ':'; + if (output_buffer->format) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += length; + + /* print value */ + if (!print_value(current_item, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + /* print comma if not last */ + length = ((size_t)(output_buffer->format ? 1 : 0) + (size_t)(current_item->next ? 1 : 0)); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + if (current_item->next) + { + *output_pointer++ = ','; + } + + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + *output_pointer = '\0'; + output_buffer->offset += length; + + current_item = current_item->next; + } + + output_pointer = ensure(output_buffer, output_buffer->format ? (output_buffer->depth + 1) : 2); + if (output_pointer == NULL) + { + return false; + } + if (output_buffer->format) + { + size_t i; + for (i = 0; i < (output_buffer->depth - 1); i++) + { + *output_pointer++ = '\t'; + } + } + *output_pointer++ = '}'; + *output_pointer = '\0'; + output_buffer->depth--; + + return true; +} + +/* Get Array size/item / object item. */ +CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array) +{ + cJSON *child = NULL; + size_t size = 0; + + if (array == NULL) + { + return 0; + } + + child = array->child; + + while(child != NULL) + { + size++; + child = child->next; + } + + /* FIXME: Can overflow here. Cannot be fixed without breaking the API */ + + return (int)size; +} + +static cJSON* get_array_item(const cJSON *array, size_t index) +{ + cJSON *current_child = NULL; + + if (array == NULL) + { + return NULL; + } + + current_child = array->child; + while ((current_child != NULL) && (index > 0)) + { + index--; + current_child = current_child->next; + } + + return current_child; +} + +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index) +{ + if (index < 0) + { + return NULL; + } + + return get_array_item(array, (size_t)index); +} + +static cJSON *get_object_item(const cJSON * const object, const char * const name, const cJSON_bool case_sensitive) +{ + cJSON *current_element = NULL; + + if ((object == NULL) || (name == NULL)) + { + return NULL; + } + + current_element = object->child; + if (case_sensitive) + { + while ((current_element != NULL) && (strcmp(name, current_element->string) != 0)) + { + current_element = current_element->next; + } + } + else + { + while ((current_element != NULL) && (case_insensitive_strcmp((const unsigned char*)name, (const unsigned char*)(current_element->string)) != 0)) + { + current_element = current_element->next; + } + } + + return current_element; +} + +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string) +{ + return get_object_item(object, string, false); +} + +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string) +{ + return get_object_item(object, string, true); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string) +{ + return cJSON_GetObjectItem(object, string) ? 1 : 0; +} + +/* Utility for array list handling. */ +static void suffix_object(cJSON *prev, cJSON *item) +{ + prev->next = item; + item->prev = prev; +} + +/* Utility for handling references. */ +static cJSON *create_reference(const cJSON *item, const internal_hooks * const hooks) +{ + cJSON *reference = NULL; + if (item == NULL) + { + return NULL; + } + + reference = cJSON_New_Item(hooks); + if (reference == NULL) + { + return NULL; + } + + memcpy(reference, item, sizeof(cJSON)); + reference->string = NULL; + reference->type |= cJSON_IsReference; + reference->next = reference->prev = NULL; + return reference; +} + +static cJSON_bool add_item_to_array(cJSON *array, cJSON *item) +{ + cJSON *child = NULL; + + if ((item == NULL) || (array == NULL)) + { + return false; + } + + child = array->child; + + if (child == NULL) + { + /* list is empty, start new one */ + array->child = item; + } + else + { + /* append to the end */ + while (child->next) + { + child = child->next; + } + suffix_object(child, item); + } + + return true; +} + +/* Add item to array/object. */ +CJSON_PUBLIC(void) cJSON_AddItemToArray(cJSON *array, cJSON *item) +{ + add_item_to_array(array, item); +} + +#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) + #pragma GCC diagnostic push +#endif +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif +/* helper function to cast away const */ +static void* cast_away_const(const void* string) +{ + return (void*)string; +} +#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) + #pragma GCC diagnostic pop +#endif + + +static cJSON_bool add_item_to_object(cJSON * const object, const char * const string, cJSON * const item, const internal_hooks * const hooks, const cJSON_bool constant_key) +{ + char *new_key = NULL; + int new_type = cJSON_Invalid; + + if ((object == NULL) || (string == NULL) || (item == NULL)) + { + return false; + } + + if (constant_key) + { + new_key = (char*)cast_away_const(string); + new_type = item->type | cJSON_StringIsConst; + } + else + { + new_key = (char*)cJSON_strdup((const unsigned char*)string, hooks); + if (new_key == NULL) + { + return false; + } + + new_type = item->type & ~cJSON_StringIsConst; + } + + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) + { + hooks->deallocate(item->string); + } + + item->string = new_key; + item->type = new_type; + + return add_item_to_array(object, item); +} + +CJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item) +{ + add_item_to_object(object, string, item, &global_hooks, false); +} + +/* Add an item to an object with constant string as key */ +CJSON_PUBLIC(void) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item) +{ + add_item_to_object(object, string, item, &global_hooks, true); +} + +CJSON_PUBLIC(void) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item) +{ + if (array == NULL) + { + return; + } + + add_item_to_array(array, create_reference(item, &global_hooks)); +} + +CJSON_PUBLIC(void) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item) +{ + if ((object == NULL) || (string == NULL)) + { + return; + } + + add_item_to_object(object, string, create_reference(item, &global_hooks), &global_hooks, false); +} + +CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name) +{ + cJSON *null = cJSON_CreateNull(); + if (add_item_to_object(object, name, null, &global_hooks, false)) + { + return null; + } + + cJSON_Delete(null); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name) +{ + cJSON *true_item = cJSON_CreateTrue(); + if (add_item_to_object(object, name, true_item, &global_hooks, false)) + { + return true_item; + } + + cJSON_Delete(true_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name) +{ + cJSON *false_item = cJSON_CreateFalse(); + if (add_item_to_object(object, name, false_item, &global_hooks, false)) + { + return false_item; + } + + cJSON_Delete(false_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean) +{ + cJSON *bool_item = cJSON_CreateBool(boolean); + if (add_item_to_object(object, name, bool_item, &global_hooks, false)) + { + return bool_item; + } + + cJSON_Delete(bool_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number) +{ + cJSON *number_item = cJSON_CreateNumber(number); + if (add_item_to_object(object, name, number_item, &global_hooks, false)) + { + return number_item; + } + + cJSON_Delete(number_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string) +{ + cJSON *string_item = cJSON_CreateString(string); + if (add_item_to_object(object, name, string_item, &global_hooks, false)) + { + return string_item; + } + + cJSON_Delete(string_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw) +{ + cJSON *raw_item = cJSON_CreateRaw(raw); + if (add_item_to_object(object, name, raw_item, &global_hooks, false)) + { + return raw_item; + } + + cJSON_Delete(raw_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name) +{ + cJSON *object_item = cJSON_CreateObject(); + if (add_item_to_object(object, name, object_item, &global_hooks, false)) + { + return object_item; + } + + cJSON_Delete(object_item); + return NULL; +} + +CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name) +{ + cJSON *array = cJSON_CreateArray(); + if (add_item_to_object(object, name, array, &global_hooks, false)) + { + return array; + } + + cJSON_Delete(array); + return NULL; +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item) +{ + if ((parent == NULL) || (item == NULL)) + { + return NULL; + } + + if (item->prev != NULL) + { + /* not the first element */ + item->prev->next = item->next; + } + if (item->next != NULL) + { + /* not the last element */ + item->next->prev = item->prev; + } + + if (item == parent->child) + { + /* first element */ + parent->child = item->next; + } + /* make sure the detached item doesn't point anywhere anymore */ + item->prev = NULL; + item->next = NULL; + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which) +{ + if (which < 0) + { + return NULL; + } + + return cJSON_DetachItemViaPointer(array, get_array_item(array, (size_t)which)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which) +{ + cJSON_Delete(cJSON_DetachItemFromArray(array, which)); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string) +{ + cJSON *to_detach = cJSON_GetObjectItem(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ + cJSON *to_detach = cJSON_GetObjectItemCaseSensitive(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string) +{ + cJSON_Delete(cJSON_DetachItemFromObject(object, string)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ + cJSON_Delete(cJSON_DetachItemFromObjectCaseSensitive(object, string)); +} + +/* Replace array/object items with new ones. */ +CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem) +{ + cJSON *after_inserted = NULL; + + if (which < 0) + { + return; + } + + after_inserted = get_array_item(array, (size_t)which); + if (after_inserted == NULL) + { + add_item_to_array(array, newitem); + return; + } + + newitem->next = after_inserted; + newitem->prev = after_inserted->prev; + after_inserted->prev = newitem; + if (after_inserted == array->child) + { + array->child = newitem; + } + else + { + newitem->prev->next = newitem; + } +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement) +{ + if ((parent == NULL) || (replacement == NULL) || (item == NULL)) + { + return false; + } + + if (replacement == item) + { + return true; + } + + replacement->next = item->next; + replacement->prev = item->prev; + + if (replacement->next != NULL) + { + replacement->next->prev = replacement; + } + if (replacement->prev != NULL) + { + replacement->prev->next = replacement; + } + if (parent->child == item) + { + parent->child = replacement; + } + + item->next = NULL; + item->prev = NULL; + cJSON_Delete(item); + + return true; +} + +CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem) +{ + if (which < 0) + { + return; + } + + cJSON_ReplaceItemViaPointer(array, get_array_item(array, (size_t)which), newitem); +} + +static cJSON_bool replace_item_in_object(cJSON *object, const char *string, cJSON *replacement, cJSON_bool case_sensitive) +{ + if ((replacement == NULL) || (string == NULL)) + { + return false; + } + + /* replace the name in the replacement */ + if (!(replacement->type & cJSON_StringIsConst) && (replacement->string != NULL)) + { + cJSON_free(replacement->string); + } + replacement->string = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + replacement->type &= ~cJSON_StringIsConst; + + cJSON_ReplaceItemViaPointer(object, get_object_item(object, string, case_sensitive), replacement); + + return true; +} + +CJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object, const char *string, cJSON *newitem) +{ + replace_item_in_object(object, string, newitem, false); +} + +CJSON_PUBLIC(void) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object, const char *string, cJSON *newitem) +{ + replace_item_in_object(object, string, newitem, true); +} + +/* Create basic types: */ +CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_NULL; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_True; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_False; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool b) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = b ? cJSON_True : cJSON_False; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_Number; + item->valuedouble = num; + + /* use saturation in case of overflow */ + if (num >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (num <= (double)INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)num; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_String; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + if(!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if (item != NULL) + { + item->type = cJSON_String | cJSON_IsReference; + item->valuestring = (char*)cast_away_const(string); + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if (item != NULL) { + item->type = cJSON_Object | cJSON_IsReference; + item->child = (cJSON*)cast_away_const(child); + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child) { + cJSON *item = cJSON_New_Item(&global_hooks); + if (item != NULL) { + item->type = cJSON_Array | cJSON_IsReference; + item->child = (cJSON*)cast_away_const(child); + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_Raw; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)raw, &global_hooks); + if(!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type=cJSON_Array; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_Object; + } + + return item; +} + +/* Create Arrays: */ +CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + for(i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber(numbers[i]); + if (!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for(i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber((double)numbers[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for(i = 0;a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber(numbers[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char **strings, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (strings == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for (i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateString(strings[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p,n); + } + p = n; + } + + return a; +} + +/* Duplication */ +CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse) +{ + cJSON *newitem = NULL; + cJSON *child = NULL; + cJSON *next = NULL; + cJSON *newchild = NULL; + + /* Bail on bad ptr */ + if (!item) + { + goto fail; + } + /* Create new item */ + newitem = cJSON_New_Item(&global_hooks); + if (!newitem) + { + goto fail; + } + /* Copy over all vars */ + newitem->type = item->type & (~cJSON_IsReference); + newitem->valueint = item->valueint; + newitem->valuedouble = item->valuedouble; + if (item->valuestring) + { + newitem->valuestring = (char*)cJSON_strdup((unsigned char*)item->valuestring, &global_hooks); + if (!newitem->valuestring) + { + goto fail; + } + } + if (item->string) + { + newitem->string = (item->type&cJSON_StringIsConst) ? item->string : (char*)cJSON_strdup((unsigned char*)item->string, &global_hooks); + if (!newitem->string) + { + goto fail; + } + } + /* If non-recursive, then we're done! */ + if (!recurse) + { + return newitem; + } + /* Walk the ->next chain for the child. */ + child = item->child; + while (child != NULL) + { + newchild = cJSON_Duplicate(child, true); /* Duplicate (with recurse) each item in the ->next chain */ + if (!newchild) + { + goto fail; + } + if (next != NULL) + { + /* If newitem->child already set, then crosswire ->prev and ->next and move on */ + next->next = newchild; + newchild->prev = next; + next = newchild; + } + else + { + /* Set newitem->child and move to it */ + newitem->child = newchild; + next = newchild; + } + child = child->next; + } + + return newitem; + +fail: + if (newitem != NULL) + { + cJSON_Delete(newitem); + } + + return NULL; +} + +CJSON_PUBLIC(void) cJSON_Minify(char *json) +{ + unsigned char *into = (unsigned char*)json; + + if (json == NULL) + { + return; + } + + while (*json) + { + if (*json == ' ') + { + json++; + } + else if (*json == '\t') + { + /* Whitespace characters. */ + json++; + } + else if (*json == '\r') + { + json++; + } + else if (*json=='\n') + { + json++; + } + else if ((*json == '/') && (json[1] == '/')) + { + /* double-slash comments, to end of line. */ + while (*json && (*json != '\n')) + { + json++; + } + } + else if ((*json == '/') && (json[1] == '*')) + { + /* multiline comments. */ + while (*json && !((*json == '*') && (json[1] == '/'))) + { + json++; + } + json += 2; + } + else if (*json == '\"') + { + /* string literals, which are \" sensitive. */ + *into++ = (unsigned char)*json++; + while (*json && (*json != '\"')) + { + if (*json == '\\') + { + *into++ = (unsigned char)*json++; + } + *into++ = (unsigned char)*json++; + } + *into++ = (unsigned char)*json++; + } + else + { + /* All other characters. */ + *into++ = (unsigned char)*json++; + } + } + + /* and null-terminate. */ + *into = '\0'; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Invalid; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_False; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xff) == cJSON_True; +} + + +CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & (cJSON_True | cJSON_False)) != 0; +} +CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_NULL; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Number; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_String; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Array; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Object; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Raw; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive) +{ + if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF)) || cJSON_IsInvalid(a)) + { + return false; + } + + /* check if type is valid */ + switch (a->type & 0xFF) + { + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + case cJSON_Number: + case cJSON_String: + case cJSON_Raw: + case cJSON_Array: + case cJSON_Object: + break; + + default: + return false; + } + + /* identical objects are equal */ + if (a == b) + { + return true; + } + + switch (a->type & 0xFF) + { + /* in these cases and equal type is enough */ + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + return true; + + case cJSON_Number: + if (a->valuedouble == b->valuedouble) + { + return true; + } + return false; + + case cJSON_String: + case cJSON_Raw: + if ((a->valuestring == NULL) || (b->valuestring == NULL)) + { + return false; + } + if (strcmp(a->valuestring, b->valuestring) == 0) + { + return true; + } + + return false; + + case cJSON_Array: + { + cJSON *a_element = a->child; + cJSON *b_element = b->child; + + for (; (a_element != NULL) && (b_element != NULL);) + { + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + + a_element = a_element->next; + b_element = b_element->next; + } + + /* one of the arrays is longer than the other */ + if (a_element != b_element) { + return false; + } + + return true; + } + + case cJSON_Object: + { + cJSON *a_element = NULL; + cJSON *b_element = NULL; + cJSON_ArrayForEach(a_element, a) + { + /* TODO This has O(n^2) runtime, which is horrible! */ + b_element = get_object_item(b, a_element->string, case_sensitive); + if (b_element == NULL) + { + return false; + } + + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + } + + /* doing this twice, once on a and b to prevent true comparison if a subset of b + * TODO: Do this the proper way, this is just a fix for now */ + cJSON_ArrayForEach(b_element, b) + { + a_element = get_object_item(a, b_element->string, case_sensitive); + if (a_element == NULL) + { + return false; + } + + if (!cJSON_Compare(b_element, a_element, case_sensitive)) + { + return false; + } + } + + return true; + } + + default: + return false; + } +} + +CJSON_PUBLIC(void *) cJSON_malloc(size_t size) +{ + return global_hooks.allocate(size); +} + +CJSON_PUBLIC(void) cJSON_free(void *object) +{ + global_hooks.deallocate(object); +} diff --git a/vendor/cJSON/cJSON.h b/vendor/cJSON/cJSON.h new file mode 100644 index 0000000..8d45390 --- /dev/null +++ b/vendor/cJSON/cJSON.h @@ -0,0 +1,285 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#ifndef cJSON__h +#define cJSON__h + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32)) +#define __WINDOWS__ +#endif + +#ifdef __WINDOWS__ + +/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention. For windows you have 3 define options: + +CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols +CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default) +CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol + +For *nix builds that support visibility attribute, you can define similar behavior by + +setting default visibility to hidden by adding +-fvisibility=hidden (for gcc) +or +-xldscope=hidden (for sun cc) +to CFLAGS + +then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does + +*/ + +#define CJSON_CDECL __cdecl +#define CJSON_STDCALL __stdcall + +/* export symbols by default, this is necessary for copy pasting the C and header file */ +#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_EXPORT_SYMBOLS +#endif + +#if defined(CJSON_HIDE_SYMBOLS) +#define CJSON_PUBLIC(type) type CJSON_STDCALL +#elif defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllexport) type CJSON_STDCALL +#elif defined(CJSON_IMPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllimport) type CJSON_STDCALL +#endif +#else /* !__WINDOWS__ */ +#define CJSON_CDECL +#define CJSON_STDCALL + +#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY) +#define CJSON_PUBLIC(type) __attribute__((visibility("default"))) type +#else +#define CJSON_PUBLIC(type) type +#endif +#endif + +/* project version */ +#define CJSON_VERSION_MAJOR 1 +#define CJSON_VERSION_MINOR 7 +#define CJSON_VERSION_PATCH 8 + +#include + +/* cJSON Types: */ +#define cJSON_Invalid (0) +#define cJSON_False (1 << 0) +#define cJSON_True (1 << 1) +#define cJSON_NULL (1 << 2) +#define cJSON_Number (1 << 3) +#define cJSON_String (1 << 4) +#define cJSON_Array (1 << 5) +#define cJSON_Object (1 << 6) +#define cJSON_Raw (1 << 7) /* raw json */ + +#define cJSON_IsReference 256 +#define cJSON_StringIsConst 512 + +/* The cJSON structure: */ +typedef struct cJSON +{ + /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */ + struct cJSON *next; + struct cJSON *prev; + /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */ + struct cJSON *child; + + /* The type of the item, as above. */ + int type; + + /* The item's string, if type==cJSON_String and type == cJSON_Raw */ + char *valuestring; + /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */ + int valueint; + /* The item's number, if type==cJSON_Number */ + double valuedouble; + + /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */ + char *string; +} cJSON; + +typedef struct cJSON_Hooks +{ + /* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */ + void *(CJSON_CDECL *malloc_fn)(size_t sz); + void (CJSON_CDECL *free_fn)(void *ptr); +} cJSON_Hooks; + +typedef int cJSON_bool; + +/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them. + * This is to prevent stack overflows. */ +#ifndef CJSON_NESTING_LIMIT +#define CJSON_NESTING_LIMIT 1000 +#endif + +/* returns the version of cJSON as a string */ +CJSON_PUBLIC(const char*) cJSON_Version(void); + +/* Supply malloc, realloc and free functions to cJSON */ +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks); + +/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */ +/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */ +CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value); +/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */ +/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */ +CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated); + +/* Render a cJSON entity to text for transfer/storage. */ +CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item); +/* Render a cJSON entity to text for transfer/storage without any formatting. */ +CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item); +/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */ +CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt); +/* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */ +/* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */ +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format); +/* Delete a cJSON entity and all subentities. */ +CJSON_PUBLIC(void) cJSON_Delete(cJSON *c); + +/* Returns the number of items in an array (or object). */ +CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array); +/* Retrieve item number "index" from array "array". Returns NULL if unsuccessful. */ +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index); +/* Get item "string" from object. Case insensitive. */ +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string); +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string); +CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string); +/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */ +CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void); + +/* Check if the item is a string and return its valuestring */ +CJSON_PUBLIC(char *) cJSON_GetStringValue(cJSON *item); + +/* These functions check the type of an item */ +CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item); + +/* These calls create a cJSON item of the appropriate type. */ +CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean); +CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num); +CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string); +/* raw json */ +CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw); +CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void); + +/* Create a string where valuestring references a string so + * it will not be freed by cJSON_Delete */ +CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string); +/* Create an object/arrray that only references it's elements so + * they will not be freed by cJSON_Delete */ +CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child); +CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child); + +/* These utilities create an Array of count items. */ +CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char **strings, int count); + +/* Append item to the specified array/object. */ +CJSON_PUBLIC(void) cJSON_AddItemToArray(cJSON *array, cJSON *item); +CJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item); +/* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object. + * WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before + * writing to `item->string` */ +CJSON_PUBLIC(void) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item); +/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */ +CJSON_PUBLIC(void) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item); +CJSON_PUBLIC(void) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item); + +/* Remove/Detatch items from Arrays/Objects. */ +CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which); +CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string); +CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string); +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string); + +/* Update array items. */ +CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */ +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement); +CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem); +CJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem); +CJSON_PUBLIC(void) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem); + +/* Duplicate a cJSON item */ +CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse); +/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will +need to be released. With recurse!=0, it will duplicate any children connected to the item. +The item->next and ->prev pointers are always zero on return from Duplicate. */ +/* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal. + * case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */ +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive); + + +CJSON_PUBLIC(void) cJSON_Minify(char *json); + +/* Helper functions for creating and adding items to an object at the same time. + * They return the added item or NULL on failure. */ +CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name); +CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name); +CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name); +CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean); +CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number); +CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string); +CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw); +CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name); +CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name); + +/* When assigning an integer value, it needs to be propagated to valuedouble too. */ +#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number)) +/* helper for the cJSON_SetNumberValue macro */ +CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number); +#define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number)) + +/* Macro for iterating over an array or object */ +#define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next) + +/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */ +CJSON_PUBLIC(void *) cJSON_malloc(size_t size); +CJSON_PUBLIC(void) cJSON_free(void *object); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/cJSON/test.c b/vendor/cJSON/test.c new file mode 100644 index 0000000..986fc6e --- /dev/null +++ b/vendor/cJSON/test.c @@ -0,0 +1,268 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#include +#include +#include +#include "cJSON.h" + +/* Used by some code below as an example datatype. */ +struct record +{ + const char *precision; + double lat; + double lon; + const char *address; + const char *city; + const char *state; + const char *zip; + const char *country; +}; + + +/* Create a bunch of objects as demonstration. */ +static int print_preallocated(cJSON *root) +{ + /* declarations */ + char *out = NULL; + char *buf = NULL; + char *buf_fail = NULL; + size_t len = 0; + size_t len_fail = 0; + + /* formatted print */ + out = cJSON_Print(root); + + /* create buffer to succeed */ + /* the extra 5 bytes are because of inaccuracies when reserving memory */ + len = strlen(out) + 5; + buf = (char*)malloc(len); + if (buf == NULL) + { + printf("Failed to allocate memory.\n"); + exit(1); + } + + /* create buffer to fail */ + len_fail = strlen(out); + buf_fail = (char*)malloc(len_fail); + if (buf_fail == NULL) + { + printf("Failed to allocate memory.\n"); + exit(1); + } + + /* Print to buffer */ + if (!cJSON_PrintPreallocated(root, buf, (int)len, 1)) { + printf("cJSON_PrintPreallocated failed!\n"); + if (strcmp(out, buf) != 0) { + printf("cJSON_PrintPreallocated not the same as cJSON_Print!\n"); + printf("cJSON_Print result:\n%s\n", out); + printf("cJSON_PrintPreallocated result:\n%s\n", buf); + } + free(out); + free(buf_fail); + free(buf); + return -1; + } + + /* success */ + printf("%s\n", buf); + + /* force it to fail */ + if (cJSON_PrintPreallocated(root, buf_fail, (int)len_fail, 1)) { + printf("cJSON_PrintPreallocated failed to show error with insufficient memory!\n"); + printf("cJSON_Print result:\n%s\n", out); + printf("cJSON_PrintPreallocated result:\n%s\n", buf_fail); + free(out); + free(buf_fail); + free(buf); + return -1; + } + + free(out); + free(buf_fail); + free(buf); + return 0; +} + +/* Create a bunch of objects as demonstration. */ +static void create_objects(void) +{ + /* declare a few. */ + cJSON *root = NULL; + cJSON *fmt = NULL; + cJSON *img = NULL; + cJSON *thm = NULL; + cJSON *fld = NULL; + int i = 0; + + /* Our "days of the week" array: */ + const char *strings[7] = + { + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday" + }; + /* Our matrix: */ + int numbers[3][3] = + { + {0, -1, 0}, + {1, 0, 0}, + {0 ,0, 1} + }; + /* Our "gallery" item: */ + int ids[4] = { 116, 943, 234, 38793 }; + /* Our array of "records": */ + struct record fields[2] = + { + { + "zip", + 37.7668, + -1.223959e+2, + "", + "SAN FRANCISCO", + "CA", + "94107", + "US" + }, + { + "zip", + 37.371991, + -1.22026e+2, + "", + "SUNNYVALE", + "CA", + "94085", + "US" + } + }; + volatile double zero = 0.0; + + /* Here we construct some JSON standards, from the JSON site. */ + + /* Our "Video" datatype: */ + root = cJSON_CreateObject(); + cJSON_AddItemToObject(root, "name", cJSON_CreateString("Jack (\"Bee\") Nimble")); + cJSON_AddItemToObject(root, "format", fmt = cJSON_CreateObject()); + cJSON_AddStringToObject(fmt, "type", "rect"); + cJSON_AddNumberToObject(fmt, "width", 1920); + cJSON_AddNumberToObject(fmt, "height", 1080); + cJSON_AddFalseToObject (fmt, "interlace"); + cJSON_AddNumberToObject(fmt, "frame rate", 24); + + /* Print to text */ + if (print_preallocated(root) != 0) { + cJSON_Delete(root); + exit(EXIT_FAILURE); + } + cJSON_Delete(root); + + /* Our "days of the week" array: */ + root = cJSON_CreateStringArray(strings, 7); + + if (print_preallocated(root) != 0) { + cJSON_Delete(root); + exit(EXIT_FAILURE); + } + cJSON_Delete(root); + + /* Our matrix: */ + root = cJSON_CreateArray(); + for (i = 0; i < 3; i++) + { + cJSON_AddItemToArray(root, cJSON_CreateIntArray(numbers[i], 3)); + } + + /* cJSON_ReplaceItemInArray(root, 1, cJSON_CreateString("Replacement")); */ + + if (print_preallocated(root) != 0) { + cJSON_Delete(root); + exit(EXIT_FAILURE); + } + cJSON_Delete(root); + + /* Our "gallery" item: */ + root = cJSON_CreateObject(); + cJSON_AddItemToObject(root, "Image", img = cJSON_CreateObject()); + cJSON_AddNumberToObject(img, "Width", 800); + cJSON_AddNumberToObject(img, "Height", 600); + cJSON_AddStringToObject(img, "Title", "View from 15th Floor"); + cJSON_AddItemToObject(img, "Thumbnail", thm = cJSON_CreateObject()); + cJSON_AddStringToObject(thm, "Url", "http:/*www.example.com/image/481989943"); + cJSON_AddNumberToObject(thm, "Height", 125); + cJSON_AddStringToObject(thm, "Width", "100"); + cJSON_AddItemToObject(img, "IDs", cJSON_CreateIntArray(ids, 4)); + + if (print_preallocated(root) != 0) { + cJSON_Delete(root); + exit(EXIT_FAILURE); + } + cJSON_Delete(root); + + /* Our array of "records": */ + root = cJSON_CreateArray(); + for (i = 0; i < 2; i++) + { + cJSON_AddItemToArray(root, fld = cJSON_CreateObject()); + cJSON_AddStringToObject(fld, "precision", fields[i].precision); + cJSON_AddNumberToObject(fld, "Latitude", fields[i].lat); + cJSON_AddNumberToObject(fld, "Longitude", fields[i].lon); + cJSON_AddStringToObject(fld, "Address", fields[i].address); + cJSON_AddStringToObject(fld, "City", fields[i].city); + cJSON_AddStringToObject(fld, "State", fields[i].state); + cJSON_AddStringToObject(fld, "Zip", fields[i].zip); + cJSON_AddStringToObject(fld, "Country", fields[i].country); + } + + /* cJSON_ReplaceItemInObject(cJSON_GetArrayItem(root, 1), "City", cJSON_CreateIntArray(ids, 4)); */ + + if (print_preallocated(root) != 0) { + cJSON_Delete(root); + exit(EXIT_FAILURE); + } + cJSON_Delete(root); + + root = cJSON_CreateObject(); + cJSON_AddNumberToObject(root, "number", 1.0 / zero); + + if (print_preallocated(root) != 0) { + cJSON_Delete(root); + exit(EXIT_FAILURE); + } + cJSON_Delete(root); +} + +int CJSON_CDECL main(void) +{ + /* print the version */ + printf("Version: %s\n", cJSON_Version()); + + /* Now some samplecode for building objects concisely: */ + create_objects(); + + return 0; +} diff --git a/vendor/inih/LICENSE.txt b/vendor/inih/LICENSE.txt new file mode 100644 index 0000000..cb7ee2d --- /dev/null +++ b/vendor/inih/LICENSE.txt @@ -0,0 +1,27 @@ + +The "inih" library is distributed under the New BSD license: + +Copyright (c) 2009, Ben Hoyt +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Ben Hoyt nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY BEN HOYT ''AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BEN HOYT BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/inih/ini.c b/vendor/inih/ini.c new file mode 100644 index 0000000..81df6a0 --- /dev/null +++ b/vendor/inih/ini.c @@ -0,0 +1,269 @@ +/* inih -- simple .INI file parser + +inih is released under the New BSD license (see LICENSE.txt). Go to the project +home page for more info: + +https://github.com/benhoyt/inih + +*/ + +#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include +#include +#include + +#include "ini.h" + +#if !INI_USE_STACK +#include +#endif + +#define MAX_SECTION 50 +#define MAX_NAME 50 + +/* Used by ini_parse_string() to keep track of string parsing state. */ +typedef struct { + const char* ptr; + size_t num_left; +} ini_parse_string_ctx; + +/* Strip whitespace chars off end of given string, in place. Return s. */ +static char* rstrip(char* s) +{ + char* p = s + strlen(s); + while (p > s && isspace((unsigned char)(*--p))) + *p = '\0'; + return s; +} + +/* Return pointer to first non-whitespace char in given string. */ +static char* lskip(const char* s) +{ + while (*s && isspace((unsigned char)(*s))) + s++; + return (char*)s; +} + +/* Return pointer to first char (of chars) or inline comment in given string, + or pointer to null at end of string if neither found. Inline comment must + be prefixed by a whitespace character to register as a comment. */ +static char* find_chars_or_comment(const char* s, const char* chars) +{ +#if INI_ALLOW_INLINE_COMMENTS + int was_space = 0; + while (*s && (!chars || !strchr(chars, *s)) && + !(was_space && strchr(INI_INLINE_COMMENT_PREFIXES, *s))) { + was_space = isspace((unsigned char)(*s)); + s++; + } +#else + while (*s && (!chars || !strchr(chars, *s))) { + s++; + } +#endif + return (char*)s; +} + +/* Version of strncpy that ensures dest (size bytes) is null-terminated. */ +static char* strncpy0(char* dest, const char* src, size_t size) +{ + strncpy(dest, src, size - 1); + dest[size - 1] = '\0'; + return dest; +} + +/* See documentation in header file. */ +int ini_parse_stream(ini_reader reader, void* stream, ini_handler handler, + void* user) +{ + /* Uses a fair bit of stack (use heap instead if you need to) */ +#if INI_USE_STACK + char line[INI_MAX_LINE]; + int max_line = INI_MAX_LINE; +#else + char* line; + int max_line = INI_INITIAL_ALLOC; +#endif +#if INI_ALLOW_REALLOC && !INI_USE_STACK + char* new_line; + int offset; +#endif + char section[MAX_SECTION] = ""; + char prev_name[MAX_NAME] = ""; + + char* start; + char* end; + char* name; + char* value; + int lineno = 0; + int error = 0; + +#if !INI_USE_STACK + line = (char*)malloc(INI_INITIAL_ALLOC); + if (!line) { + return -2; + } +#endif + +#if INI_HANDLER_LINENO +#define HANDLER(u, s, n, v) handler(u, s, n, v, lineno) +#else +#define HANDLER(u, s, n, v) handler(u, s, n, v) +#endif + + /* Scan through stream line by line */ + while (reader(line, max_line, stream) != NULL) { +#if INI_ALLOW_REALLOC && !INI_USE_STACK + offset = strlen(line); + while (offset == max_line - 1 && line[offset - 1] != '\n') { + max_line *= 2; + if (max_line > INI_MAX_LINE) + max_line = INI_MAX_LINE; + new_line = realloc(line, max_line); + if (!new_line) { + free(line); + return -2; + } + line = new_line; + if (reader(line + offset, max_line - offset, stream) == NULL) + break; + if (max_line >= INI_MAX_LINE) + break; + offset += strlen(line + offset); + } +#endif + + lineno++; + + start = line; +#if INI_ALLOW_BOM + if (lineno == 1 && (unsigned char)start[0] == 0xEF && + (unsigned char)start[1] == 0xBB && + (unsigned char)start[2] == 0xBF) { + start += 3; + } +#endif + start = lskip(rstrip(start)); + + if (strchr(INI_START_COMMENT_PREFIXES, *start)) { + /* Start-of-line comment */ + } +#if INI_ALLOW_MULTILINE + else if (*prev_name && *start && start > line) { + /* Non-blank line with leading whitespace, treat as continuation + of previous name's value (as per Python configparser). */ + if (!HANDLER(user, section, prev_name, start) && !error) + error = lineno; + } +#endif + else if (*start == '[') { + /* A "[section]" line */ + end = find_chars_or_comment(start + 1, "]"); + if (*end == ']') { + *end = '\0'; + strncpy0(section, start + 1, sizeof(section)); + *prev_name = '\0'; + } + else if (!error) { + /* No ']' found on section line */ + error = lineno; + } + } + else if (*start) { + /* Not a comment, must be a name[=:]value pair */ + end = find_chars_or_comment(start, "=:"); + if (*end == '=' || *end == ':') { + *end = '\0'; + name = rstrip(start); + value = end + 1; +#if INI_ALLOW_INLINE_COMMENTS + end = find_chars_or_comment(value, NULL); + if (*end) + *end = '\0'; +#endif + value = lskip(value); + rstrip(value); + + /* Valid name[=:]value pair found, call handler */ + strncpy0(prev_name, name, sizeof(prev_name)); + if (!HANDLER(user, section, name, value) && !error) + error = lineno; + } + else if (!error) { + /* No '=' or ':' found on name[=:]value line */ + error = lineno; + } + } + +#if INI_STOP_ON_FIRST_ERROR + if (error) + break; +#endif + } + +#if !INI_USE_STACK + free(line); +#endif + + return error; +} + +/* See documentation in header file. */ +int ini_parse_file(FILE* file, ini_handler handler, void* user) +{ + return ini_parse_stream((ini_reader)fgets, file, handler, user); +} + +/* See documentation in header file. */ +int ini_parse(const char* filename, ini_handler handler, void* user) +{ + FILE* file; + int error; + + file = fopen(filename, "r"); + if (!file) + return -1; + error = ini_parse_file(file, handler, user); + fclose(file); + return error; +} + +/* An ini_reader function to read the next line from a string buffer. This + is the fgets() equivalent used by ini_parse_string(). */ +static char* ini_reader_string(char* str, int num, void* stream) { + ini_parse_string_ctx* ctx = (ini_parse_string_ctx*)stream; + const char* ctx_ptr = ctx->ptr; + size_t ctx_num_left = ctx->num_left; + char* strp = str; + char c; + + if (ctx_num_left == 0 || num < 2) + return NULL; + + while (num > 1 && ctx_num_left != 0) { + c = *ctx_ptr++; + ctx_num_left--; + *strp++ = c; + if (c == '\n') + break; + num--; + } + + *strp = '\0'; + ctx->ptr = ctx_ptr; + ctx->num_left = ctx_num_left; + return str; +} + +/* See documentation in header file. */ +int ini_parse_string(const char* string, ini_handler handler, void* user) { + ini_parse_string_ctx ctx; + + ctx.ptr = string; + ctx.num_left = strlen(string); + return ini_parse_stream((ini_reader)ini_reader_string, &ctx, handler, + user); +} diff --git a/vendor/inih/ini.h b/vendor/inih/ini.h new file mode 100644 index 0000000..4db7d77 --- /dev/null +++ b/vendor/inih/ini.h @@ -0,0 +1,130 @@ +/* inih -- simple .INI file parser + +inih is released under the New BSD license (see LICENSE.txt). Go to the project +home page for more info: + +https://github.com/benhoyt/inih + +*/ + +#ifndef __INI_H__ +#define __INI_H__ + +/* Make this header file easier to include in C++ code */ +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* Nonzero if ini_handler callback should accept lineno parameter. */ +#ifndef INI_HANDLER_LINENO +#define INI_HANDLER_LINENO 0 +#endif + +/* Typedef for prototype of handler function. */ +#if INI_HANDLER_LINENO +typedef int (*ini_handler)(void* user, const char* section, + const char* name, const char* value, + int lineno); +#else +typedef int (*ini_handler)(void* user, const char* section, + const char* name, const char* value); +#endif + +/* Typedef for prototype of fgets-style reader function. */ +typedef char* (*ini_reader)(char* str, int num, void* stream); + +/* Parse given INI-style file. May have [section]s, name=value pairs + (whitespace stripped), and comments starting with ';' (semicolon). Section + is "" if name=value pair parsed before any section heading. name:value + pairs are also supported as a concession to Python's configparser. + + For each name=value pair parsed, call handler function with given user + pointer as well as section, name, and value (data only valid for duration + of handler call). Handler should return nonzero on success, zero on error. + + Returns 0 on success, line number of first error on parse error (doesn't + stop on first error), -1 on file open error, or -2 on memory allocation + error (only when INI_USE_STACK is zero). +*/ +int ini_parse(const char* filename, ini_handler handler, void* user); + +/* Same as ini_parse(), but takes a FILE* instead of filename. This doesn't + close the file when it's finished -- the caller must do that. */ +int ini_parse_file(FILE* file, ini_handler handler, void* user); + +/* Same as ini_parse(), but takes an ini_reader function pointer instead of + filename. Used for implementing custom or string-based I/O (see also + ini_parse_string). */ +int ini_parse_stream(ini_reader reader, void* stream, ini_handler handler, + void* user); + +/* Same as ini_parse(), but takes a zero-terminated string with the INI data +instead of a file. Useful for parsing INI data from a network socket or +already in memory. */ +int ini_parse_string(const char* string, ini_handler handler, void* user); + +/* Nonzero to allow multi-line value parsing, in the style of Python's + configparser. If allowed, ini_parse() will call the handler with the same + name for each subsequent line parsed. */ +#ifndef INI_ALLOW_MULTILINE +#define INI_ALLOW_MULTILINE 1 +#endif + +/* Nonzero to allow a UTF-8 BOM sequence (0xEF 0xBB 0xBF) at the start of + the file. See https://github.com/benhoyt/inih/issues/21 */ +#ifndef INI_ALLOW_BOM +#define INI_ALLOW_BOM 1 +#endif + +/* Chars that begin a start-of-line comment. Per Python configparser, allow + both ; and # comments at the start of a line by default. */ +#ifndef INI_START_COMMENT_PREFIXES +#define INI_START_COMMENT_PREFIXES ";#" +#endif + +/* Nonzero to allow inline comments (with valid inline comment characters + specified by INI_INLINE_COMMENT_PREFIXES). Set to 0 to turn off and match + Python 3.2+ configparser behaviour. */ +#ifndef INI_ALLOW_INLINE_COMMENTS +#define INI_ALLOW_INLINE_COMMENTS 1 +#endif +#ifndef INI_INLINE_COMMENT_PREFIXES +#define INI_INLINE_COMMENT_PREFIXES ";" +#endif + +/* Nonzero to use stack for line buffer, zero to use heap (malloc/free). */ +#ifndef INI_USE_STACK +#define INI_USE_STACK 1 +#endif + +/* Maximum line length for any line in INI file (stack or heap). Note that + this must be 3 more than the longest line (due to '\r', '\n', and '\0'). */ +#ifndef INI_MAX_LINE +#define INI_MAX_LINE 200 +#endif + +/* Nonzero to allow heap line buffer to grow via realloc(), zero for a + fixed-size buffer of INI_MAX_LINE bytes. Only applies if INI_USE_STACK is + zero. */ +#ifndef INI_ALLOW_REALLOC +#define INI_ALLOW_REALLOC 0 +#endif + +/* Initial size in bytes for heap line buffer. Only applies if INI_USE_STACK + is zero. */ +#ifndef INI_INITIAL_ALLOC +#define INI_INITIAL_ALLOC 200 +#endif + +/* Stop parsing on first error (default is to keep parsing). */ +#ifndef INI_STOP_ON_FIRST_ERROR +#define INI_STOP_ON_FIRST_ERROR 0 +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __INI_H__ */ diff --git a/vendor/whereami/LICENSE b/vendor/whereami/LICENSE new file mode 100644 index 0000000..1c594b3 --- /dev/null +++ b/vendor/whereami/LICENSE @@ -0,0 +1,25 @@ +-------------------------------------------------------------------------------- + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + 1. Bla bla bla + 2. Montesqieu et camembert, vive la France, zut alors! + +-------------------------------------------------------------------------------- + +WTFPLv2 is very permissive, see http://www.wtfpl.net/faq/ + +However, if this WTFPLV2 is REALLY a blocker and is the reason you can't use +this project, contact me and I'll dual license it. + +-------------------------------------------------------------------------------- diff --git a/vendor/whereami/whereami.c b/vendor/whereami/whereami.c new file mode 100644 index 0000000..4314a40 --- /dev/null +++ b/vendor/whereami/whereami.c @@ -0,0 +1,682 @@ +// (‑●‑●)> released under the WTFPL v2 license, by Gregory Pakosz (@gpakosz) +// https://github.com/gpakosz/whereami + +// in case you want to #include "whereami.c" in a larger compilation unit +#if !defined(WHEREAMI_H) +#include "whereami.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(WAI_MALLOC) || !defined(WAI_FREE) || !defined(WAI_REALLOC) +#include +#endif + +#if !defined(WAI_MALLOC) +#define WAI_MALLOC(size) malloc(size) +#endif + +#if !defined(WAI_FREE) +#define WAI_FREE(p) free(p) +#endif + +#if !defined(WAI_REALLOC) +#define WAI_REALLOC(p, size) realloc(p, size) +#endif + +#ifndef WAI_NOINLINE +#if defined(_MSC_VER) +#define WAI_NOINLINE __declspec(noinline) +#elif defined(__GNUC__) +#define WAI_NOINLINE __attribute__((noinline)) +#else +#error unsupported compiler +#endif +#endif + +#if defined(_MSC_VER) +#define WAI_RETURN_ADDRESS() _ReturnAddress() +#elif defined(__GNUC__) +#define WAI_RETURN_ADDRESS() __builtin_extract_return_addr(__builtin_return_address(0)) +#else +#error unsupported compiler +#endif + +#if defined(_WIN32) + +#define WIN32_LEAN_AND_MEAN +#if defined(_MSC_VER) +#pragma warning(push, 3) +#endif +#include +#include +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +static int WAI_PREFIX(getModulePath_)(HMODULE module, char* out, int capacity, int* dirname_length) +{ + wchar_t buffer1[MAX_PATH]; + wchar_t buffer2[MAX_PATH]; + wchar_t* path = NULL; + int length = -1; + + for (;;) + { + DWORD size; + int length_, length__; + + size = GetModuleFileNameW(module, buffer1, sizeof(buffer1) / sizeof(buffer1[0])); + + if (size == 0) + break; + else if (size == (DWORD)(sizeof(buffer1) / sizeof(buffer1[0]))) + { + DWORD size_ = size; + do + { + wchar_t* path_; + + path_ = (wchar_t*)WAI_REALLOC(path, sizeof(wchar_t) * size_ * 2); + if (!path_) + break; + size_ *= 2; + path = path_; + size = GetModuleFileNameW(module, path, size_); + } + while (size == size_); + + if (size == size_) + break; + } + else + path = buffer1; + + if (!_wfullpath(buffer2, path, MAX_PATH)) + break; + length_ = (int)wcslen(buffer2); + + /* + Notice: + + change CP_UTF8 to CP_ACP + SiGool 2018/11/02 + */ + length__ = WideCharToMultiByte(CP_ACP, 0, buffer2, length_ , out, capacity, NULL, NULL); + + if (length__ == 0) + length__ = WideCharToMultiByte(CP_ACP, 0, buffer2, length_, NULL, 0, NULL, NULL); + if (length__ == 0) + break; + + if (length__ <= capacity && dirname_length) + { + int i; + + for (i = length__ - 1; i >= 0; --i) + { + if (out[i] == '\\') + { + *dirname_length = i; + break; + } + } + } + + length = length__; + + break; + } + + if (path != buffer1) + WAI_FREE(path); + + return length; +} + +WAI_NOINLINE +WAI_FUNCSPEC +int WAI_PREFIX(getExecutablePath)(char* out, int capacity, int* dirname_length) +{ + return WAI_PREFIX(getModulePath_)(NULL, out, capacity, dirname_length); +} + +WAI_NOINLINE +WAI_FUNCSPEC +int WAI_PREFIX(getModulePath)(char* out, int capacity, int* dirname_length) +{ + HMODULE module; + int length = -1; + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable: 4054) +#endif + if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCTSTR)WAI_RETURN_ADDRESS(), &module)) +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + { + length = WAI_PREFIX(getModulePath_)(module, out, capacity, dirname_length); + } + + return length; +} + +#elif defined(__linux__) || defined(__CYGWIN__) || defined(__sun) + +#include +#include +#include +#if defined(__linux__) +#include +#else +#include +#endif +#ifndef __STDC_FORMAT_MACROS +#define __STDC_FORMAT_MACROS +#endif +#include + +#if !defined(WAI_PROC_SELF_EXE) +#if defined(__sun) +#define WAI_PROC_SELF_EXE "/proc/self/path/a.out" +#else +#define WAI_PROC_SELF_EXE "/proc/self/exe" +#endif +#endif + +WAI_FUNCSPEC +int WAI_PREFIX(getExecutablePath)(char* out, int capacity, int* dirname_length) +{ + char buffer[PATH_MAX]; + char* resolved = NULL; + int length = -1; + + for (;;) + { + resolved = realpath(WAI_PROC_SELF_EXE, buffer); + if (!resolved) + break; + + length = (int)strlen(resolved); + if (length <= capacity) + { + memcpy(out, resolved, length); + + if (dirname_length) + { + int i; + + for (i = length - 1; i >= 0; --i) + { + if (out[i] == '/') + { + *dirname_length = i; + break; + } + } + } + } + + break; + } + + return length; +} + +#if !defined(WAI_PROC_SELF_MAPS_RETRY) +#define WAI_PROC_SELF_MAPS_RETRY 5 +#endif + +#if !defined(WAI_PROC_SELF_MAPS) +#if defined(__sun) +#define WAI_PROC_SELF_MAPS "/proc/self/map" +#else +#define WAI_PROC_SELF_MAPS "/proc/self/maps" +#endif +#endif + +#if defined(__ANDROID__) || defined(ANDROID) +#include +#include +#include +#endif + +WAI_NOINLINE +WAI_FUNCSPEC +int WAI_PREFIX(getModulePath)(char* out, int capacity, int* dirname_length) +{ + int length = -1; + FILE* maps = NULL; + int i; + + for (i = 0; i < WAI_PROC_SELF_MAPS_RETRY; ++i) + { + maps = fopen(WAI_PROC_SELF_MAPS, "r"); + if (!maps) + break; + + for (;;) + { + char buffer[PATH_MAX < 1024 ? 1024 : PATH_MAX]; + uint64_t low, high; + char perms[5]; + uint64_t offset; + uint32_t major, minor; + char path[PATH_MAX]; + uint32_t inode; + + if (!fgets(buffer, sizeof(buffer), maps)) + break; + + if (sscanf(buffer, "%" PRIx64 "-%" PRIx64 " %s %" PRIx64 " %x:%x %u %s\n", &low, &high, perms, &offset, &major, &minor, &inode, path) == 8) + { + uint64_t addr = (uint64_t)(uintptr_t)WAI_RETURN_ADDRESS(); + if (low <= addr && addr <= high) + { + char* resolved; + + resolved = realpath(path, buffer); + if (!resolved) + break; + + length = (int)strlen(resolved); +#if defined(__ANDROID__) || defined(ANDROID) + if (length > 4 + &&buffer[length - 1] == 'k' + &&buffer[length - 2] == 'p' + &&buffer[length - 3] == 'a' + &&buffer[length - 4] == '.') + { + int fd = open(path, O_RDONLY); + char* begin; + char* p; + + begin = (char*)mmap(0, offset, PROT_READ, MAP_SHARED, fd, 0); + p = begin + offset; + + while (p >= begin) // scan backwards + { + if (*((uint32_t*)p) == 0x04034b50UL) // local file header found + { + uint16_t length_ = *((uint16_t*)(p + 26)); + + if (length + 2 + length_ < (int)sizeof(buffer)) + { + memcpy(&buffer[length], "!/", 2); + memcpy(&buffer[length + 2], p + 30, length_); + length += 2 + length_; + } + + break; + } + + p -= 4; + } + + munmap(begin, offset); + close(fd); + } +#endif + if (length <= capacity) + { + memcpy(out, resolved, length); + + if (dirname_length) + { + int i; + + for (i = length - 1; i >= 0; --i) + { + if (out[i] == '/') + { + *dirname_length = i; + break; + } + } + } + } + + break; + } + } + } + + fclose(maps); + + if (length != -1) + break; + } + + return length; +} + +#elif defined(__APPLE__) + +#define _DARWIN_BETTER_REALPATH +#include +#include +#include +#include +#include + +WAI_FUNCSPEC +int WAI_PREFIX(getExecutablePath)(char* out, int capacity, int* dirname_length) +{ + char buffer1[PATH_MAX]; + char buffer2[PATH_MAX]; + char* path = buffer1; + char* resolved = NULL; + int length = -1; + + for (;;) + { + uint32_t size = (uint32_t)sizeof(buffer1); + if (_NSGetExecutablePath(path, &size) == -1) + { + path = (char*)WAI_MALLOC(size); + if (!_NSGetExecutablePath(path, &size)) + break; + } + + resolved = realpath(path, buffer2); + if (!resolved) + break; + + length = (int)strlen(resolved); + if (length <= capacity) + { + memcpy(out, resolved, length); + + if (dirname_length) + { + int i; + + for (i = length - 1; i >= 0; --i) + { + if (out[i] == '/') + { + *dirname_length = i; + break; + } + } + } + } + + break; + } + + if (path != buffer1) + WAI_FREE(path); + + return length; +} + +WAI_NOINLINE +WAI_FUNCSPEC +int WAI_PREFIX(getModulePath)(char* out, int capacity, int* dirname_length) +{ + char buffer[PATH_MAX]; + char* resolved = NULL; + int length = -1; + + for(;;) + { + Dl_info info; + + if (dladdr(WAI_RETURN_ADDRESS(), &info)) + { + resolved = realpath(info.dli_fname, buffer); + if (!resolved) + break; + + length = (int)strlen(resolved); + if (length <= capacity) + { + memcpy(out, resolved, length); + + if (dirname_length) + { + int i; + + for (i = length - 1; i >= 0; --i) + { + if (out[i] == '/') + { + *dirname_length = i; + break; + } + } + } + } + } + + break; + } + + return length; +} + +#elif defined(__QNXNTO__) + +#include +#include +#include +#include +#include + +#if !defined(WAI_PROC_SELF_EXE) +#define WAI_PROC_SELF_EXE "/proc/self/exefile" +#endif + +WAI_FUNCSPEC +int WAI_PREFIX(getExecutablePath)(char* out, int capacity, int* dirname_length) +{ + char buffer1[PATH_MAX]; + char buffer2[PATH_MAX]; + char* resolved = NULL; + FILE* self_exe = NULL; + int length = -1; + + for (;;) + { + self_exe = fopen(WAI_PROC_SELF_EXE, "r"); + if (!self_exe) + break; + + if (!fgets(buffer1, sizeof(buffer1), self_exe)) + break; + + resolved = realpath(buffer1, buffer2); + if (!resolved) + break; + + length = (int)strlen(resolved); + if (length <= capacity) + { + memcpy(out, resolved, length); + + if (dirname_length) + { + int i; + + for (i = length - 1; i >= 0; --i) + { + if (out[i] == '/') + { + *dirname_length = i; + break; + } + } + } + } + + break; + } + + fclose(self_exe); + + return length; +} + +WAI_FUNCSPEC +int WAI_PREFIX(getModulePath)(char* out, int capacity, int* dirname_length) +{ + char buffer[PATH_MAX]; + char* resolved = NULL; + int length = -1; + + for(;;) + { + Dl_info info; + + if (dladdr(WAI_RETURN_ADDRESS(), &info)) + { + resolved = realpath(info.dli_fname, buffer); + if (!resolved) + break; + + length = (int)strlen(resolved); + if (length <= capacity) + { + memcpy(out, resolved, length); + + if (dirname_length) + { + int i; + + for (i = length - 1; i >= 0; --i) + { + if (out[i] == '/') + { + *dirname_length = i; + break; + } + } + } + } + } + + break; + } + + return length; +} + +#elif defined(__DragonFly__) || defined(__FreeBSD__) || \ + defined(__FreeBSD_kernel__) || defined(__NetBSD__) + +#include +#include +#include +#include +#include +#include + +WAI_FUNCSPEC +int WAI_PREFIX(getExecutablePath)(char* out, int capacity, int* dirname_length) +{ + char buffer1[PATH_MAX]; + char buffer2[PATH_MAX]; + char* path = buffer1; + char* resolved = NULL; + int length = -1; + + for (;;) + { + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; + size_t size = sizeof(buffer1); + + if (sysctl(mib, (u_int)(sizeof(mib) / sizeof(mib[0])), path, &size, NULL, 0) != 0) + break; + + resolved = realpath(path, buffer2); + if (!resolved) + break; + + length = (int)strlen(resolved); + if (length <= capacity) + { + memcpy(out, resolved, length); + + if (dirname_length) + { + int i; + + for (i = length - 1; i >= 0; --i) + { + if (out[i] == '/') + { + *dirname_length = i; + break; + } + } + } + } + + break; + } + + if (path != buffer1) + WAI_FREE(path); + + return length; +} + +WAI_NOINLINE +WAI_FUNCSPEC +int WAI_PREFIX(getModulePath)(char* out, int capacity, int* dirname_length) +{ + char buffer[PATH_MAX]; + char* resolved = NULL; + int length = -1; + + for(;;) + { + Dl_info info; + + if (dladdr(WAI_RETURN_ADDRESS(), &info)) + { + resolved = realpath(info.dli_fname, buffer); + if (!resolved) + break; + + length = (int)strlen(resolved); + if (length <= capacity) + { + memcpy(out, resolved, length); + + if (dirname_length) + { + int i; + + for (i = length - 1; i >= 0; --i) + { + if (out[i] == '/') + { + *dirname_length = i; + break; + } + } + } + } + } + + break; + } + + return length; +} + +#else + +#error unsupported platform + +#endif + +#ifdef __cplusplus +} +#endif diff --git a/vendor/whereami/whereami.h b/vendor/whereami/whereami.h new file mode 100644 index 0000000..6c81af8 --- /dev/null +++ b/vendor/whereami/whereami.h @@ -0,0 +1,65 @@ +// (‑●‑●)> released under the WTFPL v2 license, by Gregory Pakosz (@gpakosz) +// https://github.com/gpakosz/whereami + +#ifndef WHEREAMI_H +#define WHEREAMI_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef WAI_FUNCSPEC + #define WAI_FUNCSPEC +#endif +#ifndef WAI_PREFIX +#define WAI_PREFIX(function) wai_##function +#endif + +/** + * Returns the path to the current executable. + * + * Usage: + * - first call `int length = wai_getExecutablePath(NULL, 0, NULL);` to + * retrieve the length of the path + * - allocate the destination buffer with `path = (char*)malloc(length + 1);` + * - call `wai_getExecutablePath(path, length, NULL)` again to retrieve the + * path + * - add a terminal NUL character with `path[length] = '\0';` + * + * @param out destination buffer, optional + * @param capacity destination buffer capacity + * @param dirname_length optional recipient for the length of the dirname part + * of the path. + * + * @return the length of the executable path on success (without a terminal NUL + * character), otherwise `-1` + */ +WAI_FUNCSPEC +int WAI_PREFIX(getExecutablePath)(char* out, int capacity, int* dirname_length); + +/** + * Returns the path to the current module + * + * Usage: + * - first call `int length = wai_getModulePath(NULL, 0, NULL);` to retrieve + * the length of the path + * - allocate the destination buffer with `path = (char*)malloc(length + 1);` + * - call `wai_getModulePath(path, length, NULL)` again to retrieve the path + * - add a terminal NUL character with `path[length] = '\0';` + * + * @param out destination buffer, optional + * @param capacity destination buffer capacity + * @param dirname_length optional recipient for the length of the dirname part + * of the path. + * + * @return the length of the module path on success (without a terminal NUL + * character), otherwise `-1` + */ +WAI_FUNCSPEC +int WAI_PREFIX(getModulePath)(char* out, int capacity, int* dirname_length); + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef WHEREAMI_H