Bosch Sensortec Community

    cancel
    Showing results for 
    Search instead for 
    Did you mean: 

    BME AI Studio will not execute on Ubuntu 22.04

    BME AI Studio will not execute on Ubuntu 22.04

    GordonDavid
    Member

    Hi, I installed BME AI Studio on Ubuntu 22.04 LTE and WIN 10 systems. In both cases, a splash screen is displayed but freezes and does not continue. 

    Is there an installation guide beyond  "download, unzip, find executable, and execute"?

    Is there a hardware requirements document?

    Is there a software prerequisits document?

    Obviously, this is a complex application. Do you have documentation for all command line options?

    After app was started (hung), I executed a 'ps -aef | grep BME' command to see what was running and got the following.

    gordon 26854 2972 1 05:15 ? 00:00:00 /tmp/.mount_BME AI9C3Nzn/bme-ai-studio --enable-crashpad


    gordon 26859 2972 3 05:15 ? 00:00:01 /home/gordon/Downloads/bme_ai-studio-v2-0-0-linux/BME AI-Studio-v2.0.0-linux/BME-AI-Studio-linux-v2.0.0/BME-AI-Studio-v2.0.0-linux/BME AI-Studio-2.0.0.AppImage


    gordon 26864 26854 0 05:15 ? 00:00:00 /tmp/.mount_BME AI9C3Nzn/bme-ai-studio --type=zygote --no-zygote-sandbox --enable-crashpad --enable-crashpad


    gordon 26865 26854 0 05:15 ? 00:00:00 /tmp/.mount_BME AI9C3Nzn/bme-ai-studio --type=zygote --enable-crashpad --enable-crashpad


    gordon 26867 26865 0 05:15 ? 00:00:00 /tmp/.mount_BME AI9C3Nzn/bme-ai-studio --type=zygote --enable-crashpad --enable-crashpad


    gordon 26895 26864 4 05:15 ? 00:00:01 /tmp/.mount_BME AI9C3Nzn/bme-ai-studio --type=gpu-process --enable-crashpad --enable-crash-reporter=e4c662d1-34d5-44c6-8eda-c207456a1d4a,no_channel --user-data-dir=/home/gordon/.config/bme-ai-studio --gpu-preferences=WAAAAAAAAAAgAAAIAAAAAAAAAAAAAAAAAABgAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAIAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAAA== --shared-files --field-trial-handle=0,i,3530987108568590857,908685663128693076,131072 --disable-features=SpareRendererForSitePerProcess


    gordon 26900 26854 0 05:15 ? 00:00:00 /tmp/.mount_BME AI9C3Nzn/bme-ai-studio --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --enable-crashpad --enable-crash-reporter=e4c662d1-34d5-44c6-8eda-c207456a1d4a,no_channel --user-data-dir=/home/gordon/.config/bme-ai-studio --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,3530987108568590857,908685663128693076,131072 --disable-features=SpareRendererForSitePerProcess --enable-crashpad

    gordon 26906 26867 3 05:15 ? 00:00:01 /tmp/.mount_BME AI9C3Nzn/bme-ai-studio --type=renderer --enable-crashpad --enable-crash-reporter=e4c662d1-34d5-44c6-8eda-c207456a1d4a,no_channel --user-data-dir=/home/gordon/.config/bme-ai-studio --app-path=/tmp/.mount_BME AI9C3Nzn/resources/app.asar --enable-sandbox --lang=en-US --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=4 --launch-time-ticks=58624935844 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=0,i,3530987108568590857,908685663128693076,131072 --disable-features=SpareRendererForSitePerProcess

    7 REPLIES 7

    BSTRobin
    Community Moderator
    Community Moderator

    Hi GordonDavid,

    Sorry for the delayed reply.
    You can install tensorflow, node library on you Linux system and run BME AI-Studio again.

    Hi I am also experiencing this problem:

    ./BME\ AI-Studio-2.0.0.AppImage
    error [11:59:17] (electron): node:electron/js2c/asar_bundle:5
    /*! no static exports found */function(t,e,r){"use strict";(function(t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.wrapFsWithAsar=void 0;const s=r(/*! buffer */"buffer"),i=r(/*! path */"path"),a=r(/*! util */"util"),o=t._linkedBinding("electron_common_asar"),c=r(/*! module */"module"),f=n.Promise,l=t.env.ELECTRON_NO_ASAR&&"browser"!==t.type&&"renderer"!==t.type,u=t.internalBinding;delete t.internalBinding;const nextTick=(e,r=[])=>{t.nextTick(()=>e(...r))},p=new Map,getOrCreateArchive=t=>{if(p.has(t))return p.get(t);try{const e=new o.Archive(t);return p.set(t,e),e}catch{return null}},h=/\.asar/i,splitPath=e=>{if(t.noAsar||l)return{isAsar:!1};let r=e;return s.Buffer.isBuffer(e)&&(r=e.toString()),"string"!=typeof r?{isAsar:!1}:h.test(r)?o.splitPath(i.normalize(r)):{isAsar:!1}};let _=0;const d=null!=t.getuid?t.getuid():0,y=null!=t.getgid?t.getgid():0,P=new Date,asarStatsToFsStats=function(t){const{Stats:e,constants:n}=r(/*! fs */"fs");let s=n.S_IROTH^n.S_IRGRP^n.S_IRUSR^n.S_IWUSR;return t.isFile?s^=n.S_IFREG:t.isDirectory?s^=n.S_IFDIR:t.isLink&&(s^=n.S_IFLNK),new e(1,s,1,d,y,0,void 0,++_,t.size,void 0,P.getTime(),P.getTime(),P.getTime(),P.getTime())},createError=(t,{asarPath:e,filePath:r}={})=>{let n;switch(t){case"NOT_FOUND":n=new Error(`ENOENT, ${r} not found in ${e}`),n.code="ENOENT",n.errno=-2;break;case"NOT_DIR":n=new Error("ENOTDIR, not a directory"),n.code="ENOTDIR",n.errno=-20;break;case"NO_ACCESS":n=new Error(`EACCES: permission denied, access '${r}'`),n.code="EACCES",n.errno=-13;break;case"INVALID_ARCHIVE":n=new Error(`Invalid package ${e}`);break;default:throw new Error(`Invalid error type "${t}" passed to createError.`)}return n},overrideAPISync=function(t,e,r,n=!1){null==r&&(r=0);const s=t[e],func=function(...t){const e=t[r],n=splitPath(e);if(!n.isAsar)return s.apply(this,t);const{asarPath:i,filePath:a}=n,o=getOrCreateArchive(i);if(!o)throw createError("INVALID_ARCHIVE",{asarPath:i});const c=o.copyFileOut(a);if(!c)throw createError("NOT_FOUND",{asarPath:i,filePath:a});return t[r]=c,s.apply(this,t)};if(n)return func;t[e]=func},overrideAPI=function(t,e,r){null==r&&(r=0);const n=t[e];t[e]=function(...s){const i=s[r],a=splitPath(i);if(!a.isAsar)return n.apply(this,s);const{asarPath:o,filePath:c}=a,f=s[s.length-1];if("function"!=typeof f)return overrideAPISync(t,e,r,!0).apply(this,s);const l=getOrCreateArchive(o);if(!l){const t=createError("INVALID_ARCHIVE",{asarPath:o});return void nextTick(f,[t])}const u=l.copyFileOut(c);if(u)return s[r]=u,n.apply(this,s);{const t=createError("NOT_FOUND",{asarPath:o,filePath:c});nextTick(f,[t])}},n[a.promisify.custom]&&(t[e][a.promisify.custom]=makePromiseFunction(n[a.promisify.custom],r)),t.promises&&t.promises[e]&&(t.promises[e]=makePromiseFunction(t.promises[e],r))};let A;function validateBufferIntegrity(e,n){if(!n)return;A=A||r(/*! crypto */"crypto");const s=A.createHash(n.algorithm).update(e).digest("hex");s!==n.hash&&(console.error(`ASAR Integrity Violation: got a hash mismatch (${s} vs ${n.hash})`),t.exit(1))}const makePromiseFunction=function(t,e){return function(...r){const n=r[e],s=splitPath(n);if(!s.isAsar)return t.apply(this,r);const{asarPath:i,filePath:a}=s,o=getOrCreateArchive(i);if(!o)return f.reject(createError("INVALID_ARCHIVE",{asarPath:i}));const c=o.copyFileOut(a);return c?(r[e]=c,t.apply(this,r)):f.reject(createError("NOT_FOUND",{asarPath:i,filePath:a}))}};e.wrapFsWithAsar=e=>{const n=new Map,logASARAccess=(s,i,a)=>{if(t.env.ELECTRON_LOG_ASAR_READS){if(!n.has(s)){const t=r(/*! path */"path"),i=`${t.basename(s,".asar")}-access-log.txt`,a=t.join(r(/*! os */"os").tmpdir(),i);n.set(s,e.openSync(a,"a"))}e.writeSync(n.get(s),`${a}: ${i}\n`)}},{lstatSync:o}=e;e.lstatSync=(t,e)=>{const r=splitPath(t);if(!r.isAsar)return o(t,e);const{asarPath:n,filePath:s}=r,i=getOrCreateArchive(n);if(!i)throw createError("INVALID_ARCHIVE",{asarPath:n});const a=i.stat(s);if(!a)throw createError("NOT_FOUND",{asarPath:n,filePath:s});return asarStatsToFsStats(a)};const{lstat:l}=e;e.lstat=function(t,e,r){const n=splitPath(t);if("function"==typeof e&&(r=e,e={}),!n.isAsar)return l(t,e,r);const{asarPath:s,filePath:i}=n,a=getOrCreateArchive(s);if(!a){const t=createError("INVALID_ARCHIVE",{asarPath:s});return void nextTick(r,[t])}const o=a.stat(i);if(!o){const t=createError("NOT_FOUND",{asarPath:s,filePath:i});return void nextTick(r,[t])}const c=asarStatsToFsStats(o);nextTick(r,[null,c])},e.promises.lstat=a.promisify(e.lstat);const{statSync:p}=e;e.statSync=(t,r)=>{const{isAsar:n}=splitPath(t);return n?e.lstatSync(t,r):p(t,r)};const{stat:h}=e;e.stat=(r,n,s)=>{const{isAsar:i}=splitPath(r);if("function"==typeof n&&(s=n,n={}),!i)return h(r,n,s);t.nextTick(()=>e.lstat(r,n,s))},e.promises.stat=a.promisify(e.stat);const wrapRealpathSync=function(t){return function(e,r){const n=splitPath(e);if(!n.isAsar)return t.apply(this,arguments);const{asarPath:s,filePath:a}=n,o=getOrCreateArchive(s);if(!o)throw createError("INVALID_ARCHIVE",{asarPath:s});const c=o.realpath(a);if(!1===c)throw createError("NOT_FOUND",{asarPath:s,filePath:a});return i.join(t(s,r),c)}},{realpathSync:_}=e;e.realpathSync=wrapRealpathSync(_),e.realpathSync.native=wrapRealpathSync(_.native);const wrapRealpath=function(t){return function(e,r,n){const s=splitPath(e);if(!s.isAsar)return t.apply(this,arguments);const{asarPath:a,filePath:o}=s;arguments.length<3&&(n=r,r={});const c=getOrCreateArchive(a);if(!c){const t=createError("INVALID_ARCHIVE",{asarPath:a});return void nextTick(n,[t])}const f=c.realpath(o);if(!1!==f)t(a,r,(t,e)=>{if(null===t){const t=i.join(e,f);n(null,t)}else n(t)});else{const t=createError("NOT_FOUND",{asarPath:a,filePath:o});nextTick(n,[t])}}},{realpath:d}=e;e.realpath=wrapRealpath(d),e.realpath.native=wrapRealpath(d.native),e.promises.realpath=a.promisify(e.realpath.native);const{exists:y}=e;e.exists=(t,e)=>{const r=splitPath(t);if(!r.isAsar)return y(t,e);const{asarPath:n,filePath:s}=r,i=getOrCreateArchive(n);if(!i){const t=createError("INVALID_ARCHIVE",{asarPath:n});return void nextTick(e,[t])}const a=!1!==i.stat(s);nextTick(e,[a])},e.exists[a.promisify.custom]=t=>{const e=splitPath(t);if(!e.isAsar)return y[a.promisify.custom](t);const{asarPath:r,filePath:n}=e,s=getOrCreateArchive(r);if(!s){const t=createError("INVALID_ARCHIVE",{asarPath:r});return f.reject(t)}return f.resolve(!1!==s.stat(n))};const{existsSync:P}=e;e.existsSync=t=>{const e=splitPath(t);if(!e.isAsar)return P(t);const{asarPath:r,filePath:n}=e,s=getOrCreateArchive(r);return!!s&&!1!==s.stat(n)};const{access:A}=e;e.access=function(t,r,n){const s=splitPath(t);if(!s.isAsar)return A.apply(this,arguments);const{asarPath:i,filePath:a}=s;"function"==typeof r&&(n=r,r=e.constants.F_OK);const o=getOrCreateArchive(i);if(!o){const t=createError("INVALID_ARCHIVE",{asarPath:i});return void nextTick(n,[t])}const c=o.getFileInfo(a);if(!c){const t=createError("NOT_FOUND",{asarPath:i,filePath:a});return void nextTick(n,[t])}if(c.unpacked){const t=o.copyFileOut(a);return e.access(t,r,n)}const f=o.stat(a);if(f)if(r&e.constants.W_OK){const t=createError("NO_ACCESS",{asarPath:i,filePath:a});nextTick(n,[t])}else nextTick(n);else{const t=createError("NOT_FOUND",{asarPath:i,filePath:a});nextTick(n,[t])}},e.promises.access=a.promisify(e.access);const{accessSync:I}=e;function fsReadFileAsar(t,r,n){const i=splitPath(t);if(i.isAsar){const{asarPath:t,filePath:a}=i;if("function"==typeof r)n=r,r={encoding:null};else if("string"==typeof r)r={encoding:r};else if(null==r)r={encoding:null};else if("object"!=typeof r)throw new TypeError("Bad arguments");const{encoding:o}=r,c=getOrCreateArchive(t);if(!c){const e=createError("INVALID_ARCHIVE",{asarPath:t});return void nextTick(n,[e])}const f=c.getFileInfo(a);if(!f){const e=createError("NOT_FOUND",{asarPath:t,filePath:a});return void nextTick(n,[e])}if(0===f.size)return void nextTick(n,[null,o?"":s.Buffer.alloc(0)]);if(f.unpacked){const t=c.copyFileOut(a);return e.readFile(t,r,n)}const l=s.Buffer.alloc(f.size),u=c.getFdAndValidateIntegrityLater();if(!(u>=0)){const e=createError("NOT_FOUND",{asarPath:t,filePath:a});return void nextTick(n,[e])}logASARAccess(t,a,f.offset),e.read(u,l,0,f.size,f.offset,t=>{validateBufferIntegrity(l,f.integrity),n(t,o?l.toString(o):l)})}}e.accessSync=function(t,r){const n=splitPath(t);if(!n.isAsar)return I.apply(this,arguments);const{asarPath:s,filePath:i}=n;null==r&&(r=e.constants.F_OK);const a=getOrCreateArchive(s);if(!a)throw createError("INVALID_ARCHIVE",{asarPath:s});const o=a.getFileInfo(i);if(!o)throw createError("NOT_FOUND",{asarPath:s,filePath:i});if(o.unpacked){const t=a.copyFileOut(i);return e.accessSync(t,r)}const c=a.stat(i);if(!c)throw createError("NOT_FOUND",{asarPath:s,filePath:i});if(r&e.constants.W_OK)throw createError("NO_ACCESS",{asarPath:s,filePath:i})};const{readFile:N}=e;e.readFile=function(t,e,r){const n=splitPath(t);return n.isAsar?fsReadFileAsar(t,e,r):N.apply(this,arguments)};const{readFile:O}=e.promises;e.promises.readFile=function(t,e){const r=splitPath(t);if(!r.isAsar)return O.apply(this,arguments);const n=a.promisify(fsReadFileAsar);return n(t,e)};const{readFileSync:g}=e;e.readFileSync=function(t,r){const n=splitPath(t);if(!n.isAsar)return g.apply(this,arguments);const{asarPath:i,filePath:a}=n,o=getOrCreateArchive(i);if(!o)throw createError("INVALID_ARCHIVE",{asarPath:i});const c=o.getFileInfo(a);if(!c)throw createError("NOT_FOUND",{asarPath:i,filePath:a});if(0===c.size)return r?"":s.Buffer.alloc(0);if(c.unpacked){const t=o.copyFileOut(a);return e.readFileSync(t,r)}if(r){if("string"==typeof r)r={encoding:r};else if("object"!=typeof r)throw new TypeError("Bad arguments")}else r={encoding:null};const{encoding:f}=r,l=s.Buffer.alloc(c.size),u=o.getFdAndValidateIntegrityLater();if(!(u>=0))throw createError("NOT_FOUND",{asarPath:i,filePath:a});return logASARAccess(i,a,c.offset),e.readSync(u,l,0,c.size,c.offset),validateBufferIntegrity(l,c.integrity),f?l.toString(f):l};const{readdir:w}=e;e.readdir=function(t,r={},n){const s=splitPath(t);if("function"==typeof r&&(n=r,r={}),!s.isAsar)return w.apply(this,arguments);const{asarPath:a,filePath:o}=s,c=getOrCreateArchive(a);if(!c){const t=createError("INVALID_ARCHIVE",{asarPath:a});return void nextTick(n,[t])}const f=c.readdir(o);if(f)if(r.withFileTypes){const t=[];for(const r of f){const s=i.join(o,r),f=c.stat(s);if(!f){const t=createError("NOT_FOUND",{asarPath:a,filePath:s});return void nextTick(n,[t])}f.isFile?t.push(new e.Dirent(r,e.constants.UV_DIRENT_FILE)):f.isDirectory?t.push(new e.Dirent(r,e.constants.UV_DIRENT_DIR)):f.isLink&&t.push(new e.Dirent(r,e.constants.UV_DIRENT_LINK))}nextTick(n,[null,t])}else nextTick(n,[null,f]);else{const t=createError("NOT_FOUND",{asarPath:a,filePath:o});nextTick(n,[t])}},e.promises.readdir=a.promisify(e.readdir);const{readdirSync:m}=e;e.readdirSync=function(t,r){const n=splitPath(t);if(!n.isAsar)return m.apply(this,arguments);const{asarPath:s,filePath:a}=n,o=getOrCreateArchive(s);if(!o)throw createError("INVALID_ARCHIVE",{asarPath:s});const c=o.readdir(a);if(!c)throw createError("NOT_FOUND",{asarPath:s,filePath:a});if(r&&r.withFileTypes){const t=[];for(const r of c){const n=i.join(a,r),c=o.stat(n);if(!c)throw createError("NOT_FOUND",{asarPath:s,filePath:n});c.isFile?t.push(new e.Dirent(r,e.constants.UV_DIRENT_FILE)):c.isDirectory?t.push(new e.Dirent(r,e.constants.UV_DIRENT_DIR)):c.isLink&&t.push(new e.Dirent(r,e.constants.UV_DIRENT_LINK))}return t}return c};const{internalModuleReadJSON:F}=u("fs");u("fs").internalModuleReadJSON=t=>{const r=splitPath(t);if(!r.isAsar)return F(t);const{asarPath:n,filePath:i}=r,a=getOrCreateArchive(n);if(!a)return[];const o=a.getFileInfo(i);if(!o)return[];if(0===o.size)return["",!1];if(o.unpacked){const t=a.copyFileOut(i),r=e.readFileSync(t,{encoding:"utf8"});return[r,r.length>0]}const c=s.Buffer.alloc(o.size),f=a.getFdAndValidateIntegrityLater();if(!(f>=0))return[];logASARAccess(n,i,o.offset),e.readSync(f,c,0,o.size,o.offset),validateBufferIntegrity(c,o.integrity);const l=c.toString("utf8");return[l,l.length>0]};const{internalModuleStat:S}=u("fs");if(u("fs").internalModuleStat=t=>{const e=splitPath(t);if(!e.isAsar)return S(t);const{asarPath:r,filePath:n}=e,s=getOrCreateArchive(r);if(!s)return-34;const i=s.stat(n);return i?i.isDirectory?1:0:-34},"win32"===t.platform){const{mkdir:t}=e;e.mkdir=(e,r,n)=>{"function"==typeof r&&(n=r,r={});const s=splitPath(e);if(s.isAsar&&s.filePath.length>0){const t=createError("NOT_DIR");nextTick(n,[t])}else t(e,r,n)},e.promises.mkdir=a.promisify(e.mkdir);const{mkdirSync:r}=e;e.mkdirSync=function(t,e){const n=splitPath(t);if(n.isAsar&&n.filePath.length)throw createError("NOT_DIR");return r(t,e)}}function invokeWithNoAsar(e){return function(){const r=t.noAsar;t.noAsar=!0;try{return e.apply(this,arguments)}finally{t.noAsar=r}}}overrideAPI(e,"copyFile"),overrideAPISync(e,"copyFileSync"),overrideAPI(e,"open"),overrideAPISync(t,"dlopen",1),overrideAPISync(c._extensions,".node",1),overrideAPISync(e,"openSync");const overrideChildProcess=t=>{const{exec:e,execSync:r}=t;t.exec=invokeWithNoAsar(e),t.exec[a.promisify.custom]=invokeWithNoAsar(e[a.promisify.custom]),t.execSync=invokeWithNoAsar(r),overrideAPI(t,"execFile"),overrideAPISync(t,"execFileSync")},D=new WeakSet;if(t.env.ELECTRON_EAGER_ASAR_HOOK_FOR_TESTING)overrideChildProcess(r(/*! child_process */"child_process"));else{const t=c._load;c._load=(e,...r)=>{const n=t(e,...r);if("child_process"===e&&!D.has(n)){D.add(n),overrideChildProcess(n)}return n}}}}).call(this,r(/*! @electron/internal/common/webpack-provider */"./lib/common/webpack-provider.ts").process,r(/*! @electron/internal/common/webpack-provider */"./lib/common/webpack-provider.ts")._global)},"./lib/asar/init.ts":
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
    
    Error: libtensorflow.so.2: cannot open shared object file: No such file or directory
        at process.func [as dlopen] (node:electron/js2c/asar_bundle:5:1812)
        at Module._extensions..node (node:internal/modules/cjs/loader:1203:18)
        at Object.func [as .node] (node:electron/js2c/asar_bundle:5:2039)
        at Module.load (node:internal/modules/cjs/loader:988:32)
        at Module._load (node:internal/modules/cjs/loader:829:12)
        at c._load (node:electron/js2c/asar_bundle:5:13343)
        at Module.require (node:internal/modules/cjs/loader:1012:19)
        at require (node:internal/modules/cjs/helpers:102:18)
        at Object.<anonymous> (/tmp/.mount_BME AITF3058/resources/app.asar/node_modules/@tensorflow/tfjs-node/dist/index.js:60:16)
        at Module._compile (node:internal/modules/cjs/loader:1118:14) {
      code: 'ERR_DLOPEN_FAILED'
    }
    info [11:59:17] (electron): Exit forked server process (1, null)

    I have tried to install the tensorflow node library on my system following their instructions: https://github.com/tensorflow/tfjs/tree/master/tfjs-node however it is not clear which folder/location I should install the node tensorflow library.

    When I try to run a global installation as root I see a runtime error:

    sudo npm install @tensorflow/tfjs-node -g
    npm ERR! code 1
    npm ERR! path /usr/local/lib/node_modules/@tensorflow/tfjs-node
    npm ERR! command failed
    npm ERR! command sh -c node scripts/install.js
    
    npm ERR! A complete log of this run can be found in: /root/.npm/_logs/2023-12-11T11_55_32_989Z-debug-0.log

     Please may you advise any other debug methods I could try to run BME AI-Studio on my Linux system? I am running Ubuntu 22.04.3 LTS.

    I've managed to fix my npm install error by downgrading my node installation to v18.16.1 (https://github.com/tensorflow/tfjs/issues/7716) however the global install of  `@tensorflow/tfjs-node` doesn't fix my error running BME AI Studio.

    Icon--AD-black-48x48Icon--address-consumer-data-black-48x48Icon--appointment-black-48x48Icon--back-left-black-48x48Icon--calendar-black-48x48Icon--center-alignedIcon--Checkbox-checkIcon--clock-black-48x48Icon--close-black-48x48Icon--compare-black-48x48Icon--confirmation-black-48x48Icon--dealer-details-black-48x48Icon--delete-black-48x48Icon--delivery-black-48x48Icon--down-black-48x48Icon--download-black-48x48Ic-OverlayAlertIcon--externallink-black-48x48Icon-Filledforward-right_adjustedIcon--grid-view-black-48x48IC_gd_Check-Circle170821_Icons_Community170823_Bosch_Icons170823_Bosch_Icons170821_Icons_CommunityIC-logout170821_Icons_Community170825_Bosch_Icons170821_Icons_CommunityIC-shopping-cart2170821_Icons_CommunityIC-upIC_UserIcon--imageIcon--info-i-black-48x48Icon--left-alignedIcon--Less-minimize-black-48x48Icon-FilledIcon--List-Check-grennIcon--List-Check-blackIcon--List-Cross-blackIcon--list-view-mobile-black-48x48Icon--list-view-black-48x48Icon--More-Maximize-black-48x48Icon--my-product-black-48x48Icon--newsletter-black-48x48Icon--payment-black-48x48Icon--print-black-48x48Icon--promotion-black-48x48Icon--registration-black-48x48Icon--Reset-black-48x48Icon--right-alignedshare-circle1Icon--share-black-48x48Icon--shopping-bag-black-48x48Icon-shopping-cartIcon--start-play-black-48x48Icon--store-locator-black-48x48Ic-OverlayAlertIcon--summary-black-48x48tumblrIcon-FilledvineIc-OverlayAlertwhishlist