Next, add it as an approved sender in Amazon
- Open Amazon Settings and go to the Preferences tab
- Scroll down to Personal Document Settings
- Open the dropdown menu
- Click the Add a new approved email address button
- Paste in your Matter address
diff --git a/README.md b/README.md index 946d6fc..a4665b2 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ cd iot-backend ### Launch Docker Containers ```sh -docker-compose up -d +docker-compose --file software/container/docker-compose.yml up --force-recreate --build ``` ## Usage @@ -59,13 +59,11 @@ It provides a browser-based editor that makes it easy to wire together flows usi NodeRed is also running in Docker: http://localhost:1880/ -A simple introduction to Node-RED can be found - along with the nodes / the code - in [this repository, please have a look](./docs/flow/README.md)! - ### InfluxDB [InfluxDB](https://www.influxdata.com) is a database for any time series data with a single. It runs in Docker and is exposed on port `8086`: -InfluxDb is running here: http://localhost:8086/ (admin:adminadmin) +InfluxDb is running here: http://localhost:8086/ (you have to create an initial user in just a few simple steps) ### Grafana @@ -75,6 +73,13 @@ You can login to Grafana: http://localhost:3000/login (admin:admin) Have a look at the [HowTo in this repository](./docs/dashboard/README.md). +## Usage + +### Setting up a simple Flow + +A simple introduction to Node-RED can be found - along with the nodes / the code - in [this repository, please have a look](./docs/flow/README.md)! + + ## Contribution Feel free to open an issue for bugs, feature requests, or questions. Contributions are welcome. diff --git a/docs/.DS_Store b/docs/.DS_Store index 6282d59..271d1fa 100644 Binary files a/docs/.DS_Store and b/docs/.DS_Store differ diff --git a/docs/flow/README.md b/docs/flow/README.md index 19acbf5..0800fb9 100644 --- a/docs/flow/README.md +++ b/docs/flow/README.md @@ -23,8 +23,6 @@ Flows are an organized sequence of nodes. Let's do the "first steps" by creating ## Plugins -> The plugin folder is pushed into this Git repository and is mounted in Docker. Maybe we should use an own Docker file, instead. - Node-RED uses plugins (e.g. for InfluxDB or own Dashboard capabilites). You can access the plugins in the right burger menu. @@ -33,7 +31,7 @@ You can access the plugins in the right burger menu. ## First steps -For debuging I already added Node-RED's own dashboard (sure, we are going to use Grafana, later). +For debuging you can add Node-RED's own dashboard (sure, we are going to use Grafana, later). ![Overview](./docs/images/1-overview.png) diff --git a/software/container/docker-compose.yml b/software/container/docker-compose.yml index 94c3a50..9a785a0 100644 --- a/software/container/docker-compose.yml +++ b/software/container/docker-compose.yml @@ -34,7 +34,6 @@ services: nodered: # https://hub.docker.com/r/grafana/grafana # https://nodered.org/docs/getting-started/docker - image: nodered/node-red:3.0.2 depends_on: - influxdb restart: always @@ -46,6 +45,8 @@ services: - FLOWS=flows.json volumes: - nodered-data:/data + build: ../flow + volumes: influxdb2: grafana-dashboards: diff --git a/software/dashboard/grafana/alerting/1/__default__.tmpl b/software/dashboard/grafana/alerting/1/__default__.tmpl deleted file mode 100755 index 5cae8cc..0000000 --- a/software/dashboard/grafana/alerting/1/__default__.tmpl +++ /dev/null @@ -1,53 +0,0 @@ - -{{ define "__subject" }}[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ if gt (.Alerts.Resolved | len) 0 }}, RESOLVED:{{ .Alerts.Resolved | len }}{{ end }}{{ end }}] {{ .GroupLabels.SortedPairs.Values | join " " }} {{ if gt (len .CommonLabels) (len .GroupLabels) }}({{ with .CommonLabels.Remove .GroupLabels.Names }}{{ .Values | join " " }}{{ end }}){{ end }}{{ end }} - -{{ define "__text_values_list" }}{{ $len := len .Values }}{{ if $len }}{{ $first := gt $len 1 }}{{ range $refID, $value := .Values -}} -{{ $refID }}={{ $value }}{{ if $first }}, {{ end }}{{ $first = false }}{{ end -}} -{{ else }}[no value]{{ end }}{{ end }} - -{{ define "__text_alert_list" }}{{ range . }} -Value: {{ template "__text_values_list" . }} -Labels: -{{ range .Labels.SortedPairs }} - {{ .Name }} = {{ .Value }} -{{ end }}Annotations: -{{ range .Annotations.SortedPairs }} - {{ .Name }} = {{ .Value }} -{{ end }}{{ if gt (len .GeneratorURL) 0 }}Source: {{ .GeneratorURL }} -{{ end }}{{ if gt (len .SilenceURL) 0 }}Silence: {{ .SilenceURL }} -{{ end }}{{ if gt (len .DashboardURL) 0 }}Dashboard: {{ .DashboardURL }} -{{ end }}{{ if gt (len .PanelURL) 0 }}Panel: {{ .PanelURL }} -{{ end }}{{ end }}{{ end }} - -{{ define "default.title" }}{{ template "__subject" . }}{{ end }} - -{{ define "default.message" }}{{ if gt (len .Alerts.Firing) 0 }}**Firing** -{{ template "__text_alert_list" .Alerts.Firing }}{{ if gt (len .Alerts.Resolved) 0 }} - -{{ end }}{{ end }}{{ if gt (len .Alerts.Resolved) 0 }}**Resolved** -{{ template "__text_alert_list" .Alerts.Resolved }}{{ end }}{{ end }} - - -{{ define "__teams_text_alert_list" }}{{ range . }} -Value: {{ template "__text_values_list" . }} -Labels: -{{ range .Labels.SortedPairs }} - {{ .Name }} = {{ .Value }} -{{ end }} -Annotations: -{{ range .Annotations.SortedPairs }} - {{ .Name }} = {{ .Value }} -{{ end }} -{{ if gt (len .GeneratorURL) 0 }}Source: [{{ .GeneratorURL }}]({{ .GeneratorURL }}) - -{{ end }}{{ if gt (len .SilenceURL) 0 }}Silence: [{{ .SilenceURL }}]({{ .SilenceURL }}) - -{{ end }}{{ if gt (len .DashboardURL) 0 }}Dashboard: [{{ .DashboardURL }}]({{ .DashboardURL }}) - -{{ end }}{{ if gt (len .PanelURL) 0 }}Panel: [{{ .PanelURL }}]({{ .PanelURL }}) - -{{ end }} -{{ end }}{{ end }} - - -{{ define "teams.default.message" }}{{ if gt (len .Alerts.Firing) 0 }}**Firing** -{{ template "__teams_text_alert_list" .Alerts.Firing }}{{ if gt (len .Alerts.Resolved) 0 }} - -{{ end }}{{ end }}{{ if gt (len .Alerts.Resolved) 0 }}**Resolved** -{{ template "__teams_text_alert_list" .Alerts.Resolved }}{{ end }}{{ end }} diff --git a/software/dashboard/grafana/co2/dashboard_input_CO2-emissions.csv b/software/dashboard/grafana/co2/dashboard_input_CO2-emissions.csv deleted file mode 100755 index 7d62f55..0000000 --- a/software/dashboard/grafana/co2/dashboard_input_CO2-emissions.csv +++ /dev/null @@ -1,14 +0,0 @@ -Jahr,Verarbeitendes Gewerbe (in kt),Verkehr gesamt (in kt),Straßenverkehr (in kt),Haushalte und GHD gesamt (in kt),Haushalte (in kt),"Gewerbe, Handel, Dienstleistungen GHD (in kt)",CO2-Emissionen gesamt (in kt) -2020-01-01,3702,3760,2989,6070,3165,2905,13532 -2019-01-01,3956,4708,3313,6477,3451,3026,15140 -2018-01-01,4220,4755,3294,6982,3600,3382,15957 -2017-01-01,4630,4653,3333,7012,3509,3503,16294 -2016-01-01,4661,4577,3287,7314,3637,3677,16552 -2015-01-01,5135,4460,3198,7434,3593,3841,17029 -2014-01-01,5388,4417,3178,7419,3657,3762,17224 -2013-01-01,5224,4337,3165,8277,4056,4221,17839 -2012-01-01,5848,4259,3033,8313,4030,4283,18419 -2011-01-01,5714,4279,3045,8143,4052,4091,18136 -2010-01-01,5899,4243,3065,8611,4245,4366,18753 -2009-01-01,5442,4172,3013,8360,4159,4201,17974 -2008-01-01,5835,4234,3019,8462,4284,4178,18531 diff --git a/software/dashboard/grafana/co2/job_cncCutter.csv b/software/dashboard/grafana/co2/job_cncCutter.csv deleted file mode 100755 index 3e92978..0000000 --- a/software/dashboard/grafana/co2/job_cncCutter.csv +++ /dev/null @@ -1,3 +0,0 @@ -ID,Path,StartTime,EndTime -0,C:\Users\InMachines\Desktop\MQTT\bCNC-laser\tests\static\sample.gcode,2023-03-01 12:31:30.351399,2023-03-01 12:31:52.538042 -1,C:\Users\InMachines\Desktop\MQTT\bCNC-laser\tests\static\sample.gcode,2023-03-01 12:32:17.547355,2023-03-01 12:32:38.265005 diff --git a/software/dashboard/grafana/co2/state_cnc.csv b/software/dashboard/grafana/co2/state_cnc.csv deleted file mode 100755 index 0ab422f..0000000 --- a/software/dashboard/grafana/co2/state_cnc.csv +++ /dev/null @@ -1,13 +0,0 @@ -Time,State-CNC,State-Lasercutter,State-3D-Printer -2023-03-01 12:31:28,Connected,Connected,Connected -2023-03-01 12:31:29,Idle,Idle,Idle -2023-03-01 12:31:30,Idle, Run,Idle -2023-03-01 12:31:31,Run,Idle,Run -2023-03-01 12:31:32,Idle,Run,Run -2023-03-01 12:31:33,Run,Run,Run -2023-03-01 12:31:52,Idle,Idle,Run -2023-03-01 12:31:52,Idle,Run,Idle -2023-03-01 12:32:17,Idle,Run,Idle -2023-03-01 12:32:20,Run,Idle,Run -2023-03-01 12:32:39,Idle,Run,Run -2023-03-01 12:32:39,Idle,Idle,Idle diff --git a/software/dashboard/grafana/csv/Node-RED_files/debug-utils.js b/software/dashboard/grafana/csv/Node-RED_files/debug-utils.js deleted file mode 100755 index 70dc336..0000000 --- a/software/dashboard/grafana/csv/Node-RED_files/debug-utils.js +++ /dev/null @@ -1,733 +0,0 @@ -/** - * Copyright JS Foundation and other contributors, http://js.foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -if (!RED) { - var RED = {} -} -RED.debug = (function() { - var config; - var messageList; - var messageTable; - var filterType = "filterAll"; - var filteredNodes = {}; // id->true means hide, so default to all visible - - var view = 'list'; - var messages = []; - var messagesByNode = {}; - var sbc; - var activeWorkspace; - var numMessages = 100; // Hardcoded number of message to show in debug window scrollback - - var debugNodeTreeList; - - function init(_config) { - config = _config; - - var content = $("
=b[n+1]?b[n+1]-1:b[n-1],d=c-(n-C)-y;const l=c;for(;c>e&&d>i&&this.ElementsAreEqual(c,d);)c--,d--;if(b[n]=c,S&&Math.abs(n-v)<=x&&c<=_[n])return r[0]=c,s[0]=d,l>=_[n]&&x<=1448?this.WALKTRACE(v,u,h,w,C,g,p,y,_,b,c,t,r,d,o,s,S,a):null}if(x<=1447){let e=new Int32Array(h-u+2);e[0]=v-u+1,l.Copy2(_,u,e,1,h-u+1),this.m_forwardHistory.push(e),e=new Int32Array(p-g+2),e[0]=C-g+1,l.Copy2(b,g,e,1,p-g+1),this.m_reverseHistory.push(e)}}return this.WALKTRACE(v,u,h,w,C,g,p,y,_,b,c,t,r,d,o,s,S,a)}PrettifyChanges(e){for(let t=0;t "+e+"1;n--){const o=e[n]+i,r=t[t.length-1];r&&r.end===o?r.end=o+1:t.push({start:o,end:o+1})}return t}const I=128;function T(){const e=[],t=[];for(let e=0;e<=I;e++)t[e]=0;for(let i=0;i<=I;i++)e.push(t.slice(0));return e}function A(e){const t=[];for(let i=0;i<=e;i++)t[i]=0;return t}const R=A(256),M=A(256),O=T(),P=T(),F=T();function B(e,t){if(t<0||t>=e.length)return!1;const i=e.codePointAt(t);switch(i){case 95:case 45:case 46:case 32:case 47:case 92:case 39:case 34:case 58:case 36:case 60:case 40:case 91:return!0;case void 0:return!1;default:return!!o.C8(i)}}function W(e,t){if(t<0||t>=e.length)return!1;switch(e.charCodeAt(t)){case 32:case 9:return!0;default:return!1}}function V(e,t,i){return t[e]!==i[e]}var H;function z(e,t,i,n,o,r,s){const a=e.length>I?I:e.length,l=n.length>I?I:n.length;if(i>=a||r>=l||a-i>l-r)return;if(!function(e,t,i,n,o,r,s=!1){for(;t=i&&a>=n;)o[s]===r[a]&&(M[s]=a,s--),a--}(a,l,i,r,t,o);let c=1,d=1,u=i,h=r;const g=[!1];for(c=1,u=i;us,b=_?P[c][d-1]+(O[c][d-1]>0?-5:0):0,v=h>s+1&&O[c][d-1]>0,C=v?P[c][d-2]+(O[c][d-2]>0?-5:0):0;if(v&&(!_||C>=b)&&(!m||C>=f))P[c][d]=C,F[c][d]=3,O[c][d]=0;else if(_&&(!m||b>=f))P[c][d]=b,F[c][d]=2,O[c][d]=0;else{if(!m)throw new Error("not possible");P[c][d]=f,F[c][d]=1,O[c][d]=O[c-1][d-1]+1}}}if(!g[0]&&!s)return;c--,d--;const p=[P[c][d],r];let m=0,f=0;for(;c>=1;){let e=d;do{const t=F[c][e];if(3===t)e-=2;else{if(2!==t)break;e-=1}}while(e>=1);m>1&&t[i+c-1]===o[r+d-1]&&!V(e+r-1,n,o)&&m+1>O[c][e]&&(e=d),e===d?m++:m=1,f||(f=e),c--,d=e-1,p.push(d)}l===a&&(p[0]+=2);const _=f-a;return p[0]-=_,p}function $(e,t,i,n,o,r,s,a,l,c,d){if(t[i]!==r[s])return Number.MIN_SAFE_INTEGER;let u=1,h=!1;return s===i-n?u=e[i]===o[s]?7:5:!V(s,o,r)||0!==s&&V(s-1,o,r)?!B(r,s)||0!==s&&B(r,s-1)?(B(r,s-1)||W(r,s-1))&&(u=5,h=!0):u=5:(u=e[i]===o[s]?7:5,h=!0),u>1&&i===n&&(d[0]=!0),h||(h=V(s,o,r)||B(r,s-1)||W(r,s-1)),i===n?s>l&&(u-=h?3:5):u+=c?h?2:0:h?0:1,s+1===a&&(u-=h?3:5),u}function U(e,t,i,n,o,r,s){return function(e,t,i,n,o,r,s,a){let l=z(e,t,i,n,o,r,a);if(e.length>=3){const t=Math.min(7,e.length-1);for(let s=i+1;s
\n":"'+(i?e:u(e,!0))+"
\n"},i.blockquote=function(e){return""+(i?e:u(e,!0))+"
\n"+e+"
\n"},i.html=function(e){return e},i.heading=function(e,t,i,n){return this.options.headerIds?"
\n":"
\n"},i.list=function(e,t,i){var n=t?"ol":"ul";return"<"+n+(t&&1!==i?' start="'+i+'"':"")+">\n"+e+""+n+">\n"},i.listitem=function(e){return"\n\n"+e+"\n"+t+"
\n"},i.tablerow=function(e){return"\n"+e+" \n"},i.tablecell=function(e,t){var i=t.header?"th":"td";return(t.align?"<"+i+' align="'+t.align+'">':"<"+i+">")+e+""+i+">\n"},i.strong=function(e){return""+e+""},i.em=function(e){return""+e+""},i.codespan=function(e){return""+e+"
"},i.br=function(){return this.options.xhtml?"
":"
"},i.del=function(e){return""+e+""},i.link=function(e,t,i){if(null===(e=b(this.options.sanitize,this.options.baseUrl,e)))return i;var n='"+i+""},i.image=function(e,t,i){if(null===(e=b(this.options.sanitize,this.options.baseUrl,e)))return i;var n='":">")},i.text=function(e){return e},t}(),F=function(){function e(){}var t=e.prototype;return t.strong=function(e){return e},t.em=function(e){return e},t.codespan=function(e){return e},t.del=function(e){return e},t.html=function(e){return e},t.text=function(e){return e},t.link=function(e,t,i){return""+i},t.image=function(e,t,i){return""+i},t.br=function(){return""},e}(),B=function(){function e(){this.seen={}}var t=e.prototype;return t.serialize=function(e){return e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")},t.getNextSafeSlug=function(e,t){var i=e,n=0;if(this.seen.hasOwnProperty(i)){n=this.seen[e];do{i=e+"-"+ ++n}while(this.seen.hasOwnProperty(i))}return t||(this.seen[e]=n,this.seen[i]=0),i},t.slug=function(e,t){void 0===t&&(t={});var i=this.serialize(e);return this.getNextSafeSlug(i,t.dryrun)},e}(),W=function(){function t(t){this.options=t||e.defaults,this.options.renderer=this.options.renderer||new P,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new F,this.slugger=new B}t.parse=function(e,i){return new t(i).parse(e)},t.parseInline=function(e,i){return new t(i).parseInline(e)};var i=t.prototype;return i.parse=function(e,t){void 0===t&&(t=!0);var i,n,o,r,s,a,l,c,d,u,h,p,m,f,_,b,v,C,w,y="",S=e.length;for(i=0;i0&&"paragraph"===_.tokens[0].type?(_.tokens[0].text=C+" "+_.tokens[0].text,_.tokens[0].tokens&&_.tokens[0].tokens.length>0&&"text"===_.tokens[0].tokens[0].type&&(_.tokens[0].tokens[0].text=C+" "+_.tokens[0].tokens[0].text)):_.tokens.unshift({type:"text",text:C}):f+=C),f+=this.parse(_.tokens,m),d+=this.renderer.listitem(f,v,b);y+=this.renderer.list(d,h,p);continue;case"html":y+=this.renderer.html(u.text);continue;case"paragraph":y+=this.renderer.paragraph(this.parseInline(u.tokens));continue;case"text":for(d=u.tokens?this.parseInline(u.tokens):u.text;i+1An error occurred:
"+u(e.message+"",!0)+"";throw e}}V.options=V.setOptions=function(t){var i;return x(V.defaults,t),i=V.defaults,e.defaults=i,V},V.getDefaults=o,V.defaults=e.defaults,V.use=function(){for(var e=arguments.length,t=new Array(e),i=0;i
"+u(e.message+"",!0)+"";throw e}},V.Parser=W,V.parser=W.parse,V.Renderer=P,V.TextRenderer=F,V.Lexer=O,V.lexer=O.lex,V.Tokenizer=I,V.Slugger=B,V.parse=V;var H=V.options,z=V.setOptions,$=V.use,U=V.walkTokens,j=V.parseInline,K=V,q=W.parse,G=O.lex;e.Lexer=O,e.Parser=W,e.Renderer=P,e.Slugger=B,e.TextRenderer=F,e.Tokenizer=I,e.getDefaults=o,e.lexer=G,e.marked=V,e.options=H,e.parse=K,e.parseInline=j,e.parser=q,e.setOptions=z,e.use=$,e.walkTokens=U,Object.defineProperty(e,"__esModule",{value:!0})},"object"==typeof exports?i(exports):e.amd?e(0,i):i((t="undefined"!=typeof globalThis?globalThis:t||self).marked={})}();var me=pe||exports,fe=i(60491),_e=i(9734),be=i(90584),ve=i(10804),Ce=i(18039),we=i(39675);function ye(e,t){return/^\w[\w\d+.-]*:/.test(t)?t:e.path.endsWith("/")?(0,ve.i3)(e,t).toString():(0,ve.i3)((0,ve.XX)(e),t).toString()}function Se(e,t){const{config:i,allowedSchemes:n}=function(e){const t=[_e.lg.http,_e.lg.https,_e.lg.mailto,_e.lg.data,_e.lg.file,_e.lg.vscodeFileResource,_e.lg.vscodeRemote,_e.lg.vscodeRemoteResource];return e.isTrusted&&t.push(_e.lg.command),{config:{ALLOWED_TAGS:["ul","li","p","b","i","code","blockquote","ol","h1","h2","h3","h4","h5","h6","hr","em","pre","table","thead","tbody","tr","th","td","div","del","a","strong","br","img","span"],ALLOWED_ATTR:["href","data-href","target","title","src","alt","class","style","data-code","width","height","align"],ALLOW_UNKNOWN_PROTOCOLS:!0},allowedSchemes:t}}(e);ee("uponSanitizeAttribute",((e,t)=>{if("style"!==t.attrName&&"class"!==t.attrName);else{if("SPAN"===e.tagName){if("style"===t.attrName)return void(t.keepAttr=/^(color\:#[0-9a-fA-F]+;)?(background-color\:#[0-9a-fA-F]+;)?$/.test(t.attrValue));if("class"===t.attrName)return void(t.keepAttr=/^codicon codicon-[a-z\-]+( codicon-modifier-[a-z\-]+)?$/.test(t.attrValue))}t.keepAttr=!1}}));const o=document.createElement("a");ee("afterSanitizeAttributes",(e=>{for(const t of["href","src"])e.hasAttribute(t)&&(o.href=e.getAttribute(t),n.includes(o.protocol.replace(/:$/,""))||e.removeAttribute(t))}));try{return J(t,Object.assign(Object.assign({},i),{RETURN_TRUSTED_TYPE:!0}))}finally{te("uponSanitizeAttribute"),te("afterSanitizeAttributes")}}var xe,ke=i(82523),Le=i(10940),Ee=i(54571),Ne=i(18226),De=i(11233),Ie=function(e,t){return function(i,n){t(i,n,e)}};let Te=class e{constructor(e,t,i){this._options=e,this._languageService=t,this._openerService=i,this._onDidRenderAsync=new ce.Q5,this.onDidRenderAsync=this._onDidRenderAsync.event}dispose(){this._onDidRenderAsync.dispose()}render(e,t,i){if(!e)return{element:document.createElement("span"),dispose:()=>{}};const o=new ge.SL,r=o.add(function(e,t={},i={}){var o;const r=new ge.SL;let s=!1;const a=r.add(new ae.A),l=(0,ne.az)(t),c=function(t){let i;try{i=(0,fe.Q)(decodeURIComponent(t))}catch(e){}return i?(i=(0,be.rs)(i,(t=>e.uris&&e.uris[t]?we.o.revive(e.uris[t]):void 0)),encodeURIComponent(JSON.stringify(i))):t},d=function(t,i){const n=e.uris&&e.uris[t];let o=we.o.revive(n);return i?t.startsWith(_e.lg.data+":")?t:(o||(o=we.o.parse(t)),_e.Gi.asBrowserUri(o).toString(!0)):o?we.o.parse(t).toString()===o.toString()?t:(o.query&&(o=o.with({query:c(o.query)})),o.toString()):t};let u;const h=new Promise((e=>u=e)),g=new me.Renderer;if(g.image=(e,t,i)=>{let n=[],o=[];return e&&(({href:e,dimensions:n}=(0,de.v1)(e)),o.push(`src="${e}"`)),i&&o.push(`alt="${i}"`),t&&o.push(`title="${t}"`),n.length&&(o=o.concat(n)),""},g.link=(t,i,n)=>"string"!=typeof t?"":(t===n&&(n=(0,de.oR)(n)),t=d(t,!1),e.baseUri&&(t=ye(we.o.from(e.baseUri),t)),i="string"==typeof i?(0,de.oR)(i):"",!(t=(0,de.oR)(t))||/^data:|javascript:/i.test(t)||/^command:/i.test(t)&&!e.isTrusted||/^command:(\/\/\/)?_workbench\.downloadResource/i.test(t)?n:`/g,">").replace(/"/g,""").replace(/'/g,"'")}" title="${i||t}">${n}`),g.paragraph=e=>`
${e}
`,t.codeBlockRenderer&&(g.code=(e,i)=>{const o=t.codeBlockRenderer(null!=i?i:"",e),r=he.a.nextId();return(0,se.eP)(Promise.all([o,h]),a.token).then((e=>{var i;if(!s&&e){const o=l.querySelector(`div[data-code="${r}"]`);o&&n.mc(o,e[0]),null===(i=t.asyncRenderCallback)||void 0===i||i.call(t)}})).catch((()=>{})),`