From a1097a3eea26442cbcbc1bf2ce20a46bec7bb746 Mon Sep 17 00:00:00 2001 From: lauzonhomeschool <85599144+lauzonhomeschool@users.noreply.github.com> Date: Sun, 8 Jan 2023 23:04:13 -0500 Subject: [PATCH 01/89] [sched, alarm] allow dated Event repeat --- apps/alarm/ChangeLog | 1 + apps/alarm/README.md | 1 + apps/alarm/app.js | 101 +++++++++++++++++++++++++-------------- apps/alarm/metadata.json | 2 +- apps/sched/ChangeLog | 1 + apps/sched/README.md | 4 +- apps/sched/metadata.json | 2 +- apps/sched/sched.js | 28 ++++++++++- 8 files changed, 100 insertions(+), 40 deletions(-) diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index bb8a292a0..89fb08a6f 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -38,3 +38,4 @@ 0.35: Add automatic translation of more strings 0.36: alarm widget moved out of app 0.37: add message input and dated Events +0.38: Dated event repeat option diff --git a/apps/alarm/README.md b/apps/alarm/README.md index 0298e0836..9da142dab 100644 --- a/apps/alarm/README.md +++ b/apps/alarm/README.md @@ -13,6 +13,7 @@ It uses the [`sched` library](https://github.com/espruino/BangleApps/blob/master - `Repeat` → Select when the alarm will fire. You can select a predefined option (_Once_, _Every Day_, _Workdays_ or _Weekends_ or you can configure the days freely) - `New Timer` → Configure a new timer (triggered based on amount of time elapsed in hours/minutes/seconds) - `New Event` → Configure a new event (triggered based on time and date) + - `Repeat` → Alarm can be be fired only once or repeated (every X number of _days_, _weeks_, _months_ or _years_) - `Advanced` - `Scheduler settings` → Open the [Scheduler](https://github.com/espruino/BangleApps/tree/master/apps/sched) settings page, see its [README](https://github.com/espruino/BangleApps/blob/master/apps/sched/README.md) for details - `Enable All` → Enable _all_ disabled alarms & timers diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 74007d04b..972080872 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -6,6 +6,8 @@ const firstDayOfWeek = (require("Storage").readJSON("setting.json", true) || {}) const WORKDAYS = 62 const WEEKEND = firstDayOfWeek ? 192 : 65; const EVERY_DAY = firstDayOfWeek ? 254 : 127; +const INTERVALS = ["day", "week", "month", "year"]; +const INTERVAL_LABELS = [/*LANG*/"Day", /*LANG*/"Week", /*LANG*/"Month", /*LANG*/"Year"]; const iconAlarmOn = "\0" + atob("GBiBAAAAAAAAAAYAYA4AcBx+ODn/nAP/wAf/4A/n8A/n8B/n+B/n+B/n+B/n+B/h+B/4+A/+8A//8Af/4AP/wAH/gAB+AAAAAAAAAA=="); const iconAlarmOff = "\0" + (g.theme.dark @@ -50,8 +52,9 @@ function showMainMenu() { alarms.forEach((e, index) => { var label = (e.timer ? require("time_utils").formatDuration(e.timer) - : (e.date ? `${e.date.substring(5,10)} ${require("time_utils").formatTime(e.t)}` : require("time_utils").formatTime(e.t) + (e.rp ? ` ${decodeDOW(e)}` : "")) - ) + (e.msg ? " " + e.msg : ""); + : (e.date ? `${e.date.substring(5,10)}${e.rp?"*":""} ${require("time_utils").formatTime(e.t)}` : require("time_utils").formatTime(e.t) + (e.rp ? ` ${decodeRepeat(e)}` : "")) + ) + (e.msg ? ` ${e.msg}` : ""); + menu[label] = { value: e.on ? (e.timer ? iconTimerOn : iconAlarmOn) : (e.timer ? iconTimerOff : iconAlarmOff), onchange: () => setTimeout(e.timer ? showEditTimerMenu : showEditAlarmMenu, 10, e, index) @@ -148,8 +151,8 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex, withDate) { onchange: v => alarm.on = v }, /*LANG*/"Repeat": { - value: decodeDOW(alarm), - onchange: () => setTimeout(showEditRepeatMenu, 100, alarm.rp, alarm.dow, (repeat, dow) => { + value: decodeRepeat(alarm), + onchange: () => setTimeout(showEditRepeatMenu, 100, alarm.rp, date || alarm.dow, (repeat, dow) => { alarm.rp = repeat; alarm.dow = dow; prepareAlarmForSave(alarm, alarmIndex, time, date, true); @@ -174,9 +177,7 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex, withDate) { }; if (!keyboard) delete menu[/*LANG*/"Message"]; - if (alarm.date || withDate) { - delete menu[/*LANG*/"Repeat"]; - } else { + if (!alarm.date) { delete menu[/*LANG*/"Day"]; delete menu[/*LANG*/"Month"]; delete menu[/*LANG*/"Year"]; @@ -225,49 +226,77 @@ function saveAndReload() { alarms.filter(e => e.timer === undefined).forEach(a => a.dow = handleFirstDayOfWeek(a.dow)); } -function decodeDOW(alarm) { +function decodeRepeat(alarm) { return alarm.rp - ? require("date_utils") - .dows(firstDayOfWeek, 2) - .map((day, index) => alarm.dow & (1 << (index + firstDayOfWeek)) ? day : "_") - .join("") - .toLowerCase() + ? (alarm.date + ? `${alarm.rp.num}*${INTERVAL_LABELS[INTERVALS.indexOf(alarm.rp.interval)]}` + : require("date_utils") + .dows(firstDayOfWeek, 2) + .map((day, index) => alarm.dow & (1 << (index + firstDayOfWeek)) ? day : "_") + .join("") + .toLowerCase()) : /*LANG*/"Once" } -function showEditRepeatMenu(repeat, dow, dowChangeCallback) { +function showEditRepeatMenu(repeat, day, dowChangeCallback) { var originalRepeat = repeat; - var originalDow = dow; - var isCustom = repeat && dow != WORKDAYS && dow != WEEKEND && dow != EVERY_DAY; + var dow; const menu = { "": { "title": /*LANG*/"Repeat Alarm" }, "< Back": () => dowChangeCallback(repeat, dow), - /*LANG*/"Once": { + /*LANG*/"Only Once": () => dowChangeCallback(false, EVERY_DAY) // The alarm will fire once. Internally it will be saved // as "fire every days" BUT the repeat flag is false so // we avoid messing up with the scheduler. - value: !repeat, - onchange: () => dowChangeCallback(false, EVERY_DAY) - }, - /*LANG*/"Workdays": { - value: repeat && dow == WORKDAYS, - onchange: () => dowChangeCallback(true, WORKDAYS) - }, - /*LANG*/"Weekends": { - value: repeat && dow == WEEKEND, - onchange: () => dowChangeCallback(true, WEEKEND) - }, - /*LANG*/"Every Day": { - value: repeat && dow == EVERY_DAY, - onchange: () => dowChangeCallback(true, EVERY_DAY) - }, - /*LANG*/"Custom": { - value: isCustom ? decodeDOW({ rp: true, dow: dow }) : false, - onchange: () => setTimeout(showCustomDaysMenu, 10, isCustom ? dow : EVERY_DAY, dowChangeCallback, originalRepeat, originalDow) - } }; + let restOfMenu; + if (typeof day === "number") { + dow = day; + var originalDow = dow; + var isCustom = repeat && dow != WORKDAYS && dow != WEEKEND && dow != EVERY_DAY; + + restOfMenu = { + /*LANG*/"Workdays": { + value: repeat && dow == WORKDAYS, + onchange: () => dowChangeCallback(true, WORKDAYS) + }, + /*LANG*/"Weekends": { + value: repeat && dow == WEEKEND, + onchange: () => dowChangeCallback(true, WEEKEND) + }, + /*LANG*/"Every Day": { + value: repeat && dow == EVERY_DAY, + onchange: () => dowChangeCallback(true, EVERY_DAY) + }, + /*LANG*/"Custom": { + value: isCustom ? decodeRepeat({ rp: true, dow: dow }) : false, + onchange: () => setTimeout(showCustomDaysMenu, 10, isCustom ? dow : EVERY_DAY, dowChangeCallback, originalRepeat, originalDow) + } + }; + } else { + var date = day; // eventually: detect day of date and configure a repeat e.g. 3rd Monday of Month + dow = EVERY_DAY; + repeat = repeat || {interval: "month", num: 1}; + + restOfMenu = { + /*LANG*/"Every": { + value: repeat.num, + min: 1, + onchange: v => repeat.num = v + }, + /*LANG*/"Interval": { + value: INTERVALS.indexOf(repeat.interval), + format: v => INTERVAL_LABELS[v], + min: 0, + max: INTERVALS.length - 1, + onchange: v => repeat.interval = INTERVALS[v] + } + }; + } + + Object.assign(menu, restOfMenu); E.showMenu(menu); } diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index 29e71b3d9..28d48daab 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Alarms & Timers", "shortName": "Alarms", - "version": "0.37", + "version": "0.38", "description": "Set alarms and timers on your Bangle", "icon": "app.png", "tags": "tool,alarm", diff --git a/apps/sched/ChangeLog b/apps/sched/ChangeLog index 634250d48..92b04fb32 100644 --- a/apps/sched/ChangeLog +++ b/apps/sched/ChangeLog @@ -22,3 +22,4 @@ 0.19: Update clock_info to refresh periodically on active alarms/timers 0.20: Alarm dismiss and snooze events 0.21: Fix crash in clock_info +0.22: Dated event repeat option diff --git a/apps/sched/README.md b/apps/sched/README.md index c874b5577..2fb201cee 100644 --- a/apps/sched/README.md +++ b/apps/sched/README.md @@ -45,7 +45,9 @@ Alarms are stored in an array in `sched.json`, and take the form: // eg (new Date()).toISOString().substr(0,10) msg : "Eat food", // message to display. last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day! (No change from 0 on timers) - rp : true, // repeat the alarm every day? + rp : true, // repeat the alarm every day? If date is given, pass an object instead of a boolean, + // e.g. repeat every 2 months: { interval: "month", num: 2 }. + // Supported intervals: day, week, month, year vibrate : "...", // OPTIONAL pattern of '.', '-' and ' ' to use for when buzzing out this alarm (defaults to '..' if not set) hidden : false, // OPTIONAL if false, the widget should not show an icon for this alarm as : false, // auto snooze diff --git a/apps/sched/metadata.json b/apps/sched/metadata.json index 2a1b0f8ca..98602318d 100644 --- a/apps/sched/metadata.json +++ b/apps/sched/metadata.json @@ -1,7 +1,7 @@ { "id": "sched", "name": "Scheduler", - "version": "0.21", + "version": "0.22", "description": "Scheduling library for alarms and timers", "icon": "app.png", "type": "scheduler", diff --git a/apps/sched/sched.js b/apps/sched/sched.js index f2f2644f9..57876ff69 100644 --- a/apps/sched/sched.js +++ b/apps/sched/sched.js @@ -42,7 +42,9 @@ function showAlarm(alarm) { if (del) { alarms.splice(alarmIndex, 1); } else { - if (!alarm.timer) { + if (alarm.date && alarm.rp) { + setNextRepeatDate(alarm); + } else if (!alarm.timer) { alarm.last = new Date().getDate(); } if (alarm.ot !== undefined) { @@ -78,6 +80,30 @@ function showAlarm(alarm) { }); } + function setNextRepeatDate(alarm) { + let date = new Date(alarm.date); + let rp = alarm.rp; + switch(rp.interval) { + case "day": + date.setDate(date.getDate() + rp.num); + break; + case "week": + date.setDate(date.getDate() + (rp.num * 7)); + break; + case "month": + if (!alarm.od) alarm.od = date.getDate(); + date = new Date(date.getFullYear(), date.getMonth() + rp.num, alarm.od); + if (date.getDate() != alarm.od) date.setDate(0); + break; + case "year": + if (!alarm.od) alarm.od = date.getDate(); + date = new Date(date.getFullYear() + rp.num, date.getMonth(), alarm.od); + if (date.getDate() != alarm.od) date.setDate(0); + break; + } + alarm.date = date.toLocalISOString().slice(0,10); + } + if ((require("Storage").readJSON("setting.json", 1) || {}).quiet > 1) return; From 6cd3c02253a2916d6388c9ea95a883af8c8a2b71 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sat, 25 Feb 2023 18:43:59 +0100 Subject: [PATCH 02/89] fork bwclklite from bwclk --- apps/bwclklite/ChangeLog | 33 +++ apps/bwclklite/README.md | 27 +++ apps/bwclklite/app-icon.js | 1 + apps/bwclklite/app.js | 376 ++++++++++++++++++++++++++++++++ apps/bwclklite/app.png | Bin 0 -> 2116 bytes apps/bwclklite/metadata.json | 19 ++ apps/bwclklite/screenshot.png | Bin 0 -> 2841 bytes apps/bwclklite/screenshot_2.png | Bin 0 -> 3038 bytes apps/bwclklite/screenshot_3.png | Bin 0 -> 3031 bytes apps/bwclklite/settings.js | 50 +++++ 10 files changed, 506 insertions(+) create mode 100644 apps/bwclklite/ChangeLog create mode 100644 apps/bwclklite/README.md create mode 100644 apps/bwclklite/app-icon.js create mode 100644 apps/bwclklite/app.js create mode 100644 apps/bwclklite/app.png create mode 100644 apps/bwclklite/metadata.json create mode 100644 apps/bwclklite/screenshot.png create mode 100644 apps/bwclklite/screenshot_2.png create mode 100644 apps/bwclklite/screenshot_3.png create mode 100644 apps/bwclklite/settings.js diff --git a/apps/bwclklite/ChangeLog b/apps/bwclklite/ChangeLog new file mode 100644 index 000000000..06f94854e --- /dev/null +++ b/apps/bwclklite/ChangeLog @@ -0,0 +1,33 @@ +0.01: New App. +0.02: Use build in function for steps and other improvements. +0.03: Adapt colors based on the theme of the user. +0.04: Steps can be hidden now such that the time is even larger. +0.05: Included icons for information. +0.06: Design and usability improvements. +0.07: Improved positioning. +0.08: Select the color of widgets correctly. Additional settings to hide colon. +0.09: Larger font size if colon is hidden to improve readability further. +0.10: HomeAssistant integration if HomeAssistant is installed. +0.11: Performance improvements. +0.12: Implements a 2D menu. +0.13: Clicks < 24px are for widgets, if fullscreen mode is disabled. +0.14: Adds humidity to weather data. +0.15: Added option for a dynamic mode to show widgets only if unlocked. +0.16: You can now show your agenda if your calendar is synced with Gadgetbridge. +0.17: Fix - Step count was no more shown in the menu. +0.18: Set timer for an agenda entry by simply clicking in the middle of the screen. Only one timer can be set. +0.19: Fix - Compatibility with "Digital clock widget" +0.20: Better handling of async data such as getPressure. +0.21: On the default menu the week of year can be shown. +0.22: Use the new clkinfo module for the menu. +0.23: Feedback of apps after run is now optional and decided by the corresponding clkinfo. +0.24: Update clock_info to avoid a redraw +0.25: Use Bangle.setUI({remove:...}) to allow loading the launcher without a full reset on fw2v16. + ClockInfo Fix: Use .get instead of .show as .show is not implemented for weather etc. +0.26: Use clkinfo.addInteractive instead of a custom implementation +0.27: Clean out some leftovers in the remove function after switching to +clkinfo.addInteractive that would cause ReferenceError. +0.28: Option to show (1) time only and (2) week of year. +0.29: use setItem of clockInfoMenu to change the active item +0.30: Use widget_utils +0.31: Use clock_info module as an app diff --git a/apps/bwclklite/README.md b/apps/bwclklite/README.md new file mode 100644 index 000000000..882d525f6 --- /dev/null +++ b/apps/bwclklite/README.md @@ -0,0 +1,27 @@ +# BW Clock +A very minimalistic clock. + +![](screenshot.png) + +## Features +The BW clock implements features that are exposed by other apps through the `clkinfo` module. +For example, if you install the HomeAssistant app, this menu item will be shown if you first +touch the bottom of the screen and then swipe left/right to the home assistant menu. To select +sub-items simply swipe up/down. To run an action (e.g. trigger home assistant), simply select the clkinfo (border) and touch on the item again. See also the screenshot below: + +![](screenshot_3.png) + +Note: Check out the settings to change different themes. + +## Settings +- Screen: Normal (widgets shown), Dynamic (widgets shown if unlocked) or Full (widgets are hidden). +- Enable/disable lock icon in the settings. Useful if fullscreen mode is on. +- The colon (e.g. 7:35 = 735) can be hidden in the settings for an even larger time font to improve readability further. +- Your bangle uses the sys color settings so you can change the color too. + +## Thanks to +- Thanks to Gordon Williams not only for the great BangleJs, but specifically also for the implementation of `clkinfo` which simplified the BWClock a lot and moved complexety to the apps where it should be located. +- Icons created by Flaticon + +## Creator +[David Peer](https://github.com/peerdavid) diff --git a/apps/bwclklite/app-icon.js b/apps/bwclklite/app-icon.js new file mode 100644 index 000000000..1df0fa6a5 --- /dev/null +++ b/apps/bwclklite/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgIcah0EgEB/H8iFsAoOY4kMBYMDhmGgXkAoUGiWkAoQQBoAFCjgnCAoM4hgFDuEI+wpC8EKyg1C/0eAoMAsEAiQvBAAeAApQAB/4Ao+P4v/wn0P8Pgn/wnkH4Pjv/j/nn9PH//n/nj/IFF4F88AXBAoM88EcAoPHj//jlDAoOf/+Y+YFHjnnjAjBEIIjD+BHDO9IALA==")) diff --git a/apps/bwclklite/app.js b/apps/bwclklite/app.js new file mode 100644 index 000000000..770c053c2 --- /dev/null +++ b/apps/bwclklite/app.js @@ -0,0 +1,376 @@ +{ // must be inside our own scope here so that when we are unloaded everything disappears + +/************************************************ + * Includes + */ +const locale = require('locale'); +const storage = require('Storage'); +const clock_info = require("clock_info"); +const widget_utils = require("widget_utils"); + +/************************************************ + * Globals + */ +const SETTINGS_FILE = "bwclk.setting.json"; +const W = g.getWidth(); +const H = g.getHeight(); + +/************************************************ + * Settings + */ +let settings = { + screen: "Normal", + showLock: true, + hideColon: false, + menuPosX: 0, + menuPosY: 0, +}; + +let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; +for (const key in saved_settings) { + settings[key] = saved_settings[key]; +} + +let isFullscreen = function() { + var s = settings.screen.toLowerCase(); + if(s == "dynamic"){ + return Bangle.isLocked(); + } else { + return s == "full"; + } +}; + +let getLineY = function(){ + return H/5*2 + (isFullscreen() ? 0 : 8); +} + +/************************************************ + * Assets + */ +// Manrope font +Graphics.prototype.setLargeFont = function(scale) { + // Actual height 47 (48 - 2) + this.setFontCustom( + atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAD/AAAAAAAAA/wAAAAAAAAP8AAAAAAAAD/AAAAAAAAA/wAAAAAAAAP8AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAD/AAAAAAAAP/wAAAAAAAf/8AAAAAAB///AAAAAAH///wAAAAAf///8AAAAB/////AAAAH////8AAAAP////wAAAA/////AAAAB////+AAAAA////4AAAAAP///gAAAAAD//+AAAAAAA//4AAAAAAAP/gAAAAAAAD/AAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///+AAAAAB////8AAAAB/////wAAAA/////+AAAA//////wAAAf/////+AAAH//////wAAD//////+AAB/+AAAf/gAAf+AAAA/8AAH/AAAAH/AAD/gAAAA/4AA/wAAAAH+AAP8AAAAB/gAD+AAAAAf4AA/gAAAAH+AAP4AAAAA/gAD+AAAAAf4AA/wAAAAH+AAP8AAAAB/gAD/AAAAA/4AA/4AAAAP+AAH/AAAAH/AAB/4AAAH/wAAP/wAAP/4AAD//////+AAAf//////AAAD//////gAAAf/////wAAAD/////4AAAAf////4AAAAB////4AAAAAB///gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAH/AAAAAAAAD/gAAAAAAAA/4AAAAAAAAf8AAAAAAAAH+AAAAAAAAD/gAAAAAAAB/wAAAAAAAAf8AAAAAAAAP///////AAD///////wAA///////8AAP///////AAD///////wAA///////8AAP///////AAD///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAB/AAAA/gAAA/wAAA/4AAAf8AAAf+AAAP/AAAP/gAAH/wAAH/4AAD/8AAD/+AAB//AAA//gAA//wAAf/AAAP/8AAH/AAAH//AAD/gAAD//wAA/wAAB//8AAP8AAA///AAD/AAAf+fwAA/gAAP/n8AAP4AAH/x/AAD+AAD/4fwAA/gAB/8H8AAP8AAf+B/AAD/AAP/AfwAA/4AH/gH8AAH/AH/wB/AAB/8H/4AfwAAP///8AH8AAD////AB/AAAf///gAfwAAD///wAH8AAAf//4AB/AAAD//4AAfwAAAP/8AAH8AAAAf4AAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAADgAAAfwAAAB+AAAH8AAAAfwAAB/AAAAH+AAAfwAAAB/wAAH8AAAA/+AAB/AAAAP/gAAfwA4AA/8AAH8AfgAH/AAB/AP8AA/4AAfwD/gAH+AAH8B/4AB/gAB/A/8AAf4AAfwf/AAD+AAH8P/wAA/gAB/H/8AAf4AAfz//gAH+AAH8//4AB/gAB/f//AA/4AAf/+/4Af8AAH//P/AP/AAB//j////gAAf/wf///4AAH/4H///8AAB/8A///+AAAf+AH///AAAH/AA///gAAB/gAD//wAAAfwAAP/wAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAH/wAAAAAAAH/8AAAAAAAH//AAAAAAAH//wAAAAAAH//8AAAAAAH///AAAAAAH///wAAAAAH///8AAAAAP//9/AAAAAP//8fwAAAAP//4H8AAAAP//4B/AAAAP//4AfwAAAP//4AH8AAAD//4AB/AAAA//4AAfwAAAP/4AAH8AAAD/wAAB/AAAA/wAAAfwAAAPwAH////AADwAB////wAAwAAf///8AAAAAH////AAAAAB////wAAAAAf///8AAAAAH////AAAAAA////wAAAAAAAfwAAAAAAAAH8AAAAAAAAB/AAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAGAHwAAAB///gB+AAAH///8AfwAAB////AP+AAAf///wD/wAAH///+A/+AAB////gP/gAAf///4A/8AAH/8P8AH/AAB/AD+AA/4AAfwA/gAH+AAH8AfwAB/gAB/AH8AAf4AAfwB/AAH+AAH8AfwAB/gAB/AH8AAf4AAfwB/gAH+AAH8Af4AB/gAB/AH/AA/wAAfwB/4Af8AAH8AP/AP/AAB/AD////gAAfwAf///wAAH8AD///8AAB/AA///+AAAfwAH///AAAAAAA///gAAAAAAD//gAAAAAAAP/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///4AAAAAH////wAAAAH/////AAAAD/////4AAAB//////AAAA//////4AAAf//////AAAP//////4AAD/8D/w/+AAB/4B/wD/wAAf8A/wAf8AAP+AP4AD/gAD/AD+AAf4AA/wB/AAH+AAP4AfwAB/gAD+AH8AAf4AA/gB/AAH+AAP4AfwAB/gAD+AH+AAf4AA/wB/gAH+AAP8Af8AD/gAD/gH/gB/wAAf8A/8A/8AAH/AP///+AAB/gB////gAAPwAP///wAAB4AD///4AAAMAAf//8AAAAAAD//+AAAAAAAP/+AAAAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAH8AAAAAAAAB/AAAAAAAAAfwAAAAAAAAH8AAAAAAAAB/AAAAABwAAfwAAAAB8AAH8AAAAD/AAB/AAAAD/wAAfwAAAH/8AAH8AAAH//AAB/AAAP//wAAfwAAP//8AAH8AAf//+AAB/AAf//8AAAfwA///8AAAH8A///4AAAB/A///4AAAAfx///wAAAAH9///wAAAAB////gAAAAAf///gAAAAAH///AAAAAAB///AAAAAAAf/+AAAAAAAH/+AAAAAAAB/8AAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAf/AAAAAP+Af/8AAAAP/4P//wAAAP//P//+AAAH//////wAAB//////8AAA///////gAAf//////8AAH////gP/AAD/wf/wA/wAA/4D/4AP+AAP8Af8AB/gAD/AH/AAf4AA/gA/wAH+AAP4AP4AA/gAD+AD/AAP4AA/gA/wAH+AAP8Af8AB/gAD/AH/AAf4AA/4D/4AP+AAP/B//AH/AAB////4D/wAAf//////8AAD//////+AAAf//////AAAH//////wAAA//8///4AAAD/+D//8AAAAP+Af/8AAAAAAAB/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAAAAAAAB//AAAAAAAB//8AAAAAAB///gAAgAAA///8AAcAAAf///gAPAAAH///8AH4AAD////AD/AAB/+H/4B/wAAf+Af+Af8AAP+AB/wD/gAD/gAf8Af4AA/wAD/AH+AAP8AA/wB/gAD+AAH8AP4AA/gAB/AD+AAP4AAfwB/gAD+AAH8Af4AA/wAD/AH+AAP8AA/gD/gAD/gAf4A/wAAf8AP8A/8AAH/gH/Af/AAA///////gAAP//////wAAB//////8AAAP/////+AAAB//////AAAAP/////AAAAA/////gAAAAD////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wA/wAAAAAP8AP8AAAAAD/AD/AAAAAA/wA/wAAAAAP8AP8AAAAAD/AD/AAAAAA/wA/wAAAAAP8AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=='), + 46, + atob("ExspGyUkJiQnISYnFQ=="), + 62+(scale<<8)+(1<<16) + ); + return this; +}; + +Graphics.prototype.setMediumFont = function(scale) { + // Actual height 41 (42 - 2) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAB/AAAAAAAP/AAAAAAD//AAAAAA///AAAAAP///AAAAB///8AAAAf///AAAAH///wAAAB///+AAAAH///gAAAAH//4AAAAAH/+AAAAAAH/wAAAAAAH8AAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAH////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gAAH+AAD+AAAD/AAH8AAAB/AAH4AAAA/gAH4AAAAfgAH4AAAAfgAPwAAAAfgAPwAAAAfgAPwAAAAfgAHwAAAAfgAH4AAAAfgAH4AAAA/gAH8AAAA/AAD+AAAD/AAD/gAAH/AAB/////+AAB/////8AAA/////4AAAf////wAAAH////gAAAB///+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAfwAAAAAAA/gAAAAAAA/AAAAAAAB/AAAAAAAD+AAAAAAAD8AAAAAAAH8AAAAAAAH//////AAH//////AAH//////AAH//////AAH//////AAH//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAA/AAAP4AAB/AAAf4AAD/AAA/4AAD/AAB/4AAH/AAD/4AAP/AAH/AAAf/AAH8AAA//AAH4AAB//AAP4AAD//AAPwAAH+/AAPwAAP8/AAPwAAf4/AAPwAA/4/AAPwAA/w/AAPwAB/g/AAPwAD/A/AAP4AH+A/AAH8AP8A/AAH/A/4A/AAD///wA/AAD///gA/AAB///AA/AAA//+AA/AAAP/8AA/AAAD/wAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAH4AAAHwAAH4AAAH4AAH4AAAH8AAH4AAAP+AAH4AAAH+AAH4A4AB/AAH4A+AA/AAH4B/AA/gAH4D/AAfgAH4H+AAfgAH4P+AAfgAH4f+AAfgAH4/+AAfgAH5/+AAfgAH5//AAfgAH7+/AA/gAH/8/gB/AAH/4f4H/AAH/wf//+AAH/gP//8AAH/AH//8AAH+AD//wAAH8AB//gAAD4AAf+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAD/AAAAAAAP/AAAAAAB//AAAAAAH//AAAAAAf//AAAAAB///AAAAAH///AAAAAf/8/AAAAB//w/AAAAH/+A/AAAA//4A/AAAD//gA/AAAH/+AA/AAAH/4AA/AAAH/gAA/AAAH+AAA/AAAHwAAA/AAAHAAf///AAEAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAP/AHgAAH///AP4AAH///gP8AAH///gP8AAH///gP+AAH///gD/AAH/A/AB/AAH4A/AA/gAH4A+AAfgAH4B+AAfgAH4B+AAfgAH4B8AAfgAH4B8AAfgAH4B+AAfgAH4B+AAfgAH4B+AA/gAH4B/AA/AAH4A/gD/AAH4A/4H+AAH4Af//+AAH4AP//8AAH4AP//4AAHwAD//wAAAAAB//AAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAD////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gP4H+AAD/AfgD/AAH8A/AB/AAH8A/AA/gAH4B+AAfgAH4B+AAfgAPwB8AAfgAPwB8AAfgAPwB+AAfgAPwB+AAfgAH4B+AAfgAH4B/AA/gAH8B/AB/AAH+A/wD/AAD+A/8P+AAB8Af//+AAB4AP//8AAAwAH//4AAAAAD//gAAAAAA//AAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAHAAPwAAAA/AAPwAAAD/AAPwAAAf/AAPwAAB//AAPwAAP//AAPwAA//8AAPwAH//wAAPwAf/+AAAPwB//4AAAPwP//AAAAPw//8AAAAP3//gAAAAP//+AAAAAP//wAAAAAP//AAAAAAP/4AAAAAAP/gAAAAAAP+AAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAH+A//gAAAf/h//4AAA//z//8AAB/////+AAD/////+AAD///+H/AAH+H/4B/AAH8B/wA/gAH4A/gAfgAH4A/gAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAH4A/gAfgAH4A/gAfgAH8B/wA/gAH/H/4B/AAD///+H/AAD/////+AAB/////+AAA//z//8AAAf/h//4AAAH+A//gAAAAAAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAD/8AAAAAAP/+AAAAAAf//AAcAAA///gA8AAB///wB+AAD/x/4B/AAD+AP4B/AAH8AH8A/gAH4AH8A/gAH4AD8AfgAP4AD8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAH4AD8AfgAH4AD4A/gAH8AH4B/AAD+APwD/AAD/g/wP+AAB/////+AAA/////8AAAf////4AAAP////wAAAH////AAAAA///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DxcjFyAfISAiHCAiEg=="), 54+(scale<<8)+(1<<16)); + return this; +}; + +Graphics.prototype.setSmallFont = function(scale) { + // Actual height 28 (27 - 0) + this.setFontCustom( + atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/+cB//5wH//nAAAAAAAAAAAAAAAAAAAB8AAAHwAAAfAAAAAAAAAAAAAfAAAB8AAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAQcAADhwAAOHBAA4c8ADh/wAP/+AB/+AA//wAH+HAAe4cMBDh/wAOP/AA//wAP/wAH/3AAf4cABzhwAAOHAAA4cAADgAAAOAAAAAAAAAAAAAAAAAAAAwAH8HwA/4PgD/geAePA8BwcBw/BwH78DgfvwOB+HA4HAeBwcA8HDgB4f+ADg/wAGB+AAAAAAAAAAAAAAAH4AAA/wBwHngPAcOB4Bw4PAHDh4AcOPAA/x4AD/PAADx4AAAPAAAB5wAAPPwAB5/gAPOPAB4wcAPDBwB4MHAPA4cA4B/gBAH8AAAHAAAAAAAAAAAAAPAAHD/AB/f+AP/x4B4+DwHB4HAcDwcBwHhwHAPHAcAccB4A5wDgB+AGA/4AAH/AAAf+AAAA8AAABgAAAAAfAAAB8AAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AD//+A/+/+H4AD98AAB3gAADIAAAAAAAAAAAAAIAAABwAAAXwAAHPwAB8P8D/gP//4AH/8AAAAAAAAAAAAAAAAAAAAAAAAHAAAAcwAAA/gAAb8AAB/gAAH+AAAD+AAAOwAABxAAADAAAAAAAAAAAAAADAAAAMAAAAwAAADAAAAMAAAAwAAB//AAH/8AAAwAAADAAAAMAAAAwAAADAAAAMAAAAAAAAAAAAAABwAAAHIAAAfgAAB8AAAAAAAAAAAAAAAAAAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAAAAAAAAAAAAAAAAAAAABwAAAHAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAA/wAA//AA//AA//AAH/AAAfAAABAAAAAAAAAAAAAAAAAAAf/wAH//wA///gDgAOAcAAcBwABwHAAHAcAAcBwABwHgAPAPAB4Af//AA//4AA/+AAAAAAAAAAAAAAAAMAAABwAAAOAAAB4AAAH///Af//8B///wAAAAAAAAAAAAAAAAAAAAwAcAPADwB8AfAPAB8B4APwHAB/AcAPcBwB5wHAPHAcB4cA8PBwD/4HAH/AcAHwBwAAAAAAAAAAAAGAHAAcAcAB4BwYDwHDwHAceAcBz4BwHfgHAf3AcB+eDwHw/+AeB/wBwD+AAAAAAAAAAAAAAAAABwAAAfAAAP8AAD/wAA/nAAP4cAD+BwAfgHAB4AcAEA//AAD/8AAP/wAABwAAAHAAAAMAAAAAAAAAAAAAEAH/w4Af/D4B/8HgHDgPAcOAcBw4BwHDgHAcOAcBw8DwHB4eAcH/wBgP+AAAPwAAAAAAAAAAAAAAAB//AAf//AD//+AOHB4Bw4BwHDgHAcOAcBw4BwHDgHAcPA8A4eHgDh/8AEB/gAAD4AAAAAAAAAABwAAAHAAAAcAAMBwADwHAB/AcA/4BwP8AHH/AAd/gAB/wAAH8AAAeAAAAAAAAAAAAAAAEAAPD+AB/f8AP//4B4+DwHDwHAcHAcBwcBwHBwHAcPAcB/+DgD//+AH5/wACB8AAAAAAAAAAAAAAAAEAAAD+AAAf+DAD74OAODw8BwHBwHAOHAcA4cBwDBwHAcHAeBw8A+ePgB//8AD//gAB/wAAAAAAAAAAAAAAAAAAAAAHBwAAcHAABwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AcgDgB+AOAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAeAAAD8AAAf4AADzwAAeHgADwPAAGAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACAAOAcAA8DgAB4cAABzgAAD8AAAHgAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAHgAAA+AAAHgAAAcAAABwD5wHAfnAcD8cBweAAHzwAAP+AAAfwAAAcAAAAAAAAAAAAAAAAAAB/AAA//AAH/+AA8A8AHAA4A4ABwDg+HAcH8OBw444GDBhgYMGGBgwYYHDjjgcP8OBw/44DgDhAOAGAAeAYAA+HgAB/8AAB/gAAAAAAAAAAAAABAAAA8AAAfwAAP/AAH/gAD/4AB/zgAf4OAB8A4AHwDgAf4OAA/84AAP/gAAH/AAAD/gAAB/AAAA8AAAAQAAAAAAAAAB///wH///Af//8BwOBwHA4HAcDgcBwOBwHA4HAcDgcBweBwHj4HAP/58Afz/gAcH8AAAPAAAAAAAH/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAOAA4A8AHgB8B8ADwHgADAYAAAAAAAAAAAAAAAH///Af//8B///wHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAeAA8A8AHgB8B+AD//gAH/8AAD/AAAAAAAAAAAAAAAAf//8B///wH///AcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHAAHAcAAcAAAAAAAAAAAAAAB///wH///Af//8BwOAAHA4AAcDgABwOAAHA4AAcDgABwOAAHAAAAcAAAAAAAAAP/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwGBwHgYPAOBg4A+GPgB4f8ADh/gAAH4AAAAAAAAAAAAAAAH///Af//8B///wAA4AAADgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAOAAAA4AAf//8B///wH///AAAAAAAAAAAAAAAAAAAB///wH///Af//8AAAAAAAAAAAABgAAAHgAAAeAAAA8AAABwAAAHAAAAcAAABwH///Af//4B///AAAAAAAAAAAAAAAAAAAAf//8B///wH///AAHgAAA/AAAH+AAA88AAHh8AA8D4AHgDwA8AHgHgAPAYAAcBAAAwAAABAAAAAAAAAAH///Af//8B///wAAAHAAAAcAAABwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAAAAAAAAAAAAH///Af//8B///wB/AAAB/AAAA/AAAA/gAAA/gAAA/gAAA/AAAD8AAA/AAAfwAAH8AAB/AAAfgAAP4AAB///wH///Af//8AAAAAAAAAAAAAAAAAAAH///Af//8B///wD8AAAD4AAAH4AAAHwAAAPwAAAPgAAAPgAAAfAAAAfAAAA/Af//8B///wH///AAAAAAAAAAAH/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAOAA4A8AHgB+D8AD//gAH/8AAD+AAAAAAAAAAAH///Af//8B///wHAOAAcA4ABwDgAHAOAAcA4ABwDgAHAeAAeBwAA+fAAD/4AAD/AAADgAAAAAAAAf8AAH/8AB//8AHgDwA8AHgHgAPAcAAcBwABwHAAHAcAAcBwABwHAAnAcAHcA4AfgDwA+AH4P4AP//wAf/3AAP4AAAAAAAAAAAf//8B///wH///AcA4ABwDgAHAOAAcA4ABwDgAHAOAAcB+AB4H+AD59/AP/h8AP8BwAOABAAAAAAAAAAAAAwAD4HwA/4fAD/geAePA8BwcBwHBwHAcDgcBwOBwHA4HAcDgcA4HDwD4eeAHw/4AOD/AAIDwAAAAABwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAH///Af//8B///wHAAAAcAAABwAAAHAAAAcAAABwAAAGAAAAAAAAAAAAAH//wAf//gB///AAAAeAAAA8AAABwAAAHAAAAcAAABwAAAHAAAAcAAADgAAAeAf//wB//+AH//gAAAAAAAAAAGAAAAfAAAB/gAAB/wAAA/4AAAf8AAAP/AAAH8AAADwAAA/AAAf8AAP+AAP/AAH/gAB/wAAH4AAAcAAABAAAAHwAAAf4AAA/+AAAP/gAAH/wAAB/wAAA/AAAf8AAf/AAP/gAP/gAB/gAAH4AAAf+AAAf/AAAH/wAAB/8AAAfwAAB/AAB/8AA/+AA/+AAf+AAB/AAAHAAAAAAAAAAAAQGAADAeAA8B8AHwD8B+AD4PgAH74AAH/AAAPwAAA/gAAP/gAD8fAAfA/AH4A+AeAA8BwABwEAABAQAAABwAAAHwAAAPwAAAfwAAAfgAAAfgAAAf/wAB//AAf/8AH8AAA/AAAPwAAB8AAAHAAAAQAAAAAAAAAAABAcAAcBwADwHAA/AcAP8BwD/wHAfnAcH4cBx+BwHPwHAf8AcB/ABwH4AHAeAAcBgABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////////gAAAOAAAA4AAADAAAAAAAAAAAAAAAAAAAAAAAeAAAB/gAAH/4AAB/+AAAf/gAAH/AAAB8AAAAQAAAAAAAAAAAAAAOAAAA4AAADgAAAP/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADgAAAcAAADgAAAcAAADgAAAcAAAB4AAADwAAADgAAAHAAAAOAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAADj+AAef8AD5xwAOGHAA44MADjgwAOOHAA44YADjDgAH/8AAf/8AAf/wAAAAAAAAAAAAAAAAAAAf//8B///wH//+AAcA4ADgBwAOAHAA4AcADgBwAOAHAA8A8AB8PgAD/8AAH/gAAH4AAAAAAAAAAAAH4AAB/4AAP/wAB4HgAPAPAA4AcADgBwAOAHAA4AcADgBwAPAPAAeB4AA4HAABgYAAAAAAAAAAAAfgAAH/gAB//gAHgeAA8A8ADgBwAOAHAA4AcADgBwAOAHAAcA4B///wH///Af//8AAAAAAAAAAAAAAAAH4AAB/4AAP/wAB7HgAPMPAA4wcADjBwAOMHAA4wcADjBwAPMPAAfx4AA/HAAB8YAAAwAAAAAAAAAAAAwAAADAAAB///AP//8B///wHMAAAYwAABjAAAGMAAAAAAAAAPwAAD/wMA//w4DwPHgeAePBwA4cHADhwcAOHBwA4cHADhwOAcPB///4H///Af//wAAAAAAAAAAAAAAAAAAB///wH///AAf/8ABwAAAOAAAA4AAADgAAAOAAAA4AAADwAAAH//AAP/8AAf/wAAAAAAAAAAAAAAAAAAAc//8Bz//wHP//AAAAAAAAAAAAAAHAAAAcAAAH+f///5///7H//8AAAAAAAAAAAAAAH///Af//8B///wAAPAAAB+AAAP8AAB54AAfDwAD4HgAOAPAAwAcACAAwAAAAAAAAAB///wH///Af//8AAAAAAAAAAAAAAAAAAAAP//AA//8AB//wAHAAAA4AAADgAAAOAAAA4AAAD4AAAH//AAP/8AB//wAHAAAA4AAADgAAAOAAAA4AAADwAAAH//AAP/8AAf/wAAAAAAAAAAAAAAAP//AA//8AB//wAHAAAA4AAADgAAAOAAAA4AAADgAAAPAAAAf/8AA//wAB//AAAAAAAAAAAAAAAAB+AAAf+AAD/8AAeB4ADwDwAOAHAA4AcADgBwAOAHAA4AcADwDwAHw+AAP/wAAf+AAAfgAAAAAAAAAAAAAAAB///8H///wP///A4BwAHADgAcAOABwA4AHADgAcAOAB4B4AD4fAAH/4AAP/AAAPwAAAAAAAAAAAAPwAAD/wAA//wADwPAAeAeABwA4AHADgAcAOABwA4AHADgAOAcAB///8H///wf///AAAAAAAAAAAAAAAAAAAD//wAP//AAf/8ABwAAAOAAAA4AAADgAAAOAAAAAAAAAYGAAD4cAAfx4AD3DwAOOHAA44cADjhwAOGHAA4ccADxzwAHj+AAOP4AAYOAAAAAAAwAAADAAAAMAAAP//wA///gD///AAwAcADABwAMAHAAwAcADAAwAAAAAAAAAAD/gAAP/4AA//4AAA/gAAAPAAAAcAAABwAAAHAAAAcAAABwAAAOAA//8AD//wAP//AAAAAAAAAAAIAAAA4AAAD8AAAH+AAAH/AAAD/gAAB/AAAB8AAA/wAAf8AAP+AAD/AAAPgAAAwAAAAAAAAIAAAA8AAAD/AAAH/gAAD/wAAA/wAAA/AAAf8AAP+AAP+AAA/AAAD+AAAH/AAAD/gAAA/wAAA/AAAf8AAP/AAP/AAA/gAADgAAAAAAAAAAEADAAwAOAHAA+B8AB8PgAB74AAD/AAAH4AAA/wAAHvgAB8PgAPgfAA4AcADAAwAAABABAAAAHAAAAfgAAA/wAAA/wAwAf4fAAP/8AAP/AAB/gAA/wAAf4AAP+AAB/AAAHgAAAQAAAAAAEADAAwAOAPAA4B8ADgPwAOD/AA4ecADnxwAO8HAA/gcAD8BwAPAHAA4AcACAAwAAAAAAAAAAAAAAAAAAAAAAAAAA8AB////f//////n/+AAAA4AAADgAAAAAAAAAAAAAAAAAH///Af//8B///wAAAAAAAAAAAAAAAAAAA4AAADgAAAOAAAA//5/9////z////AAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAB8AAAHwAAAcAAABwAAAHgAAAOAAAA8AAABwAAAHAAAB8AAAHwAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAGAAABwAAAOAAABwAAAHAAAAcAAAA4AAABwAAABgAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAOAB4B4ADwPAAHh4AAPPAAAf4AAA/AAAB4AAAPwAAB/gAAPPAAB4eAAPA8AB4B4AHADgAIAEAAAAAAADAAAAMAAAAwAAADAAAAMAAAAwAAHDDgA8MPADww8AGDBgAAMAAAAwAAADAAAAMAAAAwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADn//gOf/+A5//4AAAAAAAAAAAAAAAAAAAD/AAA//AAH/+AA+B8ADgBwAOAHAHwAPgfAA+B8AD4A4AcADwDwAHgeAAOBwAAQCAAAAAAAAAAAADgcAAOBwAA4HAD//8A///wD///AeDgcBwOBwHA4HAcDgcB4GBwD4AHAHgAcAOAAAAAAAAAAAAAMAGAB7+8AD//gAHx8AAcBwADgDgAOAOAA4A4ADgDgAOAOAA4A4ABwHAAHg8AA//4AH//wAMOGAAAAAAQAAABwAAAHwMYAPwxgAfjGAAfsYAAf7gAAf/wAB//AAf/8AH7GAA/MYAPwxgB8DGAHAAAAQAAAAAAAAAAAAAf/D/5/8P/n/w/+AAAAAAAAAAAAAAAAAAAABwAAffhwD//Hgf+cfBzwwcGHDhwYcOHBxw4cHDhxwfOPvA8//4Bx//AADwwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAP/wAB//gAPAPAB4AOAPDw8A4/xwHH/jgc4HOBzgc4HMAzgcwDOBzgc4HPDjgOcOeA4whwBwAOAHwD4APw/AAf/4AAf+AAAPAAAAAAAATgAAD/AAANsAAA2wAADTAAAP8AAAfwAAAAAAAAAAAAAAAAAAgAAAPAAAB+AAAOeAADw8AAOIwAADxAAAfgAADngAA8PAADgMAAEAQAAAAAAAAAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAAB+AAAH4AAAAAAAAAAAAAAAAAAAAD8AAA/8AAHh4AAYDgAD/3AAN/MAA0QwADRjAAN/MAA7hwABwOAADhwAAH+AAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAD/AAAeeAABw4AAGDgAAYOAABw4AAH/AAAP8AAAfAAAAAAAAAAAAAAAAAAAwYAADBgAAMGAAAwYAADBgAAMGAAP+YAA/5gAD/mAAAwYAADBgAAMGAAAwYAADBgAAAAAAAAAAAAAAAMDAABwcAAPDwAAwPAADB8AAMOwAA5zAAB+MAADwwAAAAAAAAAAAIBAAAwGAADMcAANwwAA/DAAD8MAAO/wAAx+AAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///B///8H//AAAAeAAAA4AAADgAAAOAAAA4AAADgAAAcAB//gAH//gAf/+AAAAAAAAAAAAAAAAAAAAP4AAB/4AAP/gAB//AAH/8AAf/wAB//AAH///8f///x////AAAAAAAAAB////H///8f///wAAAAAAAAAAAAAAABAAAAOAAAB4AAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAzAAAPMAAA/wAAAeAAAAAAAAAAAAAAAAAAAIAAABgAAAMAAAA//AAD/8AAAAAAAAAAAAAAAAAAAAAA8AAAP4AAAwwAADDAAAMMAAA5wAAB+AAADwAAAAAAAAAAAAAAAAAMAwAA8HAAB44AAD/AAAD4AADGMAAOBwAAeOAAA/wAAA+AAABgAAAAAAAAAAAAAAABAAAAMAAABwAAAH/8CAf/wcAAAHgAAA8AAAHgAAB4AAAPAAAB4AAAeAAADwAAA+AAAHgCAA8A8APAfwB4H7AHB+MAAHAwAAQ/wAAD/AAAAwAAADAAAAAAAAAAAAAAAAAAAAEAAAAwAAAHAAAAf/wIB//BwAAAeAAADwAAAeAAAHgAAA8AAAHgAAB4AAAPAAAD4AAAeAAADwAAA8GAwHg4HAcHA8AAYHwABg7AAGHMAAf4wAA/DAAA4MAAAAAAAAAAYBgABgHAAGMOAAZwYABvBgAH8OCAe/wcBx+HgABg8AAAHgAAB4AAAPAAAB4AAAeAAADwAAA+AAAHgHAA8B8APAfwB4HzADB8MAAHAwAAQ/wAAD/AAAAwAAAAAAAAAAAAAAAAAA4AAAP4AAB/wAAPHgABwOA4/A4Dn4DgOfAOAAAA4AAAHgAAB8AAAHgAAAYAAAAAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAAAAAABwAAA/AAAf8AAP/AAH/wfD/nD+/wcMb4BwxvgHD+/wcHx/5wEAf/AAAP+AAAH/AAAD8AAABwAAAAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAcAOABwA4AHADgAf//8B///wHA4HAcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHAAHAYAAMAAAAAAAAAAA/4AAP/4AD//4APAHgB4APAPAAeA4AA4DgADg+AAPz4AA//gAD/+AAOe4AA4BwAHAHgA8APgPgAeA8AAYDAAAAAAAAAAAAAAAAf//8B///wH///AcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHAAHAcAAcAAAAAAAAAAAAAAB///wH///Af//8BwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHA4HAcAAcBwABwAAAAAAAAAAAAAAH///Af//8B///wHA4HAcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwABwHAAHAAAAAAAAAAAAAAAf//8B///wH///AcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHAAHAcAAcAAAAAAAAAAAAAAB///wH///Af//8AAAAAAAAAAAAAAAAAAAH///Af//8B///wAAAAAAAAAAAAAAAAAAAf//8B///wH///AAAAAAAAAAAAAAAAAAAB///wH///Af//8AAAAAAAAAAABgAAAGAAH///Af//8B///wHAYHAcBgcBwGBwHAYHAcBgcBwABwHAAHAeAA8A8AHgB+D8AD//gAH/8AAD+AAAAAAAAAAAAAAAAf//8B///wH///APwAAAPgAAAfgAAAfAAAA/AAAA+AAAA+AAAB8AAAB8AAAD8B///wH///Af//8AAAAAAAAAAAf8AAH/8AB//8AHgDwA8AHgHgAPAcAAcBwABwHAAHAcAAcBwABwHAAHAcAAcA4ADgDwAeAH4PwAP/+AAf/wAAP4AAAAAAAH/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAOAA4A8AHgB+D8AD//gAH/8AAD+AAAAAAAB/wAAf/wAH//wAeAPADwAeAeAA8BwABwHAAHAcAAcBwABwHAAHAcAAcBwABwDgAOAPAB4Afg/AA//4AB//AAA/gAAAAAAAf8AAH/8AB//8AHgDwA8AHgHgAPAcAAcBwABwHAAHAcAAcBwABwHAAHAcAAcA4ADgDwAeAH4PwAP/+AAf/wAAP4AAAAAAAH/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAOAA4A8AHgB+D8AD//gAH/8AAD+AAAAAAAAAAAAGDgAA8eAAB7wAAD+AAAHwAAAfAAAD+AAAe8AADw4AAGBAAAAAAAAAAAAAAAAAf8MAH//4B///AHgD4A8AfgHgD/AcAecBwDxwHAeHAcDwcBw+BwHHgHAc8AcA/gDgD8AeAH4PwA//+AH//wAMP4AAAAAAAAAAAf//AB//+AH//8AAAB4AAADwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAOAAAB4B///AH//4Af/+AAAAAAAAAAAAAAAAAAAAH//wAf//gB///AAAAeAAAA8AAABwAAAHAAAAcAAABwAAAHAAAAcAAADgAAAeAf//wB//+AH//gAAAAAAAAAAAAAAAAAAAB//8AH//4Af//wAAAHgAAAPAAAAcAAABwAAAHAAAAcAAABwAAAHAAAA4AAAHgH//8Af//gB//4AAAAAAAAAAAAAAAAAAAAf//AB//+AH//8AAAB4AAADwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAOAAAB4B///AH//4Af/+AAAAAAAAAAAQAAABwAAAHwAAAPwAAAfwAAAfgAAAfgAAAf/wAB//AAf/8AH8AAA/AAAPwAAB8AAAHAAAAQAAAAAAAAAAAAAf//8B///wH///ABwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHg8AAP/gAAf8AAA/gAAAAAAAAAAAAAAAA///AP//8A///wHgAAAcAAcBwABwHBwHAcHAcB4+BwD/4PAH954APn/gAAP8AAAOAAAAAAAAAAAAAD4AAcfwADz/gAfOOCBww4PHHBg+ccGAZxw4AHHDAAcYcAA//gAD//gAD/+AAAAAAAAAAAAAAAAAPgABx/AAPP+AB844AHDDgAccGAZxwYPnHDg8ccMDBxhwAD/+AAP/+AAP/4AAAAAAAAAAAAAAAAA+AAHH8AA8/4BnzjgOcMOBxxwYOHHBg4ccOBxxwwDnGHAGP/4AA//4AA//gAAAAAAAAAAAAAAAAHwAA4/gAHn/A8+ccDzhhwMOODA444MBjjhwHOOGAM4w4Dx//AOH//AAH/8AAAAAAAAAAAAAAAAAfAADj+AAef8Bz5xwHOGHAc44MADjgwAOOHAY44YBzjDgHH/8AAf/8AAf/wAAAAAAAAAAAAAAAAAfAADj+AAef8AD5xweOGHD844MMzjgwzOOHD844YHjjDgAH/8AAf/8AAf/wAAAAAAAAAAAAAAAAHwAAx/gAHn/AAc4cADjhwAOMDAA4wcADjBwAOMHAA4w4AB//AAH/4AAP/wAB/fgAPMPAA4wcADjBwAOMHAA4wcADjBwAPMPAAfx4AA/HAAB8YAAAAAAAAAAAA/AAAP/AAB/+AAPA8AB4B4AHADgwcAPzBwA/8HADngcAOMB4B4ADwPAAHA4AAMDAAAAAAAAAAAAA/AAAP/AAB/+AAPY8AB5h4OHGDg+cYOB5xg4AnGDgAcYOAB5h4AD+PAAH44AAPjAAAGAAAAAAAAAAAAAPwAAD/wAAf/gAD2PAAeYeABxg4AHGDgOcYOD5xg4OHGDggeYeAA/jwAB+OAAD4wAABgAAAAAAAAAAAAD8AAA/8AAH/4AY9jwDnmHgecYODhxg4OHGDg8cYOB5xg4BnmHgCP48AAfjgAA+MAAAYAAAAAAAAAAAAB+AAAf+AAD/8Acex4BzzDwHOMHAA4wcADjBwAOMHAc4wcBzzDwGH8eAAPxwAAfGAAAMAAAAAAAAAAAOAAAA+f/+A5//4An//gAAAAAAAAAAAAAAAAAAAJ//4Dn//g+f/+DgAAAAAAAAMAAABwAAAOP//Aw//8Dj//wHAAAAMAAABwAAAHAAAAA//8AD//wAP//AcAAABwAAAAAAAAAA/gAAP/AAB//AAPA8AA4A4DDgDgPMAOA/wA4D7ADgPOAOB+8B4C/+/AA//4AB//AAAHAAAAAAAAAAAAP//AA//8Bx//wPHAAAw4AADjgAAGOAAAc4AAAzgAAPPAAA4f/8AA//wAB//AAAAAAAAAAAAAAAAA/AAAP/AAB/+AAPA8CB4B4OHADg+cAOA5wA4AHADgAcAOAB4B4AD4fAAH/4AAP/AAAPwAAAAAAAAAAAAPwAAD/wAAf/gADwPAAeAeABwA4AnADgecAOD5wA4OHADgAeAeAA+HwAB/+AAD/wAAD8AAAAAAAAAAAAD8AAA/8AAH/4AY8DwDngHgecAODhwA4OHADg8cAOB5wA4BngHgCPh8AAf/gAA/8AAA/AAAAAAAAAAAAB+AAAf+AAD/8AceB4DzwDwMOAHA44AcBjgBwHOAHAM4AcDzwDwOHw+AAP/wAAf+AAAfgAAAAAAAAAAAAfgAAH/gAA//AHHgeAc8A8BzgBwAOAHAA4AcADgBwHOAHAc8A8Bh8PgAD/8AAH/gAAH4AAAAAAAAAAAAMAAAAwAAADAAAAMAAAAwAAADAAADtwAAO3AAA7cAAAMAAAAwAAADAAAAMAAAAAAAAAAAAAH5gAB//AAP/4AB4PgAPB/AA4PcADh5wAOPHAA54cADvBwAP4PAAfD4AB//AAP/4AAZ+AAAAAAAAAAAAf8AAB//AAH//AAAH8AAAB4OAADg+AAOB4AA4AgADgAAAOAAABwAH//gAf/+AB//4AAAAAAAAAAAAAAAH/AAAf/wAB//wAAB/AAAAeAAAA4BgADgeAAOD4AA4MAADgAAAcAB//4AH//gAf/+AAAAAAAAAAAAAAAB/wAAH/8AAf/8AYAfwDgAHgcAAODgAA4OAADg8AAOB4AA4BgAHACf/+AB//4AH//gAAAAAAAAAAAAAAA/4AAD/+AAP/+AcAP4BwADwHAAHAAAAcAAABwAAAHAcAAcBwADgGP//AA//8AD//wAAAAAAAAAABAAAAHAAAAfgAAA/wAAA/wAAAf4cAAP/zgAP/+AB/jgA/wAAf4AAP+AAB/AAAHgAAAQAAAAAAAAAAAA//////////////A4BwAHADgAcAOABwA4AHADgAcAOAB4B4AD4fAAH/4AAP/AAAPwAAAAAABAAAAHAAAAfgAAw/wADg/wA+Af4fAAP/8AAP/AAB/g4A/wDgf4AOP+AAB/AAAHgAAAQAAA=='), + 32, + atob("BgkMGhEZEgYMDAwQCAwICxILEBAREBEOEREJCREVEQ8ZEhEUExAOFBQHDREPGBMUERQSEhEUERsREBIMCwwTEg4QERAREQoREQcHDgcYEREREQoPDBEPFg8PDwwIDBMcCgoAAAAAAAAAAAAAACERESEAAAAAAAAAAAAAAAAhIQAGCRAQEhAIDw8XCQ8RABIODRELCw4REwcLCQoPHBscDxISEhISEhoUEBAQEAcHBwcTExQUFBQUDhQUFBQUEBEREBAQEBAQGhARERERBwcHBxAREREREREPEREREREPEQ8="), + 28+(scale<<8)+(1<<16) + ); + return this; +}; + +Graphics.prototype.setMiniFont = function(scale) { + // Actual height 16 (15 - 0) + this.setFontCustom( + atob('AAAAAAAAAAAAAP+w/5AAAAAA4ADgAOAA4AAAAAAAAAABgBmAGbAb8D+A+YDZ8B/wf4D5gJmAGQAQAAAAAAAeOD8cMwzxj/GPMYwc/Az4AAAAAHAA+DDIYMjA+YBzAAYADeA7MHMw4zDD4ADAAAAz4H/wzjDHMMMwwbBj4APgADAAAAAA4ADgAAAAAAAAAAfwH/54B+ABAAAAAOABeAcf/gfwAAAAACAAaAD4APgAOABgAAAAAAACAAIAAgA/wAMAAgACAAAAAAAAPAA4AAAAAAIAAgACAAIAAgAAAAAAADAAMAAAAAAAcAfwf4D4AIAAAAA/wH/gwDDAMMAwwDB/4D/AAAAAAGAAwAD/8P/wAAAAAHAw8HDA8MHww7DnMH4wGBAAAMBgyHDcMPww/DDv4MfAAAAAAAHgD+A+YPhgwGAH8AfwAEAAAAAA/GD8cMwwzDDMMM5wx+ABgAAAP8B/4MwwzDDMMMwwx+ADwAAAgADAAMBwwfDPgP4A8ADAAAAAe+D/8M4wxjDGMP5wf+ABwAAAfAB+cMYwwjDCMMYwf+A/wAAAAAAAAAxgBCAAAAAAAAAYPBA4AAAAAAAAAgAHAA+AHMAYYAAAAAAAAAAAAAAJAAkACQAJAAkACQAJAAkAAAAAAAAAAAAAABhgHMAPgAcAAgAAAAAAAABgAOAAwbDDsMYA/AA4AAAAAAAD4A/wGBgxzDPsMyQjJDPkM+wYIBxgD+AAAAAAABAA8A/gf8DwwODA/sAfwAHwADAAAP/w//DGMMYwxjDOMP9we+ABwA8AP8Bw4MAwwDDAMMAwwDDgcHDgMMAAAAAA//D/8MAwwDDAMMAw4HB/4D/AAAAAAP/w//DGMMYwxjDGMMQwgBAAAP/w//DDAMMAwwDDAMAADwA/wHDgwDDAMMAwwDDCMOJwc+ADwAAA//D/8AMAAwADAAMAAwD/8P/wAAAAAP/w//AAAABgAHAAMAAwAHD/4P+AAAAAAP/w//AOAB+AOcBw4MBwgDAAEAAA//D/8AAwADAAMAAwADAAAP/w//A8AA8AA+AA8AHwB8AeAHgA//D/8AAAAAD/8P/wcAAcAA8AA4AB4P/w//AAAA8AP8Bw4MAwwDDAMMAwwDDgcH/gP8AAAAAA//D/8MMAwwDDAMYA7gB8ABgADwA/wHDgwDDAMMAwwDDA8ODwf/A/8AAAAAD/8P/wwwDDAMMAx4Dv4HxwEBAAAHjg/HDMMMYwxjDGMONwc+ABwMAAwADAAMAA//D/8MAAwADAAIAAAAD/wP/gAHAAMAAwADAAMAHg/8AAAMAA+AA/AAfgAPAA8AfgPwD4AMAAwAD4AD+AA/AA8A/g/gDwAP4AH8AB8APwH8D8AMAAgBDAMPDgO8APAB8AOcDw8MAwgBCAAOAAeAAeAAfwH/B4AOAAwAAAAMAwwPDB8Mew3jD4MPAwwDAAAAAAAAB//3//QABAAAAAAADgAP4AH+AB8AAQAABAAEAAf/9//wAAAAAAAAAAGAAwAGAAwABgADAAGAAAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAQA3wHbAZMBswGzAf4A/wAAAAAP/w//AYMBgwGDAYMA/gB8AAAAEAD+Ae8BgwGDAYMBgwDGAAAAMAD+Ae8BgwGDAYMBhw//D/8AAAAYAP4B/wGTAZMBkwGTAP4AcAEAAYAP/w//CQAJAAAwAP4hz3GDMQMxAzGHcf/h/8AAAAAP/w//AYABgAGAAYAA/wB/AAAAAA3/Df8AAAAAOf/9//AAAAAP/w//ADgAfADGAYMBAQAAD/8P/wAAAAAB/wH/AYABgAGAAf8A/wGAAYABgAH/AP8AAAAAAf8B/wGAAYABgAGAAP8AfwAAADAA/gHvAYMBgwGDAYMA/gB8AAAAAAH/8f/xgwGDAYMBgwD+AHwAAAAwAP4B7wGDAYMBgwGHAf/x//AAAAAB/wH/AYABgAEAAAAA5gHzAbMBkwGbAd8AzgEAAYAP/wf/AQMBAwAAAAAB/gH/AAMAAwADAAcB/wH/AAABAAHgAPwAHwAPAH4B8AGAAQAB8AB+AA8APwHwAeAA/AAPAD8B+AHAAQEBgwHOAHwAOAD+AccBAwAAAQAB4AD4EB/wB8A/APgBwAAAAAEBgwGPAZ8B8wHjAcMBAQAAAAAABgf/9/n2AAAAAAAP/w//AAAEAAYAB/nz//AGAAAAAAAAAAAAcABgAGAAcAAwAHAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'), + 32, + atob("AwUHDwoOCwQHBwcJBAcEBgoGCQkKCQoICQoFBQoMCgkPCgoMCwkICwsECAoIDgsMCgwKCgoLCg8KCQoHBgcLCwgJCgkKCQYKCgQECAQOCgoKCgYIBwoIDAkJCAcEBwsQ"), + 16+(scale<<8)+(1<<16) + ); + return this; +}; + +let imgLock = function() { + return { + width : 16, height : 16, bpp : 1, + transparent : 0, + buffer : E.toArrayBuffer(atob("A8AH4A5wDDAYGBgYP/w//D/8Pnw+fD58Pnw//D/8P/w=")) + }; +}; + + +/************************************************ + * Clock Info + */ +let clockInfoItems = clock_info.load(); + +// Add some custom clock-infos +let weekOfYear = function() { + var date = new Date(); + date.setHours(0, 0, 0, 0); + // Thursday in current week decides the year. + date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7); + // January 4 is always in week 1. + var week1 = new Date(date.getFullYear(), 0, 4); + // Adjust to Thursday in week 1 and count number of weeks from date to week1. + return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 + - 3 + (week1.getDay() + 6) % 7) / 7); +} + +clockInfoItems[0].items.unshift({ name : "weekofyear", + get : function() { return { text : "Week " + weekOfYear(), + img : null}}, + show : function() {}, + hide : function() {}, +}) + +// Empty for large time +clockInfoItems[0].items.unshift({ name : "nop", + get : function() { return { text : null, + img : null}}, + show : function() {}, + hide : function() {}, +}) + + + +let clockInfoMenu = clock_info.addInteractive(clockInfoItems, { + app: "bwclk", + x : 0, + y: 135, + w: W, + h: H-135, + draw : (itm, info, options) => { + var hideClkInfo = info.text == null; + + g.setColor(g.theme.fg); + g.fillRect(options.x, options.y, options.x+options.w, options.y+options.h); + + g.setFontAlign(0,0); + g.setColor(g.theme.bg); + + if (options.focus){ + var y = hideClkInfo ? options.y+20 : options.y+2; + var h = hideClkInfo ? options.h-20 : options.h-2; + g.drawRect(options.x, y, options.x+options.w-2, y+h-1); // show if focused + g.drawRect(options.x+1, y+1, options.x+options.w-3, y+h-2); // show if focused + } + + // In case we hide the clkinfo, we show the time again as the time should + // be drawn larger. + if(hideClkInfo){ + drawTime(); + return; + } + + // Set text and font + var image = info.img; + var text = String(info.text); + if(text.split('\n').length > 1){ + g.setMiniFont(); + } else { + g.setSmallFont(); + } + + // Compute sizes + var strWidth = g.stringWidth(text); + var imgWidth = image == null ? 0 : 24; + var midx = options.x+options.w/2; + + // Draw + if (image) { + var scale = imgWidth / image.width; + g.drawImage(image, midx-parseInt(imgWidth*1.3/2)-parseInt(strWidth/2), options.y+6, {scale: scale}); + } + g.drawString(text, midx+parseInt(imgWidth*1.3/2), options.y+20); + + // In case we are in focus and the focus box changes (fullscreen yes/no) + // we draw the time again. Otherwise it could happen that a while line is + // not cleared correctly. + if(options.focus) drawTime(); + } +}); + + +/************************************************ + * Draw + */ +let draw = function() { + // Queue draw again + queueDraw(); + + // Draw clock + drawDate(); + drawTime(); + drawLock(); + drawWidgets(); +}; + + +let drawDate = function() { + // Draw background + var y = getLineY() + g.reset().clearRect(0,0,W,y); + + // Draw date + y = parseInt(y/2)+4; + y += isFullscreen() ? 0 : 8; + var date = new Date(); + var dateStr = date.getDate(); + dateStr = ("0" + dateStr).substr(-2); + g.setMediumFont(); // Needed to compute the width correctly + var dateW = g.stringWidth(dateStr); + + g.setSmallFont(); + var dayStr = locale.dow(date, true); + var monthStr = locale.month(date, 1); + var dayW = Math.max(g.stringWidth(dayStr), g.stringWidth(monthStr)); + var fullDateW = dateW + 10 + dayW; + + g.setFontAlign(-1,0); + g.drawString(dayStr, W/2 - fullDateW/2 + 10 + dateW, y-12); + g.drawString(monthStr, W/2 - fullDateW/2 + 10 + dateW, y+11); + + g.setMediumFont(); + g.setColor(g.theme.fg); + g.drawString(dateStr, W/2 - fullDateW / 2, y+2); +}; + + +let drawTime = function() { + var hideClkInfo = clockInfoMenu.menuA == 0 && clockInfoMenu.menuB == 0; + + // Draw background + var y1 = getLineY(); + var y = y1; + var date = new Date(); + + var hours = String(date.getHours()); + var minutes = date.getMinutes(); + minutes = minutes < 10 ? String("0") + minutes : minutes; + var colon = settings.hideColon ? "" : ":"; + var timeStr = hours + colon + minutes; + + // Set y coordinates correctly + y += parseInt((H - y)/2) + 5; + + if (hideClkInfo){ + g.setLargeFont(); + } else { + y -= 15; + g.setMediumFont(); + } + + // Clear region and draw time + g.setColor(g.theme.fg); + g.fillRect(0,y1,W,y+20 + (hideClkInfo ? 1 : 0) + (isFullscreen() ? 3 : 0)); + + g.setColor(g.theme.bg); + g.setFontAlign(0,0); + g.drawString(timeStr, W/2, y); +}; + + +let drawLock = function() { + if(settings.showLock && Bangle.isLocked()){ + g.setColor(g.theme.fg); + g.drawImage(imgLock(), W-16, 2); + } +}; + + +let drawWidgets = function() { + if(isFullscreen()){ + widget_utils.hide(); + } else { + Bangle.drawWidgets(); + } +}; + + +/************************************************ + * Listener + */ +// timeout used to update every minute +let drawTimeout; + +// schedule a draw for the next minute +let queueDraw = function() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +}; + + +// Stop updates when LCD is off, restart when on +let lcdListenerBw = function(on) { + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}; +Bangle.on('lcdPower', lcdListenerBw); + +let lockListenerBw = function(isLocked) { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + + if(!isLocked && settings.screen.toLowerCase() == "dynamic"){ + // If we have to show the widgets again, we load it from our + // cache and not through Bangle.loadWidgets as its much faster! + widget_utils.show(); + } + + draw(); +}; +Bangle.on('lock', lockListenerBw); + +let charging = function(charging){ + // Jump to battery + clockInfoMenu.setItem(0, 2); + drawTime(); +} +Bangle.on('charging', charging); + +let kill = function(){ + clockInfoMenu.remove(); + delete clockInfoMenu; +}; +E.on("kill", kill); + +/************************************************ + * Startup Clock + */ + +// The upper part is inverse i.e. light if dark and dark if light theme +// is enabled. In order to draw the widgets correctly, we invert the +// dark/light theme as well as the colors. +let themeBackup = g.theme; +g.setTheme({bg:g.theme.fg,fg:g.theme.bg, dark:!g.theme.dark}).clear(); + +// Show launcher when middle button pressed +Bangle.setUI({ + mode : "clock", + remove : function() { + // Called to unload all of the clock app + Bangle.removeListener('lcdPower', lcdListenerBw); + Bangle.removeListener('lock', lockListenerBw); + Bangle.removeListener('charging', charging); + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + // save settings + kill(); + E.removeListener("kill", kill); + g.setTheme(themeBackup); + widget_utils.show(); + } +}); + +// Load widgets and draw clock the first time +Bangle.loadWidgets(); + +// Draw first time +draw(); + +} // End of app scope diff --git a/apps/bwclklite/app.png b/apps/bwclklite/app.png new file mode 100644 index 0000000000000000000000000000000000000000..5073f0ed0ee9f9c74536e8120360af8caf25aa46 GIT binary patch literal 2116 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 bu7T|roXdI-%T9jpy1+p%KhG+6@|Ax8FvV5G literal 0 HcmV?d00001 diff --git a/apps/bwclklite/screenshot_2.png b/apps/bwclklite/screenshot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..8d2f1717f7bbebcac6557e2d6e475741f708ab67 GIT binary patch literal 3038 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 literal 0 HcmV?d00001 diff --git a/apps/bwclklite/screenshot_3.png b/apps/bwclklite/screenshot_3.png new file mode 100644 index 0000000000000000000000000000000000000000..d52057569b0c80df6656e22333f4347e7552411a GIT binary patch literal 3031 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 literal 0 HcmV?d00001 diff --git a/apps/bwclklite/settings.js b/apps/bwclklite/settings.js new file mode 100644 index 000000000..116253fda --- /dev/null +++ b/apps/bwclklite/settings.js @@ -0,0 +1,50 @@ +(function(back) { + const SETTINGS_FILE = "bwclk.setting.json"; + + // initialize with default settings... + const storage = require('Storage') + let settings = { + screen: "Normal", + showLock: true, + hideColon: false, + }; + let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; + for (const key in saved_settings) { + settings[key] = saved_settings[key] + } + + function save() { + storage.write(SETTINGS_FILE, settings) + } + + var screenOptions = ["Normal", "Dynamic", "Full"]; + E.showMenu({ + '': { 'title': 'BW Clock' }, + '< Back': back, + 'Screen': { + value: 0 | screenOptions.indexOf(settings.screen), + min: 0, max: 2, + format: v => screenOptions[v], + onchange: v => { + settings.screen = screenOptions[v]; + save(); + }, + }, + 'Show Lock': { + value: settings.showLock, + format: () => (settings.showLock ? 'Yes' : 'No'), + onchange: () => { + settings.showLock = !settings.showLock; + save(); + }, + }, + 'Hide Colon': { + value: settings.hideColon, + format: () => (settings.hideColon ? 'Yes' : 'No'), + onchange: () => { + settings.hideColon = !settings.hideColon; + save(); + }, + } + }); + }) From 09eeac356b8adbcf17ca146ea26b2d96a3616744 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sat, 25 Feb 2023 18:52:29 +0100 Subject: [PATCH 03/89] Add changes to bwclklite after forking from bwclk. Change custom font to a standard bitmap one. Don't invert theme as this doesn't work very well with fastloading. Do an initial fillRect on the clock info area since it would wait for clock info before drawing out the previous app. Change all occurences of var to let. --- apps/bwclklite/ChangeLog | 4 ++ apps/bwclklite/app.js | 133 ++++++++++++----------------------- apps/bwclklite/metadata.json | 38 ++++++++-- 3 files changed, 79 insertions(+), 96 deletions(-) diff --git a/apps/bwclklite/ChangeLog b/apps/bwclklite/ChangeLog index 06f94854e..8b79a4c4e 100644 --- a/apps/bwclklite/ChangeLog +++ b/apps/bwclklite/ChangeLog @@ -31,3 +31,7 @@ clkinfo.addInteractive that would cause ReferenceError. 0.29: use setItem of clockInfoMenu to change the active item 0.30: Use widget_utils 0.31: Use clock_info module as an app +0.32: Diverge from BW Clock. Change out the custom font for a standard bitmap + one to speed up loading times. Remove invertion of theme as this doesn't + work very well with fastloading. Do an quick inital fillRect on the + clock info area. diff --git a/apps/bwclklite/app.js b/apps/bwclklite/app.js index 770c053c2..61a3feae1 100644 --- a/apps/bwclklite/app.js +++ b/apps/bwclklite/app.js @@ -32,7 +32,7 @@ for (const key in saved_settings) { } let isFullscreen = function() { - var s = settings.screen.toLowerCase(); + let s = settings.screen.toLowerCase(); if(s == "dynamic"){ return Bangle.isLocked(); } else { @@ -42,51 +42,11 @@ let isFullscreen = function() { let getLineY = function(){ return H/5*2 + (isFullscreen() ? 0 : 8); -} +}; /************************************************ * Assets */ -// Manrope font -Graphics.prototype.setLargeFont = function(scale) { - // Actual height 47 (48 - 2) - this.setFontCustom( - atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAD/AAAAAAAAA/wAAAAAAAAP8AAAAAAAAD/AAAAAAAAA/wAAAAAAAAP8AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAD/AAAAAAAAP/wAAAAAAAf/8AAAAAAB///AAAAAAH///wAAAAAf///8AAAAB/////AAAAH////8AAAAP////wAAAA/////AAAAB////+AAAAA////4AAAAAP///gAAAAAD//+AAAAAAA//4AAAAAAAP/gAAAAAAAD/AAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///+AAAAAB////8AAAAB/////wAAAA/////+AAAA//////wAAAf/////+AAAH//////wAAD//////+AAB/+AAAf/gAAf+AAAA/8AAH/AAAAH/AAD/gAAAA/4AA/wAAAAH+AAP8AAAAB/gAD+AAAAAf4AA/gAAAAH+AAP4AAAAA/gAD+AAAAAf4AA/wAAAAH+AAP8AAAAB/gAD/AAAAA/4AA/4AAAAP+AAH/AAAAH/AAB/4AAAH/wAAP/wAAP/4AAD//////+AAAf//////AAAD//////gAAAf/////wAAAD/////4AAAAf////4AAAAB////4AAAAAB///gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAH/AAAAAAAAD/gAAAAAAAA/4AAAAAAAAf8AAAAAAAAH+AAAAAAAAD/gAAAAAAAB/wAAAAAAAAf8AAAAAAAAP///////AAD///////wAA///////8AAP///////AAD///////wAA///////8AAP///////AAD///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAB/AAAA/gAAA/wAAA/4AAAf8AAAf+AAAP/AAAP/gAAH/wAAH/4AAD/8AAD/+AAB//AAA//gAA//wAAf/AAAP/8AAH/AAAH//AAD/gAAD//wAA/wAAB//8AAP8AAA///AAD/AAAf+fwAA/gAAP/n8AAP4AAH/x/AAD+AAD/4fwAA/gAB/8H8AAP8AAf+B/AAD/AAP/AfwAA/4AH/gH8AAH/AH/wB/AAB/8H/4AfwAAP///8AH8AAD////AB/AAAf///gAfwAAD///wAH8AAAf//4AB/AAAD//4AAfwAAAP/8AAH8AAAAf4AAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAADgAAAfwAAAB+AAAH8AAAAfwAAB/AAAAH+AAAfwAAAB/wAAH8AAAA/+AAB/AAAAP/gAAfwA4AA/8AAH8AfgAH/AAB/AP8AA/4AAfwD/gAH+AAH8B/4AB/gAB/A/8AAf4AAfwf/AAD+AAH8P/wAA/gAB/H/8AAf4AAfz//gAH+AAH8//4AB/gAB/f//AA/4AAf/+/4Af8AAH//P/AP/AAB//j////gAAf/wf///4AAH/4H///8AAB/8A///+AAAf+AH///AAAH/AA///gAAB/gAD//wAAAfwAAP/wAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAH/wAAAAAAAH/8AAAAAAAH//AAAAAAAH//wAAAAAAH//8AAAAAAH///AAAAAAH///wAAAAAH///8AAAAAP//9/AAAAAP//8fwAAAAP//4H8AAAAP//4B/AAAAP//4AfwAAAP//4AH8AAAD//4AB/AAAA//4AAfwAAAP/4AAH8AAAD/wAAB/AAAA/wAAAfwAAAPwAH////AADwAB////wAAwAAf///8AAAAAH////AAAAAB////wAAAAAf///8AAAAAH////AAAAAA////wAAAAAAAfwAAAAAAAAH8AAAAAAAAB/AAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAGAHwAAAB///gB+AAAH///8AfwAAB////AP+AAAf///wD/wAAH///+A/+AAB////gP/gAAf///4A/8AAH/8P8AH/AAB/AD+AA/4AAfwA/gAH+AAH8AfwAB/gAB/AH8AAf4AAfwB/AAH+AAH8AfwAB/gAB/AH8AAf4AAfwB/gAH+AAH8Af4AB/gAB/AH/AA/wAAfwB/4Af8AAH8AP/AP/AAB/AD////gAAfwAf///wAAH8AD///8AAB/AA///+AAAfwAH///AAAAAAA///gAAAAAAD//gAAAAAAAP/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///4AAAAAH////wAAAAH/////AAAAD/////4AAAB//////AAAA//////4AAAf//////AAAP//////4AAD/8D/w/+AAB/4B/wD/wAAf8A/wAf8AAP+AP4AD/gAD/AD+AAf4AA/wB/AAH+AAP4AfwAB/gAD+AH8AAf4AA/gB/AAH+AAP4AfwAB/gAD+AH+AAf4AA/wB/gAH+AAP8Af8AD/gAD/gH/gB/wAAf8A/8A/8AAH/AP///+AAB/gB////gAAPwAP///wAAB4AD///4AAAMAAf//8AAAAAAD//+AAAAAAAP/+AAAAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAH8AAAAAAAAB/AAAAAAAAAfwAAAAAAAAH8AAAAAAAAB/AAAAABwAAfwAAAAB8AAH8AAAAD/AAB/AAAAD/wAAfwAAAH/8AAH8AAAH//AAB/AAAP//wAAfwAAP//8AAH8AAf//+AAB/AAf//8AAAfwA///8AAAH8A///4AAAB/A///4AAAAfx///wAAAAH9///wAAAAB////gAAAAAf///gAAAAAH///AAAAAAB///AAAAAAAf/+AAAAAAAH/+AAAAAAAB/8AAAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAf/AAAAAP+Af/8AAAAP/4P//wAAAP//P//+AAAH//////wAAB//////8AAA///////gAAf//////8AAH////gP/AAD/wf/wA/wAA/4D/4AP+AAP8Af8AB/gAD/AH/AAf4AA/gA/wAH+AAP4AP4AA/gAD+AD/AAP4AA/gA/wAH+AAP8Af8AB/gAD/AH/AAf4AA/4D/4AP+AAP/B//AH/AAB////4D/wAAf//////8AAD//////+AAAf//////AAAH//////wAAA//8///4AAAD/+D//8AAAAP+Af/8AAAAAAAB/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAAAAAAAB//AAAAAAAB//8AAAAAAB///gAAgAAA///8AAcAAAf///gAPAAAH///8AH4AAD////AD/AAB/+H/4B/wAAf+Af+Af8AAP+AB/wD/gAD/gAf8Af4AA/wAD/AH+AAP8AA/wB/gAD+AAH8AP4AA/gAB/AD+AAP4AAfwB/gAD+AAH8Af4AA/wAD/AH+AAP8AA/gD/gAD/gAf4A/wAAf8AP8A/8AAH/gH/Af/AAA///////gAAP//////wAAB//////8AAAP/////+AAAB//////AAAAP/////AAAAA/////gAAAAD////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wA/wAAAAAP8AP8AAAAAD/AD/AAAAAA/wA/wAAAAAP8AP8AAAAAD/AD/AAAAAA/wA/wAAAAAP8AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=='), - 46, - atob("ExspGyUkJiQnISYnFQ=="), - 62+(scale<<8)+(1<<16) - ); - return this; -}; - -Graphics.prototype.setMediumFont = function(scale) { - // Actual height 41 (42 - 2) - this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAB/AAAAAAAP/AAAAAAD//AAAAAA///AAAAAP///AAAAB///8AAAAf///AAAAH///wAAAB///+AAAAH///gAAAAH//4AAAAAH/+AAAAAAH/wAAAAAAH8AAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAH////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gAAH+AAD+AAAD/AAH8AAAB/AAH4AAAA/gAH4AAAAfgAH4AAAAfgAPwAAAAfgAPwAAAAfgAPwAAAAfgAHwAAAAfgAH4AAAAfgAH4AAAA/gAH8AAAA/AAD+AAAD/AAD/gAAH/AAB/////+AAB/////8AAA/////4AAAf////wAAAH////gAAAB///+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAfwAAAAAAA/gAAAAAAA/AAAAAAAB/AAAAAAAD+AAAAAAAD8AAAAAAAH8AAAAAAAH//////AAH//////AAH//////AAH//////AAH//////AAH//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAA/AAAP4AAB/AAAf4AAD/AAA/4AAD/AAB/4AAH/AAD/4AAP/AAH/AAAf/AAH8AAA//AAH4AAB//AAP4AAD//AAPwAAH+/AAPwAAP8/AAPwAAf4/AAPwAA/4/AAPwAA/w/AAPwAB/g/AAPwAD/A/AAP4AH+A/AAH8AP8A/AAH/A/4A/AAD///wA/AAD///gA/AAB///AA/AAA//+AA/AAAP/8AA/AAAD/wAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAH4AAAHwAAH4AAAH4AAH4AAAH8AAH4AAAP+AAH4AAAH+AAH4A4AB/AAH4A+AA/AAH4B/AA/gAH4D/AAfgAH4H+AAfgAH4P+AAfgAH4f+AAfgAH4/+AAfgAH5/+AAfgAH5//AAfgAH7+/AA/gAH/8/gB/AAH/4f4H/AAH/wf//+AAH/gP//8AAH/AH//8AAH+AD//wAAH8AB//gAAD4AAf+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAD/AAAAAAAP/AAAAAAB//AAAAAAH//AAAAAAf//AAAAAB///AAAAAH///AAAAAf/8/AAAAB//w/AAAAH/+A/AAAA//4A/AAAD//gA/AAAH/+AA/AAAH/4AA/AAAH/gAA/AAAH+AAA/AAAHwAAA/AAAHAAf///AAEAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAP/AHgAAH///AP4AAH///gP8AAH///gP8AAH///gP+AAH///gD/AAH/A/AB/AAH4A/AA/gAH4A+AAfgAH4B+AAfgAH4B+AAfgAH4B8AAfgAH4B8AAfgAH4B+AAfgAH4B+AAfgAH4B+AA/gAH4B/AA/AAH4A/gD/AAH4A/4H+AAH4Af//+AAH4AP//8AAH4AP//4AAHwAD//wAAAAAB//AAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAD////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gP4H+AAD/AfgD/AAH8A/AB/AAH8A/AA/gAH4B+AAfgAH4B+AAfgAPwB8AAfgAPwB8AAfgAPwB+AAfgAPwB+AAfgAH4B+AAfgAH4B/AA/gAH8B/AB/AAH+A/wD/AAD+A/8P+AAB8Af//+AAB4AP//8AAAwAH//4AAAAAD//gAAAAAA//AAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAHAAPwAAAA/AAPwAAAD/AAPwAAAf/AAPwAAB//AAPwAAP//AAPwAA//8AAPwAH//wAAPwAf/+AAAPwB//4AAAPwP//AAAAPw//8AAAAP3//gAAAAP//+AAAAAP//wAAAAAP//AAAAAAP/4AAAAAAP/gAAAAAAP+AAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAH+A//gAAAf/h//4AAA//z//8AAB/////+AAD/////+AAD///+H/AAH+H/4B/AAH8B/wA/gAH4A/gAfgAH4A/gAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAH4A/gAfgAH4A/gAfgAH8B/wA/gAH/H/4B/AAD///+H/AAD/////+AAB/////+AAA//z//8AAAf/h//4AAAH+A//gAAAAAAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAD/8AAAAAAP/+AAAAAAf//AAcAAA///gA8AAB///wB+AAD/x/4B/AAD+AP4B/AAH8AH8A/gAH4AH8A/gAH4AD8AfgAP4AD8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAH4AD8AfgAH4AD4A/gAH8AH4B/AAD+APwD/AAD/g/wP+AAB/////+AAA/////8AAAf////4AAAP////wAAAH////AAAAA///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DxcjFyAfISAiHCAiEg=="), 54+(scale<<8)+(1<<16)); - return this; -}; - -Graphics.prototype.setSmallFont = function(scale) { - // Actual height 28 (27 - 0) - this.setFontCustom( - atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/+cB//5wH//nAAAAAAAAAAAAAAAAAAAB8AAAHwAAAfAAAAAAAAAAAAAfAAAB8AAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAQcAADhwAAOHBAA4c8ADh/wAP/+AB/+AA//wAH+HAAe4cMBDh/wAOP/AA//wAP/wAH/3AAf4cABzhwAAOHAAA4cAADgAAAOAAAAAAAAAAAAAAAAAAAAwAH8HwA/4PgD/geAePA8BwcBw/BwH78DgfvwOB+HA4HAeBwcA8HDgB4f+ADg/wAGB+AAAAAAAAAAAAAAAH4AAA/wBwHngPAcOB4Bw4PAHDh4AcOPAA/x4AD/PAADx4AAAPAAAB5wAAPPwAB5/gAPOPAB4wcAPDBwB4MHAPA4cA4B/gBAH8AAAHAAAAAAAAAAAAAPAAHD/AB/f+AP/x4B4+DwHB4HAcDwcBwHhwHAPHAcAccB4A5wDgB+AGA/4AAH/AAAf+AAAA8AAABgAAAAAfAAAB8AAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AD//+A/+/+H4AD98AAB3gAADIAAAAAAAAAAAAAIAAABwAAAXwAAHPwAB8P8D/gP//4AH/8AAAAAAAAAAAAAAAAAAAAAAAAHAAAAcwAAA/gAAb8AAB/gAAH+AAAD+AAAOwAABxAAADAAAAAAAAAAAAAADAAAAMAAAAwAAADAAAAMAAAAwAAB//AAH/8AAAwAAADAAAAMAAAAwAAADAAAAMAAAAAAAAAAAAAABwAAAHIAAAfgAAB8AAAAAAAAAAAAAAAAAAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAAAAAAAAAAAAAAAAAAAABwAAAHAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAA/wAA//AA//AA//AAH/AAAfAAABAAAAAAAAAAAAAAAAAAAf/wAH//wA///gDgAOAcAAcBwABwHAAHAcAAcBwABwHgAPAPAB4Af//AA//4AA/+AAAAAAAAAAAAAAAAMAAABwAAAOAAAB4AAAH///Af//8B///wAAAAAAAAAAAAAAAAAAAAwAcAPADwB8AfAPAB8B4APwHAB/AcAPcBwB5wHAPHAcB4cA8PBwD/4HAH/AcAHwBwAAAAAAAAAAAAGAHAAcAcAB4BwYDwHDwHAceAcBz4BwHfgHAf3AcB+eDwHw/+AeB/wBwD+AAAAAAAAAAAAAAAAABwAAAfAAAP8AAD/wAA/nAAP4cAD+BwAfgHAB4AcAEA//AAD/8AAP/wAABwAAAHAAAAMAAAAAAAAAAAAAEAH/w4Af/D4B/8HgHDgPAcOAcBw4BwHDgHAcOAcBw8DwHB4eAcH/wBgP+AAAPwAAAAAAAAAAAAAAAB//AAf//AD//+AOHB4Bw4BwHDgHAcOAcBw4BwHDgHAcPA8A4eHgDh/8AEB/gAAD4AAAAAAAAAABwAAAHAAAAcAAMBwADwHAB/AcA/4BwP8AHH/AAd/gAB/wAAH8AAAeAAAAAAAAAAAAAAAEAAPD+AB/f8AP//4B4+DwHDwHAcHAcBwcBwHBwHAcPAcB/+DgD//+AH5/wACB8AAAAAAAAAAAAAAAAEAAAD+AAAf+DAD74OAODw8BwHBwHAOHAcA4cBwDBwHAcHAeBw8A+ePgB//8AD//gAB/wAAAAAAAAAAAAAAAAAAAAAHBwAAcHAABwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AcgDgB+AOAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAeAAAD8AAAf4AADzwAAeHgADwPAAGAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACAAOAcAA8DgAB4cAABzgAAD8AAAHgAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAHgAAA+AAAHgAAAcAAABwD5wHAfnAcD8cBweAAHzwAAP+AAAfwAAAcAAAAAAAAAAAAAAAAAAB/AAA//AAH/+AA8A8AHAA4A4ABwDg+HAcH8OBw444GDBhgYMGGBgwYYHDjjgcP8OBw/44DgDhAOAGAAeAYAA+HgAB/8AAB/gAAAAAAAAAAAAABAAAA8AAAfwAAP/AAH/gAD/4AB/zgAf4OAB8A4AHwDgAf4OAA/84AAP/gAAH/AAAD/gAAB/AAAA8AAAAQAAAAAAAAAB///wH///Af//8BwOBwHA4HAcDgcBwOBwHA4HAcDgcBweBwHj4HAP/58Afz/gAcH8AAAPAAAAAAAH/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAOAA4A8AHgB8B8ADwHgADAYAAAAAAAAAAAAAAAH///Af//8B///wHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAeAA8A8AHgB8B+AD//gAH/8AAD/AAAAAAAAAAAAAAAAf//8B///wH///AcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHAAHAcAAcAAAAAAAAAAAAAAB///wH///Af//8BwOAAHA4AAcDgABwOAAHA4AAcDgABwOAAHAAAAcAAAAAAAAAP/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwGBwHgYPAOBg4A+GPgB4f8ADh/gAAH4AAAAAAAAAAAAAAAH///Af//8B///wAA4AAADgAAAOAAAA4AAADgAAAOAAAA4AAADgAAAOAAAA4AAf//8B///wH///AAAAAAAAAAAAAAAAAAAB///wH///Af//8AAAAAAAAAAAABgAAAHgAAAeAAAA8AAABwAAAHAAAAcAAABwH///Af//4B///AAAAAAAAAAAAAAAAAAAAf//8B///wH///AAHgAAA/AAAH+AAA88AAHh8AA8D4AHgDwA8AHgHgAPAYAAcBAAAwAAABAAAAAAAAAAH///Af//8B///wAAAHAAAAcAAABwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAAAAAAAAAAAAH///Af//8B///wB/AAAB/AAAA/AAAA/gAAA/gAAA/gAAA/AAAD8AAA/AAAfwAAH8AAB/AAAfgAAP4AAB///wH///Af//8AAAAAAAAAAAAAAAAAAAH///Af//8B///wD8AAAD4AAAH4AAAHwAAAPwAAAPgAAAPgAAAfAAAAfAAAA/Af//8B///wH///AAAAAAAAAAAH/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAOAA4A8AHgB+D8AD//gAH/8AAD+AAAAAAAAAAAH///Af//8B///wHAOAAcA4ABwDgAHAOAAcA4ABwDgAHAeAAeBwAA+fAAD/4AAD/AAADgAAAAAAAAf8AAH/8AB//8AHgDwA8AHgHgAPAcAAcBwABwHAAHAcAAcBwABwHAAnAcAHcA4AfgDwA+AH4P4AP//wAf/3AAP4AAAAAAAAAAAf//8B///wH///AcA4ABwDgAHAOAAcA4ABwDgAHAOAAcB+AB4H+AD59/AP/h8AP8BwAOABAAAAAAAAAAAAAwAD4HwA/4fAD/geAePA8BwcBwHBwHAcDgcBwOBwHA4HAcDgcA4HDwD4eeAHw/4AOD/AAIDwAAAAABwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAH///Af//8B///wHAAAAcAAABwAAAHAAAAcAAABwAAAGAAAAAAAAAAAAAH//wAf//gB///AAAAeAAAA8AAABwAAAHAAAAcAAABwAAAHAAAAcAAADgAAAeAf//wB//+AH//gAAAAAAAAAAGAAAAfAAAB/gAAB/wAAA/4AAAf8AAAP/AAAH8AAADwAAA/AAAf8AAP+AAP/AAH/gAB/wAAH4AAAcAAABAAAAHwAAAf4AAA/+AAAP/gAAH/wAAB/wAAA/AAAf8AAf/AAP/gAP/gAB/gAAH4AAAf+AAAf/AAAH/wAAB/8AAAfwAAB/AAB/8AA/+AA/+AAf+AAB/AAAHAAAAAAAAAAAAQGAADAeAA8B8AHwD8B+AD4PgAH74AAH/AAAPwAAA/gAAP/gAD8fAAfA/AH4A+AeAA8BwABwEAABAQAAABwAAAHwAAAPwAAAfwAAAfgAAAfgAAAf/wAB//AAf/8AH8AAA/AAAPwAAB8AAAHAAAAQAAAAAAAAAAABAcAAcBwADwHAA/AcAP8BwD/wHAfnAcH4cBx+BwHPwHAf8AcB/ABwH4AHAeAAcBgABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////////gAAAOAAAA4AAADAAAAAAAAAAAAAAAAAAAAAAAeAAAB/gAAH/4AAB/+AAAf/gAAH/AAAB8AAAAQAAAAAAAAAAAAAAOAAAA4AAADgAAAP/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADgAAAcAAADgAAAcAAADgAAAcAAAB4AAADwAAADgAAAHAAAAOAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAADj+AAef8AD5xwAOGHAA44MADjgwAOOHAA44YADjDgAH/8AAf/8AAf/wAAAAAAAAAAAAAAAAAAAf//8B///wH//+AAcA4ADgBwAOAHAA4AcADgBwAOAHAA8A8AB8PgAD/8AAH/gAAH4AAAAAAAAAAAAH4AAB/4AAP/wAB4HgAPAPAA4AcADgBwAOAHAA4AcADgBwAPAPAAeB4AA4HAABgYAAAAAAAAAAAAfgAAH/gAB//gAHgeAA8A8ADgBwAOAHAA4AcADgBwAOAHAAcA4B///wH///Af//8AAAAAAAAAAAAAAAAH4AAB/4AAP/wAB7HgAPMPAA4wcADjBwAOMHAA4wcADjBwAPMPAAfx4AA/HAAB8YAAAwAAAAAAAAAAAAwAAADAAAB///AP//8B///wHMAAAYwAABjAAAGMAAAAAAAAAPwAAD/wMA//w4DwPHgeAePBwA4cHADhwcAOHBwA4cHADhwOAcPB///4H///Af//wAAAAAAAAAAAAAAAAAAB///wH///AAf/8ABwAAAOAAAA4AAADgAAAOAAAA4AAADwAAAH//AAP/8AAf/wAAAAAAAAAAAAAAAAAAAc//8Bz//wHP//AAAAAAAAAAAAAAHAAAAcAAAH+f///5///7H//8AAAAAAAAAAAAAAH///Af//8B///wAAPAAAB+AAAP8AAB54AAfDwAD4HgAOAPAAwAcACAAwAAAAAAAAAB///wH///Af//8AAAAAAAAAAAAAAAAAAAAP//AA//8AB//wAHAAAA4AAADgAAAOAAAA4AAAD4AAAH//AAP/8AB//wAHAAAA4AAADgAAAOAAAA4AAADwAAAH//AAP/8AAf/wAAAAAAAAAAAAAAAP//AA//8AB//wAHAAAA4AAADgAAAOAAAA4AAADgAAAPAAAAf/8AA//wAB//AAAAAAAAAAAAAAAAB+AAAf+AAD/8AAeB4ADwDwAOAHAA4AcADgBwAOAHAA4AcADwDwAHw+AAP/wAAf+AAAfgAAAAAAAAAAAAAAAB///8H///wP///A4BwAHADgAcAOABwA4AHADgAcAOAB4B4AD4fAAH/4AAP/AAAPwAAAAAAAAAAAAPwAAD/wAA//wADwPAAeAeABwA4AHADgAcAOABwA4AHADgAOAcAB///8H///wf///AAAAAAAAAAAAAAAAAAAD//wAP//AAf/8ABwAAAOAAAA4AAADgAAAOAAAAAAAAAYGAAD4cAAfx4AD3DwAOOHAA44cADjhwAOGHAA4ccADxzwAHj+AAOP4AAYOAAAAAAAwAAADAAAAMAAAP//wA///gD///AAwAcADABwAMAHAAwAcADAAwAAAAAAAAAAD/gAAP/4AA//4AAA/gAAAPAAAAcAAABwAAAHAAAAcAAABwAAAOAA//8AD//wAP//AAAAAAAAAAAIAAAA4AAAD8AAAH+AAAH/AAAD/gAAB/AAAB8AAA/wAAf8AAP+AAD/AAAPgAAAwAAAAAAAAIAAAA8AAAD/AAAH/gAAD/wAAA/wAAA/AAAf8AAP+AAP+AAA/AAAD+AAAH/AAAD/gAAA/wAAA/AAAf8AAP/AAP/AAA/gAADgAAAAAAAAAAEADAAwAOAHAA+B8AB8PgAB74AAD/AAAH4AAA/wAAHvgAB8PgAPgfAA4AcADAAwAAABABAAAAHAAAAfgAAA/wAAA/wAwAf4fAAP/8AAP/AAB/gAA/wAAf4AAP+AAB/AAAHgAAAQAAAAAAEADAAwAOAPAA4B8ADgPwAOD/AA4ecADnxwAO8HAA/gcAD8BwAPAHAA4AcACAAwAAAAAAAAAAAAAAAAAAAAAAAAAA8AB////f//////n/+AAAA4AAADgAAAAAAAAAAAAAAAAAH///Af//8B///wAAAAAAAAAAAAAAAAAAA4AAADgAAAOAAAA//5/9////z////AAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAB8AAAHwAAAcAAABwAAAHgAAAOAAAA8AAABwAAAHAAAB8AAAHwAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAGAAABwAAAOAAABwAAAHAAAAcAAAA4AAABwAAABgAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAOAB4B4ADwPAAHh4AAPPAAAf4AAA/AAAB4AAAPwAAB/gAAPPAAB4eAAPA8AB4B4AHADgAIAEAAAAAAADAAAAMAAAAwAAADAAAAMAAAAwAAHDDgA8MPADww8AGDBgAAMAAAAwAAADAAAAMAAAAwAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADn//gOf/+A5//4AAAAAAAAAAAAAAAAAAAD/AAA//AAH/+AA+B8ADgBwAOAHAHwAPgfAA+B8AD4A4AcADwDwAHgeAAOBwAAQCAAAAAAAAAAAADgcAAOBwAA4HAD//8A///wD///AeDgcBwOBwHA4HAcDgcB4GBwD4AHAHgAcAOAAAAAAAAAAAAAMAGAB7+8AD//gAHx8AAcBwADgDgAOAOAA4A4ADgDgAOAOAA4A4ABwHAAHg8AA//4AH//wAMOGAAAAAAQAAABwAAAHwMYAPwxgAfjGAAfsYAAf7gAAf/wAB//AAf/8AH7GAA/MYAPwxgB8DGAHAAAAQAAAAAAAAAAAAAf/D/5/8P/n/w/+AAAAAAAAAAAAAAAAAAAABwAAffhwD//Hgf+cfBzwwcGHDhwYcOHBxw4cHDhxwfOPvA8//4Bx//AADwwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAP/wAB//gAPAPAB4AOAPDw8A4/xwHH/jgc4HOBzgc4HMAzgcwDOBzgc4HPDjgOcOeA4whwBwAOAHwD4APw/AAf/4AAf+AAAPAAAAAAAATgAAD/AAANsAAA2wAADTAAAP8AAAfwAAAAAAAAAAAAAAAAAAgAAAPAAAB+AAAOeAADw8AAOIwAADxAAAfgAADngAA8PAADgMAAEAQAAAAAAAAAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAAB+AAAH4AAAAAAAAAAAAAAAAAAAAD8AAA/8AAHh4AAYDgAD/3AAN/MAA0QwADRjAAN/MAA7hwABwOAADhwAAH+AAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAD/AAAeeAABw4AAGDgAAYOAABw4AAH/AAAP8AAAfAAAAAAAAAAAAAAAAAAAwYAADBgAAMGAAAwYAADBgAAMGAAP+YAA/5gAD/mAAAwYAADBgAAMGAAAwYAADBgAAAAAAAAAAAAAAAMDAABwcAAPDwAAwPAADB8AAMOwAA5zAAB+MAADwwAAAAAAAAAAAIBAAAwGAADMcAANwwAA/DAAD8MAAO/wAAx+AAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///B///8H//AAAAeAAAA4AAADgAAAOAAAA4AAADgAAAcAB//gAH//gAf/+AAAAAAAAAAAAAAAAAAAAP4AAB/4AAP/gAB//AAH/8AAf/wAB//AAH///8f///x////AAAAAAAAAB////H///8f///wAAAAAAAAAAAAAAABAAAAOAAAB4AAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAzAAAPMAAA/wAAAeAAAAAAAAAAAAAAAAAAAIAAABgAAAMAAAA//AAD/8AAAAAAAAAAAAAAAAAAAAAA8AAAP4AAAwwAADDAAAMMAAA5wAAB+AAADwAAAAAAAAAAAAAAAAAMAwAA8HAAB44AAD/AAAD4AADGMAAOBwAAeOAAA/wAAA+AAABgAAAAAAAAAAAAAAABAAAAMAAABwAAAH/8CAf/wcAAAHgAAA8AAAHgAAB4AAAPAAAB4AAAeAAADwAAA+AAAHgCAA8A8APAfwB4H7AHB+MAAHAwAAQ/wAAD/AAAAwAAADAAAAAAAAAAAAAAAAAAAAEAAAAwAAAHAAAAf/wIB//BwAAAeAAADwAAAeAAAHgAAA8AAAHgAAB4AAAPAAAD4AAAeAAADwAAA8GAwHg4HAcHA8AAYHwABg7AAGHMAAf4wAA/DAAA4MAAAAAAAAAAYBgABgHAAGMOAAZwYABvBgAH8OCAe/wcBx+HgABg8AAAHgAAB4AAAPAAAB4AAAeAAADwAAA+AAAHgHAA8B8APAfwB4HzADB8MAAHAwAAQ/wAAD/AAAAwAAAAAAAAAAAAAAAAAA4AAAP4AAB/wAAPHgABwOA4/A4Dn4DgOfAOAAAA4AAAHgAAB8AAAHgAAAYAAAAAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAfAOAB/g4AD/zgAA/+AAAf8AAAP+AAAH8AAADwAAABAAAAAAAAABwAAA/AAAf8AAP/AAH/wfD/nD+/wcMb4BwxvgHD+/wcHx/5wEAf/AAAP+AAAH/AAAD8AAABwAAAAAAAEAAADwAAB/AAA/8AAf+AAP/gAH/OAB/g4AHwDgAcAOABwA4AHADgAf//8B///wHA4HAcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHAAHAYAAMAAAAAAAAAAA/4AAP/4AD//4APAHgB4APAPAAeA4AA4DgADg+AAPz4AA//gAD/+AAOe4AA4BwAHAHgA8APgPgAeA8AAYDAAAAAAAAAAAAAAAAf//8B///wH///AcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHAAHAcAAcAAAAAAAAAAAAAAB///wH///Af//8BwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHA4HAcAAcBwABwAAAAAAAAAAAAAAH///Af//8B///wHA4HAcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwABwHAAHAAAAAAAAAAAAAAAf//8B///wH///AcDgcBwOBwHA4HAcDgcBwOBwHA4HAcDgcBwOBwHAAHAcAAcAAAAAAAAAAAAAAB///wH///Af//8AAAAAAAAAAAAAAAAAAAH///Af//8B///wAAAAAAAAAAAAAAAAAAAf//8B///wH///AAAAAAAAAAAAAAAAAAAB///wH///Af//8AAAAAAAAAAABgAAAGAAH///Af//8B///wHAYHAcBgcBwGBwHAYHAcBgcBwABwHAAHAeAA8A8AHgB+D8AD//gAH/8AAD+AAAAAAAAAAAAAAAAf//8B///wH///APwAAAPgAAAfgAAAfAAAA/AAAA+AAAA+AAAB8AAAB8AAAD8B///wH///Af//8AAAAAAAAAAAf8AAH/8AB//8AHgDwA8AHgHgAPAcAAcBwABwHAAHAcAAcBwABwHAAHAcAAcA4ADgDwAeAH4PwAP/+AAf/wAAP4AAAAAAAH/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAOAA4A8AHgB+D8AD//gAH/8AAD+AAAAAAAB/wAAf/wAH//wAeAPADwAeAeAA8BwABwHAAHAcAAcBwABwHAAHAcAAcBwABwDgAOAPAB4Afg/AA//4AB//AAA/gAAAAAAAf8AAH/8AB//8AHgDwA8AHgHgAPAcAAcBwABwHAAHAcAAcBwABwHAAHAcAAcA4ADgDwAeAH4PwAP/+AAf/wAAP4AAAAAAAH/AAB//AAf//AB4A8APAB4B4ADwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHAOAA4A8AHgB+D8AD//gAH/8AAD+AAAAAAAAAAAAGDgAA8eAAB7wAAD+AAAHwAAAfAAAD+AAAe8AADw4AAGBAAAAAAAAAAAAAAAAAf8MAH//4B///AHgD4A8AfgHgD/AcAecBwDxwHAeHAcDwcBw+BwHHgHAc8AcA/gDgD8AeAH4PwA//+AH//wAMP4AAAAAAAAAAAf//AB//+AH//8AAAB4AAADwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAOAAAB4B///AH//4Af/+AAAAAAAAAAAAAAAAAAAAH//wAf//gB///AAAAeAAAA8AAABwAAAHAAAAcAAABwAAAHAAAAcAAADgAAAeAf//wB//+AH//gAAAAAAAAAAAAAAAAAAAB//8AH//4Af//wAAAHgAAAPAAAAcAAABwAAAHAAAAcAAABwAAAHAAAA4AAAHgH//8Af//gB//4AAAAAAAAAAAAAAAAAAAAf//AB//+AH//8AAAB4AAADwAAAHAAAAcAAABwAAAHAAAAcAAABwAAAOAAAB4B///AH//4Af/+AAAAAAAAAAAQAAABwAAAHwAAAPwAAAfwAAAfgAAAfgAAAf/wAB//AAf/8AH8AAA/AAAPwAAB8AAAHAAAAQAAAAAAAAAAAAAf//8B///wH///ABwHAAHAcAAcBwABwHAAHAcAAcBwABwHAAHg8AAP/gAAf8AAA/gAAAAAAAAAAAAAAAA///AP//8A///wHgAAAcAAcBwABwHBwHAcHAcB4+BwD/4PAH954APn/gAAP8AAAOAAAAAAAAAAAAAD4AAcfwADz/gAfOOCBww4PHHBg+ccGAZxw4AHHDAAcYcAA//gAD//gAD/+AAAAAAAAAAAAAAAAAPgABx/AAPP+AB844AHDDgAccGAZxwYPnHDg8ccMDBxhwAD/+AAP/+AAP/4AAAAAAAAAAAAAAAAA+AAHH8AA8/4BnzjgOcMOBxxwYOHHBg4ccOBxxwwDnGHAGP/4AA//4AA//gAAAAAAAAAAAAAAAAHwAA4/gAHn/A8+ccDzhhwMOODA444MBjjhwHOOGAM4w4Dx//AOH//AAH/8AAAAAAAAAAAAAAAAAfAADj+AAef8Bz5xwHOGHAc44MADjgwAOOHAY44YBzjDgHH/8AAf/8AAf/wAAAAAAAAAAAAAAAAAfAADj+AAef8AD5xweOGHD844MMzjgwzOOHD844YHjjDgAH/8AAf/8AAf/wAAAAAAAAAAAAAAAAHwAAx/gAHn/AAc4cADjhwAOMDAA4wcADjBwAOMHAA4w4AB//AAH/4AAP/wAB/fgAPMPAA4wcADjBwAOMHAA4wcADjBwAPMPAAfx4AA/HAAB8YAAAAAAAAAAAA/AAAP/AAB/+AAPA8AB4B4AHADgwcAPzBwA/8HADngcAOMB4B4ADwPAAHA4AAMDAAAAAAAAAAAAA/AAAP/AAB/+AAPY8AB5h4OHGDg+cYOB5xg4AnGDgAcYOAB5h4AD+PAAH44AAPjAAAGAAAAAAAAAAAAAPwAAD/wAAf/gAD2PAAeYeABxg4AHGDgOcYOD5xg4OHGDggeYeAA/jwAB+OAAD4wAABgAAAAAAAAAAAAD8AAA/8AAH/4AY9jwDnmHgecYODhxg4OHGDg8cYOB5xg4BnmHgCP48AAfjgAA+MAAAYAAAAAAAAAAAAB+AAAf+AAD/8Acex4BzzDwHOMHAA4wcADjBwAOMHAc4wcBzzDwGH8eAAPxwAAfGAAAMAAAAAAAAAAAOAAAA+f/+A5//4An//gAAAAAAAAAAAAAAAAAAAJ//4Dn//g+f/+DgAAAAAAAAMAAABwAAAOP//Aw//8Dj//wHAAAAMAAABwAAAHAAAAA//8AD//wAP//AcAAABwAAAAAAAAAA/gAAP/AAB//AAPA8AA4A4DDgDgPMAOA/wA4D7ADgPOAOB+8B4C/+/AA//4AB//AAAHAAAAAAAAAAAAP//AA//8Bx//wPHAAAw4AADjgAAGOAAAc4AAAzgAAPPAAA4f/8AA//wAB//AAAAAAAAAAAAAAAAA/AAAP/AAB/+AAPA8CB4B4OHADg+cAOA5wA4AHADgAcAOAB4B4AD4fAAH/4AAP/AAAPwAAAAAAAAAAAAPwAAD/wAAf/gADwPAAeAeABwA4AnADgecAOD5wA4OHADgAeAeAA+HwAB/+AAD/wAAD8AAAAAAAAAAAAD8AAA/8AAH/4AY8DwDngHgecAODhwA4OHADg8cAOB5wA4BngHgCPh8AAf/gAA/8AAA/AAAAAAAAAAAAB+AAAf+AAD/8AceB4DzwDwMOAHA44AcBjgBwHOAHAM4AcDzwDwOHw+AAP/wAAf+AAAfgAAAAAAAAAAAAfgAAH/gAA//AHHgeAc8A8BzgBwAOAHAA4AcADgBwHOAHAc8A8Bh8PgAD/8AAH/gAAH4AAAAAAAAAAAAMAAAAwAAADAAAAMAAAAwAAADAAADtwAAO3AAA7cAAAMAAAAwAAADAAAAMAAAAAAAAAAAAAH5gAB//AAP/4AB4PgAPB/AA4PcADh5wAOPHAA54cADvBwAP4PAAfD4AB//AAP/4AAZ+AAAAAAAAAAAAf8AAB//AAH//AAAH8AAAB4OAADg+AAOB4AA4AgADgAAAOAAABwAH//gAf/+AB//4AAAAAAAAAAAAAAAH/AAAf/wAB//wAAB/AAAAeAAAA4BgADgeAAOD4AA4MAADgAAAcAB//4AH//gAf/+AAAAAAAAAAAAAAAB/wAAH/8AAf/8AYAfwDgAHgcAAODgAA4OAADg8AAOB4AA4BgAHACf/+AB//4AH//gAAAAAAAAAAAAAAA/4AAD/+AAP/+AcAP4BwADwHAAHAAAAcAAABwAAAHAcAAcBwADgGP//AA//8AD//wAAAAAAAAAABAAAAHAAAAfgAAA/wAAA/wAAAf4cAAP/zgAP/+AB/jgA/wAAf4AAP+AAB/AAAHgAAAQAAAAAAAAAAAA//////////////A4BwAHADgAcAOABwA4AHADgAcAOAB4B4AD4fAAH/4AAP/AAAPwAAAAAABAAAAHAAAAfgAAw/wADg/wA+Af4fAAP/8AAP/AAB/g4A/wDgf4AOP+AAB/AAAHgAAAQAAA=='), - 32, - atob("BgkMGhEZEgYMDAwQCAwICxILEBAREBEOEREJCREVEQ8ZEhEUExAOFBQHDREPGBMUERQSEhEUERsREBIMCwwTEg4QERAREQoREQcHDgcYEREREQoPDBEPFg8PDwwIDBMcCgoAAAAAAAAAAAAAACERESEAAAAAAAAAAAAAAAAhIQAGCRAQEhAIDw8XCQ8RABIODRELCw4REwcLCQoPHBscDxISEhISEhoUEBAQEAcHBwcTExQUFBQUDhQUFBQUEBEREBAQEBAQGhARERERBwcHBxAREREREREPEREREREPEQ8="), - 28+(scale<<8)+(1<<16) - ); - return this; -}; - -Graphics.prototype.setMiniFont = function(scale) { - // Actual height 16 (15 - 0) - this.setFontCustom( - atob('AAAAAAAAAAAAAP+w/5AAAAAA4ADgAOAA4AAAAAAAAAABgBmAGbAb8D+A+YDZ8B/wf4D5gJmAGQAQAAAAAAAeOD8cMwzxj/GPMYwc/Az4AAAAAHAA+DDIYMjA+YBzAAYADeA7MHMw4zDD4ADAAAAz4H/wzjDHMMMwwbBj4APgADAAAAAA4ADgAAAAAAAAAAfwH/54B+ABAAAAAOABeAcf/gfwAAAAACAAaAD4APgAOABgAAAAAAACAAIAAgA/wAMAAgACAAAAAAAAPAA4AAAAAAIAAgACAAIAAgAAAAAAADAAMAAAAAAAcAfwf4D4AIAAAAA/wH/gwDDAMMAwwDB/4D/AAAAAAGAAwAD/8P/wAAAAAHAw8HDA8MHww7DnMH4wGBAAAMBgyHDcMPww/DDv4MfAAAAAAAHgD+A+YPhgwGAH8AfwAEAAAAAA/GD8cMwwzDDMMM5wx+ABgAAAP8B/4MwwzDDMMMwwx+ADwAAAgADAAMBwwfDPgP4A8ADAAAAAe+D/8M4wxjDGMP5wf+ABwAAAfAB+cMYwwjDCMMYwf+A/wAAAAAAAAAxgBCAAAAAAAAAYPBA4AAAAAAAAAgAHAA+AHMAYYAAAAAAAAAAAAAAJAAkACQAJAAkACQAJAAkAAAAAAAAAAAAAABhgHMAPgAcAAgAAAAAAAABgAOAAwbDDsMYA/AA4AAAAAAAD4A/wGBgxzDPsMyQjJDPkM+wYIBxgD+AAAAAAABAA8A/gf8DwwODA/sAfwAHwADAAAP/w//DGMMYwxjDOMP9we+ABwA8AP8Bw4MAwwDDAMMAwwDDgcHDgMMAAAAAA//D/8MAwwDDAMMAw4HB/4D/AAAAAAP/w//DGMMYwxjDGMMQwgBAAAP/w//DDAMMAwwDDAMAADwA/wHDgwDDAMMAwwDDCMOJwc+ADwAAA//D/8AMAAwADAAMAAwD/8P/wAAAAAP/w//AAAABgAHAAMAAwAHD/4P+AAAAAAP/w//AOAB+AOcBw4MBwgDAAEAAA//D/8AAwADAAMAAwADAAAP/w//A8AA8AA+AA8AHwB8AeAHgA//D/8AAAAAD/8P/wcAAcAA8AA4AB4P/w//AAAA8AP8Bw4MAwwDDAMMAwwDDgcH/gP8AAAAAA//D/8MMAwwDDAMYA7gB8ABgADwA/wHDgwDDAMMAwwDDA8ODwf/A/8AAAAAD/8P/wwwDDAMMAx4Dv4HxwEBAAAHjg/HDMMMYwxjDGMONwc+ABwMAAwADAAMAA//D/8MAAwADAAIAAAAD/wP/gAHAAMAAwADAAMAHg/8AAAMAA+AA/AAfgAPAA8AfgPwD4AMAAwAD4AD+AA/AA8A/g/gDwAP4AH8AB8APwH8D8AMAAgBDAMPDgO8APAB8AOcDw8MAwgBCAAOAAeAAeAAfwH/B4AOAAwAAAAMAwwPDB8Mew3jD4MPAwwDAAAAAAAAB//3//QABAAAAAAADgAP4AH+AB8AAQAABAAEAAf/9//wAAAAAAAAAAGAAwAGAAwABgADAAGAAAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAQA3wHbAZMBswGzAf4A/wAAAAAP/w//AYMBgwGDAYMA/gB8AAAAEAD+Ae8BgwGDAYMBgwDGAAAAMAD+Ae8BgwGDAYMBhw//D/8AAAAYAP4B/wGTAZMBkwGTAP4AcAEAAYAP/w//CQAJAAAwAP4hz3GDMQMxAzGHcf/h/8AAAAAP/w//AYABgAGAAYAA/wB/AAAAAA3/Df8AAAAAOf/9//AAAAAP/w//ADgAfADGAYMBAQAAD/8P/wAAAAAB/wH/AYABgAGAAf8A/wGAAYABgAH/AP8AAAAAAf8B/wGAAYABgAGAAP8AfwAAADAA/gHvAYMBgwGDAYMA/gB8AAAAAAH/8f/xgwGDAYMBgwD+AHwAAAAwAP4B7wGDAYMBgwGHAf/x//AAAAAB/wH/AYABgAEAAAAA5gHzAbMBkwGbAd8AzgEAAYAP/wf/AQMBAwAAAAAB/gH/AAMAAwADAAcB/wH/AAABAAHgAPwAHwAPAH4B8AGAAQAB8AB+AA8APwHwAeAA/AAPAD8B+AHAAQEBgwHOAHwAOAD+AccBAwAAAQAB4AD4EB/wB8A/APgBwAAAAAEBgwGPAZ8B8wHjAcMBAQAAAAAABgf/9/n2AAAAAAAP/w//AAAEAAYAB/nz//AGAAAAAAAAAAAAcABgAGAAcAAwAHAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'), - 32, - atob("AwUHDwoOCwQHBwcJBAcEBgoGCQkKCQoICQoFBQoMCgkPCgoMCwkICwsECAoIDgsMCgwKCgoLCg8KCQoHBgcLCwgJCgkKCQYKCgQECAQOCgoKCgYIBwoIDAkJCAcEBwsQ"), - 16+(scale<<8)+(1<<16) - ); - return this; -}; - let imgLock = function() { return { width : 16, height : 16, bpp : 1, @@ -103,31 +63,31 @@ let clockInfoItems = clock_info.load(); // Add some custom clock-infos let weekOfYear = function() { - var date = new Date(); + let date = new Date(); date.setHours(0, 0, 0, 0); // Thursday in current week decides the year. date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7); // January 4 is always in week 1. - var week1 = new Date(date.getFullYear(), 0, 4); + let week1 = new Date(date.getFullYear(), 0, 4); // Adjust to Thursday in week 1 and count number of weeks from date to week1. return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6) % 7) / 7); -} +}; clockInfoItems[0].items.unshift({ name : "weekofyear", get : function() { return { text : "Week " + weekOfYear(), - img : null}}, + img : null};}, show : function() {}, hide : function() {}, -}) +}); // Empty for large time clockInfoItems[0].items.unshift({ name : "nop", get : function() { return { text : null, - img : null}}, + img : null};}, show : function() {}, hide : function() {}, -}) +}); @@ -138,7 +98,7 @@ let clockInfoMenu = clock_info.addInteractive(clockInfoItems, { w: W, h: H-135, draw : (itm, info, options) => { - var hideClkInfo = info.text == null; + let hideClkInfo = info.text == null; g.setColor(g.theme.fg); g.fillRect(options.x, options.y, options.x+options.w, options.y+options.h); @@ -147,8 +107,8 @@ let clockInfoMenu = clock_info.addInteractive(clockInfoItems, { g.setColor(g.theme.bg); if (options.focus){ - var y = hideClkInfo ? options.y+20 : options.y+2; - var h = hideClkInfo ? options.h-20 : options.h-2; + let y = hideClkInfo ? options.y+20 : options.y+2; + let h = hideClkInfo ? options.h-20 : options.h-2; g.drawRect(options.x, y, options.x+options.w-2, y+h-1); // show if focused g.drawRect(options.x+1, y+1, options.x+options.w-3, y+h-2); // show if focused } @@ -161,22 +121,22 @@ let clockInfoMenu = clock_info.addInteractive(clockInfoItems, { } // Set text and font - var image = info.img; - var text = String(info.text); + let image = info.img; + let text = String(info.text); if(text.split('\n').length > 1){ - g.setMiniFont(); + g.setFont("6x8"); //g.setMiniFont(); } else { - g.setSmallFont(); + g.setFont("6x8:3"); //g.setSmallFont(); } // Compute sizes - var strWidth = g.stringWidth(text); - var imgWidth = image == null ? 0 : 24; - var midx = options.x+options.w/2; + let strWidth = g.stringWidth(text); + let imgWidth = image == null ? 0 : 24; + let midx = options.x+options.w/2; // Draw if (image) { - var scale = imgWidth / image.width; + let scale = imgWidth / image.width; g.drawImage(image, midx-parseInt(imgWidth*1.3/2)-parseInt(strWidth/2), options.y+6, {scale: scale}); } g.drawString(text, midx+parseInt(imgWidth*1.3/2), options.y+20); @@ -206,56 +166,56 @@ let draw = function() { let drawDate = function() { // Draw background - var y = getLineY() + let y = getLineY(); g.reset().clearRect(0,0,W,y); // Draw date y = parseInt(y/2)+4; y += isFullscreen() ? 0 : 8; - var date = new Date(); - var dateStr = date.getDate(); + let date = new Date(); + let dateStr = date.getDate(); dateStr = ("0" + dateStr).substr(-2); - g.setMediumFont(); // Needed to compute the width correctly - var dateW = g.stringWidth(dateStr); + g.setFont("6x8:4"); //g.setMediumFont(); // Needed to compute the width correctly + let dateW = g.stringWidth(dateStr); - g.setSmallFont(); - var dayStr = locale.dow(date, true); - var monthStr = locale.month(date, 1); - var dayW = Math.max(g.stringWidth(dayStr), g.stringWidth(monthStr)); - var fullDateW = dateW + 10 + dayW; + g.setFont("6x8:3"); //g.setSmallFont(); + let dayStr = locale.dow(date, true); + let monthStr = locale.month(date, 1); + let dayW = Math.max(g.stringWidth(dayStr), g.stringWidth(monthStr)); + let fullDateW = dateW + 10 + dayW; g.setFontAlign(-1,0); g.drawString(dayStr, W/2 - fullDateW/2 + 10 + dateW, y-12); g.drawString(monthStr, W/2 - fullDateW/2 + 10 + dateW, y+11); - g.setMediumFont(); + g.setFont("6x8:4"); //g.setMediumFont(); g.setColor(g.theme.fg); g.drawString(dateStr, W/2 - fullDateW / 2, y+2); }; let drawTime = function() { - var hideClkInfo = clockInfoMenu.menuA == 0 && clockInfoMenu.menuB == 0; + let hideClkInfo = clockInfoMenu.menuA == 0 && clockInfoMenu.menuB == 0; // Draw background - var y1 = getLineY(); - var y = y1; - var date = new Date(); + let y1 = getLineY(); + let y = y1; + let date = new Date(); - var hours = String(date.getHours()); - var minutes = date.getMinutes(); + let hours = String(date.getHours()); + let minutes = date.getMinutes(); minutes = minutes < 10 ? String("0") + minutes : minutes; - var colon = settings.hideColon ? "" : ":"; - var timeStr = hours + colon + minutes; + let colon = settings.hideColon ? "" : ":"; + let timeStr = hours + colon + minutes; // Set y coordinates correctly y += parseInt((H - y)/2) + 5; if (hideClkInfo){ - g.setLargeFont(); + g.setFont("6x8:5"); //g.setLargeFont(); } else { y -= 15; - g.setMediumFont(); + g.setFont("6x8:4"); //g.setMediumFont(); } // Clear region and draw time @@ -330,7 +290,7 @@ let charging = function(charging){ // Jump to battery clockInfoMenu.setItem(0, 2); drawTime(); -} +}; Bangle.on('charging', charging); let kill = function(){ @@ -343,12 +303,6 @@ E.on("kill", kill); * Startup Clock */ -// The upper part is inverse i.e. light if dark and dark if light theme -// is enabled. In order to draw the widgets correctly, we invert the -// dark/light theme as well as the colors. -let themeBackup = g.theme; -g.setTheme({bg:g.theme.fg,fg:g.theme.bg, dark:!g.theme.dark}).clear(); - // Show launcher when middle button pressed Bangle.setUI({ mode : "clock", @@ -362,7 +316,7 @@ Bangle.setUI({ // save settings kill(); E.removeListener("kill", kill); - g.setTheme(themeBackup); + Bangle.removeListener('charging', charging); widget_utils.show(); } }); @@ -371,6 +325,7 @@ Bangle.setUI({ Bangle.loadWidgets(); // Draw first time +g.setColor(g.theme.fg).fillRect(0,135,W,H); // Otherwise this rect will wait for clock_info before updating draw(); } // End of app scope diff --git a/apps/bwclklite/metadata.json b/apps/bwclklite/metadata.json index 430f466b2..8c68bc40d 100644 --- a/apps/bwclklite/metadata.json +++ b/apps/bwclklite/metadata.json @@ -1,19 +1,43 @@ { "id": "bwclk", "name": "BW Clock", - "version": "0.31", + "version": "0.32", "description": "A very minimalistic clock.", "readme": "README.md", "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}, {"url":"screenshot_2.png"}, {"url":"screenshot_3.png"}], + "screenshots": [ + { + "url": "screenshot.png" + }, + { + "url": "screenshot_2.png" + }, + { + "url": "screenshot_3.png" + } + ], "type": "clock", "tags": "clock,clkinfo", - "supports": ["BANGLEJS2"], - "dependencies" : { "clock_info":"module" }, + "supports": [ + "BANGLEJS2" + ], + "dependencies": { + "clock_info": "module" + }, "allow_emulator": true, "storage": [ - {"name":"bwclk.app.js","url":"app.js"}, - {"name":"bwclk.img","url":"app-icon.js","evaluate":true}, - {"name":"bwclk.settings.js","url":"settings.js"} + { + "name": "bwclk.app.js", + "url": "app.js" + }, + { + "name": "bwclk.img", + "url": "app-icon.js", + "evaluate": true + }, + { + "name": "bwclk.settings.js", + "url": "settings.js" + } ] } From 20e300182e21fb2cfc413efcd8f5bc714d2a00e8 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sat, 25 Feb 2023 19:03:59 +0100 Subject: [PATCH 04/89] Change all occurrances of bwclk to bwclklite --- apps/bwclklite/README.md | 7 +++++-- apps/bwclklite/app.js | 4 ++-- apps/bwclklite/metadata.json | 12 ++++++------ apps/bwclklite/settings.js | 2 +- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/apps/bwclklite/README.md b/apps/bwclklite/README.md index 882d525f6..974411be0 100644 --- a/apps/bwclklite/README.md +++ b/apps/bwclklite/README.md @@ -1,5 +1,5 @@ -# BW Clock -A very minimalistic clock. +# BW Clock Lite +This is a fork of a very minimalistic clock. ![](screenshot.png) @@ -25,3 +25,6 @@ Note: Check out the settings to change different themes. ## Creator [David Peer](https://github.com/peerdavid) + +## Contributors +thyttan diff --git a/apps/bwclklite/app.js b/apps/bwclklite/app.js index 61a3feae1..1008eae9c 100644 --- a/apps/bwclklite/app.js +++ b/apps/bwclklite/app.js @@ -11,7 +11,7 @@ const widget_utils = require("widget_utils"); /************************************************ * Globals */ -const SETTINGS_FILE = "bwclk.setting.json"; +const SETTINGS_FILE = "bwclklite.setting.json"; const W = g.getWidth(); const H = g.getHeight(); @@ -92,7 +92,7 @@ clockInfoItems[0].items.unshift({ name : "nop", let clockInfoMenu = clock_info.addInteractive(clockInfoItems, { - app: "bwclk", + app: "bwclklite", x : 0, y: 135, w: W, diff --git a/apps/bwclklite/metadata.json b/apps/bwclklite/metadata.json index 8c68bc40d..bab852623 100644 --- a/apps/bwclklite/metadata.json +++ b/apps/bwclklite/metadata.json @@ -1,8 +1,8 @@ { - "id": "bwclk", - "name": "BW Clock", + "id": "bwclklite", + "name": "BW Clock Lite", "version": "0.32", - "description": "A very minimalistic clock.", + "description": "A very minimalistic clock. This version of BW Clock is quicker at the cost of the custom font.", "readme": "README.md", "icon": "app.png", "screenshots": [ @@ -27,16 +27,16 @@ "allow_emulator": true, "storage": [ { - "name": "bwclk.app.js", + "name": "bwclklite.app.js", "url": "app.js" }, { - "name": "bwclk.img", + "name": "bwclklite.img", "url": "app-icon.js", "evaluate": true }, { - "name": "bwclk.settings.js", + "name": "bwclklite.settings.js", "url": "settings.js" } ] diff --git a/apps/bwclklite/settings.js b/apps/bwclklite/settings.js index 116253fda..2d3916a3d 100644 --- a/apps/bwclklite/settings.js +++ b/apps/bwclklite/settings.js @@ -1,5 +1,5 @@ (function(back) { - const SETTINGS_FILE = "bwclk.setting.json"; + const SETTINGS_FILE = "bwclklite.setting.json"; // initialize with default settings... const storage = require('Storage') From 05146ce283ef06bed856cac08164817e75607c03 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sat, 25 Feb 2023 19:17:29 +0100 Subject: [PATCH 05/89] change screenshots --- apps/bwclklite/screenshot.png | Bin 2841 -> 2022 bytes apps/bwclklite/screenshot_3.png | Bin 3031 -> 2307 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/bwclklite/screenshot.png b/apps/bwclklite/screenshot.png index 37acf7cc07edd69a42f300923ecb8bfbec97a9cc..e5eee966040bddbe4dfaa92bf2705fec429760c1 100644 GIT binary patch literal 2022 zcmeHIdo+{@6dzxo`c#-np@_`HNTQ*qkyo=sFO8Yxo$`h4K}Iafc&p8$ z`5M_`6n&|TRIH-(klDPpLh>3Bv(wo>_pkkP&)IvZi@1t>u!+=D^GAg%fzl>`i@Ik6z6oPhS9#b6etJK67GMF$M$ zw?`7zEma*>C=P~g&Kx?fUn4o2f{pCYi(h4QuB3=hCWqJiS=0y=(=eJ1BGBFby7mbj z6_B1RQd=|n@(E)cN?qWqWhWEm2nKMvi*B1FpuU!d&j=eeLR~R%O~CeC21mau7XyUV zpRg97B=Hs%@O|vJg9b34a|D3yPL9Ro-s_&9qYqEclt0`~h3>ZbxPD#^Un@4|FH`|r zi@wvgq&4Qbt{-<#LoL^`n^@Q`#$~cta5Ya24rV>G1G)Gy@M*M*AQTK9;tyPA=Nf!~ z-t9cHMjKuvvt4-}4X>SVQCd5~s6OIWZ6*kNMeu!1a()W9csPOC8)Fi&T~aML-n`!h zGA}*65YN+U&&BjtA)#Qu>uHZ8>dBE_AlJ%gS+Qd>nzL&g?4L4r)IY2tTZCw`MK;ho z{Diy>=iNJTipAnMGzYCe@D-sriZhUk2};t{H`)*M^ti{V9=Z@V z_icZJ=8N_6W66mbjF=_-$b3>z=|uLU6>znq;V07%>oQDZu+d|HpdelJRYWbM*fM30 z6Sl#`1txQTz!O!2{D99%!|_kw%S$OOj6rmoqyloqab9p-4^g^8NL~ixrf-g$IB-BZ zXK-hUywzrQ;$U}Gr$pXbDWA-FBaPB$pA85MJn@A_5JOWIOW~k*xuw|YttBgk%VD8e z6YzcqCntSzWwlRB*Xvi8E*Vi78x+{Vx}bvly3eRKCkOI9FJj@)r<`9yOh_ z2lgSEFR~6Cucu21yu>1W)=j9su`DX~>QvNIzD51qM3a1C%d!*{GLO$nMTsS*f|muW z-`H%5`+RGxyj}wSIjk76>3HiFcDE(in)^+SVgvg(-2uI`q+YM;1E3)jGs+=4Ga|>a zJ|?y|Q~Yu^#r391fxpxkt)L)v+>tz#TaxJ}3z~U9JNnueQoY~ox%08%g&i_eNh{xq zxe>IOjw+3at#Ty+ZF|j_vTc5kbL}y3rk!Vqh6-5lAnUplh$X362M=KF{(TTJ>}l`G zIPAUN=SOuHk>Z34q~SVipmO-2*kuVDZB03 zNnY&ot&I|o?rh<0O+J(tzAS`Cml5BF^zAP@8CW-4x%PR*g$HWilM;MMQQJZ8$JwtP zvm~5kfg$OF%uecWL}C0uBW1^!nXljF(hnL3JymeepY zYY%~6Y476|H4X0h>43}b`1{Bd<=CP*P6Q3I8IH|#TJcNe!AtQsLEkqc+gxSBf4Nh79zU#j{P7ca`S1j5D)yu0&$ zOwoaH-raiHmK5_x%#2XQs-s}qEXW`99Gv1toN?pGi3-M&s|_OEj}D?L=PMT_<+jv7 zaRu_m3LrK-*L%J8?;d2e)aF~CMD)Ss!awp*SNkfA7jp3hO;p^9#_O!UEL5gfUa{$A zN$A>pMa8$%P_uPC3i8&;4N2Qq~FaLY^jVIhnv@!(eay6{%VYq1JfR%aZdjQ DNjG3t literal 2841 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 bu7T|roXdI-%T9jpy1+p%KhG+6@|Ax8FvV5G diff --git a/apps/bwclklite/screenshot_3.png b/apps/bwclklite/screenshot_3.png index d52057569b0c80df6656e22333f4347e7552411a..573675d28c55b01ddd97e99a86fd5e53b2552290 100644 GIT binary patch literal 2307 zcmdT`X;4!M5)Lmg%rRuCJ;)!^@Mb zwq?f_6bhy0cHG5B5&8czNLk^lYX3n|1f@$pWM@=mC-#dX0WUeb`9cb?pzw4Q3gWrB z9Q9>TrXENWMvgw z@0z?9jsQ^R7OsksY+}iq2#g@-0EqZ1X?r$8I8cBBvT24brU%qB&95TdPvluB6a8PP zzm%*9g)=ix8V9G{JLGA|C8nSMUf}*iv)Ii_;PkI+u7~dZ9&J@V@6ADCb_EE0Gy}=` zcs}Q`!#1GaJ0Fedbt%^On$7DRfQstc@6vJSP2OS%&X(3Xu$C;L#3WX&$Iu(|QrQOR zi5<-Pn#d~0^%dj=$v%n7u^JisIKfy;`9_9{iE z#=ZE@O!$9H1nZ{}!05-$g8b?ATi~6<}>9#|!C>_fY3}M~Co7Y-`d7V%x zp}M8@WUy`kIBnASZUiGV&DgCD=-LzNe+ZiANn6^(Ht$#NP(QUbPgVnZ>JsXSQE6GE zGd+t8+-RTefenHZXxH0Vj)<1u3$)80WFXL*wcPv|6?CPJ{$Rp9!xKAJ;9t%*%F3MPDLz?9V=eMC64(UhH>=g zh|&d(i@)K=bTXsYCfC~VrDSK&f56f!QpI)8li&w0{vl@4X z!O>JU>CysV4_ytlmxV~0e|28?)Ggd?3sM7PE~sWm>N8dN8=)^bV%(H}^n>Z$QWfvh z4QH7rrUiMUL5~()1mv%6nTk0QlJ@Gu_Aax;AXEC2nlRV-zsxq&l!58p&GA@vx0b=o z=p6(4s(N7vk}J1R>SS}<%BOXK@{GepHu)hTWJb{alc6_#CkoHrLz#)5ertH*LH|i3wUIQ zagvySC@wR;irAjY=yyTEe|5?!xq(th%q&t%38VoY1v>!f)SJ6cJV4EtDmLdMA*26P zC|O#xT@{v`Du%BXqJZ|>+xR&sfc`i0`~Tk=G73^QJj9cK5@xPv4MjJ79V?SpNO_#9 zu~fwJ5yaZKD;nC^FC2+%HVkY;^U;DOqU}cD(#p96YJy}p0AU+4Dhv*;LhW{vNqKkv zC{Op90p#|Mw!d< zE@^vf?JBoP+=LER^+G=-=YS|9;K=e#gWg^M zv(lg9z7xjeXMCkM5zC(##p^RT7*ypaWIA@u@|YicKG7w#t0ESJ zJ-M&l^4`?=Ign!g-tM{qp*%dA1enHl=vi0!&Q-mi0?w+QA%XWmO+75X?J~sXgm;=b0d^1}w)U9iuMj z{aNBBnY53~e(dyl1R^G%L&1U?&b1k^4HU1+@d@;|C$~9K%{)SDwDxGNRNslXw$ydo z%bhCsZEVZg4nMX^o}o6oQ#+BF-SeNetUb@FN;Vez@7!ouTCwl`Mqsap-ie^aaJc=6 zk>!=2&rRiwyKywD3TnG5-u2oBX79RU|6>G~SYym@LdU_49*5@$bH}eCOt(s`w*|jO zO8XvnsA?hDD0^TlyToPQRX~nfU`?lYOESKExp~%#OgyeSc}P%cyiawpqgKc80$W>n z#j(KtusB$-dUup5wiGX0<4$X?sD2dJ>B8IsTK4igoyH8JwO|^d$SX8xVgk;qDCAga zhxB-U$=S$Hckrtleua4Zo3+_xrq=_A?*n=C0t zq=Hr)ZM6LPM5j)ps29G%0Y#(|AtFVQ!A_hZr?AHN8)ZA=GV8f#f<&Ue=1$Fi+cu~R zH`|gWXduRI%{{y+ckO#=RO2srlllX|?oCZ^mh4>R1iw}`^b9LK6mX?)Po#_`?|ozS zZ2yThs~Z&mvSs9o+ViIBaqFJo3CcM|yO4=~6C?e2YZuPozH8PjXXl>9?>cb2t-QwSIQ^?Mz_Q|5+kh`+~w+0z|WfR)o uYgM~s{=uq_HmAT@PLAf3Cbg6WvUi&9?DnP0L literal 3031 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 From 137ad32d85db502a97a6c6848c31a6412f79ec41 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Sat, 25 Feb 2023 19:19:53 +0100 Subject: [PATCH 06/89] match new screenshot for clock info --- apps/bwclklite/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/bwclklite/README.md b/apps/bwclklite/README.md index 974411be0..1ad320894 100644 --- a/apps/bwclklite/README.md +++ b/apps/bwclklite/README.md @@ -5,9 +5,9 @@ This is a fork of a very minimalistic clock. ## Features The BW clock implements features that are exposed by other apps through the `clkinfo` module. -For example, if you install the HomeAssistant app, this menu item will be shown if you first -touch the bottom of the screen and then swipe left/right to the home assistant menu. To select -sub-items simply swipe up/down. To run an action (e.g. trigger home assistant), simply select the clkinfo (border) and touch on the item again. See also the screenshot below: +For example, if you install the Simple Timer app, this menu item will be shown if you first +touch the bottom of the screen and then swipe left/right to the Simple Timer menu. To select +sub-items simply swipe up/down. To run an action (e.g. add 5 min), simply select the clkinfo (border) and touch on the item again. See also the screenshot below: ![](screenshot_3.png) From 3bec7ffcdb00c50168018b18322cda00c98ca2d9 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Sat, 25 Feb 2023 19:21:41 +0100 Subject: [PATCH 07/89] Indentation --- apps/bwclklite/ChangeLog | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/bwclklite/ChangeLog b/apps/bwclklite/ChangeLog index 8b79a4c4e..c728997da 100644 --- a/apps/bwclklite/ChangeLog +++ b/apps/bwclklite/ChangeLog @@ -31,7 +31,6 @@ clkinfo.addInteractive that would cause ReferenceError. 0.29: use setItem of clockInfoMenu to change the active item 0.30: Use widget_utils 0.31: Use clock_info module as an app -0.32: Diverge from BW Clock. Change out the custom font for a standard bitmap - one to speed up loading times. Remove invertion of theme as this doesn't - work very well with fastloading. Do an quick inital fillRect on the - clock info area. +0.32: Diverge from BW Clock. Change out the custom font for a standard bitmap one to speed up loading times. + Remove invertion of theme as this doesn'twork very well with fastloading. + Do an quick inital fillRect on theclock info area. From f5211fff10e559cf4694449bc0f32621ba3221d4 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sat, 25 Feb 2023 19:30:42 +0100 Subject: [PATCH 08/89] use screenshot with widgets --- apps/bwclklite/screenshot.png | Bin 2022 -> 2489 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/bwclklite/screenshot.png b/apps/bwclklite/screenshot.png index e5eee966040bddbe4dfaa92bf2705fec429760c1..28983c9c44158b1929ef0d8a890321992dc3990f 100644 GIT binary patch literal 2489 zcmds(dpOf?8^C8KLo&xn&U+m)ksMOZLPq3#m{UJie#K}tWWPBK-%4Z-Z%C4D2^};> zV)CQDl|%HhlBOJ&L(Z9sRl;xm|Ni&>_ukj_-1qfd&wbz5bwAhhdG7m)x2KD|tcENE z0+Dw;>f|f7b-x#Un^<$WQ((a zOAH`x!FW5aaBFLJ@eapR3t2%ofLYD-E-s#tEU?v#$Z6n+hL_g9Z|Q8>>t=wHE6t>``i&G` z3(AfKcxrR31PW9<=E39IsoB@vH`ce5%;+2Hz;)5ocgGdDg*X10)|FwkZ0 zBOa9v#@ix8I^3ZR8F0oB4_>S-SZiGNM~Ym30vT)x5*z!?Tl)XO~J@f zG%IK%2HH<4ZpU%Pm%z)*`0z{$ORxJs6^n*-UvbWTH=8$Na@%sMSj$q*V+YExW+r*n zm2wVL<-m0_rv>`M2)4*CtK!md8fzm(K^oAihEcS3lTTzcnO(pGqOSNgixAh5{!Xbx zN%`}aH4Mm;$YIekvd{UK%0LSwl_kj{>Gk15rxG-fBeYB4Fd}5EoyHBo3rgEp_q4~f zVKHS(Rio!D*5z$78*}>esntQ~Z?d1-tKN-1djU*#);pi(m+9 z53zgC{QRaRwvyP6TBi_lw$GA}{0CH(KbN#*+oa5qJ6pP{ZgiG>n2W-DWSq9#6yJ z1lU`O%?g9j{?lt(39{wKZQX84lvEbMO;2Q#E`hNaMcce8O&Q>n|LG$z8^v7Wtr7k; zIfnzT-f_9*gh(9W=9_=3W&6W1A2}bgON)A2_|)PWAB8}?HmnK0v7XYR+8khe>>i)0 zW`iCNPQ$&VjW?|M#1FgMdSlr=>n` zFA>sYwjSXe|Xe8c5NuS()%J+(*0UUZ= zMt3jtsbX`|x`)#XKHL{v8zACD`vg81w#@SQWe+@Ptnhg ziy=LBtWj;SW~qAB>~Txy|Kv3tsabv06!@4rEFTWENd{G=6+tQ{oThV`=CC|NlMy23 zK~mAtn%IzGqZ5o}bDM4rDurn*;oNbhXIC#n)wVQhMwP1bB;jxhMYdd5IAUG&J#bi8 z7!a4ck;Ep5pTKx7f3{;^uVORLzaA?3=r-^#D7*|-YDI(Vl67jGJoM8+*ITY{Ga>)= zki4~(^5tp~-3kFWN(Vn4l__zB0G7l;bQuJii83G^)3+iN4Hjd31K7N>sx)8 zsc_P`HuyXrR4ebs>KOFjYgJ1Xv*)q)!}zN6bfXYehl_g1bGc$=!pS)7PDn^+O5dH$ zbetGHTlJ%a@hU7DwgY2ugEsN*=KzI2-%QiiQUIRHI9=R8ubkGAhN6V8B$^PaJKebI zYv6pYh_b6uDX-^2;SXXWQGva~n{-!glepq<7JcX%Ysl;%M}yav;Vpfy$xm+U5!D3Q z$msDRAsK8L_1^VvOI z^~JS;+n>B+oCW*tNAU(P4^&M`xLja2iA{5^G?VAqU W-{ce}`{?&9264rCI@LN7F8l*+;e2@j literal 2022 zcmeHIdo+{@6dzxo`c#-np@_`HNTQ*qkyo=sFO8Yxo$`h4K}Iafc&p8$ z`5M_`6n&|TRIH-(klDPpLh>3Bv(wo>_pkkP&)IvZi@1t>u!+=D^GAg%fzl>`i@Ik6z6oPhS9#b6etJK67GMF$M$ zw?`7zEma*>C=P~g&Kx?fUn4o2f{pCYi(h4QuB3=hCWqJiS=0y=(=eJ1BGBFby7mbj z6_B1RQd=|n@(E)cN?qWqWhWEm2nKMvi*B1FpuU!d&j=eeLR~R%O~CeC21mau7XyUV zpRg97B=Hs%@O|vJg9b34a|D3yPL9Ro-s_&9qYqEclt0`~h3>ZbxPD#^Un@4|FH`|r zi@wvgq&4Qbt{-<#LoL^`n^@Q`#$~cta5Ya24rV>G1G)Gy@M*M*AQTK9;tyPA=Nf!~ z-t9cHMjKuvvt4-}4X>SVQCd5~s6OIWZ6*kNMeu!1a()W9csPOC8)Fi&T~aML-n`!h zGA}*65YN+U&&BjtA)#Qu>uHZ8>dBE_AlJ%gS+Qd>nzL&g?4L4r)IY2tTZCw`MK;ho z{Diy>=iNJTipAnMGzYCe@D-sriZhUk2};t{H`)*M^ti{V9=Z@V z_icZJ=8N_6W66mbjF=_-$b3>z=|uLU6>znq;V07%>oQDZu+d|HpdelJRYWbM*fM30 z6Sl#`1txQTz!O!2{D99%!|_kw%S$OOj6rmoqyloqab9p-4^g^8NL~ixrf-g$IB-BZ zXK-hUywzrQ;$U}Gr$pXbDWA-FBaPB$pA85MJn@A_5JOWIOW~k*xuw|YttBgk%VD8e z6YzcqCntSzWwlRB*Xvi8E*Vi78x+{Vx}bvly3eRKCkOI9FJj@)r<`9yOh_ z2lgSEFR~6Cucu21yu>1W)=j9su`DX~>QvNIzD51qM3a1C%d!*{GLO$nMTsS*f|muW z-`H%5`+RGxyj}wSIjk76>3HiFcDE(in)^+SVgvg(-2uI`q+YM;1E3)jGs+=4Ga|>a zJ|?y|Q~Yu^#r391fxpxkt)L)v+>tz#TaxJ}3z~U9JNnueQoY~ox%08%g&i_eNh{xq zxe>IOjw+3at#Ty+ZF|j_vTc5kbL}y3rk!Vqh6-5lAnUplh$X362M=KF{(TTJ>}l`G zIPAUN=SOuHk>Z34q~SVipmO-2*kuVDZB03 zNnY&ot&I|o?rh<0O+J(tzAS`Cml5BF^zAP@8CW-4x%PR*g$HWilM;MMQQJZ8$JwtP zvm~5kfg$OF%uecWL}C0uBW1^!nXljF(hnL3JymeepY zYY%~6Y476|H4X0h>43}b`1{Bd<=CP*P6Q3I8IH|#TJcNe!AtQsLEkqc+gxSBf4Nh79zU#j{P7ca`S1j5D)yu0&$ zOwoaH-raiHmK5_x%#2XQs-s}qEXW`99Gv1toN?pGi3-M&s|_OEj}D?L=PMT_<+jv7 zaRu_m3LrK-*L%J8?;d2e)aF~CMD)Ss!awp*SNkfA7jp3hO;p^9#_O!UEL5gfUa{$A zN$A>pMa8$%P_uPC3i8&;4N2Qq~FaLY^jVIhnv@!(eay6{%VYq1JfR%aZdjQ DNjG3t From 4324cbd4c1af70c59b844eb1de7d8d7b556f2dcc Mon Sep 17 00:00:00 2001 From: dapgo Date: Tue, 28 Feb 2023 12:04:00 +0100 Subject: [PATCH 09/89] helloworld compat improvements minor improvements and bjs2 --- apps/helloworld/README.md | 38 ++++-- apps/helloworld/helloworld.app.js | 219 ++++++++++++++++++++++++++++++ apps/helloworld/metadata.json | 7 +- apps/helloworld/screenshot.png | Bin 0 -> 5193 bytes apps/helloworld/ss_emul_BJS1.png | Bin 0 -> 5193 bytes apps/helloworld/ss_emul_BJS2.png | Bin 0 -> 3422 bytes 6 files changed, 253 insertions(+), 11 deletions(-) create mode 100644 apps/helloworld/helloworld.app.js create mode 100644 apps/helloworld/screenshot.png create mode 100644 apps/helloworld/ss_emul_BJS1.png create mode 100644 apps/helloworld/ss_emul_BJS2.png diff --git a/apps/helloworld/README.md b/apps/helloworld/README.md index 370ec349b..0617a9450 100644 --- a/apps/helloworld/README.md +++ b/apps/helloworld/README.md @@ -3,7 +3,6 @@ A cross cultural hello world!/hola mundo! app The most common testing sentence in several languages ;) - ## Pictures: Launcher icon @@ -14,6 +13,10 @@ Screen - Spanish ![](helloworld_es.png) +Screenshot BJS2 emul + +![](ss_emul_BJS2.png) + Screen - English ![](helloworld_en.png) @@ -22,6 +25,10 @@ Screen - Japanese ![](helloworld_jp.png) +Screenshot BJS1 emul + +![](ss_emul_BJS1.png) + ## Usage @@ -31,17 +38,32 @@ interact to change language, color or quit. ## Features -Colours, all inputs , graph, widgets loaded -Counter for Times Display + - Compatible Bangle.js1 Bangle.js2 + - Bottom Widget compatible + - Change FG/BG colors, + - Usage of many input events -## Controls +## Pending/future Features +- replace UI hardcoded colors for dynamic based on theme +- BJS2 change BTN1 from quit to Change FG Color (conflict wit setUI?) -finger swipe -button 1,2 and 3 -touch screen left, center or right + +## Controls/UI + - Left area: Back/Exit/launcher + - BTN3 (long press)(BJS1): default Exit/kill app + + - BTN1 (BJS2): Back/Exit/launcher + - BTN1 (BJS1): Change Language + - BTN2 (BJS1): Change FG Color + - BTN3 (BJS1): Quit + + - Right area: Change BG Color + - Swipe left: Change Language + - Swipe right: Change Language ## Creator -Daniel Perez \ No newline at end of file +This app is so basic that probably the easiest is to just edit the code +Otherwise you can contact me [here](https://github.com/dapgo/my_espruino_smartwatch_things) \ No newline at end of file diff --git a/apps/helloworld/helloworld.app.js b/apps/helloworld/helloworld.app.js new file mode 100644 index 000000000..1b6684f3f --- /dev/null +++ b/apps/helloworld/helloworld.app.js @@ -0,0 +1,219 @@ +//HolaMundo v202212 +// place your const, vars, functions or classes here +{ + var contador=1; + var v_mode_debug=0; + var v_model=process.env.BOARD; + + var v_color_statictxt='#b30000'; + //var v_color_b_area='#111111'; + //orange RGB format rrggbb //white,Orange,DarkGreen,Yellow,Maroon,Blue,green,Purple,cyan,olive,DarkCyan,pink + var a_colors= Array(0xFFFF,0xFD20,0x03E0,0xFFE0,0x7800,0x001F,0x07E0,0x780F,0x07FF,0x7BE0,0x03EF,0xF81F); + + var x_max_screen=g.getWidth(); + var y_max_screen=g.getHeight(); + var y_wg_bottom=g.getHeight()-25; + var y_wg_top=25; + + //EMSCRIPTEN,EMSCRIPTEN2 +if (v_model=='BANGLEJS'||v_model=='EMSCRIPTEN') { + var v_color_lines=0xFFFF; //White hex format + var v_color_text=0x07E0; + var v_font1size=10; //out of quotes + var v_font2size=12; + var v_font_banner_size=30; + var v_font3size=12; + var x_btn_area=215; + var x_max_usable_area=x_btn_area;//Pend! only for bangle.js + var y_btn2=124; //harcoded for bangle.js cuz it is not the half of display height + var graph_y=120; + var box_x2=195; + var box_y2=150; + }else{ //BJS2 + //176x176 + var v_color_lines="#000"; //White hex format + var v_color_text="#000"; + var v_font1size=9; //out of quotes + var v_font2size=9; + var v_font_banner_size=16; + var v_font3size=8; + //g.setColor("#000"); //black or dark + x_max_usable_area=176; + var graph_y=60; + var box_x2=128; + var box_y2=104; + } + if (v_mode_debug>0) console.log("device="+v_model); + var v_arraypos=0; + var v_acolorpos=0; //for fg + var v_aBGcolorPos=5; //for bg + var a_string1 = Array('hola', 'hello', 'saluton', 'ola','ciao', 'salut','czesc','konnichiwa'); + var a_string2 = Array('mundo!', 'world!', 'mondo!','mundo!','mondo!','monde!','swiat!','sekai!'); + + +} + if (v_mode_debug>0) { + console.log("*** UI dimensions***"); + console.log("x="+x_max_screen); + console.log("y_wg_bottom="+y_wg_bottom); + } + + // special function to handle display switch on + Bangle.on('lcdPower', (on) => { + if (on) { + contador=contador+1; + PrintHelloWorld(); + // call your app function here + // If you clear the screen, do Bangle.drawWidgets(); + } + }); + + //Clear/fill dynamic area except widget area, right and bottom status line + function ClearActiveArea(){ + g.setColor(a_colors[v_aBGcolorPos]); //dynamic color + g.fillRect(0,y_wg_top,box_x2,box_y2); + g.flip(); + } + + function DrawBangleButtons(){ + g.setFontVector(v_font1size); + g.setColor(v_color_lines);//White + + g.drawString("Lang", x_max_screen-g.stringWidth("Lang"),y_wg_top+v_font1size+1); + //above Btn2 + //g.setFontVector(v_font1size).drawString("Off", x_max_screen-g.stringWidth("Off"),y_btn2-(2*v_font1size)); + g.drawString("Color", x_max_screen-g.stringWidth("Color"),y_btn2-v_font1size); + //above Btn3 + g.drawString("Quit", x_max_screen-g.stringWidth("Quit"),y_wg_bottom-(2*v_font1size)); + g.flip(); + g.setColor(v_color_text); //green + g.setFontVector(v_font1size); + g.drawString("B1", x_max_screen-g.stringWidth("B1"),y_wg_top); + g.drawString("B2", x_max_screen-g.stringWidth("B2"),y_btn2); + g.drawString("B3",x_max_screen-g.stringWidth("B3"),y_wg_bottom-v_font1size); + g.flip(); +} + +function DrawBottomInfoBanner(){ +/* External Vars:v_color_text,v_font2size,x_max_usable_area,y_wg_bottom +*/ + g.setColor(v_color_text); + var info_text1="Swipe <- -> (Lang)"; + //var info_text2="Touch: Left=Up Right=Down"; + //aligned left of max usable area + g.setFontVector(v_font2size); + //g.drawString(info_text2, x_max_usable_area-g.stringWidth(info_text2)-2 ,y_wg_bottom-(2*v_font2size)); + g.drawString(info_text1, x_max_usable_area-g.stringWidth(info_text1)-2 ,y_wg_bottom-v_font2size); + g.flip(); +} + + //function Graphics.setColor(r, g, b) binary + // banglejs.com/reference#l_Graphics_setColor + + function PrintHelloWorld(){ + ClearActiveArea(); //except widgets and bottom + + if (v_mode_debug>0) console.log("drawing a "+a_string1[v_arraypos]+" "+a_string2[v_arraypos]); + + g.setColor(a_colors[v_acolorpos]); //dynamic color + g.setFont("Vector",v_font_banner_size); + g.drawString(a_string1[v_arraypos],2,55); + //line below 2nd string + g.drawLine(10, 149, 150, 149); + g.flip(); + + g.setColor(a_colors[v_acolorpos+1]); //dynamic color + g.drawString(a_string2[v_arraypos],5,85); + g.flip(); + + g.setFont("Vector",v_font3size); + g.setColor(v_color_statictxt); + g.drawString("Display on/off: "+contador ,10,box_y2+7); + //var mem=process.memory(); + //if (v_mode_debug>0) console.log("Mem free/total: "+mem.free+"/"+mem.total); + g.flip(); + } + + function PrintMainStaticArea(){ + g.setColor(v_color_statictxt); + g.setFont("Vector",v_font3size); + g.drawString("#by DPG #bangle.js",10,box_y2+5+(v_font3size*2)); + g.drawString("#javascript #espruino",10,box_y2+5+(v_font3size*3)); + + var img_obj_RedHi = { + width : 40, height : 40, bpp : 4, + transparent : 0, + buffer : require("heatshrink").decompress(atob("AFkM7vd4EAhoTNhvQhvcgHdAQIAL5oWCFIPdExo+CEoIZCABI0DhvADIZhJL4IXDHRkMEAQmOCYgmOAAIOBHwImNRQgmPHgYmCUIIXMJobfB3jgCWZJNDEga1JYQQQCMYZoJJAJNDBwgTICQPdCY7lDRQx4DVIwTIHYZzEHZATFBwblDCZRKEO5ITFWAbIJCYrHBAAImICYwEB5raKCYwAMCYXc5gADE5hLDAAgTIBJLkBBJAyKHw5hKBRJJKKJSuII5Q0IhqPKCbjRKCc4AgA==")) + } + g.drawImage(img_obj_RedHi,box_x2+2,graph_y); + g.flip(); + } + + + //inc var postion for text array + function ChangeLang(dir){ + if (v_mode_debug>0) console.log("ChangeLang, dir, Prev pos: "+dir+" , "+v_arraypos); + + if ((dir==1) && (v_arraypos0)) v_arraypos--; + else if ((dir== -1) && (v_arraypos==0)) v_arraypos=a_string1.length-1; + PrintHelloWorld(); + } + + //inc var postion for color array + function ChangeColor(){ + //if (v_mode_debug>0) console.log("ChangeColor, colpos: "+v_acolorpos); + if (v_acolorpos { + if(dir == 1) ChangeLang(1); //right + else ChangeLang(-1); //left + }); + } + + if (v_mode_debug>0) console.log("**************************"); + if (v_mode_debug>0) console.log("Log: *** hola mundo app"); + g.clear(); + Bangle.loadWidgets(); + Bangle.drawWidgets(); + Bangle.setUI({ + mode : "custom", + back : function() {load();} + }); + if (v_model=='BANGLEJS'||v_model=='EMSCRIPTEN') DrawBangleButtons(); + DrawBottomInfoBanner(); + UserInput(); + PrintMainStaticArea(); + PrintHelloWorld(); + \ No newline at end of file diff --git a/apps/helloworld/metadata.json b/apps/helloworld/metadata.json index b8fe1b1e3..b9dec6b52 100644 --- a/apps/helloworld/metadata.json +++ b/apps/helloworld/metadata.json @@ -2,14 +2,15 @@ "id": "helloworld", "name": "hello, world!", "shortName": "hello world", - "version": "0.02", + "version": "0.03", "description": "A cross cultural hello world!/hola mundo! app with colors and languages", "icon": "app.png", "tags": "input,interface,buttons,touch", - "supports": ["BANGLEJS"], + "screenshots": [{"url":"screenshot.png"}], + "supports": ["BANGLEJS","BANGLEJS2"], "readme": "README.md", "storage": [ - {"name":"helloworld.app.js","url":"app.js"}, + {"name":"helloworld.app.js","url":"helloworld.app.js"}, {"name":"helloworld.img","url":"app-icon.js","evaluate":true} ] } diff --git a/apps/helloworld/screenshot.png b/apps/helloworld/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..32cbd4ff37148d772cff92ea25ea5646aabab4d2 GIT binary patch literal 5193 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 Date: Sat, 4 Mar 2023 12:35:13 -0500 Subject: [PATCH 10/89] [draguboard] Create draguboard app from dragboard --- apps/draguboard/ChangeLog | 1 + apps/draguboard/README.md | 8 ++ apps/draguboard/app.png | Bin 0 -> 9180 bytes apps/draguboard/lib.js | 147 +++++++++++++++++++++++++++++++++ apps/draguboard/metadata.json | 15 ++++ apps/draguboard/screenshot.png | Bin 0 -> 16421 bytes apps/draguboard/settings.js | 44 ++++++++++ 7 files changed, 215 insertions(+) create mode 100644 apps/draguboard/ChangeLog create mode 100644 apps/draguboard/README.md create mode 100644 apps/draguboard/app.png create mode 100644 apps/draguboard/lib.js create mode 100644 apps/draguboard/metadata.json create mode 100644 apps/draguboard/screenshot.png create mode 100644 apps/draguboard/settings.js diff --git a/apps/draguboard/ChangeLog b/apps/draguboard/ChangeLog new file mode 100644 index 000000000..a228aab54 --- /dev/null +++ b/apps/draguboard/ChangeLog @@ -0,0 +1 @@ +0.01: New App based on dragboard, but with a U shaped drag area diff --git a/apps/draguboard/README.md b/apps/draguboard/README.md new file mode 100644 index 000000000..2386c7658 --- /dev/null +++ b/apps/draguboard/README.md @@ -0,0 +1,8 @@ +Swipe along the drag bars and release to select a letter, number or punctuation. + +Tap on left for backspace or right for space. + +Settings: +- ABC Color: color of the characters row +- Num Color: color of the digits and symbols row +- Highlight Color: color of the currently shown character diff --git a/apps/draguboard/app.png b/apps/draguboard/app.png new file mode 100644 index 0000000000000000000000000000000000000000..ae7262b47746c2bc8db95e4067eec233a15a8702 GIT binary patch literal 9180 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 g.toColor(`#${settings[param].toString(16).padStart(3,0)}`); + var BGCOLOR = g.theme.bg; + var HLCOLOR = settings.Highlight ? paramToColor("Highlight") : g.theme.fg; + var ABCCOLOR = settings.ABC ? paramToColor("ABC") : g.toColor(1,0,0);//'#FF0000'; + var NUMCOLOR = settings.Num ? paramToColor("Num") : g.toColor(0,1,0);//'#00FF00'; + var BIGFONT = '6x8:3'; + var SMALLFONT = '6x8:1'; + + var LEFT = "IJKLMNOPQ"; + var MIDDLE = "ABCDEFGH"; + var RIGHT = "RSTUVWXYZ"; + var MIDPADDING = 35; + + var NUM = ' 1234567890!?,.-@'; + var NUMPADDING = ((R.x2)-6*NUM.length)/2; + var showCharY = (R.y2)/3; + var rectHeight = 40; + var vLength = LEFT.length; + var middleWidth; + var middleStart; + var topStart = R.y+12; + + g.setFontAlign(-1, -1, 0); + + function drawAbcRow() { + g.clear(); + try { // Draw widgets if they are present in the current app. + if (WIDGETS) Bangle.drawWidgets(); + } catch (_) {} + g.setColor(ABCCOLOR); + g.setFont('6x8:2x1'); + g.drawString(RIGHT.split("").join("\n\n"), R.x2-28, topStart); + g.drawString(LEFT.split("").join("\n\n"), 22, topStart); + g.setFont('6x8:1x2'); + var spaced = MIDDLE.split("").join(" "); + middleWidth = g.stringWidth(spaced); + middleStart = (R.x2-middleWidth)/2; + g.drawString(spaced, (R.x2-middleWidth)/2, (R.y2)/2); + g.fillRect(MIDPADDING, (R.y2)-26, (R.x2-MIDPADDING), (R.y2)); + g.fillRect(0, R.y, 12, R.y2); + g.fillRect(R.x2, R.y, R.x2-12, R.y2); + } + + function drawNumRow() { + g.setFont('6x8:1x2'); + g.setColor(NUMCOLOR); + g.drawString(NUM, NUMPADDING, (R.y2)/4); + g.drawString("<-", NUMPADDING+10, showCharY+5); + g.drawString("->", R.x2-(NUMPADDING+20), showCharY+5); + + g.fillRect(NUMPADDING, (R.y2)-rectHeight*4/3, (R.x2)-NUMPADDING, (R.y2)-rectHeight*2/3); + } + + function updateTopString() { + g.setFont(SMALLFONT); + g.setColor(BGCOLOR); + g.fillRect(0,4+20,176,13+20); + var rectLen = text.length<27? text.length*6:27*6; + g.setColor(0.7,0,0); + //cursor position + g.fillRect(rectLen+5,4+20,rectLen+10,13+20); + g.setColor(HLCOLOR); + g.drawString(text.length<=27? text.substr(-27, 27) : '<- '+text.substr(-24,24), 5, 5+20); + } + + var charPos; + var char; + var prevChar; + + function showChars(char) { + "ram"; + + // clear large character + g.setColor(BGCOLOR); + g.fillRect(65,showCharY,R.y2-65,showCharY+28); + + // show new large character + g.setColor(HLCOLOR); + g.setFont(BIGFONT); + g.drawString(char, (R.x2)/2 - g.stringWidth(char)/2, showCharY +4); + } + + function moveCharPos(list, select, posPixels) { + charPos = Math.min(list.length-1, Math.max(0, Math.floor(posPixels))); + char = list.charAt(charPos); + + if (char != prevChar) showChars(char); + prevChar = char; + + if (select) { + text += char; + updateTopString(); + } + } + + drawAbcRow(); + drawNumRow(); + updateTopString(); + + return new Promise((resolve,reject) => { + // Interpret touch input + Bangle.setUI({ + mode: 'custom', + back: ()=>{ + Bangle.setUI(); + g.clearRect(Bangle.appRect); + resolve(text); + }, + drag: function(event) { + "ram"; + + // drag on middle bottom rectangle + if (event.x > MIDPADDING - 2 && event.x < (R.x2-MIDPADDING + 2) && event.y >= ( (R.y2) - 12 )) { + moveCharPos(MIDDLE, event.b == 0, (event.x-middleStart)/(middleWidth/MIDDLE.length)); + } + // drag on left or right rectangle + else if (event.y > R.y && (event.x < MIDPADDING-2 || event.x > (R.x2-MIDPADDING + 2))) { + moveCharPos(event.x ( (R.y2) - 52 ))) { + moveCharPos(NUM, event.b == 0, (event.x-NUMPADDING)/6); + } + // Make a space or backspace by tapping right or left on screen above green rectangle + else if (event.y > R.y && event.b == 0) { + if (event.x < (R.x2)/2) { + showChars('<-'); + text = text.slice(0, -1); + } else { + //show space sign + showChars('->'); + text += ' '; + } + prevChar = null; + updateTopString(); + } + } + }); + }); + }; diff --git a/apps/draguboard/metadata.json b/apps/draguboard/metadata.json new file mode 100644 index 000000000..926e36807 --- /dev/null +++ b/apps/draguboard/metadata.json @@ -0,0 +1,15 @@ +{ "id": "draguboard", + "name": "DragUboard", + "version":"0.01", + "description": "A library for text input via swiping U-shaped keyboard.", + "icon": "app.png", + "type":"textinput", + "tags": "keyboard", + "supports" : ["BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"textinput","url":"lib.js"}, + {"name":"draguboard.settings.js","url":"settings.js"} + ] +} diff --git a/apps/draguboard/screenshot.png b/apps/draguboard/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f2cb91717924b3fa94afa9a81de13c122b91b320 GIT binary patch literal 16421 zcmeHubx>SQ_vXOh?!kk*!{F}j4#5YP!3plcT@u{godgIFoZu4No!}lMOWx0Gw`%KG zwfo;UbMKw$)8{;W&eNxRZr|#OR8^KiMIuB3005|RvXbhrpLKsu1i060ZR?H^0Kl;3 zt*Ps#Zt6(}adEP=u?Lg6y@!Cwz+N_%0D#w0ah8<_Rclh%Z*yEH#B)o&y8Z8HmJe6& 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 require('Storage').write('draguboard.json', settings); + function colorMenu(key) { + let menu = {'': {title: key}, '< Back': () => E.showMenu(appMenu)}; + Object.keys(colors).forEach(color => { + var label = colors[color]; + menu[label] = { + value: settings[key] == color, + onchange: () => { + if (color >= 0) { + settings[key] = color; + } else { + delete settings[key]; + } + save(); + setTimeout(E.showMenu, 10, appMenu); + } + }; + }); + return menu; + } + + const appMenu = { + '': {title: 'draguboard'}, '< Back': back, + /*LANG*/'ABC Color': () => E.showMenu(colorMenu("ABC")), + /*LANG*/'Num Color': () => E.showMenu(colorMenu("Num")), + /*LANG*/'Highlight Color': () => E.showMenu(colorMenu("Highlight")) + }; + + E.showMenu(appMenu); +}); \ No newline at end of file From 211f3c3113af0cbd25c22434fd8a1e5aedd0c46b Mon Sep 17 00:00:00 2001 From: lauzonhomeschool <85599144+lauzonhomeschool@users.noreply.github.com> Date: Sat, 4 Mar 2023 23:06:13 -0500 Subject: [PATCH 11/89] [draguboard] fix initialization of appRect --- apps/draguboard/lib.js | 288 +++++++++++++++++++++-------------------- 1 file changed, 147 insertions(+), 141 deletions(-) diff --git a/apps/draguboard/lib.js b/apps/draguboard/lib.js index 8bc9a76a8..e1dbcfc2c 100644 --- a/apps/draguboard/lib.js +++ b/apps/draguboard/lib.js @@ -1,147 +1,153 @@ exports.input = function(options) { - options = options||{}; - var text = options.text; - if ("string"!=typeof text) text=""; - let settings = require('Storage').readJSON('draguboard.json',1)||{} - - var R = Bangle.appRect; - const paramToColor = (param) => g.toColor(`#${settings[param].toString(16).padStart(3,0)}`); - var BGCOLOR = g.theme.bg; - var HLCOLOR = settings.Highlight ? paramToColor("Highlight") : g.theme.fg; - var ABCCOLOR = settings.ABC ? paramToColor("ABC") : g.toColor(1,0,0);//'#FF0000'; - var NUMCOLOR = settings.Num ? paramToColor("Num") : g.toColor(0,1,0);//'#00FF00'; - var BIGFONT = '6x8:3'; - var SMALLFONT = '6x8:1'; - - var LEFT = "IJKLMNOPQ"; - var MIDDLE = "ABCDEFGH"; - var RIGHT = "RSTUVWXYZ"; - var MIDPADDING = 35; - - var NUM = ' 1234567890!?,.-@'; - var NUMPADDING = ((R.x2)-6*NUM.length)/2; - var showCharY = (R.y2)/3; - var rectHeight = 40; - var vLength = LEFT.length; - var middleWidth; - var middleStart; - var topStart = R.y+12; - - g.setFontAlign(-1, -1, 0); - - function drawAbcRow() { - g.clear(); - try { // Draw widgets if they are present in the current app. - if (WIDGETS) Bangle.drawWidgets(); - } catch (_) {} - g.setColor(ABCCOLOR); - g.setFont('6x8:2x1'); - g.drawString(RIGHT.split("").join("\n\n"), R.x2-28, topStart); - g.drawString(LEFT.split("").join("\n\n"), 22, topStart); - g.setFont('6x8:1x2'); - var spaced = MIDDLE.split("").join(" "); - middleWidth = g.stringWidth(spaced); - middleStart = (R.x2-middleWidth)/2; - g.drawString(spaced, (R.x2-middleWidth)/2, (R.y2)/2); - g.fillRect(MIDPADDING, (R.y2)-26, (R.x2-MIDPADDING), (R.y2)); - g.fillRect(0, R.y, 12, R.y2); - g.fillRect(R.x2, R.y, R.x2-12, R.y2); + options = options||{}; + var text = options.text; + if ("string"!=typeof text) text=""; + let settings = require('Storage').readJSON('draguboard.json',1)||{}; + + var R; + const paramToColor = (param) => g.toColor(`#${settings[param].toString(16).padStart(3,0)}`); + var BGCOLOR = g.theme.bg; + var HLCOLOR = settings.Highlight ? paramToColor("Highlight") : g.theme.fg; + var ABCCOLOR = settings.ABC ? paramToColor("ABC") : g.toColor(1,0,0);//'#FF0000'; + var NUMCOLOR = settings.Num ? paramToColor("Num") : g.toColor(0,1,0);//'#00FF00'; + var BIGFONT = '6x8:3'; + var SMALLFONT = '6x8:1'; + + var LEFT = "IJKLMNOPQ"; + var MIDDLE = "ABCDEFGH"; + var RIGHT = "RSTUVWXYZ"; + + var NUM = ' 1234567890!?,.-@'; + var rectHeight = 40; + var vLength = LEFT.length; + var MIDPADDING; + var NUMPADDING; + var showCharY; + var middleWidth; + var middleStart; + var topStart; + g.setFontAlign(-1, -1, 0); + + function drawAbcRow() { + g.clear(); + try { // Draw widgets if they are present in the current app. + if (WIDGETS) Bangle.drawWidgets(); + } catch (_) {} + g.setColor(ABCCOLOR); + g.setFont('6x8:2x1'); + g.drawString(RIGHT.split("").join("\n\n"), R.x2-28, topStart); + g.drawString(LEFT.split("").join("\n\n"), R.x+22, topStart); + g.setFont('6x8:1x2'); + var spaced = MIDDLE.split("").join(" "); + middleWidth = g.stringWidth(spaced); + middleStart = (R.x2-middleWidth)/2; + g.drawString(spaced, (R.x2-middleWidth)/2, (R.y2)/2); + g.fillRect(MIDPADDING, (R.y2)-26, (R.x2-MIDPADDING), (R.y2)); + // Draw left and right drag rectangles + g.fillRect(R.x, R.y, 12, R.y2); + g.fillRect(R.x2, R.y, R.x2-12, R.y2); + } + + function drawNumRow() { + g.setFont('6x8:1x2'); + g.setColor(NUMCOLOR); + NUMPADDING = (R.x2-g.stringWidth(NUM))/2; + g.drawString(NUM, NUMPADDING, (R.y2)/4); + g.drawString("<-", NUMPADDING+10, showCharY+5); + g.drawString("->", R.x2-(NUMPADDING+20), showCharY+5); + + g.fillRect(NUMPADDING, (R.y2)-rectHeight*4/3, (R.x2)-NUMPADDING, (R.y2)-rectHeight*2/3); + } + + function updateTopString() { + g.setFont(SMALLFONT); + g.setColor(BGCOLOR); + g.fillRect(R.x,R.y,R.x2,R.y+9); + var rectLen = text.length<27? text.length*6:27*6; + g.setColor(0.7,0,0); + //draw cursor at end of text + g.fillRect(R.x+rectLen+5,R.y,R.x+rectLen+10,R.y+9); + g.setColor(HLCOLOR); + g.drawString(text.length<=27? text : '<- '+text.substr(-24,24), R.x+5, R.y+1); + } + + function showChars(chars) { + "ram"; + + // clear large character + g.setColor(BGCOLOR); + g.fillRect(R.x+65,showCharY,R.x2-65,showCharY+28); + + // show new large character + g.setColor(HLCOLOR); + g.setFont(BIGFONT); + g.drawString(chars, (R.x2 - g.stringWidth(chars))/2, showCharY+4); + } + + var charPos; + var char; + var prevChar; + + function moveCharPos(list, select, posPixels) { + charPos = Math.min(list.length-1, Math.max(0, Math.floor(posPixels))); + char = list.charAt(charPos); + + if (char != prevChar) showChars(char); + prevChar = char; + + if (select) { + text += char; + updateTopString(); } - - function drawNumRow() { - g.setFont('6x8:1x2'); - g.setColor(NUMCOLOR); - g.drawString(NUM, NUMPADDING, (R.y2)/4); - g.drawString("<-", NUMPADDING+10, showCharY+5); - g.drawString("->", R.x2-(NUMPADDING+20), showCharY+5); - - g.fillRect(NUMPADDING, (R.y2)-rectHeight*4/3, (R.x2)-NUMPADDING, (R.y2)-rectHeight*2/3); - } - - function updateTopString() { - g.setFont(SMALLFONT); - g.setColor(BGCOLOR); - g.fillRect(0,4+20,176,13+20); - var rectLen = text.length<27? text.length*6:27*6; - g.setColor(0.7,0,0); - //cursor position - g.fillRect(rectLen+5,4+20,rectLen+10,13+20); - g.setColor(HLCOLOR); - g.drawString(text.length<=27? text.substr(-27, 27) : '<- '+text.substr(-24,24), 5, 5+20); - } - - var charPos; - var char; - var prevChar; - - function showChars(char) { - "ram"; - - // clear large character - g.setColor(BGCOLOR); - g.fillRect(65,showCharY,R.y2-65,showCharY+28); - - // show new large character - g.setColor(HLCOLOR); - g.setFont(BIGFONT); - g.drawString(char, (R.x2)/2 - g.stringWidth(char)/2, showCharY +4); - } - - function moveCharPos(list, select, posPixels) { - charPos = Math.min(list.length-1, Math.max(0, Math.floor(posPixels))); - char = list.charAt(charPos); - - if (char != prevChar) showChars(char); - prevChar = char; - - if (select) { - text += char; - updateTopString(); + } + + return new Promise((resolve,reject) => { + // Interpret touch input + Bangle.setUI({ + mode: 'custom', + back: ()=>{ + Bangle.setUI(); + g.clearRect(Bangle.appRect); + resolve(text); + }, + drag: function(event) { + "ram"; + + // drag on middle bottom rectangle + if (event.x > MIDPADDING - 2 && event.x < (R.x2-MIDPADDING + 2) && event.y >= ( (R.y2) - 12 )) { + moveCharPos(MIDDLE, event.b == 0, (event.x-middleStart)/(middleWidth/MIDDLE.length)); + } + // drag on left or right rectangle + else if (event.y > R.y && (event.x < MIDPADDING-2 || event.x > (R.x2-MIDPADDING + 2))) { + moveCharPos(event.x ( (R.y2) - 52 ))) { + moveCharPos(NUM, event.b == 0, (event.x-NUMPADDING)/6); + } + // Make a space or backspace by tapping right or left on screen above green rectangle + else if (event.y > R.y && event.b == 0) { + if (event.x < (R.x2)/2) { + showChars('<-'); + text = text.slice(0, -1); + } else { + //show space sign + showChars('->'); + text += ' '; + } + prevChar = null; + updateTopString(); + } } - } - + }); + + R = Bangle.appRect; + MIDPADDING = R.x + 35; + showCharY = (R.y2)/3; + topStart = R.y+12; + drawAbcRow(); drawNumRow(); updateTopString(); - - return new Promise((resolve,reject) => { - // Interpret touch input - Bangle.setUI({ - mode: 'custom', - back: ()=>{ - Bangle.setUI(); - g.clearRect(Bangle.appRect); - resolve(text); - }, - drag: function(event) { - "ram"; - - // drag on middle bottom rectangle - if (event.x > MIDPADDING - 2 && event.x < (R.x2-MIDPADDING + 2) && event.y >= ( (R.y2) - 12 )) { - moveCharPos(MIDDLE, event.b == 0, (event.x-middleStart)/(middleWidth/MIDDLE.length)); - } - // drag on left or right rectangle - else if (event.y > R.y && (event.x < MIDPADDING-2 || event.x > (R.x2-MIDPADDING + 2))) { - moveCharPos(event.x ( (R.y2) - 52 ))) { - moveCharPos(NUM, event.b == 0, (event.x-NUMPADDING)/6); - } - // Make a space or backspace by tapping right or left on screen above green rectangle - else if (event.y > R.y && event.b == 0) { - if (event.x < (R.x2)/2) { - showChars('<-'); - text = text.slice(0, -1); - } else { - //show space sign - showChars('->'); - text += ' '; - } - prevChar = null; - updateTopString(); - } - } - }); - }); - }; + }); +}; From ec171c81d44f12f9e436b91c55184c73ddc23b09 Mon Sep 17 00:00:00 2001 From: lauzonhomeschool <85599144+lauzonhomeschool@users.noreply.github.com> Date: Sun, 5 Mar 2023 22:39:37 -0500 Subject: [PATCH 12/89] [draguboard] setFontAlign at the last minute --- apps/draguboard/lib.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/draguboard/lib.js b/apps/draguboard/lib.js index e1dbcfc2c..258f8b02d 100644 --- a/apps/draguboard/lib.js +++ b/apps/draguboard/lib.js @@ -26,7 +26,6 @@ exports.input = function(options) { var middleWidth; var middleStart; var topStart; - g.setFontAlign(-1, -1, 0); function drawAbcRow() { g.clear(); @@ -35,6 +34,7 @@ exports.input = function(options) { } catch (_) {} g.setColor(ABCCOLOR); g.setFont('6x8:2x1'); + g.setFontAlign(-1, -1, 0); g.drawString(RIGHT.split("").join("\n\n"), R.x2-28, topStart); g.drawString(LEFT.split("").join("\n\n"), R.x+22, topStart); g.setFont('6x8:1x2'); @@ -52,6 +52,7 @@ exports.input = function(options) { g.setFont('6x8:1x2'); g.setColor(NUMCOLOR); NUMPADDING = (R.x2-g.stringWidth(NUM))/2; + g.setFontAlign(-1, -1, 0); g.drawString(NUM, NUMPADDING, (R.y2)/4); g.drawString("<-", NUMPADDING+10, showCharY+5); g.drawString("->", R.x2-(NUMPADDING+20), showCharY+5); @@ -68,6 +69,7 @@ exports.input = function(options) { //draw cursor at end of text g.fillRect(R.x+rectLen+5,R.y,R.x+rectLen+10,R.y+9); g.setColor(HLCOLOR); + g.setFontAlign(-1, -1, 0); g.drawString(text.length<=27? text : '<- '+text.substr(-24,24), R.x+5, R.y+1); } @@ -81,6 +83,7 @@ exports.input = function(options) { // show new large character g.setColor(HLCOLOR); g.setFont(BIGFONT); + g.setFontAlign(-1, -1, 0); g.drawString(chars, (R.x2 - g.stringWidth(chars))/2, showCharY+4); } From 8a3cb4480d51b90d22d0e39036833af435ef86a4 Mon Sep 17 00:00:00 2001 From: Christian Meichle Date: Mon, 6 Mar 2023 15:40:11 +0100 Subject: [PATCH 13/89] fixed typo in settings.js for DRAGDOWN that did cause the setting to not be saved correctly and hence wasn't settable --- apps/clockcal/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/clockcal/settings.js b/apps/clockcal/settings.js index 4d8be6fbd..a406f3cf7 100644 --- a/apps/clockcal/settings.js +++ b/apps/clockcal/settings.js @@ -93,7 +93,7 @@ value: actions.indexOf(settings.DRAGDOWN), format: v => actions[v], onchange: v => { - settings.DRGDOWN = actions[v]; + settings.DRAGDOWN = actions[v]; writeSettings(); } }, From b1726ea33c3205093ebc5b0400b38884c75801db Mon Sep 17 00:00:00 2001 From: Christian Meichle Date: Mon, 6 Mar 2023 15:40:11 +0100 Subject: [PATCH 14/89] fixed typo in settings.js for DRAGDOWN that did cause the setting to not be saved correctly and hence wasn't settable --- apps/clockcal/ChangeLog | 1 + apps/clockcal/metadata.json | 2 +- apps/clockcal/settings.js | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/clockcal/ChangeLog b/apps/clockcal/ChangeLog index 4c8c13366..5657bf26d 100644 --- a/apps/clockcal/ChangeLog +++ b/apps/clockcal/ChangeLog @@ -5,3 +5,4 @@ 0.05: Improved colors (connected vs disconnected) 0.06: Tell clock widgets to hide. 0.07: Convert Yes/No On/Off in settings to checkboxes +0.08: Fixed typo in settings.js for DRAGDOWN to make option work \ No newline at end of file diff --git a/apps/clockcal/metadata.json b/apps/clockcal/metadata.json index 03f5c3df2..998115827 100644 --- a/apps/clockcal/metadata.json +++ b/apps/clockcal/metadata.json @@ -1,7 +1,7 @@ { "id": "clockcal", "name": "Clock & Calendar", - "version": "0.07", + "version": "0.08", "description": "Clock with Calendar", "readme":"README.md", "icon": "app.png", diff --git a/apps/clockcal/settings.js b/apps/clockcal/settings.js index 4d8be6fbd..a406f3cf7 100644 --- a/apps/clockcal/settings.js +++ b/apps/clockcal/settings.js @@ -93,7 +93,7 @@ value: actions.indexOf(settings.DRAGDOWN), format: v => actions[v], onchange: v => { - settings.DRGDOWN = actions[v]; + settings.DRAGDOWN = actions[v]; writeSettings(); } }, From ff534827ada5a497173e7532316717e978fd78d3 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 7 Mar 2023 09:59:17 +0000 Subject: [PATCH 15/89] Fix "App Install Failed, Undefined", fix https://github.com/espruino/BangleApps/issues/2636 --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 0d02ff376..96d7ec120 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 0d02ff3763783d166ff84906af038420736aabfc +Subproject commit 96d7ec120740726b2fdc63d8c9ce760b38b3edd3 From 53b704232dc455235575eeb717e255273d51efc1 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 7 Mar 2023 11:28:15 +0000 Subject: [PATCH 16/89] Update metadata.json bump version after merge --- apps/alarm/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index 28d48daab..8522b07c0 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Alarms & Timers", "shortName": "Alarms", - "version": "0.38", + "version": "0.39", "description": "Set alarms and timers on your Bangle", "icon": "app.png", "tags": "tool,alarm", From 871566ed0bd7475eff170677698258782e0ae027 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 7 Mar 2023 11:37:35 +0000 Subject: [PATCH 17/89] Revert changes that took out localisation of the date --- apps/alarm/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 1807ce6a8..c0ae17f00 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -46,7 +46,7 @@ function getLabel(e) { const dateStr = e.date && require("locale").date(new Date(e.date), 1); return (e.timer ? require("time_utils").formatDuration(e.timer) - : (e.date ? `${e.date.substring(5,10)}${e.rp?"*":""} ${require("time_utils").formatTime(e.t)}` : require("time_utils").formatTime(e.t) + (e.rp ? ` ${decodeRepeat(e)}` : "")) + : (dateStr ? `${dateStr}${e.rp?"*":""} ${require("time_utils").formatTime(e.t)}` : require("time_utils").formatTime(e.t) + (e.rp ? ` ${decodeRepeat(e)}` : "")) ) + (e.msg ? ` ${e.msg}` : ""); } From e87e3f137b0022540b748b802199f90c916a5ea6 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 7 Mar 2023 11:41:21 +0000 Subject: [PATCH 18/89] Added handling for 'rp:true' and also debug message in case of invalid repeat type --- apps/sched/sched.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/sched/sched.js b/apps/sched/sched.js index 57876ff69..ea4c43443 100644 --- a/apps/sched/sched.js +++ b/apps/sched/sched.js @@ -84,6 +84,9 @@ function showAlarm(alarm) { let date = new Date(alarm.date); let rp = alarm.rp; switch(rp.interval) { + case true: + date.setDate(date.getDate() + 1); + break; case "day": date.setDate(date.getDate() + rp.num); break; @@ -100,6 +103,9 @@ function showAlarm(alarm) { date = new Date(date.getFullYear() + rp.num, date.getMonth(), alarm.od); if (date.getDate() != alarm.od) date.setDate(0); break; + default: + console.log(`sched: unknown repeat '${JSON.stringify(rp)}'`); + break; } alarm.date = date.toLocalISOString().slice(0,10); } From 781d7b96fd647fd4b1fcc8da3093de5f0725174c Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 7 Mar 2023 14:58:07 +0000 Subject: [PATCH 19/89] fix device ID setting so tools for Bangle.js 1 use the right ID --- bin/lib/apploader.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bin/lib/apploader.js b/bin/lib/apploader.js index 329ece7b7..c1aaa5389 100644 --- a/bin/lib/apploader.js +++ b/bin/lib/apploader.js @@ -26,8 +26,10 @@ var device = { id : DEVICEID, appsInstalled : [] }; // call with {DEVICEID:"BANGLEJS/BANGLEJS2"} exports.init = function(options) { - if (options.DEVICEID) + if (options.DEVICEID) { DEVICEID = options.DEVICEID; + device.id = options.DEVICEID; + } // Load app metadata var dirs = require("fs").readdirSync(APPSDIR, {withFileTypes: true}); dirs.forEach(dir => { From 8ca9a89dd0dc04ba6fd781da5ac2bc8a9102dead Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 7 Mar 2023 15:14:40 +0000 Subject: [PATCH 20/89] new tools.js --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 96d7ec120..2bb1e55d3 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 96d7ec120740726b2fdc63d8c9ce760b38b3edd3 +Subproject commit 2bb1e55d32d640312fe08cf54de1cd9c498cd31e From 1ca96bca9033cdee35f3f147ccc70f5905762197 Mon Sep 17 00:00:00 2001 From: Rarder44 Date: Tue, 7 Mar 2023 16:23:49 +0100 Subject: [PATCH 21/89] Fix graphic bug; View via popup while there are other open apps --- apps/messages_light/ChangeLog | 3 +- apps/messages_light/messages_light.app.js | 2 +- .../messages_light/messages_light.listener.js | 127 ++++++++++++++---- apps/messages_light/metadata.json | 2 +- 4 files changed, 107 insertions(+), 27 deletions(-) diff --git a/apps/messages_light/ChangeLog b/apps/messages_light/ChangeLog index 9c3acf0f2..23d9ba053 100644 --- a/apps/messages_light/ChangeLog +++ b/apps/messages_light/ChangeLog @@ -5,4 +5,5 @@ implemented use of the "messageicons" library removed lib no longer used 1.3: icon changed -1.4: new management of events implemented; removed code no longer used (from now the music will be managed by the Messagesgui app) \ No newline at end of file +1.4: new management of events implemented; removed code no longer used (from now the music will be managed by the Messagesgui app) +1.5: Fix graphic bug; View via popup while there are other open apps \ No newline at end of file diff --git a/apps/messages_light/messages_light.app.js b/apps/messages_light/messages_light.app.js index 94f619259..40f94dd0f 100644 --- a/apps/messages_light/messages_light.app.js +++ b/apps/messages_light/messages_light.app.js @@ -493,7 +493,7 @@ let main = function(){ Bangle.on('tap', doubleTapUnlock); Bangle.on('touch', toushScroll); - //quando apro quest'app, do per scontato che c'ĆØ un messaggio da leggere posto in un file particolare ( NewMessage.json ) + //quando apro quest'app, do per scontato che c'ĆØ un messaggio da leggere posto in un file particolare ( messages_light.NewEvent.json ) let eventToShow = require('Storage').readJSON(settings.NewEventFileName, true); require("Storage").erase(settings.NewEventFileName) if( eventToShow!==undefined) diff --git a/apps/messages_light/messages_light.listener.js b/apps/messages_light/messages_light.listener.js index 9b1158b1c..2525a52bd 100644 --- a/apps/messages_light/messages_light.listener.js +++ b/apps/messages_light/messages_light.listener.js @@ -1,42 +1,121 @@ + +let overlayTimeout=undefined; exports.listener = function(type, event) { - /* + //salva gli eventi che arrivano su file - events=require("Storage").readJSON("events_log",true) || []; + /* events=require("Storage").readJSON("events_log",true) || []; events.push ( event) - require("Storage").writeJSON("events_log",events);*/ - + require("Storage").writeJSON("events_log",events); + */ //if (event.handled) return; // already handled/app open - if( type=="music" || event.id=="music") return; //lo lascio gestire a qualcun altro + if( type=="clearAll" || type=="music" || event.id=="music") return; //lo lascio gestire a qualcun altro //se arrivo qua gestisco io //non mi preoccupo di salvare ( a meno di problemi a mantenere tanti messaggi in queue nella ram...) event.handled=true; + if( Bangle.CLOCK || global.__FILE__ === undefined || global.__FILE__ === ".bootcde" || global.__FILE__.startsWith("messages_light.")) + { + //se non ci sono app aperte ( clock oppure c'ĆØ messages_light) + //continuo con la visualizzazione dell messaggio - let callApp; - //se l'app non ĆØ aperta - if ("undefined"==typeof manageEvent) - { - if(event.t=="remove") return; //l'app non ĆØ aperta, non c'ĆØ nessun messaggio da rimuovere dalla queue -> non lancio l'app - - //chiamo la load dell'app - callApp=function(event){ - require("Storage").writeJSON("messages_light.NewEvent.json",event); - load("messages_light.app.js"); + let callApp; + //se l'app non ĆØ aperta + if ("undefined"==typeof manageEvent) + { + if(event.t=="remove") return; //l'app non ĆØ aperta, non c'ĆØ nessun messaggio da rimuovere dalla queue -> non lancio l'app + + //chiamo la load dell'app + callApp=function(event){ + require("Storage").writeJSON("messages_light.NewEvent.json",event); + load("messages_light.app.js"); + } } - } - else - { - //dico all'app di gestire l'evento - callApp=function(event){ - manageEvent(event); + else + { + //dico all'app di gestire l'evento + callApp=function(event){ + manageEvent(event); + } } - } + - - callApp(event); + callApp(event); + + + } + else{ + //TODO: BHOO!!! + //vibro e basta? + //faccio comparire un overlay veloce? + //uso l'overlay sempre? ( gestione di tutti gli eventi smadonnosa... ) + //salvo lo stato dell'app attuale( NON SO COME ), lancio la mia app e alla chiusura torno allo stato precedente? + + console.log(event); + let ovr=undefined; + let palette; + let timeout; + + if(event.id=="call" && event.t!="remove") + { + let count=3; + let idInter= setInterval(()=>{ + if(--count<=0) + clearInterval(idInter); + + Bangle.buzz(100,1); + },200); + + ovr = Graphics.createArrayBuffer(136,136,2,{msb:true}); + ovr.setColor(1).fillRect({x:0,y:0,w:135,h:135,r:8}); + ovr.setColor(2).setFont("Vector:30").setFontAlign(0,0).drawString("Call",68,20); + var lines=ovr.wrapString(event.title,136); + for(let i=0;i< lines.length;i++) + ovr.setColor(2).setFont("Vector:20").setFontAlign(0,0).drawString(lines[i],68,50+i*15); + + palette=[0,g.toColor("#141"),g.toColor("#fff"),g.toColor("#FFF")]; + timeout=4000; + } + else if(event.t=="add" || event.t=="modify") + { + Bangle.buzz(); + ovr = Graphics.createArrayBuffer(136,136,2,{msb:true}); + ovr.setColor(1).fillRect({x:0,y:0,w:135,h:135,r:8}); + ovr.setColor(2).setFont("Vector:20").setFontAlign(0,0).drawString(event.src,68,15); + ovr.setColor(2).setFont("Vector:15").setFontAlign(0,0).drawString(event.title,68,35); + var lines=ovr.wrapString(event.body,136); + for(let i=0;i< lines.length;i++) + ovr.setColor(2).setFont("Vector:15").setFontAlign(0,0).drawString(lines[i],68,60+i*15); + + + palette=[0,g.toColor("#09c"),g.toColor("#fff"),g.toColor("#FFF")]; + timeout=5000; + } + + + if(ovr===undefined) + return; + + + Bangle.setLCDPower(true); + + Bangle.setLCDOverlay({ + width:ovr.getWidth(), height:ovr.getHeight(), + bpp:2, transparent:0, + palette:new Uint16Array(palette), + buffer:ovr.buffer + },20,20); + + Bangle.setLCDPower(true); + + if(overlayTimeout) clearTimeout(overlayTimeout); + overlayTimeout=setTimeout(()=>{ + Bangle.setLCDOverlay(); + overlayTimeout=undefined; + },timeout); + } } diff --git a/apps/messages_light/metadata.json b/apps/messages_light/metadata.json index 5ec1f5a37..eeab7d9f4 100644 --- a/apps/messages_light/metadata.json +++ b/apps/messages_light/metadata.json @@ -1,7 +1,7 @@ { "id": "messages_light", "name": "Messages Light", - "version": "1.4", + "version": "1.5", "description": "A light implementation of messages App (display notifications from iOS and Gadgetbridge/Android)", "icon": "app.png", "type": "app", From 96ee2a52c8bf409a6d9d8ac0fcb08239ded91080 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 7 Mar 2023 15:44:37 +0000 Subject: [PATCH 22/89] add 2v17 firmware --- apps/fwupdate/custom.html | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/fwupdate/custom.html b/apps/fwupdate/custom.html index de972b0e8..a648030c1 100644 --- a/apps/fwupdate/custom.html +++ b/apps/fwupdate/custom.html @@ -99,6 +99,7 @@ function onInit(device) { if (crc==1038322422) version = "2v14"; if (crc==2560806221) version = "2v15"; if (crc==2886730689) version = "2v16"; + if (crc==156320890) version = "2v17"; if (!ok) { version += `(⚠ update required)`; } From d7f5f710b271a2f3797d8f724f6be15d04e8a1d0 Mon Sep 17 00:00:00 2001 From: dapgo Date: Wed, 8 Mar 2023 11:27:31 +0100 Subject: [PATCH 23/89] fix and improvements for dtlaunch fix and improvements for dtlaunch --- apps/dtlaunch/ChangeLog | 1 + apps/dtlaunch/README.md | 10 +++++++++ apps/dtlaunch/app-b1.js | 39 ++++++++++++++++++++++++++++++------ apps/dtlaunch/metadata.json | 2 +- apps/dtlaunch/sshot_e1.png | Bin 0 -> 5096 bytes 5 files changed, 45 insertions(+), 7 deletions(-) create mode 100644 apps/dtlaunch/sshot_e1.png diff --git a/apps/dtlaunch/ChangeLog b/apps/dtlaunch/ChangeLog index e0bd76eb0..1155647ab 100644 --- a/apps/dtlaunch/ChangeLog +++ b/apps/dtlaunch/ChangeLog @@ -27,4 +27,5 @@ widgets would still be loaded when they weren't supposed to. immediately follows the correct theme. 0.22: Bangle 2: Change to not automatically marking the first app on a page when moving pages. Add caching for faster startups. +0.23: Bangle 1: Fix issue with missing icons, added touch screen interactions diff --git a/apps/dtlaunch/README.md b/apps/dtlaunch/README.md index 1835bc842..ff562d9db 100644 --- a/apps/dtlaunch/README.md +++ b/apps/dtlaunch/README.md @@ -6,6 +6,10 @@ Bangle 1: In the picture above, the Settings app is selected. + +![](sshot_e1.png) + + Bangle 2: ![shot1](https://user-images.githubusercontent.com/89286474/146471756-ec6d16de-6916-4fde-b991-ba88c2c8fa1a.png) @@ -25,6 +29,12 @@ Bangle 2: **Swipe Right** - move to previous page of app icons +**Touch Left(1) area** - "Back" to Clock + +**Touch Right(2) area** - move forward through app icons + +**Touch Middle(1+2) area** - run the selected app + ## Controls- Bangle 2 **Touch** - icon to select, second touch launches app diff --git a/apps/dtlaunch/app-b1.js b/apps/dtlaunch/app-b1.js index ed9cc778e..c7e78d671 100644 --- a/apps/dtlaunch/app-b1.js +++ b/apps/dtlaunch/app-b1.js @@ -13,13 +13,13 @@ function wdog(handle,timeout){ wdog.timeout = timeout; } if(wdog.timer){ - clearTimeout(wdog.timer) + clearTimeout(wdog.timer); } - wdog.timer = setTimeout(wdog.handle,wdog.timeout) + wdog.timer = setTimeout(wdog.handle,wdog.timeout); } // reset after two minutes of inactivity -wdog(load,120000) +wdog(load,120000); var s = require("Storage"); var apps = s.list(/\.info$/).map(app=>{ @@ -49,7 +49,13 @@ function draw_icon(p,n,selected) { var y = n>2?130:40; (selected?g.setColor(0.3,0.3,0.3):g.setColor(0,0,0)).fillRect(x,y,x+79,y+89); g.setColor(g.theme.fg); - g.drawImage(s.read(apps[p*6+n].icon),x+10,y+10,{scale:1.25}); + //bad g.drawImage(s.read(apps[p*6+n].icon),x+10,y+10,{scale:1.25}); + if ((apps[p*6+n].icon)){ + if (s.read(apps[p*6+n].icon)) //ensure that graph exist + g.drawImage(s.read(apps[p*6+n].icon),x+10,y+10,{scale:1.25}); + else console.log("icon file NOT exist :"+apps[p*6+n].icon); + } + else console.log("icon property NOT exist"); g.setColor(-1).setFontAlign(0,-1,0).setFont("6x8",1); var txt = apps[p*6+n].name.split(" "); for (var i = 0; i < txt.length; i++) { @@ -65,10 +71,31 @@ function drawPage(p){ if (!apps[p*6+i]) return i; draw_icon(p,i,selected==i); } -} + } + + // case was not working +Bangle.on("touch", function(tzone){ + //(tzone)=>{ + //console.log("tzone"+tzone); + switch(tzone){ + case 1: //left managed by + console.log("1, left or back to clock?"); + load();//clock + //nextapp(-1); + break; + case 2: // right + nextapp(1); + break; + case 3: //center 1+2 no for emul + doselect(); + break; + default: + console.log("no match"); + } + }); Bangle.on("swipe",(dir)=>{ - wdog() + wdog(); selected = 0; oldselected=-1; if (dir<0){ diff --git a/apps/dtlaunch/metadata.json b/apps/dtlaunch/metadata.json index b19d59e49..4262ebc26 100644 --- a/apps/dtlaunch/metadata.json +++ b/apps/dtlaunch/metadata.json @@ -1,7 +1,7 @@ { "id": "dtlaunch", "name": "Desktop Launcher", - "version": "0.22", + "version": "0.23", "description": "Desktop style App Launcher with six (four for Bangle 2) apps per page - fast access if you have lots of apps installed.", "screenshots": [{"url":"shot1.png"},{"url":"shot2.png"},{"url":"shot3.png"}], "icon": "icon.png", diff --git a/apps/dtlaunch/sshot_e1.png b/apps/dtlaunch/sshot_e1.png new file mode 100644 index 0000000000000000000000000000000000000000..69f708c33617749a1d128cbe374f8cd816fa736f GIT binary patch literal 5096 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 Date: Wed, 8 Mar 2023 11:39:53 +0100 Subject: [PATCH 24/89] Create Changelog.txt --- apps/helloworld/Changelog.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 apps/helloworld/Changelog.txt diff --git a/apps/helloworld/Changelog.txt b/apps/helloworld/Changelog.txt new file mode 100644 index 000000000..3cdf67604 --- /dev/null +++ b/apps/helloworld/Changelog.txt @@ -0,0 +1,3 @@ +0.01: 1st version ! +0.02: Supports bottom widgets and UI based in UI4swatch! +0.03: Several fixes From 18f12216f4a6eadbdf62fc696e46c7bfbca63d16 Mon Sep 17 00:00:00 2001 From: dapgo Date: Wed, 8 Mar 2023 11:44:46 +0100 Subject: [PATCH 25/89] Update Changelog.txt --- apps/helloworld/Changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/helloworld/Changelog.txt b/apps/helloworld/Changelog.txt index 3cdf67604..2dce22553 100644 --- a/apps/helloworld/Changelog.txt +++ b/apps/helloworld/Changelog.txt @@ -1,3 +1,3 @@ 0.01: 1st version ! 0.02: Supports bottom widgets and UI based in UI4swatch! -0.03: Several fixes +0.03: Several fixes, added comaptibility with BJS2 From c4328de14bfa7d04c3e2ccf41fdb9daacc892c1e Mon Sep 17 00:00:00 2001 From: dapgo Date: Wed, 8 Mar 2023 11:52:13 +0100 Subject: [PATCH 26/89] fix Changelog minor issues with caps and extension --- apps/helloworld/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/helloworld/ChangeLog b/apps/helloworld/ChangeLog index 777e555f1..6ffdb7f46 100644 --- a/apps/helloworld/ChangeLog +++ b/apps/helloworld/ChangeLog @@ -1,2 +1,3 @@ 0.01: 1st version ! 0.02: Supports bottom widgets and UI based in UI4swatch! +0.03: Added compatibility with BJS2, improvements From 83d4e2b6156a8cff4569993965a0997ee1bca11a Mon Sep 17 00:00:00 2001 From: dapgo Date: Wed, 8 Mar 2023 11:55:51 +0100 Subject: [PATCH 27/89] Delete Changelog.txt --- apps/helloworld/Changelog.txt | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 apps/helloworld/Changelog.txt diff --git a/apps/helloworld/Changelog.txt b/apps/helloworld/Changelog.txt deleted file mode 100644 index 2dce22553..000000000 --- a/apps/helloworld/Changelog.txt +++ /dev/null @@ -1,3 +0,0 @@ -0.01: 1st version ! -0.02: Supports bottom widgets and UI based in UI4swatch! -0.03: Several fixes, added comaptibility with BJS2 From 80aeb00b7c314fca7a49387caca0f1d02aa2be9d Mon Sep 17 00:00:00 2001 From: dapgo Date: Wed, 8 Mar 2023 12:35:26 +0100 Subject: [PATCH 28/89] Delete app.js --- apps/helloworld/app.js | 186 ----------------------------------------- 1 file changed, 186 deletions(-) delete mode 100644 apps/helloworld/app.js diff --git a/apps/helloworld/app.js b/apps/helloworld/app.js deleted file mode 100644 index 4803fc423..000000000 --- a/apps/helloworld/app.js +++ /dev/null @@ -1,186 +0,0 @@ -//HolaMundo v202103 -// place your const, vars, functions or classes here -{ - var contador=1; - var v_color_statictxt='#e56e06'; - var v_color_b_area='#111111'; //orange RGB format rrggbb //white,Orange,DarkGreen,Yellow,Maroon,Blue,green,Purple,cyan,olive,DarkCyan,pink - var a_colors= Array(0xFFFF,0xFD20,0x03E0,0xFFE0,0x7800,0x001F,0x07E0,0x780F,0x07FF,0x7BE0,0x03EF,0xF81F); - var v_color_lines=0xFFFF; //White hex format - //new - var v_color_text=0x07E0; - var v_font1size=10; //out of quotes - var v_font2size=12; - var v_font_banner_size=30; - var v_font3size=12; - var v_arraypos=0; - var v_acolorpos=0; - var a_string1 = Array('hola', 'hello', 'saluton', 'ola','ciao', 'salut','czesc','konnichiwa'); - var a_string2 = Array('mundo!', 'world!', 'mondo!','mundo!','mondo!','monde!','swiat!','sekai!'); - var mem=process.memory(); - var v_model=process.env.BOARD; - console.log("device="+v_model); - - var x_max_screen=g.getWidth();//240; - var y_max_screen=g.getHeight(); //240; - var y_wg_bottom=g.getHeight()-25; - var y_wg_top=25; - if (v_model=='BANGLEJS') { - var x_btn_area=215; - var x_max_usable_area=x_btn_area;//Pend! only for bangle.js - var y_btn2=124; //harcoded for bangle.js cuz it is not the half of display height - } else x_max_usable_area=240; -} - - console.log("*** UI dimensions***"); - console.log("x="+x_max_screen); - console.log("y_wg_bottom="+y_wg_bottom); - - - // special function to handle display switch on - Bangle.on('lcdPower', (on) => { - if (on) { - contador=contador+1; - PrintHelloWorld(); - // call your app function here - // If you clear the screen, do Bangle.drawWidgets(); - } - }); - - //Clear/fill dynamic area except widget area, right and bottom status line - function ClearActiveArea(){ - g.setColor(v_color_b_area); - //harcoded values to avoid clearing areas - g.fillRect(0,y_wg_top,195,150); - g.flip(); - } - - function DrawBangleButtons(){ - g.setFontVector(v_font1size); - g.setColor(v_color_lines);//White - - - g.drawString("Lang", x_max_screen-g.stringWidth("Lang"),y_wg_top+v_font1size+1); - //above Btn2 - //g.setFontVector(v_font1size).drawString("Off", x_max_screen-g.stringWidth("Off"),y_btn2-(2*v_font1size)); - g.drawString("Color", x_max_screen-g.stringWidth("Color"),y_btn2-v_font1size); - //above Btn3 - g.drawString("Quit", x_max_screen-g.stringWidth("Quit"),y_wg_bottom-(2*v_font1size)); - g.flip(); - g.setColor(v_color_text); //green - g.setFontVector(v_font1size); - g.drawString("B1", x_max_screen-g.stringWidth("B1"),y_wg_top); - g.drawString("B2", x_max_screen-g.stringWidth("B2"),y_btn2); - g.drawString("B3",x_max_screen-g.stringWidth("B3"),y_wg_bottom-v_font1size); - g.flip(); -} - -function DrawBottomInfoBanner(){ -/* External Vars:v_color_text,v_font2size,x_max_usable_area,y_wg_bottom -*/ - g.setColor(v_color_text); - var info_text1="Swipe <- -> (Lang)"; - //var info_text2="Touch: Left=Up Right=Down"; - //aligned left of max usable area - g.setFontVector(v_font2size); - //g.drawString(info_text2, x_max_usable_area-g.stringWidth(info_text2)-2 ,y_wg_bottom-(2*v_font2size)); - g.drawString(info_text1, x_max_usable_area-g.stringWidth(info_text1)-2 ,y_wg_bottom-v_font2size); - g.flip(); -} - - //function Graphics.setColor(r, g, b) binary - // banglejs.com/reference#l_Graphics_setColor - - function PrintHelloWorld(){ - ClearActiveArea(); //except widgets and bottom - - console.log("drawing a "+a_string1[v_arraypos]+" "+a_string2[v_arraypos]); - - g.setColor(a_colors[v_acolorpos]); //dynamic color - g.setFont("Vector",v_font_banner_size); - g.drawString(a_string1[v_arraypos],2,55); - //line below 2nd string - g.drawLine(10, 149, 150, 149); - g.flip(); - - g.setColor(a_colors[v_acolorpos+1]); //dynamic color - g.drawString(a_string2[v_arraypos],5,85); - g.flip(); - - g.setFont("Vector",v_font3size); - g.setColor(0,0,1); //blue - g.drawString("Display count: "+contador ,10,115); - mem=process.memory(); - //console.log("Mem free/total: "+mem.free+"/"+mem.total); - g.drawString("Free mem: "+mem.free+"/"+mem.total,10,135); - g.flip(); - } - - function PrintMainStaticArea(){ - g.setColor(v_color_statictxt); - g.setFont("Vector",v_font3size); - g.drawString("#by DPG #bangle.js",10,170); - g.drawString("#javascript #espruino",10,185); - - var img_obj_RedHi = { - width : 40, height : 40, bpp : 4, - transparent : 0, - buffer : require("heatshrink").decompress(atob("AFkM7vd4EAhoTNhvQhvcgHdAQIAL5oWCFIPdExo+CEoIZCABI0DhvADIZhJL4IXDHRkMEAQmOCYgmOAAIOBHwImNRQgmPHgYmCUIIXMJobfB3jgCWZJNDEga1JYQQQCMYZoJJAJNDBwgTICQPdCY7lDRQx4DVIwTIHYZzEHZATFBwblDCZRKEO5ITFWAbIJCYrHBAAImICYwEB5raKCYwAMCYXc5gADE5hLDAAgTIBJLkBBJAyKHw5hKBRJJKKJSuII5Q0IhqPKCbjRKCc4AgA==")) - } - g.drawImage(img_obj_RedHi,155,160); - g.flip(); - } - - - //inc var postion for text array - function ChangeLang(){ - if (v_arraypos { - if(dir == 1) ChangeLang(); //func load() to quit - else ChangeLang(); - }); - } - - console.log("**************************"); - console.log("Log: *** hola mundo app"); - g.clear(); - Bangle.loadWidgets(); - Bangle.drawWidgets(); - if (v_model=='BANGLEJS') DrawBangleButtons(); - DrawBottomInfoBanner(); - UserInput(); - PrintMainStaticArea(); - PrintHelloWorld(); - \ No newline at end of file From 82efd6b29e7f25695cdd51f5c39261759ad91c40 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 9 Mar 2023 09:44:34 +0000 Subject: [PATCH 29/89] correction based on https://github.com/espruino/BangleApps/pull/2529#discussion_r1130158703 --- apps/sched/sched.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/sched/sched.js b/apps/sched/sched.js index ea4c43443..3deb9d1f0 100644 --- a/apps/sched/sched.js +++ b/apps/sched/sched.js @@ -83,10 +83,9 @@ function showAlarm(alarm) { function setNextRepeatDate(alarm) { let date = new Date(alarm.date); let rp = alarm.rp; - switch(rp.interval) { - case true: - date.setDate(date.getDate() + 1); - break; + if (rp===true) { // fallback in case rp is set wrong + date.setDate(date.getDate() + 1); + } else switch(rp.interval) { // rp is an object case "day": date.setDate(date.getDate() + rp.num); break; From 94be5d462789efbf429d463c828dd69760353b4c Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 9 Mar 2023 09:54:26 +0000 Subject: [PATCH 30/89] Add check for unlinked READMEs --- apps/backswipe/metadata.json | 1 + apps/btadv/metadata.json | 1 + apps/clkinfostopw/metadata.json | 1 + apps/torch/metadata.json | 1 + apps/widChargingStatus/metadata.json | 3 ++- bin/sanitycheck.js | 9 ++++++++- 6 files changed, 14 insertions(+), 2 deletions(-) diff --git a/apps/backswipe/metadata.json b/apps/backswipe/metadata.json index 0274ec8d7..c7cb2185f 100644 --- a/apps/backswipe/metadata.json +++ b/apps/backswipe/metadata.json @@ -6,6 +6,7 @@ "icon": "app.png", "tags": "back,gesture,swipe", "supports" : ["BANGLEJS2"], + "readme":"README.md", "type": "bootloader", "storage": [ {"name":"backswipe.boot.js","url":"boot.js"}, diff --git a/apps/btadv/metadata.json b/apps/btadv/metadata.json index 29ee65286..7028b2a95 100644 --- a/apps/btadv/metadata.json +++ b/apps/btadv/metadata.json @@ -7,6 +7,7 @@ "icon": "icon.png", "tags": "health,tool,sensors,bluetooth", "supports": ["BANGLEJS2"], + "readme":"README.md", "storage": [ {"name":"btadv.app.js","url":"app.js"}, {"name":"btadv.img","url":"icon.js","evaluate":true} diff --git a/apps/clkinfostopw/metadata.json b/apps/clkinfostopw/metadata.json index c0821b8be..2cdf69495 100644 --- a/apps/clkinfostopw/metadata.json +++ b/apps/clkinfostopw/metadata.json @@ -7,6 +7,7 @@ "type": "clkinfo", "tags": "clkinfo,timer", "supports" : ["BANGLEJS2"], + "readme":"README.md", "allow_emulator": true, "storage": [ {"name":"stopw.clkinfo.js","url":"clkinfo.js"} diff --git a/apps/torch/metadata.json b/apps/torch/metadata.json index 4e8794663..6837dc904 100644 --- a/apps/torch/metadata.json +++ b/apps/torch/metadata.json @@ -7,6 +7,7 @@ "icon": "app.png", "tags": "tool,torch", "supports": ["BANGLEJS","BANGLEJS2"], + "readme":"README.md", "storage": [ {"name":"torch.app.js","url":"app.js"}, {"name":"torch.wid.js","url":"widget.js","supports": ["BANGLEJS"]}, diff --git a/apps/widChargingStatus/metadata.json b/apps/widChargingStatus/metadata.json index 573c594e7..63a59fe41 100644 --- a/apps/widChargingStatus/metadata.json +++ b/apps/widChargingStatus/metadata.json @@ -6,7 +6,8 @@ "type": "widget", "description": "A simple widget that shows a yellow lightning icon to indicate whenever the watch is charging. This way one can see the charging status at a glance, no matter which battery widget is being used.", "tags": "widget", - "supports": ["BANGLEJS","BANGLEJS2"], + "supports": ["BANGLEJS","BANGLEJS2"], + "readme":"README.md", "storage": [ {"name":"widChargingStatus.wid.js","url":"widget.js"} ] diff --git a/bin/sanitycheck.js b/bin/sanitycheck.js index 82b2896b8..b27e4e26d 100755 --- a/bin/sanitycheck.js +++ b/bin/sanitycheck.js @@ -162,7 +162,14 @@ apps.forEach((app,appIdx) => { ERROR(`App ${app.id} screenshot file ${screenshot.url} not found`, {file:metadataFile}); }); } - if (app.readme && !fs.existsSync(appDir+app.readme)) ERROR(`App ${app.id} README file doesn't exist`, {file:metadataFile}); + if (app.readme) { + if (!fs.existsSync(appDir+app.readme)) + ERROR(`App ${app.id} README file doesn't exist`, {file:metadataFile}); + } else { + let readme = fs.readdirSync(appDir).find(f => f.toLowerCase().includes("readme")); + if (readme) + ERROR(`App ${app.id} has a README in the directory (${readme}) but it's not linked`, {file:metadataFile}); + } if (app.custom && !fs.existsSync(appDir+app.custom)) ERROR(`App ${app.id} custom HTML doesn't exist`, {file:metadataFile}); if (app.customConnect && !app.custom) ERROR(`App ${app.id} has customConnect but no customn HTML`, {file:metadataFile}); if (app.interface && !fs.existsSync(appDir+app.interface)) ERROR(`App ${app.id} interface HTML doesn't exist`, {file:metadataFile}); From 546cfd5e15df4ba2dc168c478397712ac2b5fb55 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Thu, 9 Mar 2023 19:56:23 +0100 Subject: [PATCH 31/89] add hints to extension app --- apps/quicklaunch/ChangeLog | 1 + apps/quicklaunch/app.js | 15 ++++++++++++--- apps/quicklaunch/metadata.json | 29 ++++++++++++++++++++++------- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/apps/quicklaunch/ChangeLog b/apps/quicklaunch/ChangeLog index 4b92be8cc..b5a85b770 100644 --- a/apps/quicklaunch/ChangeLog +++ b/apps/quicklaunch/ChangeLog @@ -9,3 +9,4 @@ 0.09: Do not react if clkinfo is focused 0.10: Extend the functionality via a quicklaunch.app.js file that can be launched with quicklaunch itself. +0.11: Add hints to the extension app. Tweak remove function. diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index 7ae01ded6..fa7672847 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -21,11 +21,13 @@ if (ud == 1 && settings.extdownapp && settings.extdownapp.src){ if (settings.extdownapp.name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings.extdownapp.src)) reset("extdownapp"); else load(settings.extdownapp.src); } }; + let removeUI = ()=>{if (timeoutToClock) clearTimeout(timeoutToClock);} + Bangle.setUI({ - mode: "custom", + mode: "custom", touch: touchHandler, swipe : swipeHandler, - remove: ()=>{if (timeoutToClock) clearTimeout(timeoutToClock);} // Compatability with Fastload Utils. + remove: removeUI // Compatability with Fastload Utils. }); g.clearRect(Bangle.appRect); @@ -36,7 +38,14 @@ const updateTimeoutToClock = function(){ let time = 1000; // milliseconds if (timeoutToClock) clearTimeout(timeoutToClock); - timeoutToClock = setTimeout(load,time); + timeoutToClock = setTimeout(load,time); }; updateTimeoutToClock(); + + let R = Bangle.appRect; + g.setFont("Vector", 11) + .setFontAlign(0,1,0).drawString(settings.extupapp.name, R.x+R.w/2, R.y2) + .setFontAlign(0,1,1).drawString(settings.extrightapp.name, R.x, R.y+R.h/2) + .setFontAlign(0,-1,0).drawString(settings.extdownapp.name, R.x+R.w/2, R.y) + .setFontAlign(0,1,3).drawString(settings.extleftapp.name, R.x2, R.y+R.h/2); } diff --git a/apps/quicklaunch/metadata.json b/apps/quicklaunch/metadata.json index e38d25d09..de7b93be8 100644 --- a/apps/quicklaunch/metadata.json +++ b/apps/quicklaunch/metadata.json @@ -2,16 +2,31 @@ "id": "quicklaunch", "name": "Quick Launch", "icon": "app.png", - "version": "0.10", + "version": "0.11", "description": "Tap or swipe left/right/up/down on your clock face to launch up to five apps of your choice. Configurations can be accessed through Settings->Apps.", "type": "bootloader", "tags": "tools, system", "readme": "README.md", - "supports": ["BANGLEJS2"], - "storage": [ - {"name": "quicklaunch.settings.js", "url": "settings.js"}, - {"name": "quicklaunch.boot.js", "url": "boot.js"}, - {"name": "quicklaunch.app.js", "url": "app.js"} + "supports": [ + "BANGLEJS2" ], - "data": [{"name": "quicklaunch.json"}] + "storage": [ + { + "name": "quicklaunch.settings.js", + "url": "settings.js" + }, + { + "name": "quicklaunch.boot.js", + "url": "boot.js" + }, + { + "name": "quicklaunch.app.js", + "url": "app.js" + } + ], + "data": [ + { + "name": "quicklaunch.json" + } + ] } From 4f25ee7ca187eda48b16bf4bd69338d2684d494c Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Thu, 9 Mar 2023 20:13:10 +0000 Subject: [PATCH 32/89] Comment-out unused variable --- apps/alarm/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/alarm/app.js b/apps/alarm/app.js index c0ae17f00..f5758afb0 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -279,7 +279,7 @@ function showEditRepeatMenu(repeat, day, dowChangeCallback) { } }; } else { - var date = day; // eventually: detect day of date and configure a repeat e.g. 3rd Monday of Month + // var date = day; // eventually: detect day of date and configure a repeat e.g. 3rd Monday of Month dow = EVERY_DAY; repeat = repeat || {interval: "month", num: 1}; From 8525fc73da9d9696fff95b050a175902adc22076 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Thu, 9 Mar 2023 20:01:31 +0000 Subject: [PATCH 33/89] sched.d.ts: add --- typescript/types/sched.d.ts | 70 +++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 typescript/types/sched.d.ts diff --git a/typescript/types/sched.d.ts b/typescript/types/sched.d.ts new file mode 100644 index 000000000..0b520c367 --- /dev/null +++ b/typescript/types/sched.d.ts @@ -0,0 +1,70 @@ +declare module Sched { + const enum Dow { + SUN = 1, + MON = 2, + TUE = 4, + WED = 8, + THU = 16, + FRI = 32, + SAT = 64, + } + + type VibratePattern = "." | "," | "-" | ":" | ";" | "="; + + type Sched = { + id?: string, + appid?: string, + on: boolean, + dow?: number, + date?: `${number}-${number}-${number}`, + msg: string, + last: number, + rp: boolean, // repeat + vibrate?: VibratePattern, + hidden?: boolean, + as?: boolean, // auto snooze + del?: boolean, + js?: string, + data?: unknown, + } & ( + { + t: number, // time of day since midnight (in ms, set automatically when timer starts) + } | { + timer: number, // this is a timer - the time in ms + } + ); + + type SchedSettings = { + unlockAtBuzz: boolean, + defaultSnoozeMillis: number, + defaultAutoSnooze: boolean, + defaultDeleteExpiredTimers: boolean, + buzzCount: number, + buzzIntervalMillis: number, + defaultAlarmPattern: string, + defaultTimerPattern: string, + }; + + function getAlarms(): Sched[]; + + function setAlarms(alarms: readonly Sched[]): void; + + function getAlarm(id: string): Sched | undefined; + + function getActiveAlarms (alarms: Sched[], time?: Date): Sched[]; + + function setAlarm(id: string, alarm?: Sched): void; + + function getTimeToAlarm(alarm: Sched, time?: Date): number | undefined; + function getTimeToAlarm(alarm?: undefined | null, time?: Date): undefined; + + function reload(): void; + + function newDefaultAlarm(): Sched; + + function newDefaultTimer(): Sched; + + function getSettings(): SchedSettings; + + function setSettings(settings: SchedSettings): void; +} From 0be2bbe2f7c875f99f3a9c6a922f3e428b8dbcaa Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Thu, 9 Mar 2023 20:13:30 +0000 Subject: [PATCH 34/89] Move repeat & date to a mutually inclusive group --- typescript/types/sched.d.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/typescript/types/sched.d.ts b/typescript/types/sched.d.ts index 0b520c367..6dd25e666 100644 --- a/typescript/types/sched.d.ts +++ b/typescript/types/sched.d.ts @@ -16,10 +16,8 @@ declare module Sched { appid?: string, on: boolean, dow?: number, - date?: `${number}-${number}-${number}`, msg: string, last: number, - rp: boolean, // repeat vibrate?: VibratePattern, hidden?: boolean, as?: boolean, // auto snooze @@ -32,8 +30,21 @@ declare module Sched { } | { timer: number, // this is a timer - the time in ms } + ) & ( + { + date: `${number}-${number}-${number}`, + rp?: Repeat, + } | { + date: undefined, + rp: boolean, + } ); + type Repeat = { + num: number, + interval: "day" | "week" | "month" | "year", + }; + type SchedSettings = { unlockAtBuzz: boolean, defaultSnoozeMillis: number, From 9762acd981ea54bad68d0c0c1ed3c5bd84d017ca Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Thu, 9 Mar 2023 20:34:32 +0000 Subject: [PATCH 35/89] Locale module types --- typescript/types/locale.d.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 typescript/types/locale.d.ts diff --git a/typescript/types/locale.d.ts b/typescript/types/locale.d.ts new file mode 100644 index 000000000..3fc914e10 --- /dev/null +++ b/typescript/types/locale.d.ts @@ -0,0 +1,19 @@ +declare module Locale { + type ShortBoolean = 0 | 1 | boolean; + + type Locale = { + name: string, + currencySym: string, + dow(date: Date, short?: ShortBoolean): string, + month(date: Date, short?: ShortBoolean): string, + number(n: number): string, + currency(c: number): string, + distance(d: number): string, + speed(s: number): string, + temp(t: number): string, + translate(s: string): string, + date(date: Date, short?: ShortBoolean): string, + time(date: Date, short?: ShortBoolean): string, + meridian(date: Date): string, + } +} From f1bb41743e14cd68b63c8cd5ce7169c740d9bd23 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Thu, 9 Mar 2023 20:35:00 +0000 Subject: [PATCH 36/89] Add local modules types to require() --- apps/btadv/app.ts | 2 +- typescript/types/modules.d.ts | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 typescript/types/modules.d.ts diff --git a/apps/btadv/app.ts b/apps/btadv/app.ts index 15128e484..c66ba3449 100644 --- a/apps/btadv/app.ts +++ b/apps/btadv/app.ts @@ -1,7 +1,7 @@ // ts helpers: const __assign = Object.assign; -const Layout = require("Layout") as Layout_.Layout; +const Layout = require("Layout"); Bangle.loadWidgets(); Bangle.drawWidgets(); diff --git a/typescript/types/modules.d.ts b/typescript/types/modules.d.ts new file mode 100644 index 000000000..5c65548fc --- /dev/null +++ b/typescript/types/modules.d.ts @@ -0,0 +1,7 @@ +// locally declared modules +declare function require(moduleName: "locale"): Locale.Locale; +declare function require(moduleName: "sched"): typeof Sched; + +declare function require(moduleName: "ClockFace"): typeof ClockFace_.ClockFace; +declare function require(moduleName: "clock_info"): typeof ClockInfo; +declare function require(moduleName: "Layout"): typeof Layout_.Layout; From 01d47679aa265f4094ee4e4b2e602ab7d46c289a Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Thu, 9 Mar 2023 20:45:37 +0000 Subject: [PATCH 37/89] tsconfig.json: checkJs comments --- tsconfig.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tsconfig.json b/tsconfig.json index 7f6a96fef..a383f7346 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,6 +7,10 @@ "module": "commonjs", + // toggle these to check everything (and optionally change the include below to "apps/myapp/*.js") + // "checkJs": true, + // "noEmit": true, + // code-gen "declaration": false, "emitDeclarationOnly": false, @@ -45,6 +49,7 @@ }, "include": [ "*/*/*.ts", + "apps/*/*.js", // with checkJs: true "*/*/*.d.ts", "modules/*.d.ts", "typescript/types/*.d.ts" From 1d58e0d5e3b595bbff814ce1a694bc942a25fde0 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Fri, 10 Mar 2023 21:16:57 +0100 Subject: [PATCH 38/89] follow the preferred metadata.json style --- apps/quicklaunch/metadata.json | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/apps/quicklaunch/metadata.json b/apps/quicklaunch/metadata.json index de7b93be8..8948c7f03 100644 --- a/apps/quicklaunch/metadata.json +++ b/apps/quicklaunch/metadata.json @@ -7,26 +7,11 @@ "type": "bootloader", "tags": "tools, system", "readme": "README.md", - "supports": [ - "BANGLEJS2" - ], + "supports": ["BANGLEJS2"], "storage": [ - { - "name": "quicklaunch.settings.js", - "url": "settings.js" - }, - { - "name": "quicklaunch.boot.js", - "url": "boot.js" - }, - { - "name": "quicklaunch.app.js", - "url": "app.js" - } + {"name": "quicklaunch.settings.js", "url": "settings.js"}, + {"name": "quicklaunch.boot.js", "url": "boot.js"}, + {"name": "quicklaunch.app.js", "url": "app.js"} ], - "data": [ - { - "name": "quicklaunch.json" - } - ] + "data": [{"name": "quicklaunch.json"}] } From 2b7fcd7704704c7eb1abe4a3cf69bf1a21d34306 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Fri, 10 Mar 2023 22:43:18 +0100 Subject: [PATCH 39/89] add global variable qlTrace --- apps/quicklaunch/boot.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/apps/quicklaunch/boot.js b/apps/quicklaunch/boot.js index 946a14308..3de270077 100644 --- a/apps/quicklaunch/boot.js +++ b/apps/quicklaunch/boot.js @@ -13,16 +13,15 @@ if (Bangle.CLKINFO_FOCUS) return; let R = Bangle.appRect; if (e.x < R.x || e.x > R.x2 || e.y < R.y || e.y > R.y2 ) return; - if (settings.tapapp.src){ if (settings.tapapp.name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings.tapapp.src)) reset("tapapp"); else load(settings.tapapp.src); } + if (settings.tapapp.src){ qlTrace = [4]; if (settings.tapapp.name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings.tapapp.src)) reset("tapapp"); else load(settings.tapapp.src); } }); Bangle.on("swipe", (lr,ud) => { if (!Bangle.CLOCK) return; if (Bangle.CLKINFO_FOCUS) return; - - if (lr == -1 && settings.leftapp && settings.leftapp.src){ if (settings.leftapp.name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings.leftapp.src)) reset("leftapp"); else load(settings.leftapp.src); } - if (lr == 1 && settings.rightapp && settings.rightapp.src){ if (settings.rightapp.name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings.rightapp.src)) reset("rightapp"); else load(settings.rightapp.src); } - if (ud == -1 && settings.upapp && settings.upapp.src){ if (settings.upapp.name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings.upapp.src)) reset("upapp"); else load(settings.upapp.src); } - if (ud == 1 && settings.downapp && settings.downapp.src){ if (settings.downapp.name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings.downapp.src)) reset("downapp"); else load(settings.downapp.src); } + if (lr == -1 && settings.leftapp && settings.leftapp.src){ qlTrace = [0]; if (settings.leftapp.name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings.leftapp.src)) reset("leftapp"); else load(settings.leftapp.src); } + if (lr == 1 && settings.rightapp && settings.rightapp.src){ qlTrace = [1]; if (settings.rightapp.name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings.rightapp.src)) reset("rightapp"); else load(settings.rightapp.src); } + if (ud == -1 && settings.upapp && settings.upapp.src){ qlTrace = [2]; if (settings.upapp.name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings.upapp.src)) reset("upapp"); else load(settings.upapp.src); } + if (ud == 1 && settings.downapp && settings.downapp.src){ qlTrace = [3]; if (settings.downapp.name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings.downapp.src)) reset("downapp"); else load(settings.downapp.src); } }); } From a9a6e47610511bb00217ddf9d0e83153279cf7af Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Fri, 10 Mar 2023 22:45:19 +0100 Subject: [PATCH 40/89] follow the preferred metadata.json style --- apps/messagesoverlay/metadata.json | 28 +++++----------------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/apps/messagesoverlay/metadata.json b/apps/messagesoverlay/metadata.json index 6a3f953d8..be80150e7 100644 --- a/apps/messagesoverlay/metadata.json +++ b/apps/messagesoverlay/metadata.json @@ -6,30 +6,12 @@ "icon": "app.png", "type": "bootloader", "tags": "tool,system", - "supports": [ - "BANGLEJS2" - ], - "dependencies": { - "messageicons": "module", - "messages": "app" - }, + "supports": ["BANGLEJS2"], + "dependencies" : { "messageicons":"module","messages":"app" }, "readme": "README.md", "storage": [ - { - "name": "messagesoverlay", - "url": "lib.js" - }, - { - "name": "messagesoverlay.boot.js", - "url": "boot.js" - } + {"name":"messagesoverlay","url":"lib.js"}, + {"name":"messagesoverlay.boot.js","url":"boot.js"} ], - "screenshots": [ - { - "url": "screen_call.png" - }, - { - "url": "screen_message.png" - } - ] + "screenshots": [{"url":"screen_call.png"} ,{"url":"screen_message.png"} ] } From 1b6ab0e8f35ba02ae77acec630be081b4d50bea7 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Fri, 10 Mar 2023 22:56:43 +0100 Subject: [PATCH 41/89] follow the preferred metadata.json style --- apps/runplus/metadata.json | 35 +++++++---------------------------- 1 file changed, 7 insertions(+), 28 deletions(-) diff --git a/apps/runplus/metadata.json b/apps/runplus/metadata.json index c605c438d..60860dc07 100644 --- a/apps/runplus/metadata.json +++ b/apps/runplus/metadata.json @@ -5,37 +5,16 @@ "description": "Displays distance, time, steps, cadence, pace and more for runners. Based on the Run app, but extended with additional screen for heart rate interval training.", "icon": "app.png", "tags": "run,running,fitness,outdoors,gps,karvonen,karvonnen", - "supports": [ - "BANGLEJS2" - ], - "screenshots": [ - { - "url": "screenshot.png" - } - ], + "supports": ["BANGLEJS2"], + "screenshots": [{"url": "screenshot.png"}], "readme": "README.md", "storage": [ - { - "name": "runplus.app.js", - "url": "app.js" - }, - { - "name": "runplus.img", - "url": "app-icon.js", - "evaluate": true - }, - { - "name": "runplus.settings.js", - "url": "settings.js" - }, - { - "name": "runplus_karvonen", - "url": "karvonen.js" - } + {"name": "runplus.app.js", "url": "app.js"}, + {"name": "runplus.img", "url": "app-icon.js", "evaluate": true}, + {"name": "runplus.settings.js", "url": "settings.js"}, + {"name": "runplus_karvonen", "url": "karvonen.js"} ], "data": [ - { - "name": "runplus.json" - } + {"name": "runplus.json"} ] } From cc15ff9cfa4cd714d65eb3b759860c48c20ef7e0 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sat, 11 Mar 2023 01:10:31 +0100 Subject: [PATCH 42/89] start making quicklaunch infinitely extensible --- apps/quicklaunch/app.js | 31 ++++++++++++++++++------------- apps/quicklaunch/boot.js | 16 +++++++++++----- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index fa7672847..13105f2c4 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -11,27 +11,30 @@ let touchHandler = (_,e) => { let R = Bangle.appRect; if (e.x < R.x || e.x > R.x2 || e.y < R.y || e.y > R.y2 ) return; - if (settings.exttapapp.src){ if (settings.exttapapp.name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings.exttapapp.src)) reset("exttapapp"); else load(settings.exttapapp.src); } + qlTrace += "tap"; + if (settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } }; let swipeHandler = (lr,ud) => { - if (lr == -1 && settings.extleftapp && settings.extleftapp.src){ if (settings.extleftapp.name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings.extleftapp.src)) reset("extleftapp"); else load(settings.extleftapp.src); } - if (lr == 1 && settings.extrightapp && settings.extrightapp.src){ if (settings.extrightapp.name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings.extrightapp.src)) reset("extrightapp"); else load(settings.extrightapp.src); } - if (ud == -1 && settings.extupapp && settings.extupapp.src){ if (settings.extupapp.name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings.extupapp.src)) reset("extupapp"); else load(settings.extupapp.src); } - if (ud == 1 && settings.extdownapp && settings.extdownapp.src){ if (settings.extdownapp.name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings.extdownapp.src)) reset("extdownapp"); else load(settings.extdownapp.src); } + if (lr == -1) qlTrace += "left"; + if (lr == 1) qlTrace += "right"; + if (ud == -1) qlTrace += "up"; + if (ud == 1) qlTrace += "down"; + if (lr == -1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } + if (lr == 1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } + if (ud == -1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } + if (ud == 1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } }; - let removeUI = ()=>{if (timeoutToClock) clearTimeout(timeoutToClock);} - Bangle.setUI({ mode: "custom", touch: touchHandler, swipe : swipeHandler, - remove: removeUI // Compatability with Fastload Utils. + remove: ()=>{if (timeoutToClock) clearTimeout(timeoutToClock);} // Compatibility with Fastload Utils. }); g.clearRect(Bangle.appRect); - Bangle.loadWidgets(); // Compatability with Fastload Utils. + Bangle.loadWidgets(); // Compatibility with Fastload Utils. // taken from Icon Launcher with some alterations let timeoutToClock; @@ -43,9 +46,11 @@ updateTimeoutToClock(); let R = Bangle.appRect; + + // Draw app hints g.setFont("Vector", 11) - .setFontAlign(0,1,0).drawString(settings.extupapp.name, R.x+R.w/2, R.y2) - .setFontAlign(0,1,1).drawString(settings.extrightapp.name, R.x, R.y+R.h/2) - .setFontAlign(0,-1,0).drawString(settings.extdownapp.name, R.x+R.w/2, R.y) - .setFontAlign(0,1,3).drawString(settings.extleftapp.name, R.x2, R.y+R.h/2); + .setFontAlign(0,1,0).drawString(settings[qlTrace+"app"].name, R.x+R.w/2, R.y2) + .setFontAlign(0,1,1).drawString(settings[qlTrace+"app"].name, R.x, R.y+R.h/2) + .setFontAlign(0,-1,0).drawString(settings[qlTrace+"app"].name, R.x+R.w/2, R.y) + .setFontAlign(0,1,3).drawString(settings[qlTrace+"app"].name, R.x2, R.y+R.h/2); } diff --git a/apps/quicklaunch/boot.js b/apps/quicklaunch/boot.js index 3de270077..10848a457 100644 --- a/apps/quicklaunch/boot.js +++ b/apps/quicklaunch/boot.js @@ -1,4 +1,5 @@ { + // TODO: Change the settings object and settings.js to match qlTrace. const storage = require("Storage"); let settings = storage.readJSON("quicklaunch.json", true) || {}; @@ -13,15 +14,20 @@ if (Bangle.CLKINFO_FOCUS) return; let R = Bangle.appRect; if (e.x < R.x || e.x > R.x2 || e.y < R.y || e.y > R.y2 ) return; - if (settings.tapapp.src){ qlTrace = [4]; if (settings.tapapp.name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings.tapapp.src)) reset("tapapp"); else load(settings.tapapp.src); } + qlTrace = "tap"; + if (settings.tapapp.src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } }); Bangle.on("swipe", (lr,ud) => { if (!Bangle.CLOCK) return; if (Bangle.CLKINFO_FOCUS) return; - if (lr == -1 && settings.leftapp && settings.leftapp.src){ qlTrace = [0]; if (settings.leftapp.name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings.leftapp.src)) reset("leftapp"); else load(settings.leftapp.src); } - if (lr == 1 && settings.rightapp && settings.rightapp.src){ qlTrace = [1]; if (settings.rightapp.name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings.rightapp.src)) reset("rightapp"); else load(settings.rightapp.src); } - if (ud == -1 && settings.upapp && settings.upapp.src){ qlTrace = [2]; if (settings.upapp.name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings.upapp.src)) reset("upapp"); else load(settings.upapp.src); } - if (ud == 1 && settings.downapp && settings.downapp.src){ qlTrace = [3]; if (settings.downapp.name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings.downapp.src)) reset("downapp"); else load(settings.downapp.src); } + if (lr == -1) qlTrace = "left"; + if (lr == 1) qlTrace = "right"; + if (ud == -1) qlTrace = "up"; + if (ud == 1) qlTrace = "down"; + if (lr == -1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } + if (lr == 1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } + if (ud == -1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } + if (ud == 1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } }); } From 068e68780cb0c9093cf59c47697a318b64697346 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sat, 11 Mar 2023 01:18:28 +0100 Subject: [PATCH 43/89] bump version --- apps/quicklaunch/ChangeLog | 1 + apps/quicklaunch/metadata.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/quicklaunch/ChangeLog b/apps/quicklaunch/ChangeLog index b5a85b770..4de189ab1 100644 --- a/apps/quicklaunch/ChangeLog +++ b/apps/quicklaunch/ChangeLog @@ -10,3 +10,4 @@ 0.10: Extend the functionality via a quicklaunch.app.js file that can be launched with quicklaunch itself. 0.11: Add hints to the extension app. Tweak remove function. +0.12: Stackable extension screens. diff --git a/apps/quicklaunch/metadata.json b/apps/quicklaunch/metadata.json index 8948c7f03..a74d7c65f 100644 --- a/apps/quicklaunch/metadata.json +++ b/apps/quicklaunch/metadata.json @@ -2,7 +2,7 @@ "id": "quicklaunch", "name": "Quick Launch", "icon": "app.png", - "version": "0.11", + "version": "0.12", "description": "Tap or swipe left/right/up/down on your clock face to launch up to five apps of your choice. Configurations can be accessed through Settings->Apps.", "type": "bootloader", "tags": "tools, system", From bb2a7f2e8a7000b107bb784f087170bcf8a0a279 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sat, 11 Mar 2023 18:57:00 +0100 Subject: [PATCH 44/89] convert settings for stackable extension screens --- apps/quicklaunch/settings.js | 237 +++++++---------------------------- 1 file changed, 45 insertions(+), 192 deletions(-) diff --git a/apps/quicklaunch/settings.js b/apps/quicklaunch/settings.js index 39c2a13d6..589dce6f3 100644 --- a/apps/quicklaunch/settings.js +++ b/apps/quicklaunch/settings.js @@ -2,7 +2,7 @@ var storage = require("Storage"); var settings = Object.assign(storage.readJSON("quicklaunch.json", true) || {}); -for (let c of ["leftapp","rightapp","upapp","downapp","tapapp","extleftapp","extrightapp","extupapp","extdownapp","exttapapp"]){ +for (let c of ["lapp","rapp","uapp","dapp","tapp"]){ // l=left, r=right, u=up, d=down, t=tap. if (!settings[c]) settings[c] = {"name":"(none)"}; } @@ -17,12 +17,13 @@ apps.push({ }); // Add the Quick Launch extension app -apps.push({ +let extension = { "name": "Quick Launch Extension", "type": "app", "sortorder": -11, "src": "quicklaunch.app.js" - }); + } +apps.push(extension); apps.sort((a,b)=>{ var n=(0|a.sortorder)-(0|b.sortorder); @@ -32,7 +33,28 @@ apps.sort((a,b)=>{ return 0; }); +function findPath(key) { + let path = key.substring(0, key.lenght-3); + return path; +} + function save(key, value) { + let path = findPath(key); + // If changing from extension app (to something else) remove downstream settings entries. + if (settings[key].name == extension.name && value.name != extension.name) { + for (let c of [path+"lapp", path+"rapp", path+"uapp", path+"dapp", path+"tapapp"]) { + delete settings[c]; + } + } + + // If changing to extension app (from something else) add downstream settings entries. + if (value.name == "Quick Launch Extension" && settings[key].name != extension.name) { + for (let c of [path+"lapp", path+"rapp", path+"uapp", path+"dapp", path+"tapp"]) { + settings[c] = {"name":"(none)"}; + } + } + + // Now change the setting on the current level in the path. settings[key] = value; storage.write("quicklaunch.json",settings); } @@ -45,202 +67,33 @@ function showMainMenu() { }; //List all selected apps - mainmenu["Left: "+settings.leftapp.name] = function() { E.showMenu(leftmenu); }; - mainmenu["Right: "+settings.rightapp.name] = function() { E.showMenu(rightmenu); }; - mainmenu["Up: "+settings.upapp.name] = function() { E.showMenu(upmenu); }; - mainmenu["Down: "+settings.downapp.name] = function() { E.showMenu(downmenu); }; - mainmenu["Tap: "+settings.tapapp.name] = function() { E.showMenu(tapmenu); }; - mainmenu["Extend Quick Launch"] = showExtMenu; + for (let key of settings.keys()) { + mainmenu[key+ ": "+settings[key].name] = function() {showSubMenu(key);}; + } return E.showMenu(mainmenu); } -//Left swipe menu -var leftmenu = { - "" : { "title" : "Left Swipe" }, - "< Back" : showMainMenu -}; - -leftmenu["(none)"] = function() { - save("leftapp", {"name":"(none)"}); - showMainMenu(); -}; -apps.forEach((a)=>{ - leftmenu[a.name] = function() { - save("leftapp", a); - showMainMenu(); - }; -}); - -//Right swipe menu -var rightmenu = { - "" : { "title" : "Right Swipe" }, - "< Back" : showMainMenu -}; - -rightmenu["(none)"] = function() { - save("rightapp", {"name":"(none)"}); - showMainMenu(); -}; -apps.forEach((a)=>{ - rightmenu[a.name] = function() { - save("rightapp", a); - showMainMenu(); - }; -}); - -//Up swipe menu -var upmenu = { - "" : { "title" : "Up Swipe" }, - "< Back" : showMainMenu -}; - -upmenu["(none)"] = function() { - save("upapp", {"name":"(none)"}); - showMainMenu(); -}; -apps.forEach((a)=>{ - upmenu[a.name] = function() { - save("upapp", a); - showMainMenu(); - }; -}); - -//Down swipe menu -var downmenu = { - "" : { "title" : "Down Swipe" }, - "< Back" : showMainMenu -}; - -downmenu["(none)"] = function() { - save("downapp", {"name":"(none)"}); - showMainMenu(); -}; -apps.forEach((a)=>{ - downmenu[a.name] = function() { - save("downapp", a); - showMainMenu(); - }; -}); - -//Tap menu -var tapmenu = { - "" : { "title" : "Tap" }, - "< Back" : showMainMenu -}; - -tapmenu["(none)"] = function() { - save("tapapp", {"name":"(none)"}); - showMainMenu(); -}; -apps.forEach((a)=>{ - tapmenu[a.name] = function() { - save("tapapp", a); - showMainMenu(); - }; -}); - -function showExtMenu() { - // Extend Quick Launch menu - var extmenu = { - "" : { "title" : "Extend Quick Launch" }, - "< Back" : ()=>{showMainMenu();} +function showSubMenu(key) { + //Left swipe menu + var submenu = { + "" : { "title" : "path: "+findPath(key)}, + "< Back" : showMainMenu }; + + submenu["(none)"] = function() { + save(key, {"name":"(none)"}); + showMainMenu(); + }; + apps.forEach((a)=>{ + submenu[a.name] = function() { + save(key, a); + showMainMenu(); + }; + }); - //List all selected apps - extmenu["Left: "+settings.extleftapp.name] = function() { E.showMenu(extleftmenu); }; - extmenu["Right: "+settings.extrightapp.name] = function() { E.showMenu(extrightmenu); }; - extmenu["Up: "+settings.extupapp.name] = function() { E.showMenu(extupmenu); }; - extmenu["Down: "+settings.extdownapp.name] = function() { E.showMenu(extdownmenu); }; - extmenu["Tap: "+settings.exttapapp.name] = function() { E.showMenu(exttapmenu); }; - - return E.showMenu(extmenu); + return E.showMenu(submenu); } -//Extension Left swipe menu -var extleftmenu = { - "" : { "title" : "Extension Left Swipe" }, - "< Back" : showExtMenu -}; - -extleftmenu["(none)"] = function() { - save("extleftapp", {"name":"(none)"}); - showExtMenu(); -}; -apps.forEach((a)=>{ - extleftmenu[a.name] = function() { - save("extleftapp", a); - showExtMenu(); - }; -}); - -//Extension Right swipe menu -var extrightmenu = { - "" : { "title" : "Extension Right Swipe" }, - "< Back" : showExtMenu -}; - -extrightmenu["(none)"] = function() { - save("extrightapp", {"name":"(none)"}); - showExtMenu(); -}; -apps.forEach((a)=>{ - extrightmenu[a.name] = function() { - save("extrightapp", a); - showExtMenu(); - }; -}); - -//Extension Up swipe menu -var extupmenu = { - "" : { "title" : "Extension Up Swipe" }, - "< Back" : showExtMenu -}; - -extupmenu["(none)"] = function() { - save("extupapp", {"name":"(none)"}); - showExtMenu(); -}; -apps.forEach((a)=>{ - extupmenu[a.name] = function() { - save("extupapp", a); - showExtMenu(); - }; -}); - -//Extension Down swipe menu -var extdownmenu = { - "" : { "title" : "Extension Down Swipe" }, - "< Back" : showExtMenu -}; - -downmenu["(none)"] = function() { - save("extdownapp", {"name":"(none)"}); - showExtMenu(); -}; -apps.forEach((a)=>{ - extdownmenu[a.name] = function() { - save("extdownapp", a); - showExtMenu(); - }; -}); - -//Extension Tap menu -var exttapmenu = { - "" : { "title" : "Extension Tap" }, - "< Back" : showExtMenu -}; - -exttapmenu["(none)"] = function() { - save("exttapapp", {"name":"(none)"}); - showExtMenu(); -}; -apps.forEach((a)=>{ - exttapmenu[a.name] = function() { - save("exttapapp", a); - showExtMenu(); - }; -}); - showMainMenu(); }) From 4b2b9c722b924479faad8d5b95464646f684db39 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sat, 11 Mar 2023 19:36:33 +0100 Subject: [PATCH 45/89] tweak app.js and boot.js to match settings.js --- apps/quicklaunch/app.js | 12 +++++++----- apps/quicklaunch/boot.js | 15 ++++++++------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index 13105f2c4..e63e5d049 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -8,18 +8,20 @@ storage.write("quicklaunch.json", settings); }; + // l=left, r=right, u=up, d=down, t=tap. + let touchHandler = (_,e) => { let R = Bangle.appRect; if (e.x < R.x || e.x > R.x2 || e.y < R.y || e.y > R.y2 ) return; - qlTrace += "tap"; + qlTrace += "t"; if (settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } }; let swipeHandler = (lr,ud) => { - if (lr == -1) qlTrace += "left"; - if (lr == 1) qlTrace += "right"; - if (ud == -1) qlTrace += "up"; - if (ud == 1) qlTrace += "down"; + if (lr == -1) qlTrace += "l"; // l=left, + if (lr == 1) qlTrace += "r"; // r=right, + if (ud == -1) qlTrace += "u"; // u=up, + if (ud == 1) qlTrace += "d"; // d=down. if (lr == -1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } if (lr == 1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } if (ud == -1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } diff --git a/apps/quicklaunch/boot.js b/apps/quicklaunch/boot.js index 10848a457..f9a9cad97 100644 --- a/apps/quicklaunch/boot.js +++ b/apps/quicklaunch/boot.js @@ -14,17 +14,18 @@ if (Bangle.CLKINFO_FOCUS) return; let R = Bangle.appRect; if (e.x < R.x || e.x > R.x2 || e.y < R.y || e.y > R.y2 ) return; - qlTrace = "tap"; - if (settings.tapapp.src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } + qlTrace = "t"; // t=tap + if (settings[qlTrace].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } }); - + + Bangle.on("swipe", (lr,ud) => { if (!Bangle.CLOCK) return; if (Bangle.CLKINFO_FOCUS) return; - if (lr == -1) qlTrace = "left"; - if (lr == 1) qlTrace = "right"; - if (ud == -1) qlTrace = "up"; - if (ud == 1) qlTrace = "down"; + if (lr == -1) qlTrace = "l"; // l=left, + if (lr == 1) qlTrace = "r"; // r=right, + if (ud == -1) qlTrace = "u"; // u=up, + if (ud == 1) qlTrace = "d"; // d=down. if (lr == -1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } if (lr == 1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } if (ud == -1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } From e571ca592e799165a9cc815bd60d28d133dc3a8f Mon Sep 17 00:00:00 2001 From: Mcsquarex <127629423+Mcsquarex@users.noreply.github.com> Date: Sat, 11 Mar 2023 14:58:26 -0600 Subject: [PATCH 46/89] Create chance.app.js --- apps/chance/chance.app.js | 328 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 328 insertions(+) create mode 100644 apps/chance/chance.app.js diff --git a/apps/chance/chance.app.js b/apps/chance/chance.app.js new file mode 100644 index 000000000..d6a0d1a40 --- /dev/null +++ b/apps/chance/chance.app.js @@ -0,0 +1,328 @@ +/* +Chance +by Michael Sillas +*/ + + +var volinit = true; +var aleatorio; +var chance=false; +var chanceforma='moneda'; +var ang = 0; +var puntosale = 1; + +function inipinta(){ +g.clear(); + + +//color de fondo de default +g.setBgColor('#2c04ac'); + + +//Pinta rec de fondo +g.setColor('#2c04ac').fillRect(0, 0, g.getHeight(), g.getWidth()); +} + + +Bangle.on('touch', function(zone,e) { + var cordenadas= Object.values(e); +if(chanceforma=='moneda'){ + + if(chance==false){ + + + + if(cordenadas[0] > 85 && cordenadas[1] > 134) + { + + chanceforma='dado'; + chanceproc(); + } + + else + { + + drawvolado(); + } + } + } + else if(chanceforma=='dado'){ + if(chance==false){ + if(cordenadas[0] < 88 && cordenadas[1] > 134) + { + + volinit=true; + chanceforma='moneda'; + chanceproc(); + } + else + { + drawavdado(); + } + + } + } + }); + + +function getImage(x){ + +if (x==1) { + return require("heatshrink").decompress(atob("qFQwkBiIA/AH4A/AH4A/AGcAAAQllFMQmHFDwmJFDkQE5cBE0ooaExonYJxyhYDpIxGKCocGBZQnVNZgoFJzJCIE7wONE7AOYDBq4KE7CRDax4nUQzgn/E/7VTfxYn/OwgniEwaeIGgInlLLJ2NE7AmEDhANFPaYYLEowpTIBYmKE6AVFOwgmLE54VLBYwzCGIR1UJxLvHiB1YBYgJBfRJ1WJwYiCE6Z1LBgg6EE6DfHLZInVExgNDEIYnROpieHE6QmMTw4nROponYOowPME6YmOE65OFCRQncCBzvSJx4nWJyA5EE6zYRE6omMPA4nNJyI6HE8DaFE45sGOyLbHPgwnaKAoAHYy4oPE7YoLE5DGPFJiyKE6rvHE6I/LE6YAOE84dHDQKEKE6S6JE7zXTE87kFE+omTPBZHDBwROUAH4A/AH4Ar")); + } + + else if(x==2) { + return require("heatshrink").decompress(atob("qFQwkBiIA/AD0QNAZlhSQ5MiFETkLJ0oobExrMZExpQZJ5xQ/KFInPKDB4/KD4nYKBwnYKBwnbKhgnYiBCCE8akOE/7yPE0wnaExjvaE/52cgIn/E84mNE7DFOYzAmOdzJQOY0wnXEZhaCYyxLNE7CbOBwROjgKeXdR52mE7AoNEYKeXFBsBYzDINGgR2WE5YiCE8iEEE84mXO5oNBE8QjDE8hQCE7KSBE8qgNE88QE80RAYYnjADLIIgIJCE8gEDKTh7oE5JQdE5RQcE+R4cE/4AOiAn/OzTwaJxgnaExgn/Ox7IZE84mOE65OPE/4mPE/x2QE/wmQgIcKA")); + + } + + else if(x==3) { + return require("heatshrink").decompress(atob("t1uwkEogA/AH4A/AH4A/AC1AgAAZGSwxaHTJnbABUEGug3PGs6nNNlA3NCQ8BiIAZGyJsEgMimc//4AbmciiDdNBocCGboAFkBuMBgcvGsQABN4ajLgQ1k//xUpQ2DNkpuEGw41CgI1m//wUpIJCh42nUoY2Jj42n/42MbU7cLGwU/G1EgG2swGxY1oGxNAG1nwGxUBG342/G342/G342/G342/G342/G342/G342/G342/G342/G342/G342/G342/G342/G342/G342/G342/G342/G342/G342/G342/G342/G342/G342/G342/G3420gA2pmA2Hog25n42okA21iA2Ll42oFgQ1FGwcPGs/zGxkCG0/xGxNABQQ2nmA2Nj7apgg2KUsyjDGw7cDgEvGsfziCjJGwsBn42iGoY2JUoYABkY0fmQ1EUZBuFOAURADg0ENhRuHAEo2KNww1vN1LZKG9Q1OU8w0QHMRpRAH4A/AH4A/AH4ADA==")); + } +} + + +function rotar(){ + ang += 0.157; + g.clearRect(0, 0, g.getHeight(), 139); + g.drawImage(getImage(3),87,77, {rotate : ang}); + +} + +//Volado Letras (Toss) +function toss(){ + + if(chance==false) + { + g.setColor('#06f77b'); + } + + else + + { + g.setColor('#D8D8D8'); + } + + g.setFontAlign(0,0); // center font + g.setFont("Vector",26); // bitmap font, 8x magnified + g.drawString("Toss",44,160); +} + + + +//Roll dado Letras (Roll) +function roll(){ + + if(chance==false) + { + g.setColor('#06f77b'); + } + + else + + { + g.setColor('#D8D8D8'); + } + + g.setFontAlign(0,0); // center font + g.setFont("Vector",26); // bitmap font, 8x magnified + g.drawString("Roll",135,160); +} + + + +function getRandomIntInclusive(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min + 1) + min); // The maximum is inclusive and the minimum is inclusive +} + + +function drawvolado() +{ + + + if(volinit==true){ //si es inicial el volado + aleatorio = 1; + g.drawImage(getImage(1),49,30); + + } + + else{ + chance=true; + toss(); + setInterval(function () { + + if(aleatorio==1){ + g.setColor('#D4AF37').fillCircle(g.getWidth()/2,73,50); + aleatorio=2; + } + else if(aleatorio==2){ + g.setColor('#c0c0c0').fillCircle(g.getWidth()/2,73,50); + aleatorio=1; + } +}, 500, aleatorio); + + + setTimeout(function () { + clearInterval(); + aleatorio = getRandomIntInclusive(1,2); + + if(aleatorio==1){ + + g.setColor('#c0c0c0'); + g.fillCircle(g.getWidth()/2,73,50); + + } + else if(aleatorio==2){ + + + g.setColor('#D4AF37'); + g.fillCircle(g.getWidth()/2,73,50); + } + + + g.drawImage(getImage(aleatorio),49,30);// Expected output: 1 or 2 + chance=false; + toss(); +}, 2500); + + + } + volinit = false; +} + +function drawavdado() +{ + chance=true; + roll(); + setInterval(rotar,100); + + setTimeout(function () { + clearInterval(); + + puntosale = getRandomIntInclusive(1,6); + + + g.clearRect(0, 0, g.getHeight(), 139); + g.drawImage(getImage(3),30,24); + + switch (puntosale) { + case 1: + g.setColor('#000000').fillCircle(86,77,9); + break; + case 2: + g.setColor('#000000').fillCircle(68,63,9); + g.setColor('#000000').fillCircle(104,98,9); + break; + case 3: + g.setColor('#000000').fillCircle(65,55,9); + g.setColor('#000000').fillCircle(86,77,9); + g.setColor('#000000').fillCircle(108,100,9); + break; + case 4: + g.setColor('#000000').fillCircle(65,55,9); + g.setColor('#000000').fillCircle(107,55,9); + g.setColor('#000000').fillCircle(65,100,9); + g.setColor('#000000').fillCircle(107,100,9); + break; + case 5: + g.setColor('#000000').fillCircle(65,55,9); + g.setColor('#000000').fillCircle(107,55,9); + g.setColor('#000000').fillCircle(86,77,9); + g.setColor('#000000').fillCircle(65,100,9); + g.setColor('#000000').fillCircle(107,100,9); + break; + case 6: + g.setColor('#000000').fillCircle(65,55,9); + g.setColor('#000000').fillCircle(65,77,9); + g.setColor('#000000').fillCircle(65,100,9); + g.setColor('#000000').fillCircle(107,55,9); + g.setColor('#000000').fillCircle(107,77,9); + g.setColor('#000000').fillCircle(107,100,9); + break; + } + + chance=false; + roll(); +}, 2000); +} + +//##################### Inicia Volado + + + +function chanceproc() +{ + + + if(chanceforma=='moneda'){ + + + inipinta(); + + //Pinta rec de boton + g.setColor('#06f77b').fillRect(g.getWidth()/2, 143, g.getWidth(), g.getWidth()); + + + //Circulo concentrico externo moneda + g.setColor('#000000').fillCircle(g.getWidth()/2,73,55); + + //Circulo concentrico interno moneda + g.setColor('#c0c0c0').fillCircle(g.getWidth()/2,73,50); + + + toss(); + + //####### Inicio dibuja dado boton + g.setColor('#000000'); + g.fillRect(117, 145,147, 173); + + g.setColor('#FFFFFF'); + g.fillRect(119, 147,145, 171); + + g.setColor('#000000'); + g.fillCircle(132,159,4); + //####### Fin dibuja dado boton + + + drawvolado(); + + }//##### fin volado + + else if(chanceforma=='dado'){ + + inipinta(); + + //Pinta rec de boton + g.setColor('#06f77b').fillRect(0, 143, g.getWidth()/2, g.getWidth()); + + + roll(); + + //####### Inicio dibuja moneda boton + + //Circulo icono externo moneda + g.setColor('#000000').fillCircle(43,159,15); + + //Circulo icono interno moneda + g.setColor('#c0c0c0').fillCircle(43,159,12); + + //####### Fin dibuja moneda boton + + g.setFont("Vector",17); g.setColor('#000000'); g.drawString('2c',45,160); + + //Uno + + g.drawImage(getImage(3),30,24); + + + g.setColor('#000000').fillCircle(86,77,9); + + + } + + +} + +chanceproc(); From 7a5baf954890f8a04201da9e69c4aceabb6babae Mon Sep 17 00:00:00 2001 From: Mcsquarex <127629423+Mcsquarex@users.noreply.github.com> Date: Sat, 11 Mar 2023 14:59:09 -0600 Subject: [PATCH 47/89] Add files via upload --- apps/chance/README.md | 11 +++++++++++ apps/chance/chance-coin.png | Bin 0 -> 2387 bytes apps/chance/chance-dice.png | Bin 0 -> 1764 bytes apps/chance/chance.img.js | 1 + apps/chance/chance.png | Bin 0 -> 2209 bytes apps/chance/metadata.json | 17 +++++++++++++++++ 6 files changed, 29 insertions(+) create mode 100644 apps/chance/README.md create mode 100644 apps/chance/chance-coin.png create mode 100644 apps/chance/chance-dice.png create mode 100644 apps/chance/chance.img.js create mode 100644 apps/chance/chance.png create mode 100644 apps/chance/metadata.json diff --git a/apps/chance/README.md b/apps/chance/README.md new file mode 100644 index 000000000..3f8e15ed5 --- /dev/null +++ b/apps/chance/README.md @@ -0,0 +1,11 @@ +# Chance + +![](chance-coin.png) + +* Toss a coin just touch the screen +* If you click in the dice button change to roll mode + +![](chance-dice.png) + +* Roll the dice just touch the screen +* If you click in the coin button change to toss mode diff --git a/apps/chance/chance-coin.png b/apps/chance/chance-coin.png new file mode 100644 index 0000000000000000000000000000000000000000..dd1a581eb4c8420d61e2b8e512c0d35cbb882f4e GIT binary patch literal 2387 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 literal 0 HcmV?d00001 diff --git a/apps/chance/metadata.json b/apps/chance/metadata.json new file mode 100644 index 000000000..fd55e9d05 --- /dev/null +++ b/apps/chance/metadata.json @@ -0,0 +1,17 @@ +{ "id": "chance", + "name": "Chance", + "shortName":"Chance", + "version":"0.01", + "description": "Toss a coin or Roll the dice, chose your chance with this app.", + "icon": "chance.png", + "type":"app", + "tags": "tool", + "supports" : ["BANGLEJS2"], + "allow_emulator": true, + "readme": "README.md", + "storage": [ + {"name":"chance.app.js","url":"chance.app.js"}, + {"name":"chance.img","url":"chance.img.js","evaluate":true} + ], + "screenshots": [{"url":"chance-coin.png"},{"url":"chance-dice.png"}] +} From 2268b438e7a82f2fa86ef2ee669ae8564a66ea64 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sat, 11 Mar 2023 22:48:59 +0100 Subject: [PATCH 48/89] fixes, now functional together with fastload utils --- apps/quicklaunch/app.js | 10 ++++------ apps/quicklaunch/boot.js | 1 - apps/quicklaunch/settings.js | 21 ++++++++++----------- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index e63e5d049..035e787cf 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -8,8 +8,6 @@ storage.write("quicklaunch.json", settings); }; - // l=left, r=right, u=up, d=down, t=tap. - let touchHandler = (_,e) => { let R = Bangle.appRect; if (e.x < R.x || e.x > R.x2 || e.y < R.y || e.y > R.y2 ) return; @@ -51,8 +49,8 @@ // Draw app hints g.setFont("Vector", 11) - .setFontAlign(0,1,0).drawString(settings[qlTrace+"app"].name, R.x+R.w/2, R.y2) - .setFontAlign(0,1,1).drawString(settings[qlTrace+"app"].name, R.x, R.y+R.h/2) - .setFontAlign(0,-1,0).drawString(settings[qlTrace+"app"].name, R.x+R.w/2, R.y) - .setFontAlign(0,1,3).drawString(settings[qlTrace+"app"].name, R.x2, R.y+R.h/2); + .setFontAlign(0,1,3).drawString(settings[qlTrace+"lapp"].name, R.x2, R.y+R.h/2) + .setFontAlign(0,1,1).drawString(settings[qlTrace+"rapp"].name, R.x, R.y+R.h/2) + .setFontAlign(0,1,0).drawString(settings[qlTrace+"uapp"].name, R.x+R.w/2, R.y2) + .setFontAlign(0,-1,0).drawString(settings[qlTrace+"dapp"].name, R.x+R.w/2, R.y); } diff --git a/apps/quicklaunch/boot.js b/apps/quicklaunch/boot.js index f9a9cad97..77288fe85 100644 --- a/apps/quicklaunch/boot.js +++ b/apps/quicklaunch/boot.js @@ -1,5 +1,4 @@ { - // TODO: Change the settings object and settings.js to match qlTrace. const storage = require("Storage"); let settings = storage.readJSON("quicklaunch.json", true) || {}; diff --git a/apps/quicklaunch/settings.js b/apps/quicklaunch/settings.js index 589dce6f3..517bbee22 100644 --- a/apps/quicklaunch/settings.js +++ b/apps/quicklaunch/settings.js @@ -22,7 +22,7 @@ let extension = { "type": "app", "sortorder": -11, "src": "quicklaunch.app.js" - } + }; apps.push(extension); apps.sort((a,b)=>{ @@ -33,16 +33,13 @@ apps.sort((a,b)=>{ return 0; }); -function findPath(key) { - let path = key.substring(0, key.lenght-3); - return path; -} +function findPath(key) {return key.substring(0, key.length-3);} function save(key, value) { let path = findPath(key); // If changing from extension app (to something else) remove downstream settings entries. if (settings[key].name == extension.name && value.name != extension.name) { - for (let c of [path+"lapp", path+"rapp", path+"uapp", path+"dapp", path+"tapapp"]) { + for (let c of [path+"lapp", path+"rapp", path+"uapp", path+"dapp", path+"tapp"]) { delete settings[c]; } } @@ -51,6 +48,7 @@ function save(key, value) { if (value.name == "Quick Launch Extension" && settings[key].name != extension.name) { for (let c of [path+"lapp", path+"rapp", path+"uapp", path+"dapp", path+"tapp"]) { settings[c] = {"name":"(none)"}; + storage.write("quicklaunch.json",settings); } } @@ -67,17 +65,18 @@ function showMainMenu() { }; //List all selected apps - for (let key of settings.keys()) { - mainmenu[key+ ": "+settings[key].name] = function() {showSubMenu(key);}; - } + for (let key of Object.keys(settings)) { + let keyCurrent = key; + mainmenu[key+ ": "+settings[key].name] = function() {showSubMenu(keyCurrent);}; + } return E.showMenu(mainmenu); } function showSubMenu(key) { - //Left swipe menu + let path = findPath(key); var submenu = { - "" : { "title" : "path: "+findPath(key)}, + "" : { "title" : "path: "+path}, "< Back" : showMainMenu }; From 4940bcb834ab536954153913d7e6fd42549bd95b Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sun, 12 Mar 2023 01:11:07 +0100 Subject: [PATCH 49/89] fix to work without fastload utils. tweaks to settings page. --- apps/quicklaunch/app.js | 37 ++++++++++++++++++++++-------------- apps/quicklaunch/boot.js | 31 ++++++++++++++++++------------ apps/quicklaunch/settings.js | 15 +++++++++++---- 3 files changed, 53 insertions(+), 30 deletions(-) diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index 035e787cf..5c92c6d34 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -8,22 +8,30 @@ storage.write("quicklaunch.json", settings); }; + let leaveTrace = function(trace) { + settings.trace = trace; + storage.writeJSON("quicklaunch.json", settings); + return trace; + }; + + let trace = settings.trace; + let touchHandler = (_,e) => { let R = Bangle.appRect; if (e.x < R.x || e.x > R.x2 || e.y < R.y || e.y > R.y2 ) return; - qlTrace += "t"; - if (settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } + trace = leaveTrace(trace+"t"); + if (settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } }; let swipeHandler = (lr,ud) => { - if (lr == -1) qlTrace += "l"; // l=left, - if (lr == 1) qlTrace += "r"; // r=right, - if (ud == -1) qlTrace += "u"; // u=up, - if (ud == 1) qlTrace += "d"; // d=down. - if (lr == -1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } - if (lr == 1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } - if (ud == -1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } - if (ud == 1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } + if (lr == -1) trace = leaveTrace(trace+"l"); // l=left, + if (lr == 1) trace = leaveTrace(trace+"r"); // r=right, + if (ud == -1) trace = leaveTrace(trace+"u"); // u=up, + if (ud == 1) trace = leaveTrace(trace+"d"); // d=down. + if (lr == -1 && settings[trace+"app"] && settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } + if (lr == 1 && settings[trace+"app"] && settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } + if (ud == -1 && settings[trace+"app"] && settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } + if (ud == 1 && settings[trace+"app"] && settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } }; Bangle.setUI({ @@ -49,8 +57,9 @@ // Draw app hints g.setFont("Vector", 11) - .setFontAlign(0,1,3).drawString(settings[qlTrace+"lapp"].name, R.x2, R.y+R.h/2) - .setFontAlign(0,1,1).drawString(settings[qlTrace+"rapp"].name, R.x, R.y+R.h/2) - .setFontAlign(0,1,0).drawString(settings[qlTrace+"uapp"].name, R.x+R.w/2, R.y2) - .setFontAlign(0,-1,0).drawString(settings[qlTrace+"dapp"].name, R.x+R.w/2, R.y); + .setFontAlign(0,1,3).drawString(settings[trace+"lapp"].name, R.x2, R.y+R.h/2) + .setFontAlign(0,1,1).drawString(settings[trace+"rapp"].name, R.x, R.y+R.h/2) + .setFontAlign(0,1,0).drawString(settings[trace+"uapp"].name, R.x+R.w/2, R.y2) + .setFontAlign(0,-1,0).drawString(settings[trace+"dapp"].name, R.x+R.w/2, R.y) + .setFontAlign(0,0,0).drawString(settings[trace+"tapp"].name, R.x+R.w/2, R.y+R.h/2); } diff --git a/apps/quicklaunch/boot.js b/apps/quicklaunch/boot.js index 77288fe85..b1dc59884 100644 --- a/apps/quicklaunch/boot.js +++ b/apps/quicklaunch/boot.js @@ -8,26 +8,33 @@ storage.write("quicklaunch.json", settings); }; + let leaveTrace = function(trace) { + settings.trace = trace; + storage.writeJSON("quicklaunch.json", settings); + return trace; + }; + + let trace; + Bangle.on("touch", (_,e) => { if (!Bangle.CLOCK) return; if (Bangle.CLKINFO_FOCUS) return; let R = Bangle.appRect; if (e.x < R.x || e.x > R.x2 || e.y < R.y || e.y > R.y2 ) return; - qlTrace = "t"; // t=tap - if (settings[qlTrace].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } + trace = leaveTrace("t"); // t=tap + if (settings[trace].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } }); - - + Bangle.on("swipe", (lr,ud) => { if (!Bangle.CLOCK) return; if (Bangle.CLKINFO_FOCUS) return; - if (lr == -1) qlTrace = "l"; // l=left, - if (lr == 1) qlTrace = "r"; // r=right, - if (ud == -1) qlTrace = "u"; // u=up, - if (ud == 1) qlTrace = "d"; // d=down. - if (lr == -1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } - if (lr == 1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } - if (ud == -1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } - if (ud == 1 && settings[qlTrace+"app"] && settings[qlTrace+"app"].src){ if (settings[qlTrace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[qlTrace+"app"].src)) reset(qlTrace+"app"); else load(settings[qlTrace+"app"].src); } + if (lr == -1) trace = leaveTrace("l"); // l=left, + if (lr == 1) trace = leaveTrace("r"); // r=right, + if (ud == -1) trace = leaveTrace("u"); // u=up, + if (ud == 1) trace = leaveTrace("d"); // d=down. + if (lr == -1 && settings[trace+"app"] && settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } + if (lr == 1 && settings[trace+"app"] && settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } + if (ud == -1 && settings[trace+"app"] && settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } + if (ud == 1 && settings[trace+"app"] && settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } }); } diff --git a/apps/quicklaunch/settings.js b/apps/quicklaunch/settings.js index 517bbee22..fb80fae31 100644 --- a/apps/quicklaunch/settings.js +++ b/apps/quicklaunch/settings.js @@ -18,7 +18,7 @@ apps.push({ // Add the Quick Launch extension app let extension = { - "name": "Quick Launch Extension", + "name": "Extension", "type": "app", "sortorder": -11, "src": "quicklaunch.app.js" @@ -45,7 +45,7 @@ function save(key, value) { } // If changing to extension app (from something else) add downstream settings entries. - if (value.name == "Quick Launch Extension" && settings[key].name != extension.name) { + if (value.name == extension.name && settings[key].name != extension.name) { for (let c of [path+"lapp", path+"rapp", path+"uapp", path+"dapp", path+"tapp"]) { settings[c] = {"name":"(none)"}; storage.write("quicklaunch.json",settings); @@ -54,7 +54,7 @@ function save(key, value) { // Now change the setting on the current level in the path. settings[key] = value; - storage.write("quicklaunch.json",settings); + storage.writeJSON("quicklaunch.json",settings); } function showMainMenu() { @@ -66,8 +66,15 @@ function showMainMenu() { //List all selected apps for (let key of Object.keys(settings)) { + if (key == "trace") continue; let keyCurrent = key; - mainmenu[key+ ": "+settings[key].name] = function() {showSubMenu(keyCurrent);}; + let entry = findPath(key).toUpperCase(); + if (entry=="L") entry = "Left"; + if (entry=="R") entry = "Right"; + if (entry=="U") entry = "Up"; + if (entry=="D") entry = "Down"; + if (entry=="T") entry = "Tap"; + mainmenu[entry+ ": "+settings[key].name] = function() {showSubMenu(keyCurrent);}; } return E.showMenu(mainmenu); From 1b85a2bfcad789b520a1f593f51afa21691aa783 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sun, 12 Mar 2023 01:39:28 +0100 Subject: [PATCH 50/89] convert old quicklaunch.json key names to the new ones. --- apps/quicklaunch/settings.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/apps/quicklaunch/settings.js b/apps/quicklaunch/settings.js index fb80fae31..10ef98584 100644 --- a/apps/quicklaunch/settings.js +++ b/apps/quicklaunch/settings.js @@ -2,6 +2,19 @@ var storage = require("Storage"); var settings = Object.assign(storage.readJSON("quicklaunch.json", true) || {}); +// Convert settings object from before v.0.12 +for (let c of ["leftapp","rightapp","upapp","downapp","tapapp"]){ + if (settings[c]) { + if (settings[c].name=="Quick Launch Extension") settings[c].name = "Extension"; + settings[c.substring(0,1)+"app"] = settings[c]; + delete settings[c]; + } +} +for (let c of ["extleftapp","extrightapp","extupapp","extdownapp","exttapapp"]){ + if (settings[c]) delete settings[c]; +} + +// Add default settings if they haven't been configured before. for (let c of ["lapp","rapp","uapp","dapp","tapp"]){ // l=left, r=right, u=up, d=down, t=tap. if (!settings[c]) settings[c] = {"name":"(none)"}; } From f10c21845291fd66ce6f3c82d35fe5e7ba68c58c Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sun, 12 Mar 2023 01:54:56 +0100 Subject: [PATCH 51/89] tweak conversion from old quicklaunch.json --- apps/quicklaunch/settings.js | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/apps/quicklaunch/settings.js b/apps/quicklaunch/settings.js index 10ef98584..79d138d82 100644 --- a/apps/quicklaunch/settings.js +++ b/apps/quicklaunch/settings.js @@ -2,23 +2,6 @@ var storage = require("Storage"); var settings = Object.assign(storage.readJSON("quicklaunch.json", true) || {}); -// Convert settings object from before v.0.12 -for (let c of ["leftapp","rightapp","upapp","downapp","tapapp"]){ - if (settings[c]) { - if (settings[c].name=="Quick Launch Extension") settings[c].name = "Extension"; - settings[c.substring(0,1)+"app"] = settings[c]; - delete settings[c]; - } -} -for (let c of ["extleftapp","extrightapp","extupapp","extdownapp","exttapapp"]){ - if (settings[c]) delete settings[c]; -} - -// Add default settings if they haven't been configured before. -for (let c of ["lapp","rapp","uapp","dapp","tapp"]){ // l=left, r=right, u=up, d=down, t=tap. - if (!settings[c]) settings[c] = {"name":"(none)"}; -} - var apps = storage.list(/\.info$/).map(app=>{var a=storage.readJSON(app,1);return a&&{name:a.name,type:a.type,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || app.type=="launch" || app.type=="clock" || !app.type)); // Add psuedo app to trigger Bangle.showLauncher later @@ -46,6 +29,24 @@ apps.sort((a,b)=>{ return 0; }); +// Convert settings object from before v.0.12 +for (let c of ["leftapp","rightapp","upapp","downapp","tapapp"]){ + if (settings[c]) { + let cNew = c.substring(0,1)+"app"; + settings[cNew] = settings[c]; + if (settings[cNew].name=="Quick Launch Extension") save(cNew,extension); + delete settings[c]; + } +} +for (let c of ["extleftapp","extrightapp","extupapp","extdownapp","exttapapp"]){ + if (settings[c]) delete settings[c]; +} + +// Add default settings if they haven't been configured before. +for (let c of ["lapp","rapp","uapp","dapp","tapp"]){ // l=left, r=right, u=up, d=down, t=tap. + if (!settings[c]) settings[c] = {"name":"(none)"}; +} + function findPath(key) {return key.substring(0, key.length-3);} function save(key, value) { From 0c352bce76f00c22762809f9f7757f52995e5d94 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sun, 12 Mar 2023 02:14:28 +0100 Subject: [PATCH 52/89] further twaeks to conversion from old quicklaunch.json --- apps/quicklaunch/settings.js | 45 +++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/apps/quicklaunch/settings.js b/apps/quicklaunch/settings.js index 79d138d82..ce85abb6f 100644 --- a/apps/quicklaunch/settings.js +++ b/apps/quicklaunch/settings.js @@ -2,6 +2,33 @@ var storage = require("Storage"); var settings = Object.assign(storage.readJSON("quicklaunch.json", true) || {}); +// Convert settings object from before v0.12 to v0.12. +for (let c of ["leftapp","rightapp","upapp","downapp","tapapp"]){ + if (settings[c]) { + let cNew = c.substring(0,1)+"app"; + settings[cNew] = settings[c]; + delete settings[c]; + + if (settings[cNew].name=="Quick Launch Extension"){ + settings[cNew].name = "Extension"; + for (let d of ["extleftapp","extrightapp","extupapp","extdownapp","exttapapp"]){ + if (settings[d]) { + let dNew = cNew+d.substring(3,4)+"app"; + settings[dNew] = settings[d]; + } + } + } + } +} +for (let d of ["extleftapp","extrightapp","extupapp","extdownapp","exttapapp"]){ + if (settings[d]) delete settings[d]; +} + +// Add default settings if they haven't been configured before. +for (let c of ["lapp","rapp","uapp","dapp","tapp"]){ // l=left, r=right, u=up, d=down, t=tap. + if (!settings[c]) settings[c] = {"name":"(none)"}; +} + var apps = storage.list(/\.info$/).map(app=>{var a=storage.readJSON(app,1);return a&&{name:a.name,type:a.type,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || app.type=="launch" || app.type=="clock" || !app.type)); // Add psuedo app to trigger Bangle.showLauncher later @@ -29,24 +56,6 @@ apps.sort((a,b)=>{ return 0; }); -// Convert settings object from before v.0.12 -for (let c of ["leftapp","rightapp","upapp","downapp","tapapp"]){ - if (settings[c]) { - let cNew = c.substring(0,1)+"app"; - settings[cNew] = settings[c]; - if (settings[cNew].name=="Quick Launch Extension") save(cNew,extension); - delete settings[c]; - } -} -for (let c of ["extleftapp","extrightapp","extupapp","extdownapp","exttapapp"]){ - if (settings[c]) delete settings[c]; -} - -// Add default settings if they haven't been configured before. -for (let c of ["lapp","rapp","uapp","dapp","tapp"]){ // l=left, r=right, u=up, d=down, t=tap. - if (!settings[c]) settings[c] = {"name":"(none)"}; -} - function findPath(key) {return key.substring(0, key.length-3);} function save(key, value) { From 203d3b075fd81a9dc43263615663064f8f061e47 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sun, 12 Mar 2023 02:27:03 +0100 Subject: [PATCH 53/89] tweak conversion again... --- apps/quicklaunch/settings.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/quicklaunch/settings.js b/apps/quicklaunch/settings.js index ce85abb6f..d9adce945 100644 --- a/apps/quicklaunch/settings.js +++ b/apps/quicklaunch/settings.js @@ -2,6 +2,11 @@ var storage = require("Storage"); var settings = Object.assign(storage.readJSON("quicklaunch.json", true) || {}); +// Add default settings if they haven't been configured before. +for (let c of ["lapp","rapp","uapp","dapp","tapp"]){ // l=left, r=right, u=up, d=down, t=tap. + if (!settings[c]) settings[c] = {"name":"(none)"}; +} + // Convert settings object from before v0.12 to v0.12. for (let c of ["leftapp","rightapp","upapp","downapp","tapapp"]){ if (settings[c]) { @@ -13,7 +18,7 @@ for (let c of ["leftapp","rightapp","upapp","downapp","tapapp"]){ settings[cNew].name = "Extension"; for (let d of ["extleftapp","extrightapp","extupapp","extdownapp","exttapapp"]){ if (settings[d]) { - let dNew = cNew+d.substring(3,4)+"app"; + let dNew = cNew.substring(0,1)+d.substring(3,4)+"app"; settings[dNew] = settings[d]; } } @@ -24,11 +29,6 @@ for (let d of ["extleftapp","extrightapp","extupapp","extdownapp","exttapapp"]){ if (settings[d]) delete settings[d]; } -// Add default settings if they haven't been configured before. -for (let c of ["lapp","rapp","uapp","dapp","tapp"]){ // l=left, r=right, u=up, d=down, t=tap. - if (!settings[c]) settings[c] = {"name":"(none)"}; -} - var apps = storage.list(/\.info$/).map(app=>{var a=storage.readJSON(app,1);return a&&{name:a.name,type:a.type,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || app.type=="launch" || app.type=="clock" || !app.type)); // Add psuedo app to trigger Bangle.showLauncher later From 6bc0604c60802e59e68fd9646457fdab112cee60 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sun, 12 Mar 2023 02:36:53 +0100 Subject: [PATCH 54/89] tweak conversion quicklaunch.json again... --- apps/quicklaunch/settings.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/quicklaunch/settings.js b/apps/quicklaunch/settings.js index d9adce945..40f7ff683 100644 --- a/apps/quicklaunch/settings.js +++ b/apps/quicklaunch/settings.js @@ -23,12 +23,15 @@ for (let c of ["leftapp","rightapp","upapp","downapp","tapapp"]){ } } } + storage.writeJSON("quicklaunch.json",settings); } } for (let d of ["extleftapp","extrightapp","extupapp","extdownapp","exttapapp"]){ if (settings[d]) delete settings[d]; } + + var apps = storage.list(/\.info$/).map(app=>{var a=storage.readJSON(app,1);return a&&{name:a.name,type:a.type,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || app.type=="launch" || app.type=="clock" || !app.type)); // Add psuedo app to trigger Bangle.showLauncher later From a8da0783e4532f017565deb8d2b73281a2b10ef5 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sun, 12 Mar 2023 02:47:30 +0100 Subject: [PATCH 55/89] add to readme --- apps/quicklaunch/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/quicklaunch/README.md b/apps/quicklaunch/README.md index dc4c50071..3b72804bd 100644 --- a/apps/quicklaunch/README.md +++ b/apps/quicklaunch/README.md @@ -1,3 +1,3 @@ -Tap or swipe left/right/up/down on your clock face to launch up to five apps of your choice. The Quick Launch Extension (included) can be chosen as one of the apps, in turn providing fast access to up to five additional apps. Configurations can be accessed through Settings->Apps. +Tap or swipe left/right/up/down on your clock face to launch up to five apps of your choice. The extension (included) can be chosen as one of the apps, in turn providing fast access to up to five additional apps per extension screen - which can be stacked indefinitely. Configurations can be accessed through Settings->Apps. From c14dc872b7049f19cb4be75377ad9a78598f9501 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sun, 12 Mar 2023 03:05:00 +0100 Subject: [PATCH 56/89] Instruct the user to visit settings page to prompt update of quicklaunch.json --- apps/quicklaunch/ChangeLog | 4 +++- apps/quicklaunch/README.md | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/quicklaunch/ChangeLog b/apps/quicklaunch/ChangeLog index 4de189ab1..7796ff84d 100644 --- a/apps/quicklaunch/ChangeLog +++ b/apps/quicklaunch/ChangeLog @@ -10,4 +10,6 @@ 0.10: Extend the functionality via a quicklaunch.app.js file that can be launched with quicklaunch itself. 0.11: Add hints to the extension app. Tweak remove function. -0.12: Stackable extension screens. +0.12: Stackable extension screens. After updating, please visit the quicklaunch + settings page to prompt an automatic update of the quicklaunch.json settings file with + new key names. diff --git a/apps/quicklaunch/README.md b/apps/quicklaunch/README.md index 3b72804bd..71311f82c 100644 --- a/apps/quicklaunch/README.md +++ b/apps/quicklaunch/README.md @@ -1,3 +1,3 @@ Tap or swipe left/right/up/down on your clock face to launch up to five apps of your choice. The extension (included) can be chosen as one of the apps, in turn providing fast access to up to five additional apps per extension screen - which can be stacked indefinitely. Configurations can be accessed through Settings->Apps. - +With the introduction of stackable extension screens in v0.12 of Quick Launch the keys of the settings file have been changed. Please just visit Settings->Apps->Quick Launch to prompt an automatic update. Quick Launch will not be responsive until this has been done. From a6728e2f1892e8fca371ab90d9a357bdf2661f33 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sun, 12 Mar 2023 03:24:16 +0100 Subject: [PATCH 57/89] tweak submenus heading --- apps/quicklaunch/settings.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/quicklaunch/settings.js b/apps/quicklaunch/settings.js index 40f7ff683..d34df6fa8 100644 --- a/apps/quicklaunch/settings.js +++ b/apps/quicklaunch/settings.js @@ -107,9 +107,8 @@ function showMainMenu() { } function showSubMenu(key) { - let path = findPath(key); var submenu = { - "" : { "title" : "path: "+path}, + "" : { "title" : "Path: "+findPath(key).toUpperCase()}, "< Back" : showMainMenu }; From 7e8ceae785fc8ab777a9982f84fa441702c584a9 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sun, 12 Mar 2023 03:25:56 +0100 Subject: [PATCH 58/89] remove empty lines --- apps/quicklaunch/settings.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/quicklaunch/settings.js b/apps/quicklaunch/settings.js index d34df6fa8..9e69c4e01 100644 --- a/apps/quicklaunch/settings.js +++ b/apps/quicklaunch/settings.js @@ -30,8 +30,6 @@ for (let d of ["extleftapp","extrightapp","extupapp","extdownapp","exttapapp"]){ if (settings[d]) delete settings[d]; } - - var apps = storage.list(/\.info$/).map(app=>{var a=storage.readJSON(app,1);return a&&{name:a.name,type:a.type,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || app.type=="launch" || app.type=="clock" || !app.type)); // Add psuedo app to trigger Bangle.showLauncher later From 10ac0e625aa92eea75ffb9ea1559e8420a9d9931 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sun, 12 Mar 2023 11:25:42 +0100 Subject: [PATCH 59/89] don't draw "(none)" in extension when app is not chosen --- apps/quicklaunch/app.js | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index 5c92c6d34..d0eb06771 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -47,19 +47,24 @@ // taken from Icon Launcher with some alterations let timeoutToClock; const updateTimeoutToClock = function(){ - let time = 1000; // milliseconds + let time = 1500; // milliseconds if (timeoutToClock) clearTimeout(timeoutToClock); timeoutToClock = setTimeout(load,time); }; updateTimeoutToClock(); - + let R = Bangle.appRect; - + // Draw app hints + let lname = settings[trace+"lapp"].name=="(none)"?"":settings[trace+"lapp"].name; + let rname = settings[trace+"rapp"].name=="(none)"?"":settings[trace+"rapp"].name; + let uname = settings[trace+"uapp"].name=="(none)"?"":settings[trace+"uapp"].name; + let dname = settings[trace+"dapp"].name=="(none)"?"":settings[trace+"dapp"].name; + let tname = settings[trace+"tapp"].name=="(none)"?"":settings[trace+"tapp"].name; g.setFont("Vector", 11) - .setFontAlign(0,1,3).drawString(settings[trace+"lapp"].name, R.x2, R.y+R.h/2) - .setFontAlign(0,1,1).drawString(settings[trace+"rapp"].name, R.x, R.y+R.h/2) - .setFontAlign(0,1,0).drawString(settings[trace+"uapp"].name, R.x+R.w/2, R.y2) - .setFontAlign(0,-1,0).drawString(settings[trace+"dapp"].name, R.x+R.w/2, R.y) - .setFontAlign(0,0,0).drawString(settings[trace+"tapp"].name, R.x+R.w/2, R.y+R.h/2); + .setFontAlign(0,1,3).drawString(lname, R.x2, R.y+R.h/2) + .setFontAlign(0,1,1).drawString(rname, R.x, R.y+R.h/2) + .setFontAlign(0,1,0).drawString(uname, R.x+R.w/2, R.y2) + .setFontAlign(0,-1,0).drawString(dname, R.x+R.w/2, R.y) + .setFontAlign(0,0,0).drawString(tname, R.x+R.w/2, R.y+R.h/2); } From 6d80f784b40c7695884b32850edb4fe13fa45493 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sun, 12 Mar 2023 12:22:02 +0100 Subject: [PATCH 60/89] handle app name "(none)" vs empty string "" in settings.js instead of in app.js" --- apps/quicklaunch/app.js | 15 +++++---------- apps/quicklaunch/settings.js | 14 +++++++++----- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index d0eb06771..8bd3d0f2d 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -56,15 +56,10 @@ let R = Bangle.appRect; // Draw app hints - let lname = settings[trace+"lapp"].name=="(none)"?"":settings[trace+"lapp"].name; - let rname = settings[trace+"rapp"].name=="(none)"?"":settings[trace+"rapp"].name; - let uname = settings[trace+"uapp"].name=="(none)"?"":settings[trace+"uapp"].name; - let dname = settings[trace+"dapp"].name=="(none)"?"":settings[trace+"dapp"].name; - let tname = settings[trace+"tapp"].name=="(none)"?"":settings[trace+"tapp"].name; g.setFont("Vector", 11) - .setFontAlign(0,1,3).drawString(lname, R.x2, R.y+R.h/2) - .setFontAlign(0,1,1).drawString(rname, R.x, R.y+R.h/2) - .setFontAlign(0,1,0).drawString(uname, R.x+R.w/2, R.y2) - .setFontAlign(0,-1,0).drawString(dname, R.x+R.w/2, R.y) - .setFontAlign(0,0,0).drawString(tname, R.x+R.w/2, R.y+R.h/2); + .setFontAlign(0,1,3).drawString(settings[trace+"lapp"].name, R.x2, R.y+R.h/2) + .setFontAlign(0,1,1).drawString(settings[trace+"rapp"].name, R.x, R.y+R.h/2) + .setFontAlign(0,1,0).drawString(settings[trace+"uapp"].name, R.x+R.w/2, R.y2) + .setFontAlign(0,-1,0).drawString(settings[trace+"dapp"].name, R.x+R.w/2, R.y) + .setFontAlign(0,0,0).drawString(settings[trace+"tapp"].name, R.x+R.w/2, R.y+R.h/2); } diff --git a/apps/quicklaunch/settings.js b/apps/quicklaunch/settings.js index 9e69c4e01..08059efa5 100644 --- a/apps/quicklaunch/settings.js +++ b/apps/quicklaunch/settings.js @@ -4,7 +4,7 @@ var settings = Object.assign(storage.readJSON("quicklaunch.json", true) || {}); // Add default settings if they haven't been configured before. for (let c of ["lapp","rapp","uapp","dapp","tapp"]){ // l=left, r=right, u=up, d=down, t=tap. - if (!settings[c]) settings[c] = {"name":"(none)"}; + if (!settings[c]) settings[c] = {"name":""}; } // Convert settings object from before v0.12 to v0.12. @@ -13,6 +13,7 @@ for (let c of ["leftapp","rightapp","upapp","downapp","tapapp"]){ let cNew = c.substring(0,1)+"app"; settings[cNew] = settings[c]; delete settings[c]; + if (settings[cNew].name=="(none)") settings[cNew].name = ""; if (settings[cNew].name=="Quick Launch Extension"){ settings[cNew].name = "Extension"; @@ -20,6 +21,7 @@ for (let c of ["leftapp","rightapp","upapp","downapp","tapapp"]){ if (settings[d]) { let dNew = cNew.substring(0,1)+d.substring(3,4)+"app"; settings[dNew] = settings[d]; + if (settings[dNew].name=="(none)") settings[dNew].name = ""; } } } @@ -71,7 +73,7 @@ function save(key, value) { // If changing to extension app (from something else) add downstream settings entries. if (value.name == extension.name && settings[key].name != extension.name) { for (let c of [path+"lapp", path+"rapp", path+"uapp", path+"dapp", path+"tapp"]) { - settings[c] = {"name":"(none)"}; + settings[c] = {"name":""}; storage.write("quicklaunch.json",settings); } } @@ -88,7 +90,7 @@ function showMainMenu() { "< Back" : ()=>{load();} }; - //List all selected apps + // List all selected apps. for (let key of Object.keys(settings)) { if (key == "trace") continue; let keyCurrent = key; @@ -98,7 +100,9 @@ function showMainMenu() { if (entry=="U") entry = "Up"; if (entry=="D") entry = "Down"; if (entry=="T") entry = "Tap"; - mainmenu[entry+ ": "+settings[key].name] = function() {showSubMenu(keyCurrent);}; + // If no app is selected the name is an empty string, but we want to display "(none)". + let appName = settings[key].name==""?"(none)":settings[key].name; + mainmenu[entry+ ": "+appName] = function() {showSubMenu(keyCurrent);}; } return E.showMenu(mainmenu); @@ -111,7 +115,7 @@ function showSubMenu(key) { }; submenu["(none)"] = function() { - save(key, {"name":"(none)"}); + save(key, {"name":""}); showMainMenu(); }; apps.forEach((a)=>{ From 1bfb1ae7e43312b81b51a97ccf15b819c9e7858c Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sun, 12 Mar 2023 12:35:03 +0100 Subject: [PATCH 61/89] fix quicklaunch.json name conversion deleting extleftapp etc --- apps/quicklaunch/settings.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/quicklaunch/settings.js b/apps/quicklaunch/settings.js index 08059efa5..ffdef3838 100644 --- a/apps/quicklaunch/settings.js +++ b/apps/quicklaunch/settings.js @@ -21,6 +21,7 @@ for (let c of ["leftapp","rightapp","upapp","downapp","tapapp"]){ if (settings[d]) { let dNew = cNew.substring(0,1)+d.substring(3,4)+"app"; settings[dNew] = settings[d]; + delete settings[d]; if (settings[dNew].name=="(none)") settings[dNew].name = ""; } } From b1e57cc00dce10fb4a287ccebc7b2d2ca73a525e Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sun, 12 Mar 2023 13:41:23 +0100 Subject: [PATCH 62/89] only call loadWidgets if Fastload Utils is installed --- apps/quicklaunch/app.js | 2 +- apps/quicklaunch/settings.js | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index 8bd3d0f2d..bff868900 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -42,7 +42,7 @@ }); g.clearRect(Bangle.appRect); - Bangle.loadWidgets(); // Compatibility with Fastload Utils. + if (settings.fuInstalled) Bangle.loadWidgets(); // Compatibility with Fastload Utils. // taken from Icon Launcher with some alterations let timeoutToClock; diff --git a/apps/quicklaunch/settings.js b/apps/quicklaunch/settings.js index ffdef3838..4ca35e2e0 100644 --- a/apps/quicklaunch/settings.js +++ b/apps/quicklaunch/settings.js @@ -7,6 +7,10 @@ for (let c of ["lapp","rapp","uapp","dapp","tapp"]){ // l=left, r=right, u=up, d if (!settings[c]) settings[c] = {"name":""}; } +// Always check it Fastload Utils is installed. +if (!settings.fuInstalled) settings.fuInstalled = false; +if (storage.read("fastload.utils",0,1)) settings.fuInstalled = true; + // Convert settings object from before v0.12 to v0.12. for (let c of ["leftapp","rightapp","upapp","downapp","tapapp"]){ if (settings[c]) { From 3c6e708009d65e05695d58cdb6461c57df9cccb3 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sun, 12 Mar 2023 14:00:01 +0100 Subject: [PATCH 63/89] tweaks re checking if Fastload Utils is installed --- apps/quicklaunch/settings.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/apps/quicklaunch/settings.js b/apps/quicklaunch/settings.js index 4ca35e2e0..7d2124352 100644 --- a/apps/quicklaunch/settings.js +++ b/apps/quicklaunch/settings.js @@ -2,14 +2,15 @@ var storage = require("Storage"); var settings = Object.assign(storage.readJSON("quicklaunch.json", true) || {}); +// Always check it Fastload Utils is installed. If it was uninstalled we want to stop loading widgets in quicklaunch.app.js. +if (!settings.fuInstalled) settings.fuInstalled = false; +if (storage.read("fastload.utils",0,1)) settings.fuInstalled = true; + // Add default settings if they haven't been configured before. for (let c of ["lapp","rapp","uapp","dapp","tapp"]){ // l=left, r=right, u=up, d=down, t=tap. if (!settings[c]) settings[c] = {"name":""}; } - -// Always check it Fastload Utils is installed. -if (!settings.fuInstalled) settings.fuInstalled = false; -if (storage.read("fastload.utils",0,1)) settings.fuInstalled = true; +storage.writeJSON("quicklaunch.json",settings); // Convert settings object from before v0.12 to v0.12. for (let c of ["leftapp","rightapp","upapp","downapp","tapapp"]){ @@ -37,6 +38,7 @@ for (let d of ["extleftapp","extrightapp","extupapp","extdownapp","exttapapp"]){ if (settings[d]) delete settings[d]; } + var apps = storage.list(/\.info$/).map(app=>{var a=storage.readJSON(app,1);return a&&{name:a.name,type:a.type,sortorder:a.sortorder,src:a.src};}).filter(app=>app && (app.type=="app" || app.type=="launch" || app.type=="clock" || !app.type)); // Add psuedo app to trigger Bangle.showLauncher later @@ -97,7 +99,7 @@ function showMainMenu() { // List all selected apps. for (let key of Object.keys(settings)) { - if (key == "trace") continue; + if (key == "trace" || key == "fuInstalled") continue; let keyCurrent = key; let entry = findPath(key).toUpperCase(); if (entry=="L") entry = "Left"; From 850c791ba2fe4f660281bffebff15fd513c50539 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sun, 12 Mar 2023 14:12:57 +0100 Subject: [PATCH 64/89] handle if Fastload Utils is installed or not with a hack instead of with a settings entry --- apps/quicklaunch/app.js | 2 +- apps/quicklaunch/settings.js | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index bff868900..bea0728d4 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -42,7 +42,7 @@ }); g.clearRect(Bangle.appRect); - if (settings.fuInstalled) Bangle.loadWidgets(); // Compatibility with Fastload Utils. + let loadWidgets = "Bangle.loadWidgets();"; // Hack: Fool Fastload Utils that we call Bangle.loadWidgets(). This way we get the fastest possibe loading in whichever environment we find ourselvs. // taken from Icon Launcher with some alterations let timeoutToClock; diff --git a/apps/quicklaunch/settings.js b/apps/quicklaunch/settings.js index 7d2124352..ba369a1bc 100644 --- a/apps/quicklaunch/settings.js +++ b/apps/quicklaunch/settings.js @@ -2,15 +2,10 @@ var storage = require("Storage"); var settings = Object.assign(storage.readJSON("quicklaunch.json", true) || {}); -// Always check it Fastload Utils is installed. If it was uninstalled we want to stop loading widgets in quicklaunch.app.js. -if (!settings.fuInstalled) settings.fuInstalled = false; -if (storage.read("fastload.utils",0,1)) settings.fuInstalled = true; - // Add default settings if they haven't been configured before. for (let c of ["lapp","rapp","uapp","dapp","tapp"]){ // l=left, r=right, u=up, d=down, t=tap. if (!settings[c]) settings[c] = {"name":""}; } -storage.writeJSON("quicklaunch.json",settings); // Convert settings object from before v0.12 to v0.12. for (let c of ["leftapp","rightapp","upapp","downapp","tapapp"]){ From b06e9968ca3b117d7f9a9b37b20f2d7c0e74a35b Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sun, 12 Mar 2023 14:14:07 +0100 Subject: [PATCH 65/89] cleanup after removine fuInstalled settings entry --- apps/quicklaunch/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/quicklaunch/settings.js b/apps/quicklaunch/settings.js index ba369a1bc..fc6149ac7 100644 --- a/apps/quicklaunch/settings.js +++ b/apps/quicklaunch/settings.js @@ -94,7 +94,7 @@ function showMainMenu() { // List all selected apps. for (let key of Object.keys(settings)) { - if (key == "trace" || key == "fuInstalled") continue; + if (key == "trace") continue; let keyCurrent = key; let entry = findPath(key).toUpperCase(); if (entry=="L") entry = "Left"; From 224500e8f47ee18a1ad1cd6fbccd54de0c58e474 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sun, 12 Mar 2023 14:48:32 +0100 Subject: [PATCH 66/89] add screenshots to readme --- apps/quicklaunch/README.md | 10 ++++++++++ apps/quicklaunch/screenshot0.png | Bin 0 -> 1873 bytes apps/quicklaunch/screenshot1.png | Bin 0 -> 2280 bytes 3 files changed, 10 insertions(+) create mode 100644 apps/quicklaunch/screenshot0.png create mode 100644 apps/quicklaunch/screenshot1.png diff --git a/apps/quicklaunch/README.md b/apps/quicklaunch/README.md index 71311f82c..70395b5d8 100644 --- a/apps/quicklaunch/README.md +++ b/apps/quicklaunch/README.md @@ -1,3 +1,13 @@ Tap or swipe left/right/up/down on your clock face to launch up to five apps of your choice. The extension (included) can be chosen as one of the apps, in turn providing fast access to up to five additional apps per extension screen - which can be stacked indefinitely. Configurations can be accessed through Settings->Apps. With the introduction of stackable extension screens in v0.12 of Quick Launch the keys of the settings file have been changed. Please just visit Settings->Apps->Quick Launch to prompt an automatic update. Quick Launch will not be responsive until this has been done. + +Below is extension screens where current apps have been set like so: +- left swipe is "PA Remote", +- right swipe is "Remote for Spotify" and +- down swipe is another extension screen where new apps are accessible. + +![](screenshot0.png) +*Extension screen.* +![](screenshot1.png) +*Extension screen when Fastload Utils is present.* diff --git a/apps/quicklaunch/screenshot0.png b/apps/quicklaunch/screenshot0.png new file mode 100644 index 0000000000000000000000000000000000000000..98bb25b5c38bafd847a59971296a84acf3fe90a5 GIT binary patch literal 1873 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 literal 0 HcmV?d00001 From 927d69b9e38154034809ed48f40bb2d065f89e4b Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sun, 12 Mar 2023 14:52:23 +0100 Subject: [PATCH 67/89] tweak readme --- apps/quicklaunch/README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/quicklaunch/README.md b/apps/quicklaunch/README.md index 70395b5d8..e360a1216 100644 --- a/apps/quicklaunch/README.md +++ b/apps/quicklaunch/README.md @@ -1,6 +1,6 @@ -Tap or swipe left/right/up/down on your clock face to launch up to five apps of your choice. The extension (included) can be chosen as one of the apps, in turn providing fast access to up to five additional apps per extension screen - which can be stacked indefinitely. Configurations can be accessed through Settings->Apps. +**PLEASE NOTE: With v0.12 of Quick Launch the keys of the settings file have been changed. Please just visit Settings->Apps->Quick Launch to prompt an automatic update. Quick Launch will not be responsive until this has been done. This is a consequence of how the new stackable extension screens are implemented.** -With the introduction of stackable extension screens in v0.12 of Quick Launch the keys of the settings file have been changed. Please just visit Settings->Apps->Quick Launch to prompt an automatic update. Quick Launch will not be responsive until this has been done. +Tap or swipe left/right/up/down on your clock face to launch up to five apps of your choice. The extension (included) can be chosen as one of the apps, in turn providing fast access to up to five additional apps per extension screen - which can be stacked indefinitely. Configurations can be accessed through Settings->Apps. Below is extension screens where current apps have been set like so: - left swipe is "PA Remote", @@ -8,6 +8,10 @@ Below is extension screens where current apps have been set like so: - down swipe is another extension screen where new apps are accessible. ![](screenshot0.png) + *Extension screen.* + + ![](screenshot1.png) + *Extension screen when Fastload Utils is present.* From 37923961500edfbeaa8e3e58702776e8f6b47ca1 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sun, 12 Mar 2023 21:23:19 +0100 Subject: [PATCH 68/89] tweak faking of Bangle.loadWidgets() --- apps/quicklaunch/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index bea0728d4..f6cacd457 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -19,7 +19,7 @@ let touchHandler = (_,e) => { let R = Bangle.appRect; if (e.x < R.x || e.x > R.x2 || e.y < R.y || e.y > R.y2 ) return; - trace = leaveTrace(trace+"t"); + trace = leaveTrace(trace+"t"); // t=tap. if (settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } }; @@ -42,7 +42,7 @@ }); g.clearRect(Bangle.appRect); - let loadWidgets = "Bangle.loadWidgets();"; // Hack: Fool Fastload Utils that we call Bangle.loadWidgets(). This way we get the fastest possibe loading in whichever environment we find ourselvs. + "Bangle.loadWidgets()"; // Hack: Fool Fastload Utils that we call Bangle.loadWidgets(). This way we get the fastest possibe loading in whichever environment we find ourselves. // taken from Icon Launcher with some alterations let timeoutToClock; From 424adcce4fa64e9113cb41ac989db266bfbf7113 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sun, 12 Mar 2023 21:57:36 +0100 Subject: [PATCH 69/89] list contributors in readme --- apps/quicklaunch/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/quicklaunch/README.md b/apps/quicklaunch/README.md index e360a1216..f6450adac 100644 --- a/apps/quicklaunch/README.md +++ b/apps/quicklaunch/README.md @@ -15,3 +15,9 @@ Below is extension screens where current apps have been set like so: ![](screenshot1.png) *Extension screen when Fastload Utils is present.* + +## Contributors +frigis1 (Creator) +halemmerich +thyttan +glemco From c0ded36586583fd200e7c9b1805b29492eb4df65 Mon Sep 17 00:00:00 2001 From: thyttan <97237430+thyttan@users.noreply.github.com> Date: Sun, 12 Mar 2023 22:02:01 +0100 Subject: [PATCH 70/89] Update README.md --- apps/quicklaunch/README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/quicklaunch/README.md b/apps/quicklaunch/README.md index f6450adac..8a60e5279 100644 --- a/apps/quicklaunch/README.md +++ b/apps/quicklaunch/README.md @@ -17,7 +17,8 @@ Below is extension screens where current apps have been set like so: *Extension screen when Fastload Utils is present.* ## Contributors -frigis1 (Creator) -halemmerich -thyttan -glemco + +frigis1 (Creator), +halemmerich, +thyttan, +glemco. From 203d0177277aa619c65a033c27d7dea7d17e6a95 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Mon, 13 Mar 2023 21:33:56 +0100 Subject: [PATCH 71/89] Add function for pausing the timeout on long touch. Remove some superfluous code. --- apps/quicklaunch/ChangeLog | 1 + apps/quicklaunch/app.js | 13 +++++++++---- apps/quicklaunch/boot.js | 5 +---- apps/quicklaunch/metadata.json | 2 +- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/apps/quicklaunch/ChangeLog b/apps/quicklaunch/ChangeLog index 7796ff84d..0465a77e7 100644 --- a/apps/quicklaunch/ChangeLog +++ b/apps/quicklaunch/ChangeLog @@ -13,3 +13,4 @@ 0.12: Stackable extension screens. After updating, please visit the quicklaunch settings page to prompt an automatic update of the quicklaunch.json settings file with new key names. +0.13: Touch and hold to pause the timeout to clock temporarily. diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index f6cacd457..50b49efaa 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -17,6 +17,7 @@ let trace = settings.trace; let touchHandler = (_,e) => { + if (e.type == 2) return; let R = Bangle.appRect; if (e.x < R.x || e.x > R.x2 || e.y < R.y || e.y > R.y2 ) return; trace = leaveTrace(trace+"t"); // t=tap. @@ -24,20 +25,24 @@ }; let swipeHandler = (lr,ud) => { + print("swipe", lr,ud); if (lr == -1) trace = leaveTrace(trace+"l"); // l=left, if (lr == 1) trace = leaveTrace(trace+"r"); // r=right, if (ud == -1) trace = leaveTrace(trace+"u"); // u=up, if (ud == 1) trace = leaveTrace(trace+"d"); // d=down. - if (lr == -1 && settings[trace+"app"] && settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } - if (lr == 1 && settings[trace+"app"] && settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } - if (ud == -1 && settings[trace+"app"] && settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } - if (ud == 1 && settings[trace+"app"] && settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } + if (settings[trace+"app"] && settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } + }; + + let onLongTouchDoPause = (e)=>{ + if (e.b == 1 && timeoutToClock) {clearTimeout(timeoutToClock); timeoutToClock = false;} + if (e.b == 0 && !timeoutToClock) updateTimeoutToClock(); }; Bangle.setUI({ mode: "custom", touch: touchHandler, swipe : swipeHandler, + drag : onLongTouchDoPause, remove: ()=>{if (timeoutToClock) clearTimeout(timeoutToClock);} // Compatibility with Fastload Utils. }); diff --git a/apps/quicklaunch/boot.js b/apps/quicklaunch/boot.js index b1dc59884..4252b8057 100644 --- a/apps/quicklaunch/boot.js +++ b/apps/quicklaunch/boot.js @@ -32,9 +32,6 @@ if (lr == 1) trace = leaveTrace("r"); // r=right, if (ud == -1) trace = leaveTrace("u"); // u=up, if (ud == 1) trace = leaveTrace("d"); // d=down. - if (lr == -1 && settings[trace+"app"] && settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } - if (lr == 1 && settings[trace+"app"] && settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } - if (ud == -1 && settings[trace+"app"] && settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } - if (ud == 1 && settings[trace+"app"] && settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } + if (settings[trace+"app"] && settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } }); } diff --git a/apps/quicklaunch/metadata.json b/apps/quicklaunch/metadata.json index a74d7c65f..945d98002 100644 --- a/apps/quicklaunch/metadata.json +++ b/apps/quicklaunch/metadata.json @@ -2,7 +2,7 @@ "id": "quicklaunch", "name": "Quick Launch", "icon": "app.png", - "version": "0.12", + "version": "0.13", "description": "Tap or swipe left/right/up/down on your clock face to launch up to five apps of your choice. Configurations can be accessed through Settings->Apps.", "type": "bootloader", "tags": "tools, system", From f8bd92fc563a56acb0282b888d3c257491601799 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Tue, 14 Mar 2023 18:48:21 +0100 Subject: [PATCH 72/89] move app launch logic into a function --- apps/quicklaunch/app.js | 10 ++++++++-- apps/quicklaunch/boot.js | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index 50b49efaa..1445f02c5 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -14,6 +14,12 @@ return trace; }; + let launchApp = function(trace) { + if (settings[trace+"app"].src){ + if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); + } + } + let trace = settings.trace; let touchHandler = (_,e) => { @@ -21,7 +27,7 @@ let R = Bangle.appRect; if (e.x < R.x || e.x > R.x2 || e.y < R.y || e.y > R.y2 ) return; trace = leaveTrace(trace+"t"); // t=tap. - if (settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } + launchApp(trace); }; let swipeHandler = (lr,ud) => { @@ -30,7 +36,7 @@ if (lr == 1) trace = leaveTrace(trace+"r"); // r=right, if (ud == -1) trace = leaveTrace(trace+"u"); // u=up, if (ud == 1) trace = leaveTrace(trace+"d"); // d=down. - if (settings[trace+"app"] && settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } + launchApp(trace); }; let onLongTouchDoPause = (e)=>{ diff --git a/apps/quicklaunch/boot.js b/apps/quicklaunch/boot.js index 4252b8057..99a6f7175 100644 --- a/apps/quicklaunch/boot.js +++ b/apps/quicklaunch/boot.js @@ -14,6 +14,12 @@ return trace; }; + let launchApp = function(trace) { + if (settings[trace+"app"].src){ + if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); + } + } + let trace; Bangle.on("touch", (_,e) => { @@ -22,7 +28,7 @@ let R = Bangle.appRect; if (e.x < R.x || e.x > R.x2 || e.y < R.y || e.y > R.y2 ) return; trace = leaveTrace("t"); // t=tap - if (settings[trace].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } + launchApp(trace); }); Bangle.on("swipe", (lr,ud) => { @@ -32,6 +38,6 @@ if (lr == 1) trace = leaveTrace("r"); // r=right, if (ud == -1) trace = leaveTrace("u"); // u=up, if (ud == 1) trace = leaveTrace("d"); // d=down. - if (settings[trace+"app"] && settings[trace+"app"].src){ if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); } + launchApp(trace); }); } From 30232e85e2749c0484d6595a2aab265aeca28cbb Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Tue, 14 Mar 2023 19:04:47 +0100 Subject: [PATCH 73/89] readme: is -> are --- apps/quicklaunch/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/quicklaunch/README.md b/apps/quicklaunch/README.md index 8a60e5279..b5bffc4be 100644 --- a/apps/quicklaunch/README.md +++ b/apps/quicklaunch/README.md @@ -2,7 +2,7 @@ Tap or swipe left/right/up/down on your clock face to launch up to five apps of your choice. The extension (included) can be chosen as one of the apps, in turn providing fast access to up to five additional apps per extension screen - which can be stacked indefinitely. Configurations can be accessed through Settings->Apps. -Below is extension screens where current apps have been set like so: +Below are extension screens where current apps have been set like so: - left swipe is "PA Remote", - right swipe is "Remote for Spotify" and - down swipe is another extension screen where new apps are accessible. From 6cdf3cc572e077c2f9bb5de429780947ae1377e3 Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Tue, 14 Mar 2023 23:08:30 +0100 Subject: [PATCH 74/89] waypoint_editor: Add simple application for editing waypoints on watch. --- apps/waypoint_editor/ChangeLog | 1 + apps/waypoint_editor/README.md | 3 + apps/waypoint_editor/app-icon.js | 1 + apps/waypoint_editor/app.js | 273 +++++++++++++++++++++++++++++ apps/waypoint_editor/metadata.json | 13 ++ 5 files changed, 291 insertions(+) create mode 100644 apps/waypoint_editor/ChangeLog create mode 100644 apps/waypoint_editor/README.md create mode 100644 apps/waypoint_editor/app-icon.js create mode 100644 apps/waypoint_editor/app.js create mode 100644 apps/waypoint_editor/metadata.json diff --git a/apps/waypoint_editor/ChangeLog b/apps/waypoint_editor/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/waypoint_editor/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/waypoint_editor/README.md b/apps/waypoint_editor/README.md new file mode 100644 index 000000000..f9c603a84 --- /dev/null +++ b/apps/waypoint_editor/README.md @@ -0,0 +1,3 @@ +# Waypoints + +Simple waypoint editor. diff --git a/apps/waypoint_editor/app-icon.js b/apps/waypoint_editor/app-icon.js new file mode 100644 index 000000000..49232b838 --- /dev/null +++ b/apps/waypoint_editor/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwJC/AH4A/AH4AgA==")) diff --git a/apps/waypoint_editor/app.js b/apps/waypoint_editor/app.js new file mode 100644 index 000000000..34b3d8ef4 --- /dev/null +++ b/apps/waypoint_editor/app.js @@ -0,0 +1,273 @@ +/* Thanks to pinsafe from BangleApps repository */ + +var Layout = require("Layout"); + +const W = g.getWidth(); +const H = g.getHeight(); + +var wp = require('Storage').readJSON("waypoints.json", true) || []; +// Use this with corrupted waypoints +//var wp = []; +/* 0 .. DD.ddddd + 1 .. DD MM.mmm' + 2 .. DD MM'ss" +*/ +var mode = 1; + +function writeWP() { + require('Storage').writeJSON("waypoints.json", wp); +} + +function mainMenu() { + var menu = { + "< Back" : Bangle.load + }; + if (Object.keys(wp).length==0) Object.assign(menu, {"NO WPs":""}); + else for (let id in wp) { + let i = id; + menu[wp[id]["name"]]=()=>{ decode(i); }; + } + menu["Add"]=addCard; + menu["Remove"]=removeCard; + menu["Format"]=setFormat; + g.clear(); + E.showMenu(menu); +} + +function setFormat() { + var confirmRemove = new Layout ( + {type:"v", c: [ + {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:"Format"}, + {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: "DD.dddd", cb:l=>{ mode = 0; mainMenu(); }}, + {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: "DD MM.mmm'", cb:l=>{ mode = 1; mainMenu(); }}, + {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: "DD MM'ss"+'"', cb:l=>{ mode = 2; mainMenu(); }}, + ], lazy:true}); + g.clear(); + confirmRemove.render(); +} + +function format(x) { + switch (mode) { + case 0: + return "" + x; + case 1: + d = Math.floor(x); + m = x - d; + m = m*60; + return "" + d + " " + m + "'"; + case 2: + d = Math.floor(x); + m = x - d; + m = m*60; + mf = Math.floor(m); + s = m - mf; + s = s*60; + return "" + d + " " + mf + "'" + s + '"'; + } +} + +function lat(x) { + c = "N"; + if (x<0) { + c = "S"; + x = -x; + } + return c+format(x); +} + +function lon(x) { + c = "E"; + if (x<0) { + c = "W"; + x = -x; + } + return c+format(x); +} + +function decode(pin) { + print(pin); + var i = wp[pin]; + var pinDecrypted=i["name"] + "\n" + lat(i["lat"]) + "\n" + lon(i["lon"]); + var showPin = new Layout ({ + type:"v", c: [ + {type:"txt", font:"10%", pad:1, fillx:1, filly:1, label: pinDecrypted}, + {type:"btn", font:"10%", pad:1, fillx:1, filly:1, label:"OK", cb:l=>{mainMenu();}} + ], lazy:true}); + g.clear(); + showPin.render(); +} + +function showNumpad(text, key_, callback) { + key = key_; + E.showMenu(); + function addDigit(digit) { + key+=digit; + if (1) { + l = text[key.length]; + switch (l) { + case '.': case ' ': case "'": + key+=l; + break; + case 'd': case 'D': default: + break; + } + } + Bangle.buzz(20); + update(); + } + function update() { + g.reset(); + g.clearRect(0,0,g.getWidth(),23); + s = key + text.substr(key.length, 999); + g.setFont("Vector:24").setFontAlign(1,0).drawString(s,g.getWidth(),12); + } + ds="12%"; + var numPad = new Layout ({ + type:"v", c: [{ + type:"v", c: [ + {type:"", height:24}, + {type:"h",filly:1, c: [ + {type:"btn", font:ds, width:58, label:"7", cb:l=>{addDigit("7");}}, + {type:"btn", font:ds, width:58, label:"8", cb:l=>{addDigit("8");}}, + {type:"btn", font:ds, width:58, label:"9", cb:l=>{addDigit("9");}} + ]}, + {type:"h",filly:1, c: [ + {type:"btn", font:ds, width:58, label:"4", cb:l=>{addDigit("4");}}, + {type:"btn", font:ds, width:58, label:"5", cb:l=>{addDigit("5");}}, + {type:"btn", font:ds, width:58, label:"6", cb:l=>{addDigit("6");}} + ]}, + {type:"h",filly:1, c: [ + {type:"btn", font:ds, width:58, label:"1", cb:l=>{addDigit("1");}}, + {type:"btn", font:ds, width:58, label:"2", cb:l=>{addDigit("2");}}, + {type:"btn", font:ds, width:58, label:"3", cb:l=>{addDigit("3");}} + ]}, + {type:"h",filly:1, c: [ + {type:"btn", font:ds, width:58, label:"0", cb:l=>{addDigit("0");}}, + {type:"btn", font:ds, width:58, label:"C", cb:l=>{key=key.slice(0,-1); update();}}, + {type:"btn", font:ds, width:58, id:"OK", label:"OK", cb:callback} + ]} + ]} + ], lazy:true}); + g.clear(); + numPad.render(); + update(); +} + +function removeCard() { + var menu = { + "" : {title : "select card"}, + "< Back" : mainMenu + }; + if (Object.keys(wp).length==0) Object.assign(menu, {"NO CARDS":""}); + else for (let c in wp) { + let card=c; + menu[c]=()=>{ + E.showMenu(); + var confirmRemove = new Layout ( + {type:"v", c: [ + {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:"Delete"}, + {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:card+"?"}, + {type:"h", c: [ + {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: "YES", cb:l=>{ + delete wp[card]; + writeWP(); + mainMenu(); + }}, + {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: " NO", cb:l=>{mainMenu();}} + ]} + ], lazy:true}); + g.clear(); + confirmRemove.render(); + }; + } + E.showMenu(menu); +} + +function ask01(t, cb) { + var confirmRemove = new Layout ( + {type:"v", c: [ + {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:"Format"}, + {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: t[0], cb:l=>{ cb(1); }}, + {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: t[1], cb:l=>{ cb(-1); }}, + ], lazy:true}); + g.clear(); + confirmRemove.render(); +} + + +function askCoordinate(t1, t2, callback) { + let sign = 1; + ask01(t1, function(sign) { + switch (mode) { + case 0: s = "DDD.dddd"; break; + case 1: s = "DDD MM.mmm"; break; + case 2: s = "DDD MM'ss"+'"'; break; + } + showNumpad(s, t2, function() { + switch (mode) { + case 0: + res = parseFloat(key); + break; + case 1: + d = parseInt(key.substr(0, 3)); + m = parseFloat(key.substr(3,99)); + res = d + m/60.0; + break; + case 2: + d = parseInt(key.substr(0, 3)); + m = parseInt(key.substr(4, 2)); + s = parseInt(key.substr(7, 2)); + res = d + m/60.0 + s/3600.0; + } + res = sign * res; + print("Coordinate", res); + callback(res); + }); + }); +} + +function askPosition(callback) { + let full = ""; + askCoordinate("NS", "0", function(lat) { + askCoordinate("EW", "", function(lon) { + callback(lat, lon); + }); + }); +} + +function addCard() { + showNumpad("wpXX", "wp", function() { + result = key; + if (wp[result]!=undefined) { + E.showMenu(); + var alreadyExists = new Layout ( + {type:"v", c: [ + {type:"txt", font:Math.min(15,100/result.length)+"%", pad:1, fillx:1, filly:1, label:result}, + {type:"txt", font:"12%", pad:1, fillx:1, filly:1, label:"already exists."}, + {type:"h", c: [ + {type:"btn", font:"10%", pad:1, fillx:1, filly:1, label: "REPLACE", cb:l=>{encodeCard(result);}}, + {type:"btn", font:"10%", pad:1, fillx:1, filly:1, label: "CANCEL", cb:l=>{mainMenu();}} + ]} + ], lazy:true}); + g.clear(); + alreadyExists.render(); + } + g.clear(); + askPosition(function(lat, lon) { + print("position -- ", lat, lon); + let n = {}; + n["name"] = result; + n["lat"] = lat; + n["lon"] = lon; + wp.push(n); + print("add -- waypoints", wp); + writeWP(); + mainMenu(); + }); + }); +} + + +g.reset(); +Bangle.setUI(); +mainMenu(); diff --git a/apps/waypoint_editor/metadata.json b/apps/waypoint_editor/metadata.json new file mode 100644 index 000000000..f48721732 --- /dev/null +++ b/apps/waypoint_editor/metadata.json @@ -0,0 +1,13 @@ +{ "id": "waypoint_editor", + "name": "Waypoint editor", + "version":"0.01", + "description": "Allows editing waypoints on device", + "icon": "app.png", + "readme": "README.md", + "supports" : ["BANGLEJS2"], + "tags": "tool,outdoors,gps", + "storage": [ + {"name":"waypoint_editor.app.js","url":"app.js"}, + {"name":"waypoint_editor.img","url":"app-icon.js","evaluate":true} + ] +} From 98e6b8c49f7cc9965159b5153bfa702741ca1b7a Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Tue, 14 Mar 2023 23:13:51 +0100 Subject: [PATCH 75/89] Add missing icon. --- apps/waypoint_editor/app.png | Bin 0 -> 11143 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/waypoint_editor/app.png diff --git a/apps/waypoint_editor/app.png b/apps/waypoint_editor/app.png new file mode 100644 index 0000000000000000000000000000000000000000..e97f1bb7b308f6b2549f828e8495b3bef1b6ede5 GIT binary patch literal 11143 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 Date: Thu, 16 Mar 2023 16:33:10 +0100 Subject: [PATCH 76/89] - apps/widdevst: changed to refresh storage usage and run GC every minute --- apps/widdevst/ChangeLog | 1 + apps/widdevst/metadata.json | 2 +- apps/widdevst/wid.js | 35 ++++++++++++++++++++++------------- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/apps/widdevst/ChangeLog b/apps/widdevst/ChangeLog index addaa5326..cee46ac6a 100644 --- a/apps/widdevst/ChangeLog +++ b/apps/widdevst/ChangeLog @@ -1,2 +1,3 @@ 0.01: First version 0.02: Support for Bangle.js 2 +0.03: Update storage usage and perform GC every minute diff --git a/apps/widdevst/metadata.json b/apps/widdevst/metadata.json index 91d6265fe..f2be2bec8 100644 --- a/apps/widdevst/metadata.json +++ b/apps/widdevst/metadata.json @@ -1,6 +1,6 @@ { "id": "widdevst", "name": "Device Status Widget", - "version": "0.02", + "version": "0.03", "description": "Shows power status of Bluetooth, Compass, GPS and Heart Rate Monitor as well as storage and memory usage.", "icon": "icon.png", "type": "widget", diff --git a/apps/widdevst/wid.js b/apps/widdevst/wid.js index 06eb20cdd..3cd5758ab 100644 --- a/apps/widdevst/wid.js +++ b/apps/widdevst/wid.js @@ -1,22 +1,31 @@ (() => { - WIDGETS.devst = {area: "tr", width: 21, draw: function() { + var stat = {date: 0}; + + WIDGETS.devst = {area: "tr", width: 22, draw: function() { if (WIDGETS.devst._draw) return; + var d = new Date(); + var t; + if ((d - stat.date) < 6e4) { + t = process.memory(false); + } else { + stat.date = d; + t = require('Storage').getStats(); + stat.sto = t.fileBytes / t.totalBytes; + t = process.memory(); + } + t = t.usage / t.total; var x = this.x; var y = this.y; g.reset(); - g.clearRect(x, y, x + 20, y + 23); - g.drawRect(x + 1, y + 1, x + 19, y + 22); + g.clearRect(x, y, x + 21, y + 23); + g.drawRect(x + 2, y + 1, x + 20, y + 21); g.setFont('6x8', 1); - if (NRF.getSecurityStatus().connected) g.drawString('B', x + 4, y + 3); - if (Bangle.isCompassOn()) g.drawString('C', x + 12, y + 3); - if (Bangle.isGPSOn()) g.drawString('G', x + 4, y + 13); - if (Bangle.isHRMOn()) g.drawString('H', x + 12, y + 13); - var t = require('Storage').getStats(); - var u = t.fileBytes / t.totalBytes; - g.setColor(col(u)); g.drawRect(x + 1, y + 22, x + 1 + u * 18, y + 23); - t = process.memory(false); - u = t.usage / t.total; - g.setColor(col(u)); g.drawRect(x, y + 22 - u * 21, x + 1, y + 22); + if (NRF.getSecurityStatus().connected) g.drawString('B', x + 5, y + 3); + if (Bangle.isCompassOn()) g.drawString('C', x + 13, y + 3); + if (Bangle.isGPSOn()) g.drawString('G', x + 5, y + 12); + if (Bangle.isHRMOn()) g.drawString('H', x + 13, y + 12); + g.setColor(col(stat.sto)); g.drawRect(x + 2, y + 21, x + 2 + stat.sto * 18, y + 22); + g.setColor(col(t)); g.drawRect(x + 1, y + 21 - t * 20, x + 2, y + 21); }}; function col(p) { From 3b52491e4f0420582df435b5f205719d46a1fadf Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Thu, 16 Mar 2023 21:05:46 +0100 Subject: [PATCH 77/89] remove a print statement --- apps/quicklaunch/app.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index 1445f02c5..22269c20d 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -31,7 +31,6 @@ }; let swipeHandler = (lr,ud) => { - print("swipe", lr,ud); if (lr == -1) trace = leaveTrace(trace+"l"); // l=left, if (lr == 1) trace = leaveTrace(trace+"r"); // r=right, if (ud == -1) trace = leaveTrace(trace+"u"); // u=up, From b3a59ff35c8bdfaa496ce07cc9ef4fc240e24d7a Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Thu, 16 Mar 2023 18:39:46 +0100 Subject: [PATCH 78/89] Use substring of message as label when it's longer than fits the designated menu entry. Also add some semicolons. --- apps/alarm/ChangeLog | 1 + apps/alarm/app.js | 28 ++++++++++++++++++++-------- apps/alarm/metadata.json | 2 +- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index ab7db522c..5f068a6b3 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -42,3 +42,4 @@ When switching 'repeat' from 'Workdays', 'Weekends' to 'Custom' preset Custom menu with previous selection Display alarm label in delete prompt 0.39: Dated event repeat option +0.40: Use substring of message when it's longer than fits the designated menu entry. diff --git a/apps/alarm/app.js b/apps/alarm/app.js index f5758afb0..4deb5764b 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -3,7 +3,7 @@ Bangle.drawWidgets(); // 0 = Sunday (default), 1 = Monday const firstDayOfWeek = (require("Storage").readJSON("setting.json", true) || {}).firstDayOfWeek || 0; -const WORKDAYS = 62 +const WORKDAYS = 62; const WEEKEND = firstDayOfWeek ? 192 : 65; const EVERY_DAY = firstDayOfWeek ? 254 : 127; const INTERVALS = ["day", "week", "month", "year"]; @@ -50,6 +50,12 @@ function getLabel(e) { ) + (e.msg ? ` ${e.msg}` : ""); } +function trimLabel(label, maxLength) { + return (label.length > maxLength + ? label.substring(0,maxLength-3) + "..." + : label.substring(0,maxLength)); +} + function showMainMenu() { const menu = { "": { "title": /*LANG*/"Alarms & Timers" }, @@ -58,7 +64,7 @@ function showMainMenu() { }; alarms.forEach((e, index) => { - menu[getLabel(e)] = { + menu[trimLabel(getLabel(e),40)] = { value: e.on ? (e.timer ? iconTimerOn : iconAlarmOn) : (e.timer ? iconTimerOff : iconAlarmOff), onchange: () => setTimeout(e.timer ? showEditTimerMenu : showEditAlarmMenu, 10, e, index) }; @@ -139,6 +145,9 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex, withDate) { }, /*LANG*/"Message": { value: alarm.msg, + format: v => (v.length > 7 + ? (v.substring(0,6)+"...") + : v.substring(0,7)), onchange: () => { setTimeout(() => { keyboard.input({text:alarm.msg}).then(result => { @@ -238,7 +247,7 @@ function decodeRepeat(alarm) { .map((day, index) => alarm.dow & (1 << (index + firstDayOfWeek)) ? day : "_") .join("") .toLowerCase()) - : /*LANG*/"Once" + : /*LANG*/"Once"; } function showEditRepeatMenu(repeat, day, dowChangeCallback) { @@ -310,7 +319,7 @@ function showCustomDaysMenu(dow, dowChangeCallback, originalRepeat, originalDow) // If the user unchecks all the days then we assume repeat = once // and we force the dow to every day. var repeat = dow > 0; - dowChangeCallback(repeat, repeat ? dow : EVERY_DAY) + dowChangeCallback(repeat, repeat ? dow : EVERY_DAY); } }; @@ -321,7 +330,7 @@ function showCustomDaysMenu(dow, dowChangeCallback, originalRepeat, originalDow) }; }); - menu[/*LANG*/"Cancel"] = () => setTimeout(showEditRepeatMenu, 10, originalRepeat, originalDow, dowChangeCallback) + menu[/*LANG*/"Cancel"] = () => setTimeout(showEditRepeatMenu, 10, originalRepeat, originalDow, dowChangeCallback); E.showMenu(menu); } @@ -370,6 +379,9 @@ function showEditTimerMenu(selectedTimer, timerIndex) { }, /*LANG*/"Message": { value: timer.msg, + format: v => (v.length > 7 + ? (v.substring(0,6)+"...") + : v.substring(0,7)), onchange: () => { setTimeout(() => { keyboard.input({text:timer.msg}).then(result => { @@ -411,7 +423,7 @@ function showEditTimerMenu(selectedTimer, timerIndex) { showMainMenu(); } else { timer.timer = require("time_utils").encodeTime(time); - setTimeout(showEditTimerMenu, 10, timer, timerIndex) + setTimeout(showEditTimerMenu, 10, timer, timerIndex); } }); }; @@ -458,9 +470,9 @@ function enableAll(on) { alarm.on = on; if (on) { if (alarm.timer) { - prepareTimerForSave(alarm, i, require("time_utils").decodeTime(alarm.timer)) + prepareTimerForSave(alarm, i, require("time_utils").decodeTime(alarm.timer)); } else { - prepareAlarmForSave(alarm, i, require("time_utils").decodeTime(alarm.t)) + prepareAlarmForSave(alarm, i, require("time_utils").decodeTime(alarm.t)); } } }); diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index 8522b07c0..471b181c5 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Alarms & Timers", "shortName": "Alarms", - "version": "0.39", + "version": "0.40", "description": "Set alarms and timers on your Bangle", "icon": "app.png", "tags": "tool,alarm", From 1dd4344e753d45222c26c9e913eebe209d15f8de Mon Sep 17 00:00:00 2001 From: Ben Merritt Date: Fri, 17 Mar 2023 20:46:23 -0700 Subject: [PATCH 79/89] Fix a menu crash in alarms app --- apps/alarm/ChangeLog | 1 + apps/alarm/app.js | 18 ++++++++++++------ apps/alarm/metadata.json | 2 +- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index 5f068a6b3..df763f599 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -43,3 +43,4 @@ Display alarm label in delete prompt 0.39: Dated event repeat option 0.40: Use substring of message when it's longer than fits the designated menu entry. +0.40: Fix a menu bug affecting alarms with empty messages. diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 4deb5764b..f8ed0322e 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -56,6 +56,16 @@ function trimLabel(label, maxLength) { : label.substring(0,maxLength)); } +function formatAlarmMessage(msg) { + if (msg == null) { + return msg; + } else if (msg.length > 7) { + return msg.substring(0,6)+"..."; + } else { + return msg.substring(0,7); + } +} + function showMainMenu() { const menu = { "": { "title": /*LANG*/"Alarms & Timers" }, @@ -145,9 +155,7 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex, withDate) { }, /*LANG*/"Message": { value: alarm.msg, - format: v => (v.length > 7 - ? (v.substring(0,6)+"...") - : v.substring(0,7)), + format: formatAlarmMessage, onchange: () => { setTimeout(() => { keyboard.input({text:alarm.msg}).then(result => { @@ -379,9 +387,7 @@ function showEditTimerMenu(selectedTimer, timerIndex) { }, /*LANG*/"Message": { value: timer.msg, - format: v => (v.length > 7 - ? (v.substring(0,6)+"...") - : v.substring(0,7)), + format: formatAlarmMessage, onchange: () => { setTimeout(() => { keyboard.input({text:timer.msg}).then(result => { diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index 471b181c5..b986512bc 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Alarms & Timers", "shortName": "Alarms", - "version": "0.40", + "version": "0.41", "description": "Set alarms and timers on your Bangle", "icon": "app.png", "tags": "tool,alarm", From 197f9bb436df8e98fb6e4130e1e4b1b12dc921d5 Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.com⁩> Date: Sat, 18 Mar 2023 12:14:23 +0100 Subject: [PATCH 80/89] Don't go down extensions paths if nothing waits at the end --- apps/quicklaunch/ChangeLog | 1 + apps/quicklaunch/app.js | 14 +++++++++----- apps/quicklaunch/metadata.json | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/apps/quicklaunch/ChangeLog b/apps/quicklaunch/ChangeLog index 0465a77e7..5d70e010b 100644 --- a/apps/quicklaunch/ChangeLog +++ b/apps/quicklaunch/ChangeLog @@ -14,3 +14,4 @@ settings page to prompt an automatic update of the quicklaunch.json settings file with new key names. 0.13: Touch and hold to pause the timeout to clock temporarily. +0.14: Extension: Don't go down a path if nothing waits at the end. Revisit the current intersection instead. diff --git a/apps/quicklaunch/app.js b/apps/quicklaunch/app.js index 22269c20d..2fc4910ab 100644 --- a/apps/quicklaunch/app.js +++ b/apps/quicklaunch/app.js @@ -9,16 +9,20 @@ }; let leaveTrace = function(trace) { - settings.trace = trace; - storage.writeJSON("quicklaunch.json", settings); + if (settings[trace+"app"].name != "") { + settings.trace = trace; + storage.writeJSON("quicklaunch.json", settings); + } else { trace = trace.substring(0, trace.length-1); } return trace; }; let launchApp = function(trace) { - if (settings[trace+"app"].src){ - if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); + if (settings[trace+"app"]) { + if (settings[trace+"app"].src){ + if (settings[trace+"app"].name == "Show Launcher") Bangle.showLauncher(); else if (!storage.read(settings[trace+"app"].src)) reset(trace+"app"); else load(settings[trace+"app"].src); + } } - } + }; let trace = settings.trace; diff --git a/apps/quicklaunch/metadata.json b/apps/quicklaunch/metadata.json index 945d98002..c2e3029f7 100644 --- a/apps/quicklaunch/metadata.json +++ b/apps/quicklaunch/metadata.json @@ -2,7 +2,7 @@ "id": "quicklaunch", "name": "Quick Launch", "icon": "app.png", - "version": "0.13", + "version": "0.14", "description": "Tap or swipe left/right/up/down on your clock face to launch up to five apps of your choice. Configurations can be accessed through Settings->Apps.", "type": "bootloader", "tags": "tools, system", From a152ff546ca2d7a83d8518204ee87cf0e2a82066 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Sun, 19 Mar 2023 08:26:51 +0100 Subject: [PATCH 81/89] hrmmar: bthrm compatibility - Disable when bthrm is active - Enable fft elim as default --- apps/hrmmar/ChangeLog | 3 +++ apps/hrmmar/README.md | 4 ++-- apps/hrmmar/boot.js | 12 ++++++++---- apps/hrmmar/fftelim.js | 4 ++-- apps/hrmmar/metadata.json | 2 +- apps/hrmmar/settings.js | 2 +- 6 files changed, 17 insertions(+), 10 deletions(-) create mode 100644 apps/hrmmar/ChangeLog diff --git a/apps/hrmmar/ChangeLog b/apps/hrmmar/ChangeLog new file mode 100644 index 000000000..8c418c8fd --- /dev/null +++ b/apps/hrmmar/ChangeLog @@ -0,0 +1,3 @@ +0.01: New App +0.02: Disable when bthrm is active + Enable fft elim as default diff --git a/apps/hrmmar/README.md b/apps/hrmmar/README.md index ff90d9156..2d9612117 100644 --- a/apps/hrmmar/README.md +++ b/apps/hrmmar/README.md @@ -7,5 +7,5 @@ Measurements from the build in PPG-Sensor (Photoplethysmograph) is sensitive to * **MA removal** Select the algorithm to Remove Motion artifacts: - - None: (default) No Motion Artifact removal. - - fft elim: (*experimental*) Remove Motion Artifacts by cutting out the frequencies from the HRM frequency spectrum that are noisy in acceleration spectrum. Under motion this can report a heart rate that is closer to the real one but will fail if motion frequency and heart rate overlap. + - None: No Motion Artifact removal. + - fft elim: (default, *experimental*) Remove Motion Artifacts by cutting out the frequencies from the HRM frequency spectrum that are noisy in acceleration spectrum. Under motion this can report a heart rate that is closer to the real one but will fail if motion frequency and heart rate overlap. diff --git a/apps/hrmmar/boot.js b/apps/hrmmar/boot.js index 52d88c313..4c589bc03 100644 --- a/apps/hrmmar/boot.js +++ b/apps/hrmmar/boot.js @@ -5,8 +5,12 @@ bpm_corrected = bpm; }; + const isInternal = (hrm) => { + return !hrm.src || hrm.src === "int"; + }; + Bangle.on('HRM', (hrm) => { - if (bpm_corrected > 0) { + if (isInternal(hrm) && bpm_corrected > 0) { // replace bpm data in event hrm.bpm_orig = hrm.bpm; hrm.confidence_orig = hrm.confidence; @@ -17,16 +21,16 @@ let run = () => { const settings = Object.assign({ - mAremoval: 0 + mAremoval: 1 }, require("Storage").readJSON("hrmmar.json", true) || {}); // select motion artifact removal algorithm switch(settings.mAremoval) { case 1: - require("hrmfftelim").run(settings, updateHrm); + require("hrmfftelim").run(settings, updateHrm, isInternal); break; } - } + }; // override setHRMPower so we can run our code on HRM enable const oldSetHRMPower = Bangle.setHRMPower; diff --git a/apps/hrmmar/fftelim.js b/apps/hrmmar/fftelim.js index 98b7f33ad..f57489dda 100644 --- a/apps/hrmmar/fftelim.js +++ b/apps/hrmmar/fftelim.js @@ -1,4 +1,4 @@ -exports.run = (settings, updateHrm) => { +exports.run = (settings, updateHrm, isInternal) => { const SAMPLE_RATE = 12.5; const NUM_POINTS = 256; // fft size const ACC_PEAKS = 2; // remove this number of ACC peaks @@ -147,7 +147,7 @@ exports.run = (settings, updateHrm) => { }); Bangle.on('accel', (acc) => { - if (hrmdata !== undefined) { + if (hrmdata !== undefined && isInternal(hrmdata)) { hrmvalues[idx] = hrmdata.filt; accvalues[idx] = acc.x*1000 + acc.y*1000 + acc.z*1000; idx++; diff --git a/apps/hrmmar/metadata.json b/apps/hrmmar/metadata.json index 232ff64a7..fcb2fac5c 100644 --- a/apps/hrmmar/metadata.json +++ b/apps/hrmmar/metadata.json @@ -3,7 +3,7 @@ "name": "HRM Motion Artifacts removal", "shortName":"HRM MA removal", "icon": "app.png", - "version":"0.01", + "version":"0.02", "description": "Removes Motion Artifacts in Bangle.js's heart rate sensor data.", "type": "bootloader", "tags": "health", diff --git a/apps/hrmmar/settings.js b/apps/hrmmar/settings.js index 3c6e62c91..c391f6862 100644 --- a/apps/hrmmar/settings.js +++ b/apps/hrmmar/settings.js @@ -2,7 +2,7 @@ var FILE = "hrmmar.json"; // Load settings var settings = Object.assign({ - mAremoval: 0, + mAremoval: 1, }, require('Storage').readJSON(FILE, true) || {}); function writeSettings() { From 31ea6b6f1e1b8ea0d01aab43780dcd96d59567fe Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 20 Mar 2023 09:29:23 +0000 Subject: [PATCH 82/89] Update ChangeLog --- apps/alarm/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index df763f599..6f306f61a 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -43,4 +43,4 @@ Display alarm label in delete prompt 0.39: Dated event repeat option 0.40: Use substring of message when it's longer than fits the designated menu entry. -0.40: Fix a menu bug affecting alarms with empty messages. +0.41: Fix a menu bug affecting alarms with empty messages. From ebdd75c0b5932e5a25cd2e7e3de54906745885a0 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 21 Mar 2023 15:05:38 +0000 Subject: [PATCH 83/89] Fix writing of timezone to storage if the timezone value is 0 (fix https://github.com/espruino/BangleApps/issues/2575) --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 2bb1e55d3..425c4a98a 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 2bb1e55d32d640312fe08cf54de1cd9c498cd31e +Subproject commit 425c4a98aed7c4d9b640e37463b534a45a20def7 From 9b13872e5d72cddde0271d7b9c03a00eb4224a5e Mon Sep 17 00:00:00 2001 From: TonyKaku Date: Wed, 22 Mar 2023 17:43:53 +0100 Subject: [PATCH 84/89] Improved Japanese translation. --- lang/ja_JA.json | 136 ++++++++++++++++----------------- lang/unicode-based/ja_JA.json | 138 +++++++++++++++++----------------- 2 files changed, 137 insertions(+), 137 deletions(-) diff --git a/lang/ja_JA.json b/lang/ja_JA.json index f0a1481f8..8caff782b 100644 --- a/lang/ja_JA.json +++ b/lang/ja_JA.json @@ -1,123 +1,123 @@ { "// created with bin/language_render.js": "", "GLOBAL": { - "New Alarm": "\u0000]\u0010\u0000\u0010\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@#ü \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u001fƞ\u0004‰\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€\u0000Ā€$HCĆ #Ā€\u0000\u0000\u0002\u0002$\u0001\"AĆ”\u0000Ć \u0000\u0000\u0000\u0010\n ƒ\u0000\u0010\u00008\u0000\u0000\u0000ƒýøH\t\u0000ĀŽ@\u0000\u0000\b\u0001\t\u0004@Ā€0\u0003Ā‚\b\u001f\u0000@\bH\"\u0014\u0001\u0000\u0000\u0010?\u0000\u0002CĆŗB\b@\b\u0000\u0001\u0000\u0000\u0000!\u0002\u0012 @\u0000@\u0000\b\u0000\u0000\u0001\fTư\u0004\u0000\u0000Ā€\u0000\u0000S””€\u0010\u0000 \u0000\b\u0000\u0000\u0001ƠƄD\u0000Ā€\u0002\u0000\u0001Ā€\u0000\u0000\u0000\u0000Ā¢#ÿø \u00000\u0000\u0000\u0000\u0000\u0002!\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "New Timer": "\u0000]\u0010\u0000\u0010\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@#ü \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u001fƞ\u0004‰\u0000Ā€\u0000\b\u0000\u0000\u0000\u0000\u0000Ā€$H\u0002\u0000\u0000@\u0000\u0000\u0000\u0002$\u0001\"@\u001f\u0000\u0004\u0002\u000f\u0000\u0000\n ƒ\u0001\b\u0000@\u000fĀ„\u0000\u0003ýøH\bĀ€\f\u0000\u0000@\u0000\u0001\t\u0004@€¤\u0001Ā \u0000\u0004\b\u001f\bH\"\u0014\bƀ0Ā€\u0000@?\u0003ĆŗB\b@Ā‚\u0000\u0004\u0000d\u0000\u0000\u0002\u0012 @\u0000 \u0000 \u0000ƀ\u0000\u0000Tư\u0002\u0000\u0001\u0000\u0001\u0000\u0000\u0004”€\u0010\u0000 \u0000\b\u0000\u0004\u0000\u0000DD\u0000Ā€\u0006\u0000\u0000@\u0000\u0000\u0000\u0000Ā¢#ÿøÀ\u0000\u0002\u0000\u0000\u0000\u0000\u0002!\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "New Alarm": "\u0000l\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0010\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0000\b\u0000Oư@\b|\u0004p\u0000\u0000\u0000@\u0004°\u0004\u0004\u001fx@8\u0000\u0000\u0000\u0004\u0000<\u0000\b\u0013ù\u0010\b\u0000\u001c\u0000\u0000\u0000@\u0001\u0000\u0000Ćæ\u0004Ā‘\t\u0000ĀŽ@\u0000\u0000\b\u0000\u0010ƒÈ\u0000I\u0010`\u0007\u0004\u0010>\u0000Ā€\u0003Ǝ\u0004Ā€\u0004Ā‘\u0004\u0000\u0000@ü\u0000\t\u0000c\u0000OĆøI\u0010@\u0000\b\u0000\u0000\u0001\b\b`\u0004€„‘\u0004\u0000\u0000Ā€\u0000\u0000\u0010ƀ\n\u0000H\bI\u0010Ā€\u0000\u0010\u0000\u0000\nr\u0001 \u0004ÿ„‘\b\u0000\u0002\u0000\u0000\u0000x \u0000H\b‰\u0011\u0000\u0000ƀ\u0000\u0000\u0000\u0000\u0002\u0000\n\u0000\bŸ \u00000\u0000\u0000\u0000\u0000\u0000\u001f\u001fù)\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000!\u0000", + "New Timer": "\u0000l\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0010\u0004\u0000\b\u0000\u0000Ā€\u0000\u0000\u0000\u0000\b\u0000Oư@\u0000@\u0000\b\u0000\u0000\u0000\u0000\u0004°\u0004\u0004\u001f\u0007ƀ\u0001\u0000ĀƒĆ€\u0000\u0000<\u0000\b\u0013ù\u0010Ā„\u0000 \u0007Ƃ\u0000\u0000\u0001\u0000\u0000Ćæ\u0004Ā‘\bĀ€\f\u0000\u0000@\u0000\u0000\u0010ƒÈ\u0000I\u0011H\u0003@\u0000\b\u0010>\u0003Ǝ\u0004Ā€\u0004Ā‘#\u0000Ƃ\u0000\u0001\u0000ü\u0000c\u0000OĆøI\u0014\u0010\u0000 \u0003 \u0000\u0000\b`\u0004€„‘\u0002\u0000\u0002\u0000\f\u0000\u0000\u0000\n\u0000H\bI\u0010@\u0000 \u0000 \u0000\u0000\u0001 \u0004ÿ„‘\b\u0000\u0002\u0000\u0001\u0000\u0000\u0000 \u0000H\b‰\u0013\u0000\u0000 \u0000\u0000\u0000\u0000\u0002\u0000\n\u0000\bĀŸĆ€\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u001f\u001fù)\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000!\u0000", "Save": "\u0000\u001f\u0010\u0000\b\u0000\u0004\u0000\u0017ư\b\u0000(#ÿø@@\u0001 €€\u0006\u0002\f\u0010\u0004\u0004( \u0018\u0010—üP@!Ɓ/üE@A\u0000Ā’@Ā‚\u0001DA\u0004\u0003\bB\b\u0004\u0010\u0004P\b \b@", - "Keep Msgs": "\u0000F\f\u0000Ā„\u0000\u0000\u0000\u0000Ā„\u0000\u0000\u0002 \u0000\u0000\u0000\u0002\u0010\u0000\u0010\t\u0007‡‹€\fLJGĀØ!!1\u00003!\"!À„„„\u0000Ā“Ā€ĀˆĀƒ\u0003óò\u0010\u0002т!Š\b\b\b@\bA‡\u0001¤ !\u0000!\u0001\u0010\u0001ĀˆĀ„Ā„Ć„\u0000„„x†\u0011Ôâà\u0002\u0011Ć¢\u0011Ć \u0000\u0000\b\u0000\u0000\u0000\b@\u0000\u0000\u0000 \u0000\u0000\u0000\u001e\u0000", - "circle count": "\u0000y\r\u0000\u0002\u0000\u0000\u0000\u0010\u0000\u0000\u0000\b\u0000\b\u0000\u0000\u0000 \u0010Ā€\u0000\u0000\u0004Ć \u0002\u0000\u0002\u0000\u0002\u0000\u0000\u0000\b\u0004@\u0000\u0000\u0003\bĀ€\u0001\u0000\u0001\u0000\u0018\u0000\u0004\u0002 \u0000\u0000\u0001\u0010\u0002@\u0010Ćø\u0000Ćø\u0002\u0004\u0002\t>\u0000\u0000\u0001\b\u0001 \u0007Ƅ\u000fĀ„\u0000Ā‚\u0001\u0003ĆØ\b\u001f\u0000ˆ\u0000Ā‘\u0000B\u0002\u0002\u0000\u0002\u0000Ć D\u0003ư\u0000Ā„\u0000HĀ€!\u0001\u0002\u0000\u0001\u0000L\"\u0000\u0000\u0000Ā„\u0000$Ā€!\u0000A\u0000\u0001\u0000!\u0011\u0000\u0000\u0000\u0002\u0000\"@\u0010Ā€!\u0000\u0001\u0000\u0010\u0001\u0000\u0000\u0000\u0002\u0000\u0011@\u0010@\u0000Ā€\u0001\u0000\b\u0000Ā€\u0000\u0000\u0002\u0000\u0010ƀ\u0011@\u0000Ā€\u0013\u0000\u0004\u0000Ā€\u0000\u0000\u0002\u0000\u0010@\u0010`\u0000Ā€\u0006\u0000\u0002\u0000Ā€\u0000\u0000\u0002\u0000\u0000\u0000\u0000 \u0000Ā€\u0000\u0000\u0001\u0000", - "(repeat)": "\u0000J\u0010\u0000\u0000ĀĆ \u0000\u0000\u0000@\u0000\u0000\u0000\"\b \u0000@x\u0000\u0000\u0000\u0010Ā‚\u0004ƀ\tĆ \b\u0000\u0000Ā…?H\u0002@\u0001\u0000\u0004B@\u0000a\u0000\u0010\u0000@\u0000‘ç¼\u0018@\u0007Ćø\u0010\u0000(\t)\u0004\u0010y\u0002\u0004\u0000\u0006\u0004JA\u0004\u0002Q\u0001\u0000\u0001Ā‚^ưA\u0000Ā’Ā€@\u0000aư@\u0010@$@\u0010\u0000\u0018\u0005Ćæ\u0000 \t(\u0004\u0004\u0006\u0000\u000e\u0000\b\u0002Ā‘\u0001\u0002\u0001EE@\u0004\u0000ĀØ #\u0000Ā‘RH\u0002\u0000P\u0000\u0007\u0000\"C\u0011\u0001\u0000#Ćæ\u0000\u0000\u0010\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "Keep Msgs": "\u0000š\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000@Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u000bĆø\u0010 \u0001\u0000\u0000\u0000\u0010\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0002\u0000Ā€\u0002Ā‚\u0004\b\u0000 \u00020\u0002\u0000\u0000\u0000@\u0000\u0000\u0000ƂA,\u0001 \u001fƄ\u000fĀ€t\u0000Ā€\u0000\u0000\u0010\u0000\u0000\u0000\bP<\u0000H#ð€þ\u0000\u0002\u0000 \u0000\u0000\u0004x\u0000\u0000\u0000\u0010\u0004\u00003Ćø\u0010 \u0000Ā€\u0001\u0001ˆ\u0000\u0000\u0001b\u0000\u0000\u0006\u0000\u0001\b\f\u0010\u0004ÿ€à\u0000Ā€\u001c\u0000D\u0002a\u0004\u000fĀ€@€ó…\u0004\u0001\u0000Ā€L\u0000|\u0001\u0000HĀ€p۟\u0000\u0000@c\u0002_ư` \u0011\u00000€ \n \u0004@\u0000\u0000\u0000 !Ā€\u0010Ć 3þ\u0003ƀ\u0010\u0010$\u0002\u0010\u0001\u0000\u0000\u0000\u0000\u0010\u0000Ā \u0004T4\u0002\u0000\u0010\b\u0004\u0010\u0000\u0004\u0000@\u0000\u0000\u0000\b\u0000H\u0001$\bĀ€\b\u00009\b\u0000\u0002\u0000\b\u0000\u0000\u0000L\u0000 \u0000Q\u0010A \u0002\u0000\u0011Œ\u0000\u0001\u0000\u0001ư\u0000\u0000\f\u0000\b\u0000\u0018B\u0010\b\u0001\u0000\u0004L\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0001Ćø\u0004\u0010\u0014\n\u0000Ā€\u0000Ć \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0002\u0001\u0000\u0000\u0000\u0000", + "circle count": "\u0000]\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t$\u0000Ā€\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000* B\u0000\u0000\u0000\u0013Ā€\b\u0000\u001e\u0000AƱ\u0010\u0000\u0000\u0000Ƥ\u0002 \u0003H?Ƒ\bĀ€\u0000\u0000\u0004@\t\u0000\" TŠOĀ€\u0000\u0000B\u0000H\u0001\u0010„”OĀ  |\u0002 \u0002D\u0011\u0004DR\u0011\u0000ü\u0000!\u0000\u0012 ˆ @ ˆ\u0000\u0000\u0002\u0010\u0000Ā’\u0004\u001fƅ\u0004@\u0000\u0000\u0000Ā€\b$\u0010\"\u0010\u0004\u0000\u0000\u0000\b\u0000E\u0001@Ā‚\u0010Ā€ \u0000\u0000\u0000Ā€\u00040\u0004\u0018\u0019\n\u0002\u0000\u0000\u0000\b\u0000A\u0000\u0003\u00000P \u0000\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0003D@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000aA", + "(repeat)": "\u0000J\r\u0000\u0000\u0002\u0000\u0001Ā€\u0000\u0000@\u0000\b\u0010@ \u0000\u0000\b\u0000D\u0002\u0010\u0004$\u0000\u0000\u0002\u0000\t\u0000Ā„\u0001\u0006\u0000\u0000\u0000Ā€\u0002Ā€!\u0000@\u0000\u0000\u0000 \u0000`\b@\u0011Àð\u000e\u0000\u0018\u0002\u0010\u0007Ā€\u001fĀ€\u0002`\u0006\u0000Ā„\u0001\u0000\u0000\u0000\u0000Ā„\u0001Ā€\u0002\u0000@\u0000\u0000\u0000 \u0000`\u0000Ā€\u0010\u0000\u0000\u0000\b\u0000\u0014\u0000@\u0002\u0000\u0000\u0000\u0002\u0000\t\u0000 \u0000~\u0000\u0000\u0000Ā€\u0002 \u0010\u0000\u0000\u0000\u0000\u0000 \u0001\u0000", "music": "\u0000\u001f\u0010\u0000\u0002\u0000\u0001\u0000\u0002\u0000Ā„\bÿàŸ \u0000\u0000¢€‚\u0000D\u0000ˆ\u0002Ćŗ?ÿ‰\u0012\u0000\u0000b\"\u001fư\u0007ƀ \u0002\u0000@Cÿøÿ€*\u0001\u0001\u0000Ā’\u0002\u0002\u0006#\u0007ü0Aˆ\b\u0000Ā€", "Auto snooze": "\u0000l\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0001\u0000\u0000\u0000\u0010\u0000CĀ€Cƀ\u0000\u0000‡P\u0010\u0000\u0000\u0001\u0000\u0003ƈ\u0003Ƅ\u0000\u0000\u0007”à\u0000\u0000\u0010\u0000\u0001\u0000\u0000Ā€\u0000\u0000\u0002\u0007ư\u0000\u0000\u0001\u0000\u0000\u0010\u0000\b\u0000\u0000\u0000 \u0003\u0001\u0003Ć \u001c\u0000\u0002\u00009\u0001\u0003Ć \u0004\u0000P\u000fƀ\u00010\u0000 \u0000p\u000fƀ\u0000@\t\u0000\u0000\u0000\u0010Ā€\u0005\u0000\u0003\u0000\u0000\u0000\n\u0001\u0010\u0000\u0000\u0001\u0000\u0000ˆ\u0000H\u0000\u0000\u0001\u0010!\u0000\u0000\u0000\u0010\u00000@\b@\u0000\u0000`Ā„\u0010\u0000\u0000\u0001\u0000\f\u0004\u0003\u0004\u0000\u0000\u0018\b\u0003\u0000\u0000\u0000\u0010\u0000\u0000\u0000ƀ\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "week": "\u0000:\r\u0000\b\u0000\u0000\u0000\u0000\u0000\u0010\u0001\u0000\u0000\u0000\u0000\u0000\u0002p@\u0000\u0000\u0000\u0000\u0000Ƥ\u001f\u0000\u0002\u0000\u0000\u0000\"Ćø@\u0001\u0000\u0000\u0000\u0010\u0010\u0000Ā€@Ćø\u0004D\b\u0000Ć \u000fƀ\u0002\u0010Ā‚\u0001ƈ\u0000\u0000\u0001\b!\u0000\u0002\u0000\u0000\u0000\u0002\u0000@\u0000Ā€\u0000\u0000\u0001\u0000 \u0000 \u0000\u0000\u0000Ā€\u0010\u0000\b\u0000\u0000\u0000@\b\u0000\u0002\u0000\u0000\u0000 \u0000", + "week": "\u0000\u001d\u000f\u0000Gü|ù\"\"$I\u0011\u001f>\u000bè‰\u0010DGĆĆ³Ć¾ \u0004\u0011?$¾‰\t%\u0014OƉ/Ā¢BI\u0001\u0013òP\u0018•\u0000\u0004\u0000Çÿ \u0014\u0000\u0001\u0000@", "circle 1": "\u0000E\r\u0000\u0002\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000N\u0000 \u0000\u0004@\u0000\u0000\u0003\bĀ€\b\"\u0000\u0000\u0000\u0011\u0000$\u0000Ɖ>\u0000\u0000\u0001\b\u0001 \n>€ð\bĀ€\t\u0010\u0010D\u0003ư\u0000Ā„\u0000H€‚ \u0000\u0000\b@\u0002H\u0004\u0011\u0000\u0000\u0000\u0002\u0000\"@ \u0010\u0000\u0000\u0000 \u0001\u0014\u0001\u0000Ā€\u0000\u0000\u0002\u0000\u0010ƀ\b\b\u0000\u0000\u0000 \u0001\u0004\u0001ð€\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000", "circle 3": "\u0000E\r\u0000\u0002\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000N\u0000 \u0000\u0004@\u0000\u0000\u0003\bĀ€<\"\u0000\u0000\u0000\u0011\u0000$\u0002\u0019>\u0000\u0000\u0001\b\u0001 \u0010¾€ð\bĀ€\t\u0010\u0004D\u0003ư\u0000Ā„\u0000HÂ \u0000\u0000\b@\u0002H\u0001\u0011\u0000\u0000\u0000\u0002\u0000\"@\b\u0010\u0000\u0000\u0000 \u0001\u0014\b@Ā€\u0000\u0000\u0002\u0000\u0010ƀB\b\u0000\u0000\u0000 \u0001\u0004\u0001à€\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000", "circle 2": "\u0000E\r\u0000\u0002\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000N\u0000 \u0000\u0004@\u0000\u0000\u0003\bĀ€<\"\u0000\u0000\u0000\u0011\u0000$\u0002\u0019>\u0000\u0000\u0001\b\u0001 \u0010¾€ð\bĀ€\t\u0010\u0004D\u0003ư\u0000Ā„\u0000H€Â \u0000\u0000\b@\u0002H\b\u0011\u0000\u0000\u0000\u0002\u0000\"@Ā€\u0010\u0000\u0000\u0000 \u0001\u0014\b\u0000Ā€\u0000\u0000\u0002\u0000\u0010ƀ@\b\u0000\u0000\u0000 \u0001\u0004\u0003ð€\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000", - "show widgets": "\u0000^\r\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0010\u0004\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000@\u0010\u0000\u0000Ā€\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000@@\u0002\u0000\u001e.\u001e Ā€ Œ\u001d\u001d\u001e\b\u001e„Ä„’\u0000Ā’\u0010ĀŒĀˆĀ„ĆøĀ†\u0002\u0012\u0012H\u0002HB\u0012\"\u0010Ā‚\u0006\bHI \t!\bHĀĆ‚\u0006\u0006!!$Ā€$Ā„!\u001c \b\u0006\u0004„„’\u0000Ā’\u0010Ā„@Ā€ \u0006\u0012\u0012\u0012H\u0002HB1Ć¢\u0010Ā‚\u0017ˆG†À\u0006ƇƇHG‡€\u0000\u0000\u0000\u0000\u0000\u0000\u0000!\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000x\u0000\u0000\u0000", + "show widgets": "\u0000Ā\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€\u0000 \u0007Ćæ\u0002\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\u0000\b\u0000\u0002\u0000ü\u0000\u0000\b\u0000\u0000\u0000a \u0000\u0000\u0000\u0000 \u0000Ā–\u0000\b\u0000\u0000\u0000@\u0000\u0000\u0000Ā…\u0000\u0000\u0000\u0000\u0001\u0000\u0003ƀ\u0000@\u0000\u0000\u0003Ć \u0000@\u0000 \u0000\u0000\u0000\u0000\b\u0000\b\u0000ư\u0000\u0003Ć”\u0000\u0004\u0001Ā€\u0000\u0000\u0000\u0000\u0000@\u0000B\u0000\u0010\u000fÿè\b\u0000@\u0002\u0004\u0000p\u0002 \u0003Ā€\u0007œ\u0000Ā€\u0000Ā€@Ā€\u000e\u0000\u0000@<\u0000HĀ€\u0013\u0000c\u0003ÿø\u0004\u0001\u0004\u0003\u0000\u0004\u0000 \u0001D\u0000Ā„\u00040\u0000Ā \u0002\"\b@\u0000Ā€\u0000@\u0001\u0000\b@\u0004\u0000\u0002Ā€\bˆ\u0011\b\u0002\u0000\u0004\u0000\u0004\u0000\b\u0000\u0002\u0000 \u0000$\u0000\b \u0000 \u0004ƀ\u0000x\u0000 \u0001\u0000\u0002\u0000\n\b\u0010@Ā‚\u0000\u0001\u0000\u0018\u0000< \u0002\u0000\b\u0000\u0010\u0001Ā’1\u0002\u0004 \u0000\b\u0000\u0000\u0000\u0000\u0000 \u0000@\u0000~\u0000Ā `P\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0001\u0000", "heartrate": "\u0000/\u0010\u0000\u0000\u0000\u0010 \b \u0004\u0000 @Ā’@\u0004\u0000A\u0000ĀØĀ€\u0004\u0000ĀĆ Aư\b\u000fƐOĆ“@Ā€\u0002 Ā…H\u0002\u0004A\u0012Q\u0012\u0002\nĀ‚DR$\u0004\u0019ü\u0010(H\u0004b\tüQ\u0010\u000bD\u0010ˆB ˆ\"\u0010ˆA\u0001\u0010FB€‚\u0002 ƒ\u0005\u0000ü\u0014\r\u0011\u0000\u0000\u0010Ā‚aA", "circle 4": "\u0000E\r\u0000\u0002\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000N\u0000 \u0000\u0004@\u0000\u0000\u0003\bĀ€\u0004\"\u0000\u0000\u0000\u0011\u0000$\u0000i>\u0000\u0000\u0001\b\u0001 \u0005>€ð\bĀ€\t\u0010HD\u0003ư\u0000Ā„\u0000HĀ„B \u0000\u0000\b@\u0002H\"\u0011\u0000\u0000\u0000\u0002\u0000\"AĆø\u0010\u0000\u0000\u0000 \u0001\u0014\u0000€€\u0000\u0000\u0002\u0000\u0010ƀ\u0004\b\u0000\u0000\u0000 \u0001\u0004\u0000 Ā€\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000", "battery warn": "\u0000n\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000H@\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007ù\u0000ˆ\u0000\u0001\u0000\u0000\u0000\u0000\u0000\b\u0000\u0000\u0004ĀĆ‚ \u0000\u0012\u0000\u0000\bư\u0004\u0010\u0000\u0000?b\u000fü\u0000(\u0000\u0000\u001c\u0000\b@\u0000\u0001\u0004PB\u0000DĀ€\u0000\u0000\u0000\u0000!\u0000\u0000\u0003Ђ\b\u0000ˆ\u0000\u0000\u0000\u000f\u0000Ā„\u0000\u0000\tE\u0000 \u0002\u0010\u0002 \u0011ƀ\u0002\u0010 |=cĆæ\u0010 $@9\u0000\b@~\u0000\n\u0000\u0000\u0000@Ā€Q\u0000\u0004\u0000!\u0000\u0000\u0007ÿð\u0000\u0002\u0001\u0001\b\u0000 \u0000\b\u0000\u0000\u0000\u0000\u0003þ\u0010\u0004\u0000 \u0000Ā€\u0000 \u0000\u0000\u001fü\b\bĀ€\u0010\u0001\u0000\u0004\u0000\u0001\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\b\u0000 \u0000\b\u0000\u0000\u0001ÿÀ€€\u0000\u0000@\u0001\u0000\u0000@\u0000\u0000\u0004\u0001\u0003þ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u001fü\b\b", "valid period": "\u0000=\u0010\u0000\u0002\u0000\u0010 \"\u0000\u0000\u0000\u0010\u0000A\u0001\u0013ãçÿÿ€\b\u001fƑ\u0011\"\b\u0001þ@Dˆùð@\u0000\u000fƂ$DH‡ø\u0012\u0012\u001f>>| A\b‰\u0011\u0000#\u0002\u0010$Ā„H‰ù/ư$$>DHJ@€”!\u0013Ć¢~b\u0004\u0002\t\bĀ‘\u0012\u0012\u001fĆ (Ā‰Ć¾ĀˆĀŸĀĀ\u0002$@HD„„\b!B\u0011B \u0004!B\u0004Ā”\u0004Q\u0000Ā”\u0004\u0000B\u0010A\b\u0002", "maximum": "\u0000\u001f\u0010\u0000\u001fư\u0001\u0000 \u0002\u0000ƀ\u0004\u0000€€\b\u0001Ćæ\u0000\u0010\u0000\u0000\u001fÿÿÿ€@\u0011\u0000\u0000Ā€>Ćø\u0002Ā€E\u0010\u0005\u0000Ćŗ@\u0011\u0001\u0012Ā€\"\u0002ò\u0000Ā‚\u001eJ\u0002\u0002\u0010Ā¢\b\u0002\u0001ƒ`\u0003", - "weather circle": "\u0000{\u000e\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000R\u0000\u0000\u0000@\u0000\u0000\u0002\u0000\u0000\u0000\u0010\u0000\u0000\u0000Ā…@\u0000\u0000Ā„\u0000\u0000\u0000'\u0000\u0010\u0002\u0000\u0000\u0000\bĀ \u0000\u0000\bĀ€\u0000\u0000\u0007 \u0011\u0000|\u0000\u0000\u0001\u0010\u0000\u0000\u0001\u0010\u0000\u0000\u0000ˆ\u0001!ð€\u0000\u0001'ƀ\u0000\u0001'ƀ\u0000\u0000!\u0000$\u0010\u0010\u0000Ć \u001f@@Ćø\u001f@@Ćø\u0004@\u0004Š\u0004\u0001Ć \u0000ˆ\u0007Ć \u0000ˆ\u0007Ć \u0001\b\u0000Ā‘ Ā€\u0004\u0000\u0011\u0000\u0000\u0000\u0011\u0000\u0000\u0000B\u0000\u0012D \u0000Ā€\u0002 \u0000\u0000\u0002 \u0000\u0000\u0000@\u0004H\u0004\u0000\u0010\u0000\b\u0000\u0000\u0000\b\u0000\u0000\u0000\u0010\u0000Š\u0001\u0000\u0003ƀ\u0001\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0004\u0000!Ā€@\u0007Ā„\u0000@\u0000\u0000\u0000@\u0000\u0000\u0001\u0000\b \u0010\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0010\u0000\u0000\u0000@\u0000\u0000\u0000", - "minimum": "\u0000:\r\u0000 \u0000\u0000\u0000\u0000\u0000\u0010\u0006\u0000\u0000\u0000\u0000\u0000\u0002\u0000`\u0000p\u0010x\u0000Ā€\u0004\u0003Ć \u0003Ć”\u0000 @\u0000\u0000\u0000\u0000Ā€\u0010\f\u0000\u0000\u0000\u0000@\u0004\u0000ƀ\u0000\u0000\u0000 \u0001 \b\u0000\u0000\u0001\u0000„€\u0000\u000fĀ€\u0018\u0000!˜\u0000|\u0010\u0001\u0000S‘€\u0000\u0000\u0000 \u000f\u0004\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "step length": "\u0000M\u000f\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000`?Ć \u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0010Ć \u0011Ć \u0000\u0000#Ƥ\u000fưy\u0000p\u0000\u0000\u0000âÀ@\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0010\u0003ü\u0000Ā€\u0000ư\u0000\u0000\u0001\u0000\u0010\u0000\b\u00028\u0000D\u0000\b\u000fÿà@\u000e@\t\u0010\u0000Ā€\t\u0000\u0005\u0000\u0002\u0000(Ā€\u0004\u0000D@D\u0000 \u0001\b\u0000@\u0002\u0014\f\u0010\u0001\u0000\u0000@\u0004\u0000\u0010A€€\u0010\u0000\u0004\u0000@\u0000Ā‘\u0000\u0000\u0001\u0000\u0000@\u0004\u0000\u0005\u0006\u0000\u0000\u0010\u0000\u0004\u0000\u0000\u00000\f\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000", + "weather circle": "\u0000]\u0010\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001ÿÀ€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@\u000fĆæ\u0000 \u0000\u0000\u0001\u0000\u0000\u0000\u0002\u0000@\u0000\u0010Ā€\u0000\u0000\u0004Ć \u0002\u0000\u0010\u0004Ćæ\u0000D\u0000\u0000\u00009\u0000ˆ\u0000Ā€@\u0000\u0002 \u0000\u0000\u0001\u0010\u0002CÿøÿÀ“à\u0000\u0000\u0010Ā€\u0012\u0000 \u0000\u0002\u0003ĆØ\b\u001f\u0000ˆ\u0000Ā‘\u0002Ā€\u0000\u0004@?\u0000\b@\u0004ˆ\u0014\u0001„€\"\u0000\u0000\u0000Ā„\u0000$\u0010\u0003D\u0001\u0010\u0000\u0000\u0000 \u0002$\bĀ€\u0004 \u0001\u0000\u0000\u0000\u0002\u0000\u0011@Ā‚\u0000PĀ \b\u0000\u0000\u0000 \u0001\f\b\b\fE\u0000Ā€\u0000\u0000\u0002\u0000\u0010@Ā€!\u0018\b\u0000\u0000\u0000 \u0000\u0000\u0018\u0000ƀ\u0000@\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "minimum": "\u0000\u001f\u0010\u0000\u001fư\u0001\u0000 \u0002\u0000ƀ\u0004\u0000€€\b\u0001Ćæ\u0000\u0010\u0000\u0000\u0002\"?ÿ„B\u0011\u0000\bĀ‚>Ćø!\u0004E\u0010B\u0004ĆŗA\u0004\t\u0012Ā„\b\u0012ò\u0000\u0010\u001eJ\u0000 \u0010Ā¢\u0001@\u0001ƒ\u0001\u0000", + "step length": "\u0000\u001f\u0010\u0000\u0001\u0000\b\u0000\u0002\u0000\u0013ĆøGĆ @\u0000ˆ\u0001\u0000\u0001\u0010\u0004Ā€\u0002 \u0001\u0000?ÿ„ÿ€€\u0018\u0010\u0001\u0010P \"\u0011 @DP@\t \u0004\f\u0001\u0002\u0000`\u0002\u0004\u0007\u0000\u0004(p\u0000\b ", "distance goal": "\u0000?\u0010\u0000\u0000\u0000\u0010(\u0000\u0000\u0010\u0000ûü\u0010Hư'ý\u0014\u0001ý\u0000Ā€ AB(\u0000£ñ\u0000@ĀĆ¤P\u0004ĀœĀ‚\u0000ĀĆ•O¿Š©\u0007Ćæ\u0002*Ā„A\u0010_ˆ\u0002\f\bĀ‚?¤\u0010\u0004\u001c\u0000]\u0004\bH \bUü¢\bþüð¨\u0001GƱE Ā€\"Oúˆ\u0002ĀŖA\u0000@\u0005Ɛ\u0005Ԃ\u0000\nœ \b/Ƅ\u0001\u0002$€‘P\u000fþ\u0004ĀØĀ€\u0000! \u0010\u0004\b ", "Circle": "\u0000;\r\u0000\u0002\u0000\u0000\u0000\u0010\u0000\u0000\u0004 \u0000\u0000\u00018\u0000Ā€D\u0000\u0000\u00009\u0000ˆ\bĀ€\u0000\u0000\u0004@\t\t>\u0000\u0000\u0001\b\u0001 Ćŗ\u0002\u0007ƀ\"\u0000$D@?\u0000\b@\u0004ˆˆ\u0000\u0000\u0002\u0010\u0000Ā’\u0011\u0000\u0000\u0000\u0002\u0000\"@@\u0000\u0000\u0000Ā€\u0004P\b\u0000\u0000\u0000 \u0001\f\u0002\u0000\u0000\u0000\b\u0000A\u0000Ā€\u0000\u0000\u0002\u0000\u0000\u0000", - "min. confidence": "\u0000_\u0010\u0000\u001fư\b\b\u0000\u0000\u0000\u0000\u0001\u0000\b@ \u0010xƷư\u0000\u0000\u0004\u0000\u0010@ƀ/( \u0000\u0000\u0010\u0000/ø€€‘\u0002@\u001e\u0000ÿ€€\u0001Ćæ\u0001\"\u0005?€Ò\u0001\u0001\u0001\u0000\u0000\u0000\u0006D\fA\u0002\"\u0002\u0002\u0006?¿ÿŒˆ\u0014Ā‚\u0004B\u0004\u0004\f\u0000\u0011\u0000)Ćæ%ü\u0011\u0004\u000fĆø(\u0000>ĆøĀ’ JD\"\b\u0010\u0010‘üE\u0010$ ”H\u0010 \u0000Ćŗ@HA¨À@ƀ@\u0001\u0012€’‘\u0001@Ā€Ā€Ā€ĀĆ¢Ć²\u0001 ¤!\u0001\u0006\u0001\u0001\u0001\u0010^J\u0002QHQ\u00000\u0002\u0002\u0002 ¢\u0004ɐÁ€\u0000\u0007ü\u0004\u0001ƒ\t\t!\u0000\u0000\u0000\b\b\bĀ‚", - "colorize icon": "\u0000Ā‹\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0012\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0010\u0001\u001c\u0001\u001c\u0000\u0002\u0002\u001dB\u001f\u0000\u0002\u0000\u0000\u0000\u0000\u0002\u0000\u001c\u0000\u001c\u0000\u0000Ā€<Ā < \u0000Ā€CĆ 0\b|\u0000\u001c\u0000\u001c\u0000 \u0000 \u0000\b\u0000 \u0007Ā„\u0001\u0002ø\u001c\u001cĀ€\u0018\u0000\u0004\u0000\u0012\u0000\u0018\u0000\u0000Ā€\u0010B\u0010\u001c\u0010\u001c\u0010\r\u0000\u0001\u0000\u0001Ā€\r\u0000\u0000\u0010\u0000\u0010B\u0000\u0002\u0000\u0002\u0006\u0010\u0000 \u0000 \u0006\u0010\u0000\u0002\u0000\u0002\u0010Ā€\u0000Ā€\u0000Ā€\u0002\u0000\n\u0000\u0004\u0000\u0002\u0000\u0000Ā€\u0000Ā‚\u0010\u0000\u0010\u0000\u0010\u0000@\u0002 \u0000Ā€\u0000@\u0000\u0010\u0000 Ā‚\u0000\u0004\u0000\u0004\u0000\b\u0001Ā‚\u0000 \u0000\b\u0000>\u0000\b\"Ā€\u0001\u0000\u0001\u0000\u0001\u0000ƀ@\u0004\u0000\u0001\u00008@&\b0\u0000ƀ\u0000ƀ\u0000 \u0000\u0000\u0001\u0000\u0000 \u0000\u0000\u0003\u0000\u0004\u0000`\u0000`\u0000\u0004\u0000\u0000\u0000@\u0000\u0004\u0000\u0000\u0000\u0000\u0000", + "min. confidence": "\u0000O\u0010\u0000\u001fư\u0001\u0000\u0000@\b@\u0001\u0000 \u0002\u0000\u0000Ā€\u0010@\u0001\u0000ƀ\u0004\u0003ĆÆĆø/øÿø€€\b\u0001\u0015\u0010Ā€\u0001\u0011\u0001Ćæ\u0000\u0010\u0002\t\u0001\u0000\u0002\"\u0000\u0000\u0002\"\b?Ɔ?‡ÿ¿ÿ„B\u001eD\f\u0000\bˆ\u0011\u0000\bĀ‚%ˆ(\u0000\u0011\u0010>Ćø!\u0004ĆĆ¾Ā‘Ć¼#Ć E\u0010B\u0004Ā’ \u0000@\u0000ĆŗA\u0004\t$@@\u0000¿Á\u0012Ā„\b\u0012OĆ°ĀĆ” ‚ò\u0000\u0010\u0007Ā‘\u0001\u0010D\"\u001eJ\u0000 \t\"\u0002 ˆ8\u0010Ā¢\u0001@\u0000Ā„!Œ\u0001ƒ\u0001\u0000\u0000Ā€\bĀ‚\u001c\u0007", + "colorize icon": "\u0000k\r\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€\u0000\u0000\u0000\u0000Ā€\bĆ \u0000\u0000\u0010Ćø\u0000\u0010\u0000\u0000\u0000\u0000\u0010\u0000Ć \u0000\u0000\u0001Ć”\u0000\u0004\u0002\u001f\u0001Ā€CĆ \u0000Ć \u0000\u0000\u0000@\u0001\u0000< \b\u0017Ƅ\bƤ\u0000\u0000\u0000\u0000ƀ\u0000\u0004\u0000Ā‚\u0010€à‚\u0007ƀ\f\u0000h\u0000\u0000Ā€\u0000Ā‚\u0010\u0000\u0010?\u0000\u0001\u00000Ā€\u0000\u0010\u0000\u0010Ā„\u0000\u0004\u0000\u0000\u0000 \u0000\u0010\u0000\u0004\u0000\u0004\u0010Ā€\u0000Ā€\u0000\u0000\u0004\u0000\u0002\u0000\u0000Ā€\u0001\u0004\u0010\u0000 \u0000\u0000\u0001\u0000\u0000@\u0001ư\u0000A\u0014\u0000\b\u0000\u0000\u0000 \u0000\b\u0001Ƃ\u00010AĀ€\u0006\u0000\u0000\u0000\b\u0000\u0001\u0000\u0000\u0000\u0018\u0000 \u0003\u0000\u0000\u0000\u0002\u0000\u0000 \u0000\u0000\u0000\u0000", "Heartrate": "\u0000/\u0010\u0000\u0000\u0000\u0010 \b \u0004\u0000 @Ā’@\u0004\u0000A\u0000ĀØĀ€\u0004\u0000ĀĆ Aư\b\u000fƐOĆ“@Ā€\u0002 Ā…H\u0002\u0004A\u0012Q\u0012\u0002\nĀ‚DR$\u0004\u0019ü\u0010(H\u0004b\tüQ\u0010\u000bD\u0010ˆB ˆ\"\u0010ˆA\u0001\u0010FB€‚\u0002 ƒ\u0005\u0000ü\u0014\r\u0011\u0000\u0000\u0010Ā‚aA", "data": "\u0000*\u000e\u0000\u0000 \u0000\u0000\u0000\u0000$\u0000\u0000\u0002\u0004u\u0000\u0000\u0000@Ć”\u0000\u0000\u0000\u001f\u0000\u0000\u0000\u0000\b`ư\u0000\u0000\u0002'ƀ\u0010>\u0001H\b\u0003ư\u0000Œ\u0002\u0000\u0000\u0000A\u0001\u0000\u0000\u0000\u0000Ā€@\u0000\u0000\u0000@ \u0000\u0000\u0000 \u0010\u0000\u0000\u00000\b\u0000\u0000\u00000\u0000", - "Yes\ndefinitely": "\u0000H\u0011\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0000@@\u0000\u0000\u0000\u0000\u0000\u0000\u0000 @\u0000\u0000\u0000\u0000\u0000\u0000\u0000(pĀ€\u0000\u0000\u0000\u0000\u0000\u0000'ƀ@ƀ\u0000\u0000\u0000\u0000\u0000@@@ \u0000\u0000\u0000\u0000\u0000@@@\u0010\u0000\u0000\u0000\u0000\u0000@@D\u0010\u0018\u0000\u0000\u0000\u0000@@H0$\u0000\u0000\u0000\u0000Sƀ(\u0010$\u0000\u0000\u0000\u0000$`0\u0000\u0018\u0000\u0000\u0000\u0000$P\u0010\u0000\u0000\u0000\u0000\u0000\u0000#Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0000ùð@Ā€\u0000\u0000\b\u0000\u0001", + "Yes\ndefinitely": "\u0000%\u0011\u0000\u0001\u0000\u0000\u0000\u0004\u0004\u0000\u0000\u0000\u0010 \u0000\u0000\u0000”Â\u0000\u0000\u0004Ćø\b\u0018\u0000@@@ \u0002\u0002\u0002\u0000Ā€\u0010\u0010\u0011\u0004\u0006€€`M<\u0002\u0002R0\u0018\u0000\fĀ‘@@\u0000\u0004p\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000", "Launcher Settings": "\u0000m\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u001f\u0000 \u0000\u0000\u0000\u0000\u0000@\u0000\u0000\u0000\u0000\u0010ˆĆ¾ĀŽ\u0000\u0000\u0000\f\u0000\u0000\u0000\u0000\u0007Ć“B\u0000\u0013Ā€\u0006\u0000\u0007Ā€\u0000\u0000\u0000\u0000\u0000\" \u0001\u0000Ć \b\u0010\u0002\u0000\u0000\u0000\u0000\u0000Ćŗ\f\u0000\u00029\u0000 Ā€\u000fĀ€@\u0000\u0000\u0000 \u0003ĆæĀŽ\b\u0000\b\u0011ƀ\u00018 |>þ\u0000Ā€\u0000@\u0000@r\u0000\u000e@ü\u0000\u0002\u0010\u0004\u0000\u0004\u0000\u0004\u0000\u0010\u0003Ƅ\u0000\u0000\u000f‚ \u0000 \u0000@\u0000Ā€\u0001@\u0000\u0000DH\u0011Ćø\u0002\u0000\u0004\u0000\b\u0000\b\u0000\u0000\u0002\"Ā€Āˆ\u0000 \u0004ƀ\u0000@\u0000 \u0000\u0000\u0011\b\u0004@\u0006\u0000\u0018\u0000\u0004\u0000\u0001\u0000\u0000\u0000ĆøĀ R\u0000ƀ\u0000\u0000\u0000@\u0000\b\u0000\u0000\u0004H„à\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001ƒ@\u0000", - "TAP right top/bottom": "\u0000^\u0010\u0000\u0000\u0000\u0000\u0004\u0000\u0004\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0010\u0000\u0000\u0010\u0007ÿð\u0000\u0000\u0000@\u0000@\u0000\u0000@\u0000@\u0000\u0000\u0000Ćæ\u0001\u0000\u0000Ćæ\u0001\u0000þ0Ćø\b\u0000\u0004\u0000\u0004\b\u0000\u0004\u0000A\"\u0010 \u0000\u0010\u0000\u0010 \u0000\u0010\u0001\u0004ˆA\u0000\u0000\u0000€€\u0000H\u0004!!\u0004\u0000\u0001\u0000\u0004\u0004\u0000\u0001\u0010\u0010„ø?ư\u0004\u0000\u0010\u001fư\u0004 Cò\u0001@@\u0010\u0000€„\u0000\u0010A\bH\t\u0001\u0000@\u0002\u0002\u0010\u0000A\u0004! D\u0004\u0001\u0000\u0010\u0010@\u0001\u0000\u0010„€\u0010\u0010\u0004\u0000€\u0000\u0004\u0000B\u0012\u0000@@\u0010\u0002\u0004\u0004\u0000\u0010\u0000\u0000\u0000\u0001Ćæ\u001fÿÀ\u0007ÿÀ@\u0000\u0000\u0000\u0004\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000", + "TAP right top/bottom": "\u0000u\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0000\b\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u0000@\u0000@\u0000\u0000@\u001fÿÂ\u0000\u0000\u0000\u0000$\u0002\u0000\u0002\u0000\u0000\u0002\u0000\u0002\u0000\b\u0000\u0000\u0001\u001f'ÿð\u0010\u0000\u0007ÿð\u0010\u0000|\u0000\u0000\u0007\u0016\u0001\u0000\u0000Ā€\u0000\u0000\u0000Ā€\u0004 \u0000\u0000\u0000Ā€\b\u0000\u0004\u0000\u0004\b\u0000\u0004\u0000\"\u0000\u0000\u0000\b\u0000Ā€\u0000?Ā€@@\u0000$\u0002\u0002 \u0000@\u0004\u0000\u0001\u0000\u0004\u0004\u0000\u0001\u0010#\u0000HĀ€\u0004\u0000Ć \b\u0000 ?Ć \bB\b\u0001D\u0000 \u0005\u0001\u0000@\u0002\u0002\u0010\u0000A\u0000Ā€\b@\u0002\u0000H\b\u0002\u0000\u0010\u0010Ā€\u0002\b\b\u0000\u0002\u0000 \u0004@@\u0010\u0001\u0001\u0004\u0000\u0010\u0000Ā€\u0000 \u0002\u0000\u0002\u0002\u0000Ā€\u0010\u0010 \u0000Ā€\u0018\u0000\u0002\u0000 \u0000\u0010\u0010\u0004\u0000\u0001\u0000\u0004\u0003\u0000\u0000 \u0000\u0000\u0000ĆæĀĆæĆ \u0003ÿà \u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000", "Font": "\u00008\r\u0000\u0000\u0000\u0000\u0000\u0000\u0000@‡€\u0000\u0000\u0000\u0000 xĀ€\u0000\u0000ƀ\u0000 \u0000Ā€\b\u0000 @ \u0001\u0000\u0004\u0000\u0010@ \u0001\u0000‡\u0000\u0000Ā€8\u0002\u0000|\u0000\u0000Ā€&\u0002\u0000\f\u0000\u0001\u0000!\u0004\u0000\u0014\u0000\u0002\u0000 \b\u0000$\u0000\u0004\u0000 \u0010\u0000D\u0000˜\u0000 \u0000Œ\u0000`\u0000 \u0000\u0000\u0004\u0000\u0000\u0000 ", - "Mark Unread": "\u0000Š\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@\u0000\u0000\u0010\u0000\u0000\u0000\u0000œ\u0000\u0000\b|\u0000\u0000\u0002\b\u0000\u0000\u0002\u0016\u000f\u0000\u0000\u00009\u0000\u0000\u0001Ć”\u0001Ā€\u0000B\u0000\u0000\u0000Ā„| \u0000\u0000\bĀ€\u0000\u0000\u0000Ā€\u0010 \u0010Ā€\u0000\u0000 \u0000\u0010\u0000\u0000\u0004 \u0003\u0000\u0002@\u0002\b\u0004 \u0000\u0000\b\u0000\b\u0010>\u0001\u0010\u0001Ć \u0000`\u0000\u0004\u0001\b\u0010>\u0003Ā€\u0004\u0003ư\u0000Ā„\u0000x\u0000\u0010\u0000\u0001\u0000B\u0003ư\u0000˜2\u0000\u0000\u0000B\u0000\f\u0000\u0004\u0000\u0000Ā€\u0010Ā€\u0000\u0000!\u0003\u0000\u0000\u0000\u0000Ā€\u0000\u0000\u0001\u0000\u0000@\u0000@\u0000\u0000\b\u0000 \u0000\u0000\u0000@\u0000\u0000\u0000Ā€\u0000 \u0000\u0010\u0000\u0000\u0002\u0000\u0004\u0000\u0000\u0000 \u0000\u0000\u0000 \u00010\u0000\b\u0000\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0010\u00000\u0000\u0004\u0000\u0000\u0000 \u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\b\u0000\u0000\u0000\u0002\u0000\u0000\u0000\b\u0000", + "Mark Unread": "\u0000L\u0010\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0001\u0002\u0000\u0000\u0000\u0010\u0000\u0000\u0001\u0000\u0003þ \u0000\u0000Ā€\bĆƒĆæĀĆ‚\u0001\u0000\u0004\u000fĀ€t\u0001\u0000\u0001ü\u0010ư?Ā€\u0000Ā€\u0010\u0007Ā€\u00011Ā€\b\u0000\u0010\u0001\u0000\u0003þ \u0003Ā€\u0002\u000fÿç \"\u0000\u0000L\u0000|\u0003Ā€\u0004\u0004 \u0000\u0004@\f T\u0007‰\u0002\u0000\u0000<\u0001\u0001\t H\"\u0000\u0000@ \u0011\u0011\u0004‰\u0002Ā \u0000\b\u00009!\bH\u0011Ćø\u0000Ā€\u0004l\u0010gĀ‘!\u0000\u0000\u0010\u0000D\u0001\u0000I\u0012\u0010\u0000\u0002\u0000\u0003Ā€\u0010\u0000 Ć \u0000\u0000\u0000\u0000\u0000", "start&lap/reset, BTN1: EXIT": "\u0000Ɔ\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000`\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002@\u0000\u0000\u0004\u0000Ā€\u0000\u0000\u0000Ā„8\u0000@\u0000\u0000\u0001\u0000\u0000\u0000\u0004p\u0000\u0000\bù\u0000\u0000\u0002\b\u0001\u0000\u0000\u0000\u0001\u000f \u0001ư\u0000\u0000\u0004\u0000\u0007Ć \u000e\u0000\u0000\u0000\u001cX\u0007Ć \u0004 \u0004\u0000\u0000\u0000\u0004\u0001\u0000\b@\u0000\u0000\u0010\u0000``\u0001ƀ\u0000\u0000\u0001\u0000``\u0010Ā€\u0011Ć \u0000\u0000\u0010\u0004\u0000\"\u0000\u0000\u0000@\u0001‚9\u0000\u0000\u0000\b\u0001€B\u0000XĀ€\u0000\u0000@ \u0001H\u0010>\u0001ƀ\u0006\u0006\u0007\u0004\u0001\u0010\u0000 \u0006\u0006\u0001\b\tĀ„\u0001\u0010\u0001\bƀ?\u0000\u0004ƀ\u0007Ć \u0000\u0010\u0012 \u0001\u0000\u0007Ć \u0004 \u001c \u0012 \u0004\u0005\u0000A\u0000\u0000\u0000\u0010Ā€~\u0018\u0000Ā€(Ā€\u0004\u0000~\u0018\u0010Ā€\u0011\u0000(Ā€\u0010\"\u0000\b\u0000\u0000\u0000@\u0006\u0006`\u0002\u0000Ā„\u0000 \u0006\u0006`\u0004\u0000@\u0000Ā„\u0000C\u0004\u0000@\u0000\u0000\u0001\u0000\u0018\u0006\u0000\u0010\u0000\u0010\u0001\u0000\u0018\u0006\u0000\u0010\u0001\u0000\u0000\u0010\u00010\u0010\u0002\u0000\u0000\u0000\u0004\u0000`x\u0000Ā€\u0000Ā€\b\u0000`x\u0000Ā€\u0002\u0000\u0000Ā€\u0004\u0000\u00000\u0000\u0000\u0000\u0010\u0000~\u0018\f\u0000\u0004\u0000@\u0000~\u0018\u0004\u0000\u0007ƀ\u0004\u0000\u0010\u0000\u0003\u0000\u0000\u0000\u0000@\u0000\u0000\u0000ƀ\u0000 \u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000 \u0000@", "App Source\nNot found": "\u0000Z\u0011\u0000\u0000\u0000\u0000`\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000$\u0000@\u0000 \u0000\u0000\u0000\b|\bù\u0002\b\u0004\u0004\u0000\u0000\u00049Ć”\u0001Ć…Ā€B\u0000\u0000\u0000\u0000ò\u0000Ā€\u0001\u0000\u0010Ā€\u0010@\u0000\u0000\u0001\u0002@\u0000Ā€\u0004 \u0004 \u0000\u0000\u0000@`\u0000 \u0001\b\u0001\b\u0010>\u0000 \u0010\u0000\u0010\u0000B\u0000\u0004\u0003ư\u0000\b\u0004\u0000\u0004\u0000\u0010Ā€\u0001\u0000\u0000\u0000\u0005\u0001\u0000\u0002\u0000\u0000@\u0000Ā€\u0000\u0000\u0002 Ā€\u0001\u0000\u0000\u0010\u0000 \u0000\u0000\u0003\u0004 \u0000Ā€\u0000\b\u0000\u0010\u0000\u0000\u0003\u0001\u0010\u0000@\u0000\u0004\u0000\b\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\u0002\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000ƀ\u0000\u0000\u0000\u0000\b\u0000\u0010\u0000\u0000\u0000", - "Show clocks": "\u0000N\u0010\u0000\u0000@@@\u0000\u0000\u0002\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\b\u0001ĆæĆĀ„\u0002\u0004\u0000\u0000\u000fÿ€\u0000\"þ\u0010\u0001Ć \u0000Ā€\u0000\u0000ˆ@\u0000@\u001a@\u0002\u0000\u0000\u0002!\u0003Ć”\u0000ĀˆĀĆæĆ€\u0000\bÿÀƂ!\u0000 \u001fÿþ\u0004>\u0010\u0011\u0004\u0000Ā€\u0000Ā€Āˆ\u0010\u0000@D\u0011ÿü\u0002\u0002/óÔ\u0001 @(\u0000ˆˆ\bĀ„\u0004Ā‚\u0001\u0011\u0002!\"D\"\u0010\u0014\b\f(\u0010Ā‚ĆøĀĀˆ@ ƀP@Ā‚\u0006 CĆ”\u0000\f\u0006HƄ\b\u0010\u0005\bĀ„\u0000\u0000\u0001@À \u0000\b\u0000\u0010\u0000\u0000\u0006\u0000\u0001\u0000", - "STEPS": "\u0000<\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000`\u0000\u0000\u0000\u0000\u0000\u0000\tCĀ€GĀ€\u0000\u0000ĀĀ“Ćˆ\u0003Ā€\u0000\u0000\u0007\u0016\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u001e\u0000\u0000\u0000 \u0002\u0000ĀŽ\u0000\u0011\u0000\u0002\u0000 \u0007 \u0004ˆ\u0000@\u0005\u0000\u0002\u0000(Ā€\u0004\u0000ˆ\u0000@\u0002\u0010\u0000Ā€0@\u0004\u0000\u0001\u0000\u0010\f\u0004\u0000Ā€\u0000 \u0002\u0000\u0000\u0000\u0010\u0000\u0004\u0000@\u0000\u0000\u0002\u0000\u0000Ā€\u0000\u0000", + "Show clocks": "\u0000k\u0010\u0000\u0000@@@\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0004\b\u0001\u0000\u0000@\u000fþ\u0000@\u0000\u0003Ć”\u0000\u0000\u0010\u0003ÿà\u0000\u0000\u0004\u0000FEüþ \u0012ƀ\u0001\u0000\u0000\u0000@Ćø\u0007HĀ„\u0000\u0004\u0001Ć \u0000 \u0000\u0000\u0007ư\u0000\u0011\u0010ð€\u0010\u0000ÿà\u0000\u0000\u0002\u0000\u0004#Ćæ\u0001Ćæ\u0002\u0010\u0000€ÿ\u0001ƀ\u0001\u0007À‡Â\u0000ó€\u0010\u0000\u0010\u0000L\u0000|ˆ\u0010\u0000@1ÿü\u0002\u0000\bĀ€\u0018QŸ\b\b`\u0001@\u0004D\u0000ư\u0004\u0006 B!\u0000\u0014\u0000D@ˆ@\u0002\u0001\u0000Ć„ĀˆD \u0004Ā€\u0018P!\u0004\u0000Ā€\u0003ĀŸĀ‰\bĀ„\u0001\u0000\u0005\u0004\b @\u0010\u0000Ā\u0010!ð€ \u0003$b\u0004\b\u0004\u0000\u0011\u0000\u0014\"\u0010\u0003ư\u0005\u0003\u0002Ā€\u0001\u0000\u0001ƀ\u0001\u0000\u0002\u0000\u0000\u0000ƀ\u0000 \u0000\u0000\u0000\u0000", + "STEPS": "\u0000\u001f\u0010\u0000\u0001\u0000\b \u0002\u0000Ā’@GĆ ĀØĀ€Āˆ\u0000AƱ\u0010\u000fĆ“B \u0005H¿ÿ’Q\u0000Ā€DR\u0001\u0010\u0010(\"\u0011üPDPˆA\t\"\u0010Ā„\f\u0006BĀ€`\u0003\u0005\u0007\u0000\r\u0011p\u0000aA", "Vector font size": "\u0000½\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0002\u0000@\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€\u0000\b\u0000\u0002\u0000\u0002@H\u00018\u0000Ā€\u0000\u0000\u0001Ć \bx\u0000\u0000\u0000\u0000\u0002\u0000\u0004 \u0000\u0010\u0010ĆŖ\u0001@\u000e@\u0007ƀ\u0000\u00004Ā€<@\u0000\u0000`\u0000\u0010\u0000\u0011\u0000\u0001\u0000y@H\u0000D\u0000B\u0000\u0000\u0002\"\u0000\u0002\u0000 \u0000\u0000Ā€\u0000ˆ\u0000\u0010\u0000\u0010\u0005\u0000\u0004 \u0002 \u0000\u0000\u0011\b\u0000 \u0000Ā€\u0002\b\u0004\u0000$Ćø\u0003\u0000\u0000Ā‚D\u0000\"\u0000)\u0002\u0007Ɓ\u0010@\u0001\u0000‡\u0000\u0000Ā€8\u0000Ćŗ\u0000h\u0000\b\f\u0010\u0002\u0010\u00020\u000fƀ\bĀ‚\u0000\u0010\u0003Ć \u0000\u0004\u00010\u0001\u0010\f \u0000@\u0000`!\u0000 Ā€\u0000\u0000H\u0010\u0000Ā€\u0003\u0000\u0000@\b@\bĀ€\u0001\u0000\u0005\u0000\u0000ƀ\b\u0000\b\u0000\u0000\u0002A\u0000\b\u0000(\u0000\u0004\u0000@\u0000D\u0000\b\u0000D\u0000\u0000\u0000Ā€\u0000Ā€\u0000\u0000\u0014\b\u0000Ā€\u0002@\u0000@\u0002\u0000\u0000@\u0000@\f\u0010\u0000\u0000\b\u0000\b\u0000\u0000\u0000AĀ€\b\u0000\"\u0000L\u0000\u0010\u0000\u0002\u0000\u0002\u0001€€\u0000\u0000Ā€\u0001Ā€\u0000\u0000\u00000\u0000Ā€\u00020\u0001Ā€\u0000Ā€\u0000 \u0000\u0010\u0000\u0000\u0000\u0000\b\u00000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€\u0000\u0000\u0004\u0000\u0002\u0000\u0000Ā€\u0000\u0000", "View Message": "\u0000z\u000f\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000ƀ\u0000\u0000@\u0000\u0000\b\u0000\u0000\u0000\u0000\b\u0002\u0000\u0010\u0010\bƀ\b\u0000\u0000\u0001\u0000\u0000\u0000\u0003\t\u0004°\u0004\u0004\u0001Ɛ\u0002\u0000\u0000\u0000@\u0000\u0000\u0000!@ư\u0001Ćæ\u0000\b\u0000Ā€\u0000\u0000\u0011Ć \u0000\u0000\u0000@\u0010\u0000@@\u0004\u0006 \u0000\u0000\u0005ˆ\u0000\u0000\u0018\u0000\u0004 \u0010\u0010\u0002\u0000p\u0001\u0010\tĀ„\u0010>\u0001\u0002\u0003Ǝ\u0007ü\u0001ư\u0004\u0001\"\u0001Ƃ\u0003ư\u0000\u0001\u0001Œ\u0001\u0001\u0000Ƃ\u0002Ā€(Ā€\u0011\u0000\u0000\u0000\u0000۠\u0000@@@@\b@\u0004\u0000\u0000\u0000\u0000@\u0002Ā€\u001fư \u0010@\u0000\u0010\u0001\u0000\u0000\u0000\u0000 \u0001 \u0001\u0010\u0000Ƥ \u0000\b\u0000 \u0000\u0000\u00010\u0000Ā€\u0000D\u0000F0\u0000\u0004\u0000\u0007ƀ\u0000\u00000\u0000 \u0000!\b\u00110\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007Ć 0B\u0003Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00000\u000fĀ€\u0000", "Are you sure": "\u0000n\u0010\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000Ā„ \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0001\u0010Ā‚\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@\u0002D\u0004\u0000\u0000\u0000\u0000\u0000\u0000ư\u0000\u0000ü\t \u0010ư@\u0000@\u0000\r \u000fư\u000e\u0000\u0004\u0000L`€€D@ƀ0T\u0007ÿ‚\u0002\u0002\u0001\u0002\u0001\u0001\u0010ƒ\u0000ƁP\u0000\u0002\b\u0000\b\u0002\b\u0002\bĀ‚\u0000\u0003\t \u0000\b \u0000\"\b\"\b\"\b\u00000D@\u0000 Ā€\u0000`` \u0003\u0002\u0010ĀƒĆæĀ‚ \u0001@@Ā‚A\u0000\f\u0013ù\u0000\u0002\nĀ€\u0006\u0000\u0006\u0000\n\u0004\u0000\u0000\u0002\u0000\b\u0011Ćø\b\u0000\b\u0000\u0010`\u0000ƀ\u0004\u0000\u0000 @\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0003\u0000\u0010\u0007ÿ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "Bluetooth": "\u0000j\u000e\u0000\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000$\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\bƵ\u0000@\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u00049ƅ\u0000ˆ\u0000\u0000\u0000@\u0000\u0000\u0000\u0000\u0000ò\u0001\u0000\u0012\u0000\u0000\u0000\u0010\u0000\b\u0000\u0000\u0000\u0001\u0000Ā€\u0004Ā€\u0000\u0000\u0004\u0000\u0001\u0000\u0000\u0000\u0000@ \u0001\"\u0010>\u0001ƀ\u0000x\u0010>\u0000 \u0010\u0000Hƒð\u0000L\u0001Ć¢\u0003ư\u0000\b\u0004\u0000\u0012@\u0000\u0000\u0010Ā€ Ā€\u0000\u0000\u0005\u0002\u0000\b\u0000\u0000\u0004\u0000\b@\u0000\u0000\u0002!\u0000\u0002(\u0000\u0000\u0001\u0000\u0000\u0010\u0000\u0000\u0003\u0004Ā€\u0001\f\u0000\u0000\u0000@\u0000\b\u0000\u0000\u0003\u0001@\u0000Ā‚\u0000\u0000\u0000\u0010\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0002\u0000\u0000\u0000\u0000\u0000", + "Bluetooth": "\u0000F\u000b\u0000\u00000\u0000\u0000\u0000\u0000\u0000\u0000Ĉ@\u0000\u0000Ā€\u0000\u0000Ā‚\bA\u0000\u0000\u0002\u0000\u0000\u0002\b!\u0004!\u001e\b\u001e\u001e\b.Ā„\u0010„„ø„„øÇàB\u0012\u0010Ā‚\u0012\u0010Ā‚\u0018A\bOƂ\bHB\ba\u0004! \b!!\b!Ā„\u0010„€ „„ †\u0010B2\u0010Ā‚\u0012\u0010Ā‚\u001f‡ÇGĀĀ‡Ā‡ĀĀˆ@", "Unread timer": "\u0000m\u0010\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@\u0000ÿ€\u0000\u0000Ā€\u0000\b\u0000\u0000\u0000\u0000ñø@\u0007Ā€\u0002\u0000\u0000@\u0000\u0000\u0000\u0000\u0010\u0000\u001fƀƒ\u0000\u001f\u0000\u0004\u0002\u000f\u0000\u0000\u0000Ā€<\u0000\bˆ\u0001\b\u0000@\u000fĀ„\u0000\u0000\u0004\u0000\u000fĆøD \bĀ€\f\u0000\u0000@\u0000\u001fĆæĆ@DA\u0000¤\u0001Ā \u0000\u0004\b\u001f\u0003Ā€\u0004\u0004\"\b\bƀ0Ā€\u0000@?\u0000*\u0003ā @Ā‚\u0000\u0004\u0000d\u0000\u0000\u0002H\u0012$\t\u0004\u0000 \u0000 \u0000ƀ\u0000\u0000\" Ā‘ P \u0002\u0000\u0001\u0000\u0001\u0000\u0000\u0002\u0010„‰\u0001\u0006\u0000 \u0000\b\u0000\u0004\u0000\u0000`ƒ<‰\u0000ƀ\u0006\u0000\u0000@\u0000\u0000\u0000\u0000\u0004\u0001$H\u0000\u0000ƀ\u0000\u0002\u0000\u0000\u0000\u0000\u0000 \u0000Aƀ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "Delete all messages": "\u0000¾\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\b\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002H#Ƃ\u0000\u0010\u0000\u0000\u0000\u0007\u0000\u0000\u0000\b\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0005 ‰\b |\u0000\b!Ć \u0001Ć \u0000\u0010\u0000\u0000\u0002\u0000\u0000\u0000\u0006\u0012\u0001Ć \u0015\u0012(P\u0000\u0000y\u0000\u001a@\u0000@\u0000\u0000\b\u0000\u0000\u0000\u0004(\u001a@\u0010HĀ¢ \u0004\u00001\u0000\b\u0000ĀˆĀ€\u0001\u0000\u0000\u0000#ƀ\u0000\u0000\u0000Ā€ĀˆĀƒĆ¹#\u0010@p\u0001 \u0000 \u0002!\u0000Ƅ\u0000\u0000\u0000±\u0000\u0000\u0003\u0000\u0002!\b$ĀŠĀ¾Ć‚`\b@\u0001\u0000\u0011\u0004\u0000Ć \u0002 \u0013\b |\u0002\u0004\u0011\u0004 Ā’$ \bĀ€@Ā€\u0004\u0000D\u0010\u0000Ā€$@8@~\u0000\u0000 D\u0010þH€\u001e\u0000\u0001Ā€\u0010\u0001 @\u0005\u0000Q\u0000\"\u0000\u0000\u0000\u0001\u0001 B\t\"_Ć \b\u0000\u0001Ā€@\u0004Ā‚\u0000\u0012\u0001\b\u0000Ā€\u0000\u0000\u0000\b\u0004Ā‚\b$Ā\b\u0000@\u0000\u0000\u0001\u0000\u0014\b\u0000Ā€\u0000 \u0002\u0000\u0000\u0000\u0000@\u0014\b?Ā’(ĀØ\u0001\u0000\u0000\u0000\u0002\u0000 ƀ\u0004\u0000\u0001\u0000\u0004\u0000\u0000\u0000&\u0000 À‚\b„\b\u0000\u0000\u0000\u0007\u0000\f\u0000`\u0000\b\u0000\u000fĀ€\u0000\u0000`\u0000\f\u0002\b\"\" @\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b¢ˆ(Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000!\u0004 @", + "Delete all messages": "\u0000Ƈ\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\b\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0001$\u0011Ć”\u0000\u0004\u0004\u0000\u0000\u0000\u0001ƀ\u0000\u0000\u0002\u0000\u0000\u0000@\u0000\u0000\u0000\u0000@\u0010\u0001H\"B\u0000\u0004\u000fĀ€\u0001\u0004<\u0000<\u0000\u0002\u0000\u0000\u0000@\u0000\u0000\u0000ƂA,\u0002Ā¢E\n\u0004\u0007ư\u0000\t\u0007\u0001¤\u0000\u0004\u0000\u0000\u0000Ā€\u0000\u0000\u0000Bà\u0001\u0004Š\"\u0007Ć  \u0001ˆ\u0000@\u0004D\u0000\b\u0000\u0000\u0001\u001e\u0000\u0000\u0000\u0004\u0001\u0000\u001fƉ\u0018Ā‚\u0000\u0001ƀ\u0004Ā€\u0000Ā€\bĀ„\u0003\u0010\u0000\u0000\u0002Ƅ\u0000\u0000\f\u0000\u0002\u0010 Ā’*Ć»\u0001„À\u0010Ā€\u0002\u0000\"\b\u0001ƀ\u0004@&\u0010@Ćø\u0004\b\u000f8A$H@\u0004\bĀ€@Ā€\u0004\u0000D\u0010\u0000Ā€$@8@~\u0000\u0000 1€þH€\b\u000f\u0000\u0000ƀ\b\u0000 \u0002Ā€(Ā€\u0011\u0000\u0000\u0000\u0000۠\u0001\u0004Ā‘/ư\f\u0002\u0000\u0000`\u0010\u0001 Ā€\u0004Ā€B\u0000 \u0000\u0000\u0000\u0002\u0000\u0014\u0002\t#B\u0000\u0000\b\u0000\u0000\u0000 \u0002\u0000\u0010\u0000\u0004\u0000@\u0000\u0000\u0000\b\u0000H\u0007òE\u0015\u0000\u0000\u0010\u0000\u0000\u0000 \u0002\f\u0000@\u0000\u0010\u0000@\u0000\u0000\u0002`\u0001\u0000\b ˆI\u0000\u0000@\u0000\u0000\u00008\u0000`\u0003\u0000\u0000@\u0000|\u0000\u0000\u0003\u0000\u0002\u0000\u0010A\u0011\u0011\u0000A\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0018\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003ư\"Р¢\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000B\b@Ā€\u0000", "No Messages": "\u0000k\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000 \u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0004\u0001\u0000\b\u0000\u0002\u0000\u0000\u0000@\u0000\u0000\u0000Ƃ@(\u0000Ā€\u0000@\u0000\u0000\b\u0000\u0000\u0000\u0004(~\u0000\u0010\u0000\b\u0000\u0000\u0001\u001e\u0000\u0000\u0000\u0004\u0001\u001c\u0002\u00001\u0000\u0000\u0000,@\u0000\u0000ƀ\u0000@ƀ@\u0001ƀ\u0004@&\u0010@Ćø\u0004\b\b \b\u0000\b\u0002D\u0003Ā„\u0007Ć \u0000\u0002\u0002\b\u0001\u0000\u0002Ā€(Ā€\u0011\u0000\u0000\u0000\u0000Ā€A\u0000 \u0000H\u0004 \u0002\u0000\u0000\u0000\u0000 \u0010 \u0004\u0004\u0010\u0000\u0004\u0000@\u0000\u0000\u0000\b\u0000<\u0000\u0004\u0000\u0001\u0000\u0004\u0000\u0000\u0000&\u0000\bƀ\bƃ\u0000\u0000@\u0000|\u0000\u0000\u0003\u0000\u0001\u0014\u0000Ԁ\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u001c\u0000\u0000\u0000", - "Record Run": "\u0000j\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0000\u0000! \u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0004(\u0000\u0000\bĆ \u0000\u0001\u0000\u0004>\u0000\u0000\u0001\b\u0000\u0000\u0001ƀ\u0003\u0000@\u0000ð€\u0000\u0000@\u0000\u0000\u0000\u0003Ā€ P\u0000\u0000 \u0000\u0000\u0010\u0000\u0006\u0000G \u0004\u0014\u0000\u0000\b |\u0007\u0000\u0003ƀ\u000e\b\u0000\t\u0002\u0000\u0002\u0007Ć \u00010\u0000ư\u0000\u0002\u0000\u0002A\u0000\u0001\u0000\u0000\u0000B\u0000\u0018\u0000\u0001\u0000\u0001\u0010Ā€\u0000@\u0000\u0000\u0010\u0000\u0000\u0000\u0000@\u0000Ā„@\u0001ư\u0000\u0000\u0004\u0000\u0000\u0000\u0000 \u0000A`\u0003Ā„\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0010\u0002``\u0000\u0000\u0000\u0000\u0000@\u0000\u0000\u0000\u0018\u0000`\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0018\u0000\u0000\u0000", + "Record Run": "\u0000š\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€\u0000@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0004\u0000\u0010\u0000\u0011Ćø\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\t\u0000Ā€\u0004?\n\u0002\u0000 \u00021\u001c\u0000\u0000\u0000\u0000\u0000\u0000\u0000MA,\u000fĆ B@Ā„\u000fĀ€t8\u0000`\u0000\u0003Ā€`\u0000\u001d@<\u0000\u0000\u0011\u0007àþ\u0000\u0002\u0000p\u0004\b\u001f\u0000\u0004\b\u0004@\u0004\u0000|\u0004Āø\b\u0000Ā€\u0001\bƤ\u0000Ā‚\u0000\u0000\u0000Ā‚\u0002\u0010\u0001\b\u0000\u0001\u0004\u0002\u0000Ć \u0000Á\u0000\u0001\u0000\u0000\u0000\u0001\u0000ˆ\u0000Ć³Ā‡ĆĆ?Ć L\u0000|\u0000@\u0000@\u0000\u0000\u0000@B\u0000c\u0000\u0002\u0013ð€\u0011\u00000Ā€ \u0000 \u0000\u0000\u0000 !\u0000!Ā€|Ā€\u0012\"\u0003ƀ\u0010\u0010\b\u0000\u0010\u0000|\u0000\u0010\u0000@\u0000Ā \u0011 %]\u0000\u0010\b\u0004\u0004\u0000\b\u0003à€\b\u0000 \u0000H\u0004H\u0005ĀŠĀ€\b\u00009\u0002\u0000L\u0000\u0000\u0000L\u0000\u0010\u0000 \u0001\u0012\tD\u0002\u0000\u0011ƒ\u0000\f\u0000\u0000\u0000\f\u0000\b\u0000\b\u0000|Ā‚\u001e\"\u0001\u0000\u0004C\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0001Ćø\u0011\u001fĀø(\u0000Ā€\u0000Ć \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0004\u0000\u0000\u0000\u0000", "Apps": "\u0000)\u000e\u0000\u0000\u0000\u0000`\u0000\u0000\u0000\u0000H\u0000”ð#Ƥ\b/\b\u000e,\u0002\u0010\b\u0000\u0010\u0001\bH\u0000\u0010\u0000Ā„\u0018\u0000\b\u0000B\b\u0000\b\u0000!\u0004\u0000\u0004\u0000\u0010Ā‚\u0000\u0004\u0000\u0000Ā‚\u0000\u0004\u0000\u0000A\u0000\u0004\u0000\u0000A\u0000\u0004\u0000\u0000A\u0000\u0000\u0000\u0000@", - "BTNs 1:startlap 2:exit 3:reset": "\u0000Ƅ\r\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u000fĀĆØ@\u0000\u0001\u0000\u0000\u0002\u0000\u0000\u0002\u0001\u0000\u0000\u0000\u0007Ā€\u0000\u0000\u0001\u0002\u0000\u0007€„\u0010Ƅ\u0000\u00000\u0000\u0000 \u0000\u0000 \u0010\u0000\u0000\u0000Ā„\u0000\u0000\u0000\u0000 \u0000Ā„\bA\fGĀ€\u0005\u0003\u0007Ā‚\u0007‹‚\u0001\u0007‹€\bC\u0007ˆC\u0002\u0000\bCĀ„\u0010¤„\u0000\u00100„ø„Äø\u0010„Ä\u0000\u00040„„\u0010Ćø\u0000\u0004?\nH\u0000\u0001\u0000\b\u0002\u0000HB\u0001\u0000H@\u0001Ā€\bD\u0002\u0000\u0003€„\u0010Ā”`\u0000\u0010\u0000` |Ā€ \u0010|Ā„\u0000 \u0000ü0\u0010 \u0000\u0004\bA\tAĀ€\u0001\u0000\u0001Ā‚\bH\u0002\u0001\bH@\u0004\u0000\b\u0003\u0001\u0002\u0000\u0000@Ā„\u0010Œ\u0004\u0000\u00100\u0004 „€ \u0010„„\u0000Ā€0Ā€H\u0010 \u0000Ā„8A\bƈ@\u0001\u0003\bB\bƈ\u0002\u0001\bÌ@\b\u0003\bHA\u0002\u0000\bCĆø\u0010Ā„x\u0000|\u0000x\u0018tĀ€\u0018|tĀø\u0000ü\u0000xĀ„|\u0018\u0000x\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "Delete All Messages": "\u0000Ā\u0010\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0004\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā’\bð€\n\u0000\u0001\u0000\u0000\u0000 \u0000\u0000\u0000\u0000 \u0000\u0000¤\u0011!\u0000\"\u0000\u0001\u0000\u0000\u0000 \u0000\u0000\u0000a \u001e\u0001Q\"Ā…\u0000Ā‚\u0000\u0002\u0000\u0000\u0000@\u0000\u0000\u0000!@ƒ\u0000Ā‚E\u0011\u0002\u0002\u0000\u0004\u0000\u0000\u0000Ā\u0000\u0000\u0000\u0002\u0002\"\u000fäŒA\u000bĆŗ\u0001ˆ\u0000\u0000\u0001b\u0000\u0000\u0006\u0000\u0004B\u0010I\u0015}àƒ\u0000Ć \u0002 \u0013\b |\u0002\u0004\u0011\u0004 Ā’$ \u0001\u0000\u0000@\u0012 \u001c ?\u0000\u0000\u0010\"\b$H@\u0002\u0000\u0001@\u0014@\bĀ€\u0000\u0000\u0000@H\u0010Ā‚HĀ—Ćøƀ\u0002@!\u0000\u0010\u0000\u0000\u0000\u0001\u0000A\u0004‘”\u0000\b\u0000\b\u0000\u0002\u0000 \u0000\u0000\u0000\u0004\u0001@ƒù\"ĀŠĀ€\u0010\u0000 \u0000\b\u0000 \u0000\u0000\u00010\u0001\u0006\u0004\u0010D$Ā€ \u0001Ā€\u0000 \u0000>\u0000\u0000\u0001Ā€\u00000\b ˆˆŸÿ\f\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0011E\u0010Q\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000!\u0004 @", - "Vibration": "\u0000\u001e\u0010\u0000\u0010\u0000\u000f Oñà \u0000Ā‚\u0004Ā€?èþø\b|H\u0001ü‘ \u0004Ā’EĆæ\u001fƉ\u001aĀ I$ĆŠĀ‘Ć¼Ā*€‚D¤\u001fƉ\u0012\bDR ?\u0015JO‰J0B", - "Utils": "\u0000Ā«\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0004\u0012\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u001e\u0000\u0000\u0001\u001c\u0000\u0002\u0000A@\u0000\u0000ƀ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u001c\u0000\u0000\u0000\u001c\u0000\u0000Ā€\b \u0000\u0000\u0004\u0000\u0000\u00000\u0004p\u0000\u0000\u0000\u0000\u0000\b\u0000\u001c\u0000 \u0001\u001e\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002r\u0000\u0000\u0000\u0003ƀ\u0002\u0001\u001cĀ€\u0018\u0000,@\u0000\u0000ƀ\u0000\u000f\u0000\u0010@@@Ćø#Ā€\u0000Ā€\u001c\u0010\r\u0000&\u0010@Ćø\u0004\b\u000e \u0000\u0010\u0010\u0007Ć \u0003\u0000p\u0000\u0002\u0006\u0010\u0003Ā„\u0007Ć \u0000\u0002\u0000\u0004\u0000\u0002\u0002\u0000\u0000\u0000\u0002\u0000r\u0000\u0000Ā€\u0002\u0000\u0011\u0000\u0000\u0000\u0000Ā€\u0007Ā€\u0000€ø\u0000\u0000\u0000Ā€\u0000@\u0000\u0010\u0000@\u0002\u0000\u0000\u0000\u0000 \u0007 \u0000#à€\u0000\u0000\u0010\u0000\b\u0000\u0004\u0000\b\u0000@\u0000\u0000\u0000\b\u0000\u0004\u0000\b\u0000\u0000\u0000\u0000\u0004\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0004\u0000\u0000\u0000&\u0000\u0003Ā€&\u0000\u0000\u0000\u0000\u0001\u0000\u0000 \u0000ƀ\u0000 \u0000~\u0000\u0000\u0003\u0000\u0003ˆ\u0003\u0000\u0000\u0000\u0000\u0000@\u0000\u0004\u0000`\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "BTNs 1:startlap 2:exit 3:reset": "\u0000Ɔ\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u001c\u0000 \u0000\u0000\u0000Ā€\u0000\u0000\u00028\u0000\u0000\u0004|Ā€\u0000>?Ā”\u0000\u0000\u0004\u0000\u0007\u0000Ćø\u0000\u0000\u0002\u0000\u0003ư\u0007\u0000\u0000\u0000\u000e,\u0000\u001eĀ„\u0010Ƅ\u0000\u00000\u0000\u0000Ā€\u0004 \u0000\u0000\b\u000000\u0000Ć \u0000\u0000\u0000Ā€\u0000†\u0010C\u0011Ć \u0001@ƀ\u0002\u0000\u0011\u0000\u0000\u0000 \u0000ƀƁ\u001cĀ€\u0000\u0000\u0004\u0000\u0002\u0018A\nH@\u0001\u0003\u0000\u0010\u0000¤\b\u001f\u0000Ć \u0003\u0003\u0003Ā‚\u0000ˆ\u0000\u0010\u0000\u0000~\u0004) \u0000\u0004\u0000\u0000@\u0004`\u001fĀ€\u0002`\u0003ư\u0000\b\t\u0010\u0000Ā€\u0000\u0006Ā„\u0010Ā”`\u0000\u0010\u0000\u0002Ā€ Ā€\u0000\u0000\b@?\f\u0000@\u0014@\u0002\u0000\u0000\"\u0010BP`\u0000@\u0000\u0011\u0000\u0004\u0000\u0000\u0000 \u0003\u00030\u0001\u0000B\u0000\u0010\u0000\u0001\bA\bƀ@\u0001\u0003\u0001Ā‚\u0000 \u0000\u0000\u0000Ā€\f\u0003\u0000\b\u0000\b\u0000Ā€\u0000\b!\u0004#!\u0000\u0004\f\u0018\b\u0001\u0000\u0000\u0000\u0002\u00000<\u0000@\u0000@\u0004\u0000\u0000 Ćø\u0010Ā„x\u0000|\u0000\u0000\u0000\u0018\u0000\u0000\u0000\b\u0000?\f\u0006\u0000\u0002\u0000 \u0000\u0000ü\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001Ā€\u0000\u0000\u0000 \u0000\u0000\u0000`\u0000\u0010\u0000\u0000\u0000\u0000\u0000", + "Delete All Messages": "\u0000Ƈ\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\b\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0001$\u0011Ć”\u0000\u0004\u0004\u0000\u0000\u0000\u0001ƀ\u0000\u0000\u0002\u0000\u0000\u0000@\u0000\u0000\u0000\u0000@\u0010\u0001H\"B\u0000\u0004\u000fĀ€\u0001\u0004<\u0000<\u0000\u0002\u0000\u0000\u0000@\u0000\u0000\u0000ƂA,\u0002Ā¢E\n\u0004\u0007ư\u0000\t\u0007\u0001¤\u0000\u0004\u0000\u0000\u0000Ā€\u0000\u0000\u0000Bà\u0001\u0004Š\"\u0007Ć  \u0001ˆ\u0000@\u0004D\u0000\b\u0000\u0000\u0001\u001e\u0000\u0000\u0000\u0004\u0001\u0000\u001fƉ\u0018Ā‚\u0000\u0001ƀ\u0004Ā€\u0000Ā€\bĀ„\u0003\u0010\u0000\u0000\u0002Ƅ\u0000\u0000\f\u0000\u0002\u0010 Ā’*Ć»\u0001„À\u0010Ā€\u0002\u0000\"\b\u0001ƀ\u0004@&\u0010@Ćø\u0004\b\u000f8A$H@\u0004\bĀ€@Ā€\u0004\u0000D\u0010\u0000Ā€$@8@~\u0000\u0000 1€þH€\b\u000f\u0000\u0000ƀ\b\u0000 \u0002Ā€(Ā€\u0011\u0000\u0000\u0000\u0000۠\u0001\u0004Ā‘/ư\f\u0002\u0000\u0000`\u0010\u0001 Ā€\u0004Ā€B\u0000 \u0000\u0000\u0000\u0002\u0000\u0014\u0002\t#B\u0000\u0000\b\u0000\u0000\u0000 \u0002\u0000\u0010\u0000\u0004\u0000@\u0000\u0000\u0000\b\u0000H\u0007òE\u0015\u0000\u0000\u0010\u0000\u0000\u0000 \u0002\f\u0000@\u0000\u0010\u0000@\u0000\u0000\u0002`\u0001\u0000\b ˆI\u0000\u0000@\u0000\u0000\u00008\u0000`\u0003\u0000\u0000@\u0000|\u0000\u0000\u0003\u0000\u0002\u0000\u0010A\u0011\u0011\u0000A\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0018\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003ư\"Р¢\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000B\b@Ā€\u0000", + "Vibration": "\u0000|\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0004Ā‚\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000H\u0000@GĀØ\u0010\u0000\u0000\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0002Ā€\b\u0003Š\u0001\u0000\u0000\u0000\u0000@\u0000\u0000\u0003\u0000\u0011 \u0001\u0000\u0000Ā€\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0010ˆ\u0000`\u0000\u0010\u0001\u0000\u0000\u0000\u0003\u0000\u0000<\u0000A\b@\u001a\u0000\u0001\u0000\u0010\u0000ð\b\u0010\u001c@\u0000!\u0002\u0006\u0010\u0000 \u0001\u0002\u0007Ć \u0000\u0002\u0000\u0004\u0000\u0002\u0010 \u0001\u0000\u0002\u0000\u0010@\u0000\u0000\u0000@\u0003ƀ\u0000B\u0001\u0000\u0010\u0000@\u0001\b\u0000\u0000\u0000\b\u0001ƈ\u0000\b@\u0010\u0001\u0000\b\u0000\u0011\u0000\u0000\u0000\u0001\u0000\u0000Ā€\u0001\b\u0001\u0000\u0010\u0001\u0000\u0001`\u0000\u0000\u0002`\u00008\u0002`\u0000\u0000\u0001\u0000 \u0000\u0018\u0000\u0000\u0000\u0018\u0000\u001c@\u0018\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "Utils": "\u0000{\r\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\bư\u0000\u0000\u0004\u0010\bư\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ć \u0000\u0000\u0000B\u0000Ć \u0000\u0000\u0000\u0000#Ā€\u0000\u0000\u0000\u0000\u0000@\b@\u0000\u0000\u0000@\u0000\u0003\u0000\u0000\u0000\u001e\u0000\u0010\u0001\b\u0000\u001e\u0000\u0010\u0000\u0000\u0002\u0002\u0007Ɓ\u001c\u0000\u0004\u0000!\u0001\u001c\u0000\u0004\u0002\u0007?\u0000\u001cĀ€\u0003Ā€\u0004 \u001cĀ€\u0003Ā€?\u0000\u0010\u0000\u0000\u0000\u0010\u0003\u0000Ā„\u0000\u0010\u0003\u0000\u0000\u0007ƀ\u0000\u0000\u0004\u0000\u0002\u0000\u0001\u0000\u0004\u0000\u0002\u0000\u0000\u001f\u0004\u0000\u0000\u0000Ā€\u0000@\u0000 \u0000Ā€\u0000@\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\b\u0000\b\u0000 \u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\b\u0000\u0001\u0000\u0002\u0000\b\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000 \u0000Ā€\u0002\u0000\u0000 \u0000\u0000", "Piezo": "\u0000+\u000e\u0000\u0000\u0000\u0000\u0000\u0000@0\u0000\u0000\u0000¦\t\u0000\u0000\u0004\nĀ” \u0001ƀAD\u0018\u000fƀ\u0004 Ā€\u0000 \u0000Ā„\u0011ƀ\u0002\u0000\u0010ĀƒĆ€\u0000@\u0000 @\u0000\b\u0000\u0004\b\u0000\u0001\u0000\u0001\u0001\u0000\u0000~\u0000 \u0010\u0000ư \b\u0001Ćø\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000Ā€\u0000", "BLE": "\u0000\u0016\n\u0000ø€þ\u0012\u0002\bH\b! ø€ú\u0012\u0002\bH\b! Ā„Ā€ĀƒĆ£Ć³Ć°", - "Make Connectable": "\u0000l\u0010\u0000\u0010Ā€\u0010 \u0000\u0000\u0010@\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0001\u0002\u0007ÿâD@\u0000\u0000\u0010\u0000\u0000\u0013ü#þ\u0000\u0010BH \u0000\u0000Ā€\bƁ\u0000\u0002Ā‚\u0000\u0001\u000fĆ·\u0001\u0000\u0004\u000fĀ€tý\bIü\u001f\u0010\u0001@\u0010ư?Ā€\u0000\t\u000f\u0000\u0001\u0011\u0000\u0004!1Ā€\b\u0000\u0010\u0017þ\u0013þ\u0011\u0010~B \u0003Ā€\u0002\u0001\u0004\u0002 !\u0011\u0004#Ć¢\u0000\u0000L\u0000|\u0018@L\u0004\u0011\u0010B\u0000 \u0000\u0004@\f#ï‰\u0001\u0011\u0007ƤB\u0000\u0000<\u0001\u0001Ј\b\u001f\u0010BH\"\u0000\u0000@ \u0011\u0010Ā€\t\u0001\u0011\u0004'\u0002Ā \u0000\b\u00009\u0010¨\u0000\u0010~@\u0011Ćø\u0000Ā€\u0004a\u0006\nĀ‘ \u0001\u0004$!\u0000\u0000\u0010\u0000DQ˜\u0012\u0000PJB\u0010\u0000\u0002\u0000\u0003Ā‚`@ Ć \u0002\u0004CĆ \u0000\u0000\u0000\u0000\u0000", + "Make Connectable": "\u0000l\u0010\u0000\u0010 \u0001\u0000\u0000\u0000\u0010@\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0010\u0007ÿâD@\u0000\u0000\u0010\u0000\u0000\u0010P!\b\u0000\u0010BH \u0000\u0000Ā€\bƁ\bĀ‚\u0010Ā€\u0001\u000fĆ·\u0001\u0000\u0004\u000fĀ€tý\u0004!\b\u001f\u0010\u0001@\u0010ư?Ā€\u0000/Ā¢\u0010\u0011\u0000\u0004!1Ā€\b\u0000\u00100 ?Ćø\u0011\u0010~B \u0003Ā€\u0002\u0003Ā‚\u0000\u0010\u0011\u0004#Ć¢\u0000\u0000L\u0000|Uü\u0001\u0000\u0011\u0010B\u0000 \u0000\u0004@\f%R@\u0010\u0001\u0011\u0007ƤB\u0000\u0000<\u0001\u0001Ā‘$A\u0004\u001f\u0010BH\"\u0000\u0000@ \u0011\u001fƄ\u0010A\u0011\u0004'\u0002Ā \u0000\b\u00009\u0010PA\u0004\u0000\u0010~@\u0011Ćø\u0000Ā€\u0004a\bĀ„\u0010@\u0001\u0004$!\u0000\u0000\u0010\u0000D\u0011\u0004ü\u0000PJB\u0010\u0000\u0002\u0000\u0003 \u0000@\u0002\u0004CĆ \u0000\u0000\u0000\u0000\u0000", "HID": "\u0000\u0016\n\u0000Ā„|ò\u0010B(A\ba\u0004!ü\u0010†\u0010B\u0018A\ba\u0004!Ā„\u0010Š\u0011óÀ", - "Light BW": "\u0000=\r\u0000\u0000\u0000\u0000Ā€ \u0000\u0000\u00028\u0000\u0004\u0000Ā€\u0000\u0000\u000e\u0000\u0000@\u0004\u0000|B\u0003Ā€\u0004\u0000 \u0002\u0012\u0018Ƥ\u0000ƀ\u0001\u0000\u0010¸ \u001a\u0000\u000e\u0000„„\u0001\u0003\b\u0000L\u0007Ć…Ā \u0010\u0000@\u0002\u0010!-\u0000Ā€\u0002\u0000\u0010\u0001\t˜\b\u0000\u0010\u0000Ā€\bL\u0000Ā€\u0004\u0000BB\u0018\u0000\u0004\u0000 \u0003Ć¢\u0013\u0000\u0000 \u0001\u0000\u0000\u0000\u0000", + "Light BW": "\u0000M\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@\u0007Ćæ\u0000\u0000\u0000 \b\u0000\u0004\u0000!\bĀŽ\u0000\u0001\u0000 \u0001ĆæĆĆæĆƒĀ€\u0000\u0010\u0001\u0000\b\u0002\bB\u0000Ć \u0001\u0000\b\u0000@\u0010ò9\u00000\u0000@\u0002\u0000Ā€\u0010\u000e\b\u0006Ā€\u0003Ā€\u0010\u0004\u001fü\u0000@Ƃ\u0000\u0013\u0000ÿà\u0004\u0000\u0004\u0000\u0010\u0000Ā„\u0004\u0001\u0000 \u0000 \u0000Ā€\u0004\u0000 \bÿþ\u0002\u0000\u0004\u0000 \u0001\u0000@\u0000\u0000 \u0000 \u0001\u0000\b\u0002\t\"\u0006\u0000\u0001\u0000\b\u0000@\u0010DĀˆĆ€\u0000\b\u0000@\u0003ÿ„$@\u0000\u0000\u0000\u0000\u0000\u0010\u0004@\u0002", "LCD": "\u0000\u0016\n\u0000Ā€xò\u0002\u0012(\bH` !€€†\u0002\u0002\u0018\b\b`!!€„‹ñãÀ", "Background": "\u0000\u001f\u0010\u0000\u0004Ā€\u001fư\t0 !ó€ƀ$ Ā€ĀĆˆAĆæ\u001cĀĀ€ \u0010\u0000?ĆæĀĆø\u0000\u0000\u0010\u0010\u001fư?Ć  @@@@ÿ€ÿ\u0001\u0000\u0010\u0002\u0002\u0004!\u0004\u0014\u0011A\b\u0010\u0001\u0000", - "Foreground": "\u0000y\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\b\u0000\u0000\u0000BaĆ \u0000\u0000CĆ \tĀØ#Ā€\u0002\u0000\u0000\u0000\u0010ĀÆ\u0010\u0000\u0000\u001e\u0010\u0007P\u000e\u0000\u0001\u0000\u0018\u0000\b@\b\u0000Ā€\u0000\u0010\u0002 \u00008\u0000Ćø\u0002\u0004\u0004\u0000\b\u0000 \u0000\u0002\u0010\bƤ\u000fĀ„\u0000Ā‚\u0002\u0000\u0004\u0002\u001c\u00000\u0001\u0010\u0003Ā‚\u0002\u0002\u0000\u0002\u0001ƀ\u0004\u0000Ćø\u0000\u0010\u0001\b\u0000\u0001\u0001\u0002\u0000\u0001\u0000˜\u0002\u0000\f\u0000\b\u0001\b\u0000\u0001\u0000A\u0000\u0001\u0000B\u0002\u0000\n\u0000\u0004\u0000\u0004\u0000\u0000Ā€!\u0000\u0001\u0000 \u0002\u0000\t\u0000\u0004\u0000\u0004\u0000\u0000Ā€\u0000Ā€\u0001\u0000\u0010\u0002\u0000\bĀ€\u0002\u0000\u0004\u0000\u0000Ā€\u0000Ā€\u0013\u0000\b\u0002\u0000\bƀ\u0002\u0000\u0004\u0000\u0001Ā€\u0000Ā€\u0006\u0000\u0004\u0000\u0000\u0000 \u0002\u0000\u0004\u0000\u0003\u0000\u0000Ā€\u0000\u0000\u0002\u0000", + "Foreground": "\u0000\u001f\u0010\u0000\u0010\u0010\u001fư\u0010 Ā€Çÿð€€\u0000\u0001Ćæ\u0007Ɓ\u0000 \bĀ’?ÿ‘$\u0000\u0000>H\u001fưD ‰ @Aò@ÿ‚ Ā€\u0010\u0004A\u0004!\nŠ\u0011A\u0012\b\u0001\u0000", "Programmable": "\u0000m\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000A\u0000\u0003\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u000fĆæĆ„ĀˆĀ€$\u0000\u0000\b$\u0000\u0000\u0002\u0000\u0000\u0010BI\u001f \u0000\u0000&Ā ĀŽ\u0000\b\u0000\u0000‡û‡\u0016\b|\u0001Ɣ\u0003Ā€\u0000@\u0007Ƅ\u0000P\u0000Ā€< \bĀ€\u0000Ć \u0002\u0000\" \u0000Ā„\b\u0001\u0001\u0000Ā„\u00029\u0000 \u0001\u0011\u0007Ƥ @\b\b\u0004@\u000e\b\u0001\u0000\bˆ!\u001f\u0004\u0000 Ā€B\u0000\u0000@\t\u0000DA\b\u0000 \u0001\u0004\u0004 \u0000\u0004\u0000Ā„\u0002\"\u000fĆˆĀ‚\u0000\tĆ \u0001\u0000\u0000 \u00040\u001f\u0010BH \u0000pĀ€\u0010\u0000\u0002\u0001N@ĀˆĀ‚\u0013Ā‚\u0000\u0002\u0000\u0001\u0000\u0000 \u0007Ā‚\u0000\u0004\u001f \u0000\u0000\u0000\u0010\u0000\u0006\u0000\u0000\u0000\u0000 „„\u0000\u0000\u0000\u0001\u0000\u0000ƀ\u0000\u0000\u0000\u0005\u0004¤ \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\"\u001f", "Customize": "\u0000\\\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 Ā€\u0000\u0000\u0000Ā€\u0000\u0000\u0000\b\u0000\t\u0004\u0000CĀ€\u0004\u0000\u0000\u0000\u0000€‡P@\u0003ƈ\u0000|\b<\u0000\u0010\u0007”‡À\u0001\u0000\b@| \u0002\u0000\u0002\u0007Ƅ\u0000\u0010\u0000ˆ\u0000\u0004\u0000ƀ\u0000 \b@\u0002\u0000\u0014Ā€\u0000Ā€4\u0000\u0004\u0000Ā„\u0000 \u00020\u0000\u0010\f \u0000@\u0010Ā€\u0005\u0000A\u00002\u0000\u0002\u0000\n\u0001\b\u0000ˆ\u0000 \u0000ƀ\u0000 \u0001\u0010 Ā€0@\u0004\u0000\u0002\u0000\u0002\u0000`Ā„P\f\u0004\u0000Ā€\u0000\u0010\u0000 \u0018\bƒ\u0000\u0000\u00000\u0000\u0000\u0000\u0002\u0000\u0000\u0000 \u0000\u0000\f\u0000\u0000\u0000\u0000 \u0000\u0000", - "Dark BW": "\u0000>\u000e\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000! \u0000\u0000 \u0000\u0000\u0000BĀ€\u0000\u0000N\u0000\u0000\u0001Ćø\u0000\u0000\u0001ƈ>!\b@\u0000\u0000\u0004@„„!\u0000\u0000\u0000!\u0002\u0012\u0011H\b\u001f\u0000ˆ\bHHĀ \u001fĀ€\u0004 >-A\u0000\u0000\u0000!\u0000„“\b\u0000\u0000\u0000\u0004\u0002\u00130@\u0000\u0000\u0000 \bLƂ\u0000\u0000\u0000\u0001\u0000!!0\u0000\u0000\u0000\b\u0000ø‡\u0000\u0000\u0000\u0000@\u0000\u0000\u0000", + "Dark BW": "\u0000N\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000@\u0000\u0000\u0000\u0000\u0010\u0001ÿÀ„€\u0000\u0000Ā€\u0000Ā€\u0004!\u0001\n\u0000\u0000\u00018\u001fü\u001fü\u0007Ć \u0000\u0000\u0007 @\u0010B\u0010!\u0000\u0000\u0000\u0011\u0001\u0000AÿÀ„\u0000\u0000\u0000Ā„\u0004\u0001\u0000 \u0005 |\u0002 \u0010\u0004\u001fü\"Ā€~\u0000\u0010Ā€ư\u0002\u0001\u0004\u0000\u0000\u0000Ā„\u0001\u0000@\b\u0000 \u0000\u0000\u0000\u0010\u0004\u0001\u001fÿÁ\u0000\u0000\u0000\u0000Ā€\u0010\u0004\u0000\u0000\b\u0000\u0000\u0000\u0004\u0000@\u0010I\u0010ƀ\u0000\u0000\u0000 \u0001\u0000A\u0012,\u0000\u0000\u0000\u0001\u0000\u0007Ćæ\bHĀ€\u0000\u0000\u0000\u0000\u0000\u0010\u0004@\u0002", "Background 2": "\u0000'\u0010\u0000\u0004Ā€\u001fư\u0000\t0 \u0001ó€ƀ\u0000$ €€\u0001ƈAĆæ\u0003ĆœĀĀ€ \bP\u0000?ĆæĀĀĆø\u0000\u0000\u0001\u0010\u0010\u001fư\f?Ć  @@@@€ÿ€ÿ‚\u0001\u0001\u0000\u0010\u0004\u0002\u0002\u0004!\u000fƄ\u0014\u0011A\u0000\b\u0010\u0001\u0000\u0000", - "Quiet Mode": "\u0000‰\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0000\u0000\u0000Ā€\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0000\u0000BDĆ CĆ \u0000@\u0000\u0000\u0000\u0000\b\u0000!ƀ\u0000\u0000\u0010£\u001e\u0010\u0000@\u0000p\u0000\u0000\u0004\u0000\u000f\u0000\u0000\u0000\bA\u0010\b\b\u0000@\u000fƀ\u0000\u0000\u0002\u0000\u0001\u0000\u0000\u0000\u0004\u0001\b\u0002\u0004\u0000ƀ\u0000Ā€\u0000\u0000\u0001\u0000\u0000Ā€\u0000\u0000\u0002\u0000ˆ\u0001\u0004\u0001Ā \u0000 \u0000ˆ\u0000Ć \u0004\b\u001f\u0001À„\u0000Ā‚\u0003\b\u0000\u0010\u0001\"\u0000L\u0001Ć \u0003ư\u0000Ā˜Ā„\u0000\u0002\u0000\u0004\u0000\b\u0000Q\u0000!\u0000\u0010\u0000\u0000\u0000B\u0002\u0000\u0001\u0000\u0002\u0000\u0004\u0000!\u0000\u0010\u0000\b\u0000\u0000\u0000 \u0002\u0000\u0001\u0000\u0001\u0000\u0007Ć \u0000Ā€\b\u0000\u0004\u0000\u0000\u0000\u0010\u0002\u0000\u0001\u0000\u0000Ā€<\b\u0000Ā€\u0004\u0000\u0001ư\u0000\u0000\b\u0002\u0000\u0001\u0000\u0000@\u0000\u0000\u0000Ā€\u0002\u0000\u0000\u0000\u0000\u0000\u0004\u0002\u0000\u0001\u0000\u0000 \u0000\u0000\u0000Ā€\u0001\u0000\u0000\u0000\u0000\u0000\u0002\u0000", - "Highlight FG": "\u0000^\r\u0000\u0000\u0000\u0000@\u0000\u0000\u0000@\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000ĀŽ\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\b\u0001ƀ\u0000\b\u0000Ā€\u000fDŽ@\u0000@\u00008\u0000@\u0002\u0000 !\bĀ€\u0006\u0000G \u0006\u0000\b\u0000€„!\u0000h\u0000à€h\u00008\u0002\u0002\u0001\u0002\u0006\u0010\u0000\u0002\u0006\u0010\u0000˜\u000fˆ\u0004\b\u0000@\u0000\u0010\u0000@\u0002\u0010 ' \u0010\u0001\u0000\u0000@\u0001\u0000\b\u0000€…\u0000@\u0004\u0000\u0002\u0000\u0004\u0000 \u0002\u0002\u0018\u0001\u0000\u0010\u0000\u0010\u0000\u0010\u0000Ā€\b\bƀ\u0000\u0000@\u0001Ā€\u0000@\u0002\u0000 \u001d\u0000\u0000\u0001\u0000\u0018\u0000\u0001\u0000\b\u0000\u0000\u0000", - "Foreground 2": "\u0000Ā„\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0012\u0000\u0000\u0001\u0000\u0000\u0000\bH\u0000‡€\u0000\u0001\u000fĀ€&Ā ĀŽ\u0000\b\u0000\u0000\u0000BĀ€\u0007ˆ\u0000\u0000\u000f\b\u0003ĀØ\u0007\u0000\u0000Ā€\f\u0000\u0004 \u001e\u0000Ā€\b\u0000\u0001\u0000\"\u0000\u0003Ā€\u000fĀ€ @@\u0002\u0010\u0010\u0000@\u0001 \u0004 \u0011ƈ\u001f\b\u0001\u0004\u0004\u0000!\u0001\u0000‡\u0000\f\u0000D\u0000à€€€\u0000Ā€p\u0000\u0010 \u0007ƀ\u0000Ā€\b@\u0000\b\b\u0010\u0000\b\u0004ƀ\u0006\u0002\u0000\f\u0000\b\u0001\b\u0000\u0001\u0000A\u0000\u0001\u0000B\u0000Ā€@\u0001@\u0000Ā€\u0000Ā€\u0000\u0010\u0004 \u0000 \u0004\u0000\u0010\b\u0000$\u0000\u0010\u0000\u0010\u0000\u0002\u0000\u0002\u0000\u0004\u0000@\u0002\u0001\u0000\u0004@\u0001\u0000\u0002\u0000\u0000@\u0000@\tĀ€\u0004\u0000 \u0000Œ\u0000 \u0000@\u0000\u0018\u0000\b\u0000`\u0000@\u0003ư\u0000\u0000@\u0004\u0000\b\u0000\u0006\u0000\u0001\u0000\u0000\u0000\u0004\u0000\u0000", + "Quiet Mode": "\u0000z\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000€€\u0000 \u0010\u0000\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0010Ā’\u0010\u0000\b\u0002\u0000\u0000\u0000\u0001\u0000\u00048\u0000\u0000\u0002\u0014D\u0000\u0004\u0000Ā€\u0001Ā€\u0000@\u0000ư\u0000\u0000\u0000Ā„\u0011\u0000\u0002\u0000 \u0000\u0010 \u0010\u0000\b\u0000\u0000\u0000 $Ćø\u0003\u0000\b\u0000\u0002\b\u0004\u0000\u0002\u0000\u0000\u0000\b\u0007Ɛ\u0003@\u0002\u0000\u0000\u0004\u0001ƀ\bþ\u0010>\u0003Ā€D\u0003\b\u0000\u0000\u0001\u0000L\u0001Ć \u0003ư\u0000˜\u0011\u0000\u0002\u0000 Ā€\u0000Ā€\u0010Ā€\b\u0000\u0000\u0000!\u0004@\u0000Ā€\b@\u0000@\u0004\u0000\u0002\u0000\u0000\u0000\b\u0000 \u0000 \u0002 \u0000 \u0001\u0000\u0000Ā€\u0000\u0000\u0002\u0000\b\u0000\b\u0000°\u00010\u0000@\u0000\u001f\u0000\u0000\u0000Ā€\u0004\u0000\u0002\u00000\u00000\u0000\u0010\u0000\u0000\u0000\u0000\u0000 \u0002\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\b\u0000", + "Highlight FG": "\u0000n\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 ?Ć \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@€€€\u0000\u0000\u0004\u0000\u0000\u0000\u0004\u0001\u0000\u0001\u0004\u0003þ\u0000\u0000\u0000\u0010\bĆ \u0000\u0010\u0002\u0000Ćæ\b\b\u0000\u0000\u0000Ā€\u001c\u0000\u0000Ā€\b\u0000\u0000\u0000?Ć D\u0000\u0004\u0000\u0003Ā€\u0004\u0000 \u0001ư@\b\u0000ˆ\u0000`\u0004r\u0000`\u0000Ā€\u0004I\u001fÿÂ\u0010\u0006Ā€\u000e\b\u0006Ā€\u0003Ā€\u0011$\u0000\u0000\u0010 a\u0000\u0000 a\u0000\tĀ€|?Ć @Ā€\u0004\u0000\u0001\u0000\u0004\u0000!\u0001\u0012@€‚\u0001\u0000\u0010\u0000\u0004\u0000\u0010\u0000Ā€\u0004I\u0002\u0002\u0010\u0004\u0000@\u0000 \u0000@\u0002\u0000\u001f$\u000fĆøĀ€\u0010\u0001\u0000\u0001\u0000\u0001\u0000\b\u0000D\u0010\u0002\u0000\u0000\u0000\u0004\u0000\u0018\u0000\u0004\u0000 \u0001\u0010A\b@\u0000\u0000\u0010\u0001Ā€\u0000\u0010\u0000Ā€\u0005E\b €\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0012\b\u0001\u0000", + "Foreground 2": "\u0000'\u0010\u0000\u0010\u0010\u001fư\u0000\u0010 \u0000 Ā€ƀ\u0007ÿð€€\u0000\u0000\u0001Ćæ\u0003ƇƁ\u0000 \bHĀ’?ÿ‘$\u0000\u0000\u0001>H\u001fư\fD ‰ @@ò@ÿ‚\u0002 Ā€\u0010\u0004\u0004A\u0004!\u000fʊ\u0011A\u0000\u0012\b\u0001\u0000\u0000", "Remove": "\u0000\u001e\u0010\u0000\u0010\b\u0000\u0002H#Ƃ\u0005 ‰\b\u0015\u0012(P\u0010HĀ¢#ù#\u0010H$ĀŠĀ¾Ć Ā’$ þH‚\t\"_ĆØ$Ā\b?Ā’(ĀØĀ‚\b„’\b\"\"(¢ˆ(Ā”\u0004 @", "Passkey BETA": "\u0000^\r\u0000\u0000\u0000\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0003Ć \u0000\u0000\u0002\u0000\u0000\u0000\u0003ãóøÈ@\u0000\u0000\b\u0000\u0000\u0000\bH\u0001\u0004Ā”\u001e\u001e\u001e\"\u001e!\u0000! \u0004\u0012„„„„„„\u0000„€\u0010‡à\u0012\u0002\u0002Ā‚\u0012\u0010\u0003ãàB\u0018\u0007Ɔ\u0006\f\u000fƈ@\bH\u0001\u000fĆ !\u0006\u0006( !\u0000! \u0004!€„\u0004\u0004€L\u0000„€\u0010†\u00022\u0012\u0012\"\u0010Ɛ\u0002\u0012\u0000B\u0018\u0007GĀ‡ĀˆGĀ€@\u000fĀĆ\b@\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000x\u0000\u0000\u0000\u0000\u0000", "Add Device": "\u0000l\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€@\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0010\u0004\u0000\u0000\u0000 \u0000Ā€\u0000\u0000\u0000\u0000Oư@\u0004u\u0000\t\u0000\b\u00048\u0000ư\u0004\u0004\u001f8@\u0000P\u0001\u0000<Ā€4Ā€\b\u0013ù\u0010\u0000\u0002$\u0000 \u0000\u0010\u0004D\u0000Ćæ\u0004Ā‘ĀƒĆ€\u0011\u0000\f\u0000\u0001\u0000D#ƈ\u0000I\u0017ƀ\u0001\b\u0003@\u0000 \bĀ‚\u0004Ā€\u0004Ā‘\u0002\u0000 @Ƃ\u0000\u0002\u0000ˆ OĆøI\u0010 \u0002\u0004\u0000 \u0000P\t\u0002\u0004€„‘\u0004\u0000@ \u0002\u0000\b€@H\bI\u0010@\b\u0002\u0000 \u0003\u0004\n\u0004\u0004ÿ„‘\b\u0001\u0000 \u0002\u0000ƀ@AĀ€H\b‰\u0011\u0000\u0000\u0000\u0000 \u0000\u0000\u0000`\n\u0000\bŸ \u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0001\u001fù)\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000!\u0000", - "LCD Timeout": "\u0000r\r\u0000\u0000\u0000\u0000\u0004\u0000\u0000@\u0004\u0000\u0000\u0000\u0004\u0000\u0010\u0000\u0000\u0000\u0000Ā€\u0000\u0010\u0000Ā€\u0010Ćø\u0000Ā€\u0002\b\u0007Ā\u0000>\u0000\b\u0000 \u0003Ƃ\u0000 \u0000Ā‚\u0002\u0012 \u0010Ā€\u0004\u0000\b\u0000\u0001\u0000\u000fĀ€ €„„\u0004@\u0006\u0000\u0004\u0000\u0004Ā€| \b !\u0002\u0006Ā€\u0001\u0000\u0000ƀ\b\b\u0003ˆ\b\bA\u0018\u0006\u0010\u0000H\u0000 \u0002\u0004\u0000š\u0002\u0002\u0010Ā‚\u0000\u0004\u0000!\u0000\b\u0000A\u0000!€€„\u0001\u0000\u0001\u0000\b`\u0002\u0000\u0010Ā€\b !!\u0000Ā€\u0000@\u0014Ƥ\u0001\u0000\u0000 \u0002\b\bHĀ€@\u0000\u0010\u0003Ɓ\u0000@\u0000\u0010\u0000ĀƒĆ±Ć£Ć€`\u0000\u0004\u0000\u0000\u0000 \u0000\b\u0000 \u0000\u0000\u0000`\u0000\u0001\u0000\u0000\u0000\u0010\u0000\u0004\u0000\b\u0000", - "Highlight BG": "\u0000^\r\u0000\u0000\u0000\u0000@\u0000\u0000\u0000@\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000ĀŽ\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\b\u0001ƀ\u0000\b\u0000Ā€\u000f‡„@\u0000@\u00008\u0000@\u0002\u0000!!\bĀ€\u0006\u0000G \u0006\u0000\b\u0000„„!\u0000h\u0000à€h\u00008\u0002\u0012\u0001\u0002\u0006\u0010\u0000\u0002\u0006\u0010\u0000˜\u000fˆ\u0004\b\u0000@\u0000\u0010\u0000@\u0002\u0010!' \u0010\u0001\u0000\u0000@\u0001\u0000\b\u0000„…\u0000@\u0004\u0000\u0002\u0000\u0004\u0000 \u0002\u0012\u0018\u0001\u0000\u0010\u0000\u0010\u0000\u0010\u0000Ā€\bHƀ\u0000\u0000@\u0001Ā€\u0000@\u0002\u0000>\u001d\u0000\u0000\u0001\u0000\u0018\u0000\u0001\u0000\b\u0000\u0000\u0000", - "LCD Brightness": "\u0000¼\u0010\u0000\u0000Ā€\u000fĆ \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0004\u0000Ā‚\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0001Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u000fƀ\u0000\u0000@\u0017þ\b \u0000$\u0000\u0000\u0000\u0000\u0000$\u0010\u0000\u0000 \u0000\u0000|Ā„\bƀ\u0002\u0001\u0012\u0000þ\u0001\u001d@\u0000\u0001\u000e\u0002>@Ā€\u0000\u0002\u0000<\u0004H@t\u0000\u0013 \b \u000e\u0010\u0000\u0000\u000f \u001cX\b\u0000\u0000@\r DĀ„\u0000Ā€!Ƅ#À‚\u0000\u0000\u0000\u0002\u0000\u0004\u0000\u0004\u0000Ā€\u0000\b\u0001\u0011\u0004Oƀ\u0010\u0001ĆØBD\u000fĆ  ư\u0000@\u0000@\u0000Ā€\b\u0000\u0003\u0000\u0011\b|Ā„\u0002\u0000\u0000Af@\u0000\u0001ư\u0000\b\u0000\b\u0000\b\u0000Ā€\u0000Ɛ\u0002 Ā„H@|\u0000\u0004\u0012Ā”~ü\u0000Ā€\u0003Ā€\u0000Ā€\u0001\u0000\b\u00100Ā€\"\bDĀ„\f \u0007Ć¢4Ā„(@\b\u0001ƈ\u0000\u0014\u0000\u0010\u0000Ā‚\u0000\b\u0002@Ā„OƁ\u0001\u0000‚âHBĀ„\u0001\u0000\u0000Ā€\u0002 \u0002\u0000\b@\u0000Ā€$\u0010|Ā„ \u0010\u0010\u0002#\u0007ĆÆĆ€\u0010\u0000\b\u0000Ɓ\u0000@\u0000ˆ\u0000\b\u0002\u0004H@9\u0001\u0000\" BĀ„\u0002\u0000\u0000Ā€0\u0010\b\u0000\u000b\u0000\u0000Ā€\u0010`\u0001\u0004\u0004`\f\u0002%\u0004(@@\u0000\b\u0000\u0000\u0001\u0000\u0000ƀ\u0000\b\u0000\u0018\u0000\u0010@D\u0000<\"ˆ~ü\b\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€\u0000\u0000\u0002\u0014\u0003Ā€\u0000\u00000d(@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@Ā€\u0000\u0000\u0000", - "Connect device\nto add to\nwhitelist": "\u0000X\u0012\u0000\u0010Ā€\u0010 \u0011$\u0000\u0000\u0000\u0000\u0000\u0010@\u0010 \u0011$>|\u0000\u0000\u0000\u0013ü#þ\u0012ĀŖ\"D\u0000\u0000\u0000\u0010\u0000( \u0013Ā®\"D\u0000\u0000\u0000ý\bIüù$>|\u0000\u0000\u0000\u0010ð\u0000\u0012ĀŖ\u0001 \u0000\u0000\u0000\u0017þ\u0013þ3Ā®\u0001\u0010\u0000\u0000\u0000\u0010@\"\u00029$ÿþ\u0000\u0000\u0000\u0018@L\u0004Wþ\u0002Ā€\u0000\u0000\u00007þøQ\u0010\f`\u0000\u0000\u0000Ј\b‘\u00140\u0018\u0000\u0000\u0000\u0011\b\u0000\u0011\u0014ƀ\u0006\u0000\u0000\u0000\u0010¨\u0012Š>|\u0000\u0000\u0000\u0010`Ā©\u0012\u0012J\"D\u0000\u0000\u0000Q˜\u0012\u0012\u0016\"D\u0000\u0000\u0000&\u0004\u0002\u000e\u0014\">|\u0000\u0000\u0000\u0000\u0000\u0000 \u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 @\u0010\u0000\u0000\u0000\u0001\u0000\u0001", - "Wake on BTN3": "\u0000^\u000b\u0000\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0010\u0002\u0000\u0000\u0000\u0000\u0000\u0003ãú\u0011ĆØ@\b\u0000\u0000\u0000\u0000\u0000\bA\fHa\u001e\"\u001e\u0000\u001e.\u0000!\u00041!„„„\u0000„Ä\u0000Ā„\u0010¤\u0006Ɛ\u0012Ā‚\u0010\u0002\u0012\u0010\u0003Ć BëGÌ\u000fƀ\bH@\bA\t@s!( \u0000!!\u0000!\u0004%\u0001ĆŒĀ„ĀĀ€\u0000„„\u0000Ā„\u0010ĀŒĀ†\u00122\"\u0010\u0002\u0012\u0010\u0002\u0010B2\u0018GHGĀ€\u0007ˆ@\u000f\bGĀ€", - "Wake on BTN2": "\u0000^\u000b\u0000\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0010\u0002\u0000\u0000\u0000\u0000\u0000\u0003ãú\u0011ĆØ@\b\u0000\u0000\u0000\u0000\u0000\bA\fHa\u001e\"\u001e\u0000\u001e.\u0000!\u00041!„„„\u0000„Ä\u0000Ā„\u0010¤\u0006Ɛ\u0012Ā‚\u0010\u0002\u0012\u0010\u0003Ć BkGÌ\u000fƀ\bH@\bA\tB3!( \u0000!!\u0000!\u0004%\u0010ĆŒĀ„ĀĀ€\u0000„„\u0000Ā„\u0010ĀŒĀ‚\u00122\"\u0010\u0002\u0012\u0010\u0002\u0010B2\bGHGĀ€\u0007ˆ@\u000f\bOƀ", - "Time Zone": "\u0000[\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0001\u0000\u0000\u0010\u0001\u0000\u0000R\u0000\u0000\u0000\u0000\u0010\u0000\u0002\u0000\u0010\u0002\u0005@\u0000\u0000\u0000\u0003Ć \u0000Ā€\u0002\u0000 Ā \u0000\u00000\u0000Ā„\u0000 \u0000@\u0002\u0010\u0000\u0000\u0001\u0002\u0011\u0000\u0018\u0000\u0010\u0000B\u0000\u0000\u0000\u0010E \r\u0000\u0002\u0000\b@@Ćø\u0000\u0011\u0018\u0006\u0010\u0000H\u0000\u0010\u0007Ć \u0000\u0002A\u0000\u0002\u0000\u0010Ā€\u0002\u0000\u0000\u0000\u0000Ā€@\u0000@\u0002\u0018\u0000Ā€\u0000\u0000\u0000 \u0010\u0000\b\u0002ĀœĀ€\u0010\u0000\u0000\u0000\b\u0004\u0000\u0001\u0000<\u0010\u0004\u0000\u0000\u0000&\u0003\u0000\u0000 \u0000\u0000\u0001\u0000\u0000\u0000\u0003\u0001Ā€\u0000\u0004\u0000\u0000\u0000@\u0000\u0000\u0000\u0000\u0000", - "Wake on Touch": "\u0000Ā‹\r\u0000\b\u0000\u0000\u0000\u0000Ā€\u0010\u0000\u0002\u0000\u0000\u0000\b\u0000\u0000\u0000\u0001\u0000Ā€\u0000\u0000\u0000\u0010\u00018\u0000 \u0000\u0000\u0000Ā€\u0000\u0000\u0000ƀ\u0010\u0000\u0000\u0000\u0004\u00009\u0000\u0004\u0001Ā€\u0000\u001f\u0000\u0000\u0001Ć \u0003Ć \u0000\u0000\u0001\u0000\u0004@@ư\b\u0010\u0004 \u0000\u0000\u0002\u000fĀ„\u0000\u0000\u0000ƀ\u0001\b\u0007ư\u0000Ā‚\u0000ˆ\u0000\u0000\u0000>€€\u0007\u0000h\u0000\"\u0000\u0006\u0000\u0000Ā€)\u0000\"\u0001\u001c\u0010 \u000f\u00000Ā€\b@\u0001@\u0000\u0010\bƀ\u0012 \u001c\u0004\u0000 \u0000\u0010\u0002\u0010\u0000H\u0000\u0004\u0002\b\u0001D\u0000\u0010!\u0000\u0004\u0000\u0002\u0000\u0002\u0000\u0011\u0000\u0001\u0000\u0002\u0000!\u0000\u0002\u0000 \u0000Ā€\u0000@\u0000Ā€\u0004 \u0000@\u0000Ā€\u0000 \u0000Ā€\b\u0000\u001e\u0000\b\u0000 \u0001\u0004\u00010\u0000 \u0000\b\u0000\u0010\u0002\u0000< \u0001\u0000\b\u0000\u0001Ā€\u0018\u0000\u0018\u0000\u0002\u0000\u0004\u0000Ā€\u0000\u0000\u0000 \u0002\u0000\u0000\u0010\u0000\u0000\f\u0000\u0000Ā€\u0001\u0000", + "LCD Timeout": "\u0000?\u0010\u0000\u0000\u0000\u0000\u0000\u0000@\u0010\u0001ÿýÿüD \u0000\u0000\u0000\b\u0000E OĆø\u0000\u0000\u0010\u0000ĀŠĀ€Ā\u0004þ@@\b\u0004\u0005B\t$‡ÿ\b\u000b\u0004\u0012I\t\u0012\u0012Ā‚\u0014\b'ò\u0012$\u0005\u0004H\u0010I$'ƈ\u0013Ćø\u0010 Ā’HH$\u0010 A$‘#ˆ @Ā‚!>A\u001fƁA\u0004\u0000BDĀ‚ Ā‚B\b\u0000„‰\u0004A\bĀ„\u001fĆæ\u000fþ\bŠ\u0010(\u0000\u0002\u0010\u0004\u0001\b@ ", + "Highlight BG": "\u0000n\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000?Ć \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000$À€€\u0000\u0000\u0004\u0000\u0000\u0000\u0004\u0001\u0000\u000fœ\u0003þ\u0000\u0000\u0000\u0010\bĆ \u0000\u0010\u0002\u0000\u0002B\b\b\u0000\u0000\u0000Ā€\u001c\u0000\u0000Ā€\b\u00009\b?Ć D\u0000\u0004\u0000\u0003Ā€\u0004\u0000 \u0007#Ć \b\u0000ˆ\u0000`\u0004r\u0000`\u0000Ā€\b\u0000\u001fÿÂ\u0010\u0006Ā€\u000e\b\u0006Ā€\u0003Ā€\u000fĆø\u0000\u0000\u0010 a\u0000\u0000 a\u0000\tĀ€ ?Ć @Ā€\u0004\u0000\u0001\u0000\u0004\u0000!\u0000ÿ€€‚\u0001\u0000\u0010\u0000\u0004\u0000\u0010\u0000Ā€\u0002\u0002\u0002\u0002\u0010\u0004\u0000@\u0000 \u0000@\u0002\u0000\u000fĆø\u000fĆøĀ€\u0010\u0001\u0000\u0001\u0000\u0001\u0000\b\u0000 \u0002\u0000\u0000\u0000\u0004\u0000\u0018\u0000\u0004\u0000 \u0000€\b@\u0000\u0000\u0010\u0001Ā€\u0000\u0010\u0000Ā€\u0002\n\b €\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0010\u0001\u0000", + "LCD Brightness": "\u0000l\u000f\u0000\u0001Ćø\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000f\u0018\u0000@\u0000\u0000\u0002\u0000\u0000\u0004\u0000\u0000‰\b\u000eĀ€\u0002`\u0007Ā€\u0010\u0000\u0001 \u0002\b€\u0010\u00048\u0001¤\u0001\u0000\u0000\n\u0001\u0010‰ø\u0002\u0000=\u0000\" \u0010\u0000\u0004Ā€\t\u000f€@\u0000\b\u0002!\u0001\u0000\u0000Ā \u0000‰\b\u000fĀ€\u0000Ā€D\u0010\u0010\u0000Ā‘\u0000\t\u0018„\u0000ü\u0004A\u0001\u0002\u0006\b\u0000‘‰ø \u0010@H\u0010\u0010@\u0000`\t/„\u0002\u0002\u0000\u0004Ā‚\u0001\b\u0000\u0001\u0012‰\b\u0007 \u0000P \u0011\u0000\u0000\u0000\u0011@ Ā€ĀŒ\u0001Ā€\u0002\f\u0001`\u0000\u0000\u0002\u0018\u0002\b\bĀ€\u0007Ā€\u0003\u0000\u0018\u0000\u0000\u0000A\u0000BĀ€p\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "Connect device\nto add to\nwhitelist": "\u0000Ā‹\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000B\u0000@Ā€\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\b \b\u0010\u0000\u0000\u0000\u0000\u0002@\u0000Ā€\u0002\u0000\u0000\u0000 \u0001?Ƃ?Ć”\u0000\u0000\u0003£¨\u0000H\u0000@!ƀ%Ā€ \u0000P@\u0010\u0000Ā‡ĀƒĀ„\u0000\u0005\u0000\u0010\u0003ƈ\u0003ƀ?B\u0012\u0002\u0000\u000f \u0000\u0000DĀ€\u0004\u0000\u0002\u0000 \u0000„‡€\u0000@\u0000\b ư\u0004@\u0003\u0000\u0000@\u0004 \u0017þ\u0013þ\b\u0000\u0001\u0003Ć \u0000Ā„\u0001Ā \u0000\u0010\u0001Ƨ\u0002\b\u0004@A\u0000\u0000@\u0002\u0000 @Ƃ\u0000\u0002\u0000c\u0000a\u00010\u0010 \u0000\b\u0000@\u0004\b\u0000@\u0000Ā \u0010ƀ\u001bĆæ|H\u0004\u0000\u0001\u0000\u0010\u0001\u0000Ā€\b\u0000\"\u0000(\r\b€‰\u0000€€ \u0002\u0000@\u0010\u0001\u0000\u0018 \t\u0000\"\u0010\u0001 \u0010 \u0004\u0000Ā€\u0010\u0002\u0000 \f\u0004\u0002\u0000\u0004$*$\u0001\u0018\u0000@ \u0000\u0000\u0000\u0004\u0000\u0000\u0000@\u0000ƒ\u0005H\u001c\u0000\u0007\b\u0000\u0000\u0000\u0000Ā€\u0000\u0000\u0007Ć Q˜\u0012\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004Aƀ\u0000\u0000\u0000", + "Wake on BTN3": "\u0000ĀŽ\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À‡ãÂ\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\u0004‡„‰\b\u0000\u0000\u0000\u0000\b\u0000\bp\u0004\u0010\u0000\u0000\u0011ò\u0012\u0012(Pøþ„x!Ć \u001e@\b@\u0000\u00008°¨¢\"\u0010C\u0012\u0010Ā˜Ć€\u0002\u0000!\u0000\u0000\u0000\u0002\u0005Ć“C\u0010HA\fHD\u0004\u0000\b\u0000Ā„\u0000\u0000\u0000\u0010\u0005B\n¾Ô\u0004)\u0001\u0010\u0000\u0000@\u0002\u0010 |\u0000@\u0015($ Ćø\u0010¤8@\u0000\u0001\u0000\b@~\u0000\u0002\u0000|ø‚\u0010BP\u0011\u0000\u0000\n\u0000!\u0000\u0000\u0000\b\u0001TĀ‚_ĆØA\t@D@\u0000D\u0000\b\u0000\u0000\u0000@\u0005B\r\b!\u0004#!\u0015\u0000\u0006\b\u0000 \u0000\u0000\u0002\u0000\u001f(ĀØĀ„\u0010ĀŒĀ„#ư` \u0001\u0000\u0000\u0000\u0010\u0000T „“àB\u0011à€\u0000\u0000\u0000\b\u0000\u0000\u0000Ā€\u0002PĀ‚\" \u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000@\u0000\u0000\u0000\u0000\bB\b(Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000C\b @", + "Wake on BTN2": "\u0000ĀŽ\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À‡ãÂ\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\u0004‡„‰\b\u0000\u0000\u0000\u0000\b\u0000\bp\u0004\u0010\u0000\u0000\u0011ò\u0012\u0012(Pøþ„x!Ć \u001e@\b@\u0000\u00008°¨¢\"\u0010C\u0012\u0010Ā˜Ć€\u0002\u0000!\u0000\u0000\u0000\u0002\u0005Ć“C\u0010HA\fHD\u0004\u0000\b\u0000Ā„\u0000\u0000\u0000\u0010\u0005B\n¾Ô\u0004)\u0001\u0010\u0000\u0000@\u0002\u0010 |\u0000@\u0015($ Ćø\u0010¤\u0018@\u0000\u0001\u0000\b@~\u0000\u0002\u0000|ø‚\u0010BP\u0000\u0000\n\u0000!\u0000\u0000\u0000\b\u0001TĀ‚_ĆØA\tD\u0004@\u0000D\u0000\b\u0000\u0000\u0000@\u0005B\r\b!\u0004# \u0015\u0000\u0006\b\u0000 \u0000\u0000\u0002\u0000\u001f(ĀØĀ„\u0010ĀŒĀ€#ư` \u0001\u0000\u0000\u0000\u0010\u0000T „“àB\u0013ð€\u0000\u0000\u0000\b\u0000\u0000\u0000Ā€\u0002PĀ‚\" \u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000@\u0000\u0000\u0000\u0000\bB\b(Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000C\b @", + "Time Zone": "\u0000.\u0010\u0000\u0000@\u0000\u0000\u0012@\u0001\u0003ƧƀI\u000fĀ„\bĀ‘\u000fÿ¢þ>|\u0004ˆ@‰\u0010\u001fƂ!\u0003Ƨƀ\u0000\bÿÈ\u0001\u000fÿþ\u0004'Ƥ ˆ\u0010‘\u0002\n/ò~@ÿˆ\t\t\u0002\"\"D'Ƥ\bˆø\"Ā¢ B\u0000@‰\u0000\u0005\b\u0005\u0000 \u0000\b \b\u0000Ā€", + "Wake on Touch": "\u0000Ā\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u0002\u001fĀ\b\u0002\u0000\u0000\u0000\u0000@ \u0000\u0000\u0000\u0000@\u0000\u0000\u0000$<$H@\b\u0000\u0000\u0000\f\u0000Ā€\u0000‡\u0000A\u0000\u0000\u0001\u001f!!\"Ā…\u0000|\u0000\u0000\u0007Ā€\u0004<\u0003ƈ\u0001\b\u0000\u0000\u0007\u0016\u0012\u0015\u0014D\u0004 \u0000\u0000\u0002\u0000&0\u0000Ā€\b@\u0000\u0000\u0000}\u0010Ƅ\u0010\"\u0000\u0000\u0000\u000fĀ‚\u0002\u0000\u0004\u0000B\u0000\u0000\u0000\b\u0002Ā”\u0005_b\u0002 \u0011ƀ\u0010\u0000\u0000@\u0002\u0010 |\u0000@\u0015($ #\u0000HĀ€r\u0000Ā€\u0000\u0002\u0000\u0010۟\u0000\u0004\u0000ùñ!\u0002\b\u0001D\u0000\u0010\u0004\u0000\u0000(\u0000Ā„\u0000\u0000\u0000 \u0005R\t€€\b@\u0000Ā€\"\u0000\u0002 \u0000@\u0000\u0000\u0002\u0000*\u0010h@\b\u0000\u0002\u0000\b\u0001P\u0000`Ā€\u0002\u0000\u0000\u0000 \u0001Ć·Ć²ĀŠĀ€Ā€\u0000 \u0000@\u0004~\f\u0004\u0000 \u0000\u0000\u0002\u0000\nĀ„\u0010Ā’\u0018\u0000\u0002\u0000\u0004\u0000 \u0000\u0000\u0000\u0002\u0000\u0000\u0000 \u0000Ā” ĀˆĀ‹\u0000\u0000 \u0000@\u0001\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0000\u0004!\u0004\u0014@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000C\b @", "Twist Timeout": "\u0000Ā™\r\u0000\u0000\u0000\u0000Ā€\u0000\u0000 \u0000\b\u0000\u0000Ā€\b\u0000\u0000\u0000\b\u0000 \b \u0000@!ƀ\b\u0000\u0002\u0000\u0000@\u0002\u0000CĆ \u0002\u0000\b\"\b\u0000@\u000f \u0004\u0000\u0001ư\u0000@\u0001\u0000\u001e\u0010\u0001\u0000\u0004\bĀ„\u0000@\u0000 \u0002\u0000\u0001\b\u0000@\u0000Ā€\u0000\u0010\u0000Ćø\u0002\u0002D\u0000ƀ\u0000\u0010\u0001\u0000\u0000ˆ\u0000ƀ\u0000Ā€\u0000\u000fĀ„\u0001\u0001\u0002\u0001Ā \u0000\u0010\u0000Ć \u0000¤\u0001Ā \u0000@\u00000\u0002\u0002\u0000Ć \u0002\u0003\b\u0000\b\u0000L\u0000Œ\u0003\b\u0000$\u0000\u0010\u0001\u0002\u0000L\u0001\u0000\u0004\u0000\n\u0000!\u0000Ā‚\u0000\u0004\u0000!\u0000\b\u0000A\u0000!\u0001\u0000\u0002\u0000\bĀ€\u0010\u0000\u0002\u0000\u0002\u0000\u0010ƀ\u0004\u0000!\u0000\u0010\u0001\u0000\u0001\u0000\u0018 \b\u0000\u0002\u0000\u0001\u0000S\u0004\u0000\u0000Ā€\b\u0001\u0000\u0000Ā€0\u0010\u0004\u0000\u0002\u0000\u0000Ā€\u001e\b\u0002\u0000\u0000Ā€\u0004\u0001\u0000\u0000@\u0000\u0000\u0002\u0000\u0006\u0000\u0000@\u0000\u0000\u0002\u0000\u0000Ā€\u0002\u0000\u0000\u0000 \u0000\u0000\u0001\u0000\f\u0000\u0000 \u0000\u0000\u0002\u0000\u0000Ā€\u0001\u0000", - "Wake on Twist": "\u0000Ā™\r\u0000\b\u0000\u0000\u0000\u0000Ā€\u0010\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000Ā€\u0000\u0000 \u0002\u0000\u0000\u0000\u0000@\u0004Ć \u0000Ā€\u0000\u0000\b \u0000@!ƀ\b\u0001\u0000\u0000\u0000\u0000@\u0003\u0000@\u0018\u0000\"\b\u0000@\u000f \u0004\u0000Ćø\u0000\u0000\u0000@\u0001\u0010\u0010<\u0002\u0004\bĀ„\u0000@\u0000 \u0002\u000fĀ„\u0000\u0000\u0000ƀ\u0001\b\u0007ư\u0000Ā‚\u0002D\u0000ƀ\u0000\u0010\u0001\u0002\u0002\u0000\u001c\u0001Ā \u0000ˆ\u0000\u0018\u0000\u0002\u0001\u0002\u0001Ā \u0000\u0010\u0000Ć”\u0002\u0000ư\u0003\b\u0000Ā„\u0000\u0014\u0000\u0001\u0000\u0002\u0003\b\u0000\b\u0000LA\u0000\b\u0000\u0004\u0000Ā„\u0000\u0012\u0000\u0001\u0000\u0001\u0000\u0004\u0000\n\u0000!!\u0000\u0004\u0000\u0002\u0000\u0002\u0000\u0011\u0000\u0001\u0000\u0001\u0000\u0002\u0000\bĀ€\u0010\u0000Ā€\u0002\u0000\u0001\u0000\u0002\u0000\u0010Ā€\u0001\u0000\u0001\u0000\u0001\u0000\u0018 \b\u0000Ā€\u0001Ć \u0000Ā€\u0002\u0000\u0010@\u0013\u0000\u0001\u0000\u0000Ā€0\u0010\u0004\u0000Ā€\u000f\b\u0000@\u0002\u0000\u0000`\u0006\u0000\u0001\u0000\u0000@\u0000\u0000\u0002\u0000Ā€\u0000\u0000\u0000 \u0002\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0001\u0000", - "Wake on BTN1": "\u0000^\u000b\u0000\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0010\u0002\u0000\u0000\u0000\u0000\u0000\u0003ãú\u0010H@\b\u0000\u0000\u0000\u0000\u0000\bA\fC!\u001e\"\u001e\u0000\u001e.\u0000!\u00041\u0014„„„\u0000„Ä\u0000Ā„\u0010¤\u0012Ɛ\u0012Ā‚\u0010\u0002\u0012\u0010\u0003Ć BKGÌ\u000fƀ\bH@\bA\tA3!( \u0000!!\u0000!\u0004%\u0004ĆŒĀ„ĀĀ€\u0000„„\u0000Ā„\u0010Œ\u0012\u00122\"\u0010\u0002\u0012\u0010\u0002\u0010B0HGHGĀ€\u0007ˆ@\u000f\bGƀ", + "Wake on Twist": "\u0000Ā­\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u0002\u001fĀ\b\u0000\u0000\u0000 \u0000\u0000\b\u0000 \u0000\u0000\u0000\u0000@\u0000\u0000\u0000$<$H@ Ā€\u0001\u0000‡\u0000 \u0000Ā€\u0000‡\u0000A\u0000\u0000\u0001\u001f!!\"Ā…\bĀ‚\u0000\u0010\u0003ƈ\u0001\u0000\u0004<\u0003ƈ\u0001\b\u0000\u0000\u0007\u0016\u0012\u0015\u0014D\"\u0010\u0001\u0000\u0000Ā€\b\u0000&0\u0000Ā€\b@\u0000\u0000\u0000}\u0010Ƅ\u0010Ā‘\u00000\u0000\u0004\u0000@\u0002\u0002\u0000\u0004\u0000B\u0000\u0000\u0000\b\u0002Ā”\u0005_d\b\u0006Ā€\u0000@\u0003Ā€\u0010\u0000\u0000@\u0002\u0010 |\u0000@\u0015($ \u0000€Â\u0000\u0002\u0000\u0013\u0000Ā€\u0000\u0002\u0000\u0010۟\u0000\u0004\u0000ùñ!\u0000\u0004\u0000\u0010\u0000(\u0000Ā„\u0004\u0000\u0000(\u0000Ā„\u0000\u0000\u0000 \u0005R\tĀ€@\u0000Ā€\u0002 \u0004\u0000\"\u0000\u0002 \u0000@\u0000\u0000\u0002\u0000*\u0010h@\u0004\u0000\u0004\u0000`Ā€ \u0001P\u0000`Ā€\u0002\u0000\u0000\u0000 \u0001Ć·Ć²ĀŠĀ€@\u0000 \f\u0004\u0001\u0000\u0004~\f\u0004\u0000 \u0000\u0000\u0002\u0000\nĀ„\u0010Ā’\u0004\u0000\u0001\u0000\u0000\u0000\b\u0000 \u0000\u0000\u0000\u0002\u0000\u0000\u0000 \u0000Ā” ˆˆ\u0000\u0000\b\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0000\u0004!\u0004\u0014@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000C\b @", + "Wake on BTN1": "\u0000ĀŽ\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000À‡ãÂ\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\u0004‡„‰\b\u0000\u0000\u0000\u0000\b\u0000\bp\u0004\u0010\u0000\u0000\u0011ò\u0012\u0012(Pøþ„\u0010!Ć \u001e@\b@\u0000\u00008°¨¢\"\u0010C\u0010Ć€Ā˜Ć€\u0002\u0000!\u0000\u0000\u0000\u0002\u0005Ć“C\u0010HA\fE\u0004\u0004\u0000\b\u0000Ā„\u0000\u0000\u0000\u0010\u0005B\n¾Ô\u0004)\u0004\u0010\u0000\u0000@\u0002\u0010 |\u0000@\u0015($ Ćø\u0010¤\u0010@\u0000\u0001\u0000\b@~\u0000\u0002\u0000|ø‚\u0010BPA\u0000\u0000\n\u0000!\u0000\u0000\u0000\b\u0001TĀ‚_ĆØA\tA\u0004@\u0000D\u0000\b\u0000\u0000\u0000@\u0005B\r\b!\u0004#\u0004\u0015\u0000\u0006\b\u0000 \u0000\u0000\u0002\u0000\u001f(ĀØĀ„\u0010Œ\u0010#ư` \u0001\u0000\u0000\u0000\u0010\u0000T „“àB\u0011ð€\u0000\u0000\u0000\b\u0000\u0000\u0000Ā€\u0002PĀ‚\" \u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000@\u0000\u0000\u0000\u0000\bB\b(Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000C\b @", "Log": "\u0000\u001c\u000e\u0000\u0000\u0000\u0000 \u0000\u0002\t\u0000\u0000\u0013X|\u0001Ɣx@\u0011\u0004\u0004\u0002\u0010@@\"\u0002\b\u0004 €„\u0002x\u0000@8@\b\u0002\u0000\u0001\u0000\u0000\u0000 \u0000\u0000\u0004\u0000", - "Wake on FaceUp": "\u0000n\r\u0000\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0010\u0002\u0000\u0000\u0000\u0000\u0000\u0003ư\u0000\u0000\u0002\u0010\b@\b\u0000\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\b@!\u001e\"\u001e\u0000\u001e.\u0000 \u001e\u001e\u001e!.„„„\u0000„Ä\u0000€„„„„ÆÐ\u0012Ā‚\u0010\u0002\u0012\u0010\u0003Ć \u0012\u0002\u0012\u0012\u001bGÌ\u000fƀ\bH@\b\u0007ƈ\u000fƈHs!( \u0000!!\u0000 ! !!ĆŒĀ„ĀĀ€\u0000„„\u0000€„€€„†\u00122\"\u0010\u0002\u0012\u0010\u0002\u00022\u0012\u0012\u0013\u0018GHGĀ€\u0007ˆ@\b\u0007G‡‡‹€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€", - "Twist Max Y": "\u0000†\r\u0000\u0000\u0000\u0000Ā€\u0000\u0000 \u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000A\u0000\u0002\u0001\u000e\u0000@\u0000\u0000\u0000\u0000\u0000'\u0001\u000e\u0000\bĀ‚\u0000\u0010\u0003ƈ\u0001\u0000\b<\u0000\u0000\u0000Ƥ\u0003ƈ\u0010Q\b\u0000Ā€\u0000@\u0004\u0000\u001f\b\u0000\u0000\u0002 \u0000@A$@\f\u0000\u0001\u0000\u0010\u0000\u0000@\u0000\u0000\u0010Ā€\u0001\u0000ˆ\u0000Ɛ\u0000\b\u0000p\u0000\u0002\u0000D\u0000D\u0000\b\u0002 \b\f \u0000 \u00010\u0000\u0010\u0004ˆ\u0002\u0010\u0000 \u0005\u0000 \u0000Ā€\u0001@\u0004 \fĀ€\n \u0010Ā€\u0001@\b\u0001\u0000\u0002\u0000\bĀ€\u0010\u0000\f\u0000!\u0000\u0002\u0000\bĀ€ \b\u0000\b\u0000Ɓ\u0000@\u0000\b\u0000\u0004\u0000\u0010\u0000Ɓ\u0000Ā€@\u0000 \f\u0004\u0001\u0000\u0000\u0010\u0000 \u0000Ā€\f\u0004\u0002\u0002\u0000\u0000Ā€\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000\b\u0000\u0000\u0002\u0000\u0000\u0000\u0010\u0000\u0000\u0000\b\u0000 \u0000\u0000\u0000\u0000", + "Wake on FaceUp": "\u0000ĀÆ\u0010\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0002\u0001ÿü\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00000!øðÿð\b\u0000\u0002\u0000#\u0000Ā€\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000ð‘!\u0000\b\u0000\u0010\u0002\u0007ƀ:\u0000Ā€\u0000‡\u0000A\u0000\u0000\u0001\u001f!!\"Ā…\u0001Ćæ\u0000@\u0003Ćø\u0000\b\u0001\u000f\u0000ò\u0000B\u0000\u0000\u0001ń…E\u0011\u0002\u0002\u0007Ćæ\u0000\u0010\u0000 \u0002c\u0000\b\u0000Ā„\u0000\u0000\u0000\b\u0017Ƒ\fA\u0004\u0004\t\u0012\u0000Ć \u0000Ā€\b\b\u0000\u0010\u0001\b\u0000\u0000\u0000 \nĀ„\u0015}ĀĆø\u0012$\u0002`\u0003Ć \u0010\u0000\u0000@\u0002\u0010 |\u0000@\u0015($ \u0010\u0010'ƈ\u0004@\f \u0000\u0000Ā€\u0004 ?\u0000\u0001\u0000>|H@?Ć H\u0007Ā€ @\u0000\u0002Ā€\b@\u0000\u0000\u0002\u0000U Ā—Ćø@@Ā‘ \u0001\u0000Ā€@ˆ\u0000\bĀ€\u0001\u0000\u0000\u0000\b\u0000ĀØAĀ”\u0000ÿ>@\u0004\u0000\u001cP\u0000`Ā€\u0002\u0000\u0000\u0000 \u0001÷òЁ\u0001\u0002DĀ€\b\u0000F\u0001\u001fƒ\u0001\u0000\b\u0000\u0000\u0000Ā€\u0002Ā”\u0004$Ā‚\u0002\u0004‰\u0000 \u0000ˆ\u0002\u0000\u0000\u0000\u0000 \u0000\u0000\u0002\u0000\tB\bĀˆĀæĆæĀĆ¾\u0000Ā€\u0000Ć \u0004\u0000\u0000\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0010Ā„\u0010Q\u0000\u0000\u0010\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000C\b @", + "Twist Max Y": "\u0000W\u000f\u0000 \u0000\u0000\u0000\u0000\u0000Ʒư?Ć \u0000 \u0000@Ā€@\u0001( D@\u0000@\u0000DĀ€@\u0002@ĀˆĀ€\u0000Ā€\u0000Ā„\u0000œ\u0005?ÿ\u0004\u0019œ\u0001\u0000\u0001D\fA\u0002\"\b/Ƅ\u0002\u0000\u0007\b\u0014Ā‚\u0004D\b†\b\u0004\u00006\u0010%ü\u000fĆø\u0011\b\u0010\b\u0000\b JD\u0002Ā€\u00140 \u0010\u00000@”\u0018ƀ\u0010`@ `¨ÀÑ`!GĀ€@A\u0002Ā‘\u0006\"0E‘€F\u0004Ā‚D!\u0000D\u0000\u001c\u0000p\u0003\u0003\bQ\u0001\b\u0001\u0000\u0000\u0000\u0000\u0002\u0000\u0010Á‚\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000!\u0000\b \u0000\u0000", "Utilities": "\u0000{\r\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\bư\u0000\u0000\u0004\u0010\bư\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ć \u0000\u0000\u0000B\u0000Ć \u0000\u0000\u0000\u0000#Ā€\u0000\u0000\u0000\u0000\u0000@\b@\u0000\u0000\u0000@\u0000\u0003\u0000\u0000\u0000\u001e\u0000\u0010\u0001\b\u0000\u001e\u0000\u0010\u0000\u0000\u0002\u0002\u0007Ɓ\u001c\u0000\u0004\u0000!\u0001\u001c\u0000\u0004\u0002\u0007?\u0000\u001cĀ€\u0003Ā€\u0004 \u001cĀ€\u0003Ā€?\u0000\u0010\u0000\u0000\u0000\u0010\u0003\u0000Ā„\u0000\u0010\u0003\u0000\u0000\u0007ƀ\u0000\u0000\u0004\u0000\u0002\u0000\u0001\u0000\u0004\u0000\u0002\u0000\u0000\u001f\u0004\u0000\u0000\u0000Ā€\u0000@\u0000 \u0000Ā€\u0000@\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\b\u0000\b\u0000 \u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\b\u0000\u0001\u0000\u0002\u0000\b\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000 \u0000Ā€\u0002\u0000\u0000 \u0000\u0000", - "Clock Style": "\u0000z\r\u0000 \u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0010\u0000\u0001\u0000\u0000\u0004Ć \u0000\u0000\u0000\u0000\u0004Ć !ƀ\u0002\u0000\u0000@\u0002\u0001ƈ\u0010Ćø\u0000\u0000\u0001ƈ\u0007\u0000Ćø\u0000 \u0004@D\u0003Ƃ\u0000\u0000\u0000D\u0000\b\u0000B\u0000\u0010\u0000!\u0000€€\u0000\u0000!\u0000\u0002\u0000\u0011\u0000\u0018\u0000$\bĀ€ \bĀ€\bĀ€\u0001\u0000\n@\u001a\u0000\t\u0014 \u0004\u0010\t\u0010\u0004 \u0000@\u0004`\u0018@\u0002F\u0010\u0001\u0004\u0001D\u0002\u0010\u0000(\u0002\b\u0000\u0010\u0000Ā’\u0004\u0000O\u0000B\u0000\u0004\u0000\u0011\u0000\u0004\u0000\u0004\u0000DĀ‚\u0000\u001c \u0000Ā€\u0002\u0000\u0018 \u0002\u0000\u0001\u0000\u0011A\u0000\u0004\u0000\u0000@\u0001\u0000\u0018\b\u0001\u0000\u0000@\b`Ā€\u0000\u0000\u0000 \u0000Ā€\u0000\u0000\u0001Ā€\u0000\u0010\u0004\u0010@\u0000\u0000\u0000\u0010\u0000@\u0000\u0000\u0001Ā€\u0000\u0004\u0000\u0000\u0000", + "Clock Style": "\u0000l\u0010\u0000\u0000@@@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0002\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ćø@ @\u0000\u0000\u0000\u0000\u0004\u0000\u0000@\u0000\bĀæĀŸĆ„\u0000x\u0002\u001c\u0000 \u0000\u0004\u0000 ˆ@\u0000@\u001a@\u001e@\u0003Ć \u0000Ā€\u0011\bĀ„\u000fĀ„\u0002\"\u0000\b\u0000B\u0000\u0010\u0000ĀĀĆ¼\u0007ü\"\u0010\u0000Ā€\u0004@\u0006\u0000\t\u000f\u000fĀ„\u0004A\u0000\u0010\u0000¤\u0001Ā \u0000Ā‘Āˆ\u0010\u0000@D\u0010\u0001\u0000\u0011Ā€a\u0000\t\u0018ĀæĆĀ„\u0004\u0000(\u0002\b\u0000\u0010\u0000Ā’Āˆ\u0010ˆ@H \u0004@\u0001\u0000\u0001\u0000\u0011(Ā‘\bĀ„\u0005\u0002\u0001Ā‚\u0000 \u0000\u0010\u0001\u0014øˆ@ ƀ` \u0004\u0000\u0001\u0000!ˆ\u000fĀ„\u00000\u0000\u0000\u0001Ā€\u0000\u0010\u0004\u0010\u0000Pˆ@\u0000\u0000\u0000\u0000`\u0000\u0001\u0000\u0000\u0000\u0002\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", "Rewrite Settings": "\u0000[\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000!ư\u0002\u0000\u0010\u0000\u0000\u0000\b\u0002\u0000\u0004\"\u001fÿÁ\u0000ĀŽ\u0000\u0001\u0000 \u0007Ć“B\u0000\u0014 \u000e\u0000\u0000@\u0004\u0000\u0000ĀˆĀ€\u0004Ā„\u0000\u000e\u0000\u0010\u0000Ā€\u000f À\u0000\u0010Ā€ĀŽ@\f\u0000\u0010\u0000\b\u0000ÿâ\u0010\u000e\b\u0006Ā€\u0003Ā€>þ\u0000Ā€B\u0000\u0001\u0003\b\u0000L\u0000\b@\u0010\b@\u0000@\u0001\u0000\b@ù\b\"\u0000\u0010\u0000\b\u0000 \u0001\u0000\u0011\u0012\u0004~\u0002\u0000\u0002\u0000\u0004\u0000 \u0002\"Ā€Āˆ\u0000Ā€\u0000Ā€\u0000Ā€\u0004\u0000D \u0011\u0000 \u0000`\u0000\u0010\u0000Ā€\u000fŠ\u0005 \b\u00000\u0000\u0002\u0000\u0010\u0001\u0012!\u001fĆø\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001ƒ@\u0000", "Flatten Battery": "\u0000Ā«\u000f\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0000ÿø\u0004\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000Ā€\u0000@\u0000@\b\u0000\u0000 \u00020\u0001 \u0000\u0000Ā\u0000A\u0000\u0000\u0000Ā–\u0000\b\u0000\u000e\u0000Ā€\u0002\u0007ƀ:\u0000\u0014\u0000\u0000\u000e\u0000\u0004 \u0000\u0000\u000f\u0000\u0011\u0010\u0006\u0000\u0010ư?Ā€\u0000\u0012\u0000\u0000\u0000\u0000\u0000Ā„\u0000\u0000\u0000Ā€\u0001\"\u0001\u0000\u0002c\u0000\u0010\u0000 \u0011\u0000\u0000\u0000\u0001Ć \u0010Ā€\u0000\u0000\u0010Ā€$Ā€ \u0000€€\u000e\u0000\b\u0002\u0010\u0002 \u0011ƀ\u0002\u0010 |\u0007œ\u0000Ā€\u0004\u0000\u0010\u0000\u0002`\u0003à\u0001\"\u0001ƈ\u0000B\u0003ư\u0001Œ\u000fĆæĆ Āž\u0002\u0000\u0000D\u0000Ƃ\u0010 \u0014@\u0001\u0000\b@\u0000\u0000C\u0000\u0002\u0000\u001c @\u0000\u0007Ā€ $\u0002\u0002\u0010\u0000@\u0000\u0010\u0000\u0000\u0000Ā \u0000@\u0002\u0004\bĀ€\u0000\u0010\b\u0005\u0000@\u0002\u0000\b\u0000\u0002\u0000\u0000\u0000$\u0000\b\u0000@P\u0000\u0004\u0000\u001cƀ\b\u0000Ā€\u0002\u0000\u0000Ā€\u0000\u0000\b\u0000\u0001\u0000\u0000 \u0011Ćø\u0000Ā€\u0004`\u0000\u0000 \u0000Ā€\u0000 \u0000\u0000\u0001\u0000\u0000 \u0000\u0018\u0002\u0000\u0000 \u0000ˆ\u0000\u0000\b\u0000 \u0000\b\u0000\u0000\u0000\u001fĀ€\u0004\u0000\f\u0000@\u0000\b\u0000\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", "Debug Info": "\u0000]\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@Ā€@\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0004\u0002\u001fĀ€$\u0000\b\u0000\u0000\b$\u0013þ|Ā„ĀŽĀ \u0001 \u0000\u0000& \u0000Ā„#Ā„\u0000\u0005\u0000\u0000\u0001Ɣ\u0014\u0004%\u0000\u0000\u0011 \u0000\u0000\b€°Aý\u0012\u000f\u0000D\u0000\u0000\u0000Ā„\u0005Ć“H\u000fĀ€\u0002\u0010\u0002 \u0004@J\u0000\u0014~\u0002\u0000 @HĀ€B\u0000Gñò\u0010\u0001\u0002\u0001D\u0004 \u0002 Ā‚\u0014\u0000\u0010\b\b@\u0001\u0000\u0011ü\u0010ĀØ\b\u0001\u0000@\u0002\u0000\u0010\u0000ˆ'Ƶ@Ā€\u0010\u0002\u0000 \u0001\u0000\u0004\u0004$\b\u0000\u0000\u0000\u0002\u0000\u0010\u0000\"\b!PĀ€\u0000\u0000\u0000 \u0001\u0000\u0001\u0011A\f@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b†\bA", "Storage": "\u0000L\r\u0000\u0000\u0000 \u0000@\u0000\u0000\u0000\u0000$8\u0001\u0000\u0002\u0000\u0000\u0000\u0003\t<Ā€\u0010\u0000 \u0000\u0000\u0000\bP\u0010\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0004\u0001\u0000\u0010\u0000 \u0000\u0000\u0000`\u0000 \u0001ƀ\u0002\u0000\u0010>\u0001\u0002\u0002\u0000\u0013\u0000 @ü\u0000\u0000@P\u0001\b\u0002\b\u0000\u0000\u0000\b\bĀ€\u0010\u0000!\u0000\u0000\u0000\u0001\u0003\u0004\u0001\u0000\u0002 \u0000\u0000\u0000 ƀ@\u0010\u0000,\u0000\u0000\u0000L\u0000\u0000\u0001\u0000\u0003\u0000\u0000\u0000\u0003\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "Reset Settings": "\u0000k\u0010\u0000 \u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u001f\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000B!ÿø\u0000\u0000\u0001\u0000 \u0000\u0000\u0000 D \u0001\u0001Ć \u0004\u0010\u0002\u0000\u0000\u0000\u0002\u0000\bˆ\u0000@ƒ\u0000B\u0000@\u0000\u0000\u0000@Ćŗ\f\u0000\u0000\" \b@\bư\u0000\u0000\b\u0000Ā€\u000fþ\u0004B\u0001\b\u0001b\u0000\u0000\u0001\u0003ĆÆĆ \b\u0001\u0010@!\u00010Ā€\"\u00008\u0000Ā„\u0001\u0000\"\b\u0004 \u001c \u0012 \u0004ĆĀĀ‚ \u0004\u0000Ā„\u0000ˆ\u0001D\u0000Ā…\u0011 Gà@\u0001\u0000\u0010\u0000!\u0000\u0010\"(\bĀ€\u0014\b\u0000 \u0002\u0000\u0000 \u0002\u0004B\u0001\u0010\u0001\u0006\u0000\b\u0000 \u0000\b\u0000@ĆøĀ R\u0000\u0003\u0000\u0002\u0000\u0003Ć \u0002\u0000\b\u0011\"\u0011ÿ€\u0000\u0000Ā€\u0000\u0000\u0000Ā€\u0001\u0000\u00184\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "Twist Threshold": "\u0000Āŗ\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€\u0000\u0000 \u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010Ā‘\u0004\u0000\b\u00048\u0001\u0000\u0000\u0000\u00048\u0002\u0000\u0000\u0000\u0003\u0000\u0000\u0000\u0000@\u0002\u0016 Ā€\u0004\u0000ò\u0000@\u0000\u0000\u0000ò\u0000Ā€\u0000\u0000\u0000 \u0000\u0000\u0000ˆ\u0000Ā„D \u0002\u0000\u0001\u0000\u0010\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0012\u0000 \t\u0010\u0003\u0000\u0000@\u0004\u0000\u0003\u0000\u0000@\b\u0000\u0000\u0000\u0018\u0000\u0001Ć \u0004Ā€\b\u0002\u0004\u0003@\u0000 \u0001ƀ\u0001Ć \u0000 \u0002\u0000\u0001\u0010\u0001\u0002\u0003ˆ\u0001\"\u0003Ā€\u0002\u0003\b\u0000\b\u0000L\u0000x\u0000\b\u0000\u0001\"\u0000\u0001\u0000\u0002\u0000HĀ€Ā˜\u0000Ā€\u0002\u0000\u0005\u0000\u0010Ā€\f\u0000\u0005\u0000 Ā€(Ā€\u0000Ā€\u0007Ā€\u0012@!\u0000@\u0000Ā€\u0002 \u0004\u0000\u0000\u0000\u0002 \b@\b@\u0000@\u000e@\b\b\u0000 \u0000 \u0003\u0004\u0001\u0000\u0000\u0000\u0003\u0004\u0002 \u0000\u0010\u0000 \u0000\u0010\u0002(\u0002\u0000\u0010\u0000\b\u0003\u0001\u0000@\u0000\u0000\u0003\u0001\u0000°\u0000\b\u00010\u0000\u001c\u0001\f\u0000Ā€\b\u0000\u0002\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u00000\u0000\u0004\u00000\u00008€‚\u0000 \u0000\u0000\u0000Ā€\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0000", + "Reset Settings": "\u0000k\u0010\u0000 \u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u001f\u0000 \u0000Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000B!ÿø\b\u0000\u0001\u0000 \u0000\u0000\u0000 D \u0001\t`\u0004\u0010\u0002\u0000\u0000\u0000\u0002\u0000\bˆ\u0000@ư\u0000B\u0000@\u0000\u0000\u0000@Ćŗ\f\u0000\u0000\b\u0000\b@\bư\u0000\u0000\b\u0000Ā€\u000fþ\u0001\b\u0001\b\u0001b\u0000\u0000\u0001\u0003ĆÆĆ \b\u0000yƀ!\u00010Ā€\"\u00008\u0000Ā„\u0001\u0000\u0018ƀ\u0004 \u001c \u0012 \u0004ĆĀĀ‚ \u00040\u0000Ā„\u0000ˆ\u0001D\u0000Ā…\u0011 GĆ \n\u0000\u0001\u0000\u0010\u0000!\u0000\u0010\"(\bĀ€\u0002@\u0000 \u0002\u0000\u0000 \u0002\u0004B\u0001\u0010\u0000Ā€\u0000\b\u0000 \u0000\b\u0000@ĆøĀ R\u0000\u0010\u0000\u0002\u0000\u0003Ć \u0002\u0000\b\u0011\"\u0011ÿø\u0000Ā€\u0000\u0000\u0000Ā€\u0001\u0000\u00184\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "Twist Threshold": "\u0000N\u000f\u0000 \u0000\u0000\u0000\u0000\u0000Ʒư?Ć @\u0000\u0000Ā€\u0002P@ˆ\u0000\u0001\u0012\u0001\u0000\nA\u0002\"\u0004\u0000\u0004 \u0004Ć )ü\u000fø™À\u0010\u0000\u0014@Ƅ\u0010\"!ĆøĀ€@\u0000Ć”\u0002@ĀˆĀĀ‚\u0001\u0000\rĀ„\t\u0003þ\u0004\b\u0004\u0000\u0004\u0010%\"\u0001@0 \u0010\u00000@”\u0018ÀÀ€@@Ɓ\u0003Q¢Å\u001e\u0001\u0002\u0005\u0004\nD\u0018ˆìŒ\u00020$\u0012!\b\u0002 \u0011ƀ\u0007\u000000Ā…\u0010\u0010Ā€\u0000\u0000\u0000\u0000@\u0002\u00180B\u0000\u0000\u0000\u0000\u0000\u0000\b@\u0002\b\u0000", "Turn Off": "\u0000<\u0010\u0000?Ćø\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0002Ć \u0000\u0000\u0000þ\u0014 \u0000Ā€\u0000\u0004\u0010!D\u0000\u0004\u0001\u000fĀt…ü\u0000@\u000f\u0010\u0010\u0004PB\u0007Ā€\u0001\u001dpEü\u001fƀ\u0000 \u0000\u0001P@\f\u0000\u0002?Ćø\u0015ü\u0001@\u0000B\u0010Ā‚R@$\u0000\u0004?øä \u0004@\u0000Ā‚\u0010Ā‚J€„\u0000\u0010?Ćø)$\u0010@\u0002\u0000\u0010\"Ā¢ \f\u0000@\u0001\u00020Ā \u0000@\u0000\u0000\u000fĆ \u0004\u0000\u0000\u0000\u0000", "Compact Storage": "\u0000¬\u000e\u0000\u0000\u0000\u0000\u0000\u0000`\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0001\u0000\u0002\u0000\u0000Ā€\u0000\u0000\u0002\u0000\u0004\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\tƀ\u0010\u0000\n\u0000CĀ€\u0010\u0000 \u0000\u0000\u00000˜|\u0006\u0000\u0000\u0006\u0000Ƥ\u0001\u0000\u000fƀ\u0003ƈ\u0001\u0000\u0002\u0000\u0000\u0000\u0000Ā…x@\u0010 \"\u0000\bĀ€\u0010\u0000\u0011ƀ\u0001\u0000\u0010\u0000 \u0000\u0000\u0000\u0000@\u0004\u0000Ā‚\u0001\u0010\u0001\b\u0001\u0000\u0002\u0006\u0000\u0010\u0001\u0000\u0002\u0000\u0000\u0000\u0006\u0000\u0000@\u0000@\u0010Ā€\u0011\u0000\u001c\u0000 Ā€\u0002\u0000\u001c\u0000 \u0001\u0003Ć \u0010 \u0004\u0000\u0004\u0002\u0004\u0002\u0010\u00010\u0004\u0010\u0000 \u00010\u0002\u0004\u000fƀ\u0000\u0004\u0000Ā€\u0000Ā€ @B\u0000\u0010Ā€A\u0000\u0005\u0000\u0010Ā€ Ā€\u0000\u0000\u0000Ā€\b\u0000\u0010\u0004\u0002\u0000 \u0001\u0000\b\u0010\u0000ˆ\u0001\u0000\u0002\u0010\u0000\u0000\u0000\u0010\u000fĀ€\u0002\u0000Ā€ \u0004\u0000\u0010\u0000\u000f\u00000@\u0010\u0000\"\u0000\u0000\u0000\u0002\u0007\b\u0004ƀ\u0010\u0002\u0000Ā€\u0001\u0000\u0001\u0018\f\u0004\u0001\u0000\u0002ƀ\u0000\u0000\u0004ƀ\u0000\u00000\u0000\u0000\u0000\u0010\u0000\u0010\u0000\u0011@\u0000\u0000\u0010\u00000\u0000\u0000\u00000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0001\u0000\u0000Ć \u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "Reset to Defaults": "\u0000Ā›\u0010\u0000 \u0000\"\u0000 \u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0004OĀ‚\u001f\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007ñý\u0010B!ÿø\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000 ~\"\u0011\"D \u0001\u0000\u0000\u0001Ć \u0004\u0010\u0002\u0000\u0000\u0000\u0002\u0000Ā„B$@\bˆ\u0000@\u0000\u0000ƒ\u0000B\u0000@\u0000\u0000\u0000@ ˆ|ĆøĆŗ\f\u0000\u0000\f\u0000\" \b@\bư\u0000\u0000\b\u0004\u0011\bĀ‘\u0000Ā€\u000fþ\u0002@\u0004B\u0001\b\u0001b\u0000\u0000\u0001\u0001Ā¢!\u0012#ĆÆĆ \b\u0000Ā„\u0001\u0010@!\u00010Ā€\"\u00008XD>D\u0000Ā„\u0001\u0000 @\"\b\u0004 \u001c \u0012 \u0004Ć’ĀˆĀ„OĀĀĀ‚ \u0000\u0006\u0004\u0000Ā„\u0000ˆ\u0001D\u0000Ā„Q\u0010‰\u0011\u0011 GĆ \u00000@\u0001\u0000\u0010\u0000!\u0000\u0010\bBĀ¢\"(\bĀ€\u0000\u0000\u0014\b\u0000 \u0002\u0000\u0000 \u0002\u0001\b@HDB\u0001\u0010\u0000\u0000\u0001\u0006\u0000\b\u0000 \u0000\b\u0000@\"\bE\bĆøĀ R\u0000\u0000\u0000\u0003\u0000\u0002\u0000\u0003Ć \u0002\u0000\b\u0004Š\u0010E\u0011\"\u0011ÿ€\u0000\u0000\u0000\u0000Ā€\u0000\u0000\u0000Ā€\u0001\u0000Ā Ā„\u0010@\u00184\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "Second": "\u0000:\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000ˆ\u0000\u0002\u0000\u0000\u0000\u0010Ā‘\u0000\u0000@\u0000\u0000\u0002\u0014@\u0000\u0010\u0001Ā€\u0000Ā„\u0011à‡À\u0010 \u0005ˆ\u001f\u0010\u0002\b\b\tĀ„\u0000Ā„\u0000\u0004\u0003Â\u0000!\u0000\u0001\u0000˜\u0011\u0000\u0010Ā€\u0000Ā€!\u0004\u0000\u0004 \u0000@\b\u0001\u0000\u0002\b\u0000 \u0002\u0000 \u0001\u0014\u00010\u0000Ā€\u0007Ć€Āƒ\u00000\u0000 \u0000\u0000\u0000Ā€\u0000\u0000\b\u0000", + "Reset to Defaults": "\u0000Ā‹\u0010\u0000 \u0000\"\u0000 \u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0004OĀ‚\u001f\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007ñý\u0010B!ÿø€\u0000\u0001\u0000 \u0000\u0000\u0000 ~\"\u0011\"D \u0001\b\u0000\u0004\u0010\u0002\u0000\u0000\u0000\u0002\u0000Ā„B$@\bˆ\u0000A\u000f\u0000B\u0000@\u0000\u0000\u0000@ ˆ|ĆøĆŗ\f\u0000\u0000&0\b@\bư\u0000\u0000\b\u0004\u0011\bĀ‘\u0000Ā€\u000fþ\b\b\u0001\b\u0001b\u0000\u0000\u0001\u0001Ā¢!\u0012#ĆÆĆ \b\u0001\u0000\u0000!\u00010Ā€\"\u00008XD>D\u0000Ā„\u0001\u0000 \u0000\u0004 \u001c \u0012 \u0004Ć’ĀˆĀ„OĀĀĀ‚ \u0004\u0000\u0000Ā„\u0000ˆ\u0001D\u0000Ā„Q\u0010‰\u0011\u0011 Gàˆ\u0000\u0001\u0000\u0010\u0000!\u0000\u0010\bBĀ¢\"(\bĀ€\u0015\u0000\u0000 \u0002\u0000\u0000 \u0002\u0001\b@HDB\u0001\u0010\u0001\u001fĀ€\b\u0000 \u0000\b\u0000@\"\bE\bĆøĀ R\u0000 \u0000\u0002\u0000\u0003Ć \u0002\u0000\b\u0004Š\u0010E\u0011\"\u0011ÿ„\u0000\u0000Ā€\u0000\u0000\u0000Ā€\u0001\u0000Ā Ā„\u0010@\u00184\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "Second": "\u0000\u000f\u0010\u0000\b 8CÀ€…A\n_Ā”DH˜:$ĀØIP¤€A\u0001\u0002\u0004\u00040\tĀ€", "Compacting...\nTakes approx\n1 minute": "\u0000Ā\u0011\u0000\u0000\u0000\u0000\u0000\u0000`\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004€€\u0001\u0000\u0004\u0000\u0002\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000$\u0002p\u0004\u0000\u0010\u0000\b\u0000Cƀ\u0000\u0000\u0000\u0001\u000f€À\u0000\u0000ƀ\u001cĀ€ \u0000‡€@\u0001Ƥ\u0000\u0000\u0000\u0000\u0007Ā„\u0001\u0002\u0002 \u0000ˆ\u0001\u0000\u0004Ɔ\u0002\u0000\u0000@\u0000\u0000\u0000\u0000\u0000 \u0004\u0010\bĀ€\b@\b\u0000@@\u0010\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000B\u0000D\u0000p\u0002\u0000\u0000Ā€\u0000 \u0000\u0000\u0000\u0000\u0000\b\u0000\b\u0004\b\u0004 \u0002`\u0010\u0000\u0004\u0000\u0001\u0000\u0000\u0000\u0000\u0006\u0000Ā€\u0000Ā€ @B\u0000\u0010€€\u0000 \u0000\b\u0000\u0000\u0000\u0000H\u0004\u0000\b\u0002\u0001\u0000\u0010\u0000Ā€\u0004@\u0001\u0001\u0000@\u0000\u0000\u0000\u0002CĆ \u0000Ā€ \b\u0001\u0000\u0004\u0000*\u0000\b\u0010\u0002\u0000\u0000\u0000\u0000\fĆ”\u0000˜\u0002\u0000@\u0010\u0000 \u0000ĀĆ€#\u0000\b\u0000ƀƀƀ\u0000\u0000\u0003\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0004\u0000\u0000Ć \u00008\u0006\u0006\u0006\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\b\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0000\u0000\u0010\u0000\u0000\b \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u001cqÿð\u0000óàA\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", "Date": "\u0000\u001c\u0010\u0000\u0000\u0000@ĀĆø\u0004\b€€@ˆ\b\b\b€€¿ø\b\u0018\bĀ€ĀĀ€ĀĆø(\bĀ€Ā„ĀˆĀˆ\b\bHĀ€Ā€Ā„Āˆ\b\b\bĀ€Ā€Ā€Āˆ\b\b\bĆæĀ€Ā‚Āˆ\b\b\u0010", "Minute": "\u0000\u000f\u0010\u0000\u0000@\bĀ€\u0010Ā€A\u0001\u0001\u0004\u0001\u0010\u0001OƱ\u0004 \b@\u0010Ā€A\u0000Ā‚\u0002\u0004\bP @", - "Connectable": "\u0000?\u0010\u0000\u0010Ā€\u0010 \u0000\u0000\u0010@ Ā€ @ÿüHˆOĆ°ĀĆø\u0000A\t Ā€\u0001A\u0000\u0000Ā‡Ć»ĀĆĀ„ĀŸĆĆ±\u0000\u0014\u0002\u0012\u001e\u0000\u0002\"\u0000\bEÿ„ÿ„D\u001fˆ \u0011\u0001\bˆ!\u001f\u0018@L\u0004\u0011\u0010B\u0000oýñ \" ü‹B \"@|A\t ˆ@\u0004Ā€ĀˆĀ‚\u0013\t\n‰\u0000\u0001\u0007Ƥ\u0002\f\u0015\"@\u0002\bHTf DĀ€\u0014\u0012“\u0002\u0001\u0007\u0000\u0010\"\u001f", - "Stay Connectable": "\u0000~\r\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€0\u0001à€\u0000\u0000\u0001Ć \u0000\u0000\u0000\u0000\u0000Ā€\u0002\u0000@\bB\u0000\u0000\u0000\b@\u0000\u0000\u0000\u0000\u0002\u0000\b\u0001\u0000!\b\u001e!\u0000!\u001e..\u001e\u001e\b\u001e.\u0004\u001e€ø„„\u0000€„ÄĄ„ø„Ä\u0010…€€\u0012\u0010\u0002\u0002\u0012\u0012\u0012\u0012\u0000Ā€\u0012\u0010B\u0011Ā‚\u0007ƈ@\b\bHHOƈ\u0002\u0007ƈA\u000fƁ\b!!\u0000 !!! \b!!\u0004 Ā„ Ā„L\u0000„„„„€€ „„\u0010Ā‚\u0010Ā‚0Ɛ\u0002\u0012\u0012\u0012\u0012\u0012\u0010Ā‚3\u0010B\u0017‡@@\u0007Ā‡ĀˆHG‡‡K‡Ç€\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000x\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "Connectable": "\u0000?\u0010\u0000\u0010 \u0001\u0000\u0000\u0000\u0010@ @\u0002\u0000ÿüHˆA@Ā„ \u0000A\t Ā„A\b@\u0000Ā‡Ć»ĀĆB\u0010ñ\u0000\u0014\u0002_D!\u0002\"\u0000\bL\b\u000fþ\u0004D\u001fœ\u0010\u0000Ā„\bˆ!\u001fUü\u0001\u0000\u0011\u0010B\u0000ĀŖH\u0002\u0000\" üŠDĀ‘\u0004\u0010|A\t ĀĆ¢\b ĀˆĀ‚\u0013\u0005\u0004\u0010@\u0001\u0007Ƥ\u0002\u0011\b Ā€\u0002\bHDA\u001fĆæ\u0000\u0014\u0012‰\u0001\u0000\u0002\u0000\u0010\"\u001f", + "Stay Connectable": "\u0000w\u0010\u0000\u0010 \u0001\u0000\u0000\u0000\u0010@\u0000\u0000\u0000\u0000\u0000\u0000\u0000 @\u0002\u0000ÿüHˆ\u0000\u0000\u0002\u0000\u0002\u0000\u0000A@Ā„ \u0000A\t \u0000\u0000\u0002\u0000\u0002\u0000\u0000Ā„A\b@\u0000‡û€\u001e\u0000‡€‡€\u000fƐB\u0010ñ\u0000\u0014\u0000ƒ\u0000Ćø\u0000Ćø\u0003Ƃ_D!\u0002\"\u0000\bB\"\u0000\u0010\u0000\u0010\bL\b\u000fþ\u0004D\u001f„B\u00048\u00048\u0010œ\u0010\u0000Ā„\bˆ!\u001f\u0011\u0004\u0007ƀ\u0007ƀ\u0001Uü\u0001\u0000\u0011\u0010B\u0000\"\b\u0000Ā€\u0000Ā€\u0004ĀŖH\u0002\u0000\" üˆH\u0010\u0001\u0000\u0001\u0000\u0012DĀ‘\u0004\u0010|A\t @>\u0000>\u0000 ĀĆ¢\b ĀˆĀ‚\u0013@€‡\u0000‡\u0000\u0001\u0005\u0004\u0010@\u0001\u0007Ƥ\u0001\u0006\u0001\t\u0001\t\u0000Ā‚\u0011\b Ā€\u0002\bH@0\u0001Ć \u0001Ć \u0001\u0004A\u001fĆæ\u0000\u0014\u0012€\u0000\u0000\u0000\u0000\u0000\u0000\t\u0001\u0000\u0002\u0000\u0010\"\u001f\u0000\u0000\u0000\u0000\u0000\u0000\u0000", "Hour": "\u0000\u001c\u0010\u0000\u0000@\u0000\u0000\u0004\u000fŸø@‰\u0018ĀæĀĀŸĀˆ@‰\u0018Ā„\u000fĀŸĀĆ¼Ā€\u001f\tùˆ\u0010ĀĀ˜ĀæĆ‰Ć¹Āˆ\u0010ĀĀ˜Ā‘\tùø˜\b\u0001\u0000PĀ€P\u0002\b\u0002", - "No Clocks Found": "\u0000n\u000b\u0000\u0000\u0000\u0000\u00000\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0000\u0006\u0010\u0000\u0001Ć @\u0000\u0002\u0000\u0003ư\u0000\u0000\u0000\u001c@\u0000\bA\u0000\u0000\b\u0000\b\u0000\u0000\u0000\u0000q\u001e\u0000!\u0004\u001e\u001e\"\u0000 \u001e!.\u001d¤„\u0000Ā€\u0010„„\u0000Ā€Ā„Ā„Ć„ĀŽĀ’\u0010\u0002\u0000B\u0012\u0002Ā€\u0003Ć¢\u0012\u0012\u0012\u0019H@\b\u0001\bH\f\u0000\b\bHHHe!\u0000 \u0004! (\u0000 !!!!ĀŒĀ„\u0000Ā„\u0010„€\u0000€„„„†2\u0010\u0002\u0010B\u0012\u0012 \u0002\u0002\u00122\u00128GĀ€\u0007Ā‡Ć‡Ā‡Āˆ@\b\u0007‡HG@", + "No Clocks Found": "\u0000œ\u0010\u0000\u0000@@@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0002\u0004\u0000\u0001\u0003þ\u0000\u0000\u0000\u0000\u0002\u0000\u0000 \u0000\u0000\u0000@Ćø@ @\u0010H \u0000\u0000\u0010\u0000\u0013\u0000\u0001\u0000\u0001\u0000\u0002\bĀæĀŸĆ„\u0000Ā‚\u0002\u0002\u0000\u0000\u0000Ā€\u0001H\u0002\u001e\u0002\b\u0000 ˆ@\u0000@\bĀ€?Ć \u0007ƀ\bƀ\u0018@\u001f\u0000\u0010Ā€\u0004\bĀ„\u000fĀ„\bƤ\u0002\u0002\tĀ‚\bĆ¢\u0001Ā„\u0000\u0010\u0001\u000f\u0000@ĀĆ¼\u0007üy `\u0010y\u0010\u0010@!À—€\b\u000f\u000fĀ„\u0001\u0011\u0003þ\u0000\u0001\u0001\u0013\u0001\u0004\u0001ư\u0007ˆ\u0000Ā€Āˆ\u0010\u0000@\u00110 \u0000\u0010\u0011\u0000\u0010@\u0001\u0000\u0010Ā€\u001e\bĀæĆĀ„\u0001\u0010\u0002\u0002\u0000\u0001\u0001\u0010\u0001\u0004\u0000\u0010\u0001\b\u0001\u0010ˆ\u0010ˆ@!\u0000?Ć \u0000 !\u0000\u0000Ā€\u001f\u0000\u0011Ā€!\bĀ‘\bĀ„\u0002 \u0000ˆ\u0000\f\u0002 \u0000\b\u0002\u001c\u0001\b\u0002\u0011øˆ@J\u0000\bĀ€\u0007\u0000J\u0000\u0001\u0000! \b\u0000A(\u000fĀ„\u0004@\u0001\b@\u0000\u0004@\u0000 \u0001Ć \u0000|\u0004\f\u0000Pˆ@\u0000\u0000`Ā„\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0004\u0000\u0000\u0018\u0007ƀ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", "App Settings": "\u0000]\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€\u0000\b\u0000\u0000\u0000\u0003\u0000\u0000\u0000\u0000\u0002\u001f\u0000 \u0000\u0000\u0000$\u0000@\u0000\u0000\u0010ˆĆæ\u000f\u001f A\u0000\u001e\u0007Ć“B\u0000\u0017Ā„\u0007\u0016\u0001\b\u0003H\u0000\" \u0001\u0000@\u0000Ā€\b@\" Ćŗ\f\u0000\u0000$\u0000\b\u0000B\u0001\u0010Ā€ \u0003ÿ€À\u0000@\u0002\u0010\u0011\u0004>þ\u0000Ā€\u0004\u0000\u0004\u0000\u0010Ā€Āˆ \u0002\u0010\u0004\u0000 \u0000 \u0000Ā„\u0004\u000f‚ \u0001\u0000\u0002\u0000\u0000@$\u0010DH\u0011Ćø\u0010\u0000 \u0000\u0002\u0001@Ā‚\"Ā€Āˆ\u0000Ā€\u0002\u0000\u0000 \u0004\u0018\u0011\b\u0004@\b\u0000 \u0000\u0002\u0000\u0003\u0000ĆøĀ R\u0000Ā€\u0000\u0000\u0000 \u0000\u0000\u0004H„à\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001ƒ@\u0000", - "Flattening battery - this can take hours.\nLong-press button to cancel": "\u0000½\u0012\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0011\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000ˆ\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0004B\u0000\u0000\u0000\u0000\u0000GĀ€ Ā€\u0000\u0000\u000f\u0000CƀG\u0000\u0000\u0000\u0010\u0000B \u0000\u0000\u0002Ā€\u0000\u0001ƀ\u0000Ā„\u0000\u0000\u0001¤\u0001Ć¢\u0001ƀ\u0000\u0000\u0000Ā€\u0002\u0012\u0000\u0000\b\u0000\u0000\u0000\u0000\u0004 \u0000\u0000\u0011\u0010\u0000\u0010\u0000p\u0000\u0000\u0004\u00000Ā \u0000\u0000\"\u0000\u0000\u0000\u0003ƀ!\u0000\u0000\u0000ˆ@\u0001\u0001\u001cĀ€\u0000\u0000 \u0001†\u0000\u0000\u0001\b\u0001\u0010\bĆ \u0001\b\u0010>\bĀ‚\u0000\b\u0007\u0004\u0001\u0010\u0001ƀ\u0014 \u0000\u0000\u0010 $@9\u0000\b@~\u0000D\u0010\u0000Ā€\u0000 $@\t#\u0000\u0000\u0000\u0000Ā¢\u0000\b\u0000B\u0000\u0000\u0002@Ā€\u0004\u0000\u0002\u0000Ā¢\u0000B\u0001(\u0000\u0003ƈ\u0004\u0004 \u0000Ā€\u0000 \u0000\u0000\u0012\b\u0000@\u0000\u0010\u0004 \u0002\u0000\n@\u0000\u0000Ā€ \u0001\u0000\u0004\u0000\u0001\u0000\u0000\u0000Ā @\u0004\u0000\u0001\u0000\u0001\u0000\u0010\u0000B\b\u0000\b\u0001\u0000\u0010\u0000@\u0000\u0010\u0000\u0000\u0002\f\u0000@\u0000\u0010\u0000\u0010\u0000Ā€\u0002\u0010@\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0001\u0000\u0000\u0000\u0001Ā€\u0004\u0000\u0003\u0000\u0001\u0000\u0004\u0000\u0010Ā‚\u0000\u0000\u0000\u0000\u0010\u0000@\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000`\u0000\u0010\u0000 \u0000ƒð\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0000\u0000ÿ\u001fƀ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "Flattening battery - this can take hours.\nLong-press button to cancel": "\u0000½\u0011\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0000ÿø\u0004\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000 \u0000\u0010\u0000\u0010\u0002\u0000\u0000\b\u0000Œ\u0000\u0000\u0000\u0012\u0000\u0000\bư\u0004\u0010\u0000\u0000\t`\u0000Ā€\u0000Ć \b\u0000 |\u0003Ā \u0000\u0000\u0000P\u0000\u00008\u0000\u0010Ā€\u0000\u0000<\u0000D@\u0018\u0000CÀþ\u0000\u0002\u0000\u0000\u0001\u0012\u0000\u0000\u0000\u0000\u0000Ā„\u0000\u0000\u0000Ā€\u0001\"\u0001\u0000\u0002c\u0000\u0010\u0000 \u0000\u0000\u0004@\u0000\u0000\u0000x\u0004 \u0000\u0000\u0004 \t \b\u0000 \u0003Ā€\u0002\u0000\u0000\u0000!\u0000\"\u0001\u001c\u0000!\u0002\u0007ƀyƀ\b\u0000@\u0001\u0000\u0000&\u0000>\u0000\u0000\u0002\u0004\u0004ˆ\u0007 \u0001\b\u000fƀ\u00060?ÿ‚x\b\u0000\u0001\u0010\u0003\b\u0000\u0000\u0010 \u0014@\u0001\u0000\b@\u0000\u0000C\u0000\u0002\u0000\u001c @\u0000\u0007Ā€ \u0000y\u0000€„\u0000\u0010\u0000\u0004\u0000\u0000\u0000(\u0000\u0010\u0000\u0002 \u0000\u0004\u0002\u0001\u0000\u0000\u0010\u0004\u0000 \u0000Ā€\u0000 \u0000\u0000\u0002@\u0000Ā€\u0004\b\u0015\u0000\u0000@\u0001ƈ\u0000\u0001\u0000 \u0002\u0000\b\u0000\u0002\u0000\u0000\u0000 \u0000\u0004\u0000\u0000Ā€GĆ \u0002\u0000\u0011Ā€\u0000\u0000\u0000\u0000 \u0000Ā€\u0000 \u0000\u0000\u0001\u0000\u0000 \u0000\u0018\u0002\u0000\u0000 \u0000ˆ\u0000\u0000\u0000\u0000\u0002\u0000\b\u0000\u0002\u0000\u0000\u0000\u0007Ć \u0001\u0000\u0003\u0000\u0010\u0000\u0002\u0000\u0003Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u001fư#Ćø\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", "Month": "\u0000\f\u0010\u0000\u001fƱ\u0001\u0010\u0011\u0001\u0010\u0011Ćæ\u0010\u0011\u0001\u0010\u0011Ćæ\u0010\u0011\u0001 \u0012\u0001@X\u0002", "OFF": "\u0000\u0016\n\u0000xüþ\u0012\u0002\bH\b! „øú\u0012\u0002\bH\b! „€â\u0002\u0000", "Right": "\u0000\u000f\u0010\u0000\u0002\u0000\u0004\u0000\b\u0007ÿð@\u0000Ā€\u0002\u0000\u0004\u0000\u001fĆøP\u0011 $@@€\u0001\u0003þ\u0004\u0004", "Widgets": "\u0000Y\r\u0000\b\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0000 \u0002\u0000\u0000\u0000\u0018H\u0000\u0000\u0000\u0000\b\u0001\u0000\u0000\u0000\u0002\u0014\u0000\u0000\u0000\u0000\u0004\u0000Ćø\u0000\u0010\u0000\b\u0000\u0000\u0000\u0000\u0002\u000fĀ„\u0000\u0010\u0006\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0002\u0000\u0010\u0000\u0000\u001c\u0000ˆ\u0000Ć”\u0002\u00008\u0000\u0001\u0000ư\u0001\"\u0000LA\u0000Ƥ\u0000\u0001\u0000\b\u0000Q\u0000!!\u0000\u0002\u0000\u0001\u0000\u0004\u0000!\u0000\u0010\u0000Ā€\u0001\u0000\u0001\u0000\u0002\u0000\u0000Ā€\b\u0000Ā€\u0000Ā€\u0013\u0000\u0001Ć \u0000Ā€\u0004\u0000Ā€\u0000@\u0006\u0000\u000f\b\u0000Ā€\u0002\u0000Ā€\u0000 \u0000\u0000\u0000\u0000\u0000Ā€\u0001\u0000", "Left": "\u0000\u000f\u000f\u0000\u0002\u0000\u0004\u0000\b\u0007ÿð@\u0000Ā€\u0001\u0000\u0004\u0000\u000fĆø!\u0000B\u0001\u0004\u0004\b\u0010\u0010\u000fÿ€", - "Sort Order": "\u0000=\u0010\u0000\u0010\u0010\u0000\u0000\b \u0000\u0000A\u0000\u0000@A\u0000 \u0001\u0010\u0000\u0011\u001fĀæ\u0000àÿø\bĀ \u0010@\u0000\u0000D\u0003Ć‚ĀĆÆĆ \u0000\u0002 \u0004\u0010\n(\bĆ \u0011\u0000 Ć€ĀŠ :\bĀˆĀ‚\u0005\b ƀ $D\u0010 Ÿð\u0002\u0000Ā¢@\u0000€€ \u0005\u0014\u0004\u0010\u0004\u0004\u0003Ā€\bĀ€ Ā€?Ć \"\u0000D\u0000ˆ\u0001\u0001\u0002\u0010\u0002 \u0003Ā€\b\b\u0010ÿø\u0000\u0000ƀ\u0000\u0000\u0000\u0000\u0000\u0002\u0002\u0000\u0000", + "Sort Order": "\u0000O\u0010\u0000\u0010\u0010\u0000\u0000\b \u0000\u0000\u0004\u0000\u0010@\u0000\u0000\u0010@\b\u0000‹ü\u0011\u0000\u0000\u0001ƻư\u000e\u0001Pƒÿà\u0000Ā€A\u0000\u0000\u0002Ā¢\u0000D\u0000\u0004ĀĆÆĆ \u0000\u0005_Ć€Āˆ\u0000Ƅ\u0002Š\u00028\n \u0010\u0002@\bĀ¢\u0003Ā \u0015A\"\"\b@ ƒ\u0000Ā€*þ$D @Ÿð\u0002\u0000U\u0004(\u0000` \b\u0000«øQ@\u00000@@8\u0001T\u0010\"\u0000\u0000\u0000ĆæĀ€Āˆ\u0002ĀØ D\u0000\u0000\u0001\u0001\u0002\u0010\u0005_Ć€Āˆ\u0000\u0000\u0002\u0002\u0004\u001f\nĀ‘?ÿ€\u0000\u0007ü\u0000\u0000!A\u0000\u0000\u0000\u0000\b\b\u0000\u0000\u0003\u0001", "Side": "\u0000*\u000e\u0000\u0000\u0000\u0000\u0000\u0000€€\u0000 \u0010Ā’\u0010\u0000\b\u0002\u0014D\u0000\u0004\u0000Ā„\u0011\u0000\u0002\u0000 $Ćø\u0003\u0000\b\u0007Ɛ\u0003@\u0003Ā€D\u0003\b\u0000˜\u0011\u0000\u0002\u0000!\u0004@\u0000Ā€\b\u0000 \u0000 \u0002\u0000\b\u0000\b\u0000Ā€\u0004\u0000\u0002\u0000 \u0002\u0000\u0000Ā€\b\u0000", - "No app has settings": "\u0000{\u0010\u0000 \u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u001f\u0000 \u0000\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0000\u0003\u0000\u0000B!ÿø\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0001D \u0001\u0001Ć \u0001@\u0000\u0000\u0010Ćø\u0011ò\u0004\u0010\bˆ\u0000@ƒ\u0003ư\u0004\u0000\u0001Ć”\u0001Ć…Ā€BĆŗ\f\u0000\u0000\" \bĆ @ƀ\u0000@\u0000Ā€\b@Ā€\u000fþ\u0004B\u0002\u0006\b\u0004\u0000\u0000 \u0001\u000bĆÆĆ \b\u0001\u0010@A\u0001\u0000@\f\u0000\u0004\u0000!\u0000Ā„\u0001\u0000\"\b\u0010@\"\b\u0001\u0000\u0001\u0000\u0004/‚ \u0004\u0002\b\u0004ƒ\u0000 \u0000 \u0000Ā…\u0011 Gà@\u0000P \u0004\u0000\b\u0000\u0001\"(\bĀ€\u0014\b\u0001Ć \f\u0000\u0001\u0000\u0002\u0000\u0000$B\u0001\u0010\u0001\u0006\u0000F\u0000Ā€\u0000 \u0000Ā€\u0000\bĆøĀ R\u0000\u0003\u0000\bĀ \u0000\u0000\b\u0000 \u0000\u0002\u0011\"\u0011ÿ€\u0000\u0000Ć \u0000\u0000\u0002\u0000\u0000\u0000\u0000Ā€\u00184\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", - "Sleep Phase Alarm": "\u0000Ā»\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000`\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0012\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0012\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u000e\u0000Ā‚\u0000\u0000\u0002>A\u000f\u0000\u0000\u0000\u0000\u0002\u001dB\u001f\u0001\u001c\u0000\u0000\u0000\u0010\u001e@\b@\u0000\u00008°\u001e \u0000\u0000\u0000\u0000<Ā < \u001c\u0000\u0000\u0000\u0002\u0000\u0010\u0001\b\u0000\u0000\u0000\u0010\u0000\u0004\u0000\u0000\u0000\u0000\u0000 \u0000\b\u0000\u001c\u0000\u0000\u0000@\u0002\u0000!\u0000\u0000\u0000\u0004\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0012\u0001\u001cĀ€\u0000\u0000\u0010\u0000Ā€\u0004 @Ćø\u0000Ā€\u0000 \u0000Ć @Ćø\u0001\u0000\u0001Ā€\u001c\u0010@Ćø\u0002\u0000\u0010\u0000Ā„\u0007Ć \u0000 \u0000\b\u0001Ć \u0007Ć \u0000 \u0000 \u0000\u0002\u0007Ć \u0000H\u0005\u0000\u0010Ā€\u0000\u0000\u0004\u0000\u0001\u0000\u0004\u0000\u0000\u0000\n\u0000\u0004\u0000\u0000Ā€\u0000\u0000\u0010\u0010\u0000 \u0000\u0000\u0001\u0000\u0000@\u0000Ā€\u0000\u0000\u0002 \u0000Ā€\u0000\u0010\u0000\u0000\u0002\u0018Ɓ\u0000\u0004\u0000\u0000\u0000@\u0000\u0010\u0000\u0010\u0000\u0000\u0001Ā‚\u0000 \u0000\u0004\u0000\u0000\u0002ψ \u0001\u0000\u0000\u0000\u0010\u0000\u0004\u0000\u0003ƀ\u0000\u0000ƀ@\u0004\u0000\u0001\u0000\u0000\u0000<\u0010\u0000\u0000@\u0000\u0000\u0004\u0000\u0001\u0000\u0007Ā„\u0000\u0000\u0000\u0000\u0001\u0000\u0000ƀ\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@\u0000`\u0000\u0000\u0000\u0000\u0000", + "No app has settings": "\u0000{\u0010\u0000 \u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u001f\u0000 \u0000\u0001\u0000Ā€\u0000\u0000\u0000\u0000\u0000\u0003\u0000\u0000B!ÿø \b\u0000\u0000\u0000\u0000\u0000\u0000\u0001D \u0001\u0002\b\u0001@\u0000\u0000\u0010Ćø\u0011ò\u0004\u0010\bˆ\u0000@D\u0003ư\u0004\u0000\u0001Ć”\u0001Ć…Ā€BĆŗ\f\u0000\u0000ĀŽ@\bĆ @ƀ\u0000@\u0000Ā€\b@Ā€\u000fþ\u000f$\u0002\u0006\b\u0004\u0000\u0000 \u0001\u000bĆÆĆ \b\u0000D@A\u0001\u0000@\f\u0000\u0004\u0000!\u0000Ā„\u0001\u0000\b˜\u0010@\"\b\u0001\u0000\u0001\u0000\u0004/‚ \u0001\u0010\u0002\b\u0004ƒ\u0000 \u0000 \u0000Ā…\u0011 GĆ B\u0000\u0000P \u0004\u0000\b\u0000\u0001\"(\bĀ€\bĀ€\u0001Ć \f\u0000\u0001\u0000\u0002\u0000\u0000$B\u0001\u0010\u0002P\u0000F\u0000Ā€\u0000 \u0000Ā€\u0000\bĆøĀ R\u0000D\u0000\bĀ \u0000\u0000\b\u0000 \u0000\u0002\u0011\"\u0011ÿ€\u0000\u0000Ć \u0000\u0000\u0002\u0000\u0000\u0000\u0000Ā€\u00184\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", + "Sleep Phase Alarm": "\u0000Ā»\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000`\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0012\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0012\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u000e\u0000Ā‚\u0000\u0000\u0002>A\u000f\u0000\u0000\u0000\u0002\u0002\u001dB\u001f\u0001\u001c\u0000\u0000\u0000\u0010\u001e@\b@\u0000\u00008°\u001e \u0000\u0000\u0000Ā€<Ā < \u001c\u0000\u0000\u0000\u0002\u0000\u0010\u0001\b\u0000\u0000\u0000\u0010\u0000\u0004\u0000\u0000\u0000 \u0000 \u0000\b\u0000\u001c\u0000\u0000\u0000@\u0002\u0000!\u0000\u0000\u0000\u0004\u0000\u0001\u0000\u0000\u0000\u0018\u0000\u0004\u0000\u0012\u0001\u001cĀ€\u0000\u0000\u0010\u0000Ā€\u0004 @Ćø\u0000Ā€\u0000 \u0000Ć \r\u0000\u0001\u0000\u0001Ā€\u001c\u0010@Ćø\u0002\u0000\u0010\u0000Ā„\u0007Ć \u0000 \u0000\b\u0001Ć \u0006\u0010\u0000 \u0000 \u0000\u0002\u0007Ć \u0000H\u0005\u0000\u0010Ā€\u0000\u0000\u0004\u0000\u0001\u0000\u0004\u0000\u0002\u0000\n\u0000\u0004\u0000\u0000Ā€\u0000\u0000\u0010\u0010\u0000 \u0000\u0000\u0001\u0000\u0000@\u0000Ā€\u0000@\u0002 \u0000Ā€\u0000\u0010\u0000\u0000\u0002\u0018Ɓ\u0000\u0004\u0000\u0000\u0000@\u0000\u0010\u0000\u0010\u0000\b\u0001Ā‚\u0000 \u0000\u0004\u0000\u0000\u0002ψ \u0001\u0000\u0000\u0000\u0010\u0000\u0004\u0000\u0003ƀ\u0001\u0000ƀ@\u0004\u0000\u0001\u0000\u0000\u0000<\u0010\u0000\u0000@\u0000\u0000\u0004\u0000\u0001\u0000\u0007Ā„\u0000 \u0000\u0000\u0001\u0000\u0000ƀ\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000@\u0000`\u0000\u0000\u0000\u0000\u0000", "Invalid settings": "\u0000O\u0010\u0000\u0010\u0000\u0010 \u0000\u0000 \u0000\u0002\u0000 \u0000\u0010@\b\u0000!ư\u0002\u0000ư\u0000Ā€\b\u0000B!ÿùU\u0007ù\u0000\u0014\u0007Ć“B\u0000\u0014ĀŖ\u0000\u000fƃư\u0000\bˆ\u0000AT\u0004Ā„Ā€ĀŽ\u000f À\u0000\u001fĆæ\u0010‰\u0002\u0006\u0000Ā€\u000fþ\u0005P@Ā’\u0004\u0010>þ\u0000Ā€\nĀ $$\u0010@\u0000Ā„\u0001\u0000\u0015@(H €ù\b\"\u0001ÿ𠐁\u0001\u0011 GĆ \u0000\u0000Ā¢ \u001e\u0002\"Ā€Āˆ\u0002HĀ‚$@F\u0004B\u0001\u0010\u0004HˆPĀ€ĀŠ\u000fŠ\u0005 \u0010Ā‘ J\u0000Ć \u0011\"\u0011ÿÀ\u0002\u0001\b\u0000\u0000\u0001ƒ@\u0000", - "TIMER": "\u0000&\n\u0000þ|„üø@B\u0012\u0002\u0011\u0001\fƈ\bD\u00043 !\u0010\u0010“øø@Bƒ\u0002A\u0001\bH\bĀ„\u0004! \"\u0010\u0010„€„Aò\u0013ò\u0010", + "TIMER": "\u0000;\r\u0000\b\u0000\u0000Ā€\u0000\u0000\u0000\u0000Ā€\u0000\u0010\u0000\u0000\u0000\u0000\u001f\u0000\u0004\u0002\u000f\u0000\u0000\u0004 \u0001\u0000>\u0010\u0000\u0000ˆ\u0000ƀ\u0000\u0004\u0000\u0000)\u0000h\u0000\u0001\u0002\u0007ƈƀ0Ā€\u0000@?\u0002\b\u0000\u0010\u0001\u0000\u0000\u0002\u0000\u0002\u0000\f\u0000\u0000\u0000Ā€\u0000@\u0000@\u0000\u0000 \u0000\b\u0000\u0004\u0000\u0000\u0018\u0000\u0001\u0000\u0000\u0000\u0000\f\u0000\u0000 \u0000\u0000\u0000\u0000", "Reset All": "\u0000z\u000e\u0000\u0002\u0000\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@\u0000\u0000\u0000\u001c\u0001\u0000\u0000 \u0004\u0000\u0000\u0000\u0004\b\u001f\u0000\u0002\bx\u0002X\u0001\u0004\u0000Ā€\u0000\u0000\u0000ü\u0000\u0002AƤ\u0000x\u0000!\u0000 \u0000\u0000\u0000 \u0001\u0000\f@\u0002\u0000\b\u0000\b@\bư\u0000\u0000\b\u0001ƀ\u0004Ā€\u0000Ā€\u0002\u0010\u0002\u0010\u0002Ƅ\u0000\u0000\u0002\u0000˜\u0002\u0010\u0000@\u0001Ƨ\u0000Ā„\u0004Ƃ\u0000ˆ\u0000Ć \"\u0001\u0002\u0000\u0010\u0000Ɔ\u0000!\u0000Ć”\u0000Ā‘\u0000&\u0007Ā€\u0000`\u0004\u0000C\u0000\b@\bĀ€\u0014@\b@ \u0000\u0006\u0001\u0000\u0001@\u0000 \u0002\u0000\u0004 \u0002\u0000\u0010\u0000\u0000\u0000@\u0000\u0000\b\u0000Ā€\u0000\b\u0000Ā€\u0004\u0000\u0000\u0000\b\u0000@\u0000\u0004\u0000\u0010\u0000\u0004\u0000 \u0002\u0000\u0000\u0000\u0001ƀ\u0010\u0000\u0002\u0000\u0003Ć \u0002\u0000\b\u0001\u0000\u0000\u0000\u0000\u0000\u0003ư\u0001\u0000\u0000\u0000\u0001\u0000\u0002\u0000", "This will remove everything": "\u0000Ɔ\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0000@\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\u0000Ā€\u0001\u0000\u0002\u0000\u0000\u0010\u0000˜\u0000\u0000\u0000\b\u0000\u0000\u0000\u0003Ā€\u0000\u0000\u0010\u0000\u0000\u0000ø\u0002\u0000\u0004\u0000\u0000@\u0002\u0000\u0000\u0010>\u0000\u0004\u0010ư\u0000ư\u0004@\u0000ư\u0001\u0000Ā€\tƀ\u0010ư\u00010\f \u0000\u0000?Ā€\u0000H<Ā€\r \u000e\u0000\r \u0004\u0004\u0000(Ā€L`\u0007\u00000Ā€\u0000\u0000\u0002\u0000\u0018Ā€\u0004\u0000D@\u000e\u0000DA\u001c\u0000\u0001Ƃ\u0002\u0002\u0000\u0010\u0000Ā‚\u0000\u0000\u00008\u0000\u0000\u0010\u0001\u0010 \u0001\u0010ĀƒĆ€\u0000\u001b\b\b\u0000\u0000@\u0002\b\u0004\u0000\u00010\u0004 \u0000Ā€\bĀ‚\t\b\bĀ‚\u0002\u0000\u0000\b \u0000\u0001\u0000\b \f\u0000\u0004@ @\u0002\u0000\"\b\u001c \"\b\b\u0000\u0000`€€\u0000\u0004\u0000 Ā€\u0018\u0000\u000f\u0000\u0000ƀ\b\u0000 \u001c@ \"\u0000\u0001Ā‚\u0002 \u0001Ćø\u0000\u0004\u0000 \u0000\u0004\u0000\u0000ƀ \u0002A\u0000A\u0002A\u0001\b\u0000\n\b\nĀ€\bX\u0000\u0010\u0000\u0000\u0000 \u0000\u0000\u0000Ā€\n\u0004\u0001\u0004\n\u0004\u0004P\u0010H$\u0011Ćø!\u0010\u0000Ā€\u0000\u0000\u0000Ā€\u0000\u0000\u0001\u0000\u0010`\u0004\u0010\u0010`%?Ā€``@\u0000x\u0000\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0003Ā€\u0006\u0000\bĀ€\u0006\u0000ˆ\u0000\u0000Ā€\u0001\u0000\u0000\u0000\u0000 \u0000\u0000\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u001c\u0000\u0000\u0000\u0000", "Alarm": "\u0000;\r\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0010Ćø\bĆ \u0000\u0000\u0000Ô\u0000Ć \u0000\u0000\u0000\u0010\u0000@\u0000Ć \u0000\u0000\u0002\u0000\bƤ\u0000\u0000\u0000Ā€\f\u0000Ć Ā‚\u0007ƀ\u0010\u0001\u0000\u0000\u0010?\u0000\u0002@ \u0000\u0004\u0000\u0000\u0000Ā„\u0004\u0000\u0000Ā€\u0000\u0000\u0010Ɓ\u0000\u0000 \u0000\u0000\u0014Ƥ \u0000\b\u0000\u0000\u0001àˆ\u0000\u0006\u0000\u0000\u0000\u0000\u0002\u0000\u0003\u0000\u0000\u0000\u0000\u0000", - "on": "\u0000\r\f\u0000\u0000t<\u001eD\u0004\"\u0002\u0000\u0010\u0000Ā€\u0004\u0000 \u0000Ā€\u0003Ā€", + "on": "\u0000\u000e\b\u0000xĀŗ\u0013\u0018Ha!„†\u0012\u0018H^!", "Minutes": "\u0000\u000f\u0010\u0000\u0000@\bĀ€\u0010Ā€A\u0001\u0001\u0004\u0001\u0010\u0001OƱ\u0004 \b@\u0010Ā€A\u0000Ā‚\u0002\u0004\bP @", "Reset all widgets": "\u0000Ā»\u000f\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\u0000\b\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000 \u0002 \u0000Ā€\u0000\u0000\u0006\u0012\u0000\u0000\u0000\u0000\u0002\u0000\u0001Ć \u0004\u0010\u0002\u0000\u0000\u0000\u0002\u0000Ā‚\u0000\u0010\u0000\u0000\u0000!@\u0000\u0000\u0000\u0000@\u0000ƒ\u0000B\u0000@\u0000\u0000\u0000@ \u0003Ć \u0000@\u0000 \u0000\u0000\u0000\u0000\b\u0000\" \b@\bư\u0000\u0000\b\u000bĆŗ\u000fĀ„\u0000\u0010\u0006\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004B\u0001\b\u0001b\u0000\u0000\u0001\u0006\b0€€\u0004\u0000 @\u0007\u0000\"\u00008\u0001\u0010@!\u00010Ā€\"\u00008\u0001\u0000\u0010 \u0003Ā€\u0000\u0010\u000f\u0000\u0012 \u0004ƀ\"\b\u0004 \u001c \u0012 \u0004ƀ \u0001\u0004\u0003\u0000\u0004\u0000 \u0001D\u0000Ā„\u0004\u0000Ā„\u0000ˆ\u0001D\u0000Ā„ƀ!\u0000\u0002\u0000\u0001\u0000\u0004\u0000!\u0000\u0010\u0000@\u0001\u0000\u0010\u0000!\u0000\u0010\u0000Ā€\u0000 \u0000@\u0000@\u0000Ā€\u0000 \u0002\u0000\u0014\b\u0000 \u0002\u0000\u0000 \u0002\u0000\u0010\u0000\b\u0000\b\u00010\u0000\u001e\u0000\b\u0000@\u0001\u0006\u0000\b\u0000 \u0000\b\u0000@\u0002\u0000\u0002\u0000\u0001\u0000\u0018\u0000< \u0002\u0000\b\u0000\u0003\u0000\u0002\u0000\u0003Ć \u0002\u0000\b\u001fĆæ\u0000Ā€\u0000 \u0000\u0000\u0000\u0000\u0000Ā€\u0001\u0000\u0000\u0000\u0000Ā€\u0000\u0000\u0000Ā€\u0001\u0000", "Hours": "\u0000\u001c\u0010\u0000\u0000@\u0000\u0000\u0004\u000fŸø@‰\u0018ĀæĀĀŸĀˆ@‰\u0018Ā„\u000fĀŸĀĆ¼Ā€\u001f\tùˆ\u0010ĀĀ˜ĀæĆ‰Ć¹Āˆ\u0010ĀĀ˜Ā‘\tùø˜\b\u0001\u0000PĀ€P\u0002\b\u0002", @@ -129,33 +129,33 @@ "Beep": "\u0000+\r\u0000\u0000\u0000\u0000\u0000\u0000ƀ\u0010\u0000\u0000\u0000&\t\u0000\u0000\u0004|Ā Ā \u0000\u0000qd\u0010\u0000\u0000\u0000 Ā€\u0000\u0000\u0000\b\u0011Àð\u0001\u0003ƀ\u000fƀ\u0000@@\u0000\u0000\u0000\b\b\u0000\u0000\u0000\u0002\u0001\u0000\u0000\u0000\u0000Ā€\u0010\u0000\u0000\u0000 \u0001Ćø\u0000\u0000\b\u0000", "Message": "\u0000L\r\u0000\u0001\u0000\u0000\u0000 \u0000\u0000\u0000\u0000 \b\u0000\u0000\u0001\u0000\u0000\u0000\u0003\t\u0000Ā€\u0000\u0000\u0010\u0000\u0000\u0000\bP\b\u0000\u0000\u0001\u001e\u0000\u0000\u0000\u0004\u0018Ā€\u0000\u0000\u0016 \u0000\u0000`\u0000p\u0001\u0010\tĀ„\u0010>\u0001\u0002\u0001\u0000HĀ€p۟\u0000\u0000@(\u0002ˆ\u0001\u0010\u0000\u0000\u0000\b\u0002@!\u0000\u0010\u0000\u0000\u0000\u0001\u0000@\u0000\u0010\u0001\u0000\u0000\u0000\u0000 \b\u0000\u0002\u0000\b\u0000\u0000\u0000L\u0003\u0000\u0000@\u0000|\u0000\u0000\u0003\u0000ƀ\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000", "System": "\u0000:\r\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0018\u0000!ƀ#ƀ\u0002\u0001\u0000\u0007\u0007\u0000\u0000Ā€\u0000\u0000\b\u0000\u0000\u0000 ƀ\u0000\u0002\u0000\u0003ƀ\u0010\b\u0010\u0001\u0000G\u0000\u0004\u0000\b\u0000@\u000e@\u0001 \u0004\u0000(\u0000\u0010\u0000Ā„\u0002\u0000\u0011\u0000\b\u0000!\u0000\u0018 \u0002\u0000S™€\u0018\b\u0001\u0000\u000f\u0005Ā€\u0000\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0000\u0000@\u0000\u0000\u0000", - "Select Clock": "\u0000z\r\u0000 \u0000@\u0000\u0010\u0000 \u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0010\u0004\u0000\b\u0000\u0002p\u0004\u0000\u0002p\u0000\u0000\u0000\u0000\u0002q\u0000\u0002\u0000\u0000Ƥ\u0001\u0000\u0000Ƥ\b|\u0000\u0000\u0000ƤG€€\u0000\"\u0000@\u0000\"\u0001Ć”\u0000\u0000\u0000\"\u0016 \u0000\u0010Ā€\u0010\u0000\u0010Ā€@@\u0000\u0000\u0010¦\u0010\b\u0000\u0004@\u0007\u0000\u0004@\u0010\u0010\u0004@\u0004G\b\u0002\u0004\u0002\u0010\u00010\u0002\u0010\u0002\b\u0004ˆ\u0002\u0010D\u0000Ā‚\u0001\b\u0000B\u0001\b\u0000Ā‚\u0000Ā¢\u0001\b\u0010\u0000!\u0000\u0002\u0000\u0010\u0000\u0002\u0000'Ā€!\u0000\u0002\u0004\u0000\bĀ€\u0001\u0000\u0004\u0000\u0001\u0000\u000e\u0010\u0000@\u0001\u0000Ā€\u0002ƀ\u0000Ā€\u0001\u0000\u0000Ā€\u0002\u0000\u0000 \u0000Ā€\u001f\u0000ƀ\u0000@\u0000@\u0000@\u0000\u0000\u0000\u0010\u0000@\u0000\u0000\u0000\u0000 \u0000\u0010\u0000 \u0000\u0000\u0000\b\u0000 \u0000", - "Locale": "\u0000;\r\u0000\u0000\u0000 \u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000Ā‚\u001f\u0000@\u0000\u0000\u0000ˆ< \bp\u0000\u0000\t\u0004\u0004\u0003ư\u0000\u0000\u0001 €€H\u0002\u0007ƀ$H \u0010Ā€?\u0000\u0004‰\u0004\u0004\u0010\u0000\u0000\u0000Ā’'Ā€\u0002\u0000\u0000\u0000\"G\b\u0000Ā€\u0000\u0000\u0004PĀ€\u0000\u0010\u0000\u0000\u0001\f\u0000\u0000\u0004\u0000\u0000\u0000A\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000", - "Vibrate": "\u0000\u001e\u0010\u0000\u0010\u0000\u000f Oñà \u0000Ā‚\u0004Ā€?èþø\b|H\u0001ü‘ \u0004Ā’EĆæ\u001fƉ\u001aĀ I$ĆŠĀ‘Ć¼Ā*€‚D¤\u001fƉ\u0012\bDR ?\u0015JO‰J0B", + "Select Clock": "\u0000k\u0010\u0000\u0000@@@\u0000\u0000\u001ex \u0000\u0000\u0000\u0000\u0000\b\u0004\b\u0001\u0000\u0012I\u0004\u0000@\u0000\u0003Ć”\u0000\u0000\u0010\u0001yàˆ \u0004\u0000FEüþ \u0012ƀ(Ā¢\u0011\u0004@Ćø\u0007HĀ„\u0000\u0004\u0001Ć \u0000Ć³ĆŸĀ Ā‡Ć°\u0000\u0011\u0010ð€\u0010\u0000\u0004@D\u0010\u0002\u0000\u0004#Ćæ\u0001Ćæ\u0002\u0010sþ\bþ\u0001ƀ\u0001\u0007À‡Â\u0000ó‚\u0011\u0001R@L\u0000|ˆ\u0010\u0000@1Ā€B 2@\bĀ€\u0018QŸ\b\b`\u000bÿŒH\u0000ư\u0004\u0006 B!\u0000\u0014\u0001\bĀ†ĀˆĀ€\u0002\u0001\u0000Ć„ĀˆD \u0004Ā€\"\b\u0011\u0010\u0000Ā€\u0003ĀŸĀ‰\bĀ„\u0001\u0000\u0004€‚A\u0000\u0010\u0000Ā\u0010!ð€ \u0001@\u0000H \u0004\u0000\u0011\u0000\u0014\"\u0010\u0003ưGĆæ*\u0002\u0001\u0000\u0001ƀ\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0002Ā€ \u0000\u0000\u0000", + "Locale": "\u0000\u001f\u0010\u0000\u0010 \u0014 @@$@€€@‰\u0001?Ʊ\u0012Ƃ\u0001\u001f¦Ÿ\u0002\u0004Y\bӉÒ\u0011)\u0011$\"R\"hDĀØDĀ ĀPĆ©\u0011ƀN\u0012.\u000eĀØ HĆ£@?€‰€\u0000\u0000!", + "Vibrate": "\u0000|\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0004Ā‚\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000H\u0000@GĀØ\u0010\u0000\u0000\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0002Ā€\b\u0003Š\u0001\u0000\u0000\u0000\u0000@\u0000\u0000\u0003\u0000\u0011 \u0001\u0000\u0000Ā€\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0010ˆ\u0000`\u0000\u0010\u0001\u0000\u0000\u0000\u0003\u0000\u0000<\u0000A\b@\u001a\u0000\u0001\u0000\u0010\u0000ð\b\u0010\u001c@\u0000!\u0002\u0006\u0010\u0000 \u0001\u0002\u0007Ć \u0000\u0002\u0000\u0004\u0000\u0002\u0010 \u0001\u0000\u0002\u0000\u0010@\u0000\u0000\u0000@\u0003ƀ\u0000B\u0001\u0000\u0010\u0000@\u0001\b\u0000\u0000\u0000\b\u0001ƈ\u0000\b@\u0010\u0001\u0000\b\u0000\u0011\u0000\u0000\u0000\u0001\u0000\u0000Ā€\u0001\b\u0001\u0000\u0010\u0001\u0000\u0001`\u0000\u0000\u0002`\u00008\u0002`\u0000\u0000\u0001\u0000 \u0000\u0018\u0000\u0000\u0000\u0018\u0000\u001c@\u0018\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", "Alerts": "\u00009\r\u0000\u0000\u0000\u0000\u0000\u0000\u0000 CĆ #Ā€\u0000\u0000\b\u001e\u0010\u000e\u0000\u0000\u0000\u0004\u0000\u0010\u00008\u0000\u0000\u0002\u0000\bƤ\u0000\u0000\u0001\u00000\u0003Ā‚\b\u001f\u0000Ć \u0010\u0000\u0001\u0003ư\u0000L\b\u0000\u0001\u0000\u0000\u0000!\u0004\u0000\u0000Ā€\u0000\u0000\u0010\u0004\u0000\u0000Ā€\u0000\u0000\b\u0002\u0000\u0000Ā€\u0000\u0000\u0004\u0002\u0000\u0001Ā€\u0000\u0000\u0002\u0002\u0000\u0003\u0000\u0000\u0000\u0001\u0000", "Whitelist": "\u0000i\r\u0000\b\u0000\u0000\u0000\u0000Ā€ \u0000\u0001\u0000\u0000\u0000 \u0002\u0000CĆ \u0000@\b\u0000\u0010@!ƀ\b\u0001\u0000\u001e\u0010\u0000@\u0004\u0000\u0004 \u000f \u0004\u0010Ćø\b\b\u0000@\u0002\u0000\u0002\u0010\u0000 \u0002\u0007ƀ\u0002\u0004\u0000ƀ\u0001\u0000\u0001\b\u0000\u0010\u0001\u0000 \u0001\u0004\u0001Ā \u0000Ć \u0000Ā„\u0000\u0010\u0000Ć \u0014\u0000Ā‚\u0003\b\u0000L\u0000B\u0000\b\u0000LI\u0000\u0002\u0000\u0004\u0000!\u0000!\u0000\n\u0000!$@\u0001\u0000\u0002\u0000\u0010\u0000\u0001\u0000\bĀ€\u0010\" \u0001\u0000\u0001\u0000\b\u0000\u0000Ā€\u0018 \b!\u0000\u0001\u0000\u0000Ā€\u0004\u0000\u0000Ā€0\u0010\u0004\u0001Ā€\u0001\u0000\u0000@\u0002\u0000\u0000Ā€\u0000\u0000\u0002\u0000@\u0001\u0000\u0000 \u0001\u0000\u0000Ā€\u0000\u0000\u0001\u0000", - "Set Time": "\u0000K\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010>|Ā€\u0000\u0000\u0000Ā€\u0007Ƃ\u0004Hˆ\u0000\u0000\u0000\b\u0000‹øùñ\u0000\u0000\u0000\u0001\u0000\u0011\b\u0011\"#ƀ\u0000\u0000 \u0002!\u0003Ć§Ć…Āˆ\u0000\u0000\u0004\u0000Gþ@\fƂ\u0000ˆ\u0000Ć \u000f\tùpĀ€HĀ€\u0013\u0001\u0010!!\" \u0005\u0010\u0002\u0010\"Ćæ'Ƥ@\u0000Ā„\u0000@\u0004@Ā„Ā„Āˆ\u0000\u0000Ā€\b\u0000‰\u0010ĀŸĀĀ€\u0000 \u0001\u0000\u001f\u0012\u0012\u0012\u000fĀ€\b\u0000 \u0002 B\u0000@\u0000\u0002\u0000\u0004\u0000\u0000(@(\u0000\u0000\u0000\u0000\u0000\u0000\u0002\b\u0002", - "Disable": "\u00006\u000b\u0000\u0000\u0010\u0000\u0000Ā€0\u0003ƀ@\u0000\u0002\u0000@\bĀ€\u0000\u0000\b\u0001\u0000!\f\u001e\u001e.\u0004\u001eĀ„\u0010„„Ä\u0010†\u0010B\u0000\u0012\u0010B\u0018A\u0006\u0007ƈA\u000fĆ”\u0004\u0006!!\u0004 Ā„\u0010\u0004„„\u0010Ā‚ B\u00123\u0010B\u001f\u0007LJK‡Ç€", + "Set Time": "\u0000k\u0010\u0000\u0000@\u0000\u0000\u0000\u0000@\u0000\u0004\u0000\u0000\u0000\u0000\u0000\b\u001f>\u0001\u0000\u0004>\u0000@\u0000@\u0000\u0003Ć”\u0002$@\u0010\u0000Ā„Cÿð\u0004\u0000FEü|Ćø\u0012Ć€Ć¾Āˆ@\u0002@Ćø\u0007HĀ„\bĀ‘\u0001Ć \u0000\u0011\u0010\u0000‡ð\u0000\u0011\u0010óà\u0010\u0001Ć“\u0018\u0000\u0000\u0002\u0000\u0004#Ćæ \u0004\u0002\u0010\u0001\u0000\u001fü\u0001ƀ\u0001\u0007Ć€Ā„Ć¼Ā€Ć³Ā‡ĆŸĆ€\u0010\u0000L\u0000|ˆ\u00101Ā€\u0001\b\u0002\u0000\bĀ€\u0018Q“ò\b`\u001f!\u0004@\u0000ư\u0004\u0006 BB@\u0014\u0002\"@ĀĆ€\u0002\u0001\u0000Ć„ĀˆOƈ\u0004Ā€DP\u0011\u0000\u0000Ā€\u0003ĀŸĀ‰\t\t\u0001\u0000\bĀ„\u0002 \u0000\u0010\u0000Ā\u0010!\u0000 \u0001Ʊ@¤\u0000\u0004\u0000\u0011\u0000\u0014 \u0014\u0003ư\"D#Ćæ\u0001\u0000\u0001ƀ\u0001\u0004\u0001\u0000\u0000\u00000h\u0000\u0000\u0000\u0000\u0000", + "Disable": "\u0000\u001e\u0010\u0000\u0010\u0000\u0010 @\u0000 ÿÀ\u0002\nĀØ?ƈJĀ \u0000ü*€—ÿÄ\"BĀØ I\nĀ $$*Ā€P—ÿÀ‚@\u0000\u0005\u0011$ˆ\"D‰\u0011\n\u0014$H\u0012Ā \u0001\u0000Ā„", "BACK": "\u0000\u001e\n\u0000Ćø0x†\u0011\"\u0012(DˆI!! (ø„€Â\u0013ò\u0003\bHH\n!!!$„„„‹â\u0011Ć¢\u0010", "ALARM": "\u0000&\n\u00000Ā€0ĆøĀ…\"\u0001\"\u0012\u0014ˆ\u0004ˆLĆ” !!3„€„ø·ò\u0003òBƘH\bHˆa !\"!„€„„†\u0013ò\u0012\u0012\u0010", "Timer": "\u0000;\r\u0000\b\u0000\u0000Ā€\u0000\u0000\u0000\u0000Ā€\u0000\u0010\u0000\u0000\u0000\u0000\u001f\u0000\u0004\u0002\u000f\u0000\u0000\u0004 \u0001\u0000>\u0010\u0000\u0000ˆ\u0000ƀ\u0000\u0004\u0000\u0000)\u0000h\u0000\u0001\u0002\u0007ƈƀ0Ā€\u0000@?\u0002\b\u0000\u0010\u0001\u0000\u0000\u0002\u0000\u0002\u0000\f\u0000\u0000\u0000Ā€\u0000@\u0000@\u0000\u0000 \u0000\b\u0000\u0004\u0000\u0000\u0018\u0000\u0001\u0000\u0000\u0000\u0000\f\u0000\u0000 \u0000\u0000\u0000\u0000", "Error in settings": "\u0000]\u0010\u0000 \u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000‡À\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\"\u001fÿ€\u0000\u0000\u0000\u0000\u0000\u0000\u0001ý\u0010Ā€\u0004\u0007Ā€\u0000\u0000#Ā€\u0000\u0000\bˆ\u0000@ƒ\u0000\u0007\u0000Ć \u0000\u0000>ƒ\u0000\u0000\bˆ\u000fƀ\u00008\u0000\u0000\b\u0000ÿàD \b\u0000ĀŽ@\u0000\u000f¿€ \u0004A\u0000 \u0003Ā‚\b\u001f\u0000Ā„\u0001\u0000\"\b\u0001\u0000\u0000\u0010?\u0003Ƥ ˆ\u0001 @\b\u0000\u0001\u0000\u0000\u0011\u0012\u0004~\t\u0004\u0000@\u0000\b\u0000\u0000ˆ \"\u0000P \u0007Ć \u0000Ā€\u0000\u0004B\u0001\u0010\u0001\u0006\u0003\b\u0000\u0000>(\u0014Ā€\u0000ƀ\u0000\u0000\u0001Ā€\u0000\u0001\u0012!\u001fĆø\u0000\u0000\u0000\u00000\u0000\u0000\u0000`Ɛ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", "Factory Reset": "\u0000˜\r\u0000\u0000\u0000\u0000\u0000 \u0000@\u0000\u0002\u0000\u0000\u0000\u0002\u0000@\u0000\u0000\u0000@‡€\u0000\u0000\u0013Ā€ \u0000A\u0000\u0000\u0000A\u0000 \u0000\u0000\u0000 xĀ€\u0000\u0000\u001cĀ€ \u0000!\u0000\u0000\u0000!\u0000 \u0000\u0000\u0000 \u0000Ā€\u0000\u0000\u0011\u0000 \u0000!\u0000\u0000\u0000!\u0000#ƀ\u0000\u0000 \u0001\u0000\u0000\u0000!\u0000 \u0000!\u0000\u0000\u0000!\u0000,@\u0000\u0000 \u0001\u0001\u000f\u0000\"\u00008\u0000!\u0002\u0007ƀ!\u00010Ā€\"\u00008\u0002\u0000Ʊ\u0000B\u0000&\u0000!\u0001Ćø\u0000!\u0000Ć”\u0000Ā‘\u0000&\u0002\u0000\u0012\u0000Ā„\u0000!\u0000!\u0000\u0000\u0000!\u0000\"\u0000Q\u0000!\u0004\u0000\f\u0000\u0004\u0000 \u0000\u0002\u0000\u0000\u0000\u0002\u0000 \u0000B\u0000 \b\u0000\b\u0000\b\u0000 \u0000\u0002\u0000\u0000\u0000\u0002\u0000 \u0000\u0002\u0000 \u0010\u0000\b\u0000\u0010\u0000 \u0000\u0004\u0000\u0000\u0000\u0004\u0000\u0010\u0000\u0004\u0000 \u0000\u0010\u0000 \u0000 \u0000\b\u0000\u0000\u0000\b\u0000\u000fĀ€\b\u0000 \u0000\u0000 \u0000@\u0000 \u0000\u0010\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0010\u0000 ", "Sleep": "\u0000\u001f\u0010\u0000\u0000\u0010\u0000\u0000\u0000ư\u0003Ć»Ć\u0001Ć“\u0014Ā‚\u0002()\u0004\u0004P^ĆæĀĀæĀ¤Ā’\u0011HI$\"÷þ}Ćæ$ŠBI!\u0014„¿â(Ā\u0004\u0007Ƒ2\b\bĀ©AĆæ\u0000aĀ€\u0000\u0000", - "Connected": "\u0000Z\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Ā€\u0000\u0002\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000@\u0000œ\u0004x\u0000\u0000\u0002\u0016\u001f\u0000\u001e\u00009\u0000Ć \u0000\u0000\u0000Ā„x@xĀ€\bĀ€\u0000\u0000\u0000\u0000 \u0000\u0010\u0000@\u0004 \u0000x\u0000\u0000\b\u0000\u0004\u0000 \u0001\u0010\bĆ \u0001\u0010\u0003Ā€\u0001\u0000\u0010\u0000Ā„\u0001ƈ\u0001\"\u0000˜\u0000Ā€\r\u0000B\u0000\u0002\u0000(Ā€!\u0000 \r0\u0000Ā€\u0001\u0000\b@\b\u0000Ćø\fB\u0000@\u0000@\u0000\u0010\u0002\u0001Ƃ\u0000\u0010\u0000 \u0000 \u0000\b\u0000Ā€\u0000\u0000\u0004\u0000\u0010\u0000\u0010\u0000\u0004\u0000 \u0000\u0000\u0001\u0000\b\u0000\b\u0000\u0002\u0000\b\u0000", + "Connected": "\u0000]\u0010\u0000\u0001\u0000\u0010Ā€\u0010Ā€\u0010 \u0000\u0000\u0000\u0000\b\u0000Ā‚\u0000Ā‚\u0000\u0000\u0000\u0000\u0000\u001fĆæ\u0004Ćæ\u0004Ćæ\bÿ„\u0000\u0002\u0000\u0002\u0000 \u0000 \u0000P@\u0010\u0000\t\u0001Ćæ\u000fĆĀĆĀ„ĀŸĆ€Ā€\u0000p\b\b\bH\bHx\u0000\u0004\u0000\u001e\u0000@@_Ćø_ĆøOĆø \u0000#Ãþ\u0002\b\u0002\b\u0004@A\u0000\u0001\u0003\u0010\u0010\u0018@\u0018@L\u0004\b\u0000\b ÿ¿ñ¿÷Ā@\u0000Ā€\u0004\u00044\"4\"\u0002$\u0002\u0002\u0004\u0000?Ć \"\u0010\"\u0010\u0001 \u0010 \"\u0001\u0001\u0001\t\u0001\t\n‰\u0000F\u0002\u0010\b\b\b0\b0T‰\u0001ƀ\u0010ÿùFaFb\u0004H\u0000\u0000\u0000\u0000\u0000\u0004À„À€Aƀ\u0000\u0000\u0000", "Messages": "\u0000L\r\u0000\u0001\u0000\u0000\u0000 \u0000\u0000\u0000\u0000 \b\u0000\u0000\u0001\u0000\u0000\u0000\u0003\t\u0000Ā€\u0000\u0000\u0010\u0000\u0000\u0000\bP\b\u0000\u0000\u0001\u001e\u0000\u0000\u0000\u0004\u0018Ā€\u0000\u0000\u0016 \u0000\u0000`\u0000p\u0001\u0010\tĀ„\u0010>\u0001\u0002\u0001\u0000HĀ€p۟\u0000\u0000@(\u0002ˆ\u0001\u0010\u0000\u0000\u0000\b\u0002@!\u0000\u0010\u0000\u0000\u0000\u0001\u0000@\u0000\u0010\u0001\u0000\u0000\u0000\u0000 \b\u0000\u0002\u0000\b\u0000\u0000\u0000L\u0003\u0000\u0000@\u0000|\u0000\u0000\u0003\u0000ƀ\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000", "Hide": "\u0000\u001c\u0010\u0000\u0000\u0010\u0000\u000f‡€ ‹€\u0001\t\bˆ\u001fĀ’H\n\u0015\u0000\u0010“ø\u0007\t\u0000Ā€Ā˜Ā‰Ćø\bĀˆĀ€Ā€x‹ø\u0000Ā\b\u0000\u0010Ā”H\u0001\bU@ Ā…\u0014\u0004\bĀ\u0000\u0000", - "Show": "\u0000*\u000b\u0000`\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u0000\u0000<\u0000\u0000 @q\u0002\u0007ƀ \u0000@~\u0000\u0010\u0000ư\u0000\u0000\b\u0001ƈ\u0000\u0000\u0004\u0000\u0002\u0000\u0000&\u0000\u0003Ā€\u0000\u0006\u0000\u0007\u0010\u0000\u0000", + "Show": "\u0000\u001d\u0010\u0000\u0001\u0000\u0000\u0000\b\u0000\b\u001fĆæ\u0000 \u0002\u0000ð\u0010\u0003Ćø\u001fü\u0000@\u0004\u0000\u000e\u0000 \u0000˜ÿþ\u0004@(\u0000\u001e\u0002\"\u0000\u00100Ā \u0001\u0002Ā‚\u0000\bdŒ\u0000Ā€(\u0018\b\u0001Ā€\u0000\u0000", "On": "\u0000\u001b\r\u0000\u0002\u0000\u0000\u0000 \u0000\u0000\u0004\u0001Ā€@ư\b\u0017ư\u0000Ā‚\u0006\u0000\u0000@\u0000\u0010H\u0000\u0004\u0011\u0000\u0001\u0004 \u0000A\u0004\u00010\u0001Ā€\u0018\u0000\u0010\u0000\u0000", "Ok": "\u0000\u000e\n\u0000x†\u0012(I!(„Â\u0013\bJ!$„‰â\u0010", "No": "\u0000,\r\u0000\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000p\u0000\u0000\u0000\u0000\u0000\b\u0000\b\u0000\u0000\u0000@ƀ@ƀ#Ā„\u0002\u0004\u0002\u0001Ɛ@\u0010@\u0010\u0002\u0004A\u0004A\u0000@H0H0\b\u0002\u0002\u0001ƀ0\u00000\u0000\"\u0001\u0000\u0001\u0000\u0004 \u0000\u0000\u0000\u0000Aư", "Settings": "\u0000\u001f\u0010\u0000 \u0000\u0002\u0000!ư\u0002\u0000B!ÿÿÓB\u0000\u0010\bˆ\u0000O À\u0000\u0000Ā€\u000fþ>þ\u0000Ā€\u0000Ā„\u0001\u0000ù\b\"\u0001\u0011 GĆ¢\"Ā€Āˆ\u0004B\u0001\u0010\u000fŠ\u0005 \u0011\"\u0011ÿƒ@\u0000", - "steps": "\u0000<\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000`\u0000\u0000\u0000\u0000\u0000\u0000\tCĀ€GĀ€\u0000\u0000ĀĀ“Ćˆ\u0003Ā€\u0000\u0000\u0007\u0016\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u001e\u0000\u0000\u0000 \u0002\u0000ĀŽ\u0000\u0011\u0000\u0002\u0000 \u0007 \u0004ˆ\u0000@\u0005\u0000\u0002\u0000(Ā€\u0004\u0000ˆ\u0000@\u0002\u0010\u0000Ā€0@\u0004\u0000\u0001\u0000\u0010\f\u0004\u0000Ā€\u0000 \u0002\u0000\u0000\u0000\u0010\u0000\u0004\u0000@\u0000\u0000\u0002\u0000\u0000Ā€\u0000\u0000", + "steps": "\u0000\u001f\u0010\u0000\u0001\u0000\b \u0002\u0000Ā’@GĆ ĀØĀ€Āˆ\u0000AƱ\u0010\u000fĆ“B \u0005H¿ÿ’Q\u0000Ā€DR\u0001\u0010\u0010(\"\u0011üPDPˆA\t\"\u0010Ā„\f\u0006BĀ€`\u0003\u0005\u0007\u0000\r\u0011p\u0000aA", "back": "\u0000+\r\u0000\u0000\u0010\u0000\u0000\b\u0000\t\u0000\u0000\u0000œ\u0000Ā \u0000\u0000\u001cˆ\u0000\u0000\u0002 ˆ\u0000\u0000\u0000Ā„\u0010Ā€\u0011\u0000\u0011\u0004\b\t\u0010\u0004 \u0000Ā¢\u0001\b \u0010\u0010Ā€\u0001\b\u0002\u0000\u0010\u0000B\u0000@\u0004\u0000\u0010\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000@\u0001\u0000", - "Steps": "\u0000<\u000e\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000`\u0000\u0000\u0000\u0000\u0000\u0000\tCĀ€GĀ€\u0000\u0000ĀĀ“Ćˆ\u0003Ā€\u0000\u0000\u0007\u0016\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u001e\u0000\u0000\u0000 \u0002\u0000ĀŽ\u0000\u0011\u0000\u0002\u0000 \u0007 \u0004ˆ\u0000@\u0005\u0000\u0002\u0000(Ā€\u0004\u0000ˆ\u0000@\u0002\u0010\u0000Ā€0@\u0004\u0000\u0001\u0000\u0010\f\u0004\u0000Ā€\u0000 \u0002\u0000\u0000\u0000\u0010\u0000\u0004\u0000@\u0000\u0000\u0002\u0000\u0000Ā€\u0000\u0000", + "Steps": "\u0000\u001f\u0010\u0000\u0001\u0000\b \u0002\u0000Ā’@GĆ ĀØĀ€Āˆ\u0000AƱ\u0010\u000fĆ“B \u0005H¿ÿ’Q\u0000Ā€DR\u0001\u0010\u0010(\"\u0011üPDPˆA\t\"\u0010Ā„\f\u0006BĀ€`\u0003\u0005\u0007\u0000\r\u0011p\u0000aA", "Year": "\u0000\u000f\u0010\u0000\u0010\u0000 \u0000Ʊ\u0004\u0002\b\b\u0010\u0007þ\b@\u0010Ā€!\u0003ÿø\u0004\u0000\b\u0000\u0010\u0000 \u0000@", - "Yes": "\u0000%\r\u0000\u0001\u0000\u0000\u0000\u0004\u0004\u0000\u0000\u0000\u0010 \u0000\u0000\u0000”Â\u0000\u0000\u0004Ćø\b\u0018\u0000@@@ \u0002\u0002\u0002\u0000Ā€\u0010\u0010\u0011\u0004\u0006€€`M<\u0002\u0002R0\u0018\u0000\fĀ‘@@\u0000\u0004p\u0000\u0000\u0000\u0000", - "Loading": "\u0000\\\u000e\u0000\u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0000\u0000 \u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0002\t\u0000\u0000\u0000\u0000GP\u0000\u0000\u0000\u0000\u0013X|\u0000\u0000\u0003Ā„\u0000\u0000\u0006\u0000\u0001Ɣx@\u0000\u0000\u0000\u0000\u0000Ā€\u0010 \u0011\u0004\u0004\u0000\u0000\b<\u0000\u0010\u0000Ā‚\u0002\u0010@A\u0003Ć |\u0000\u0002\u0000\u0000@\"\u0002\b\u000fƀ\u0000 \u0000Ć \u0000\u0004\u0004 Ā€\u0000\u0000\u0002\u0000r\u0000\u0000€„\u0002x\u0000\u0000\u0000@\u0000 \u0000\u0010\u0000@8@\u0000\u0000\u0004\u0000\u0002\u0000\u0002\u0000\b\u0002\u0000\u0000\u0000\u0000Ā€\u0000 \u0004ƀ\u0001\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0002\u00000\u0000 \u0000\u0000\u0000\u0000\u0002\u0000\u0000 \u0000\u0000\u0004\u0000", + "Yes": "\u0000\u001b\r\u0000\u0001\u0000\u0000\u0010\u0010\u0000\u0001\u0002\u0000\u0000(pĀ€\u0004Ćø\b\u0019\u0001\u0001\u0000Ā  \f\u0004\u0004A€€tư\n\u0005#\u0001Ā€$P\u0010\u0004p\u0000\u0000", + "Loading": "\u0000M\u0010\u0000 \u0000\u0000\u0002\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\b\u0000ÿ‚ \u0004 \u0002 \u0000AĆø@\u000f\u0000 Ā€\u000f\u0000\u0002\u0000\u001fƀ\u0010\u0000\u0004\u0000\u0010\u0003ÿ¼\u0000\u0000Ā€\u0000P\u0000Ā€\u0010Ā„\u000fĆø\bĀƒĆ‚Ā€\b€„/@@B\u0002\"\u0000B\u0004!\u0004\u0004\u000fư\u0011\u0010\u000fư!\u000bā ÀA Á\bR$\u0011\t\u0005\u0001\u0011\t\u000fþ‘ @0\u0004@B\u0014‰\u0003\u0004\u0001\u0000\u0003\u0004\u0000\u0010<‰\u0000@\u0014\u0000\u0000@\u0000$H\u0000\u0001\u001fĆø\u0000\u0000\u0004\u0000Aƀ\u0000\u0000\u0000\u0000\u0000\u0000 ", "Music": "\u0000\u001f\u0010\u0000\u0002\u0000\u0001\u0000\u0002\u0000Ā„\bÿàŸ \u0000\u0000¢€‚\u0000D\u0000ˆ\u0002Ćŗ?ÿ‰\u0012\u0000\u0000b\"\u001fư\u0007ƀ \u0002\u0000@Cÿøÿ€*\u0001\u0001\u0000Ā’\u0002\u0002\u0006#\u0007ü0Aˆ\b\u0000Ā€", "color": "\u0000+\r\u0000\b\u0000\u0000\u0000\u0000\u0000Ā€\bĆ \u0000\u0000\u0010\u0000Ć \u0000\u0000CĆ \u0000Ć \u0000\u0007Ƅ\bƤ\u0000\u0000\u0010€à‚\u0007Ƃ\u0010\u0000\u0010?\u0000Ā„\u0000\u0004\u0000\u0000\u0010Ā€\u0000Ā€\u0000\u0004\u0010\u0000 \u0000\u0001\u0014\u0000\b\u0000\u0000AĀ€\u0006\u0000\u0000\u0000 \u0003\u0000\u0000\u0000", "off": "\u0000\u001a\r\u0000\u0002\u0000\u0000\u0000@\u0010ư\u0010\u0003Ɔ\u0007Ā€\u0001\u0000\u0000€À\u0000 P\u0000\u0010$\u0000\u0004\u0011\u0000\u0002\b@\u0001\u0004\u0010\u0000Ā€\f\u0000@\u0001\u0000\u0000\u0000", diff --git a/lang/unicode-based/ja_JA.json b/lang/unicode-based/ja_JA.json index 2852fd9e3..f8c16c9ce 100644 --- a/lang/unicode-based/ja_JA.json +++ b/lang/unicode-based/ja_JA.json @@ -2,123 +2,123 @@ "//": "Japanese language translations", "GLOBAL": { "//": "Translations that apply for all apps", - "New Alarm": "ę–°åž‹ć‚¢ćƒ©ćƒ¼ćƒ ", - "New Timer": "ę–°åž‹ć‚æć‚¤ćƒžćƒ¼", + "New Alarm": "ć‚¢ćƒ©ćƒ¼ćƒ ć‚’čæ½åŠ ", + "New Timer": "ć‚æć‚¤ćƒžćƒ¼ć‚’čæ½åŠ ", "Save": "äæå­˜", - "Keep Msgs": "Keep Msgs", - "circle count": "ć‚µćƒ¼ć‚Æćƒ«ć‚«ć‚¦ćƒ³ćƒˆ", - "(repeat)": "(ē¹°ć‚Ščæ”ć—)", + "Keep Msgs": "ćƒ”ćƒƒć‚»ćƒ¼ć‚øć‚’äæęŒć™ć‚‹", + "circle count": "ć‚µćƒ¼ć‚Æćƒ«ć®ę•°", + "(repeat)": "(ćƒŖćƒ”ćƒ¼ćƒˆ)", "music": "音愽", "Auto snooze": "ć‚Ŗćƒ¼ćƒˆć‚¹ćƒŒćƒ¼ć‚ŗ", - "week": "ć‚¦ć‚£ćƒ¼ć‚Æ", + "week": "週間", "circle 1": "ć‚µćƒ¼ć‚Æćƒ«1", "circle 3": "ć‚µćƒ¼ć‚Æćƒ«3", "circle 2": "ć‚µćƒ¼ć‚Æćƒ«2", - "show widgets": "show widgets", + "show widgets": "ć‚¦ć‚£ć‚øć‚§ćƒƒćƒˆć‚’č”Øē¤ŗ", "heartrate": "åæƒę‹ę•°", "circle 4": "ć‚µćƒ¼ć‚Æćƒ«4", "battery warn": "ćƒćƒƒćƒ†ćƒŖćƒ¼č­¦å‘Š", "valid period": "ęœ‰åŠ¹ęœŸé–“", "maximum": "ęœ€å¤§", - "weather circle": "ć‚¦ć‚§ć‚¶ćƒ¼ć‚µćƒ¼ć‚Æćƒ«", - "minimum": "惟惋惞惠", - "step length": "ć‚¹ćƒ†ćƒƒćƒ—é•·", + "weather circle": "å¤©ę°—ć‚µćƒ¼ć‚Æćƒ«", + "minimum": "ęœ€å°", + "step length": "歩蔌", "distance goal": "č·é›¢ē›®ęØ™", "Circle": "ć‚µćƒ¼ć‚Æćƒ«", - "min. confidence": "ęœ€ä½Žé™ć®č‡Ŗäæ”", - "colorize icon": "ć‚«ćƒ©ćƒ©ć‚¤ć‚ŗć‚¢ć‚¤ć‚³ćƒ³", + "min. confidence": "ęœ€å°ē¢ŗäæ”åŗ¦", + "colorize icon": "ć‚«ćƒ©ćƒ¼ć‚¢ć‚¤ć‚³ćƒ³", "Heartrate": "åæƒę‹ę•°", "data": "ćƒ‡ćƒ¼ć‚æ", - "Yes\ndefinitely": "はい。\né–“é•ć„ćŖć", + "Yes\ndefinitely": "はい。\n確かに", "Launcher Settings": "ランチャー設定", - "TAP right top/bottom": "TAPå³äøŠ/左下", + "TAP right top/bottom": "ć‚æćƒƒćƒ—å³äøŠ/左下", "Font": "ćƒ•ć‚©ćƒ³ćƒˆ", - "Mark Unread": "ćƒžćƒ¼ć‚Æćƒ»ć‚¢ćƒ³ćƒŖćƒ¼ćƒ‰", - "start&lap/reset, BTN1: EXIT": "ć‚¹ć‚æćƒ¼ćƒˆļ¼†ćƒ©ćƒƒćƒ—ļ¼†ćƒŖć‚»ćƒƒćƒˆć€BTN1:EXIT", + "Mark Unread": "ęœŖčŖ­ć«ć™ć‚‹", + "start&lap/reset, BTN1: EXIT": "ć‚¹ć‚æćƒ¼ćƒˆļ¼†ćƒ©ćƒƒćƒ—ļ¼†ćƒŖć‚»ćƒƒćƒˆć€BTN1ļ¼šēµ‚äŗ†", "App Source\nNot found": "ć‚¢ćƒ—ćƒŖć‚½ćƒ¼ć‚¹\n見つからない", - "Show clocks": "ę™‚čØˆć®č”Øē¤ŗ", - "STEPS": "ć‚¹ćƒ†ćƒƒćƒ—", + "Show clocks": "ę™‚čØˆć‚’č”Øē¤ŗć™ć‚‹", + "STEPS": "ę­©ę•°", "Vector font size": "ćƒ™ć‚Æć‚æćƒ¼ć®ćƒ•ć‚©ćƒ³ćƒˆć‚µć‚¤ć‚ŗ", "View Message": "ćƒ”ćƒƒć‚»ćƒ¼ć‚øć‚’č¦‹ć‚‹", "Are you sure": "ęœ¬å½“ć«ć„ć„ć®ļ¼Ÿ", - "Bluetooth": "ćƒ–ćƒ«ćƒ¼ćƒˆć‚„ćƒ¼ć‚¹", + "Bluetooth": "Bluetooth", "Unread timer": "ęœŖčŖ­ć®ć‚æć‚¤ćƒžćƒ¼", - "Delete all messages": "ć™ć¹ć¦ć®ćƒ”ćƒƒć‚»ćƒ¼ć‚øć®å‰Šé™¤", + "Delete all messages": "ć™ć¹ć¦ć®ćƒ”ćƒƒć‚»ćƒ¼ć‚øć‚’å‰Šé™¤ć™ć‚‹", "No Messages": "ćƒ”ćƒƒć‚»ćƒ¼ć‚øćŖć—", - "Record Run": "ćƒ¬ć‚³ćƒ¼ćƒ‰ćƒ»ćƒ©ćƒ³", + "Record Run": "ćƒ©ćƒ³ćƒ‹ćƒ³ć‚°ć‚’čØ˜éŒ²ć™ć‚‹", "Apps": "ć‚¢ćƒ—ćƒŖ", - "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", - "Delete All Messages": "å…Øćƒ”ćƒƒć‚»ćƒ¼ć‚øć®å‰Šé™¤", - "Vibration": "ęŒÆå‹•", - "Utils": "ćƒ¦ćƒ¼ćƒ†ć‚£ćƒ©ć‚¤ć‚¼ćƒ¼ć‚·ćƒ§ćƒ³", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:ć‚¹ć‚æćƒ¼ćƒˆļ¼†ćƒ©ćƒƒćƒ— 2:終了 3:ćƒŖć‚»ćƒƒćƒˆ", + "Delete All Messages": "ć™ć¹ć¦ć®ćƒ”ćƒƒć‚»ćƒ¼ć‚øć‚’å‰Šé™¤ć™ć‚‹", + "Vibration": "ćƒć‚¤ćƒ–ćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³", + "Utils": "ćƒ¦ćƒ¼ćƒ†ć‚£ćƒŖćƒ†ć‚£ćƒ¼", "Piezo": "ćƒ”ć‚Øć‚¾", "BLE": "BLE", - "Make Connectable": "ęŽ„ē¶šåÆčƒ½ć«ć™ć‚‹", + "Make Connectable": "ę¤œå‡ŗåÆčƒ½ć«ć™ć‚‹", "HID": "HID", - "Light BW": "ćƒ©ć‚¤ćƒˆBW", + "Light BW": "ćƒ©ć‚¤ćƒˆē™½é»’", "LCD": "LCD", "Background": "čƒŒę™Æ", - "Foreground": "ćƒ•ć‚©ć‚¢ć‚°ćƒ©ć‚¦ćƒ³ćƒ‰", + "Foreground": "å‰ę™Æ", "Programmable": "ćƒ—ćƒ­ć‚°ćƒ©ćƒ åÆčƒ½", "Customize": "ć‚«ć‚¹ć‚æćƒžć‚¤ć‚ŗ", - "Dark BW": "ćƒ€ćƒ¼ć‚ÆBW", + "Dark BW": "ćƒ€ćƒ¼ć‚Æē™½é»’", "Background 2": "čƒŒę™Æ2", - "Quiet Mode": "ć‚ÆćƒÆć‚¤ć‚Øćƒƒćƒˆćƒ¢ćƒ¼ćƒ‰", - "Highlight FG": "ćƒć‚¤ćƒ©ć‚¤ćƒˆFG", - "Foreground 2": "ćƒ•ć‚©ć‚¢ć‚°ćƒ©ć‚¦ćƒ³ćƒ‰2", + "Quiet Mode": "ć‚µć‚¤ćƒ¬ćƒ³ćƒˆćƒ¢ćƒ¼ćƒ‰", + "Highlight FG": "ćƒć‚¤ćƒ©ć‚¤ćƒˆå‰ę™Æ", + "Foreground 2": "å‰ę™Æ2", "Remove": "削除", "Passkey BETA": "Passkey BETA", "Add Device": "ćƒ‡ćƒć‚¤ć‚¹ć®čæ½åŠ ", - "LCD Timeout": "LCDć‚æć‚¤ćƒ ć‚¢ć‚¦ćƒˆ", - "Highlight BG": "ćƒć‚¤ćƒ©ć‚¤ćƒˆBG", - "LCD Brightness": "ę¶²ę™¶ćƒ‡ć‚£ć‚¹ćƒ—ćƒ¬ć‚¤ć®ę˜Žć‚‹ć•", - "Connect device\nto add to\nwhitelist": "ęŽ„ē¶šę©Ÿå™Ø\nć«čæ½åŠ ć—ć¾ć™ć€‚\nćƒ›ćƒÆć‚¤ćƒˆćƒŖć‚¹ćƒˆ", - "Wake on BTN3": "Wake on BTN3", - "Wake on BTN2": "Wake on BTN2", - "Time Zone": "ć‚æć‚¤ćƒ ć‚¾ćƒ¼ćƒ³", - "Wake on Touch": "ć‚¦ć‚§ć‚¤ć‚Æć‚Ŗćƒ³ć‚æćƒƒćƒ", + "LCD Timeout": "ē”»é¢ę¶ˆēÆ", + "Highlight BG": "ćƒć‚¤ćƒ©ć‚¤ćƒˆčƒŒę™Æ", + "LCD Brightness": "ę˜Žć‚‹ć•ć®ćƒ¬ćƒ™ćƒ«", + "Connect device\nto add to\nwhitelist": "ćƒ‡ćƒć‚¤ć‚¹ć‚’ęŽ„ē¶šć—ć¦\nćƒ›ćƒÆć‚¤ćƒˆćƒŖć‚¹ćƒˆć«\nčæ½åŠ ć™ć‚‹", + "Wake on BTN3": "BTN3ć«ć‚¹ćƒŖćƒ¼ćƒ—č§£é™¤", + "Wake on BTN2": "BTN2ć«ć‚¹ćƒŖćƒ¼ćƒ—č§£é™¤", + "Time Zone": "時間帯", + "Wake on Touch": "ć‚æćƒƒćƒć«ć‚¹ćƒŖćƒ¼ćƒ—č§£é™¤", "Twist Timeout": "ćƒ„ć‚¤ć‚¹ćƒˆć‚æć‚¤ćƒ ć‚¢ć‚¦ćƒˆ", - "Wake on Twist": "ć‚¦ć‚§ć‚¤ć‚Æć‚Ŗćƒ³ćƒ„ć‚¤ć‚¹ćƒˆ", - "Wake on BTN1": "Wake on BTN1", + "Wake on Twist": "ćƒ„ć‚¤ć‚¹ćƒˆć«ć‚¹ćƒŖćƒ¼ćƒ—č§£é™¤", + "Wake on BTN1": "BTN1ć«ć‚¹ćƒŖćƒ¼ćƒ—č§£é™¤", "Log": "惭悰", - "Wake on FaceUp": "Wake on FaceUp", - "Twist Max Y": "ćƒ„ć‚¤ć‚¹ćƒˆćƒžćƒƒć‚Æć‚¹Y", + "Wake on FaceUp": "ē›“é¢ć™ć‚‹ć«ć‚¹ćƒŖćƒ¼ćƒ—č§£é™¤", + "Twist Max Y": "ć­ć˜ć‚Œé™ē•ŒY", "Utilities": "ćƒ¦ćƒ¼ćƒ†ć‚£ćƒŖćƒ†ć‚£ćƒ¼", - "Clock Style": "ć‚Æćƒ­ćƒƒć‚Æć‚¹ć‚æć‚¤ćƒ«", + "Clock Style": "ę™‚čØˆć®ć‚¹ć‚æć‚¤ćƒ«", "Rewrite Settings": "ćƒŖćƒ©ć‚¤ćƒˆčØ­å®š", "Flatten Battery": "ćƒćƒƒćƒ†ćƒŖćƒ¼ć‚’å¹³ć‚‰ć«ć™ć‚‹", "Debug Info": "ćƒ‡ćƒćƒƒć‚°ęƒ…å ±", "Storage": "ć‚¹ćƒˆćƒ¬ćƒ¼ć‚ø", - "Reset Settings": "čØ­å®šć®ćƒŖć‚»ćƒƒćƒˆ", - "Twist Threshold": "ćƒ„ć‚¤ć‚¹ćƒˆćƒ»ć‚¹ćƒ¬ćƒƒć‚·ćƒ§ćƒ«ćƒ‰", + "Reset Settings": "čØ­å®šć‚’ćƒŖć‚»ćƒƒćƒˆ", + "Twist Threshold": "ć­ć˜ć‚Œé™ē•Œ", "Turn Off": "é›»ęŗć‚Ŗćƒ•", "Compact Storage": "ć‚³ćƒ³ćƒ‘ć‚ÆćƒˆćŖć‚¹ćƒˆćƒ¬ćƒ¼ć‚ø", - "Reset to Defaults": "åˆęœŸčØ­å®šćøć®ćƒŖć‚»ćƒƒćƒˆ", - "Second": "ć‚»ć‚«ćƒ³ćƒ‰", + "Reset to Defaults": "åˆęœŸčØ­å®šć«ćƒŖć‚»ćƒƒćƒˆ", + "Second": "ē§’", "Compacting...\nTakes approx\n1 minute": "ć‚³ćƒ³ćƒ‘ć‚Æćƒˆć«ć—ć¦...怂\n所要時間瓄\n1分", "Date": "ę—„ä»˜", "Minute": "分", - "Connectable": "ęŽ„ē¶šåÆčƒ½", - "Stay Connectable": "Stay Connectable", + "Connectable": "ę¤œå‡ŗåÆčƒ½", + "Stay Connectable": "ę¤œå‡ŗåÆčƒ½ć®ć¾ć¾?", "Hour": "Ꙃ間", - "No Clocks Found": "No Clock Found", + "No Clocks Found": "ę™‚čØˆćŒč¦‹ć¤ć‹ć‚Šć¾ć›ć‚“", "App Settings": "ć‚¢ćƒ—ćƒŖć®čØ­å®š", - "Flattening battery - this can take hours.\nLong-press button to cancel": "ćƒćƒƒćƒ†ćƒŖćƒ¼ć®ćƒ•ćƒ©ćƒƒćƒˆåŒ– - ć“ć‚Œć«ćÆę•°ę™‚é–“ć‹ć‹ć‚Šć¾ć™ć€‚\nćƒœć‚æćƒ³ć®é•·ęŠ¼ć—ć§ć‚­ćƒ£ćƒ³ć‚»ćƒ«", + "Flattening battery - this can take hours.\nLong-press button to cancel": "ćƒćƒƒćƒ†ćƒŖćƒ¼ć‚’å¹³ć‚‰ć«ć™ć‚‹ - ć“ć‚Œć«ćÆę•°ę™‚é–“ć‹ć‹ć‚Šć¾ć™ć€‚\nćƒœć‚æćƒ³ć®é•·ęŠ¼ć—ć§ć‚­ćƒ£ćƒ³ć‚»ćƒ«", "Month": "月", "OFF": "OFF", "Right": "右", "Widgets": "ć‚¦ć‚£ć‚øć‚§ćƒƒćƒˆ", "Left": "å·¦", - "Sort Order": "äø¦ć³ę›æćˆ", + "Sort Order": "äø¦ć¹ę›æćˆé †", "Side": "ć‚µć‚¤ćƒ‰", - "No app has settings": "čØ­å®šć®ćŖć„ć‚¢ćƒ—ćƒŖ", - "Sleep Phase Alarm": "ć‚¹ćƒŖćƒ¼ćƒ—ćƒ•ć‚§ćƒ¼ć‚ŗć‚¢ćƒ©ćƒ¼ćƒ ", + "No app has settings": "čØ­å®šćŒćŖć„ć‚¢ćƒ—ćƒŖ", + "Sleep Phase Alarm": "ć‚¹ćƒŖćƒ¼ćƒ—ćƒ•ć‚§ć‚¤ć‚ŗć‚¢ćƒ©ćƒ¼ćƒ ", "Invalid settings": "ē„”åŠ¹ćŖčØ­å®š", - "TIMER": "TIMER", + "TIMER": "ć‚æć‚¤ćƒžćƒ¼", "Reset All": "ć™ć¹ć¦ć‚’ćƒŖć‚»ćƒƒćƒˆ", "This will remove everything": "ć“ć‚Œć«ć‚ˆć‚Šć€ć™ć¹ć¦ć®ć‚‚ć®ćŒå‰Šé™¤ć•ć‚Œć¾ć™ć€‚", "Alarm": "ć‚¢ćƒ©ćƒ¼ćƒ ", - "on": "恧", + "on": "on", "Minutes": "分", "Reset all widgets": "å…Øć‚¦ć‚£ć‚øć‚§ćƒƒćƒˆć®ćƒŖć‚»ćƒƒćƒˆ", "Hours": "Ꙃ間", @@ -130,33 +130,33 @@ "Beep": "ćƒ“ćƒ¼ćƒ—", "Message": "ćƒ”ćƒƒć‚»ćƒ¼ć‚ø", "System": "ć‚·ć‚¹ćƒ†ćƒ ", - "Select Clock": "ć‚»ćƒ¬ć‚Æćƒˆć‚Æćƒ­ćƒƒć‚Æ", - "Locale": "ćƒ­ć‚±ćƒ¼ćƒ«", - "Vibrate": "ęŒÆå‹•", + "Select Clock": "ę™‚čØˆć‚’éøęŠžć™ć‚‹", + "Locale": "地域", + "Vibrate": "ćƒć‚¤ćƒ–ćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³", "Alerts": "ć‚¢ćƒ©ćƒ¼ćƒˆ", "Whitelist": "ćƒ›ćƒÆć‚¤ćƒˆćƒŖć‚¹ćƒˆ", - "Set Time": "ć‚»ćƒƒćƒˆę™‚é–“", - "Disable": "Disable", + "Set Time": "ę™‚é–“ć‚’čØ­å®šć™ć‚‹", + "Disable": "ē„”åŠ¹", "BACK": "BACK", "ALARM": "ALARM", "Timer": "ć‚æć‚¤ćƒžćƒ¼", "Error in settings": "čØ­å®šć®ć‚Øćƒ©ćƒ¼", "Factory Reset": "ćƒ•ć‚”ć‚ÆćƒˆćƒŖćƒ¼ćƒŖć‚»ćƒƒćƒˆ", "Sleep": "ē”ēœ ", - "Connected": "ć‚³ćƒć‚Æćƒ†ćƒƒćƒ‰", + "Connected": "ē›“ęŽ„ęŽ„ē¶šć—ćŸ", "Messages": "ćƒ”ćƒƒć‚»ćƒ¼ć‚ø", "Hide": "隠恙", - "Show": "ć‚·ćƒ§ćƒ¼", + "Show": "蔨す", "On": "ć‚Ŗćƒ³", "Ok": "OK", "No": "恄恄恈", "Settings": "設定", - "steps": "ć‚¹ćƒ†ćƒƒćƒ—", + "steps": "ę­©ę•°", "back": "ćƒćƒƒć‚Æ", - "Steps": "ć‚¹ćƒ†ćƒƒćƒ—", + "Steps": "ę­©ę•°", "Year": "幓", - "Yes": "はい。", - "Loading": "ćƒ­ćƒ¼ćƒ‡ć‚£ćƒ³ć‚°", + "Yes": "はい", + "Loading": "読み込み中", "Music": "音愽", "color": "ć‚«ćƒ©ćƒ¼", "off": "ć‚Ŗćƒ•", From 8b484f32abd174a1f38e519a29d37ad2bd9fdfc9 Mon Sep 17 00:00:00 2001 From: Kevin Whitaker Date: Sat, 25 Mar 2023 17:31:16 -0400 Subject: [PATCH 85/89] Added custom new clock: NES Clock --- apps/nesclock/ChangeLog | 1 + apps/nesclock/README.md | 8 + apps/nesclock/app-icon.js | 1 + apps/nesclock/app.js | 245 ++++++++++++++++++++++++++++ apps/nesclock/app.png | Bin 0 -> 1219 bytes apps/nesclock/kirby-screenshot.png | Bin 0 -> 5490 bytes apps/nesclock/mario1-screenshot.png | Bin 0 -> 4431 bytes apps/nesclock/mario2-screenshot.png | Bin 0 -> 5513 bytes apps/nesclock/mario3-screenshot.png | Bin 0 -> 5093 bytes apps/nesclock/metadata.json | 20 +++ apps/nesclock/settings.js | 37 +++++ apps/nesclock/zelda-screenshot.png | Bin 0 -> 6003 bytes 12 files changed, 312 insertions(+) create mode 100644 apps/nesclock/ChangeLog create mode 100644 apps/nesclock/README.md create mode 100644 apps/nesclock/app-icon.js create mode 100644 apps/nesclock/app.js create mode 100644 apps/nesclock/app.png create mode 100644 apps/nesclock/kirby-screenshot.png create mode 100644 apps/nesclock/mario1-screenshot.png create mode 100644 apps/nesclock/mario2-screenshot.png create mode 100644 apps/nesclock/mario3-screenshot.png create mode 100644 apps/nesclock/metadata.json create mode 100644 apps/nesclock/settings.js create mode 100644 apps/nesclock/zelda-screenshot.png diff --git a/apps/nesclock/ChangeLog b/apps/nesclock/ChangeLog new file mode 100644 index 000000000..f561b877f --- /dev/null +++ b/apps/nesclock/ChangeLog @@ -0,0 +1 @@ +0.01: First release of clock with faces for mario1-3, kirby, and zelda diff --git a/apps/nesclock/README.md b/apps/nesclock/README.md new file mode 100644 index 000000000..6b6ae9167 --- /dev/null +++ b/apps/nesclock/README.md @@ -0,0 +1,8 @@ +# NES Themed Clock + +NES Clock is a clock face that can display multiple themes based on a few NES(Nintendo Entertainment System) game title screens. + +This clock has the same base clock features as Anton Clock, but can be configured in settings to change the clock theme. + +## Compatibility +This clock was built for Bangle.js 2. It was inteded to be run with widgets. diff --git a/apps/nesclock/app-icon.js b/apps/nesclock/app-icon.js new file mode 100644 index 000000000..d857ec7ee --- /dev/null +++ b/apps/nesclock/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwhC/AH4A/AH4A4/4A/AA8zACn/+cRAAsSkQAEkIOGn4XfABwXDiUzmQvUichkYXVAIRHSkczC4MzE4IvFC5UxA4cxI6IXFF7DnFkJSBmRYBCQJfIifzmYLBAQMxifd6cj7oXEDAKpCAQPxAQIOBj4XDloXGU4gvJmYvHd4pfGBgRYBHwIXDAAqPQAAq/P/5UBAAv/AAgMGCwIAXgAA/AH4A/AH4A2")) diff --git a/apps/nesclock/app.js b/apps/nesclock/app.js new file mode 100644 index 000000000..745831178 --- /dev/null +++ b/apps/nesclock/app.js @@ -0,0 +1,245 @@ +Graphics.prototype.setFontMarioBrosDS = function() { + // Actual height 60 (59 - 0) + return this.setFontCustom( + E.toString(require('heatshrink').decompress(atob('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'))), + 32, + atob("ExMeMS01MQ8aGhcpDykXIi0aLSk1LTExMTEPDxomGjExLS0tLSktMS0aLSktNS0xMTUtMS0tNTUxMS0aIho="), + 60|65536 + ); +}; + +Graphics.prototype.setFontSuperPlumberBrothers = function() { + // Actual height 18 (17 - 0) + return this.setFontCustom( + E.toString(require('heatshrink').decompress(atob('ABU//4AEBAUAh/AB4X8BA974E//EP/0D/+A//gBAwRBj3wDAX/z8/+//jkz//8/3/j+fFIMPgEf4F/+P/4//9//3/8h/ggYRCKAYRB/+P//j/v4/0AjgyBKAMDHIYABg5tF/AKCgeAJIIACJQJxBgE2IYOAEYMBCwM+gEMCwIABnhVCOgwIBKIQ8EvAkCA4YcDCYgIIAAUeLQIcECAPwj/8v6ZB/E/8EPwECcBHASYnz/4rCAQLyJwahB//DC4n3+BNBgH+j//w7ZBDwnf7/gB4JvBj/gj94HQhCCP4JcB/gHBn/94H/v4fBcARwBDQn3UoIAC/vndIKRBgP/cIPPBgP+XgSYBAAI4EuBQFv5QBFAI2B+/8jgVEIQI+BgfHwHxMwRXCBAT8BAAd8SgOAj3wh8eg+D4fACIU9YoN4gfegH3wAIICYMPwfB+PwEYMHDwP8ewTFCwEP8+/45TDCYLfCgBZB35wEQ4LXBAAaPC/iCBS4KPHgbxCCoYrBXAn8vCPGLIREECoOH//h/v4vxZCe4gVEJQJaCFAken/Hx/x8Y1BHxCsBY4w+HGwPP/vj/w+F/kHwA1EBAI+GBAcAj/AVIRdEAAI4BI4nAI4IPF4BHFCoIIBEYM8BgJXGLIQ2B//3BQoABBAJQHHwrOJCopcBG4yYBn/4h/+gKOCZxonBLIQjJAoX9JYQjB84HC44VD3/38/4B4KmIRYYABVQrJGMQhJBLQIVEBAIuCfQSTH9///asHDARCEjwoEJYYIBCIXAv4rE/+AI4UB//Dbgv8n/wTAR0G8ChD4AsCv7BBGoMHWYMfB4NAgEOOApHDA='))), + 32, + atob("BQQHCwcICAQFBQcJBAkECAcFBwcIBwcHBwcEBAcJBwcMBwcHBwcHBwcEBwcHCwcHBwkHBwcHBwsHBwcFCAU="), + 18|65536 + ); +}; + +Graphics.prototype.setFontKirbyClassic = function() { + // Actual height 16 (15 - 0) + return this.setFontCustom( + E.toString(require('heatshrink').decompress(atob('AC0P+cH/OABg88gEfA4kD8ARHoEDkUBz8A/8D/kB+Vgjfwj/gn1AjcggOQgAxGsEenEfxkI4Uf//ijGBx3A8/AgABBKQYBB4EEkECiHB/HAvPAgOAgeAg84g8/g0xwUQoEMsBZGnEAv0D2eD+HBzEgw0QoOImFsjkcgFPgE/wEcoEIkEAiH4DgKHCgInDv+A//w8Ec4EDNwsMgEjwFwCAKFBBwxaBOISaBgEwgEsgEyCYsQgEIgEEgECHoOAj/8g/+gBNCCAgAHGIQZBBAZdCA4NAD4QAGsBECXIc/gH4g/gWIJ6D4F/+F//k8n0cg8Px+H//B//ATwIUBhzcD/8H//H//hQ4LGCnE8EAM+j1/h1/EIPD/vg/nwhDYBXQMeGAOP2fHznj/3w//4IIMevjvEnjUCv8AvvA//8v/+n//CATxBSwMB4H9EYN4v88n+Ojvvh3/w8/wePMYUfcAP8j/+j/nh9zCAPBz/gRwISBuA+Bh0en8PMof/wLVBeIN4KYTeBQ4IBB4e88PcuBnBn4yBCoJpCgfwgf84J4B894vYSCh/8gf4cQUxwEY4DlF4Fj4ExBQ0BwB8BgBaBJANsgEzgEREIUMmEMjEGhgcFgEJTgOAgVAgI7ByEApEAkkAiQQGDowAB4OAsHAjFghlggUwgOYgHYbgTNBhx7BDQgJBIgMEjuCjnBxinCDAIAEfQP/wHAGIVH41n+cjjGRglIwUkv8Tv+YwFIsFgjlggbgCegMAn+Bbgf94F/8C2BgDjBh7gCKIP/8P/+DcBuecnfOj7rCwPvwAVBn+Av/wbQM+j0cg8Pg+H8/D+fA/LRCuAWB/whBh//w+B4fh8H/8E/IYJUDAYNwGgJUBIYXnnBDBnGOgECFAU4Kg+AnPAjjRD/0B//AGQPwvFwjk8v0ev8HL4MPwDNDEIN//hUBIZQpBCAZlBGQScBh/AgYQBnDsBCAX+h4lBVI8fPQP8j8/h0HU4KUBKwIQCGQJKCZAWAgOABwghB+EB/kD/0HAIP/4IQBj/4gEYaIRUCg4JB/4wBIYk/Z4UH/gfBOwWA8PAuHwCAP8h4yBD4JGDXQ874Ef4EH8EBFISUB4F/+BlBnEfjkH58H8///I/CPgLmCKgcP/+HnkD35WB8B2Bj0+gEGCwMB4eD/Ph/nx984uf8nn8h08CAKbEKgoyBZwKMCCAP/CAKaCgF4bg8D4CxBTgPAn/4WwRSCVIIQBJIQSCbgTJDgbRB/+An5DEv56ChkCh+Hw4uBAIKYDvxnBj0ACAJUBEYXgn/wIYN/gCIBjhlDgfDw/h54yD7k/h0eg8EgY5CKgP//n//1AgMggAMDMoRjBg4EBviiCAAUIgEkgETbwQTBAAQA=='))), + 32, + atob("CQcIDgsQDwQHBwkOBQYFBgoHCgkLCgkKCgkDBg4ODgkRCgoKCgkJCQsECQkHDAkKCgoLCAkICgwJCQkHBgc="), + 17|65536 + ); +}; + +Graphics.prototype.setFontKirbyClassicBig = function() { + // Actual height 58 (57 - 0) + return this.setFontCustom( + E.toString(require('heatshrink').decompress(atob('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'))), + 32, + atob("HhgcMiY5NQ4XFx4yExQTFCQZIyEoIyEjIyEKFDIyMiA8JCMjJCAfICYNHx4aKR4jIyMnHR8dIikfHyAXFBc="), + 60|65536 + ); +}; + + +Graphics.prototype.setFontZapf = function() { + // Actual height 56 (55 - 0) + return this.setFontCustom( + E.toString(require('heatshrink').decompress(atob('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'))), + 32, + atob("EhQVLiUwNQsXFx4yEhcSESUlJSUlJSUlJSUUFDIyMh47Ky8pMismLzQaGTInOi4uKy4vJSstKzsnKCgXERc="), + 60|65536 + ); +}; + +Graphics.prototype.setFontNES = function() { + // Actual height 12 (11 - 0) + return this.setFontCustom( + E.toString(require('heatshrink').decompress(atob('ACsPwH/3/7AQOA/AOFg/AvkHA4YFBwFwCAnh5//AAXh50cBBEAgeMplP/9Go98gIeCgfgkMCmce8EYg0Bx8xiERgHzg0ws3bs02sdt2YIBsEbgEwgZVFthTBJooAEkE/4xdBiEAwEWg0/4ANBgNghkD+EMAoIYCKAMQAQP/AogeBBwXwj8BEAQAKgeAnACKCo9wLpcHgfj8ANB/E/4f8sF2gdgm8DBATiBDIkzgcwm//v/3/6VDmBLCg9x+8fsf2ndn237v838c4CIUAgwyBg68B8duBwN3+9/sPgCIV4HYP4nOHzFxw44DgOAjBeB418u/Htk24YCCt/2/8HEYf+n/z/92eQL1Cs/2v8BCISOCAQNhBYIOB8F8g/ATQcDzg+CEAQCCBAU5agS9BvxlBCIlvv/nIILLIgeHnFzw4MHgMM8FAAwbsC4EkTgNGhkgCocCoEkARAOCCgNGDQMkEAM4EwJBFgFggx9B21gsxiBBwngv+H/F/8f/n/3/wICnwSDBYKwBuOGjFhw8YBAUP+CwCboaeMgH4n/j/1wu0DsE2gdwu8HmFgEYwOCsE3g8/4f8h5bCGpQCCsEwCI6NBAQqGCI4YsBI4ljs/2v9nNY4ZBDgVgBAV/CIQABKwhfHI4UAjkB+EfgALCAQIjDR4Q1EaAP+h/jz9w+8HEYkAHwjtBmACFEYzgB/EPwbyBLIoRIwE+CI0D/hlGLIk/LI9hw0YAQV/w/4FgIjIjdh20Pv/H/k/2AjIj1h81/v3398+NYUDw1+u/nfAc3sc3+d/gPgYojSCFIgIDB4UH/wLCTwp9DEYUH+BiCgfgj7dBR4IIBv4jDa4ngUJUHg99+/fTALFC/gICuFwLId8g/gvzuBHoV+BAN8B4UGg9h+0fs/2/dv2/jvk34dwR4QAB//4gOAiEAuBLBAIMHwEYgP/JQQ='))), + 32, + atob("DAwMDAgLDAwFBQYKDAwMBAwMDAwMDAwMDAwMBAoKCgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwFBAU="), + 12|65536 + ); +}; + +{ // must be inside our own scope here so that when we are unloaded everything disappears + // we also define functions using 'let fn = function() {..}' for the same reason. function decls are global +let drawTimeout; + +var bg_mario3 = { + width : 176, height : 165, bpp : 3, + transparent : 1, + buffer : require("heatshrink").decompress(atob("kmT0mQtMkyVImmSpMkjQCByUNAQNJgwLCwYLCoOkBAMg6QIBEDpBCwEJBYNAggLCgQsCgIsCgAgCgAgCLwIIBgESBAIgdIIXAgJKBsEANYMwgBrBzEANYNMgBrBk0ANYOTgBrCwEDFIIgdAwOAiAdBgEIDoMAgkYAYMChgDBgMGboWDAYVBwADBkHAAYIgdIIKkeYsZB/yV0gFAm3aRgMbtqtBhu2wEIg3bFgMDtuggUB23QgMA7dogGAtu0EDqDBgGQKYMApBTBBQMSAYMShIDBhMEbwMEwVAeQNBkDyBkGQCAIgdYv7FCIIQUCKAIgCCgRxBEAY1CNAIgCGoRoBIIQgcIIKRBAHpICIP5B/IIThBAALhBAAMQAYUIAYUEAYUCAYUBDwbiDEDxBBpgGBkMmD4WTD4VJCAMEknAD4MSsAfBhMwCAOEzADBoQgeIINJAX4C/AX4C/AX4C/AX4C/AQPtgAABk3EIPU8h//AAUDIPUD//MAgMP/kCIPFOj//n///18/+MIPFI//P//ypP/z/wIPX//n//pB+AAP5IPdOjnP5n//18/+MIPFJgf5n/ypMP/kCIPM8h0EY4UDH24CD9u2gEAk3Ea5XQB4MCthQ6yfASQX/+E5IPOQn/85IEB//AIPPh//zQQPn5/4a5QCux/8IAMkz/5/8EIPJAB5//75B+AAKD88PM/iDB8/P/HEIPGQn+T/4EB//AH2wCCyfA8FPYwPwnJB5yVO7dggECtg+4AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AVWTwEYHe/YgEA7BBD8PgiRB1pEJAYMAHYWT//8IO1CAwcCIPY2EkAECv8DIOucGwkhxKDBwGEQGYCByAGFhK/0AQh4GwJB/IPUnggJFwxB/IP5B8kgGGyBB/IP5B/IP5B/IP5B/IP5B/IP5BVu0AgE2H2GT2A1BII+TwQFBwEEIN+QiQDBgBBHCQdAIN+EAwcJIJVIKQRBsAwlAIJdiINs4IKFJgEAjhBrkIGEpBBLkBCBZFcJAwsEIJsAIP8AgIWGAUVOFQ0AQZ0xIP6EBIPkkIIUHINFIBhRBLgBB/IP5BD4hB/IP4ACghB/IP5B/IP5B/IP5BFIAZB8hICBoBB8wALDkBB7gQLEIP5B9iQLEwEAhxB3kALGgEAhJB/AAJB/AAOEIP8AjBB1gBBJBQxBvBw5ACgZBik9ggEBILMAiRBhkCECVZJBzhIGDE5BBQsRBgpAGEwBB6uBBegQHCp8AoQyKyehkYuH7AFDDYuQILlI/+IpMngEJgENwEAwEGBwMEkcApMmC4dJgAlDiQsFhJBc8fwIIMOhEf+E/8EP/AWC8dIsOchunmHCukA5OJIMw7BAoOOnhBHgnDgOAgUMmHAgOGAoMxkmcII0BQcEP4MAuE4/l+nArCgcBwI7BgHAwMBDoI3BIMsAhxBBgAvBAAMDAQIrCQYJBBgRBBwFAgeAnJBSG4gA7IP5BCyf/AHyDDv4HC4BNCj4HC+AHCg4HC/gHCgIgDMwYgcQYOAIP7FCIYIABn4LC8AHCh4HC/AHCgYHC/w9DEgYgcIP5B/IImSczwkDEDhB/IP5B/II2TAYOABgU/BYXgA4UPA4X4A4UDA4X+HoYkDEDhB/IP5B/IP5B/IP5B/IP5B/IP5BV4AGDAHUkyRA+IP5B/IP5B/IP5B/IP5B/ACA")) +}; + +var bg_mario1 = { + width : 176, height : 165, bpp : 3, + transparent : 1, + buffer : require("heatshrink").decompress(atob("kmSpIC/AX4C/AX4C/AX4C/AX4C/AX4C/ATE8z1P/mf/8n//P/4gU+V/n/+v4gB5IFBBwYmB5P/+fJ8///IjLEAU/IgIpCk5BU+f/MQN5n5BBngCBBweeOIJuB84jNIIIgBz1/IINPIKv/IKGTIIKJBYpqDBz6VBQa5BDYoYFBBwiDDYoIjNMQYjBcAPP/5BULIKkDXIM/+RBG//zIIP/OIIjKPQXkyaVD8mSvIREsJWDyVPJqQCWnn+ZAZcBp8/GouTkkEAoPnOIJQBMQ59CyZ0MAR38YodPboPPk4FBGoZBC+fP8iqB/jIJAoSeFQaxBRdgJBNp//ILi8CHwPJHweT57FGHwd5YtICQoAsrAX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AX4C/AREggEJIPtAH4OAghB8iQDByFAIPeQAYWAhBGCIPGEIIcJgRB6AYUggACBIPMhIIbDChJB4HIZBDwJB3pAJHyBB3oQJIghB2X4QJGoBB1yDPKJhICrwgMKgRB0AYUgBIkgQIMgF8MAU4WAhLxCggRHkIVG0gTBAoQaCILtC7ciGQNtyL7B23ICg4zDIIeg7aDCkmBIL82IIMJjZBBgmNIIOCCItIAYVAgAJC2HbthBCyBBg7NkwMbtmyoBBBrLyGoRBDBIeG7VEB4bdIAS2yrMtwNZlmW4Gsy1LsARFO4RBFy3bsgPDoBBdguS7dtyXJtu25Nk2wvBCImQDZGEPwtIKQYCYkMtHAI+BAQ1sgQ3FDY0lBIMMBAkCILcrHxBBDyQUDDZEl2mSCIIIDkBBapFbIJYCBpCVCIJOkyVMBYsJILNCHxYCC5DyBFpWApEEBAuBQbRBO4AUB7//4/+t//8f/m//+MGzcB/H/5v//l/83//0/+d//8f/O//+P/ggK/+b/4gS+VJg+QvMkwfInmSoPkj1JkHyh8kBwMHNQM8wfJkkeCIOSh4RBEH4gjgkAEAOCgAgCgAgCwAgCoAgCkEDEAMQgIgBhEAEEUH/xiC/4gC/+eEAP/54gBv/nEALmBEALmBMQTmDEEDF/EH8g+ALByF4BYIFBiQaBj0JDQMPggaBg+CDQOD4IsBoPgFgIgh/+B8jXB4Hya4PgNAMf+BoBh/4NAMH/gsBwf+FgL4BgfJEEPyv4gBvM/EAM8z/5MQNP/ggBk/+EAOT/4gB5P/WwX/EEWAgPAgFAgHggEggFwgEQgE4gEIgEcgEEgEOgECgEHgEBgEDwEAEEHf//H/1v//j/83//x/+b//4//N//8v/m//+n/zv//j/53//x/8EEHySQKkBSQPIcAKSBcAKzBcAIOBcAKzBUgKzBCIKzBCIIg/EEbUBEAOCgAgCgAgCwAgCoAgCkEDEAMQgIgBeoIgig/+MQX/EAX/zwgB//PEAN/84gBcwIgBcwJiCcwYggYv4g/kHwBYOQvALBAoMSDQMehIaBh8EDQMHwQaBwfBFgNB8AsBEEP/wPka4PA+TXB8BoBj/wNAMP/BoBg/8FgOD/wsBfAMD5Igh+V/EAN5n4gBnmf/JiBp/8EAMn/wgByf/EAPJ/62C/4giwEB4EAoEA8EAkEAuEAiEAnEAhEAjkAgkAh0AgUAg8AgMAgeAgAggA==")) +}; + +var bg_mario2 = { + width : 176, height : 165, bpp : 3, + transparent : 1, + buffer : require("heatshrink").decompress(atob("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")) +}; + +var bg_kirby = { + width : 176, height : 165, bpp : 3, + transparent : 2, + buffer : require("heatshrink").decompress(atob("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")) +}; + +var bg_zelda = { + width : 176, height : 165, bpp : 8, + transparent : 254, + buffer : require("heatshrink").decompress(atob("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")) +}; + +var settings = Object.assign({ + currentFace : "Mario 3" +}, require("Storage").readJSON("nesclock.json", true) || {}); + +let currentFace = {}; + +if (settings.currentFace == "Mario 3") { + currentFace = {'fontFace': "MarioBrosDS", + 'dateFontFace': "NES", + 'clockScale': 1, + 'clockOffsetX': 0, + 'clockOffsetY': 0, + 'dateOffsetX': 0, + 'dateOffsetY': 48, + 'clockShadowOffsetX': 5, + 'clockShadowOffsetY': 5, + 'dateShadowOffsetX': 1, + 'dateShadowOffsetY': 1, + 'dateScale': 1, + 'clockColor': "#4299f4", + 'dateColor': "#ffffff", + 'bgColor': "#f5bf66", + 'bgImage': bg_mario3}; +} else if (settings.currentFace == "Mario 2") { + currentFace = {'fontFace': "SuperPlumberBrothers", + 'dateFontFace': "NES", + 'clockScale': 3, + 'clockOffsetX': 0, + 'clockOffsetY': -8, + 'dateOffsetX': 0, + 'dateOffsetY': 54, + 'clockShadowOffsetX': 3, + 'clockShadowOffsetY': 3, + 'dateShadowOffsetX': 1, + 'dateShadowOffsetY': 1, + 'dateScale': 1, + 'clockColor': "#ffffff", + 'dateColor': "#ffffff", + 'bgColor': "#9290ff", + 'bgImage': bg_mario2}; +} else if (settings.currentFace == "Mario 1") { + currentFace = {'fontFace': "SuperPlumberBrothers", + 'dateFontFace': "NES", + 'clockScale': 4, + 'clockOffsetX': 0, + 'clockOffsetY': -8, + 'dateOffsetX': 0, + 'dateOffsetY': 54, + 'clockShadowOffsetX': 3, + 'clockShadowOffsetY': 3, + 'dateShadowOffsetX': 1, + 'dateShadowOffsetY': 1, + 'dateScale': 1, + 'clockColor': "#aa4e00", + 'dateColor': "#ffffff", + 'bgColor': "#9290ff", + 'bgImage': bg_mario1}; +} else if (settings.currentFace == "Kirby") { + currentFace = {'fontFace': "KirbyClassicBig", + 'dateFontFace': "KirbyClassic", + 'clockScale': 1, + 'clockOffsetX': 0, + 'clockOffsetY': 0, + 'dateOffsetX': 0, + 'dateOffsetY': 54, + 'clockShadowOffsetX': 3, + 'clockShadowOffsetY': 3, + 'dateShadowOffsetX': 2, + 'dateShadowOffsetY': 2, + 'dateScale': 1, + 'clockColor': "#ff00ff", + 'dateColor': "#fe6ecc", + 'bgColor': "#ffffff", + 'bgImage': bg_kirby}; +} else if (settings.currentFace == "Zelda") { + currentFace = {'fontFace': "Zapf", + 'dateFontFace': "NES", + 'clockScale': 1, + 'clockOffsetX': 0, + 'clockOffsetY': -10, + 'dateOffsetX': 0, + 'dateOffsetY': 40, + 'clockShadowOffsetX': 3, + 'clockShadowOffsetY': 3, + 'dateShadowOffsetX': 2, + 'dateShadowOffsetY': 2, + 'dateScale': 1, + 'clockColor': "#994e00", + 'dateColor': "#0c9300", + 'bgColor': "#feccc5", + 'bgImage': bg_zelda}; +} + +// Actually draw the watch face +let draw = function() { + var x = g.getWidth() / 2; + var y = g.getHeight() / 2; + g.reset().clearRect(Bangle.appRect); // clear whole background (w/o widgets) + + //Set Background color for face + g.setColor(currentFace.bgColor); + g.fillRect(Bangle.appRect); + g.drawImage(currentFace.bgImage, 0, 24); + var date = new Date(); + var timeStr = require("locale").time(date, 1); // Hour and minute + var dateStr = require("locale").date(date, 0).toUpperCase()+"\n"+ + require("locale").dow(date, 0).toUpperCase(); + //shadows + g.setColor(0,0,0); + g.setFontAlign(0, 0).setFont(currentFace.fontFace, currentFace.clockScale).drawString(timeStr, x+currentFace.clockOffsetX+currentFace.clockShadowOffsetX, y+currentFace.clockOffsetY+currentFace.clockShadowOffsetY); + g.setFontAlign(0, 0).setFont(currentFace.dateFontFace, currentFace.dateScale).drawString(dateStr, x+currentFace.dateOffsetX+currentFace.dateShadowOffsetX, y+currentFace.dateOffsetY+currentFace.dateShadowOffsetY); + + //main text + g.setColor(currentFace.clockColor); + g.setFontAlign(0, 0).setFont(currentFace.fontFace, currentFace.clockScale).drawString(timeStr, x+currentFace.clockOffsetX, y+currentFace.clockOffsetY); + // Show date and day of week + g.setColor(currentFace.dateColor); + g.setFontAlign(0, 0).setFont(currentFace.dateFontFace, currentFace.dateScale).drawString(dateStr, x+currentFace.dateOffsetX, y+currentFace.dateOffsetY); + + + + // queue next draw + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +}; + +// Show launcher when middle button pressed +Bangle.setUI({ + mode : "clock", + remove : function() { + // Called to unload all of the clock app + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + currentFace = undefined; + delete Graphics.prototype.setFontMarioBrosDS; + delete Graphics.prototype.setFontSuperPlumberBrothers; + delete Graphics.prototype.setFontKirbyClassic; + delete Graphics.prototype.setFontKirbyClassicBig; + delete Graphics.prototype.setFontZapf; + delete Graphics.prototype.setFontNES; + }}); +// Load widgets +Bangle.loadWidgets(); +draw(); +setTimeout(Bangle.drawWidgets,0); +} + diff --git a/apps/nesclock/app.png b/apps/nesclock/app.png new file mode 100644 index 0000000000000000000000000000000000000000..2c6857fe3ffebda90bfae6555d6d69a767c485ac GIT binary patch literal 1219 zcmV;!1U&nRP)LUl6on@9!jAL?z-!478ay}y1Plvj&s>FGrMQz%=~-Uo!Qly-S*5DCY;aH z;eURY@9+FCzyARj7Z(>77Z(?o+ZNFu&wV6>vglR|X#^?D7sNn3Uk1dj7SkY7;r0~| zAT$8Wvgkb3iEY~rMKKI7n#beF$1WDJtdWNDX`05$)hjU!0}bH!bHDNB(JvYb1`wM) zho)fIkx$mlaD6b|aL!OD$kOG@Pyov1a>IcD?4pg7a@zJ%O6+1|vt6O0S({OmF*4~S z`CQhKPqA3|H&Rbsz?};h(E3m-9^HdoEOPR@lU%%TvBs`BI*V{~#8Ki*Iz>8}aHh5n zQx>ps(?&jg_kBz=OCaFq`4?ZHedq2PJ4JDRkTv2{kExfCl=S!Y1CUOoDA}dDX6aOt zk>O!SiAP49*-u7I0Sgu`Wc{P-@p`?es#@c)?e*g5Sse?8LbUH~ulfM!1AT}}XHBP2 zhcX}~djI9o_<-Jb>1L_*3ji=p6Vo(N6a__5D3{9!A<#69M54C&RAzN++g9RZ`^WG1 z6N!vAw`ZPhBcIO$FlWx}8+-tUTb5w|(v6l$F}(O5>_`j}334kRAkgsx((5CC?+WBM z-%qcA3a2}|*!9M4EXzVSbb8P9Ok&qL`Y>S=ZwiJnL>6s9TU>^iL|3fB{jU#BaY ztG|?4)5Mlu9vjHGz!u^bfP)@h z-JbJ6lt2%nOAHK6kd9VrdMpO+==eKDvrN1Id}j#OSj|1q8o-;pG7W96HWj!SxVww{ z4}j*nmv#%l{R6W`=;(n3;Ev8+qC*~#nD~|)c%=}bn5|Ax54?2;b|Vp6wpdtcL8{w zuuh|?s|vwcH8FtKWu9qZ+ELL3;Ev8+qN_b%p4cq_SNnJgc+vwk0DegCbr<3x$KN@u z$-GIK1>ifwvc_uefdGJ;>kt&UHgQ46job}p-UhG%@gFu}ZUE=!_-|WB-fUaL2{$i*xl1S-h`G-x zHFRWCQE#@bsiQvcm`<5OXm7@%o0L%*`^~mB2Ja?rZU9Rkr%S)LUI8Bw#MX!RX0~ks z`0#*~4oHBtfZoBeVUcgPE$kGz<9ir5*@$d@M$U&d-DbCK0oY(*3Sucmm=(Z#(svj+ zqiqYoAb>4LSs<|b_k3QfTW$ZIwsnv_cM6dlLUUYeb2f62X&(P3+ZKQc18@JUmCa^c zX0<$b<-o-hn2&)qhRSn9j-Baqi>W&>hAQ&SwsrF5Tmbek&};yHvu&NgyYtaBCvixC zxl&p*&FJX#avjWmW337vmbPTwX=A6c<^V7U-tBi>fY75@&xGjY{9WvuZR_c`v>lp) zfsx|A_1Pm0>`yY)n{8VFCRGOuXej&ARKt?nGZ1J=Z${gC`t3CgOr3<>hnNw-T!ls2 zsOD{-oSX~5gn_vYS&frW_Ny7g>f0+9AHg=u_6E=A*u;6+$8tY(I?V;(+$NN1qQJoX*QeE+ZENhYc>zordB%GW zS}+k1|08*>>ZWiV7;$jp*~W@P>!^3=(t3=UY13a_?@Y|~bQ=#fcWs!}hwil_aq_hQa4&t|!wQj`3R6|(+tbJ}c zqdkBv?^_00{nzucJWw0Y%KmWxCpWIQX2$~5-P+Jx_hvlQ0r+ii1m7L}H;kuk#E?ze ztqiQqHm(v80eFj`S|uB9^=L8fzb0bc*To3{cbv5e&jEMcH(mnKz zg7?$!@AJ=p>^Bb%p%#`y+p&u|t4%M{s`&SckC+pS1)jl8*-=m4H^h7^9h0ucF-N<7_7{apa|RJa(wV*o}$95h(ML*a8i7N zmA*d;jSj!}GXY!y*kYkD%V?S@odZ-0;Jp8tOS^WWN-&TRJN-lTRcooj_|*V*>dbT7 zPe`%(ZV29evb+_*9C$Z_y`XSyNGkHkA@u#yXZ4S`>NN&$J%Ae-EO{)-z#IG_R>2z}2Xn=cmpd#dK&!A0fb1em ztIC0MX-;4ux@wO2`@3EkQPYMBJ*xq%fY1c*T>x$zyEy?IaJB_v%Mlxht)I)ul-;}# z7XdI=2|#q+bKZ*8;u`|z@*VJr<#V?VmO$lsn-l_IxXq{@6#xww#j$E2STz8qfV4nd zt8Y<;v+f}T{DEL?ZUApAATVPO0H0}iHfF0Um?|KI;9DRPeG{mV6!{>jftmLr7J%jX z$OWn=fK_G)2Fd~>t(ihOZKq9?du*pqJS*t*49v0OzMS593U(@iEP7=d6cFyTfK$f_ zCX0ECT)OPwa>|+0gYkO}fSDap$Z=*sG^s&wnCzR4sip;p#X%kErY#>zO&^@&EdU4E zuzDst1NBq0>}cha6vS5h3$BBDO8WKyuV)3VjvF%Rk2dYA5DnR|$`KWy@UXAL*UE;W zUJ6&bYq}KWfKx6dpvaZW)c9jluV#4b=1JTI z92I_X;KlJA zJ!-yEWC3^shQnT#-5mWv9EO`M0N)ji$md-huM^SgL8}_>$N+ZlIW&UU=Jj+Zad(0D zk{Hv(OCg^M0G~@f74NiJ%rBjC!W1iXWWk#@sFW-uT}ivS0Q_VCJittCo%)Kk(SV$U zA&%9pE1(?yJS9CTMKk51e#>I90F2U%1Hj(vhlL7gAOWTu8NlWzb0wco31DX}6vZXl z&Qn{h1~95r5WxGM5O^W>nnfWy&2JBcfz|i_q@kF6cpe6R7{Ga8wB_`Ye?Fvhs~YQN zemK$?GY5A7l+|G|aE#(C7B0#|4*)*McIj)tZ zEC9y=EHRt;T?)t28`nT!H)@o>afka zr4Qc?0Q>_Tq*!%d5a3q;BeMWDgK6k+0^QAe>X0=ma(&&WM^uQ@?uh=?I$DD|Y$yPX z;EKw31DI0~IZCzimfSH8Clml~@Z}mSMqR+0ggR~a=-M5;H4N^pN1_pdDR$}tQ8Slj>tlg|Q}-$0TCsy(>5l-KDaY|uhz3V|gW+ST^P~r)9M=LdkQw;HNd@z#c$A43gpxz*dDJ`C|ci zU}Q|Bng&o1ygO0v4D8KC7KkT8%Al$?Iu!d|=Gg=`JmMSFZA-0@JOFIcEOpE4lsSES z2XIiorPzADJb-vWzYn|sjQDW1dC&v)g?3L3Z!z$Lq5L<8wgK$%%L1^+TdQpY57>2J zWDumThsarNmIs_3C;_|)@Rrr`L9M<{1y}Rs0nG!~GFob>fzXo^FW)Z@boPM%rOuV- zb`HrB@9}_M2d0un1+R7plU`Zj{`7b%Z=1%We{%k6IleVs8oyV&sJ}Y)lL0IZ+AGK1 zF1B;;a!J2GgLU+?`lsjgPp@+&Idpuq9XdX$f2($_^+)Y=w&Tla-UAHhpha_uF|yyY z-_9ld_7^7eNgy#L%1};5^^DJbrb=|9V#mcVH?}i3`n8w<`?swFgM+fovKfD71pBuj zz6_h*SSUZsd1c@dM8D@}21Mk#-fU3x3QDH z)V&4|VBawSEHP<-VKt`y1%C_n=iiU~C=(W6s?6kFKHN-l;Lzuv4nLfeIKAnc{r(HW zuU$Rb>s<=|dRq9NV(T8Lb~E zOQzk&%ow;hS2`FrUm;L=X1ku>pa6U{27tj_wE&yY56wj{f0>{o5FC@|%=ZKFkLeTR zU;YFFl$x9$L=hOBW#Ie+gE=!FDcODzTv;Kcl_csnhq-XmF#zmfV2HE%IQNnB*XX;1LwKzrtc+3|ILgucV_*;_^--uFf_4-V*uF8 zzzlQbOyXf`3OLAZOm3d{%Yk`et4wcK?tOyo$LMS>O{+Fcu6(hVw3lp1xpn?0yVro6 z*S66Z0Ip=Q{r&x!l`TRgv@%#-&vW%YJSJQ>zz;K3w%9w1S|12HTAR z;KmG`cF8n{<96pRCIR*27)#1EArM&OG7PPb=ar|d0FeG57$eQb0C2{@`AnCXi>q5w zX5n&AsZPsQH=InUF&|waTsfpw&7jp8g{iq*oU8tDewT9o1>haL@!an6HE=1%r1eo| zcMb)@Vy@3~sXk2W&S`$M7}v`Ai>iTPhg4 zjSl8E8M~_{^3LENa*JDDS$le7sNN3q-r2D9H%{cf>i2rV@jj@(3&6%Lu`_54Q?s|j zm=i*dF%bsl?gL9FXp+1d{n`7<_u=e1(&a>|PKkE`IAh>5*G&5>;a+Z@ld^XrD5EoP zdT=?gbW4nTM-E|T?rsNn$3lA(#dQax4p(yT>v`0-9r7U^q0RdMyo2~~3at{59Fm^- z7Y7<08Mycx-7~#W29D_eXzIX$_mY!kxR=@zAU6ZB=akGk))g;=D>+*ZzWu+m92Kq8 zvb*!n3@qIr{-q1QoSrhZcFT?HpVOk1|I&C;|K<|`j{WIi0jLR_8qf)2HvzDA6ic7w z#?t@JFPh|c9q4~^>k})NQ~|hmz_@#}^d7PJ7A~yaj zz_SWrF&O)<8oQ4`-Js}TiMUzrFj)^%L#qTr#=ODflz`2rKZfm6%93yb7E=`7<*(HXR zssuTkh+hC=>cE$j=4(Jvf2NFC_(rH#)2c}BUs_j==#Q>yCSzGn(UC=PEq`>icJ+*b31A9V*aS8=t2XYdx;UzI(vPfFQu*n>b{~w06RhH>U>>tlSDuwGY(+ul*Dly*eWvSNl-SBwP8ax zM@0;>nzwe6m2!0M;6^G%=3{Xulb+4rZTkV_;3B>GB7s19V`kq`e^Td)Hx3iM5uvM=s@|W87MMmeK=X;`%j#*%ZbZ`1DE!2Wf|SLCo<# z5d)0L(PCr9E!SFVAWa5~3ANl>>dTog9W8U9LK@8-^bpQrWOD<06%)m_? zzJ&Di09qFYLGJ^wr_jvhJ*e{i+_xl;-~j{&AkpCf_6*9U7eWp*f$)|t2`OO8!Q6`vcq74!~%jQ%q(8FuDO9(I&*-2tWt54F@onE7cIhhz_xI os(oJLuiCz~x?BBg^$Yg@KjpnPDJ9CBAOHXW07*qoM6N<$f|0>ipa1{> literal 0 HcmV?d00001 diff --git a/apps/nesclock/mario1-screenshot.png b/apps/nesclock/mario1-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..a8fc053b7c85b2e9660248574d972e5fef889a6b GIT binary patch literal 4431 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 Ax&QzG literal 0 HcmV?d00001 diff --git a/apps/nesclock/mario3-screenshot.png b/apps/nesclock/mario3-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..65a29f2603a57d8650c4c96e9954fe838a13bf37 GIT binary patch literal 5093 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 values[v], + min: 0, + max: values.length - 1, + wrap: true, + step: 1, + onchange: v => { + writer(values[v]); + writeSettings(); + } + }; + } + + function stringInSettings(name, values) { + return stringItems(settings[name], v => settings[name] = v, values); + } + + // Show the menu + E.showMenu({ + "" : { "title" : "NES Clock" }, + "< Back" : () => back(), + 'Game Theme': stringInSettings("currentFace", ["Mario 3", "Mario 2", "Mario 1", "Kirby", "Zelda"]), + }); +})(load); diff --git a/apps/nesclock/zelda-screenshot.png b/apps/nesclock/zelda-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..ab474f6469bf865f3308d6f1470ca04aa42b45a7 GIT binary patch literal 6003 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 hK?G9t9L+cK Date: Sat, 25 Mar 2023 17:38:15 -0400 Subject: [PATCH 86/89] disable emulator --- apps/nesclock/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/nesclock/metadata.json b/apps/nesclock/metadata.json index 9fdb3fc99..66f6ba722 100644 --- a/apps/nesclock/metadata.json +++ b/apps/nesclock/metadata.json @@ -10,7 +10,7 @@ "type": "clock", "tags": "clock", "supports": ["BANGLEJS2"], - "allow_emulator": true, + "allow_emulator": false, "storage": [ {"name":"nesclock.app.js","url":"app.js"}, {"name":"nesclock.settings.js","url":"settings.js"}, From 7e095a67f5a92c25b21e86ccb48e1dec63230c58 Mon Sep 17 00:00:00 2001 From: Kevin Whitaker Date: Sat, 25 Mar 2023 17:39:44 -0400 Subject: [PATCH 87/89] typo in nes clock --- apps/nesclock/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/nesclock/metadata.json b/apps/nesclock/metadata.json index 66f6ba722..68e861f92 100644 --- a/apps/nesclock/metadata.json +++ b/apps/nesclock/metadata.json @@ -1,7 +1,7 @@ { "id": "nesclock", "name": "NES Clock", - "shortName": "NES Clocl", + "shortName": "NES Clock", "version": "0.01", "description": "A clock themed after different NES title screens.", "readme":"README.md", From cc0ac4e3f566a9485fa8e73c53992e7ce2b8e3d6 Mon Sep 17 00:00:00 2001 From: Kevin Whitaker Date: Sat, 25 Mar 2023 17:46:41 -0400 Subject: [PATCH 88/89] fix setting screen --- apps/nesclock/settings.js | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/apps/nesclock/settings.js b/apps/nesclock/settings.js index 357c76464..0bbecc2ce 100644 --- a/apps/nesclock/settings.js +++ b/apps/nesclock/settings.js @@ -1,6 +1,5 @@ (function(back) { var FILE = "nesclock.json"; - // Load settings var settings = Object.assign({ currentFace: "Mario 3", }, require('Storage').readJSON(FILE, true) || {}); @@ -8,7 +7,8 @@ function writeSettings() { require('Storage').writeJSON(FILE, settings); } - + + // Helper method which uses int-based menu item for set of string values function stringItems(startvalue, writer, values) { return { value: (startvalue === undefined ? 0 : values.indexOf(startvalue)), @@ -22,16 +22,21 @@ writeSettings(); } }; - } - + } + + // Helper method which breaks string set settings down to local settings object function stringInSettings(name, values) { return stringItems(settings[name], v => settings[name] = v, values); } - // Show the menu - E.showMenu({ - "" : { "title" : "NES Clock" }, - "< Back" : () => back(), - 'Game Theme': stringInSettings("currentFace", ["Mario 3", "Mario 2", "Mario 1", "Kirby", "Zelda"]), - }); -})(load); + var mainmenu = { + "": { + "title": "NES Clock" + }, + "< Back": () => back(), + "Game Theme": stringInSettings("currentFace", ["Mario 3", "Mario 2", "Mario 1", "Kirby", "Zelda"]), + }; + + E.showMenu(mainmenu); + +}); From df79cacd90b6cdb434db7e7764361d375b37368d Mon Sep 17 00:00:00 2001 From: Kevin Whitaker Date: Mon, 27 Mar 2023 09:04:20 -0400 Subject: [PATCH 89/89] Small fix for font in nes clock --- apps/nesclock/ChangeLog | 1 + apps/nesclock/app.js | 8 ++++---- apps/nesclock/metadata.json | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/nesclock/ChangeLog b/apps/nesclock/ChangeLog index f561b877f..66eaaa21a 100644 --- a/apps/nesclock/ChangeLog +++ b/apps/nesclock/ChangeLog @@ -1 +1,2 @@ 0.01: First release of clock with faces for mario1-3, kirby, and zelda +0.02: Fix issue witih plumbers font where some numbers were cut off. diff --git a/apps/nesclock/app.js b/apps/nesclock/app.js index 745831178..c0cc3c0ce 100644 --- a/apps/nesclock/app.js +++ b/apps/nesclock/app.js @@ -9,12 +9,12 @@ Graphics.prototype.setFontMarioBrosDS = function() { }; Graphics.prototype.setFontSuperPlumberBrothers = function() { - // Actual height 18 (17 - 0) + // Actual height 20 (19 - 0) return this.setFontCustom( - E.toString(require('heatshrink').decompress(atob('ABU//4AEBAUAh/AB4X8BA974E//EP/0D/+A//gBAwRBj3wDAX/z8/+//jkz//8/3/j+fFIMPgEf4F/+P/4//9//3/8h/ggYRCKAYRB/+P//j/v4/0AjgyBKAMDHIYABg5tF/AKCgeAJIIACJQJxBgE2IYOAEYMBCwM+gEMCwIABnhVCOgwIBKIQ8EvAkCA4YcDCYgIIAAUeLQIcECAPwj/8v6ZB/E/8EPwECcBHASYnz/4rCAQLyJwahB//DC4n3+BNBgH+j//w7ZBDwnf7/gB4JvBj/gj94HQhCCP4JcB/gHBn/94H/v4fBcARwBDQn3UoIAC/vndIKRBgP/cIPPBgP+XgSYBAAI4EuBQFv5QBFAI2B+/8jgVEIQI+BgfHwHxMwRXCBAT8BAAd8SgOAj3wh8eg+D4fACIU9YoN4gfegH3wAIICYMPwfB+PwEYMHDwP8ewTFCwEP8+/45TDCYLfCgBZB35wEQ4LXBAAaPC/iCBS4KPHgbxCCoYrBXAn8vCPGLIREECoOH//h/v4vxZCe4gVEJQJaCFAken/Hx/x8Y1BHxCsBY4w+HGwPP/vj/w+F/kHwA1EBAI+GBAcAj/AVIRdEAAI4BI4nAI4IPF4BHFCoIIBEYM8BgJXGLIQ2B//3BQoABBAJQHHwrOJCopcBG4yYBn/4h/+gKOCZxonBLIQjJAoX9JYQjB84HC44VD3/38/4B4KmIRYYABVQrJGMQhJBLQIVEBAIuCfQSTH9///asHDARCEjwoEJYYIBCIXAv4rE/+AI4UB//Dbgv8n/wTAR0G8ChD4AsCv7BBGoMHWYMfB4NAgEOOApHDA='))), + E.toString(require('heatshrink').decompress(atob('ABcP//v//+/4EBBIXAgH8AgYJLgfegE98AiBgH/+AECBJYYCAAMB/8/n/z+f/3/8nEzIIM/7/x/gZBGwMAn/wn//v4BC54BC4H/wEPwEA+AWBv+/MwIADhwCBH4PwDoMP8AVDNBMHDogABCgQABAgIjBAAX3AQKBCmBQBBwItB/wiBAgIJBgcQEAwEDRYgyCBwyRDEYMfwEB/AIEjwESEQoKHJwKrBVIqnB4CnCAIIACBwKpFQYodCFQRQBBgqQDEQb4BG4Uf/8HFIP4//+h9/wDgDh/vawLbChw2G342CgIXBv6PB+AmBUgLdGU4RKB/P8/+f//5//zwH/n4EBCgMf/j+DCYIADCYW///7fIOfCYQrBToIgBAIIABT4vAHYQnKAAf3BwITDngyCG4PwnATJgPh8EejwECBIsfwPhYIIABewMDSAWAh98gPj8E8j8HwATCg+egF58AERDAXA/E+j8B+fgh5MBGII2CHYITCAwL/Bh/zc4P+MoL5BE4JTDSA/xfgN/x/3DAN/94ECj4dBEQXgDQMDF4N/fQ0AEAIADBwJEBIoIAGh8PCYzaCAgI0BE4gTBAIJMCh67CE44TCE4oTKHYPwEoIEDJ5ZkB+ASBAgSYCJ5P8BQPH/98v47JEYIJICZIyCOQQuCBIJtFYAQxeCgJqBAgrlJDoXzBJDvHDpYTJd5DbRBIJxBDIN/4DHMHZByFFhRUJ5/v/gKBGAMOFgIPB+4DBn5UCF4gsHHIgODKgjqOx//HgQTGBIWAE54dJGI4AEVQIJICYXAh/+BwS+CAAQJCYQfwg//gf/+IhE/ABBh/8XpaNDh5pBGwQCBWQICCgE/DoM/CYMQXAgkIA='))), 32, - atob("BQQHCwcICAQFBQcJBAkECAcFBwcIBwcHBwcEBAcJBwcMBwcHBwcHBwcEBwcHCwcHBwkHBwcHBwsHBwcFCAU="), - 18|65536 + atob("BQQIDAgJCQQFBQgKBAoECQgGCAgJCAgICAgEBAgKCAgNCAgICAgICAgECAgIDAgICAoICAgICAwICAgFCQU="), + 20|65536 ); }; diff --git a/apps/nesclock/metadata.json b/apps/nesclock/metadata.json index 68e861f92..bb7613677 100644 --- a/apps/nesclock/metadata.json +++ b/apps/nesclock/metadata.json @@ -2,7 +2,7 @@ "id": "nesclock", "name": "NES Clock", "shortName": "NES Clock", - "version": "0.01", + "version": "0.02", "description": "A clock themed after different NES title screens.", "readme":"README.md", "icon": "app.png",