[BUG]"TypeError: dates.stages[(EskomSePushInfo.calc.stage - 1)] is not iterable"

Describe the bug
The node currently returns the error: "TypeError: dates.stages[(EskomSePushInfo.calc.stage - 1)] is not iterable".
My curl query returns the correct data which confirms my credentials and account are working correctly.
To Reproduce
Steps to reproduce the behavior:

Using node  'eskomsepush'
Click on 'Deploy node with License key=token, Area id=westerncape-9-paarl and Status select= National(Eskom)'
See error: "TypeError: dates.stages[(EskomSePushInfo.calc.stage - 1)] is not iterable"

Expected behavior
The correct data should be returned. Please note that loadshedding is currently suspended until 16:00 on Sunday, 17 September. The flow worked correctly yesterday while there was loadshedding.
Screenshots
If applicable, add screenshots to help explain your problem. See below:
Flow:

Node config with error info:

Flow
If applicable, add a flow to help explain your problem. Below the content of my flow in json:
[{"id":"fddc3c3b17e3caa7","type":"tab","label":"Victron","disabled":false,"info":"","env":[]},{"id":"c7e0a8b8221196b2","type":"junction","z":"fddc3c3b17e3caa7","x":780,"y":240,"wires":[["1304ce8952d56b0e","42af2b5e525397d7"]]},{"id":"d083105e39f8ba68","type":"debug","z":"fddc3c3b17e3caa7","name":"Load shedding","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":560,"y":60,"wires":[]},{"id":"1d3e18f144e4911a","type":"debug","z":"fddc3c3b17e3caa7","name":"Schedule and events","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":580,"y":460,"wires":[]},{"id":"42af2b5e525397d7","type":"mqtt out","z":"fddc3c3b17e3caa7","name":"Set minSOC via MQTT","topic":"victron-home/W/c0847d9b49b3/settings/0/Settings/CGwacs/BatteryLife/MinimumSocLimit","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"1f709b6e6000e30b","x":940,"y":240,"wires":[]},{"id":"d29469701d379fef","type":"eskomsepush","z":"fddc3c3b17e3caa7","name":"","licensekey":"my-license-key","area":"westerncape-9-paarl","statusselect":"eskom","test":false,"verbose":false,"x":210,"y":260,"wires":[["d083105e39f8ba68","685df7425884177e"],["1d3e18f144e4911a"]]},{"id":"1304ce8952d56b0e","type":"debug","z":"fddc3c3b17e3caa7","name":"Scheduled charging","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":940,"y":200,"wires":[]},{"id":"685df7425884177e","type":"switch","z":"fddc3c3b17e3caa7","name":"Stage","property":"stage","propertyType":"msg","rules":[{"t":"eq","v":"1","vt":"str"},{"t":"eq","v":"2","vt":"str"},{"t":"eq","v":"3","vt":"str"},{"t":"eq","v":"4","vt":"str"},{"t":"eq","v":"5","vt":"str"},{"t":"eq","v":"6","vt":"str"},{"t":"eq","v":"7","vt":"str"},{"t":"eq","v":"8","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":9,"x":430,"y":260,"wires":[["d52bbef6b535646e"],["d52bbef6b535646e"],["9a6d3dab537b880f"],["f1c3df4e680f41a6"],["02a4b5afeb44828f"],["a4c5cec636c88ea4"],["d9ce6b3c5e1fe35e"],["a5f3427bd40f7aa1"],["c80133f055cc326a"]],"inputLabels":["EskomSePush API"],"outputLabels":["stage 1","stage 2","stage 3","stage 4","stage 5","stage 6","stage 7","stage 8","otherwise"]},{"id":"9a6d3dab537b880f","type":"change","z":"fddc3c3b17e3caa7","name":"60%","rules":[{"t":"set","p":"payload","pt":"msg","to":"{"value": 60.0}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":610,"y":160,"wires":[["c7e0a8b8221196b2"]]},{"id":"02a4b5afeb44828f","type":"change","z":"fddc3c3b17e3caa7","name":"70%","rules":[{"t":"set","p":"payload","pt":"msg","to":"{"value": 70.0}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":610,"y":240,"wires":[["c7e0a8b8221196b2"]]},{"id":"a5f3427bd40f7aa1","type":"change","z":"fddc3c3b17e3caa7","name":"100%","rules":[{"t":"set","p":"payload","pt":"msg","to":"{"value": 100.0}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":610,"y":360,"wires":[["c7e0a8b8221196b2"]]},{"id":"a4c5cec636c88ea4","type":"change","z":"fddc3c3b17e3caa7","name":"80%","rules":[{"t":"set","p":"payload","pt":"msg","to":"{"value": 80.0}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":610,"y":280,"wires":[["c7e0a8b8221196b2"]]},{"id":"f1c3df4e680f41a6","type":"change","z":"fddc3c3b17e3caa7","name":"65%","rules":[{"t":"set","p":"payload","pt":"msg","to":"{"value": 65.0}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":610,"y":200,"wires":[["c7e0a8b8221196b2"]]},{"id":"d52bbef6b535646e","type":"change","z":"fddc3c3b17e3caa7","name":"50%","rules":[{"t":"set","p":"payload","pt":"msg","to":"{"value": 50.0}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":610,"y":120,"wires":[["c7e0a8b8221196b2"]]},{"id":"c80133f055cc326a","type":"change","z":"fddc3c3b17e3caa7","name":"40%","rules":[{"t":"set","p":"payload","pt":"msg","to":"{"value": 40.0}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":610,"y":400,"wires":[["c7e0a8b8221196b2"]]},{"id":"d9ce6b3c5e1fe35e","type":"change","z":"fddc3c3b17e3caa7","name":"90%","rules":[{"t":"set","p":"payload","pt":"msg","to":"{"value": 90.0}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":610,"y":320,"wires":[[]]},{"id":"1f709b6e6000e30b","type":"mqtt-broker","name":"","broker":"<IP_ADDRESS>","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"autoUnsubscribe":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""}]
Software (please complete the following information):

node-red-contrib-eskomsepush version: 0.0.14

Additional context
Add any other context about the problem here.
It was working correctly yesterday, until I depleted my free quota. After midnight the quota was restored, but it then set the wrong stage. It set Stage 8 while there was in fact no active loadshedding. Test mode was enabled and I though the problem might be related to that. I then disabled test mode, but the result was the same. Below content of the json object displayed in debug window:
{"payload":{"value":100},"stage":"8","statusselect":"eskom","api":{"count":18,"limit":50},"calc":{"sleeptime":"63","stage":"8","active":true,"next":{"type":"schedule","start":1694930400000,"end":1694946600000,"stage":"8","duration":16200,"islong":true,"isHigherStage":false},"type":"schedule","start":1694930400000,"end":1694946600000,"secondstostatechange":11697,"duration":16200,"islong":true},"_msgid":"9c739d61bc181f6f"}
I then decided to delete the node and setup a new node (in case there was an issue with the existing node), but now get the error: "TypeError: dates.stages[(EskomSePushInfo.calc.stage - 1)] is not iterable" despite the correct credentials and settings and the curl confirming my account is working correctly. See below detail from curl:
curl --location --request GET 'https://developer.sepush.co.za/business/2.0/area?id=westerncape-9-paarl'
--header 'token: my-token'
{"events":[{"end":"2023-09-18T02:30:00+02:00","note":"Stage 3","start":"2023-09-18T00:00:00+02:00"},{"end":"2023-09-18T10:30:00+02:00","note":"Stage 4","start":"2023-09-18T08:00:00+02:00"},{"end":"2023-09-18T18:30:00+02:00","note":"Stage 4","start":"2023-09-18T16:00:00+02:00"},{"end":"2023-09-19T02:30:00+02:00","note":"Stage 4","start":"2023-09-19T00:00:00+02:00"},{"end":"2023-09-19T10:30:00+02:00","note":"Stage 4","start":"2023-09-19T08:00:00+02:00"},{"end":"2023-09-19T18:30:00+02:00","note":"Stage 4","start":"2023-09-19T16:00:00+02:00"}],"info":{"name":"Paarl (9)","region":"Western Cape"},"schedule":{"days":[{"date":"2023-09-17","name":"Sunday","stages":[["08:00-10:30"],["00:00-02:30","08:00-10:30"],["00:00-02:30","08:00-10:30"],["00:00-02:30","08:00-10:30","16:00-18:30"],["00:00-02:30","08:00-12:30","16:00-18:30"],["00:00-04:30","08:00-12:30","16:00-18:30"],["00:00-04:30","08:00-12:30","16:00-18:30"],["00:00-04:30","08:00-12:30","16:00-20:30"]]},{"date":"2023-09-18","name":"Monday","stages":[["16:00-18:30"],["08:00-10:30","16:00-18:30"],["00:00-02:30","08:00-10:30","16:00-18:30"],["00:00-02:30","08:00-10:30","16:00-18:30"],["00:00-02:30","08:00-10:30","16:00-20:30"],["00:00-02:30","08:00-12:30","16:00-20:30"],["00:00-04:30","08:00-12:30","16:00-20:30"],["00:00-04:30","08:00-12:30","16:00-20:30"]]},{"date":"2023-09-19","name":"Tuesday","stages":[[],["16:00-18:30"],["08:00-10:30","16:00-18:30"],["00:00-02:30","08:00-10:30","16:00-18:30"],["00:00-02:30","08:00-10:30","16:00-18:30"],["00:00-02:30","08:00-10:30","16:00-20:30"],["00:00-02:30","08:00-12:30","16:00-20:30"],["00:00-04:30","08:00-12:30","16:00-20:30"]]},{"date":"2023-09-20","name":"Wednesday","stages":[["00:00-02:30"],["00:00-02:30"],["00:00-02:30","16:00-18:30"],["00:00-02:30","08:00-10:30","16:00-18:30"],["00:00-04:30","08:00-10:30","16:00-18:30"],["00:00-04:30","08:00-10:30","16:00-18:30"],["00:00-04:30","08:00-10:30","16:00-20:30"],["00:00-04:30","08:00-12:30","16:00-20:30"]]},{"date":"2023-09-21","name":"Thursday","stages":[["06:00-08:30"],["06:00-08:30"],["06:00-08:30","22:00-00:30"],["06:00-08:30","14:00-16:30","22:00-00:30"],["06:00-10:30","14:00-16:30","22:00-00:30"],["06:00-10:30","14:00-16:30","22:00-00:30"],["06:00-10:30","14:00-16:30","22:00-00:30"],["06:00-10:30","14:00-18:30","22:00-00:30"]]},{"date":"2023-09-22","name":"Friday","stages":[["14:00-16:30"],["06:00-08:30","14:00-16:30"],["06:00-08:30","14:00-16:30"],["06:00-08:30","14:00-16:30","22:00-00:30"],["06:00-08:30","14:00-18:30","22:00-00:30"],["06:00-10:30","14:00-18:30","22:00-00:30"],["00:00-02:30","06:00-10:30","14:00-18:30","22:00-00:30"],["00:00-02:30","06:00-10:30","14:00-18:30","22:00-00:30"]]},{"date":"2023-09-23","name":"Saturday","stages":[["22:00-00:30"],["14:00-16:30","22:00-00:30"],["06:00-08:30","14:00-16:30","22:00-00:30"],["06:00-08:30","14:00-16:30","22:00-00:30"],["06:00-08:30","14:00-16:30","22:00-00:30"],["06:00-08:30","14:00-18:30","22:00-00:30"],["06:00-10:30","14:00-18:30","22:00-00:30"],["00:00-02:30","06:00-10:30","14:00-18:30","22:00-00:30"]]}],"source":"https://sepush.co.za/"}}
With verbose logging enabled I see the following in the debug window:
msg : Object content:
{"api":{"lastUpdate":"2023-09-17T07:25:58.329Z","info":{"allowance":{"count":34,"limit":50,"type":"daily"}}},"status":{"lastUpdate":"2023-09-17T07:25:59.129Z","info":{"status":{"capetown":{"name":"Cape Town","next_stages":[{"stage":"3","stage_start_timestamp":"2023-09-17T16:00:00+02:00"}],"stage":"0","stage_updated":"2023-09-16T22:00:00.342998+02:00"},"eskom":{"name":"Eskom","next_stages":[{"stage":"3","stage_start_timestamp":"2023-09-17T16:00:00+02:00"},{"stage":"4","stage_start_timestamp":"2023-09-18T05:00:00+02:00"}],"stage":"0","stage_updated":"2023-09-16T22:00:00.342998+02:00"}}}},"area":{"lastUpdate":"2023-09-17T07:26:00.787Z","info":{"events":[{"end":"2023-09-18T02:30:00+02:00","note":"Stage 3","start":"2023-09-18T00:00:00+02:00"},{"end":"2023-09-18T10:30:00+02:00","note":"Stage 4","start":"2023-09-18T08:00:00+02:00"},{"end":"2023-09-18T18:30:00+02:00","note":"Stage 4","start":"2023-09-18T16:00:00+02:00"},{"end":"2023-09-19T02:30:00+02:00","note":"Stage 4","start":"2023-09-19T00:00:00+02:00"},{"end":"2023-09-19T10:30:00+02:00","note":"Stage 4","start":"2023-09-19T08:00:00+02:00"},{"end":"2023-09-19T18:30:00+02:00","note":"Stage 4","start":"2023-09-19T16:00:00+02:00"}],"info":{"name":"Paarl (9)","region":"Western Cape"},"schedule":{"days":[{"date":"2023-09-17","name":"Sunday","stages":[["08:00-10:30"],["00:00-02:30","08:00-10:30"],["00:00-02:30","08:00-10:30"],["00:00-02:30","08:00-10:30","16:00-18:30"],["00:00-02:30","08:00-12:30","16:00-18:30"],["00:00-04:30","08:00-12:30","16:00-18:30"],["00:00-04:30","08:00-12:30","16:00-18:30"],["00:00-04:30","08:00-12:30","16:00-20:30"]]},{"date":"2023-09-18","name":"Monday","stages":[["16:00-18:30"],["08:00-10:30","16:00-18:30"],["00:00-02:30","08:00-10:30","16:00-18:30"],["00:00-02:30","08:00-10:30","16:00-18:30"],["00:00-02:30","08:00-10:30","16:00-20:30"],["00:00-02:30","08:00-12:30","16:00-20:30"],["00:00-04:30","08:00-12:30","16:00-20:30"],["00:00-04:30","08:00-12:30","16:00-20:30"]]},{"date":"2023-09-19","name":"Tuesday","stages":[[],["16:00-18:30"],["08:00-10:30","16:00-18:30"],["00:00-02:30","08:00-10:30","16:00-18:30"],["00:00-02:30","08:00-10:30","16:00-18:30"],["00:00-02:30","08:00-10:30","16:00-20:30"],["00:00-02:30","08:00-12:30","16:00-20:30"],["00:00-04:30","08:00-12:30","16:00-20:30"]]},{"date":"2023-09-20","name":"Wednesday","stages":[["00:00-02:30"],["00:00-02:30"],["00:00-02:30","16:00-18:30"],["00:00-02:30","08:00-10:30","16:00-18:30"],["00:00-04:30","08:00-10:30","16:00-18:30"],["00:00-04:30","08:00-10:30","16:00-18:30"],["00:00-04:30","08:00-10:30","16:00-20:30"],["00:00-04:30","08:00-12:30","16:00-20:30"]]},{"date":"2023-09-21","name":"Thursday","stages":[["06:00-08:30"],["06:00-08:30"],["06:00-08:30","22:00-00:30"],["06:00-08:30","14:00-16:30","22:00-00:30"],["06:00-10:30","14:00-16:30","22:00-00:30"],["06:00-10:30","14:00-16:30","22:00-00:30"],["06:00-10:30","14:00-16:30","22:00-00:30"],["06:00-10:30","14:00-18:30","22:00-00:30"]]},{"date":"2023-09-22","name":"Friday","stages":[["14:00-16:30"],["06:00-08:30","14:00-16:30"],["06:00-08:30","14:00-16:30"],["06:00-08:30","14:00-16:30","22:00-00:30"],["06:00-08:30","14:00-18:30","22:00-00:30"],["06:00-10:30","14:00-18:30","22:00-00:30"],["00:00-02:30","06:00-10:30","14:00-18:30","22:00-00:30"],["00:00-02:30","06:00-10:30","14:00-18:30","22:00-00:30"]]},{"date":"2023-09-23","name":"Saturday","stages":[["22:00-00:30"],["14:00-16:30","22:00-00:30"],["06:00-08:30","14:00-16:30","22:00-00:30"],["06:00-08:30","14:00-16:30","22:00-00:30"],["06:00-08:30","14:00-16:30","22:00-00:30"],["06:00-08:30","14:00-18:30","22:00-00:30"],["06:00-10:30","14:00-18:30","22:00-00:30"],["00:00-02:30","06:00-10:30","14:00-18:30","22:00-00:30"]]}],"source":"https://sepush.co.za/"}}},"calc":{"sleeptime":"124","stage":"0","active":false,"next":{"type":"event","start":1694988000000,"end":1694997000000,"stage":"3"}}}
Followed by msg: error
TypeError: dates.stages[(EskomSePushInfo.calc.stage - 1)] is not iterable

I modified eskomsepush.js as follows at line 186:
    // Scheduled downtime has the thing that the time is in locatime     // So not just like events, where they are in UTC with an offset     let BreakLoop = false;     for (const dates of EskomSePushInfo.area.info.schedule.days) {       let stageIndex = EskomSePushInfo.calc.stage - 1;       if (stageIndex >= 0 && stageIndex < dates.stages.length) {         if(Array.isArray(dates.stages[stageIndex])) {           for (const schedule of dates.stages[stageIndex]) {             const ScheduleStart = Date.parse(dates.date + ' ' + schedule.split('-')[0]);             let ScheduleEnd = Date.parse(dates.date + ' ' + schedule.split('-')[1]);             if (ScheduleEnd < ScheduleStart) {               ScheduleEnd += (24 * 60 * 60 * 1000);             }             if (now < ScheduleEnd) {               BreakLoop = true;               // This schedule is either active or will be next               if (now >= ScheduleStart) {                 EskomSePushInfo.calc.active = true;                 EskomSePushInfo.calc.type = 'schedule';                 EskomSePushInfo.calc.start = ScheduleStart;                 EskomSePushInfo.calc.end = ScheduleEnd;               } else {                 EskomSePushInfo.calc.next = {                   type: 'schedule',                   start: ScheduleStart,                   end: ScheduleEnd,                   stage: EskomSePushInfo.calc.stage                 };               }             }             if (BreakLoop) { break; }           }         } else {           console.warn('Not an array:', dates.stages[stageIndex]); // Warning if not an array         }       } else {         console.warn('Invalid stage index:', stageIndex); // Warning if stage index is out of bounds       }       if (BreakLoop) { break; }     }
The error is indicating that dates.stages[EskomSePushInfo.calc.stage-1] is not an iterable object (for stage 0 loadshedding) at the time this code runs and therefore:

I declared stageIndex before the inner loop to hold the value of EskomSePushInfo.calc.stage - 1.
I added a conditional check to ensure that stageIndex is within a valid range before entering the inner loop.
I added another conditional check to confirm that dates.stages[stageIndex] is an array before starting the inner loop.

It now runs correctly. Below the full updated code:
`module.exports = function (RED) {
'use strict'
const axios = require('axios')
const EskomSePushInfo = {
api: {
lastUpdate: null,
info: {}
},
status: {
lastUpdate: null,
info: {}
},
area: {
lastUpdate: null,
info: {}
},
calc: {}
}
function getMinutesToAPIReset () {
const now = new Date()
const targetTime = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 2, 0, 0);
if (now > targetTime) {
targetTime.setDate(targetTime.getDate() + 1);
}
const timeDiff = targetTime - now;
const minutesLeft = Math.floor(timeDiff / (1000 * 60))
return minutesLeft

}
function checkAllowance (node) {
const options = {}
const headers = { token: node.config.licensekey }
if (node.config.verbose === true) {
  node.warn('Running function checkAllowance')
}
axios.get('https://developer.sepush.co.za/business/2.0/api_allowance',
  { params: options, headers }).then(function (response) {
  EskomSePushInfo.api.info = response.data
  if (EskomSePushInfo.api.lastUpdate === null) {
    EskomSePushInfo.api.lastUpdate = new Date()
    updateSheddingStatus(node)
  }
  EskomSePushInfo.api.lastUpdate = new Date()
})
  .catch(error => {
    node.warn({ error: error.message })
  })

}
function checkStage (node) {
const options = {}
const headers = { token: node.config.licensekey }
if (node.config.verbose === true) {
  let warnstring = 'Running function checkStage'
  if (EskomSePushInfo.status.lastUpdate === null) {
    warnstring += ' - initial run'
  } else {
    warnstring += ' after ' + ((new Date() - EskomSePushInfo.status.lastUpdate) / 60000).toFixed(0) + ' minutes'
  }
  node.warn(warnstring)
}
axios.get('https://developer.sepush.co.za/business/2.0/status',
  { params: options, headers }).then(function (response) {
  EskomSePushInfo.status.info = response.data
  EskomSePushInfo.status.lastUpdate = new Date()
  // Call updateSheddingStatus again now we have new data
  updateSheddingStatus(node)
})
  .catch(error => {
    node.warn({ error: error.message })
  })

}
function checkArea (node) {
const options = { id: node.config.area }
const headers = { token: node.config.licensekey }
const url = 'https://developer.sepush.co.za/business/2.0/area'
if (node.config.verbose === true) {
  let warnstring = 'Running function checkArea'
  if (EskomSePushInfo.area.lastUpdate === null) {
    warnstring += ' - initial run'
  } else {
    warnstring += ' after ' + ((new Date() - EskomSePushInfo.area.lastUpdate) / 60000).toFixed(0) + ' minutes'
  }
  node.warn(warnstring)
}
if (node.config.test) {
  options.test = 'current'
}
axios.get(url,
  { params: options, headers }).then(function (response) {
  EskomSePushInfo.area.info = response.data
  EskomSePushInfo.area.lastUpdate = new Date()
  // Call updateSheddingStatus again now we have new data
  updateSheddingStatus(node)
})
  .catch(error => {
    node.warn({ error: error.message })
  })

}
function updateSheddingStatus (node, msg) {
const now = new Date()
// Check allowance every ten minutes
if ((msg && msg.payload === 'allowance' ) || EskomSePushInfo.api.lastUpdate === null || (now.getTime() - EskomSePushInfo.api.lastUpdate.getTime()) > 600000) {
  checkAllowance(node)
}

// If we don't have API info, we just return
if (Object.entries(EskomSePushInfo.api.info).length === 0) {
  node.warn('No API info (yet), refusing to continue')
  return
}

// The same is true if we have no API calls left
if (EskomSePushInfo.api.info.allowance.count >= EskomSePushInfo.api.info.allowance.limit) {
  node.warn('No API calls left, not checking status/schedule')
  return
}

// Fetching actual information takes 2 calls, so calculate how long until the next API count
// reset and divide the calls over the day. Wait at least 10 minutes between calls
if ((EskomSePushInfo.api.info.allowance.limit - EskomSePushInfo.api.info.allowance.count) > 0) {
  EskomSePushInfo.calc.sleeptime = (getMinutesToAPIReset() / ((EskomSePushInfo.api.info.allowance.limit - EskomSePushInfo.api.info.allowance.count) / 2)).toFixed(0)
  if (EskomSePushInfo.calc.sleeptime < 10) { EskomSePushInfo.calc.sleeptime = 10 }
} else {
  EskomSePushInfo.calc.sleeptime = 30
}

if (( msg && msg.payload === 'stage' ) || EskomSePushInfo.status.lastUpdate === null || (now.getTime() - EskomSePushInfo.status.lastUpdate) > (EskomSePushInfo.calc.sleeptime * 60000)) {
  checkStage(node)
}

if (( msg && msg.payload === 'area' ) || EskomSePushInfo.area.lastUpdate === null || (now.getTime() - EskomSePushInfo.area.lastUpdate) > (EskomSePushInfo.calc.sleeptime * 60000)) {
  checkArea(node)
}

// Now we have all info to continue. Just making sure that all update values are non null.
if (EskomSePushInfo.api.lastUpdate === null ||
    EskomSePushInfo.status.lastUpdate === null ||
    EskomSePushInfo.area.lastUpdate === null) {
  (node.config.verbose === true) && node.warn('Not enough info to continue.')
  return
}

// Determine the current stage
EskomSePushInfo.calc.stage = EskomSePushInfo.status.info.status[node.config.statusselect].stage

if (node.config.verbose === true) {
  node.warn('API call status: ' + EskomSePushInfo.api.info.allowance.count + '/' + EskomSePushInfo.api.info.allowance.limit)
  node.warn(EskomSePushInfo)
}

// Default to false, overrule of loadshedding is active
EskomSePushInfo.calc.active = false

// Are there any events going on?
if (Object.entries(EskomSePushInfo.area.info.events).length > 0) {
  const EventStart = Date.parse(EskomSePushInfo.area.info.events[0].start)
  const EventEnd = Date.parse(EskomSePushInfo.area.info.events[0].end)
  if (now >= EventStart && now < EventEnd) {
    EskomSePushInfo.calc.type = 'event'
    EskomSePushInfo.calc.active = true
    if (EskomSePushInfo.area.info.events[0].note.match(/Stage (\d+)/i)) {
      EskomSePushInfo.calc.stage = EskomSePushInfo.area.info.events[0].note.match(/Stage (\d+)/i)[1]
    }
    EskomSePushInfo.calc.start = EventStart
    EskomSePushInfo.calc.end = EventEnd
  } else {
    EskomSePushInfo.calc.next = {
      type: 'event',
      start: EventStart,
      end: EventEnd,
      stage: EskomSePushInfo.area.info.events[0].note.match(/Stage (\d+)/i)[1]
    }
  }
}

// Scheduled downtime has the thing that the time is in locatime
// So not just like events, where they are in UTC with an offset
let BreakLoop = false;
for (const dates of EskomSePushInfo.area.info.schedule.days) {
  let stageIndex = EskomSePushInfo.calc.stage - 1;
  if (stageIndex >= 0 && stageIndex < dates.stages.length) {
    if(Array.isArray(dates.stages[stageIndex])) {
      for (const schedule of dates.stages[stageIndex]) {
        const ScheduleStart = Date.parse(dates.date + ' ' + schedule.split('-')[0]);
        let ScheduleEnd = Date.parse(dates.date + ' ' + schedule.split('-')[1]);
        if (ScheduleEnd < ScheduleStart) {
          ScheduleEnd += (24 * 60 * 60 * 1000);
        }
        if (now < ScheduleEnd) {
          BreakLoop = true;
          // This schedule is either active or will be next
          if (now >= ScheduleStart) {
            EskomSePushInfo.calc.active = true;
            EskomSePushInfo.calc.type = 'schedule';
            EskomSePushInfo.calc.start = ScheduleStart;
            EskomSePushInfo.calc.end = ScheduleEnd;
          } else {
            EskomSePushInfo.calc.next = {
              type: 'schedule',
              start: ScheduleStart,
              end: ScheduleEnd,
              stage: EskomSePushInfo.calc.stage
            };
          }
        }
        if (BreakLoop) { break; }
      }
    } else {
      console.warn('Not an array:', dates.stages[stageIndex]); // Warning if not an array
    }
  } else {
    console.warn('Invalid stage index:', stageIndex); // Warning if stage index is out of bounds
  }
  if (BreakLoop) { break; }
}

if (EskomSePushInfo.calc.next) {
  EskomSePushInfo.calc.next.duration = (EskomSePushInfo.calc.next.end - EskomSePushInfo.calc.next.start) / 1000
  EskomSePushInfo.calc.next.islong = EskomSePushInfo.calc.next.duration >= (4 * 3600)
  EskomSePushInfo.calc.secondstostatechange = parseInt((EskomSePushInfo.calc.next.start - now) / 1000)
  EskomSePushInfo.calc.next.isHigherStage = EskomSePushInfo.calc.next.stage > EskomSePushInfo.calc.next.stage
}

if (EskomSePushInfo.calc.active) {
  EskomSePushInfo.calc.duration = (EskomSePushInfo.calc.end - EskomSePushInfo.calc.start) / 1000
  EskomSePushInfo.calc.islong = EskomSePushInfo.calc.duration >= (4 * 3600)
  EskomSePushInfo.calc.secondstostatechange = parseInt((EskomSePushInfo.calc.end - now) / 1000)
}

if (node.config.verbose === true) {
  node.warn(EskomSePushInfo.calc)
}

// Send output
node.send([{
  payload: EskomSePushInfo.calc.active,
  stage: EskomSePushInfo.calc.stage,
  statusselect: node.config.statusselect,
  api: {
    count: EskomSePushInfo.api.info.allowance.count,
    limit: EskomSePushInfo.api.info.allowance.limit
  },
  calc: EskomSePushInfo.calc
}, {
  stage: EskomSePushInfo.status,
  schedule: EskomSePushInfo.area
}])

// And update the status
let fill = 'green'
let shape = 'ring'
let statusText = 'Stage ' + EskomSePushInfo.calc.stage + ': '

if (EskomSePushInfo.calc.active) {
  fill = 'yellow'
  if (EskomSePushInfo.calc.type === 'event') {
    shape = 'dot'
  }
  if ( EskomSePushInfo.calc.start ) {
    statusText += new Date(EskomSePushInfo.calc.start).toLocaleTimeString([], {timeStyle: 'short'})
    statusText += ' - ' + new Date(EskomSePushInfo.calc.end).toLocaleTimeString([], {timeStyle: 'short'})
  }
} else {
  if (new Date(EskomSePushInfo.calc.next.start).getUTCDay() !==  now.getUTCDate) {
    statusText += new Date(EskomSePushInfo.calc.next.start).toLocaleString([], {weekday: 'short'}) + ' '
  }
  statusText += new Date(EskomSePushInfo.calc.next.start).toLocaleTimeString([], {timeStyle: 'short'})
  statusText += ' - ' + new Date(EskomSePushInfo.calc.next.end).toLocaleTimeString([], {timeStyle: 'short'})
}

statusText += ' (API: ' + EskomSePushInfo.api.info.allowance.count + '/' + EskomSePushInfo.api.info.allowance.limit + ')'
node.status({
  fill, shape, text: statusText
})

}
function EskomSePush (config) {
RED.nodes.createNode(this, config)
const node = this
node.config = config

updateSheddingStatus(node)
const intervalId = setInterval(function () {
  updateSheddingStatus(node)
}, 60000)

node.on('input', function(msg) {
  updateSheddingStatus(node, msg)
})

node.on('close', function () {
  clearInterval(intervalId)
})

}
RED.nodes.registerType('eskomsepush', EskomSePush)
RED.httpNode.get('/eskomsepush/search', (req, res) => {
if (!req.query || !req.query.token || !req.query.search) {
res.setHeader('Content-Type', 'application/json')
return res.send('invalid')
}
const headers = {
token: req.query.token
}
const options = {
text: req.query.search
}
res.setHeader('Content-Type', 'application/json')
axios.get('https://developer.sepush.co.za/business/2.0/areas_search',
  { params: options, headers }).then(function (response) {
  return res.send(response.data)
})
  .catch(error => {
    return res.send({ error: error.message })
  })

})
RED.httpNode.get('/eskomsepush/api', (req, res) => {
if (!req.query.token) {
res.setHeader('Content-Type', 'application/json')
return res.send('invalid')
}
const headers = {
token: req.query.token
}
const options = {}
res.setHeader('Content-Type', 'application/json')
axios.get('https://developer.sepush.co.za/business/2.0/api_allowance',
  { params: options, headers }).then(function (response) {
  return res.send(response.data)
})
  .catch(error => {
    return res.send({ error: error.message })
  })

})
}`

Thanks for de detailed report and update (I've edited it a bit for readability; three backticks helps with multiline pre-formated text in markdown). I'll review the code and create a new release.

Thank you, and thanks for the three backtics hint. I also identified an issue with the sleeptime calculation which caused the free API quota to be depleted. JavaScript is performing a string comparison instead of a numerical one.
To fix it, I used parseFloat() to convert it to a number, like so:
EskomSePushInfo.calc.sleeptime = parseFloat((getMinutesToAPIReset() / ((EskomSePushInfo.api.info.allowance.limit - api_allowance_buffer - EskomSePushInfo.api.info.allowance.count) / 2)).toFixed(0)); if (EskomSePushInfo.calc.sleeptime < 60) {      EskomSePushInfo.calc.sleeptime = 60      if (node.config.verbose === true) {node.warn("Calculated sleeptime was less than 60. Set it to 60: " + EskomSePushInfo.calc.sleeptime) } }
Since I also use the API for another function in Home Assistant I introduced "api_allowance_buffer" to enable me to allocate quota for other function. Below the code for the updated function updateSheddingStatus:
`  function updateSheddingStatus (node, msg) {
const now = new Date()
const api_allowance_buffer = 15
// Check allowance every ten minutes
if ((msg && msg.payload === 'allowance' ) || EskomSePushInfo.api.lastUpdate === null || (now.getTime() - EskomSePushInfo.api.lastUpdate.getTime()) > 600000) {
  checkAllowance(node)
}

// If we don't have API info, we just return
if (Object.entries(EskomSePushInfo.api.info).length === 0) {
  node.warn('No API info (yet), refusing to continue')
  return
}

// The same is true if we have no API calls left
if (EskomSePushInfo.api.info.allowance.count >= EskomSePushInfo.api.info.allowance.limit) {
  node.warn('No API calls left, not checking status/schedule')
  return
}

// Fetching actual information takes 2 calls, so calculate how long until the next API count
// reset and divide the calls over the day. Wait at least 60 minutes between calls
// reduce limit by api_allowance_buffer to cater for units consumed by other API calls
node.warn("Minutes to API Reset: " + getMinutesToAPIReset())

if ((EskomSePushInfo.api.info.allowance.limit - EskomSePushInfo.api.info.allowance.count) > 0) {
  EskomSePushInfo.calc.sleeptime = (getMinutesToAPIReset() / ((EskomSePushInfo.api.info.allowance.limit - api_allowance_buffer - EskomSePushInfo.api.info.allowance.count) / 2)).toFixed(0)
  if (node.config.verbose === true) {
    node.warn("API allowance limit: " + EskomSePushInfo.api.info.allowance.limit)
    node.warn("API allowance count: " + EskomSePushInfo.api.info.allowance.count)
    node.warn("Calculated sleeptime: " + EskomSePushInfo.calc.sleeptime)
  }
  EskomSePushInfo.calc.sleeptime = parseFloat((getMinutesToAPIReset() / ((EskomSePushInfo.api.info.allowance.limit - api_allowance_buffer - EskomSePushInfo.api.info.allowance.count) / 2)).toFixed(0));
  if (EskomSePushInfo.calc.sleeptime < 60) {
      EskomSePushInfo.calc.sleeptime = 60
      if (node.config.verbose === true) {node.warn("Calculated sleeptime was less than 60. Set it to 60: " + EskomSePushInfo.calc.sleeptime) }
  }
} else {
  EskomSePushInfo.calc.sleeptime = 120
  if (node.config.verbose === true) { node.warn("Set sleeptime to 120 since allowance count = 0: " + EskomSePushInfo.calc.sleeptime) }
}

if (( msg && msg.payload === 'stage' ) || EskomSePushInfo.status.lastUpdate === null || (now.getTime() - EskomSePushInfo.status.lastUpdate) > (EskomSePushInfo.calc.sleeptime * 60000)) {
  checkStage(node)
}

if (( msg && msg.payload === 'area' ) || EskomSePushInfo.area.lastUpdate === null || (now.getTime() - EskomSePushInfo.area.lastUpdate) > (EskomSePushInfo.calc.sleeptime * 60000)) {
  checkArea(node)
}

`

Thanks for all of the improvements. I've added the first to changes to the code. I don't like the api_allowance_buffer being fixed, so I'll adjust that part of the code a bit to be adjustable in the editPanel.

Thank you, I agree api_allowance_buffer should rather be adjustable in the editPanel. The code I posted also did not cater for the case where sleeptime will be negative due to .limit - .count < api_allowance_buffer

Herewith the part that I updated to catch "negative" sleeptime due to api_allowance_buffer:
`    // Fetching actual information takes 2 calls, so calculate how long until the next API count
// reset and divide the calls over the day. Wait at least 60 minutes between calls
// reduce limit by api_allowance_buffer to cater for units consumed by other API calls
if (node.config.verbose === true) {
node.warn("Minutes to API Reset: " + getMinutesToAPIReset())
}
let allowanceRemaining = EskomSePushInfo.api.info.allowance.limit - api_allowance_buffer - EskomSePushInfo.api.info.allowance.count

if (allowanceRemaining > 0) {
    EskomSePushInfo.calc.sleeptime = Math.round(getMinutesToAPIReset() / Math.ceil(allowanceRemaining / 2))
    if (node.config.verbose === true) {
        node.warn("API allowance limit: " + EskomSePushInfo.api.info.allowance.limit)
        node.warn("API allowance count: " + EskomSePushInfo.api.info.allowance.count)
        node.warn("Calculated sleeptime: " + EskomSePushInfo.calc.sleeptime)
    }
    if (EskomSePushInfo.calc.sleeptime < 60) {
        EskomSePushInfo.calc.sleeptime = 60
        if (node.config.verbose === true) {
            node.warn("Calculated sleeptime was less than 60. Set it to 60: " + EskomSePushInfo.calc.sleeptime)
        }
    }
} else {
    EskomSePushInfo.calc.sleeptime = 120
    if (node.config.verbose === true) {
        node.warn("Set sleeptime to 120 since allowance count is low: " + EskomSePushInfo.calc.sleeptime)
    }
}`

Ok, added that as well as the ability to fill out the limit in the edit panel. Released a new version.
Not too sure about the 60 minutes minimum. So if people start complaining, I might lower that number again (or make it configurable too).
Closing this issue for now. Thanks for your help and ideas. If you think of new things, please file a new issue.

Thank you for your quick response and your excellent work. The Node works very well.
I agree that " 60 minutes minimum" can be reset to "10 minutes minimum", especially now that sleeptime is correctly calculated


Add OWNERS from k8s.io/kubernetes/federation

This is required to enable the submit queue.

Merging manually.


Authorisazion Error

Hi. The Web-App is pretty cool I did it along the github-source, but I am getting the following error anytime: {"status":"error","message":"not authorized"}
But I am the owner of the sheet and everything. Im tryying four 3 hours now to solve that issue...
If someone could help, it would be very appreciated :-)

I'm having the exact, same problem - two years later. I wish I could figure this out.

Another poster suggested that the spreadsheet must be published to the Web for everything to work. Here goes...

Nope. That didn't work either.

Do you have some thing to share where I can replicate? I saw similar issues but solved them

I have shared my spreadsheet - anyone with the link can use it. I have copied the code into the script editor Code.gs. I've published the webapp, with the correct settings, but I am still unable to load data.
It's clear that the problem lies in communicating with the spreadsheet. I've tried many variations of the link to the spreadsheet as well. Here's what I have currently, which doesn't work:
[line 2] var SPREADSHEET_ID = 'https://docs.google.com/spreadsheets/d/162v8SAA8TlFoC0X09AefW1Fiyg0o1XzyhyLyBnedu28/edit#gid=330220740';
I've changed nothing from the original except the links to the spreadsheets and to the webapp. How can I best illustrate the problem? How much code do you require? I'm very grateful for any assistance.

My test spreadsheet is at https://docs.google.com/spreadsheets/d/162v8SAA8TlFoC0X09AefW1Fiyg0o1XzyhyLyBnedu28/edit?usp=sharing

Will look in a few hours. Here is 2 am and I am sleepy. I added a memo to check tomorrow early.

You're so kind. :) Sleep well!

I've been messing around, and according to Google's script log, Requests for data are being completed. So it would seeem that the links work. I just switched the webapp to the legacy runtime, hoping that would help. No dice so far.
Here is a screen shot of the error message I get when testing the webapp link with the API key:

Or this could be a javascript issue. Here's the code, linked to the web page through a file called main.js, that generates an error message saying "Unexpected error loading results". The message is in the third line from last:
const app = function () {
const API_BASE = 'https://script.google.com/macros/s/AKfycbyZdJIKvRpVw8GwKxK7s4n-1xpGk1F8Y4zHaeGHb8zvHakjGVU/exec';
const API_KEY = 'bef';
const CATEGORIES = ['general', 'financial', 'technology', 'marketing'];
const state = {activePage: 1, activeCategory: null};
const page = {};

function init () {
	page.notice = document.getElementById('notice');
	page.filter = document.getElementById('filter');
	page.container = document.getElementById('container');

	_buildFilter();
	_getNewPosts();
}

function _getNewPosts () {
	page.container.innerHTML = '';
	_getPosts();
}

function _getPosts () {
	_setNotice('Loading posts');

	fetch(_buildApiUrl(state.activePage, state.activeCategory))
		.then((response) => response.json())
		.then((json) => {
			if (json.status !== 'success') {
				_setNotice(json.message);
			}

			_renderPosts(json.data);
			_renderPostsPagination(json.pages);
		})
		.catch((error) => {
			_setNotice('Unexpected error loading posts');
		})
}

you need to run it once from the excel file and do a first authorization. After the first authorization is done then it should work. It's a safety mechanic on the scripting side so that no smarty-pants can leak your data as a reversed GET REST call.
Try to bind your call to a button or event on some (1,1) cell and trigger it "manually" first. Once you trigger it..you will have the Google Authorization popup asking you to agree on it. Review and choose to agree and then it might work.
I did this 5 years ago and i remember i struggled alsoi

Thank you for your assistance. I'm so sorry, but I don't know what you mean by "running it from the excel file". I'm a proficient html and css coder, a middling javascript programmer, and a complete newbie to API. How do I perform this action? I think you're saying I need to make a simple function for calling information from the sheet? Thanks again.

https://www.benlcollins.com/apps-script/api-tutorial-for-beginners/ look at example 1. you need to make sure you run steps 5-6 (7) also. did you authorize the script to run?

and also review the Deploying the API part in here: https://www.freecodecamp.org/news/use-google-sheets-and-google-apps-script-to-build-a-blog-cms-c2eab3fb0b2b/

authorize the calls
run them as you (as it's complicated to pass via token a different id)
allow it anonymous so that you don't trick yourself and make it look like it's working but it's cookie bound. Try for that in incognito/porn mode to run it when done.

I will look over your instructions asap. I'm getting slammed at work. My office wants a covid-19 support website, and I know it would be better if it was CMS-based, but I'm limited to free resources for the moment.
I looked everywhere in Google Apps Scripts Dashboard for something about authorisation. I found  the following information under project properties "OAuth Scope required by script:
https://www.googleapis.com/auth/spreadsheets". Perhaps I am in over my head.
Maybe I need to stick with a static site.

Tell me more details. You need to just show data that you will scrape from somewhere else? Depending on the processing needs might this be sufficient already: https://help.github.com/en/github/working-with-github-pages/about-github-pages
drop a new repo. put some JS to fetch stuff and show it nicely. You get a public URL for free with no stress. Put a bit.ly on it to make it short. Make a qr out of it here: https://www.the-qrcode-generator.com/ and you are done. It will be as fresh as you want.
feel free to approach me on a private channel and i can try to help more. a bit bored at home due to quarantine

All of our province's students are now being homeschooled under the supervision of teachers. These students are learning French, but their parents cannot speak that language and do not know how to help then acquire and retain the language.
My office (okay, just me) is trying to create a website with links to French language resources that are accessible to parents and their children. I do not want to be stuck gathering and inserting all of my colleagues' suggestions into a static website (which is what I am currently stuck doing).
I want them to use a form that populates a database (a Google spreadsheet, in my case) which is then displayed on the site. This information should be fliterable by grade and by subject. I'm not scraping others' data. I have tried a number of solutions that integrate Google Forms and Sheets, and this CMS site was my last option.

The link you sent me - to Daniel Ireson's CMS blog - is exactly the solution I am attempting to implement. That's why I am posting here. My site is failing to load the data from the spreadsheet, and I don't know why. I created an API key, I added it to my website's javascript, I've set it as the key in my Google Apps Script Dashboard, I've checked and tested all my links... It's just not working.

That link on authorization (https://www.benlcollins.com/apps-script/api-tutorial-for-beginners/) was really useful - thanks! I used to be able to "run" the script, but no longer (it's greyed out). I remember being warned about using an unauthorized script by Google, though. I may have clicked the wrong button as a results. I will create a new code file so I can properly review permissions.

Now it's a runtime error. I saw this when I first started messing around with the Dashboard.

just dump in the console the e. some like logger.log(e). might be a data structure that could potentially also support JSON stringify for reading.
make sure it's easy to read https://coderwall.com/p/buwfjw/pretty-print-json-with-native-javascript

dunno what you study...but if you are at a technical school and assume by default people knowing git...you can have them push MR's to some data structure and wire a sample lister example project in react on heroku.

Goodness no! I'm just a public school teacher trying to build a dynamic website using Google Sheets. I only ever taught client-side coding. Most of what you are saying is gobbledygook to me, unfortunately.

Did anyone figure this out yet?  I have the same issue.  Such a shame things like this don't get resolved in a timely fashion.  People end up wasting hours trying to figure this out.


Lint all files

This uses the pre-commit hook to lint all files (pre-commit run --all-files), plus removes the continue-on-error option from the lint step in Actions.

[x] Draft for now as this includes the change and depends on https://github.com/RedHatProductSecurity/rapidast/pull/214

/lgtm


Support for playing artists, albums, genres and playlists

What
Major change:

Adds a PlayPlaylist intent for playing specific content - artists, albums, genres, and playlists.

Minor changes:

Moves config.js to config.js-sample and adds config.js to .gitignore
If you don't specify a player to use and you only have one player available, we use that player.

Testing

This depends on an update to squeezenode that was merged today, so rm -r node_modules/ && npm install to get the latest stuff.

I found the lambda-local module very helpful for testing my local code. After npm installing, you can run a test like so -

lambda-local -l muzak.js -h handler -e test/playAlbum.fixture.json

You might need to adjust the test fixture to use music from your library.

You can also test the AWS Lambda response with claudia -

claudia update && claudia test-lambda --event test/playAlbum.fixture.json

You can test the whole thing, end-to-end, by updating both your AWS Lambda function (either via claudia or manually) and the intents and utterances in your Alexa skill. Then speak a command to Alexa like, "Alexa, tell squeezebox to play the album Revolver."

Notes
This is a good start, but it is flawed! The biggest issue is that apparently the LMS API is case sensitive, if you can believe it.
I had a big headache when my local testing worked great, claudia testing of the remote function worked great, but then actually talking to Alexa was failing. It came down to the difference between "Revolver" vs "revolver." Insane. Soooo... if your music metadata is a mess, this might not work at all.  This seems to suggest that it might be necessary to write a set up script that uses the users LMS database to generate custom slot values rather than use a literal value. Assuming, of course, that the custom slot value will also be case sensitive, otherwise we gain nothing...
EDIT: Another issue is that the the LMS API doesn't provide any success or failure feedback beyond the success or failure of the actual request. So, if you ask to play an album that you don't have, the request submits successfully and we get no feedback that the album actually doesn't exist. One thing we could do is maybe search first before calling loadalbum, but I'm worried the latency would be too significant there.
I'm certain there will be other issues as well. In my local testing, requesting the artist "Sleater-Kinney" works, and requesting the album "Dig Me Out" works, but requesting the album "Dig Me Out" by "Sleater-Kinney" fails.  I don't know why. :/
Please test and leave feedback! Thanks!
cc: @lordpengwin @MikeDeSantis @glacket

Fantastic work! I can't wait to try out the new functionality. Truly exceptional programming, and so quickly.
-Mike

On Mar 24, 2017, at 7:13 PM, Corinne Hoener<EMAIL_ADDRESS>wrote:
@heylookltsme commented on this pull request.
In speechAssets/utterences.txt:

+PlayPlaylist play album {The Places You Have Come to Fear the Most|Album} in {Player}
+PlayPlaylist play the album {Revolver|Album} by {The Beatles|Artist} in {Player}
+PlayPlaylist play the album {Abbey Road|Album} by {The Beatles|Artist} in {Player}
+PlayPlaylist play the album {Dig Me Out|Album} by {Sleater-Kinney|Artist} in {Player}
+PlayPlaylist play the album {Never Lose that Feeling|Album} by {Swervedriver|Artist} in {Player}
+PlayPlaylist play the album {He Who Saw the Deep|Album} by {iLiKETRAiNS|Artist} in {Player}
+PlayPlaylist play the album {Push Barman to Open Old Wounds|Album} by {Belle and Sebastian|Artist} in {Player}
+PlayPlaylist play the album {The Places You Have Come to Fear the Most|Album} by {Dashboard Confessional|Artist} in {Player}
+PlayPlaylist play album {Revolver|Album} by {The Beatles|Artist} in {Player}
+PlayPlaylist play album {Abbey Road|Album} by {The Beatles|Artist} in {Player}
+PlayPlaylist play album {Dig Me Out|Album} by {Sleater-Kinney|Artist} in {Player}
+PlayPlaylist play album {Never Lose that Feeling|Album} by {Swervedriver|Artist} in {Player}
+PlayPlaylist play album {He Who Saw the Deep|Album} by {iLiKETRAiNS|Artist} in {Player}
+PlayPlaylist play album {Push Barman to Open Old Wounds|Album} by {Belle and Sebastian|Artist} in {Player}
+PlayPlaylist play album {The Places You Have Come to Fear the Most|Album} by {Dashboard Confessional|Artist} in {Player}
+PlayPlaylist play genre {rock|Genre}
I couldn't think of any three-word genres... can you?

—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.

Great job! I suspect as you said that generating the list of album utterances may be the way to go.

Thanks guys! I hope it works well enough for now. Please let me know what trouble you run into, because it's definitely not gonna be perfect.
I was actually just surprised by something that I thought would never work. I just asked Alexa to play the artist Sun Kil Moon. I assumed it would never work because she would hear "sun kill moon" (note the two L's in "kill"). But for whatever reason, she interpreted it correctly and sent the value "sun kil moon" to lambda and it started playing!
I have no clue how that possibly worked lol.  /shrug


Update dj111 branch to 3.2.10 release, add port of af721ca from master

Hi,
This is my first stab at a pull request for the issue mentioned in #1070. The approach here is:

Rebase dj111 onto tag 3.2.10 to get all the updates till 3.2.10 (since that's the last supported dal release for Django 1.11)
Fix merge conflicts
Put my fix at the tip of the (updated) dj111 branch
[Future, hopefully] Cut all 3.2.x releases from this branch, since someone on Django 2 will want >=3.3.x anyway

Does this approach sound correct in general?
As for specific things – other than my fix, the only non-common commits are 8f9a5ab, 5f35557, and e45972d. I fixed merge conflicts roughly as things made sense to me, but it's probable that I made mistakes there, and would appreciate input from someone more familiar with the testing setup.

Amazing effort, i've read it and have found no malware, so, should we release this in a new package like django-autocomplete-light-dj111 ? lawl :joy:

Hey, did you try copying the staticfiles from Django 2.0 in like src/dal_dj111/static/admin ... ?
Then you could enable Django 1.11 support in INSTALLED_APPS or something ?
What do you think ?
Keep up the great energy you will save the days for many users :+1:

So I see three possible approaches here:
Given your comment:

should we release this in a new package like django-autocomplete-light-dj111 ?

Let's call this Approach A would be to release this in a completely different package, called django-autocomplete-light-dj111.
Some problems with this approach that I see:

Documentation would have to be written about this separate package for Django 1
Versioning would be somewhat odd. What would the first version of this package be?

Hey, did you try copying the staticfiles from Django 2.0 in like src/dal_dj111/static/admin ... ? Then you could enable Django 1.11 support in INSTALLED_APPS or something ?

I have not tried this, but the end effect would be (if I understand your query correctly), something like:
# DAL for Django 1
INSTALLED_APPS = [ 'dal_dj1'...

and
# DAL for Django >=2
INSTALLED_APPS = ['dal'...

right? Basically the package would be the same, but you'd have different apps in INSTALLED_APPS for Django 1. Let's call this Approach B.
Again, I see the following problems with this approach

Extra documentation needs to be written
The concept of separate installed apps for Django 2 v/s 1 when you're using the same underlying package is somewhat confusing

In my comment above, I have suggested Approach C – which is, you merge this MR into branch dj111and simply tag commit 2409a35aa6772b459cf966388556bd05625ed81e as 3.2.11. This gets around the problems I see in the approaches above:

A very minor change in documentation is required (specifying that Django 1 is supported only for 3.2.x
Versioning makes sense, and we don't have to figure out any new versioning for the - -dj1 package

So, my view is that we should use Approach C and just tag 3.2.11 and all future 3.2 releases off the dj111 branch. Since you have already stated that 3.3+ releases won't explicitly support Django 1, this goes very well with it – if someone asks for Django 1 compatibility, you can simply point them to the dj111 branch and say “Accepting pull requests” :)
Thoughts?

Fixed by 3.4.1 release


new option

can u add option that can open 2 fut web app or more and search at same time on different player or object without get many captcha trigger

Can u do this without the autobuyer?

Open web app in multiple tab manually...


error function :crypto.rand_bytes/1 is undefined or private

Hi i'm trying to use romeo for fcm.
With:
{:ok, pid} = Conn.start_link(params)
i receive this log:

[info] Established connection to fcm-xmpp.googleapis.com
[info] Negotiating secure connection
[info] Connection successfully secured
[debug]<EMAIL_ADDRESS>[OUTGOING] "<stream:stream to='gcm.googleapis.com' version='1.0' xml:lang='en' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'>"
[debug]<EMAIL_ADDRESS>[INCOMING] "<stream:stream from=\"gcm.googleapis.com\" id=\"7Bxxxx147A02E00A\" version=\"1.0\" xmlns:stream=\"http://etherx.jabber.org/streams\" xmlns=\"jabber:client\">"
[debug]<EMAIL_ADDRESS>[INCOMING] "<stream:features><mechanisms xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\"><mechanism>X-OAUTH2</mechanism><mechanism>X-GOOGLE-TOKEN</mechanism><mechanism>PLAIN</mechanism></mechanisms></stream:features>"
[info] Authenticating with PLAIN
[debug]<EMAIL_ADDRESS>[OUTGOING] "<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>xxxxxx</auth>"
[debug]<EMAIL_ADDRESS>[INCOMING] "<success xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\"/>"
[info] Authenticated successfully
[debug]<EMAIL_ADDRESS>[OUTGOING] "<stream:stream to='gcm.googleapis.com' version='1.0' xml:lang='en' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'>"
[debug]<EMAIL_ADDRESS>[INCOMING] "<stream:stream from=\"gcm.googleapis.com\" id=\"xxxxxBAA404\" version=\"1.0\" xmlns:stream=\"http://etherx.jabber.org/streams\" xmlns=\"jabber:client\">"
[debug]<EMAIL_ADDRESS>[INCOMING] "<stream:features><bind xmlns=\"urn:ietf:params:xml:ns:xmpp-bind\"/><session xmlns=\"urn:ietf:params:xml:ns:xmpp-session\"/></stream:features>"
[error] GenServer #PID<0.1127.0> terminating
** (UndefinedFunctionError) function :crypto.rand_bytes/1 is undefined or private
    (crypto) :crypto.rand_bytes(2)
    (romeo) lib/romeo/stanza.ex:340: Romeo.Stanza.id/0
    (romeo) lib/romeo/stanza.ex:148: Romeo.Stanza.iq/2
    (romeo) lib/romeo/transports/tcp.ex:119: Romeo.Transports.TCP.bind/1
    (romeo) lib/romeo/transports/tcp.ex:66: Romeo.Transports.TCP.start_protocol/1
    (romeo) lib/romeo/connection.ex:90: Romeo.Connection.connect/2
    (connection) lib/connection.ex:622: Connection.enter_connect/5
    (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
Last message: nil
State: %Romeo.Connection{component: false, features: %Romeo.Connection.Features{amp?: false, compression?: false, mechanisms: [], registration?: false, stream_management?: false, tls?: false}, host: "fcm-xmpp.googleapis.com", jid<EMAIL_ADDRESS>legacy_tls: true, nickname: "", owner: #PID<0.1126.0>, parser: nil, password: "xxxx", port: 5235, preferred_auth_mechanisms: [], require_tls: true, resource: "", rooms: [], socket: nil, socket_opts: [], ssl_opts: [], stream_id: nil, timeout: 5000, transport: Romeo.Transports.TCP}
[info] Application

Is there a problem in romeo?
Thanks

I updated to git version

Ah, this is probably because you're using a more up-to-date erlang/OTP version where :crypto.rand_btyes was removed. I probably need to publish a new hex version...but the test suite is currently broken and I haven't had time to fix.


Optimise PRBMathCommon.exp2 by dividing all magic factors by 2

It may be possible to make PRBMathCommon.exp2 more efficient by dividing all magic factors by 2 and shifting by 127 instead of 128 bits, and finally refactoring this line:
result = result << ((x >> 128) + 1);

Into this:
result = result << (x >> 128);

This is no longer applicable since 62021c1.


issue for beta 1

This is for starting new enhancement for project

Added changes for beta

Added some changes for beta


Won't work on nested/reusable components?

Hi, great work on this plugin.
I have reusable components for most (if not all) html elements, when I try to align with react-grid-layout they don't work.
They don't follow any of the layout, margin props which makes it really hard to deal with.
However, when i switch to normal html elements react-grid-layout works.
Here is an example.

//- Say, this is my nav-bar component.
export default class Nav extends Component {
    render() {

    var layout = [
            {i: 'a', x: 0, y: 0, w: 1, h: 2, static: true},
            {i: 'b', x: 2, y: 0, w: 1, h: 2, static: true},
            {i: 'c', x: 4, y: 0, w: 1, h: 2, static: true},
            {i: 'd', x: 6, y: 0, w: 1, h: 2, static: true},
            {i: 'e', x: 8, y: 0, w: 1, h: 2, static: true}
        ];

        return (

            <ReactGridLayout className="layout" layout={layout} cols={12} rowHeight={30} width={1200} margin={[1, 1]} >

                    Home

                    Blog

                    About

                    Media

                    Contacts

            </ReactGridLayout>
        )
    };
}

//- And this is the Div component that wraps the html
 element and adds some styles
//- with react-css-modules.
@CSSModules(styles)
class Div extends Component {

    render() {

        return (

                 {this.props.children}

        );
    }
}

Here is a screenshot of this approach.

As you can see, it completely ignored most (if not all) of the props i passed here
<ReactGridLayout className="layout" layout={layout} cols={12} rowHeight={30} width={1200} margin={[1, 1]} >

which includes the layout array that had x: n .
Here is a link to the project.

Yes - your custom components must be able to receive a style prop.

@STRML I'm sorry, what do you mean my custom components must be able to receive a style prop?
What contents should the style prop have so as to play well with react-grid-layout?
I don't quite understand you sir.

As in, your custom component must be able to receive a style prop and pass it on to an actual DOM element. That's how RGL places elements in the grid.

Oh, I kinda get it now.
So I can get to add layout directly on the children with data-grid.

Thanks STRML, I've had the same issue, however I should note that in my case I needed to pass all the props to the child DIV, not only the style.
Also, I still have issues with the draggable handler not being addedwhen the element is contained in a Redux Connect element.
Some other things to be aware of when using a non DOM element in the grid?

@madarco I also have an array of connected child components inside ReactGridLayout and so draggableHandle is ignored. Have you found a solution for this redux-related case by a chance?

Here we go:

Do not define draggableHandle prop

In your GridCell's render:

const {
  style,
} = this.props;
const propsToPassToDragHandle = _.omit(this.props, ['dispatch', 'style', 'children', 'className', '...other custom props...']);
return (

      {/* more content */}

);

You get this with only those red squares working as handlers:

The only thing left to sort out is z-index while dragging.

@kachkaev really interesting approach!
I had some limited results by passing all the ...props to my child elements, however in the end I've found a simpler solution:
I've created a new react component that takes all the children, encapsulate them in a div, and then put them in our ReactGridLayout.
In this way I use this new component in place of the ReactGridLayout and all the elements will have the resize handle.
//Add a div around each component:
childrenDivs = [];
for (let c = 0; c < children.length; c++) {
   let key = children[c].key ? children[c].key : c;
   childrenDivs.push(
{ children[c] }
)
}

return (
       <ReactGridLayout className="layout" {...props}>
           { childrenDivs }
       </ReactGridLayout>
);

In my testing I found out that is compulsory to pass both style  and className properties to the React components being layouted by ReactGridLayout
 <ReactGridLayout className="layout" layout={layout} cols={3} rowHeight={50}
                         width={1200}>
          <SimpleTile key="tile-1">1</SimpleTile>
          <SimpleTile key="tile-2">2</SimpleTile>
          <SimpleTile key="tile-3">3</SimpleTile>
          <SimpleTile key="tile-4">4</SimpleTile>
          <SimpleTile key="tile-5">5</SimpleTile>
          <SimpleTile key="tile-6">6</SimpleTile>
          <SimpleTile key="tile-7">7</SimpleTile>
          <SimpleTile key="tile-8">8</SimpleTile>
          <SimpleTile key="tile-9">9</SimpleTile>
        </ReactGridLayout>

Listing of SimpleTile, notice passed values for className and style
import React, {Component, PropTypes} from 'react'

class SimpleTile extends React.Component {

  render() {
    return

      {this.props.children}

;
  }
}

export default SimpleTile

After making this work, I think it looks alright. I guess the only thing that needs to be done is to document this on a highly visible / easily findable place.
Thanks for posting your findings!

I still don't understand how to do this. Clear docs on this would be amazing. I'm trying to include custom components via styled-jsx.

From the example above posted from JabbyPanda, SimpleTile should add the following props to the root element.
  const propsToPassToDragHandle = _.pick(this.props, ['onMouseDown', 'onMouseUp', 'onTouchStart', 'onTouchEnd']);
  return
{stuff}

Eh.. I just ended up wrapping the custom component in a
. Seems to work fine.


Windows Event Logs: Application logs not showing in queries?

Under Advanced Settings -> Data -> Windows Event Logs, I added Application, (Error, Warning, and Information are all selected); however, when running queries, I am not seeing any of the logs from the machine running the agent. When I open Event Viewer (Windows Logs -> Application), I see that there are currently 9,126 events.

Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.

ID: bf163f82-d5be-8b0a-e176-be3e85961eb6
Version Independent ID: 39d5db21-18e8-a7c5-4408-407bf1905d73
Content: Connect data sources to Azure Sentinel Preview?
Content Source: articles/sentinel/connect-data-sources.md
Service: sentinel
GitHub Login: @rkarlin
Microsoft Alias: rkarlin

Thanks for the feedback and bringing this to our notice . At this time we are reviewing the feedback and will update the document as appropriate .

@Jnchi, is this still an issue? there's usual a day lag before you start seeing any logs. if this is still an issue, please send mail to<EMAIL_ADDRESS>and include your Azure subscription ID and the subscription type and we will be able to connect you to the Sentinel feature owners for further investigation


Non-cuda installation error

Hi there,
Thanks for making a great tool for folks to easily implement SAM! I am using a MacBook Pro (Intel processor) and ran into the error below on installation. Would appreciate any assistance!

Resolved https://github.com/ksugar/segment-anything-2 to commit 00ff21e508132e3b351d8c2c4b713970b03df001
Installing build dependencies ... error
error: subprocess-exited-with-error
× pip subprocess to install build dependencies did not run successfully.
│ exit code: 1
╰─> [4 lines of output]
Collecting setuptools>=61.0
Downloading setuptools-75.1.0-py3-none-any.whl.metadata (6.9 kB)
ERROR: Could not find a version that satisfies the requirement torch>=2.3.1 (from versions: 1.11.0, 1.12.0, 1.12.1, 1.13.0, 1.13.1, 2.0.0, 2.0.1, 2.1.0, 2.1.1, 2.1.2, 2.2.0, 2.2.1, 2.2.2)
ERROR: No matching distribution found for torch>=2.3.1
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error
× pip subprocess to install build dependencies did not run successfully.
│ exit code: 1
╰─> See above for output.
note: This error originates from a subprocess, and is likely not a problem with pip.

Hi kunleng,
Did you solve this issue? I have the exact same problem with my Apple Silicon.
In the meantime, pointing the version 0.4.1 during installation does work:
python -m pip install<EMAIL_ADDRESS>
But it is not an answer to our problem.
@ksugar: could you take a look at this please? Seems to be a dependency conflict.

Hi @kunleng and @bertrandchauveau, thank you for reporting the issue, and apologies for the delayed response.
I tested the installation on my Apple Silicon Mac (M2) using the exact commands provided in the README, and it completed successfully without any errors:
conda create -n samapi -y python=3.10
conda activate samapi
python -m pip install git+https://github.com/ksugar/samapi.git

Could you please share your system specifications by running the following command?
sw_vers

For reference, here’s the output on my system:
ProductName:		macOS
ProductVersion:		14.3.1
BuildVersion:		23D60

I hope this helps me gather the necessary information to resolve the issue quickly.

Hi ksugar,
Thanks for your reply.
Here is the output:
ProductName:		macOS
ProductVersion:		15.1.1
BuildVersion:		24B2091

To complete my previous message, the installation runs successfully for version 0.4.1, but the issue occurs starting from v0.5

Sorry for the double post, but I found out how to resolve the issue (at least mine).
As I can understand, it is due to a "confusion" between an arm64 and x86_64 conda environment, so for Mac users M chips versus Intel chips.
For some reasons, x86_64 seems to only support up to the 2.2.2 pytorch version.
This behavior of my installation of miniconda is probably due to the data transfer between my Intel Mac to my recent M chip Mac.
By forcing the creation of an arm64 conda environment, like this, I can confirm that the installation runs flawlessly:
CONDA_SUBDIR=osx-arm64 conda create -n samapi -y python=3.10

Thanks for figuring that out! Unfortunately I have an Intel Mac and like you said it seems like PyTorch supports up to the 2.2.2 version :(
Get Outlook for iOShttps://aka.ms/o0ukef

From: Bertrand Chauveau @.>
Sent: Sunday, December 22, 2024 9:42:02 AM
To: ksugar/samapi @.>
Cc: Leng, Kun @.>; Mention @.>
Subject: Re: [ksugar/samapi] Non-cuda installation error (Issue #29)
Sorry for the double post, but I found out how to resolve the issue (at least mine). As I can understand, it is due to a "confusion" between an arm64 and x86_64 conda environment, so for Mac users M chips versus Intel chips. For some reasons,
ZjQcmQRYFpfptBannerStart
This Message Is From an External Sender
This message came from outside your organization.
ZjQcmQRYFpfptBannerEnd
Sorry for the double post, but I found out how to resolve the issue (at least mine).
As I can understand, it is due to a "confusion" between an arm64 and x86_64 conda environment, so for Mac users M chips versus Intel chips.
For some reasons, x86_64 seems to only support up to the 2.2.2 pytorch version.
This behavior of my installation of miniconda is probably due to the data transfer between my Intel Mac to my recent M chip Mac.
By forcing the creation of an arm64 conda environment, like this, I can confirm that the installation runs flawlessly:
CONDA_SUBDIR=osx-arm64 conda create -n samapi -y python=3.10
—
Reply to this email directly, view it on GitHubhttps://urldefense.com/v3/__https://github.com/ksugar/samapi/issues/29*issuecomment-2558533164__;Iw!!LQC6Cpwp!u25Acwc_QP44IRtx1biR6H-_nJAVYrI9WbUoe2-5X9Rpzj4kDdv8GnluTiiC8CfuNKcuLW1T1IWhoWa883rT9ld52Q$, or unsubscribehttps://urldefense.com/v3/__https://github.com/notifications/unsubscribe-auth/AKDFHZPQ46D6XEJPSVXXHMT2G32WVAVCNFSM6AAAAABP4BZUH2VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDKNJYGUZTGMJWGQ__;!!LQC6Cpwp!u25Acwc_QP44IRtx1biR6H-_nJAVYrI9WbUoe2-5X9Rpzj4kDdv8GnluTiiC8CfuNKcuLW1T1IWhoWa883qaKYdrMg$.
You are receiving this because you were mentioned.Message ID: @.***>

Hi @bertrandchauveau and @kunleng, thank you for identifying the cause and sharing the workaround.
The dependency on torch>=2.3.1 is inherited from segment-anything-2, and we need to consider whether it will work with version 2.2.2.
If anyone knows how to install SAM2 on an Intel Mac with dependencies, please share your insights.


generate id=.. for dl items

It seems like GNU just, fixed this as well as #4 in texinfo!!! Hell yeah.
See e.g. https://docs.jade.fyi/gnu/gcc/gcc.html#index-fno_002dweak


feat(interactive): Add GetLoadingConfig interactive for AdminService

As titled.

Closed since could be fetched via GetGraphMeta API


Tasks not being saved (Mega-Tutorial XXII)

I believe this code is missing a db.session.commit(), which means the added Tasks aren't being saved. When later code goes to fetch them, it gets None back (see comment 21 from Mubi here) and subsequent errors.
    def launch_task(self, name, description, *args, **kwargs):
        rq_job = current_app.task_queue.enqueue('app.tasks.' + name, self.id,
                                                *args, **kwargs)
        task = Task(id=rq_job.get_id(), name=name, description=description,
                    user=self)
        db.session.add(task) #<------ Missing commit
        return task

@nk9, that is actually intended, let me explain.
It is actually a bad practice to insert database commits randomly anywhere in the code. The problem is that there is no way to control what is written to the database, since the commit is not specific to a particular operation, it writes all changes made, regardless of whether the change was made in the line right above or in some unrelated function that executed before.
The accepted practice is to only issue database commits in the highest stack level once a "unit of work" is complete. In the case of a web application, the highest stack level is that of the view function, and the unit of work is a request. Using this approach, the different functions invoked by the view function can add their changes to the database session, but the commit happens at the very end. If any errors were to occur, then Flask-SQLAlchemy will rollback the session, and this guarantees that you don't end up with inconsistencies in your database.
The particular commit for launching a task is here: https://github.com/miguelgrinberg/microblog/blob/a7dac64395c5a6f4e46832e484aafd139b2f729e/app/main/routes.py#L202.
Hope this is clear, let me know if there are any questions.

Thanks for explaining, I can see why this is the accepted practice. I also see now that this is discussed in the text of the post. Thanks for taking the time to review with me.


BUG: flaky CI tests when importing package

Description
The tests randomly fail in the CI. This does not happen when previously running typst compile (which likely caches the required packages).
Steps to Reproduce the Problem
See: https://github.com/Otto-AA/tt-flaky-mre

actions for commit with prior compiling: https://github.com/Otto-AA/tt-flaky-mre/actions/runs/10107159826/job/27950605501
actions for commit without prior compiling: https://github.com/Otto-AA/tt-flaky-mre/actions/runs/10107194074/job/27950771095

Create multiple test cases importing linguify and let them run in github actions (I did not yet test it with other packages, but I guess it is the same. Could also be related to the use of WASM by linguify).
#import "@preview/linguify:0.4.1": linguify, set-database

Test

Expected Behavior
Test should not be flaky and should not depend on previously running typst compile.
Actual Behavior
Several errors occur seemingly random, sometimes the tests also pass.

error: failed to decompress package (failed to unpack /home/runner/.cache/typst/packages/preview/linguify/0.4.1/typst.toml)
error: file not found (searched at /home/runner/.cache/typst/packages/preview/linguify/0.4.1/typst.toml)
error: failed to load WebAssembly module (unexpected end-of-file (at offset 0x23be1))

Context

Platform: Ubuntu 22.04 (Github actions)
Version: ci-semi-stable

This is a byproduct of the lack of locking from concurrent package downloads, see #16, this is essentially fixed on main, but the rewrite is unfortunately not fully finished.
One way to, to avoid this happening in CI is to run typst or by extension typst-test on a single test which depends on all packages required once before running the others:
- run: |
  typst-test run dummy-test
  typst-test run

Thanks, that explains it. I guess I need to improve my issue searching skills ^^
Closing, as it's already fixed on main.


update dependencies to reflect move of eml2 to eml

Thanks for making this great package! I'm excited to try it out.
You are probably already aware of this, but eml2 has moved, which means metajam now won't install using the usual devtools::install_github syntax

Hi @scelmendorf ,
Glad you are finding metajam useful! We have a pull request open to implement this change. Should be merged soon. I let you know when it is ready.

Hi,
we have merged the changes that should finalize the implementation of the changes to EML. Please resintall metajam at your earliest convenience and let us know if you are experiencing any problems.
Also, we would greatly appreciate if you could give us some more information about the scope of your use of metajam (project goal, type of data you are using/analyzing, ...) and how you found this package.
Thank you!

Thanks! I will reinstall it and let you know if I have any further issues. For background - We are analyzing a bunch of data from our LTER site (niwot ridge), and I had made a some sample scripts/examples/functions for reproducible workflows reading niwot data/eml directly from EDI . A researcher at our site who was recently at nceas suggested this package might make that even easier, so I thought I'd check it out.


Suppress the Java reflective access errors in the log

No worked required. Eth2Signer construct HttpServer in a different way which doesn't cause the netty reflective access logs to appear in debug level in the logs.


Seach bar and filter feature

A search bar has been added to the top of the internship page. It can be used to search internships based on Company name and Internship name both.

A Filter feature is added at the right side of the search bar . It can be used to filter results based on the mode of work-online, offline, hybrid. (default-All modes)

Can you add fuzzy search functionality?
Also specify the issue you are solving.

yes sure @Shubh942 .

@MitashaJ , for results not found , the footer seems to get misplaced, also check that, keep the border color of searchbar as theme color

okay  @PSS2134 ! i will update it in my new issue where I have added fuzzy search functionality - PR #211 .

@MitashaJ resolve conflicts

Adding a search bar for company names and work mode-based filter option #211
New PR has been created with fizzy search functionality ,responsive design and NO conflicts @HimanshuNarware


labelStyle props not works in version 3.0.0

Current behaviour
labelStyle props not works in version 3.0.0, but worked correct in previous version

Expected behaviour

Code sample
For Syntax Highlighting check this link

Screenshots (if applicable)

What have you tried

Your Environment

software
version

ios or android
both

expo

react-native
0.63.4

react-native-tab-view
3.0.0

react-native-pager-view
5.1.0

node
15.11.0

npm or yarn

I used labelStyle for set label color, but now i see for it uses separate props activeColor and inactiveColor.
I replaced set color to these props. Problem resolved.


Dig into Split Horizon DNS

We've taken a hard dependency on split horizon in AWS.  I'd like to dig into this and figure out how exactly nodes are behaving here.

Looks like this was my issue: https://github.com/couchbase-partners/amazon-cloud-formation-couchbase/issues/34


Update Agent.php

issue #105

That won't work .. it is better to create a new scope function to return all tickets assigned and owned by the agent. may be something like
$query->where('agent_id', $user->id)->orWhere('user_id', $user->id);

But that would require to modify also the database function in tickets controller, I am just got tired now, I will help in this issue within this week if i got time.

Sure it works ;) Just did it in my application. I used this approach because i didn't wanted to change the controller... Have a look at it when you are ready to - there's no hurry.
Thx
Jens

Sorry, you were right - this causes problems in the dashboard statistics.
As a workaround i added another function within the model...
Thx


CV: 2020-2021 Aided a known fraudster to create his pump and dump scheme.

https://tinyurl.com/3xaej452 (changed link to removeddit since /r/monero mod removed to try to cover it up - maybe fluffy himself?)

Spam or truth? There is only one way to find out. Look into the sources yourself.

tari-project/tari#2904

tari-project/tari#2893

tari-project/tari#2892

tari-project/tari#2859

tari-project/tari#2916

tari-project/tari#2915

tari-project/tari#2914

tari-project/tari#2912


ECONNRESET

<Please be sure to remove any private information before submitting.>
Repro steps:
<Enter steps to reproduce issue>
Action: azureStorage.deployStaticWebsite
Error type: Error
Error Message: Error uploading "/Users/kingsley/Tricor Dropbox/Kingsley Tan/01. IT Team/01. Projects/03. DocuTax/06. Prototype/01. Site v1/libs/bootstrap-table/locale/bootstrap-table-ru-RU.js": read ECONNRESET
Version: 0.7.0
OS: darwin

Could be a part of #352?

Hi @kingsleytth , I could repro this error when I physically unplugged and plugged in the connection again.
Does this error occur every time? Did you encounter the error on trying to deploy again?


npm config set tarball no longer supported by npm as of npm v9.3.1

npm config set tarball not working anymore
Is there any workaround? We were using the tarball option to prevent the download of the node headers from internet as our environment doesn't have an internet access. Simply passing it to node-gyp doesn't work because a sub dependency which we don't have in our hand need node-gyp
Executed command

npm config set tarball "/node/node-headers.tar.gz" --verbose

npm details:

node bin location = C:\Program Files\nodejs\node.exe
node version = v18.14.1
npm local prefix = C:\Users\User
npm version = 9.3.1
cwd = C:\Users\User
HOME = C:\Users\User
Run npm config ls -l to show all defaults.

Verbose output:

npm verb cli C:\Program Files\nodejs\node.exe C:\Program Files\nodejs\node_modules\npm\bin\npm-cli.js
npm info using<EMAIL_ADDRESS>npm info using<EMAIL_ADDRESS>npm verb title npm config set tarball
npm verb argv "config" "set" "tarball" "" "--loglevel" "verbose"
npm verb logfile logs-max:10 dir:C:\Users\User\AppData\Local\npm-cache_logs\2023-02-18T09_38_37_771Z-
npm verb logfile C:\Users\User\AppData\Local\npm-cache_logs\2023-02-18T09_38_37_771Z-debug-0.log
npm info config set "tarball" ""
npm verb stack Error: tarball is not a valid npm option
npm verb stack     at Config.set (C:\Program Files\nodejs\node_modules\npm\lib\commands\config.js:158:15)
npm verb stack     at Config.exec (C:\Program Files\nodejs\node_modules\npm\lib\commands\config.js:120:22)
npm verb stack     at Config.cmdExec (C:\Program Files\nodejs\node_modules\npm\lib\base-command.js:130:17)
npm verb stack     at Npm.exec (C:\Program Files\nodejs\node_modules\npm\lib\npm.js:154:20)
npm verb stack     at async module.exports (C:\Program Files\nodejs\node_modules\npm\lib\cli.js:134:5)
npm verb cwd C:\Users\User
npm verb Windows_NT 10.0.19044
npm verb node v18.14.1
npm verb npm  v9.3.1
npm ERR! tarball is not a valid npm option
npm verb exit 1
npm verb code 1
Usage: npm
(...)

Hello, there is a very similar issue to this one https://github.com/nodejs/node-gyp/issues/2798. In short, the workaround is to downgrade npm. For more details on what caused this behavior and when it started, please visit the see https://github.com/npm/cli/issues/6126#issuecomment-1431758381

@matthias-heller AFAIK the new approach is setting the nodedir and making sure it contains the node-headers unpacked.
For example:
curl -sSL https://nodejs.org/download/release/${NODE_VERSION}/node-${NODE_VERSION}-headers.tar.gz -o /opt/node-headers.tgz
tar -xzvf /opt/node-headers.tgz /opt/node-headers
npm config set nodedir /opt/node-headers

Please let me know if this is not the recommended approach.

Is there any recommended approach to this? Looks like the nodedir option has also been removed as of npm v9.

Not sure what the use case is here, but hopefully this is of some help to others.
I managed to get around the issue when using yarn by doing
npm_config_tarball=node-headers.tar.gz yarn install

Try using export GYP_TARBALL=/node/node-headers.tar.gz for workaround it

I had this issue and initially downgraded npm to get the old behaviour to work. The following worked with npm 9.6.7
npm install --tarball=/tmp/node-headers.tgz

As others have posted, the preferred way to set npm configs is put npm_config_<NAME>=<VALUE> before your command. This has been updated in the docs.


issue #206 resolve

#206 : removing material ui packages in development branch done.

No description provided.

@kaiwalyakoparkar can you review this?


[WIP][BEAM-2821] Run isort and autopep8 in preparation for futurize.

In preparation for running futurize (py2/3 support) run isort on the imports and autopep8 ( W391,W293,W291,E306,E305,E304,E303). This also adds isort to run_pylint but skips the files where isort was doing things which conflicted with pylint.

Coverage decreased (-0.008%) to 69.96% when pulling 7ae79b7a0391f880142f5a13aacfb1e2572aa3fd on holdenk:BEAM-2821-isort-and-autopep8 into 6280d497b5264536a485993ccdf21034f2a1c3d8 on apache:master.

Run Python Postcommit

cc @robertwb

@robertwb there is an option to do multi imports per single line with isort, let me poke at it.

An unexpected benefit of SL mode is it seems to agree with pylint a lot more (which is good since newer pylints use isort internally so the disagreements are a little confusing).

The flink runner failed which doesn't make a lot of sense for the changes, jenkins retest this please.

Coverage decreased (-0.2%) to 69.728% when pulling f7f5e68b9e6241f27da06afb3e00fad26f23f1de on holdenk:BEAM-2821-isort-and-autopep8 into 6280d497b5264536a485993ccdf21034f2a1c3d8 on apache:master.

Coverage decreased (-0.003%) to 69.735% when pulling 7ee5d4e023020a2820b697cb671b39dd3e357b90 on holdenk:BEAM-2821-isort-and-autopep8 into c9653f27056d9d4dd85f7951f4edbd9da524b894 on apache:master.

Thanks @robertwb ! I've updated it a bit, I hope your staying cool in the heat wave (if you're in an area impacted by it). Looking forward to moving on to the next bit of Py3 support :)

Coverage decreased (-0.05%) to 69.683% when pulling 2d79c8df457dddae1fc4348f12de3194c37abe42 on holdenk:BEAM-2821-isort-and-autopep8 into c9653f27056d9d4dd85f7951f4edbd9da524b894 on apache:master.

LGTM

Thanks 😀


bug: Incorrect code completions on some methods.

Target Package

@kintone/rest-api-client 1.3.0

Environment

Operating System: Windows 10 Pro / macOS Catalina
Node.js version: v12.15.0
Visual Studio Code v1.45.1

Current Behavior

code completion on record.updateAllRecords() is not correct.

Some methods have the same issue, for example; updateRecords(), updateRecordAssignees(), deleteRecords(), deleteAllRecords(),  deleteRecordComment(), and so on.
Expected Behavior

They should be RecordID and RevisionID.

@shinkaihiroyuki
Thank you for reporting.
There's a possibility that it's due to VSCode's bug, so we'll search if there're related issues in VSCode's repo.

@shinkaihiroyuki
We investigated and found that we could reproduce the problem with the following code that's unrelated to rest-api-client.
type Foo = string | number;
type Bar = string | number;

function someFunc(params: {
  foo: Foo,
  bar: Bar,
}) {
  //
}

// then hover here
someFunc(

So we created an issue in VSCode repository.
https://github.com/microsoft/vscode/issues/98727
(Now it was transferred to TypeScript's repo: https://github.com/microsoft/TypeScript/issues/38829)
We'll track it and close this issue.
Thank you for reporting.


Model zoo?

It might be a good idea to create a model zoo or pipeline hub, for storing all the pipelines we create and make openly available.
That way, if people want to test one, they can download one, without downloading the rest.
Then in FP, we could add a widget for accessing the model zoo and interacting with it, adding simple ways to browse through the available models and choose which to download.

This has been added to FAST by @smistad and is actively being used by FP. The model zoo can be accessed here:
https://datahub.eriksmistad.no/models/

This has been resolved and will be part of the upcoming release. Hence, closing.


ChromeCast custom name support

Description:
My TV is named "Телевизор" and Home Assistant generates invalid entity_id media_player. for it.
Now i can set custom name for cast-device and entity_id is generated correctly.
ERROR (MainThread) [homeassistant.core] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/usr/src/app/homeassistant/helpers/entity_platform.py", line 343, in _async_add_entity
    'Invalid entity id: {}'.format(entity.entity_id))
homeassistant.exceptions.HomeAssistantError: Invalid entity id: media_player.

Example entry for configuration.yaml (if applicable):
cast:
  media_player:
    - host: <IP_ADDRESS>
      name: My ChromeCast

Checklist:

[x] The code change is tested and works locally.
[x] Local tests pass with tox. Your PR cannot be merged unless tests pass
[x] There is no commented out code in this PR.

I think we go away from yaml config. That means the core need handle that and create a generic device name with platform name. You are later able to change that on UI.

We're not going to merge a workaround for a bug in core. Fix bugs not symptoms


There is some conflicts using {% hightlight %} with minimal

[ ] This is a question about using the theme.
[ ] I believe this to be a bug with the theme --- not Jekyll, GitHub Pages or one of the bundled plugins.
[ ] This is a feature request.
[x] I have updated all gems with bundle update.
[x] I have tested locally with bundle exec jekyll build.

Environment informations

Minimal Mistakes version:  3.4.4
github-pages or jekyll gem version: github-pages
Operating system: ubuntu 16.04

Expected behavior
Expected code in {% highlight %} aligns left but aligns right .
Steps to reproduce the behavior

I have deleted layout: compress in my _layout/defaults.html
use ``` for code block is normal
use {% highlight %}  for code block will make the code align right.

Here is the result page:
https://geekbanana.github.io/android/handler/creating-teminal/
Here is the code:
https://github.com/geekbanana/geekbanana.github.io/blob/master/_posts/android/handler/2016-09-09-creating-teminal.md

Strange, I'm not seeing any right alignment to the code blocks. They're all left aligned.

It's weird .
I just downloaded a new project of minimal-mastakes .

change _config.yml/url to http://localhost:4000

write a post _posts/2016-09-09-just-code.md

---
title: just-code
---

{% highlight java %}

public static Boolean valueOf(boolean b) {
    return b ? Boolean.TRUE : Boolean.FALSE;
}

{% endhighlight %}

3.copy defaults from your gh-pages
4.bundle install
5.bundle exec jekyll build , then the console report an error :
Liquid Exception: Liquid syntax error (line 1): 'highlight' tag was never closed in /home/new-github-blog/_posts/2016-09-09-just-code.md/#excerpt
Liquid Exception: Liquid syntax error (line 1): 'highlight' tag was never closed in index.html
jekyll 3.2.1 | Error:  Liquid syntax error (line 1): 'highlight' tag was never closed

Could be due to the spaces.
{% highlight java %}
public static Boolean valueOf(boolean b) {
    return b ? Boolean.TRUE : Boolean.FALSE;
}
{% endhighlight %}

I stopped using Jekyll's {% highlight %} tag awhile ago once GFM backticks started working reliably with Kramdown and Jekyll.

If removing the spaces doesn't work it could also be due to how Jekyll deals with excerpts. If you don't define excerpt:  in the YAML Front Matter then the theme falls back to Jekyll which autogenerates it from the first paragraph of content.
Entirely possible it has issues processing the {% highlight %} tag.

Since v1.0.0, Jekyll has had automatically-generated post excerpts. Since v1.1.0, Jekyll also passes these excerpts through Liquid, which can cause strange errors where references don’t exist or a tag hasn’t been closed. If you run into these errors, try setting excerpt_separator: "" in your _config.yml, or set it to some nonsense string.

https://jekyllrb.com/docs/posts/#post-excerpts
https://jekyllrb.com/docs/troubleshooting/#excerpts

It works for me to remove the spaces.
But the code block still align right. . .

Can you provide a screenshot? I've tested in a few browsers and I'm not seeing anything aligned to the right.

Oh, yeah , It is related to the browser.
I changed to Chromium , Then the code block works well.
But in Firfox , the code block will align right.
I'll privode the scrennshot and browser environment later.

Here is the FireFox screenshot:
https://goo.gl/photos/NhnJBwvr3DkaqpvUA
Here is the chromium screenshot:
https://goo.gl/photos/n3nFjPg4WXUQnK2C6
FireFox 48.0
Chromium Version 52.0.2743.116 Built on Ubuntu
OS: ubuntu 16.04

Fixed. You can reference this commit https://github.com/mmistakes/minimal-mistakes/commit/3c034e59f4fe61e1c93521b0fbedaca29b197977 with the necessary SCSS to cleanup the alignment and make line number look better.
Example:


Network/Wifi change detection Solved

Addressing issue #61 ,
1.Corrected Loop Condition: Changed the loop condition from i <= 2 to i <= num to ensure the loop executes the correct number of times to calculate the factorial.
2.Edge Case Handling: Added a check to throw an IllegalArgumentException  if the input number is negative, since factorials are not defined for negative numbers.
3..Improved Output Formatting: Added a space after the colon in the output message for better readability.

Marking network changes as out of scope for v1 of BonjourService.
This pull request also includes unreleated code.


[CAMEL-15805] Prefix coverage directory with project base dir

Launching route-coverage goal from root directory of a multi module
project does not work because the directory passed to
RouteCoverageHelper.parseDumpRouteCoverageByRouteId
missed project base directory.
This change adds project base directory to the relative path
of route coverage data.

[x] Make sure there is a JIRA issue filed for the change (usually before you start working on it).  Trivial changes like typos do not require a JIRA issue.  Your pull request should address just this issue, without pulling in other changes.
[x] Each commit in the pull request should have a meaningful subject line and body.
[x] If you're unsure, you can format the pull request title like [CAMEL-XXX] Fixes bug in camel-file component, where you replace CAMEL-XXX with the appropriate JIRA issue.
[x] Write a pull request description that is detailed enough to understand what the pull request does, how, and why.
[x] Run mvn clean install -Psourcecheck in your module with source check enabled to make sure basic checks pass and there are no checkstyle violations. A more thorough check will be performed on your pull request automatically.
Below are the contribution guidelines:
https://github.com/apache/camel/blob/master/CONTRIBUTING.md

I did not found tests for camel-report-maven-plugin.
Let me know if I should write an integration test based on maven-invoker-plugin for this change


WIP: Adding Accessibility doc for Core WinForms

Summary
Adding Accessibility doc for Core WinForms which describes the changes made in WinForms accessibility in comparison with .NET Framework 4.8 https://github.com/microsoft/dotnet/tree/master/Documentation/compatibility
https://github.com/microsoft/dotnet/blob/master/Documentation/compatibility/winforms-accessibility-changes-48.md
Fixes #13870

There's not really a home for this article right now. Ultimately, it will have to go in the .NET Core Guide. I've created #13893 to do that.

//cc @Thraka

It could be a good idea to wrap control names into `, e.g. ...`ListBox` control...

@M-Lipin Hello. There are a few changes you should accept as suggested by Ron. Also, we have a linter running to ensure that the markdown content we accept is well formed. Can you please address those? If you're using VSCode you should be getting the linter rules if you open the repo root. Also, you can see the lint results in the Checks tab at the top.

Hello @Thraka sorry for the late response. I can fix the document issues. Could you please point me to the issues/requirements or sample how to fix?

@M-Lipin here are the markdownlint error messages that @Thraka was referring to.  Fixing them just involves making sure there's a blank line before and after a list.
docs/framework/winforms/windows-forms-accessibility-improvements.md:13 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "- Changes in various areas of ..."]
docs/framework/winforms/windows-forms-accessibility-improvements.md:26 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "- Enabled UIA support for List..."]
docs/framework/winforms/windows-forms-accessibility-improvements.md:31 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "- Corrected CheckedListBox Bou..."]
docs/framework/winforms/windows-forms-accessibility-improvements.md:36 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "- Updated the process of getti..."]
docs/framework/winforms/windows-forms-accessibility-improvements.md:40 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "- Corrected DataGridView Bound..."]
docs/framework/winforms/windows-forms-accessibility-improvements.md:47 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "- Corrected PropertyGrid Bound..."]
docs/framework/winforms/windows-forms-accessibility-improvements.md:52 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "- Improved navigation through ..."]
docs/framework/winforms/windows-forms-accessibility-improvements.md:57 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "- Improved accessible navigati..."]
docs/framework/winforms/windows-forms-accessibility-improvements.md:65 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "- Added UI Automation server p..."]
docs/framework/winforms/windows-forms-accessibility-improvements.md:72 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "- Added ability to announce a ..."]

@M-Lipin I'm starting on some WinForms planning for .NET Core content. I can jump in here and fix this up for you today. Is that OK?

@M-Lipin I'm starting on some WinForms planning for .NET Core content. I can jump in here and fix this up for you today. Is that OK?

It would be great. Thank you!

Completing this today so I can continue with the desktop guide winforms planning.