From d7f6dc953cca9502c0e0703d2ef6291aa9f37e47 Mon Sep 17 00:00:00 2001 From: MomentumV Date: Thu, 13 Feb 2025 12:51:13 -0500 Subject: [PATCH] 0.04.1 release Fixes a bug in the dot coloring and adds more screenshots --- apps/daymoon/ChangeLog | 3 +- apps/daymoon/README.md | 3 +- apps/daymoon/app.js | 333 ++++++++++++++++++++---------------- apps/daymoon/metadata.json | 4 +- apps/daymoon/s1.png | Bin 0 -> 4005 bytes apps/daymoon/s2.png | Bin 0 -> 4429 bytes apps/daymoon/s3.png | Bin 0 -> 3632 bytes apps/daymoon/s4.png | Bin 0 -> 3527 bytes apps/daymoon/screenshot.png | Bin 4538 -> 0 bytes 9 files changed, 196 insertions(+), 147 deletions(-) create mode 100644 apps/daymoon/s1.png create mode 100644 apps/daymoon/s2.png create mode 100644 apps/daymoon/s3.png create mode 100644 apps/daymoon/s4.png delete mode 100644 apps/daymoon/screenshot.png diff --git a/apps/daymoon/ChangeLog b/apps/daymoon/ChangeLog index 8e650db84..a793d2017 100644 --- a/apps/daymoon/ChangeLog +++ b/apps/daymoon/ChangeLog @@ -1,4 +1,5 @@ 0.01: First functional release 0.02: move moon down, rotate sunrise/sunset, shift Hours/minutes to corners 0.03: Change day and night to have different dots -0.04: Update ChangeLog, coerce dark theme \ No newline at end of file +0.04: Update ChangeLog, coerce dark theme +0.04.1: Add more screenshots, fix bug in dot colors diff --git a/apps/daymoon/README.md b/apps/daymoon/README.md index 5cd46f07e..2162bf808 100644 --- a/apps/daymoon/README.md +++ b/apps/daymoon/README.md @@ -8,6 +8,7 @@ This uses the myLocation app to get your latitude and longitude for proper dayli Feature roadmap: - [x] 0.01 Fix blocking widgets - [x] 0.03 Day and Night different color markers + - [x] 0.04 Add to App Loader - [ ] 0.05 add Day of week and month display - [ ] 0.06 Seconds display - [ ] 0.07 Color Themes (and settings/options) @@ -15,4 +16,4 @@ Feature roadmap: - [ ] 0.10 custom/bigger/fitted time digits - [ ] 0.20 clockinfo support? - [ ] 0.30 Tap/swipe actions? - + \ No newline at end of file diff --git a/apps/daymoon/app.js b/apps/daymoon/app.js index 9ed5c5354..cb560ae9f 100644 --- a/apps/daymoon/app.js +++ b/apps/daymoon/app.js @@ -4,42 +4,46 @@ let location; var Utils = require("graphics_utils"); var SunCalc = require("suncalc"); var RADII = { - moon: 40, - arcMin: 48, - arcMax: 63, - dots: 55, - needle: 54, + moon: 40, + arcMin: 48, + arcMax: 63, + dots: 55, + needle: 54, }; var COL = { - moon: 65535, // - txture: 33792, // 0.5 ,0.5,0 - shadow: 8196, // .125,0, .125 - day: 40159, //0.6, 0.6,1 - night: 6, // 0, 0, 0.2 - ndots: 2047, // 0, 1, 1 cyan - ddots: 0, - needle: 63488, // 1, 0, 0 red - stime: 2047 + moon: 65535, // + txture: 33792, // 0.5 ,0.5,0 + shadow: 8196, // .125,0, .125 + day: 40159, //0.6, 0.6,1 + night: 6, // 0, 0, 0.2 + ndots: 2047, // 0, 1, 1 cyan + ddots: 0, + needle: 63488, // 1, 0, 0 red + stime: 2047 }; const TAU = 2.0 * Math.PI; const MX = g.getWidth() / 2, - MY = 24 + 3 + RADII.arcMax; + MY = 24 + 3 + RADII.arcMax; const DAY_MILLIS = 86400000; -const M_POS = { x: MX, y: MY, r: RADII.moon }; +const M_POS = { + x: MX, + y: MY, + r: RADII.moon +}; // images const moon_texture = { - width: 80, - height: 80, - bpp: 1, - transparent: 0, - buffer: require("heatshrink").decompress(atob("ABsRqAJHkEiBA0N0uq1AIEgNVqtRqoJEgUiAAQJEioTBAAIzEl2q12oxATECQdVioJD/eqne60UCHQoADoAJBgf+xWrFIOACYUFCYo8Cj/73f70er0ROHAANUBIM//3///q1WIFAV1qtXCggJB//7CYO6keikBOHKAUDCIInClSgCgonBu4TK1W73ShBMQxkCh5OC//uFIInBi91q5PFCYISC3er//iOwXVE41UCYf+9//9AnCJopVBqEv/+/3//E4P6kUgJw4nDKAP+14TB1Xoq4hBEwYFBqgnB3Wr3e737KB/QnIqp3B32OKAYTBE4Z4BAoYnBEoRSC0fyE5ITBJ4WuCYP4J4J3CeQQFClbvBJgOqn5kBnRPKTwJMB1B4B92qEgQACJ4JTBkYnBYwOilYsBO5NUhYmB9+qxGC9TxBEYTvFqki3Y8B1Uikei3+oionIgGrO4OqwGC9H/xATK1/7E4UAnU7kATIqEAl/uE4WA12u0ATJgSgB/+ikUgnW70EFCY9AgGDE4PowEAlWowEBCZJ4BneggUgkRSBCZEAgEKJoIEBgEIAYQOCKYcVBIMqJgIEBgQSCgAQBqiJDRQIOBEwYAEMgNRiITBqKKBCYJJBE4xQGMQIABlBPHHgInDHQQjEAQJTCHgbFEABg8EBg5SDCgxNDABI=")) + width: 80, + height: 80, + bpp: 1, + transparent: 0, + buffer: require("heatshrink").decompress(atob("ABsRqAJHkEiBA0N0uq1AIEgNVqtRqoJEgUiAAQJEioTBAAIzEl2q12oxATECQdVioJD/eqne60UCHQoADoAJBgf+xWrFIOACYUFCYo8Cj/73f70er0ROHAANUBIM//3///q1WIFAV1qtXCggJB//7CYO6keikBOHKAUDCIInClSgCgonBu4TK1W73ShBMQxkCh5OC//uFIInBi91q5PFCYISC3er//iOwXVE41UCYf+9//9AnCJopVBqEv/+/3//E4P6kUgJw4nDKAP+14TB1Xoq4hBEwYFBqgnB3Wr3e737KB/QnIqp3B32OKAYTBE4Z4BAoYnBEoRSC0fyE5ITBJ4WuCYP4J4J3CeQQFClbvBJgOqn5kBnRPKTwJMB1B4B92qEgQACJ4JTBkYnBYwOilYsBO5NUhYmB9+qxGC9TxBEYTvFqki3Y8B1Uikei3+oionIgGrO4OqwGC9H/xATK1/7E4UAnU7kATIqEAl/uE4WA12u0ATJgSgB/+ikUgnW70EFCY9AgGDE4PowEAlWowEBCZJ4BneggUgkRSBCZEAgEKJoIEBgEIAYQOCKYcVBIMqJgIEBgQSCgAQBqiJDRQIOBEwYAEMgNRiITBqKKBCYJJBE4xQGMQIABlBPHHgInDHQQjEAQJTCHgbFEABg8EBg5SDCgxNDABI=")) }; const needle = { - width: 23, - height: 11, - bpp: 1, - transparent: 0, - buffer: atob("///B///D///AAAPAAAHAAAHAAAcAADz///H//8P//wA=") + width: 23, + height: 10, + bpp: 1, + transparent: 0, + buffer: atob("//+B///D///AAAHgAADgAAHAAA9///j//+H//gA=") }; /* @@ -52,137 +56,172 @@ const needle = { // requires the myLocation app function loadLocation() { - location = require("Storage").readJSON(LOCATION_FILE, 1) || { "lat": 45, "lon": -71.3, "location": "Nashua" }; //{"lat":51.5072,"lon":0.1276,"location":"London"}; + location = require("Storage").readJSON(LOCATION_FILE, 1) || { + "lat": 45, + "lon": -71.3, + "location": "Nashua" + }; //{"lat":51.5072,"lon":0.1276,"location":"London"}; } function drawMoon(shadowShape) { - g.setColor(0, 0, 0).fillCircle(MX, MY, RADII.arcMax + 3); - g.setColor(COL.moon).fillCircle(MX, MY, RADII.moon); - g.setColor(COL.txture).drawImage(moon_texture, MX, MY, { rotate: 0 }); - // TODO: can set the rotation here to the parallacticAngle from getMoonPosition - g.setColor(COL.shadow).fillPoly(shadowShape); - // TODO: set rotation of the fillPoly? parallactic-mp.angle I think. - // Use g.transformVertices to do the rotation + g.setColor(0, 0, 0).fillCircle(MX, MY, RADII.arcMax + 3); + g.setColor(COL.moon).fillCircle(MX, MY, RADII.moon - 1); + g.setColor(COL.txture).drawImage(moon_texture, MX, MY, { + rotate: 0 + }); + // TODO: can set the rotation here to the parallacticAngle from getMoonPosition + g.setColor(COL.shadow).fillPoly(shadowShape); + // TODO: set rotation of the fillPoly? parallactic-mp.angle I think. + // Use g.transformVertices to do the rotation } function drawDayRing(times) { - let r_ = RADII.arcMin; - let rm = RADII.arcMax; - let rd = RADII.dots; - let radT = [tToRad(times[0]), tToRad(times[1])]; - let hhmm = [require("locale").time(times[0], 1), require("locale").time(times[1], 1)]; - g.setColor(COL.day); - Utils.fillArc(g, MX, MY, r_, rm, radT[0], radT[1]); - g.setColor(COL.night); - Utils.fillArc(g, MX, MY, r_, rm, radT[1] - TAU, radT[0]); - // write sunrise/sunset times - g.setFont('6x8').setColor(COL.stime); - g.setFontAlign(0, 1, 3).drawString(hhmm[0], MX - rm - 2, MY); - g.setFontAlign(0, 1, 1).drawString(hhmm[1], MX + rm + 2, MY); - // draw dots - let edges = []; - let isDay = false; - let flag = false; - if (radT[1] > TAU) { - edges = [radT[1] - TAU, radT[0]]; - g.setColor(COL.ddots); - isDay = true; - } else { - edges = [radT[0], radT[1]]; + let r_ = RADII.arcMin; + let rm = RADII.arcMax; + let rd = RADII.dots; + let radT = [tToRad(times[0]), tToRad(times[1])]; + let hhmm = [require("locale").time(times[0], 1), require("locale").time(times[1], 1)]; + g.setColor(COL.day); + Utils.fillArc(g, MX, MY, r_, rm, radT[0], radT[1]); + g.setColor(COL.night); + Utils.fillArc(g, MX, MY, r_, rm, radT[1] - TAU, radT[0]); + // write sunrise/sunset times + g.setFont('6x8').setColor(COL.stime); + g.setFontAlign(0, 1, 3).drawString(hhmm[0], MX - rm - 2, MY); + g.setFontAlign(0, 1, 1).drawString(hhmm[1], MX + rm + 2, MY); + // draw dots + let edges = []; + let isDay = false; + let flag = false; + if (radT[1] > TAU) { + edges = [radT[1] - TAU, radT[0]]; + g.setColor(COL.ddots); + isDay = true; + } else { + edges = [radT[0], radT[1]]; + g.setColor(COL.ndots); + isDay = false; + } + for (var i = 0; i < 24; i++) { + let a = i * TAU / 24; + if (!flag && a > edges[0] && a < edges[1]) { + //first cross + if (isDay) { g.setColor(COL.ndots); - isDay = false; - } - for (var i = 0; i < 24; i++) { - let a = i * TAU / 24; - if (!flag && a > edges[0]) { - //first cross - if (isDay) { g.setColor(COL.ndots); } else { g.setColor(COL.ddots); } - flag = true; - } else if (flag && a > edges[1]) { - //second cross - if (isDay) { g.setColor(COL.ddots); } else { g.setColor(COL.ndots); } - flag = false; - } - let dotSize = (i % 3 == 0) ? 2 : 1; - let pX = MX + Math.cos(a) * rd; - let pY = MY + Math.sin(a) * rd; - g.fillCircle(pX, pY, dotSize); - } - let labels = ['6P', '12A', '6A', '12P']; - let qX = [rd - 9, 2, 11 - rd, 2]; - let qY = [1, rd - 10, 1, 12 - rd]; - g.setFont('4x6').setFontAlign(0, 0, 0).setColor(COL.ndots); - for (var j = 0; j < 4; j++) { - g.drawString(labels[j], MX + qX[j], MY + qY[j]); + } else { + g.setColor(COL.ddots); + } + flag = true; + } else if (flag && a > edges[1]) { + //second cross + if (isDay) { + g.setColor(COL.ddots); + } else { + g.setColor(COL.ndots); + } + flag = false; } + let dotSize = (i % 3 == 0) ? 2 : 1; + let pX = MX + Math.cos(a) * rd; + let pY = MY + Math.sin(a) * rd; + g.fillCircle(pX, pY, dotSize); + } + let labels = ['6P', '12A', '6A', '12P']; + let qX = [rd - 9, 2, 11 - rd, 2]; + let qY = [1, rd - 10, 1, 12 - rd]; + g.setFont('4x6').setFontAlign(0, 0, 0).setColor(COL.ndots); + for (var j = 0; j < 4; j++) { + g.drawString(labels[j], MX + qX[j], MY + qY[j]); + } } function drawHHMM(d) { - var HM = require("locale").time(d, 1 /*omit seconds*/ ).split(":"); - // write digital time - g.setBgColor(0, 0, 0).setColor(1, 1, 1).setFontVector(45); - g.setFontAlign(1, 1, 0).drawString(" " + HM[0], MX - 20, g.getHeight() + 3); - g.setFontAlign(-1, 1, 0).drawString(HM[1] + " ", MX + 30, g.getHeight() + 3); - // TODO: use the meridian text AM/PM or blank for 24 hr. - // var meridian = require("locale").meridian(d); + var HM = require("locale").time(d, 1 /*omit seconds*/ ).split(":"); + // write digital time + g.setBgColor(0, 0, 0).setColor(1, 1, 1).setFontVector(45); + g.setFontAlign(1, 1, 0).drawString(" " + HM[0], MX - 20, g.getHeight() + 3); + g.setFontAlign(-1, 1, 0).drawString(HM[1] + " ", MX + 30, g.getHeight() + 3); + // TODO: use the meridian text AM/PM or blank for 24 hr. + // var meridian = require("locale").meridian(d); } function moonShade(pos, mp) { - pos = pos !== undefined ? pos : M_POS; - mp = mp !== undefined ? mp : SunCalc.getMoonIllumination(new Date()); - // pos has x,y, r for the drawing, mp is from SunCalc Moon Illumination - let k = mp.fraction; - // k is the percent along the equator of the terminator - const pts = Math.min(pos.r >> 1, 32); - // this gives r/2 pts on the way down and up, capped at 64 total for polyfill - let a = [], - b = [], - s1 = 1, - s2 = 0; - // scale s1 is 1 or -1 for fixed edge of the shadow; defined via case switches below - // scale s2 factor for the moving edge of the shadow - // need to do some computation to simplify for new/full moon if k 'close enough' to 0 or 1/-1 - // - let isWaxing = (mp.phase < 0.5); - s1 = isWaxing ? -1 : 1; - s2 = isWaxing ? 1 - 2 * k : 2 * k - 1; - let tr = (pos.r + 0.5); - for (var i = 0; i < pts; i++) { - // down stroke on the outer shadow - var t = i * Math.PI / (pts + 1); //pts+1 so we leave the last point for the starting of going up - let cirX = Math.sin(t) * tr; - let cirY = Math.cos(t) * tr; - a.push(pos.x + s1 * cirX); //x - a.push(pos.y + cirY); //y - b.push(pos.x + s2 * cirX); //x for shadow edge - b.push(pos.y - cirY); //y going up for shadow edge - } - return a.concat(b); + pos = pos !== undefined ? pos : M_POS; + mp = mp !== undefined ? mp : SunCalc.getMoonIllumination(new Date()); + // pos has x,y, r for the drawing, mp is from SunCalc Moon Illumination + let k = mp.fraction; + // k is the percent along the equator of the terminator + const pts = Math.min(pos.r >> 1, 32); + // this gives r/2 pts on the way down and up, capped at 64 total for polyfill + let a = [], + b = [], + s1 = 1, + s2 = 0; + // scale s1 is 1 or -1 for fixed edge of the shadow; defined via case switches below + // scale s2 factor for the moving edge of the shadow + // need to do some computation to simplify for new/full moon if k 'close enough' to 0 or 1/-1 + // + let isWaxing = (mp.phase < 0.5); + s1 = isWaxing ? -1 : 1; + s2 = isWaxing ? 1 - 2 * k : 2 * k - 1; + let tr = (pos.r + 1); + for (var i = 0; i < pts; i++) { + // down stroke on the outer shadow + var t = i * Math.PI / (pts + 1); //pts+1 so we leave the last point for the starting of going up + let cirX = Math.sin(t) * tr; + let cirY = Math.cos(t) * tr; + a.push(pos.x + s1 * cirX); //x + a.push(pos.y + cirY); //y + b.push(pos.x + s2 * cirX); //x for shadow edge + b.push(pos.y - cirY); //y going up for shadow edge + } + return a.concat(b); } function tToRad(date) { - date = (date !== undefined) ? new Date(date.getTime()) : new Date(); - let milli = date - new Date(date.setHours(0, 0, 0, 0)); - return (milli / DAY_MILLIS + 0.25) * TAU; + date = (date !== undefined) ? new Date(date.getTime()) : new Date(); + let milli = date - new Date(date.setHours(0, 0, 0, 0)); + return (milli / DAY_MILLIS + 0.25) * TAU; } -function draw() { - // work out how to display the current time - var d = new Date(), - a = tToRad(d); - var shape = moonShade(M_POS, SunCalc.getMoonIllumination(d)); - var sTimes = SunCalc.getTimes(d, location.lat, location.lon); - var daylight = [sTimes.sunrise, sTimes.sunset]; - //clear time area - g.setColor(0).fillRect(0, 176 - 45, 176, 176); - drawMoon(shape); - drawDayRing(daylight); - drawHHMM(d); - // draw pointer - // TODO: Maybe later make this an overlay that can be removed?? -avoid drawing so much every minute/second - g.setColor(COL.needle).drawImage(needle, MX + RADII.needle * Math.cos(a), MY + RADII.needle * Math.sin(a), { rotate: a }); +function draw(date) { + d = date !== undefined ? date : new Date(); + //var d = new Date(), + var a = tToRad(d), + shape = moonShade(M_POS, SunCalc.getMoonIllumination(d)), + sTimes = SunCalc.getTimes(d, location.lat, location.lon), + daylight = [sTimes.sunrise, sTimes.sunset]; + //clear time area + g.clearRect(Bangle.appRect); //g.setColor(0).fillRect(0, 176 - 45, 176, 176); + drawMoon(shape); + drawDayRing(daylight); + drawHHMM(d); + // draw pointer + // TODO: Maybe later make this an overlay that can be removed?? -avoid drawing so much every minute/second + g.setColor(COL.needle).drawImage(needle, MX + RADII.needle * Math.cos(a), MY + RADII.needle * Math.sin(a), { + rotate: a + }); + +} +const shotTimes = [1720626960000, 1729184400000, 1738298880000, 1717575420000]; +/*first quarter -2 days moon at 10:20 in the summer + jun 10 2024 10:56 +full moon at 12 noon near fall equinox + Sep 17 2024 12:00 +new moon at 11pm in winter + dec 30 2024 23:48 +3rd quarter moon at 03:17 am + May 5 2024 03:17*/ + +function screenshots(times) { + let d = new Date(); + for (let t of times) { + d.setTime(t); + draw(d); + g.dump(); + } } // Clear the screen once, at startup @@ -197,12 +236,12 @@ draw(); var secondInterval = setInterval(draw, 10000); //was 1000 // Stop updates when LCD is off, restart when on Bangle.on('lcdPower', on => { - if (secondInterval) clearInterval(secondInterval); - secondInterval = undefined; - if (on) { - secondInterval = setInterval(draw, 10000); //was 1000 - draw(); // draw immediately - } + if (secondInterval) clearInterval(secondInterval); + secondInterval = undefined; + if (on) { + secondInterval = setInterval(draw, 10000); //was 1000 + draw(); // draw immediately + } }); /* Show launcher when middle button pressed This should be done *before* Bangle.loadWidgets so that @@ -210,5 +249,13 @@ widgets know if they're being loaded into a clock app or not */ Bangle.setUI("clock"); // Load widgets Bangle.loadWidgets(); -g.setTheme({fg:"#fff", bg:"#000", fg2:"#fff", bg2:"#004", fgH:"#fff", bgH:"#00f", dark:true }); +g.setTheme({ + fg: "#fff", + bg: "#000", + fg2: "#fff", + bg2: "#004", + fgH: "#fff", + bgH: "#00f", + dark: true +}); Bangle.drawWidgets(); \ No newline at end of file diff --git a/apps/daymoon/metadata.json b/apps/daymoon/metadata.json index e2cbf2a8f..49e4b9df8 100644 --- a/apps/daymoon/metadata.json +++ b/apps/daymoon/metadata.json @@ -1,10 +1,10 @@ { "id": "daymoon", "name": "DayMoon Circadian Clock", - "version": "0.04", + "version": "0.04.1", "dependencies": {"mylocation":"app"}, "description": "A 24 hour clockface showing the Moon Phase and portion of the day that the Sun is up inspired by Matthew Clark's *Fair Circadian* Pebble watchface", "icon": "daymoon.png", - "screenshots": [{"url":"screenshot.png"}], + "screenshots": [{"url":"s1.png"},{"url":"s2.png"},{"url":"s3.png"},{"url":"s4.png"}], "type": "clock", "tags": "clock,moon,lunar", "supports": ["BANGLEJS2"], diff --git a/apps/daymoon/s1.png b/apps/daymoon/s1.png new file mode 100644 index 0000000000000000000000000000000000000000..cb64c2f0128317c212e28b95182c84e63844ba98 GIT binary patch literal 4005 zcmbVPc|6k(`2TDSZSHeaRO(xv=!#*Yp18dH?l1uXmb_)inXA3={wW0W(u$#6Pb6U-0q# z>ovrAw|@i*M_e-m@PkKI06@sy%-Fy_+HJjXG+!i&hGB+ewv;q2q*bl3eetiiQoh#0h;=u!AZbaBd25o6nc(60S46u?p$5s zqI-}UAz+VDM*1Kx=_4i(#!bRcNfioV?t?}p`7o}ns+Z*eUM{?fFwh$59-#{e^0+u3 z10vVkm*apV{LM}Jz}iIow_QLJ{{LE_#Nd2D{k&E1yS@nmrt^?E);>=X6BGW`!9K_K z@1^obaZkBP5b6R-drxL%XO!FF>?SDcFav0Yu&k&F11D35LX2&mwJHJaPV+lUQCV?f zP94Loe4U^Ti5cMcl1$%-$JF0__sF)Z{QUw-_|XpMTz6Qgdb!FOmelac(*{OyDFGJz z`?`7Ve4+B_ub9n}eww&*TM_$H-`PL|h3$OFgc=asmLyuH!2e>+INShtgI<4Sm>CP- zh`X8qB3)T%?Isdp8U3r>KlJc70Z7kPg2~4zvEF}SQ)*|kf%KVuh8)q( zm%`kr7u_oSc-nAJ6Qj;zu+)$H_{eWk`ziMjaT9$f)DM@doQRC;s8C@+0dIhV9UgpUO*m2GQ0-&;y2>u` zmwGFX52M2{3O+O1@Np#5r^kL=&}*fzKj7Zd zmNJAD6pfZfB2dV*OHq(c+|?K0u{$_{8;>N!iEo!zcuakGSOy72qN?1ijSMB*>4yHU z(02d$%S*~+ zbHF7leuyg0qZRM$tg#rpw&q&G=e6x*kfA%1H2o{q@(%r*bdb72^@e+eMlr4K7N<@ zSk!KtmiT%ur2=rCkFTJ;ZoR3pteRDZ`2Kft?+IRcn`)9oaLP-l;eJO+8Fxmli~s2|N!q~i zyi=>Bff?!q=6cYB{*6>cTjYtY>;u{ytc(W6^(kP`)8|Eeg{Ol7 zlbeV*Sr2bF5t-f-Qdk^<#qX>QLi z9M5nPr6YdZxCF}#&R-P|O%Cbr*s4)^<<09Ixbax*wS~6 z49%_p<9@!J`&%KD&NMOH4-BMu0(Q8sf@UlU z$(8-_rpT|09Hv(1PL=RHZI=7nQ4u)Lxp=|m3(qz@IvSof7E@%D{AELFW@;dj;piv%YAoTF= zVR9Dwggl$nG_etdm_b)w6Jq7m1n%^GMPXaZ*;WBUp;)6uwcVjr5iS&O$aeRG>%~F; zj`=TTV;Q^!ucls)-PDPT1z&W^`aKJGAkO=yJ}sg7k!5w_x)!|6GJEc6e2}KBq@4{? zqn)41Lg5`5m8r(+f|oO^sjhqmi+)B)?+1(Vql)JmF`V?eta_wr^qmC+(aa!|mLT%t zH2InAvUoIeHQp5UIBDbbg(n*wrJqu6w*S6^u$9&wh^v89{{{<(KU z_^1>zwLFEBEP}H4y2x`j5ic3jFg@npcXn1EIXtjzL!a!IftUzxyyWz0lU}LbK?p^* zJ0@j)SXi$jONzM<{VhTcHXVyV3pgc&@Vqn=NNVUa1QaI+&gfIETaBZ548?Q{==HSB zk&lOrK-0sR*EnEx$sB7EQwXLNC2L zWm&r^++a{dvQpO)0#8e}{#>nKOcl3A(2LwFY7|rsm=31w)tAt7(st`hHtn|LR*B{# zoRM6qT^Hb8A1>Qu&60DQw^>0xV@{K;D&^)`3v#qt&CdIe zvSWJv?`}n4zMm`kZJBK3JzYuK86%dm88=eE;Y)CJas`dBeWk0jU`)z!`aY!&Jesq+ z&CHuZyEbCLJ2De$s|)k-yR1LNZ-#&!H2vVQ*5^!7nis9E?>DPty9`fWoBH`K8DOXz zcWe#&$p%G^?cKb++_!I|W~(N4zsb1eeHM*-`xG(UJLo#v1~X!GUgJ$?Tqj}CUTnDcNs|R5v~lywC&4DWOEYZN2<`H!0x2y zQW;TRBHaM2>c596-yEh*R+u{C(Vb&(U-;b$1=13g#GE3I-)I@32B4fT`3wzWW9FD* z*Rg&-ZLoE^xu1iH1oActjWWv86V*e+XH(v14e-;83j2>5H0HV|!k51&=4NIF%8N$| z22JXQu4-_>*UQSnZ-(|AQ_6iD9};PWe(P=%D&&D7BPN=(s@{s{eYds3T{l^1_;Ke^ zlblP+P|I|$+mBYHkB7s0NrEUydFA9p@hkGF;E~mq&t3l!SVyqIZLL+^^Tm6&nYisU zV}QA~slbOHmS1LV5anYj(qZ)m`HjB<_w+6K(gsfX3@7A)_s&}hk#fob&+a zI>fF1+&S>H{CLzbKn;pW`)c#dgo|*9g(rMcJ6`_PJw>@G3un< zwWpB}4s#Iom#b?ixZv}_*}V8ObtXvye|*+?1127aSQnU3wQq9u#2%B}$^|j@@amah zy9S`cc}(E;VzYMyS`p*C>Zc=|{%5+F{ZS`_gw$@z4I+?K%PJ?e;E>M!lnLi&;)#k zRLr*1rc4pQAu)NL5vS;xx||c&J#umkW^WI)C;)D7L(9p4IW5@{I^d;mz2M2#%*fbId6p*CG&MZ+HZc&Fc+;g9~|&tyMhy%N3mk2O;H z_1^O|FYs50eK1M~Ci_A}^UZt9Zh3QA1lwK*z1eP4p<*YVKKA^4r*vJTrEL_n_g}R0 zj8s%zab!Ih9y}yKav0PXAm3&6jymgqCQy5}T|iYyd2^Ut&zx;bXf7qBbRwLW#n7kd zBX~^>kZqH(-pA`~*N zO-Sh8a9#IW-@f0!;QPZl&mUfo$Lsubet9OFn;I}fcp(4)FyA!Pwfx7L{~bp9f4jQ* zC+Z(SftCi^K-DP!76AOma8p;y8iU%+pUp110o7|iJ1?4$WJ^M12VcirD$9u||10J# zboWkacg*=&=UKm*9omBFgbtS)F7v3<{vyD_mffTYbTk~h5CeIcvftD zY_T*OAiLWIj|BLkQr@uu=03T9nPwS{zRyI9Gj5lq7Xlb)j2$lmD0~#+2vCOG;lUu{ z_@C4s23!wr9L9*v32}jH04((X?-MQ0j-OQbcQErKccs_>r5f+Ek44y)*k{OF^f+cO zK0rxM;`?2|tA?~qqLRsE!qPU0a6&jl&WUEA=DIh#H`gbY$gCp$8GT@ooM$C_1!srj z3x@d%nGBN(NfZ4Yi6J}%qu=X+7IGoML~c ze+_8rPqTzS-_sOqVN`j84xN1*UXKh-5(3Nd%AonKp?V2; z0bkP05eO(ELKN?&%!R*7RA$`^3S$qIx_Y|m#IxED8dw?Ge}`HbSUK75g-~xgQ3j;* z2Txhv++M!igyLFF1U0ETw;{?@C}3hvN_vCsp5}_Lv3=y&g&daNFlm`F%1F3Ppau50 zCsl&ug5Tj_sS>ujWCoeUhkhlX_pozCvo131gIccYp8Eo!=J#^_Yru3sLHFacN<`1+`)zv&_Ks379R zo3CHjI(wW8eBY3Ppv;dA~Sv>iI=SjHc%Q2Uwlz9Dd*7zOBpNTCX>UnHw$`J<0iST05N-~~^Q zeQcbQ{yHUzTBDI}##znztM7)=viO*5C#$aNxk;GO6ZwgP23%FO()81Ft#(nruO_wY zvg|1zH^sr5ZOZ?wrbl(vx3FvATX9-9~h_4rCVjkaq zMb&m&iSTl^iT-*j)^{z!NNCf|jU=W3!j<~B%n8C?I9uI48t~HZKm99e zc})m@^g*qt!xMS7=M6~ox~tvq-Fs!xRX?55oNZUzwkz0%7i)X_;`h@xsOH$#IXF14 z&mz-RowOv<5ONDCS zw_MSG^mIlsK}Syqy5@Ittvvr6jyZ4Qg~IX~j+mKO9w(Hn^&VVyIohefO<8%I&}+RQ zuV-eokBUpuNlyDvzFf>=7*JpaOhm|sjD>7 zq1%UvUVVZ_zhLZdaU$1_e&}BEY1ZG0AL$#a^IonYf;#i7VZGER+_y@2-q%|H(DL7R zZwGsQIS+t1;c;&vgZD1CY&#)Qh#G0u$WR4#rgq61E$`G-Zw)3yEO_uG!@=MEMt=I5 zdWfphW)W_4;3xz7)qABE)_A)l`aEQoWM<)6$5Ag{t(f*ElaFQwL9e0cBQC4|W*6wC z@obLOsbh86-1dEYZ7^_ct?J=GG6<@gD=UU4?vDu6WxF5NID~z?-l%<7*b9PaiD{VNjgk2pc|Sy_}}3Mul}`Lc>{jPwKe_QIiWtYM4AF4B z^rltYHsU7g4!mEb3Rn~m_-sxdi8HT^nnq^v=M6ej5Lkgz5)|9t*URP5_X+;m&CNdj z8XsZ4#!QB;5F{6P)m3%T930ndZ=Xo;zLS!;`E2`X5kgi8sc}^XdD2pFu5QrFZX!nT zuGSI1jwm!3!0pgK4g3?W&I#}2fbVsic70MC%Hgd^o{%6~j0rLY&eHxy$k?)4twx@_ zX8NVdn8RIlPY83JS6ptXwv^UG-NLPi=`q+1lIFdrAHlI51K{w^mDaHYkIUcc>7CL{ z)O#cgy*1s?qg>Wd6A#JKdN>^CeVVZHC1p}f8-URMRZNt`B;Bs$$R9+56>_OQbEtKf%e+M$nK@pHRyXV!8o|f2!}Y~l5SW{7M$y)IumGve)~v`148T4iu3qK>6iK&p@f^k-1P9zwZA zZ`lS8!Df$5I1LV-2$WbadVs&3B?Ty9w+@Y7HcZAXcCGIH%s!h3d{jR3n^jeJoZNpS zTFxn_)VPqDGFya{$Njn}UB1JokAS%)I$Q5d@NQl_{Rm7!$01KXj8P%Yl6f0rj+D;-V$+wFd`Ker zb|eCa2RQ&!UMvd1DODg>)9wq(TL+SZ z0(9-ish7&lqB{S?Jka4Ox2mlk@i}0kaaeM^7y?pOND5)kOtGJ;F z8l@su6TCQ19pCeGPj>Wj$L_OKaQJr%6vp^0 z>y0m2m@)eeCu4Lf5NTmh7@cCMDe~uiI%@)*8@R=tHX~X2h%m0pvs@xU)Cgup8p5Ip zXOlpnUzkb4woX7)(_g~@AMtGj0Z{&n{W*2dpP$<*UovO@=^e_CMaq0cOt2&!&L~9< zTC($snGb_e4=*TUW<@4|SuK|xQ2wcrB3m_qEJd02%@@Jw`~@dP)}gBMyc`$HrI|h+ z#yvX<{*TJ~kMime-L>CgN5a}kroyz~Ke9c15HB{Cj4atL!B|`FeItE@i~aw$D%mV! zb5P2l8cS<6=wNU<_V}T&j*tBRMdoPQMHeU!7;Sop+ZL28{4KFem(S)Q?5ERcM=4&U zLA^9nOSq!VILP*n-Y)?f+Cqb#jYAqoz*%mST$W0IINc@1H*__q{dO~b-N%4esjB37 z_K0c3ND5J6B7x@i7xtB~@eR2BePj%E;AuH#2qs2{jM8u{e9FYRTp_8MHyq zJKYOb|K}md4Iu~XKC!^e!u#)Nvw!|Uy;2~m^`CnPQM!M9W&(T;qTYY|7+A_z{pUx3 Nn|h|YRodvd{{fO=i^u=~ literal 0 HcmV?d00001 diff --git a/apps/daymoon/s3.png b/apps/daymoon/s3.png new file mode 100644 index 0000000000000000000000000000000000000000..463be5d2160eaee50a0d89ddc07a7baaea249701 GIT binary patch literal 3632 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 D?gy^@ literal 0 HcmV?d00001 diff --git a/apps/daymoon/screenshot.png b/apps/daymoon/screenshot.png deleted file mode 100644 index 937ab01a9d201702e6c08fa6a5f4beeeca408d06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4538 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 B&Nu)7