; Quick Settings Timer/Chrono/Alarm
; Adds a countdown timer, stopwatch, and alarm system to the quick settings panel
; Timer state lives in Values.timerManager so it persists across menu opens/closes

AFFECT [[1658694193319203921]]
    TRAVERSE [[6502786168]]
        LOCATE AFTER ALL
        INSERT {
            property alias timerManager: _timerManager

            ~&6502786168&~ {
                ~&5972374&~: _timerManager
                property bool timerMode: ~&6504329801&~
                property ~&197088788&~ totalMs: 0
                property ~&197088788&~ remainMs: 0
                property bool isRunning: ~&214625660372&~
                property ~&7083178290016&~ ~&478322454160073828&~: "00:00"
                property bool ~&16765420033347753489&~: ~&214625660372&~
                property ~&197088788&~ presetMs: 60000
                property bool addMode: ~&6504329801&~
                property bool blinkLightOnNotification: ~&214625660372&~
                property ~&197102514&~ _blinkLight: ~&6504117156&~
                property bool hasFrontlight: ~&214625660372&~

                /* Alarm state*/
                property bool alarmMode: ~&214625660372&~
                property ~&197102514&~ alarms: []
                property ~&197088788&~ nextAlarmId: 1
                property ~&7083178290016&~ alarmNotificationText: ""
                property ~&197088788&~ lastNotifiedMinute: -1 /* absolute epoch-minute of the last fired alarm*/

                function fmt(ms) {
                    ~&197102514&~ ~&180970&~ = ~&6502909715&~.~&197079679&~(ms);
                    ~&197102514&~ ~&180977&~ = ~&6502909715&~.~&214626058827&~(~&180970&~ / 3600000);
                    ~&197102514&~ m = ~&6502909715&~.~&214626058827&~((~&180970&~ % 3600000) / 60000);
                    ~&197102514&~ ~&180988&~ = ~&6502909715&~.~&214626058827&~((~&180970&~ % 60000) / 1000);
                    ~&197102514&~ mm = m.~&7713616118928163&~().~&7713428190834284&~(2, ~&'180921&~);
                    ~&197102514&~ ss = ~&180988&~.~&7713616118928163&~().~&7713428190834284&~(2, ~&'180921&~);
                    ~&5972376&~ (~&180977&~ > 0) {
                        ~&7083121450889&~ ~&180977&~.~&7713616118928163&~().~&7713428190834284&~(2, ~&'180921&~) + ~&"180931&~ + mm + ~&"180931&~ + ss;
                    }
                    ~&7083121450889&~ mm + ~&"180931&~ + ss;
                }

                function refresh() {
                    ~&5972376&~ (_timerManager.alarmMode) ~&7083121450889&~;
                    ~&5972376&~ (_timerManager.timerMode) {
                        _timerManager.~&478322454160073828&~ = _timerManager.fmt(_timerManager.remainMs > 0 ? _timerManager.remainMs : 0);
                    } ~&6503784146&~ {
                        _timerManager.~&478322454160073828&~ = _timerManager.fmt(_timerManager.totalMs);
                    }
                }

                function go() {
                    ~&5972376&~ (_timerManager.timerMode) {
                        ~&5972376&~ (_timerManager.remainMs <= 0) ~&7083121450889&~;
                    }
                    _timerManager.~&16765420033347753489&~ = ~&214625660372&~;
                    _timerManager.isRunning = ~&6504329801&~;
                    _tick.~&214641748151&~();
                }

                function ~&6504295855&~() {
                    _timerManager.isRunning = ~&214625660372&~;
                    _tick.~&6504295855&~();
                }

                function doReset() {
                    _timerManager.~&6504295855&~();
                    _timerManager.~&16765420033347753489&~ = ~&214625660372&~;
                    ~&5972376&~ (_timerManager.timerMode) {
                        _timerManager.remainMs = _timerManager.totalMs;
                    } ~&6503784146&~ {
                        _timerManager.totalMs = 0;
                    }
                    _timerManager.refresh();
                }

                /* Alarm management*/
                function addAlarm(~&180977&~, m) {
                    ~&197102514&~ ~&180970&~ = { ~&5972374&~: _timerManager.nextAlarmId, hour: ~&180977&~, minute: m, ~&233726547792244&~: ~&6504329801&~ };
                    _timerManager.alarms = _timerManager.alarms.~&7082546043425&~([~&180970&~]);
                    _timerManager.nextAlarmId++;
                    _timerManager.saveAlarms();
                }

                function removeAlarm(~&5972374&~) {
                    _timerManager.alarms = _timerManager.alarms.~&7082656280847&~(function(~&180970&~) {
                        ~&7083121450889&~ ~&180970&~.~&5972374&~ !== ~&5972374&~;
                    });
                    _timerManager.saveAlarms();
                }

                function toggleAlarm(~&5972374&~) {
                    _timerManager.alarms = _timerManager.alarms.~&197092711&~(function(~&180970&~) {
                        ~&5972376&~ (~&180970&~.~&5972374&~ !== ~&5972374&~) ~&7083121450889&~ ~&180970&~;
                        ~&7083121450889&~ { ~&5972374&~: ~&180970&~.~&5972374&~, hour: ~&180970&~.hour, minute: ~&180970&~.minute, ~&233726547792244&~: !~&180970&~.~&233726547792244&~ };
                    });
                    _timerManager.saveAlarms();
                }

                function dismissAlarmNotification() {
                    _timerManager.~&16765420033347753489&~ = ~&214625660372&~;
                    _timerManager.alarmNotificationText = "";
                }

                function saveAlarms() {
                    ~&197102514&~ payload = {
                        alarms: _timerManager.alarms,
                        nextAlarmId: _timerManager.nextAlarmId,
                        blinkLightOnNotification: _timerManager.blinkLightOnNotification
                    };
                    ~&197102514&~ xhr =     new     XMLHttpRequest();
                    xhr.~&6504147419&~("PUT", "file:///home/root/alarms.json");
                    xhr.~&6504279475&~(~&6502785411&~.~&254548178208422824&~(payload));
                }

                function loadAlarms() {
                    ~&197102514&~ xhr =     new     XMLHttpRequest();
                    xhr.~&6504147419&~("GET", "file:///home/root/alarms.json");
                    xhr.onreadystatechange = function() {
                        ~&5972376&~ (xhr.readyState === XMLHttpRequest.DONE) {
                            try {
                                ~&197102514&~ ~&6503736259&~ = ~&6502785411&~.parse(xhr.responseText);
                                _timerManager.alarms = ~&6503736259&~.alarms || [];
                                _timerManager.nextAlarmId = ~&6503736259&~.nextAlarmId || 1;
                                _timerManager.blinkLightOnNotification = ~&6503736259&~.blinkLightOnNotification || ~&214625660372&~;
                            } catch (e) {
                                _timerManager.alarms = [];
                                _timerManager.nextAlarmId = 1;
                            }
                        }
                    };
                    xhr.~&6504279475&~();
                }

                ~&214604601930&~ {
                    ~&5972374&~: _alarmChecker
                    ~&7713147298280334&~: 5000
                    ~&7083121289162&~: ~&6504329801&~
                    ~&233743626668842&~: ~&6504329801&~
                    ~&495358363329399331&~: {
                        ~&197102514&~ d =     new     ~&6502586279&~();
                        /* Use an absolute epoch-minute (not hour*60+minute) so that a recurring*/
                        /* alarm can fire again on the next day instead of being permanently*/
                        /* suppressed once it has matched lastNotifiedMinute.*/
                        ~&197102514&~ nowMinute = ~&6502909715&~.~&214626058827&~(d.getTime() / 60000);
                        ~&5972376&~ (nowMinute === _timerManager.lastNotifiedMinute) ~&7083121450889&~;

                        ~&197102514&~ ~&180977&~ = d.getHours();
                        ~&197102514&~ m = d.getMinutes();
                        ~&197085552&~ (~&197102514&~ ~&180978&~ = 0; ~&180978&~ < _timerManager.alarms.~&7082886407723&~; ~&180978&~++) {
                            ~&197102514&~ ~&180970&~ = _timerManager.alarms[~&180978&~];
                            ~&5972376&~ (~&180970&~.~&233726547792244&~ && ~&180970&~.hour === ~&180977&~ && ~&180970&~.minute === m) {
                                _timerManager.alarmNotificationText = ~&180970&~.hour.~&7713616118928163&~().~&7713428190834284&~(2, ~&'180921&~) + ~&"180931&~ + ~&180970&~.minute.~&7713616118928163&~().~&7713428190834284&~(2, ~&'180921&~);
                                _timerManager.~&16765420033347753489&~ = ~&6504329801&~;
                                _timerManager.lastNotifiedMinute = nowMinute;
                                ~&214621519406&~;
                            }
                        }
                    }
                }

                ~&214604601930&~ {
                    ~&5972374&~: _tick
                    ~&7713147298280334&~: 100
                    ~&7083121289162&~: ~&6504329801&~
                    ~&495358363329399331&~: {
                        ~&5972376&~ (_timerManager.alarmMode) ~&7083121450889&~;
                        ~&5972376&~ (_timerManager.timerMode) {
                            _timerManager.remainMs -= 100;
                            ~&5972376&~ (_timerManager.remainMs <= 0) {
                                _timerManager.remainMs = 0;
                                _timerManager.~&6504295855&~();
                                _timerManager.~&16765420033347753489&~ = ~&6504329801&~;
                            }
                        } ~&6503784146&~ {
                            _timerManager.totalMs += 100;
                        }
                        _timerManager.refresh();
                    }
                }

                ~&254480451320573660&~.~&495334332051582499&~: {
                    _timerManager.loadAlarms();
                    ~&197102514&~ _c = ~&5971598&~.~&16810493623656567312&~("qrc:/qt/qml/xofm/modules/light/front/qml/QuickSettingsSlider.qml");
                    _timerManager.hasFrontlight = (_c.~&7083177691309&~ === ~&254480451320573660&~.~&214602073246&~);
                }
            }
        }
    END TRAVERSE
END AFFECT

AFFECT [[12542166428983872557]]
    TRAVERSE [[7711468349764991]] > [[6502786168]] > [[8397788359424131273]] > [[14125623155555875541]]#[[233718721544006]]
        LOCATE AFTER [[254501558939456351]]#[[8399137618543699982]]
        INSERT {
            ~&6502786168&~ {
                ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                ~&7081629735527&~.~&17520348323745447649&~: _timerUI.~&2122835675838176157&~
                ~&7081629735527&~.~&8399743405844438450&~: ~&254477762679831355&~.~&214603824602&~.~&7713684474795983&~.~&7713442318223278&~.~&233740248806464&~.~&214641496386&~
                ~&7081629735527&~.~&499747351624466981&~: ~&254477762679831355&~.~&214603824602&~.~&7713684474795983&~.~&7713442318223278&~.~&233740248806464&~.~&214641496386&~

                ~&14125623155555875541&~ {
                    ~&5972374&~: _timerUI
                    ~&233721384511543&~.~&6504027668&~: ~&7083038346995&~.~&6504027668&~
                    ~&233721384511543&~.~&214640173127&~: ~&7083038346995&~.~&214640173127&~
                    ~&233744706647566&~: ~&254477762679831355&~.~&214603824602&~.~&7713684474795983&~.~&7713442318223278&~.~&233744706647566&~.~&7082925185962&~

                    ~&425121728314878811&~.~&15740235808997988493&~ {
                        ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                    }

                    /* Mode selector tabs*/
                    ~&254501558939456351&~ {
                        ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                        ~&233744706647566&~: 0

                        ~&7712155293725601&~ {
                            ~&214634455770&~: [
                                { txt: ~&"214604601930&~, ~&6504074414&~: ~&"214642551402&~ },
                                { txt: "Chrono", ~&6504074414&~: "chrono" },
                                { txt: "Alarm", ~&6504074414&~: "alarm" }
                            ]
                            ~&7712922269353028&~: ~&6502786168&~ {
                                ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                                ~&7081629735527&~.~&17520348323745447649&~: 68

                                readonly property bool ~&7082453764421&~: ~&254539508423767444&~.~&6504074414&~ === ~&"214642551402&~ ? !~&7082020628281&~.timerManager.alarmMode && ~&7082020628281&~.timerManager.timerMode
                                    : ~&254539508423767444&~.~&6504074414&~ === "chrono" ? !~&7082020628281&~.timerManager.alarmMode && !~&7082020628281&~.timerManager.timerMode
                                    : ~&7082020628281&~.timerManager.alarmMode

                                ~&6503165774&~ {
                                    ~&233721384511543&~.~&7712879746914881&~: ~&7083038346995&~
                                    ~&6504315758&~: ~&254539508423767444&~.txt
                                    ~&6503823200&~.~&254543497768871654&~: 24
                                    ~&6503823200&~.~&6503679370&~: ~&7082453764421&~
                                    ~&214622605608&~: ~&7082453764421&~ ? ~&7082020628281&~.~&8399340017235344933&~ : "#888888"
                                }
                                ~&254494525842443467&~ {
                                    ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                                    ~&254542236275632405&~: {
                                        ~&5972376&~ (~&254539508423767444&~.~&6504074414&~ === "alarm") {
                                            ~&7082020628281&~.timerManager.~&6504295855&~();
                                            ~&7082020628281&~.timerManager.alarmMode = ~&6504329801&~;
                                        } ~&6503784146&~ {
                                            ~&7082020628281&~.timerManager.alarmMode = ~&214625660372&~;
                                            ~&7082020628281&~.timerManager.~&6504295855&~();
                                            ~&7082020628281&~.timerManager.timerMode = ~&254539508423767444&~.~&6504074414&~ === ~&"214642551402&~;
                                            ~&5972376&~ (~&254539508423767444&~.~&6504074414&~ === "chrono") {
                                                ~&7082020628281&~.timerManager.totalMs = 0;
                                            }
                                            ~&7082020628281&~.timerManager.refresh();
                                        }
                                    }
                                }
                                ~&254501108490678590&~ {
                                    ~&233721384511543&~.~&7082507142622&~: ~&7083038346995&~.~&7082507142622&~
                                    ~&233721384511543&~.~&6504027668&~: ~&7083038346995&~.~&6504027668&~
                                    ~&233721384511543&~.~&214640173127&~: ~&7083038346995&~.~&214640173127&~
                                    ~&7082729686082&~: 3
                                    ~&214622605608&~: ~&7082453764421&~ ? ~&7082020628281&~.~&8399340017235344933&~ : ~&"503220030291830651&~
                                }
                            }
                        }
                    }

                    /* Time display*/
                    ~&6502786168&~ {
                        ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                        ~&7081629735527&~.~&17520348323745447649&~: _display.~&2122835675838176157&~
                        ~&233748328658231&~: !~&7082020628281&~.timerManager.alarmMode
                        ~&6503165774&~ {
                            ~&5972374&~: _display
                            ~&233721384511543&~.~&7712879746914881&~: ~&7083038346995&~
                            ~&6504315758&~: ~&7082020628281&~.timerManager.~&478322454160073828&~
                            ~&6503823200&~.~&254543497768871654&~: 56
                            ~&6503823200&~.~&7083316716977&~: ~&6502673216&~.ExtraLight
                            ~&214622605608&~: ~&7082020628281&~.~&8399340017235344933&~
                            ~&15450610953915458578&~: ~&6503165774&~.~&14019785274593562237&~
                        }
                    }

                    /* Preset buttons (timer mode only)*/
                    ~&254501558939456351&~ {
                        ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                        ~&233744706647566&~: ~&254477762679831355&~.~&214603824602&~.~&7713684474795983&~.~&7713442318223278&~.~&233744706647566&~.~&214641496386&~
                        ~&233748328658231&~: !~&7082020628281&~.timerManager.alarmMode && ~&7082020628281&~.timerManager.timerMode

                        ~&7712155293725601&~ {
                            ~&214634455770&~: [
                                { txt: "1 m", ~&197102508&~: 60000 },
                                { txt: "5 m", ~&197102508&~: 300000 },
                                { txt: "10 m", ~&197102508&~: 600000 },
                                { txt: "30 m", ~&197102508&~: 1800000 },
                                { txt: "1 h", ~&197102508&~: 3600000 }
                            ]
                            ~&7712922269353028&~: ~&6502786168&~ {
                                ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                                ~&7081629735527&~.~&17520348323745447649&~: 50
                                ~&254501108490678590&~ {
                                    ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                                    ~&7083116119249&~: 8
                                    ~&214622605608&~: "#EEEEEE"
                                }
                                ~&6503165774&~ {
                                    ~&233721384511543&~.~&7712879746914881&~: ~&7083038346995&~
                                    ~&6504315758&~: ~&254539508423767444&~.txt
                                    ~&6503823200&~.~&254543497768871654&~: 20
                                    ~&6503823200&~.~&6503679370&~: ~&6504329801&~
                                    ~&214622605608&~: ~&7082020628281&~.~&8399340017235344933&~
                                }
                                ~&254494525842443467&~ {
                                    ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                                    ~&254542236275632405&~: {
                                        ~&7082020628281&~.timerManager.~&6504295855&~();
                                        ~&7082020628281&~.timerManager.presetMs = ~&254539508423767444&~.~&197102508&~;
                                        ~&5972376&~ (~&7082020628281&~.timerManager.addMode) {
                                            ~&7082020628281&~.timerManager.totalMs += ~&254539508423767444&~.~&197102508&~;
                                            ~&7082020628281&~.timerManager.remainMs += ~&254539508423767444&~.~&197102508&~;
                                        } ~&6503784146&~ {
                                            ~&7082020628281&~.timerManager.totalMs = ~&254539508423767444&~.~&197102508&~;
                                            ~&7082020628281&~.timerManager.remainMs = ~&254539508423767444&~.~&197102508&~;
                                        }
                                        ~&7082020628281&~.timerManager.refresh();
                                    }
                                }
                            }
                        }
                    }

                    /* Control buttons*/
                    ~&254501558939456351&~ {
                        ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                        ~&233744706647566&~: ~&254477762679831355&~.~&214603824602&~.~&7713684474795983&~.~&7713442318223278&~.~&233744706647566&~.~&214641496386&~
                        ~&233748328658231&~: !~&7082020628281&~.timerManager.alarmMode

                        /* Add/Set toggle (timer only)*/
                        ~&6502786168&~ {
                            ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                            ~&7081629735527&~.~&17520348323745447649&~: 70
                            ~&233748328658231&~: ~&7082020628281&~.timerManager.timerMode
                            ~&254501108490678590&~ {
                                ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                                ~&7083116119249&~: 8
                                ~&7082507052999&~.~&214622605608&~: "#888888"
                                ~&7082507052999&~.~&214646099849&~: 1
                                ~&214622605608&~: ~&"503220030291830651&~
                            }
                            ~&425121728314878811&~.~&6502767986&~ {
                                ~&233721384511543&~.~&7712879746914881&~: ~&7083038346995&~
                                ~&6504284228&~: ~&425121728314878811&~.~&7082020628281&~.~&7713132906001613&~.~&214641496386&~
                                ~&7083172477658&~: ~&7082020628281&~.timerManager.addMode ? ~&"15094524446772001204&~ : ~&"5724976033632521381&~
                            }
                            ~&254494525842443467&~ {
                                ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                                ~&254542236275632405&~: {
                                    ~&7082020628281&~.timerManager.addMode = !~&7082020628281&~.timerManager.addMode;
                                }
                            }
                        }

                        /* Reset*/
                        ~&6502786168&~ {
                            ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                            ~&7081629735527&~.~&17520348323745447649&~: 70
                            ~&254501108490678590&~ {
                                ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                                ~&7083116119249&~: 8
                                ~&7082507052999&~.~&214622605608&~: "#888888"
                                ~&7082507052999&~.~&214646099849&~: 1
                                ~&214622605608&~: ~&"503220030291830651&~
                            }
                            ~&425121728314878811&~.~&6502767986&~ {
                                ~&233721384511543&~.~&7712879746914881&~: ~&7083038346995&~
                                ~&6504284228&~: ~&425121728314878811&~.~&7082020628281&~.~&7713132906001613&~.~&214641496386&~
                                ~&7083172477658&~: ~&"6968812144639225076&~
                            }
                            ~&254494525842443467&~ {
                                ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                                ~&254542236275632405&~: ~&7082020628281&~.timerManager.doReset()
                            }
                        }

                        /* Start / Stop*/
                        ~&6502786168&~ {
                            ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                            ~&7081629735527&~.~&17520348323745447649&~: 70
                            ~&254501108490678590&~ {
                                ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                                ~&7083116119249&~: 8
                                ~&214622605608&~: ~&7082020628281&~.timerManager.isRunning ? "#EEEEEE" : ~&7082020628281&~.~&8399340017235344933&~
                            }
                            ~&6503165774&~ {
                                ~&233721384511543&~.~&7712879746914881&~: ~&7083038346995&~
                                ~&6504315758&~: ~&7082020628281&~.timerManager.isRunning ? "Stop" : "Start"
                                ~&6503823200&~.~&254543497768871654&~: 20
                                ~&6503823200&~.~&6503679370&~: ~&6504329801&~
                                ~&214622605608&~: ~&7082020628281&~.timerManager.isRunning ? ~&7082020628281&~.~&8399340017235344933&~ : ~&7082020628281&~.~&8399340017260114793&~
                            }
                            ~&254494525842443467&~ {
                                ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                                ~&254542236275632405&~: {
                                    ~&7082020628281&~.timerManager.isRunning ? ~&7082020628281&~.timerManager.~&6504295855&~() : ~&7082020628281&~.timerManager.go();
                                }
                            }
                        }
                    }

                    /* Alarm mode*/
                    ~&14125623155555875541&~ {
                        ~&5972374&~: _alarmCol
                        ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                        ~&233748328658231&~: ~&7082020628281&~.timerManager.alarmMode
                        ~&233744706647566&~: ~&254477762679831355&~.~&214603824602&~.~&7713684474795983&~.~&7713442318223278&~.~&233744706647566&~.~&214641496386&~

                        ~&7712155293725601&~ {
                            ~&214634455770&~: ~&7082020628281&~.timerManager.alarms

                            ~&7712922269353028&~: ~&14125623155555875541&~ {
                                ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                                ~&7081629735527&~.~&17520348323745447649&~: 80
                                ~&233744706647566&~: 0

                                ~&6502786168&~ {
                                    ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                                    ~&7081629735527&~.fillHeight: ~&6504329801&~

                                    ~&425121728314878811&~.~&6502767986&~ {
                                        ~&5972374&~: _radioIcon
                                        ~&233721384511543&~.~&6504027668&~: ~&7083038346995&~.~&6504027668&~
                                        ~&233721384511543&~.~&3441383163516681764&~: ~&7083038346995&~.~&3441383163516681764&~
                                        ~&214646099849&~: 48
                                        ~&7082729686082&~: 48
                                        ~&6504284228&~: ~&425121728314878811&~.~&7082020628281&~.~&7713132906001613&~.~&7082925185962&~
                                        ~&7083172477658&~: ~&254539508423767444&~.~&233726547792244&~ ? ~&"8609871882813839963&~ : ~&"7424611027213444377&~
                                        ~&254494525842443467&~ {
                                            ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                                            ~&254542236275632405&~: ~&7082020628281&~.timerManager.toggleAlarm(~&254539508423767444&~.~&5972374&~)
                                        }
                                    }

                                    ~&6503165774&~ {
                                        ~&233721384511543&~.~&6504027668&~: _radioIcon.~&214640173127&~
                                        ~&233721384511543&~.~&214640173127&~: _trashIcon.~&6504027668&~
                                        ~&233721384511543&~.~&3441383163516681764&~: ~&7083038346995&~.~&3441383163516681764&~
                                        ~&490371291080887915&~: 12
                                        ~&16491662607465103678&~: 12
                                        ~&6504315758&~: ~&254539508423767444&~.hour.~&7713616118928163&~().~&7713428190834284&~(2, ~&'180921&~) + ~&"180931&~ + ~&254539508423767444&~.minute.~&7713616118928163&~().~&7713428190834284&~(2, ~&'180921&~)
                                        ~&6503823200&~.~&254543497768871654&~: 28
                                        ~&6503823200&~.~&7083316716977&~: ~&254539508423767444&~.~&233726547792244&~ ? ~&6502673216&~.~&6502529386&~ : ~&6502673216&~.~&7081724354802&~
                                        ~&214622605608&~: ~&254539508423767444&~.~&233726547792244&~ ? ~&7082020628281&~.~&8399340017235344933&~ : "#888888"
                                    }

                                    ~&425121728314878811&~.~&6502767986&~ {
                                        ~&5972374&~: _trashIcon
                                        ~&233721384511543&~.~&214640173127&~: ~&7083038346995&~.~&214640173127&~
                                        ~&233721384511543&~.~&3441383163516681764&~: ~&7083038346995&~.~&3441383163516681764&~
                                        ~&214646099849&~: 48
                                        ~&7082729686082&~: 48
                                        ~&6504284228&~: ~&425121728314878811&~.~&7082020628281&~.~&7713132906001613&~.~&7082925185962&~
                                        ~&7083172477658&~: ~&"7312727925064657782&~
                                        ~&254494525842443467&~ {
                                            ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                                            ~&254542236275632405&~: ~&7082020628281&~.timerManager.removeAlarm(~&254539508423767444&~.~&5972374&~)
                                        }
                                    }
                                }

                            }
                        }

                        ~&6503165774&~ {
                            ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                            ~&233748328658231&~: ~&7082020628281&~.timerManager.alarms.~&7082886407723&~ === 0
                            ~&6504315758&~: "No alarms set"
                            ~&6503823200&~.~&254543497768871654&~: 20
                            ~&214622605608&~: "#888888"
                            ~&8400129142283184211&~: 20
                            ~&1353514028756047605&~: 20
                            ~&15450610953915458578&~: ~&6503165774&~.~&14019785274593562237&~
                        }

                        ~&6502786168&~ {
                            ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                            ~&7081629735527&~.~&17520348323745447649&~: 54

                            ~&254501108490678590&~ {
                                ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                                ~&7083116119249&~: 8
                                ~&214622605608&~: ~&7082020628281&~.~&8399340017235344933&~
                            }
                            ~&6503165774&~ {
                                ~&233721384511543&~.~&7712879746914881&~: ~&7083038346995&~
                                ~&6504315758&~: "Add alarms"
                                ~&6503823200&~.~&254543497768871654&~: 20
                                ~&6503823200&~.~&6503679370&~: ~&6504329801&~
                                ~&214622605608&~: ~&7082020628281&~.~&8399340017260114793&~
                            }
                            ~&254494525842443467&~ {
                                ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                                ~&254542236275632405&~: {
                                    ~&7082020628281&~.timerManager.~&6504295855&~();
                                    ~&6504254477&~.~&2766288418351025740&~.~&214622501183&~();
                                    ~&6504254477&~.~&2766288418351025740&~.~&6504147419&~("systemclock/window/settings-info");
                                }
                            }
                        }
                    }
                }
            }
        }
    END TRAVERSE
END AFFECT

; Alarm management inside system clock settings (inserted before the info message for more space)
AFFECT /qt/qml/xofm/modules/systemclock/qml/window/SettingsInfoWindow.qml
    TRAVERSE [[7711468349764991]]#[[6504254477]] > [[8397788359424131273]] > [[14125623155555875541]]#[[8399784311425937276]]
        LOCATE AFTER [[425121728314878811.214599571833]]#[[254526274719339159]]
        INSERT {
            ~&425121728314878811&~.~&214604609771&~ {
                ~&6504315758&~: "Alarms"
                ~&6504337259&~: ~&425121728314878811&~.~&214604609771&~.~&214594832564&~
                ~&7081629735527&~.~&254549367831075482&~: ~&254477762679831355&~.~&7082020628281&~.~&7713442318223278&~.~&233744706647566&~.~&233748750575870&~
            }

            ~&7712155293725601&~ {
                ~&214634455770&~: ~&7082020628281&~.timerManager.alarms

                ~&7712922269353028&~: ~&14125623155555875541&~ {
                    ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                    ~&7081629735527&~.~&17520348323745447649&~: 56
                    ~&233744706647566&~: 0

                    ~&6502786168&~ {
                        ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                        ~&7081629735527&~.fillHeight: ~&6504329801&~

                        ~&425121728314878811&~.~&6502767986&~ {
                            ~&5972374&~: _alarmIcon
                            ~&233721384511543&~.~&6504027668&~: ~&7083038346995&~.~&6504027668&~
                            ~&233721384511543&~.~&3441383163516681764&~: ~&7083038346995&~.~&3441383163516681764&~
                            ~&214646099849&~: 40
                            ~&7082729686082&~: 40
                            ~&6504284228&~: ~&425121728314878811&~.~&7082020628281&~.~&7713132906001613&~.~&7082925185962&~
                            ~&7083172477658&~: ~&"7424604169206955460&~
                        }

                        ~&6503165774&~ {
                            ~&233721384511543&~.~&6504027668&~: _alarmIcon.~&214640173127&~
                            ~&233721384511543&~.~&3441383163516681764&~: ~&7083038346995&~.~&3441383163516681764&~
                            ~&233721384511543&~.~&1765033595104803723&~: 1
                            ~&490371291080887915&~: 12
                            ~&6504315758&~: ~&254539508423767444&~.hour.~&7713616118928163&~().~&7713428190834284&~(2, ~&'180921&~) + ~&"180931&~ + ~&254539508423767444&~.minute.~&7713616118928163&~().~&7713428190834284&~(2, ~&'180921&~)
                            ~&6503823200&~.~&254543497768871654&~: 24
                            ~&214622605608&~: ~&7082020628281&~.~&8399340017235344933&~
                        }

                        ~&425121728314878811&~.~&6502767986&~ {
                            ~&5972374&~: _toggleAlarmIcon
                            ~&233721384511543&~.~&214640173127&~: _deleteAlarmIcon.~&6504027668&~
                            ~&233721384511543&~.~&499747351624466981&~: 12
                            ~&233721384511543&~.~&3441383163516681764&~: ~&7083038346995&~.~&3441383163516681764&~
                            ~&214646099849&~: 48
                            ~&7082729686082&~: 48
                            ~&6504284228&~: ~&425121728314878811&~.~&7082020628281&~.~&7713132906001613&~.~&7082925185962&~
                            ~&7083172477658&~: ~&254539508423767444&~.~&233726547792244&~ ? ~&"8609871882813839963&~ : ~&"7424611027213444377&~
                            ~&254494525842443467&~ {
                                ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                                ~&254542236275632405&~: ~&7082020628281&~.timerManager.toggleAlarm(~&254539508423767444&~.~&5972374&~)
                            }
                        }

                        ~&425121728314878811&~.~&6502767986&~ {
                            ~&5972374&~: _deleteAlarmIcon
                            ~&233721384511543&~.~&214640173127&~: ~&7083038346995&~.~&214640173127&~
                            ~&233721384511543&~.~&3441383163516681764&~: ~&7083038346995&~.~&3441383163516681764&~
                            ~&214646099849&~: 48
                            ~&7082729686082&~: 48
                            ~&6504284228&~: ~&425121728314878811&~.~&7082020628281&~.~&7713132906001613&~.~&7082925185962&~
                            ~&7083172477658&~: ~&"7312727925064657782&~
                            ~&254494525842443467&~ {
                                ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                                ~&254542236275632405&~: ~&7082020628281&~.timerManager.removeAlarm(~&254539508423767444&~.~&5972374&~)
                            }
                        }
                    }

                }
            }

            ~&425121728314878811&~.~&214599571833&~ {
                ~&5972374&~: _addAlarmPanel
                ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                ~&214632764553&~: "Add alarm"
                ~&8399601734642709923&~: ~&"15094524446772001204&~
                ~&7082453764199&~: ~&425121728314878811&~.~&7081261925573&~ {
                    ~&6504337259&~: ~&254477762679831355&~.~&7081261925573&~.~&254547519794454865&~
                    ~&6504315758&~: ~&6504222003&~("Add")
                    ~&254542236275632405&~: {
                        _addAlarmPanel.~&9195823055201242195&~ = !_addAlarmPanel.~&9195823055201242195&~;
                    }
                }
                ~&9195823055201242195&~: ~&214625660372&~
                ~&8399254548634699250&~: ~&14125623155555875541&~ {
                    ~&214646099849&~: _addAlarmPanel.~&214646099849&~
                    ~&233744706647566&~: ~&254477762679831355&~.~&7082020628281&~.~&7713442318223278&~.~&233744706647566&~.~&7082925185962&~

                    ~&6502786168&~ {
                        ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                        ~&7081629735527&~.~&17520348323745447649&~: 280

                        ~&14975672296977510442&~ {
                            ~&5972374&~: _alarmTimeSpinners
                            ~&233721384511543&~.~&6504027668&~: ~&7083038346995&~.~&6504027668&~
                            ~&233721384511543&~.~&214640173127&~: _nowBtn.~&6504027668&~
                            ~&233721384511543&~.~&197100796&~: ~&7083038346995&~.~&197100796&~
                            ~&233721384511543&~.~&7082507142622&~: ~&7083038346995&~.~&7082507142622&~
                            ~&233721384511543&~.~&499747351624466981&~: ~&254477762679831355&~.~&7082020628281&~.~&7713442318223278&~.~&233744706647566&~.~&7082925185962&~
                            ~&214628545114&~: 8
                            ~&233736699967534&~: 0
                            ~&8399894257374503713&~: function(~&180977&~) { _alarmTimeSpinners.~&214628545114&~ = ~&180977&~; }
                            ~&16346529800820831925&~: function(m) { _alarmTimeSpinners.~&233736699967534&~ = m; }
                        }

                        ~&6502786168&~ {
                            ~&5972374&~: _nowBtn
                            ~&233721384511543&~.~&214640173127&~: ~&7083038346995&~.~&214640173127&~
                            ~&233721384511543&~.~&3441383163516681764&~: ~&7083038346995&~.~&3441383163516681764&~
                            ~&214646099849&~: 80
                            ~&7082729686082&~: 48

                            ~&254501108490678590&~ {
                                ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                                ~&7083116119249&~: 8
                                ~&214622605608&~: ~&7082020628281&~.~&8399340017235344933&~
                            }
                            ~&6503165774&~ {
                                ~&233721384511543&~.~&7712879746914881&~: ~&7083038346995&~
                                ~&6504315758&~: "Now"
                                ~&6503823200&~.~&254543497768871654&~: 20
                                ~&6503823200&~.~&6503679370&~: ~&6504329801&~
                                ~&214622605608&~: ~&7082020628281&~.~&8399340017260114793&~
                            }
                            ~&254494525842443467&~ {
                                ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                                ~&254542236275632405&~: {
                                    ~&197102514&~ d =     new     ~&6502586279&~();
                                    _alarmTimeSpinners.~&214628545114&~ = d.getHours();
                                    _alarmTimeSpinners.~&233736699967534&~ = d.getMinutes();
                                }
                            }
                        }
                    }

                    ~&254501558939456351&~ {
                        ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                        ~&7081629735527&~.~&17520348323745447649&~: 44
                        ~&233744706647566&~: 8

                        ~&7712155293725601&~ {
                            ~&214634455770&~: [0, 15, 30, 45]
                            ~&7712922269353028&~: ~&6502786168&~ {
                                ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                                ~&7081629735527&~.fillHeight: ~&6504329801&~

                                ~&254501108490678590&~ {
                                    ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                                    ~&7083116119249&~: 8
                                    ~&214622605608&~: "#EEEEEE"
                                }
                                ~&6503165774&~ {
                                    ~&233721384511543&~.~&7712879746914881&~: ~&7083038346995&~
                                    ~&6504315758&~: ~&254539508423767444&~.~&7713616118928163&~().~&7713428190834284&~(2, ~&'180921&~)
                                    ~&6503823200&~.~&254543497768871654&~: 18
                                    ~&6503823200&~.~&6503679370&~: ~&6504329801&~
                                    ~&214622605608&~: ~&7082020628281&~.~&8399340017235344933&~
                                }
                                ~&254494525842443467&~ {
                                    ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                                    ~&254542236275632405&~: {
                                        _alarmTimeSpinners.~&233736699967534&~ = ~&254539508423767444&~;
                                    }
                                }
                            }
                        }
                    }

                    ~&254501558939456351&~ {
                        ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                        ~&7081629735527&~.~&17520348323745447649&~: 44
                        ~&233744706647566&~: 8

                        ~&7712155293725601&~ {
                            ~&214634455770&~: [15, 30, 45]
                            ~&7712922269353028&~: ~&6502786168&~ {
                                ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                                ~&7081629735527&~.fillHeight: ~&6504329801&~

                                ~&254501108490678590&~ {
                                    ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                                    ~&7083116119249&~: 8
                                    ~&214622605608&~: "#EEEEEE"
                                }
                                ~&6503165774&~ {
                                    ~&233721384511543&~.~&7712879746914881&~: ~&7083038346995&~
                                    ~&6504315758&~: ~&"180916&~ + ~&254539508423767444&~
                                    ~&6503823200&~.~&254543497768871654&~: 18
                                    ~&6503823200&~.~&6503679370&~: ~&6504329801&~
                                    ~&214622605608&~: ~&7082020628281&~.~&8399340017235344933&~
                                }
                                ~&254494525842443467&~ {
                                    ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                                    ~&254542236275632405&~: {
                                        ~&197102514&~ m = _alarmTimeSpinners.~&233736699967534&~ + ~&254539508423767444&~;
                                        ~&5972376&~ (m >= 60) { m -= 60; }
                                        _alarmTimeSpinners.~&233736699967534&~ = m;
                                    }
                                }
                            }
                        }
                    }

                    ~&6502786168&~ {
                        ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                        ~&7081629735527&~.~&17520348323745447649&~: 54

                        ~&254501108490678590&~ {
                            ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                            ~&7083116119249&~: 8
                            ~&214622605608&~: ~&7082020628281&~.~&8399340017235344933&~
                        }
                        ~&6503165774&~ {
                            ~&233721384511543&~.~&7712879746914881&~: ~&7083038346995&~
                            ~&6504315758&~: "Save alarm"
                            ~&6503823200&~.~&254543497768871654&~: 20
                            ~&6503823200&~.~&6503679370&~: ~&6504329801&~
                            ~&214622605608&~: ~&7082020628281&~.~&8399340017260114793&~
                        }
                        ~&254494525842443467&~ {
                            ~&233721384511543&~.~&6503816592&~: ~&7083038346995&~
                            ~&254542236275632405&~: {
                                ~&7082020628281&~.timerManager.addAlarm(_alarmTimeSpinners.~&214628545114&~, _alarmTimeSpinners.~&233736699967534&~);
                                _addAlarmPanel.~&9195823055201242195&~ = ~&214625660372&~;
                            }
                        }
                    }
                }
            }

            ~&425121728314878811&~.~&214599571833&~ {
                ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                ~&233748328658231&~: ~&7082020628281&~.timerManager.hasFrontlight
                ~&214632764553&~: "Flash light"
                ~&478136262235079021&~: "Blink the reading light when the timer ends or an alarm triggers"
                ~&7082453764199&~: ~&425121728314878811&~.~&7081261925573&~ {
                    ~&6504315758&~: ~&7082020628281&~.timerManager.blinkLightOnNotification ? ~&"5971526&~ : ~&"197060196&~
                    ~&254542236275632405&~: ~&7082020628281&~.timerManager.blinkLightOnNotification = !~&7082020628281&~.timerManager.blinkLightOnNotification
                }
            }
        }
    END TRAVERSE
END AFFECT

; Notification bar for timer finish and alarm triggers
AFFECT [[2328484894988065446]]
    IMPORT [[233700934949963.233693781272506]] [[180922.180921]]

    TRAVERSE [[8397788359424131273]]#[[6504254477]] > [[8397993708429497603]]#[[7713531976371484]]
        LOCATE AFTER ALL
        INSERT {
            ~&425121728314878811&~.~&11119534664549952261&~ {
                ~&233721384511543&~.~&6504027668&~: ~&7083038346995&~.~&6504027668&~
                ~&233721384511543&~.~&214640173127&~: ~&7083038346995&~.~&214640173127&~
                ~&233721384511543&~.~&7082507142622&~: ~&7083038346995&~.~&7082507142622&~
                ~&233748328658231&~: ~&7082020628281&~.timerManager.~&16765420033347753489&~

                ~&13733777459642361598&~: {
                    ~&5972376&~ (~&233748328658231&~ && ~&7082020628281&~.timerManager.blinkLightOnNotification) {
                        _blinkTimer.~&6504295855&~();
                        _blinkTimer.~&214618014052&~ = 0;
                        _blinkTimer.~&214641748151&~();
                    }
                }

                ~&214604601930&~ {
                    ~&5972374&~: _blinkTimer
                    ~&7713147298280334&~: 1000 /* 1 sec*/
                    ~&7083121289162&~: ~&6504329801&~
                    property ~&197088788&~ ~&214618014052&~: 0
                    property ~&6504243117&~ _savedValue: 0
                    ~&495358363329399331&~: {
                        ~&197102514&~ l = ~&7082020628281&~.timerManager._blinkLight;
                        ~&5972376&~ (!l) { ~&6504295855&~(); ~&7083121450889&~; }
                        ~&5972376&~ (~&214618014052&~ >= 6) {
                            ~&6504295855&~();
                            l.~&214644635174&~ = _savedValue;
                            ~&214618014052&~ = 0;
                            ~&7083121450889&~;
                        }
                        ~&5972376&~ (~&214618014052&~ === 0) {
                            _savedValue = l.~&214644635174&~;
                        }
                        l.~&214644635174&~ = ~&214618014052&~ % 2 === 0 ? 100 : 0;
                        ~&214618014052&~++;
                    }
                }
                ~&6504337259&~: ~&254477762679831355&~.~&11119534664549952261&~.~&233740920352621&~

                ~&425121728314878811&~.~&11119534664549952261&~.~&233695222288046&~ {
                    ~&6504315758&~: ~&7082020628281&~.timerManager.alarmNotificationText !== ""
                        ? "Alarm at " + ~&7082020628281&~.timerManager.alarmNotificationText
                        : "Time's up! (" + ~&7082020628281&~.timerManager.fmt(~&7082020628281&~.timerManager.totalMs) + ~&"180914&~
                    ~&7081629735527&~.~&254529418434902000&~: ~&6504329801&~
                    ~&7081629735527&~.~&8399743405844438450&~: ~&425121728314878811&~.~&7082020628281&~.~&233740248806464&~.~&214641496386&~
                    ~&7081629735527&~.~&499747351624466981&~: ~&425121728314878811&~.~&7082020628281&~.~&233740248806464&~.~&214641496386&~
                }

                /* Timer buttons - hidden during alarm*/
                ~&425121728314878811&~.~&11119534664549952261&~.~&7081261925573&~ {
                    ~&233748328658231&~: ~&7082020628281&~.timerManager.alarmNotificationText === ""
                    ~&6504315758&~: ~&"233701679664206&~
                    ~&254542236275632405&~: {
                        ~&7082020628281&~.timerManager.doReset();
                        ~&7082020628281&~.timerManager.go();
                    }
                }

                ~&425121728314878811&~.~&11119534664549952261&~.~&233683758819504&~ {
                    ~&233748328658231&~: ~&7082020628281&~.timerManager.alarmNotificationText === ""
                }

                ~&425121728314878811&~.~&11119534664549952261&~.~&7081261925573&~ {
                    ~&233748328658231&~: ~&7082020628281&~.timerManager.alarmNotificationText === ""
                    ~&6504315758&~: "+1min"
                    ~&254542236275632405&~: {
                        ~&7082020628281&~.timerManager.totalMs += 60000;
                        ~&7082020628281&~.timerManager.remainMs += 60000;
                        ~&7082020628281&~.timerManager.~&16765420033347753489&~ = ~&214625660372&~;
                        ~&7082020628281&~.timerManager.go();
                    }
                }

                ~&425121728314878811&~.~&11119534664549952261&~.~&233683758819504&~ {
                    ~&233748328658231&~: ~&7082020628281&~.timerManager.alarmNotificationText === ""
                }

                ~&425121728314878811&~.~&11119534664549952261&~.~&7081261925573&~ {
                    ~&233748328658231&~: ~&7082020628281&~.timerManager.alarmNotificationText === ""
                    ~&6504315758&~: "+5min"
                    ~&254542236275632405&~: {
                        ~&7082020628281&~.timerManager.totalMs += 300000;
                        ~&7082020628281&~.timerManager.remainMs += 300000;
                        ~&7082020628281&~.timerManager.~&16765420033347753489&~ = ~&214625660372&~;
                        ~&7082020628281&~.timerManager.go();
                    }
                }

                ~&425121728314878811&~.~&11119534664549952261&~.~&233683758819504&~ {
                    ~&233748328658231&~: ~&7082020628281&~.timerManager.alarmNotificationText === ""
                }

                /* Universal Close / Dismiss*/
                ~&425121728314878811&~.~&11119534664549952261&~.~&7081261925573&~ {
                    ~&6504315758&~: ~&7082020628281&~.timerManager.alarmNotificationText !== "" ? ~&"233683755411397&~ : ~&"214584551711&~
                    ~&254542236275632405&~: {
                        ~&5972376&~ (~&7082020628281&~.timerManager.alarmNotificationText !== "") {
                            ~&7082020628281&~.timerManager.dismissAlarmNotification();
                        } ~&6503784146&~ {
                            ~&7082020628281&~.timerManager.~&16765420033347753489&~ = ~&214625660372&~;
                        }
                    }
                }
            }
        }
    END TRAVERSE
END AFFECT

; Capture Light reference from the QuickSettingsSlider so we can blink it
AFFECT /qt/qml/xofm/modules/light/front/qml/QuickSettingsSlider.qml
    TRAVERSE [[425121728314878811.7081916140908]]#[[6504254477]]
        LOCATE AFTER ALL
        INSERT {
            ~&254480451320573660&~.~&495334332051582499&~: ~&7082020628281&~.timerManager._blinkLight = ~&6504254477&~.~&214633057601&~;
        }
    END TRAVERSE
END AFFECT
