Unable to display image from base64


I'm working with some sensors which send data through udp. Cameras are attached to each and every sensor. The data received through udp also include the data sent by the camera. The camera data is also clubbed with the sensor data.

I'm able to get the camera data along with some sensor data through udp in the form of 12 packets at a time. The first 11 packets/buffer received is of 1420 size. My problem is, i'm not able to display the image from the base64 converted data received from the camera data. The base64 encoded data received in debug can be seen in the screenshot below.

I was suspicious of the encoding and decoding process so i tried with a function to encode and image tool to decode and it works fine. kindly see the screenshot below.

The camera data from the 11 packets is clubbed into one single file. The file is also attached here. The last packet colored/marked red is from the sensor data.
Image_with_light_base64_encoded_IMA_Node.pdf (29.2 KB)


You are saying "original image data from camera is "clubbed" together with some sensor data"

  • Why do you "clubb" them together, why do you not send separate messages for each?
  • What kind of sensor?
  • Have you tried to send just camera image data and checked if that works -> can be displayed?

The sensor programming sends these packets, we have no control over that programming.
I have tried to isolate the sensor data from the camera data but again, that doesn't display the image.
I think some processing or conversion needs to be done on the output received before the image could be displayed.

Hi blob.

Do you know what part of the data is sensor data / image data?

Is there a manual for these sensor/camera devices?

Do these devices have any other means of communication?

I have had a quick look at the data - it doesn't look like any base 64 image I've seen.

Ps fyi, the image node can take a file buffer (no need to convert file to base64). In fact, you can simply send a file name to the image node.

I again reiterate that the data which comes as an output further needs some kind of processing or conversion to actually bring it to the base64 format so that the image could be displayed. I'm guessing what kind of conversion needs to be done?

I have read somewhere that images need to be converted to a 1 dimensional array of pixel data?

I can see no image data - but yes, it may need some pre-processing.

However, I am doubtful - the data in your PDF converts to 9121 bytes - not a whole lot of image?

I have searched for the magic bytes and BASE64 signatures of GIF97a, GIF98a, BM, PNG, JPG and none are found


This is the function "Find Image"...

function hasSubArray(master, sub) {
    return master.join(",").indexOf( sub.join( "," ) )
var masterArray = msg.payload.toJSON().data;

msg.bufferToStringUTF16le = msg.payload.toString('utf16le')
msg.bufferToStringUTF8 = msg.payload.toString()

msg.isPng1 = hasSubArray(masterArray, [0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A])//png bytes
msg.isPng2 = hasSubArray(masterArray, [0x69, 0x56, 0x42, 0x4f, 0x52])//PNG iVBOR   (base64)
msg.isPng_inUTF16 = msg.bufferToStringUTF16le.indexOf("iVBOR")
msg.isPng_inUTF8 = msg.bufferToStringUTF8.indexOf("iVBOR")

msg.isGif1 = hasSubArray(masterArray, [0x47, 0x49, 0x46, 0x38, 0x37, 0x61]);//GIF87a bytes
msg.isGif2 = hasSubArray(masterArray, [0x47, 0x49, 0x46, 0x38, 0x39, 0x61]);//GIF88a bytes
msg.isGif3 = hasSubArray(masterArray, [0x52, 0x30, 0x6c, 0x47, 0x4f])//GIF R0lGO   (base64)
msg.isGIF_inUTF16 = msg.bufferToStringUTF16le.indexOf("R0lGO")
msg.isGIF_inUTF8 = msg.bufferToStringUTF8.indexOf("R0lGO")

msg.isBM1 = hasSubArray(masterArray, [0x42, 0x4D])//BM bytes
msg.isBM2 = hasSubArray(masterArray, [0x51, 0x6b, 0x30, 0x32, 0x55])//BM Qk02U     (base64)
msg.isBM_inUTF16 = msg.bufferToStringUTF16le.indexOf("iVBOR")
msg.isBM_inUTF8 = msg.bufferToStringUTF8.indexOf("iVBOR")

msg.isJPG1 = hasSubArray(masterArray, [0x2f, 0x39, 0x6a, 0x2f, 0x34])//jpg /9j/4   (base64)
msg.isJPG2 = hasSubArray(masterArray, [0xFF, 0xD8, 0xFF, 0xDB])//jpg ÿØÿÛ
msg.isJPG3 = hasSubArray(masterArray, [0xFF, 0xD8, 0xFF, 0xEE])//jpg ÿØÿî
msg.isJPG4 = hasSubArray(masterArray, [0xFF, 0xD8, 0xFF, 0xE1])//jpg ÿØÿá

msg.isJPG_inUTF16 = msg.bufferToStringUTF16le.indexOf("/9j/4")
msg.isJPG_inUTF8 = msg.bufferToStringUTF8.indexOf("/9j/4")

return msg;

This is the result...
... -1 == not found

So while there may well be image data in there somewhere, its not a simple task without additional info (sensor make + model, manual, specification - anything!)

The camera which is used here, the model number says - HDF-53a camera Omnivision ov9653. FPGA program from xilinx spartan xc3s200a for processing the image from camera is used. This entire assembly is connected to 8085 microcontroller which sends all this data (sensor's data + camera data) through udp.

If anything else is needed, kindly let me know. And thank you for your interest and continuous support in this regard.

Hi steve,
I hope you might be busy to find a solution to this problem with the information I provided.

Did you had any luck?

Not looked at it since I am afraid.

Without knowing how the image data is encoded it is too difficult to reverse engineer it in the little time I have.

If you can find more information on how the pixels are packed, we could unpack them and decode the image.

Could you please elaborate a little more on this please.

Did the additional information regarding the camera model and other details help you?

If anything else is needed, kindly let me know.



The data in the PDF you attached does not contain any form of know image format that I can find so -whichever program generated that data (I assume) has written the image (pixels) in an unknown format. If whoever wrote the program that generated the image has written documentation to describe exactly where the image is in the data, any compression applied to the image data, the byte position of image start and end, the order of the RGB pixels, how many BPP the data represents, any byteswapping (big endian / little endian) etc, THEN, I would have a fighting chance of helping you.

Without this documentation, it would take a LOT of trial and error to figure out where the image is in that data and how to unpack it to a useable standard format like a bitmap.

I may be missing something simple (perhaps someone else on the forum is more easily able to locate and decide the image embedded in that data) but I can't see it and unless you can get more information, I'm not gonna be able to help.

I did look at this also earlier and I can just agree with @Steve-Mcl. The data in the pdf is not an image in base64 format what I could see either

What YOU @blob should do is

  • share the jpg image that you say was possible to present correctly (in your first post)
  • study the data structure and size after it has been opened, read and converted to base64 (what size does it have, how does it look)
  • figure out and describe exactly how you received or captured that image
  • figure out if or what there is something in your transport that goes wrong, I think you should expect the whole image in one piece, not in chunks

Hi steve,

I agree that the data in PDF is certainly not an image format.
This is the reason why I'm here !

As far as the program which generates this image is concerned, (and as I have mentioned it earlier) the camera and sensor is mounted on an electronic PCB with a 8085 microcontroller. This entire assembly sends the data via UDP to a program on windows.
This program (which you are talking about) is written in visual Basic 2015. This program is responsible to 'decipher' everything from the UDP to a readable format. As a result of which the image is displayed. Please find attached the image below.

This is it - the image (as seen within the application from visual Basic).

As far as the documentation is concerned - well, there could be a problem of copyright issues, so I'm afraid i may not be able to help you much in this regard. But looking at the source code of the application in Visual Basic, I can say that the data comes in chunks for sure. This is also evident from the fact that I also verified it using wireshark and I found exactly the same data which is in PDF.

I would also like to mention one more thing - that looking at the source code, I realized that the entire code which is responsible for generation of the image right form the first chunk it receives from the UDP to processing it and then finally displaying it, there is 'something' done on the chunks received to take it to the image format level. But since I haven't worked with images before I'm not able to understand what the code does to these chunks to display it as an image. The only comment written for the code says - chunks are converted to a 1 dimensional array of pixel data? I don't know what this means?

I think the entire description above would also answer what @ krambriw was asking for. Beside this, if anything more is needed kindly let me know.

who owns that code ? what is the license on it ?
what size in pixels is that final image ?

If I was to guess - looking at the binary data that base64 creates is a 9121 byte file... the first two bytes are 05 01 but after that it "settles down" to more consistent values... anyway - 95 x 96 (or 96 x 95) = 9120 - so maybe drop the first byte then treat the rest as single 8 bit values. I'm also going to guess that the colour is something that is applied later as either a lookup or threshold based on those numbers...

In fact looking closely at that image I would say that even the original program is not decoding it correctly as the pixels on the left look like they ought to be on the right.

Not really, still missing is;

  • share the jpg image that you say was possible to present correctly (in your first post)
  • study the data structure and size after it has been opened, read and converted to base64 (what size does it have, how does it look)
  • figure out and describe exactly how you received or captured that image

You mention you have the source code for the VB software. It would be possible to study this and most likely write an equivalent in either javascript or python. If anyone would be willing to take on that challenge -- for free. Or you may have to pay a software consultant doing that

What is your use case? Is it a private setup for studying the sun? Or is it commercial somehow?

You literally have the keys to the kingdom (the source code) - I have spent a good deal of time trying to figure out this for you and you sit on that nugget?

Well if you want this resolved, you are going to have to find out for sure if it IS or ISNT a copyright issue.

Yeah, the VB source code (or a sanatised, reduced version of it) would solve this pretty quickly.

This is the best I can do.

Solution requires node-red-contrib-image-tools


  1. Start and end of image data assumed to be byte[1] ~ last byte
  2. Size of image assumed to be Wx95 Hx96
  3. Colour calculation guessed (and no where near the mapping in you VB application)

Without Gaussian blur, it looks like this...


[{"id":"d6e8b32e.3f4f4","type":"base64","z":"e78eac1c.8b9cf","name":"","action":"","property":"payload","x":420,"y":580,"wires":[["c1909507.69cc88","2c48238b.d5aeac"]]},{"id":"c1909507.69cc88","type":"debug","z":"e78eac1c.8b9cf","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":610,"y":580,"wires":[]},{"id":"6a57790f.262ad8","type":"jimp-image","z":"e78eac1c.8b9cf","name":"blank img","data":"{\"w\":95,\"h\":96,\"background\":0}","dataType":"json","ret":"img","parameter1":"imgBatchOps","parameter1Type":"msg","parameter2":"","parameter2Type":"msg","parameter3":"","parameter3Type":"msg","parameter4":"","parameter4Type":"msg","parameter5":"","parameter5Type":"msg","parameter6":"","parameter6Type":"msg","parameter7":"","parameter7Type":"msg","parameter8":"","parameter8Type":"msg","parameterCount":0,"jimpFunction":"none","selectedJimpFunction":{"name":"none","fn":"none","description":"Just loads the image.","parameters":[]},"x":500,"y":640,"wires":[["330ed265.8dc41e"]]},{"id":"2c48238b.d5aeac","type":"change","z":"e78eac1c.8b9cf","name":"","rules":[{"t":"set","p":"imgData","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":310,"y":640,"wires":[["6a57790f.262ad8"]]},{"id":"330ed265.8dc41e","type":"function","z":"e78eac1c.8b9cf","name":"draw pixels","func":"const LINE_WIDTH = 2;\nconst LINE_COLOR = 0xED143DFF;\nconst startIndex = 1;\n\nvar jimpImage = msg.payload;\nlet imgW = jimpImage.bitmap.width;\nlet imgH = jimpImage.bitmap.height;\nvar imgData = msg.imgData\n\n\n//create clamping functions to avoid printing outside of image\nlet clampX = (val) => clamp(val,0,imgW);\nlet clampY = (val) => clamp(val,0,imgH);\n\n//add imgBatchOps to msg for drawing text in next node \nmsg.imgBatchOps = [];\n\nvar buf = Buffer.from([0,0,0,255]);\nfunction rgbaToInt(red,green,blue,alpha){\n    \n    var r = red & 0xFF;\n    var g = green & 0xFF;\n    var b = blue & 0xFF;\n    var a = alpha & 0xFF;\n    \n    buf[0] = r;\n    buf[1] = g;\n    buf[2] = b;\n    return buf.readUInt32BE(0);\n    //return (r << 16) + (g << 8) + (b);\n    //return (r << 24 >>> 0) | (g << 16) | (b << 8) | (a);\n}\n\nvar dmin = 255, dmax = 0;\nfor(let x = 0; x < jimpImage.bitmap.width; x++){\n    for(let y = 0; y < jimpImage.bitmap.height; y++){\n        let index = x * y;\n        let d = imgData[index + startIndex]\n        if(d < dmin) dmin = d;\n        if(d > dmax) dmax = d;\n        let c = rgbaToInt(d,d,0,255)\n        jimpImage.setPixelColor(c, x, y) ;\n    }\n}\nmsg.dmin = dmin;\nmsg.dmax = dmax;\n\n\n\n// function drawBox(img, box) {\n//     //get box ccords\n//     let x = box.bbox[0];\n//     let y = box.bbox[1];\n//     let w = box.bbox[2];\n//     let h = box.bbox[3];\n    \n//     scanHLine(img, x, y+h-14, w, 14, 0xfa758e22); //draw box for text\n//     scanRectangle(img, x, y, w, h, LINE_WIDTH, LINE_COLOR);//draw outer rect\n    \n//     //built batch operations for next image node to draw text\n//     msg.imgBatchOps.push(  \n//         {\n//             \"name\": \"print\",\n//             \"parameters\": [\n//                 \"FONT_SANS_10_BLACK\",\n//                 clampX(x+2),\n//                 clampY(y+h-16),\n//                 box.class\n//             ]\n//         }\n        \n//     );  \n// }\n\n// function drawBoxes(img, detections) {\n//     detections.forEach(element => drawBox(img, element))\n// }\n\n\n// function makeColorIterator(color) {\n//   return function (x, y, offset) {\n//     this.bitmap.data.writeUInt32BE(color, offset, true);\n//   }\n// }\n\n// function scanRectangle(image,x,y,w,h,linePX,color){\n//     let iterator = makeColorIterator(color);\n   \n//     let xw, yh;\n//     x = clampX(x-(linePX/2));\n//     y = clampY(y-(linePX/2));\n//     w = clampX(w);\n//     h = clampY(h);\n//     xw = clampX(x+w);\n//     yh = clampY(y+h);\n\n    \n//     if(y+linePX <= imgH){\n//         image.scan(x, y, w, linePX,  iterator);// scan linePX height line - TOP\n//     }\n//     if(yh+linePX <= imgH){\n//         image.scan(x, yh, w, linePX, iterator);// scan linePX height line - BOTTOM\n//     }\n//     if(x+linePX <= imgW){\n//         image.scan(x, y, linePX, h,  iterator);// scan linePX width line - LEFT\n//     }\n//     if(xw+linePX <= imgW){\n//         image.scan(xw, y, linePX, h, iterator);// scan linePX width line - RIGHT\n//     }\n    \n// }\n\n\n// function scanHLine(image,x,y,length,linePX,color){\n//     let iterator = makeColorIterator(color);\n//     x = clampX(x);\n//     y = clampY(y);\n//     length = clampX(length);\n//     if(y+linePX <= imgH){\n//         image.scan(x, y, length, linePX,  iterator);// \n//     }\n// }\n\n// function scanVLine(image,x,y,height,linePX,color){\n//     let iterator = makeColorIterator(color);\n//     x = clampX(x);\n//     y = clampY(y);\n//     height = clampY(y+height);\n//     if(x+linePX <= imgW){\n//         image.scan(x, y, linePX, height,  iterator);// \n//     }\n// }\n\n\n// //scanCircle(jimpImage, 92, 170, 43, 0x000000FF);\n// //scanCircle(jimpImage, 92, 170, 42, 0xFFCC00FF);\n\n// function clamp(value, min, max) {\n//     return Math.min(Math.max(value, min), max);\n// }\n\n// function scanCircle(image, x, y, radius, color) {\n//     let iterator = makeColorIterator(color);\n//     return image.scan(x - radius, y - radius, radius*2, radius*2, function (pixX, pixY, idx) {\n//         if (Math.pow(pixX - x, 2) + Math.pow(pixY - y, 2) < radius*radius) {\n//             iterator.call(this, pixX, pixY, idx);\n//         }\n//     });\n// }\n\n \n\nreturn msg;","outputs":1,"noerr":0,"x":290,"y":700,"wires":[["b3dc4a3.c8005b8"]]},{"id":"ed24352e.c554d8","type":"image viewer","z":"e78eac1c.8b9cf","name":"","width":"240","data":"payload","dataType":"msg","x":750,"y":700,"wires":[[]]},{"id":"b3dc4a3.c8005b8","type":"jimp-image","z":"e78eac1c.8b9cf","name":"","data":"payload","dataType":"msg","ret":"img","parameter1":"90","parameter1Type":"num","parameter2":"RESIZE_NEAREST_NEIGHBOR","parameter2Type":"resizeMode","parameter3":"","parameter3Type":"msg","parameter4":"","parameter4Type":"msg","parameter5":"","parameter5Type":"msg","parameter6":"","parameter6Type":"msg","parameter7":"","parameter7Type":"msg","parameter8":"","parameter8Type":"msg","parameterCount":2,"jimpFunction":"rotate","selectedJimpFunction":{"name":"rotate","fn":"rotate","description":"rotate the image clockwise by a number of degrees. Optionally, a resize mode can be passed. If `false` is passed as the second parameter, the image width and height will not be resized.","parameters":[{"name":"deg","type":"num","required":true,"hint":"the number of degrees to rotate the image by"},{"name":"mode","type":"resizeMode|bool","required":false,"hint":"resize mode or a boolean, if false then the width and height of the image will not be changed"}]},"x":490,"y":700,"wires":[["93f32ac6.a25508"]]},{"id":"cfe2ee33.b5b52","type":"inject","z":"e78eac1c.8b9cf","name":"","topic":"","payload":"BQFAOEhISUlJSUhISUlJSUhISEhHR0dGRkZGRkVERERERERDQkJCQUFBQUFAPz8/ Pz4+PT09PTw8PDw7Ojk5ODg4ODg3NjY1NTU1NTMzMjIxMTEwMC8vLy8vLi4uLS0sLCwsLCsrKyopKCgoKCg oJyYmJiYlJSUlJSUlI0pKSkpKSkpKS0tMS0pJSUlISEhIR0dHRkZGRkZFRUVFRENDQ0NCQkFBQEBAQD8/ Pj4+Pj09PTw8PDs5ODg4ODg3Nzc2NjY2NTQ0NDMyMjExMTAwLy8vLy4uLi4tLCwsLCwrKyoqKSkoKCgoKCc nJiYmJiUlJSUlJUtLTEtLS0xLS0xNTEtLSkpKSklJSUhIR0dHR0dGRkZGRUVFRENDQkJBQUFBQEBAQEA/ Pz49PTw8PDs7Ojk5OTk4ODg3NjU1NTU1NTMzMzIyMTExMDAvLi4uLi4tLCwtLSwrKysrKiopKSkoKCcnJyc mJiYlJSMjI0xMTU1NTU1MTExNTU1NTExMTEtLS0pKSUhISEhHR0dHR0dGRURERENDQ0JCQUBAQUFBQEA/ Pj09PDw8Ozs6Ojk5OTk4NzY2NTU1NDQzMzMzMjIyMTEwLy8vLy8uLS0sLCwsKysrKioqKSkoKCcnKCcmJiY lJSUlJU5OT09QT09OTk5OTk5OTU1NTUxMTEtLS0pKSkpJSUlISEhHRkZGRURERERDQkJBQUFAQEA/ Pz8+Pj09PDw8Ozs6Ojk4Nzc3NjY1NDQ1NDQzMjIyMTExMDAwLy8vLi0tLSwsLCsrKioqKikpKCgoKCcnJiY lJSUlJVBQUVFRUVFRUFBQUFBQUE9OTk5OTk1NTU1MTExMS0pKSUlJSEhHRkZGRkVFRENDQkFBQUFBQEA/ Pj49PT09PDw7Ozo5ODg4ODg3NTU0NDQzMzMzMjExMTEwMC8vLy4uLi0tLCwrKysqKSkpKCgoKCcmJiYmJiU lJVJSUlJTUlJSUlJSUlFRUVFRUFBQT09PTk5NBQJAODAvLy4uLS0tLCwrKyoqKikpKCgoJycmJmFhYWBgYG BgX19fX15dXV1cXFtbW1taWVhXV1dXVlZVVFRTUlFQT09PTk1OTUxMS0tKSklJSEdGRUREQ0NDQkJBQUBAP z49PDw7Ojo6OTk4ODc3NjY1NTQzMzMyMjExMTAwLy8uLi0tLCwsKyoqKiopKSkpKCgnJ2VlZGRkY2NjY2Nj YmFhYWFfX15eXl1cW1taWllZWFhXV1ZVVFNSUVBQT09PT05NTUxLS0pJSEdHR0ZFRUVDQ0NCQkFAPz4+PT0 9PDs7Ojk4ODg3NzY2NTQ0NDMyMjIxMDAwMC8vLi4tLSwsLCwrKyoqKSkpKCgoJ2loZmdoaGdnZmVmZWRkZG NjYmJiYV9eXV1cXFxbWllZWVhXVVRUU1NSUVFRUE9PTk1MS0tKSUlJR0dGRkVERENDQ0JBQD8+Pj49PTw7O zo5ODg4Nzc3NjU1NDQ0MzIxMTAwMDAvLy4tLS0tLCwsKysrKikpKSkoKHFxcXBwb29vbWxra2ppaWdmZWVk Y2JhYGBfXl5dXFxbWllYV1ZWVVVUU1NTUlJRUE9OTk1MS0pKSEdHR0ZFRURERENCQD8/ Pz8+PT08Ozs6OTk4ODg3NzY1NTU0NDMyMjExMDAvLi4tLS0tLCwsLCsrKiopKSkoKHd3eHh3dXNxcHJzc3B sa2tqaWloZ2ZkY2NiYWBfXl5dW1pZWVhXVlZVVVRUU1NSUVBQT05NTEtLSklISEdGRkZFRURDQkFAQD8+Pj 08PDw7Ojk4ODg4NzY1NTU0NDMzMjExMC8vLy4uLi0tLCwsLCwrKiopKSkoKIWGiIqJiIeFg4KAfnx6eXd0c nFvbWppaGdmZWNhYGBfXl1cXFtaWVlYVlZVVFNTUlJSUVBPTk1MTEtKSUlIR0dHRkVEQ0JCQUA/ Pz4+PTw8Ozo5OTk4ODc2NjU1NDMzMzIyMjEwMC8vLy4uLSwsLCwrKioqKSkpKKCfBQNAOI2LiYiGhIOCgH5 8e3l3dnRycXBubWxsamhnZmVkY2FgX15dXFxbWllYV1ZUU1NSUfz8/Pz8/Pz8/Pz8/Pz7+/r5+Pf3+Pj39/ b29fX08vX48+zm4NzY1dLOy8nHxMLAvry7uba0s7GvrayqqKakop+dnJqYl5aVk5CNi4mIhoWDgX9+fHp5d 3V0cnFwbm1ta2loZ2ZlZGNiYV9eXl1cW1pZWFdVVFRTUfz8/Pz8/Pz8/Pz8/Pz8+/r5+fn5+Pj39/j39/ f39vX08vDt6ufj39rV0c/ MycbFwsC9vLq4trSysK6sqqilo6GfnZyamZmYlpOQjouKiIeFg4GAfnx6eXd2dHJxcG9tbGtpZ2ZmZWRjYm FfX11cW1taWlhWVVRTUvz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pv5+Pj39/f29vXz8/ T18u7s6uXg29fTz8zKx8TBwL68uri2tLKwraqpp6WjoJ6cm5qZmJaTkI2MiomHhYOCgH58enh3dnRycnFvb m1ramhnZmVkYmFgX15dXFtbWllXVlRTU/z8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz7+/r5+Pb39/ X2+Pf29fT09PT29O/s5+Hc19LPzMnGxMK/ vbu5t7WysK2rqainpKGenZybmpmWk5COjIuJh4WEgoB+fHp5eHZ0c3Jvbm1ramppZ2ZlY2JhYF9eXVxbWll YV1ZVVPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/f7//v38+/n49/ X09PTz8fDv7uvm4NzY1NDMycfEwb+9u7m2tLGurKqopqOhoJ6dnJqZlpORjouKiIaEg4F/ fXx7eXd1dHNwbm1sa2ppaGdmZWRjYV9eXl1bWllYV1ZVVfz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz7+/r5+Pf29vX08/Pz8/ Lv6ubi3djSzsrHxMPBvry5trSyr62rqaakoqGfnp2bmJaTkI6MioiFg4KAfn18enh2dXNycXBuBQRAOPb29 vX19vTs4trUzcjEwb27uLWzsa+trKurqqqpp6OemJSRj42LiYeGhIKAfnx6eXh3dXNycG5sa2poZ2ZkY2Jh X15eXVtaWPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pv7/ Pz7+fj39fT09PX07eXc1M7KxcG+vLm2s7GvrayrqqqpqKeimpWTkY+Ni4mIhoOAfn17enh3dXRyb25tbGpp Z2ZlY2JhYF9eXVxaWfz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pv6+Pj39vX08/Py8/ Ls4tnRy8bCv7y5tbOxr62rqamop6SgnJiVk5GOjIuJh4SBf358enh3dnRycG9ubWtqaWdlZGNiYWBfXlxaW fz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/P38+ff19PTz8/ X17+Ta083Hw7+7ube0sq+sqqmnpaShnZqXlZOQjouJh4WDgoB+fHp4d3V0cnFwbm1raWhmZmVjYmFgX11bW vz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pv6+Pf39vXz8vPz8Ovk3NTMx8K/vbq3tLKvrKqop6ShnpyZl5SRj42LiYeGhIF/ fnx6eHZ1dHJxb25samlnZmZkY2FgX15cW/z8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz8/Pz8/Pz8/Pz8/P37+ffz8fLz8/Py69/ VzsjEwL67ubayr6yqp6SioJ6cmZaTkY+Ni4mHhYKAf317eXh2dXNxcG9ubGpoaGhmZGJhYF9eXPz8/Pz8/ Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pv7+fj39vTz8/ Lw7urg1s3Hw8G+u7ezBQVAOPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz7+vj39/ b19PLw7+zl3NPKxL+8ubazr6yppqOgnpyZl5SRkI6LiYeFgoF/fXt5d3d1c3FvbWxqaGdmZWRiYfz8/Pz8/ Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8+/ n39fPx8O/s593SysO/vLi1sa6rqKajoJ6cmZaTkY+MiomHhIKBf3x6eXh2dHJwbmxraWdnZmRjYvz8/Pz8/ Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz7+vn49vX19PPx7ebc0snDv7u3tLGtqqiloqCdm5iWk5GOjImIh4SBf317enh2dXNxb25sa2lnZWVkYvz8 /Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz6+Pf29fTz8O3n3NHIwr66trSxraqnpaOgnZqXlJKQjouKiIWCgX99e3l3dnRycG9tbGpoZ2ZlZPz8/ Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pv6+fj29fTz8vHt5dnPx8K+urWwrqyqp6Win5yZlpSSkI2LiIaEg4F/fXt5d3VzcXBubGtqaWhmZfz8/ Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/f39/f39/f39/ f39/fr49vTz8vLx7uTYzsfCvrq2sq+rqKWjoJ6bmZaTkY+MioiGg4F/fXt5d3V0c3JwbmxqaWdlZP39/ f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39BQZAOP39/f39/f39/ f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ fz7+fj39fX19PLw6+LVysXBvLi0sa6sqaWioJyZlpSSj42KiIaDgX59e3h2dXNxb25sav39/f39/f39/ f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f39/Pz69fP19fPz9O/i08rEv7u4tbKvrKilop+cmZaTkY+NioiFgn9+fHl3dnVzcG5ta/39/f39/f39/ f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f39/Pz69/b19fTz8u/o3NHIw7+7t7SwraqnpKGem5iVk5COi4iGhIF+fHp5d3VzcXBubP39/f39/f39/ f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f39/fz8+/j29fTz8fDt5dnOx8K+urezr6yqp6SgnJmXlZKPjYqIhoOAfXx6eHZ0cnBubP39/f39/f39/ f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f39/fz8+/n49vTy8fHy8OXWzMXAvbm2sq6sqaajn5yZlpSRj42KiIWCf317eXd1cnBubf39/f39/f39/ f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f39/f39/fz6+Pbz8vLy8evf08rEwLy5tbGurKmmo5+bmJWTkI6MiYeEgX58enh2dHJwbvv7/P39/f39/ f39/f39/f39/f39/f39/f39BQZAOP39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ fz7+fj39fX19PLw6+LVysXBvLi0sa6sqaWioJyZlpSSj42KiIaDgX59e3h2dXNxb25sav39/f39/f39/ f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f39/Pz69fP19fPz9O/i08rEv7u4tbKvrKilop+cmZaTkY+NioiFgn9+fHl3dnVzcG5ta/39/f39/f39/ f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f39/Pz69/b19fTz8u/o3NHIw7+7t7SwraqnpKGem5iVk5COi4iGhIF+fHp5d3VzcXBubP39/f39/f39/ f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f39/fz8+/j29fTz8fDt5dnOx8K+urezr6yqp6SgnJmXlZKPjYqIhoOAfXx6eHZ0cnBubP39/f39/f39/ f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f39/fz8+/n49vTy8fHy8OXWzMXAvbm2sq6sqaajn5yZlpSRj42KiIWCf317eXd1cnBubf39/f39/f39/ f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f39/f39/fz6+Pbz8vLy8evf08rEwLy5tbGurKmmo5+bmJWTkI6MiYeEgX58enh2dHJwbvv7/P39/f39/ f39/f39/f39/f39/f39/f39BQdAOLe0sa+sqKSfnJmWko6MioeEgn98eXd1cu3w8vLx7vHv5ebp6e73/ f37+/z8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz7+ff39vX08/Ht5dvSzMW+uLe2s7CtqqWhnpuXlJGPjImHhIB+fHl1c/Ly8fPy6unl3OHn49/i6/ D3/f79/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8+/r59vX09PPw6uHY0cvFwLy4tbKvrKikoJyZlpSSj4uHhIJ/fHl2dPf4+v379/Tz8erm5t/ j7+7w9fX1+Pv8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz8+/r59/b09PPy7+je1s/JxcC7uLSxramloZ6al5WTkIyIhYOAfXp5dvr7/Pv6/ Pz49fHt6OPq8+7r7fH1+v7+/fz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz8/Pz8/Pz8/Pz8/Pv6+ff18/Pz8e7m3NPMx8PAvLeyr6unpKCcmZaUkYyJhoSBfnx6d/v7/Pz8+/ v6+Pn48Orr7ezi4vP9+vX1+fv8+/v8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz8/Pz8/Pz8/Pv7+fj18/Ly8e/q4tnRysbDvrizsK2qpqKfm5iVkY6Kh4SCf316d/z8/Pz8/ Pz7+fbz8O3s7u3m4N/i6O70+fv7+/v7/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz8/Pz8/Pz8/Pz8/Pz8+/ n39fPy8vHu6ODXz8rGwby4tbGsqKSgnJmVko+MiYaDgX57ePz8BQhAOP39/f39/f39/f39/f39/Pv59/ f29PLw7enm4dnRy8W/urWwqqWgm5iUkY2Kh4SCf/39/f39/f39/f39/f39/f39/f39/Pz7+/z9/vz6+fr8/ f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ Pv5+Pf39fPy8e7p497Y0MnDvbexraijnpqXk4+LiIWCf/39/f39/f39/f39/f39/f39/f39/f38/ Pv7+PPx9/v8/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f39/fz8+vj39vXz8e/s6OXg2dHKxL64s62noZ2ZlZGNiYaDf/39/f39/f39/f39/f39/f39/f39/f38/ Pv49fT4/P79/Pz9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f39/fz7+Pj39vX08vHu6+fj3dbQysS+uLKspqCbl5OPi4eEgf39/f39/f39/f39/f39/f39/f39/f39/ Pr4+Pn59PL2+vz9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f39/fz8/Pv59/f29fLu6+nm4tzVz8rEvbexq6WfmZWSjoqGgv39/f39/f39/f39/f39/f39/f39/f39/ Pv6+PLq6/L2+/z9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f39/fz8+/r5+fj39vPw7uvp5eHb1M3Hwbu1r6minZiUkIuHg/39/f39/f39/f39/f39/f39/f39/f39/ Pz69u/u9fv8/fz9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f39/f39/Pz7+/n39vTyBQlAOP39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f38/Pz7+fb18/Du7uzq6OXj4NzX0crFv7myq6Oclf39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ Pz8/Pz9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f39/Pv59/Xz8vHv7u7s6ujm5ODb1M7Iw722r6igmP39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ Pz7+/n4+Pb08/Hv7e3t6+ro5uPd19LMx8G7ta2knf39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ Pz7+vn49/b18/Hv7u3s6+vq5+Pf2tXPyMK8trCpov39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ f38/Pv39PT19PLv7+7t7Ozq6OXi3tnSzMbAurStpv39/fz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz7+fb09PT08vHw7u3t7Oro5uTh3djTzsnCu7Wtpvz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz 8BQpAOPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz8/Pz8/Pv6+PX08/Pz8e7r6efm5+np6Ofl5OTh3djSy8S+t/z8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz8/Pz8/Pv7+fj29PLy8/Hr5+Xl5ebn5+bk4+Lf3NfSzMbAuPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz8/Pz8/Pz7+/j08vLy8O7p5ePj4+Tl5eXj4uHf3NfSzcfAufz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz8/Pz8/Pz7+PX08/Px8O3p5OHg4eLk5eXk5OTh3dfSzcjCuvz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz8/Pz8/Pz7+fb08/Ly8e7p4t7d3d/h4+Xm5OPh3dnUz8rEvPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz8/Pz8/Pz7+fb08/T19O7n4Nza2tze4eLj4+Lg3drW0crEvvz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8BQtAOPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz7+vf08vLy8e/o3tbS0dLU19rd4OLi4d7a1tLNyPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ Pz8/Pz7+Pb19PLx8e7o3dTR0NDS1djc3+Hi4d/ a1tLNyEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA gICAgICAgICAgICAgAwA7MTA6MjM6MzA7MTsyMy43Ozk5OTk7MjEuMjs5MDs2NTswOzQ4OzExMzsxMjYyOT syMjA7MTI7OTk5OTsxODE7MDs4MTkyOzE5NDYxNTcwNTg7NTY7MjA1OzI1NTs0MDs2OTsxMDYwMi47MDswO zE7MTs0Ljc1Ow==","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":270,"y":580,"wires":[["d6e8b32e.3f4f4"]]},{"id":"93f32ac6.a25508","type":"jimp-image","z":"e78eac1c.8b9cf","name":"","data":"payload","dataType":"msg","ret":"img","parameter1":"2","parameter1Type":"num","parameter2":"RESIZE_NEAREST_NEIGHBOR","parameter2Type":"resizeMode","parameter3":"","parameter3Type":"msg","parameter4":"","parameter4Type":"msg","parameter5":"","parameter5Type":"msg","parameter6":"","parameter6Type":"msg","parameter7":"","parameter7Type":"msg","parameter8":"","parameter8Type":"msg","parameterCount":1,"jimpFunction":"gaussian","selectedJimpFunction":{"name":"gaussian","fn":"gaussian","description":"Gaussian blur the image by r pixels (VERY slow)","parameters":[{"name":"r","type":"num","required":true,"hint":"the pixel radius of the blur"}]},"x":620,"y":700,"wires":[["ed24352e.c554d8"]]}]

looks like a great effort to me :slight_smile:
well worth a :beer:


I knew you were working hard on this, I'm sorry I didn't mention about the code because I'm unable to share it as of now, for the time being. But as I said it earlier, I was given the source code and documentation with a "conditions apply" on it by means of an agreement which restricts me from sharing any part of it.

But I have this to offer you. And meanwhile I will try to make sure I have the consent of the owner of the code to explore the possibility of sharing anything (may be sanatised, reduced version) as you said. Please find a link below whose resources are used in the source code. This will get you more closer to what has been done here in the coding.


As far as the size of the image is concerned - what I could understand from the coding is - it might be 122, 122 or double of it, may be? I'm still not sure.

We are a charitable trust doing Research & Development on solar Energy aiming to harness this energy.

We have already paid for what we have today with us (the sensors & VB application), so any newer development will require funding which is now not possible.

In the VB application the camera image is displayed using the picturebox tool. The image from the camera is displayed here. The entire code to display the image here is triggered by a timer event set at an interval of approx 1 second. This gives a feel of a live image from the camera, although it is just a bitmap. I then coded a few lines to get one of the screenshot from this picturebox. The image I have attached in my previous post is one of the several images that are continuously displayed. The sun like image is the result of light projected at the camera (in lab I hold a torch in front of the camera), in practical it is the focused sun rays. I hope this makes sense.

Steve, I'm really excited to see your flow is doing some magic here. we are much closer to it, just some refinement and tweaking needs to be done. The VB application gave me this image when light was pointed on camera...

VB Image

And my flow gave me this - first without light on the camera and then with light.

With no light on the camera and take picture inject node clicked

With light on the camera and take picture inject node clicked

Please notice the difference between the VB image and the image generated with the help of your flow.