This commit is contained in:
Ral 2021-12-26 21:23:15 +01:00
parent bde8143c94
commit 2df36a0564
6 changed files with 148 additions and 89 deletions

View File

@ -4,8 +4,8 @@
<meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"> <meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no">
<title>rC3 NOWHERE</title> <title>rC3 NOWHERE</title>
<link href=/fork-awesome/css/fork-awesome.min.css rel=stylesheet type=text/css> <link href=/fork-awesome/css/fork-awesome.min.css rel=stylesheet type=text/css>
<link rel=stylesheet href=https://infobeamer.montage2.de/main.min.818792ab7049f79cb65101e4c8c34d90986ecabe38b739d82ab5b7be19d1923e.css> <link rel=stylesheet href=https://infobeamer.montage2.de/main.min.b34cf8f32ebf8158101dc492d21641a7a52c484c65ce5c4bfbd0df55d3455d1d.css>
<script src=https://infobeamer.montage2.de/js/config.fa1a162e62b8d5f3f40c8812d30b5289c5792ff26c0843426d8c109a00621389.js integrity="sha256-+hoWLmK41fP0DIgS0wtSicV5L/JsCENCbYwQmgBiE4k="></script> <script src=https://infobeamer.montage2.de/js/config.c3055781f00111fd050e1e5732c9e6dbd2dce21204e90b02975e9983a4c367f7.js integrity="sha256-wwVXgfABEf0FDh5XMsnm29Lc4hIE6QsCl16Zg6TDZ/c="></script>
</head> </head>
<body> <body>
<main id=main> <main id=main>
@ -13,6 +13,6 @@
<script src=https://infobeamer.montage2.de/js/moment/moment.min.73de4254959530e4d1d9bec586379184f96b4953dacf9cd5e5e2bdd7bfeceef7.js integrity="sha256-c95CVJWVMOTR2b7FhjeRhPlrSVPaz5zV5eK917/s7vc="></script> <script src=https://infobeamer.montage2.de/js/moment/moment.min.73de4254959530e4d1d9bec586379184f96b4953dacf9cd5e5e2bdd7bfeceef7.js integrity="sha256-c95CVJWVMOTR2b7FhjeRhPlrSVPaz5zV5eK917/s7vc="></script>
<script src=https://infobeamer.montage2.de/js/preact/preact.min.0c204e20934f1e09cfe86fbcf1d069d842f988fc71efe3a923021c08892c71c8.js integrity="sha256-DCBOIJNPHgnP6G+88dBp2EL5iPxx7+OpIwIcCIksccg="></script> <script src=https://infobeamer.montage2.de/js/preact/preact.min.0c204e20934f1e09cfe86fbcf1d069d842f988fc71efe3a923021c08892c71c8.js integrity="sha256-DCBOIJNPHgnP6G+88dBp2EL5iPxx7+OpIwIcCIksccg="></script>
<script src=https://infobeamer.montage2.de/js/htm/htm.80e39afe20fd61183412eda89efa10532d57945e6364642aceacd50eb2384b4b.js integrity="sha256-gOOa/iD9YRg0Eu2onvoQUy1XlF5jZGQqzqzVDrI4S0s="></script> <script src=https://infobeamer.montage2.de/js/htm/htm.80e39afe20fd61183412eda89efa10532d57945e6364642aceacd50eb2384b4b.js integrity="sha256-gOOa/iD9YRg0Eu2onvoQUy1XlF5jZGQqzqzVDrI4S0s="></script>
<script src=https://infobeamer.montage2.de/main.c6cb62188f7b5dc001704b60fcb1a1b0b38510b5bed7b27311053c13fc63333d.js integrity="sha256-xstiGI97XcABcEtg/LGhsLOFELW+17JzEQU8E/xjMz0=" type=module></script> <script src=https://infobeamer.montage2.de/main.7b9386a5aed538c367cecbb578d8b458be6fcb679fa7b83c00402918b7b123aa.js integrity="sha256-e5OGpa7VOMNnzsu1eNi0WL5vy2efp7g8AEApGLexI6o=" type=module></script>
</body> </body>
</html> </html>

View File

@ -5,11 +5,11 @@
window.infoBeamerConfig.set("scheduleURL", "/everything.schedule.json"); window.infoBeamerConfig.set("scheduleURL", "/everything.schedule.json");
window.infoBeamerConfig.set("scheduleFetchInterval", 60); window.infoBeamerConfig.set("scheduleFetchInterval", 60);
window.infoBeamerConfig.set("twitterURL", "/tweets-rc3.json"); window.infoBeamerConfig.set("twitterURL", "/tweets-rc3.json");
window.infoBeamerConfig.set("twitterFetchInterval", 60); window.infoBeamerConfig.set("twitterFetchInterval", 120);
window.infoBeamerConfig.set("mastodonURL", "/toots-rc3-chaos.social.json"); window.infoBeamerConfig.set("mastodonURL", "/toots-rc3-chaos.social.json");
window.infoBeamerConfig.set("mastodonFetchInterval", 60); window.infoBeamerConfig.set("mastodonFetchInterval", 120);
window.infoBeamerConfig.set("musicURL", "/music.json"); window.infoBeamerConfig.set("musicURL", "/music.json");
window.infoBeamerConfig.set("musicFetchInterval", 3); window.infoBeamerConfig.set("musicFetchInterval", 5);
console.log("Info Beamer Configuration: "); console.log("Info Beamer Configuration: ");
console.log(window.infoBeamerConfig); console.log(window.infoBeamerConfig);
})(); })();

View File

@ -1,29 +1,26 @@
"use strict"; "use strict";
(() => { (() => {
// ns-hugo:/home/raoul-web/rc3_2021/html-infobeamer-content/assets/js/services.js // ns-hugo:/home/raoul-web/rc3_2021/html-infobeamer-content/assets/js/services.js
var delay = 3 * 5 * 60 * 1e3;
var postsLimit = 20;
var defaultUrlSet = [
"https://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png",
"https://chaos.social/avatars/original/missing.png"
];
var default_profile_image_url = () => "./nounicorn.png";
var social_limiter = (tweets, toots) => { var social_limiter = (tweets, toots) => {
const numberTweets = 20;
let posts = tweets.concat(toots); let posts = tweets.concat(toots);
let byDate = (fst, snd) => Date.parse(fst.time) - Date.parse(snd.time); let byDate = (fst, snd) => Date.parse(fst.time) - Date.parse(snd.time);
let postsSorted = posts.sort(byDate); let postsSorted = posts.sort(byDate);
if (postsSorted.length > 0) { if (postsSorted.length > 0) {
while (postsSorted.length < numberTweets) { while (postsSorted.length < postsLimit) {
postsSorted = postsSorted.concat(postsSorted); postsSorted = postsSorted.concat(postsSorted);
} }
} }
postsSorted = postsSorted.reverse().slice(0, numberTweets); postsSorted = postsSorted.reverse().slice(0, postsLimit);
return postsSorted; return postsSorted;
}; };
var default_profile_image = () => "./nounicorn.png"; var replace_default_image_url = (url) => defaultUrlSet.includes(url) === true ? default_profile_image_url() : url;
var replace_default_image = (url) => {
let newUrl;
if (url === "https://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png" || url === "https://chaos.social/avatars/original/missing.png") {
newUrl = default_profile_image();
} else {
newUrl = url;
}
return newUrl;
};
var tweet_author = (data, tweet) => { var tweet_author = (data, tweet) => {
let authorId = tweet.author_id; let authorId = tweet.author_id;
let users = data.includes.users; let users = data.includes.users;
@ -35,7 +32,7 @@
let authorId = tweet.author_id; let authorId = tweet.author_id;
let users = data.includes.users; let users = data.includes.users;
let author = users.find((item) => item.id === authorId); let author = users.find((item) => item.id === authorId);
let profileImageUrl = replace_default_image(author.profile_image_url); let profileImageUrl = replace_default_image_url(author.profile_image_url);
return profileImageUrl; return profileImageUrl;
}; };
var tweet_text = (tweet) => tweet.text; var tweet_text = (tweet) => tweet.text;
@ -54,7 +51,7 @@
return tweets; return tweets;
}; };
var toot_author = (toot) => toot.account.username; var toot_author = (toot) => toot.account.username;
var toot_profile_image = (toot) => replace_default_image(toot.account.avatar_static); var toot_profile_image = (toot) => replace_default_image_url(toot.account.avatar_static);
var toot_text = (toot) => toot.content; var toot_text = (toot) => toot.content;
var toot_time = (toot) => toot.created_at; var toot_time = (toot) => toot.created_at;
var html_plainify = (html2) => { var html_plainify = (html2) => {
@ -94,24 +91,21 @@
let talksDataSorted = talksData.sort(byDate); let talksDataSorted = talksData.sort(byDate);
return talksDataSorted; return talksDataSorted;
}; };
var future_events = (schedule, datetime) => { var future_events = (schedule, now) => schedule.filter((e) => Date.parse(e.date) >= now - delay);
let scheduleFiltered = schedule.filter((e) => Date.parse(e.date) > datetime); var same_music_track = (track1, track2) => track1.artist === track2.artist && track1.title === track2.title;
return scheduleFiltered;
};
var is_new_music = (musicA, musicB) => { var is_new_music = (musicA, musicB) => {
let isSame; let isNewMusic;
if (musicA.length !== 0 && musicB.length !== 0) { if (musicA.length !== 0 && musicB.length !== 0) {
isSame = musicA[0].artist === musicB[0].artist && musicA[0].title === musicB[0].title; isNewMusic = same_music_track(musicA[0], musicB[0]);
} else if (musicA.length === 0 && musicB.length === 0) { } else if (musicA.length === 0 && musicB.length === 0) {
isSame = true; isNewMusic = true;
} else { } else {
isSame = false; isNewMusic = false;
} }
return !isSame; return !isNewMusic;
}; };
var music_update = (musicA, musicB) => { var music_update = (musicA, musicB) => {
let isNew = is_new_music(musicA, musicB); if (is_new_music(musicA, musicB) === true) {
if (isNew === true) {
musicB.forEach((m) => m.since = Date.now()); musicB.forEach((m) => m.since = Date.now());
} }
return musicB; return musicB;
@ -119,16 +113,38 @@
// ns-hugo:/home/raoul-web/rc3_2021/html-infobeamer-content/assets/js/dom.js // ns-hugo:/home/raoul-web/rc3_2021/html-infobeamer-content/assets/js/dom.js
var html = htm.bind(preact.h); var html = htm.bind(preact.h);
var here_room = "Chaos-West TV"; var hereRoom = "Chaos-West TV";
var number_events_all = 7;
var musicAge = 5 * 1e3; var musicAge = 5 * 1e3;
var urgency = 5 * 60 * 1e3; var urgent = 5 * 60 * 1e3;
var is_own_talk = (talk) => talk.room === here_room; var stale = 3 * 5 * 60 * 1e3;
var lapse = 5 * 1e3;
var talk_day = (talk) => {
const lut = {
1: "I",
2: "II",
3: "III",
4: "IV"
};
return lut[talk.day];
};
var is_own_talk = (talk) => talk.room === hereRoom;
var talk_start_time = (talk) => Date.parse(talk.date);
var is_urgent = (talk, time) => { var is_urgent = (talk, time) => {
let talkStart = Date.parse(talk.date); let timeDelta = talk_start_time(talk) - time;
let timeDelta = talkStart - time; return timeDelta >= 0 && timeDelta <= urgent;
return timeDelta <= urgency; };
var is_stale = (talk, time) => {
let timeDelta = talk_start_time(talk) - time;
return timeDelta < 0;
};
var is_lapse = (talk, time) => {
let timeDelta = talk_start_time(talk) - time;
return timeDelta <= -(stale - lapse);
}; };
var urgent_class = (talk, time) => is_urgent(talk, time) ? "urgent" : ""; var urgent_class = (talk, time) => is_urgent(talk, time) ? "urgent" : "";
var stale_class = (talk, time) => is_stale(talk, time) ? "stale" : "";
var lapse_class = (talk, time) => is_lapse(talk, time) ? "lapse" : "";
var speaker_names = (talk) => talk.persons.map((p) => p.public_name); var speaker_names = (talk) => talk.persons.map((p) => p.public_name);
var speaker_dom = (talk) => { var speaker_dom = (talk) => {
const separator = ", "; const separator = ", ";
@ -142,23 +158,48 @@
} }
return inner; return inner;
}; };
var starting_dom = (talk, time) => {
const hrs3 = 3 * 60 * 60 * 1e3;
const min15 = 3 * 5 * 60 * 1e3;
const min2 = 2 * 60 * 1e3;
const min1 = 60 * 1e3;
let timeDelta = talk_start_time(talk) - time;
let minutes = Math.ceil(Math.abs(timeDelta / 1e3 / 60));
let inner;
if (timeDelta > hrs3) {
inner = html`<span class="start">Day ${talk_day(talk)} at ${talk.start}</span>`;
} else if (timeDelta > min15) {
inner = html`<span class="start">Starting at ${talk.start}</span>`;
} else if (timeDelta <= min15 && timeDelta > min1) {
inner = html`<span class="start">Starting in ${minutes} minutes</span>`;
} else if (timeDelta <= min1 && timeDelta >= 0) {
inner = html`<span class="start">Starting now!</span>`;
} else if (timeDelta < 0 && timeDelta >= -min1) {
inner = html`<span class="start">Just started!</span>`;
} else if (timeDelta < -min1 && timeDelta >= -min15) {
inner = html`<span class="start">Started ${minutes} minutes ago</span>`;
} else if (timeDelta < -min15) {
inner = html`<span class="start">Seriously missed</span>`;
}
return inner;
};
var to_minutes = (duration) => { var to_minutes = (duration) => {
const timeFormat = "hh:mm"; const timeFormat = "hh:mm";
let dt = moment(duration, timeFormat); let dt = moment(duration, timeFormat);
let minutes = 60 * dt.hours() + dt.minutes(); let minutes = 60 * dt.hours() + dt.minutes();
return minutes; return minutes;
}; };
var duration_dom = (duration) => { var duration_dom = (talk) => {
return html`<span class="duration">${to_minutes(duration)} minutes</span>`; return html`<span class="duration">${to_minutes(talk.duration)} minutes</span>`;
}; };
var meta_here_dom = (schedule, time) => { var meta_here_dom = (schedule, time) => {
let inner = html`${schedule.map((talk) => html` let inner = html`${schedule.map((talk) => html`
<div class="talk-here-meta-box ${urgent_class(talk, time)}"> <div class="talk-here-meta-box ${urgent_class(talk, time)} ${stale_class(talk, time)}">
<div class="speaker">${speaker_dom(talk)}</div> <div class="speaker">${speaker_dom(talk)}</div>
<div class="title"><span class="titletext">${talk.title}</span></div> <div class="title"><span class="titletext">${talk.title}</span></div>
<div class="start-duration"> <div class="start-duration">
<span class="start">Starting at ${talk.start}</span> ${starting_dom(talk, time)}
${duration_dom(talk.duration)} ${duration_dom(talk)}
</div> </div>
</div> </div>
`)}`; `)}`;
@ -193,17 +234,8 @@
}); });
return inner; return inner;
}; };
var talk_day = (talk) => {
const lut = {
1: "I",
2: "II",
3: "III",
4: "IV"
};
return lut[talk.day];
};
var talk_day_dom = (talk) => html`<span class="day">Day ${talk_day(talk)}</span>`; var talk_day_dom = (talk) => html`<span class="day">Day ${talk_day(talk)}</span>`;
var highlight_class = (talk) => is_own_talk(talk) === true ? "item-highlight" : ""; var highlight_class = (talk) => is_own_talk(talk) === true ? "highlight" : "";
var do_not_record_dom = (talk) => { var do_not_record_dom = (talk) => {
let icon = "fa-microphone-slash"; let icon = "fa-microphone-slash";
let inner; let inner;
@ -217,7 +249,7 @@
var list_all_dom = (schedule, time) => { var list_all_dom = (schedule, time) => {
let inner = html` let inner = html`
${schedule.map((talk) => html` ${schedule.map((talk) => html`
<div class="item ${highlight_class(talk)} ${urgent_class(talk, time)}"> <div class="item ${highlight_class(talk)} ${urgent_class(talk, time)} ${stale_class(talk, time)} ${lapse_class(talk, time)}">
<div> <div>
<div class="title">${talk.title}</div> <div class="title">${talk.title}</div>
</div> </div>
@ -230,41 +262,71 @@
</div>`)}`; </div>`)}`;
return inner; return inner;
}; };
var next_up_here_dom = (talks, time) => {
let inner;
if (talks.length > 0) {
inner = html`
<div class="panel meta">
<div class="header">Next Up Here</div>
<div class="content">${meta_here_dom(talks, time)}</div>
</div>`;
} else {
inner = html`
<div class="panel meta">
<div class="header">Next Up Here</div>
</div>`;
}
return inner;
};
var next_up_abstract_dom = (talks, time) => {
let inner;
if (talks.length > 0) {
inner = html`
<div class="panel abstract">
<div class="header">Abstract</div>
<div class="content">${abstract_here_dom(talks)}</div>
</div>`;
} else {
inner = html``;
}
return inner;
};
var next_up_list_all_dom = (talks, time) => {
let inner;
if (talks.length > 0) {
inner = html`
<div class="panel list">
<div class="header">Next Up at rC3</div>
<div class="content">${list_all_dom(talks, time)}</div>
</div>`;
} else {
inner = html`
<div class="panel list">
<div class="header">Next Up at rC3</div>
</div>`;
}
return inner;
};
var schedule_dom = (schedule, time) => { var schedule_dom = (schedule, time) => {
const here_number_events = 1; let allTalks = schedule.slice(0, number_events_all);
const all_number_events = 7;
let allTalks = schedule.slice(0, all_number_events);
let nextTalkHere = schedule.filter(is_own_talk).slice(0, 1); let nextTalkHere = schedule.filter(is_own_talk).slice(0, 1);
let nextHereMetaDom = meta_here_dom(nextTalkHere, time); return html`
let nextHereAbstractDom = abstract_here_dom(nextTalkHere);
let nextAllMetaDom = list_all_dom(allTalks, time);
let inner = html`
<div class="slide"> <div class="slide">
<div class="schedule"> <div class="schedule">
<div class="left"> <div class="left">
<div class="panel meta"> ${next_up_here_dom(nextTalkHere, time)}
<div class="header">Next Up Here</div> ${next_up_abstract_dom(nextTalkHere, time)}
<div class="content">${nextHereMetaDom}</div>
</div>
<div class="panel abstract">
<div class="header">Abstract</div>
<div class="content">${nextHereAbstractDom}</div>
</div>
</div> </div>
<div class="right"> <div class="right">
<div class="panel list"> ${next_up_list_all_dom(allTalks, time)}
<div class="header">Next Up at rC3</div>
<div class="content">${nextAllMetaDom}</div>
</div>
</div> </div>
</div> </div>
</div>`; </div>`;
return inner;
}; };
var music_changed = (current, time) => time - current.since <= musicAge; var music_changed = (current, time) => time - current.since <= musicAge;
var changed_music_class = (current, time) => music_changed(current, time) ? "changed" : ""; var changed_music_class = (current, time) => music_changed(current, time) ? "changed" : "";
var music_playing_now_dom = (music, time) => { var music_playing_now_dom = (music, time) => {
let inner = html` return html`
<div class="music-box"> <div class="music-box">
${music.map((current) => html` ${music.map((current) => html`
<div class="music ${changed_music_class(current, time)}"> <div class="music ${changed_music_class(current, time)}">
@ -284,7 +346,6 @@
</div> </div>
</div>`)} </div>`)}
</div>`; </div>`;
return inner;
}; };
var post_time = (date) => moment(date).format("H:mm, D. MMMM YYYY"); var post_time = (date) => moment(date).format("H:mm, D. MMMM YYYY");
var social_network_dom = (post) => { var social_network_dom = (post) => {
@ -338,15 +399,11 @@
let schedule = data.schedule; let schedule = data.schedule;
let music = data.music; let music = data.music;
let postings = data.posts; let postings = data.posts;
let scheduleDom = schedule_dom(schedule, time);
let hashtagDom = hashtag_dom();
let musicDom = music_playing_now_dom(music, time);
let postingsDom = social_container_dom(postings);
let inner = html` let inner = html`
${scheduleDom} ${schedule_dom(schedule, time)}
${hashtagDom} ${hashtag_dom()}
${musicDom} ${music_playing_now_dom(music, time)}
${postingsDom} ${social_container_dom(postings)}
`; `;
const anchorElId = "main"; const anchorElId = "main";
const el = document.getElementById(anchorElId); const el = document.getElementById(anchorElId);
@ -435,10 +492,12 @@
} else { } else {
console.log("Your browser doesn't support web workers."); console.log("Your browser doesn't support web workers.");
} }
var fakeNow = 0;
var fakeTimeDelta = fakeNow - Date.now();
function update_screen() { function update_screen() {
let realTime = new Date(); let realTime = new Date();
console.log("Updating screen at at: " + realTime); console.log("Updating screen at at: " + realTime);
let now = Date.now(); let now = Date.now() + fakeTimeDelta;
console.log("Using 'now': " + now); console.log("Using 'now': " + now);
update_main_slide({ update_main_slide({
schedule: future_events(scheduleData, now), schedule: future_events(scheduleData, now),
@ -448,7 +507,7 @@
} }
function main_loop() { function main_loop() {
update_screen(); update_screen();
setTimeout(main_loop, 10 * 1e3); setTimeout(main_loop, 5 * 1e3);
} }
main_loop(); main_loop();
})(); })();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -5,7 +5,7 @@
<title>rC3 NOWHERE</title> <title>rC3 NOWHERE</title>
<link href=/fork-awesome/css/fork-awesome.min.css rel=stylesheet type=text/css> <link href=/fork-awesome/css/fork-awesome.min.css rel=stylesheet type=text/css>
<link rel=stylesheet href=https://infobeamer.montage2.de/main.min.1a1572716ba819c6a8125645f805d12ca6b6a47e2a1dbce5507702bdd79d9aa5.css> <link rel=stylesheet href=https://infobeamer.montage2.de/main.min.1a1572716ba819c6a8125645f805d12ca6b6a47e2a1dbce5507702bdd79d9aa5.css>
<script src=https://infobeamer.montage2.de/js/config.fa1a162e62b8d5f3f40c8812d30b5289c5792ff26c0843426d8c109a00621389.js integrity="sha256-+hoWLmK41fP0DIgS0wtSicV5L/JsCENCbYwQmgBiE4k="></script> <script src=https://infobeamer.montage2.de/js/config.c3055781f00111fd050e1e5732c9e6dbd2dce21204e90b02975e9983a4c367f7.js integrity="sha256-wwVXgfABEf0FDh5XMsnm29Lc4hIE6QsCl16Zg6TDZ/c="></script>
</head> </head>
<body> <body>
<main id=main> <main id=main>
@ -13,6 +13,6 @@
<script src=https://infobeamer.montage2.de/js/moment/moment.min.73de4254959530e4d1d9bec586379184f96b4953dacf9cd5e5e2bdd7bfeceef7.js integrity="sha256-c95CVJWVMOTR2b7FhjeRhPlrSVPaz5zV5eK917/s7vc="></script> <script src=https://infobeamer.montage2.de/js/moment/moment.min.73de4254959530e4d1d9bec586379184f96b4953dacf9cd5e5e2bdd7bfeceef7.js integrity="sha256-c95CVJWVMOTR2b7FhjeRhPlrSVPaz5zV5eK917/s7vc="></script>
<script src=https://infobeamer.montage2.de/js/preact/preact.min.0c204e20934f1e09cfe86fbcf1d069d842f988fc71efe3a923021c08892c71c8.js integrity="sha256-DCBOIJNPHgnP6G+88dBp2EL5iPxx7+OpIwIcCIksccg="></script> <script src=https://infobeamer.montage2.de/js/preact/preact.min.0c204e20934f1e09cfe86fbcf1d069d842f988fc71efe3a923021c08892c71c8.js integrity="sha256-DCBOIJNPHgnP6G+88dBp2EL5iPxx7+OpIwIcCIksccg="></script>
<script src=https://infobeamer.montage2.de/js/htm/htm.80e39afe20fd61183412eda89efa10532d57945e6364642aceacd50eb2384b4b.js integrity="sha256-gOOa/iD9YRg0Eu2onvoQUy1XlF5jZGQqzqzVDrI4S0s="></script> <script src=https://infobeamer.montage2.de/js/htm/htm.80e39afe20fd61183412eda89efa10532d57945e6364642aceacd50eb2384b4b.js integrity="sha256-gOOa/iD9YRg0Eu2onvoQUy1XlF5jZGQqzqzVDrI4S0s="></script>
<script src=https://infobeamer.montage2.de/main.c6cb62188f7b5dc001704b60fcb1a1b0b38510b5bed7b27311053c13fc63333d.js integrity="sha256-xstiGI97XcABcEtg/LGhsLOFELW+17JzEQU8E/xjMz0=" type=module></script> <script src=https://infobeamer.montage2.de/main.7b9386a5aed538c367cecbb578d8b458be6fcb679fa7b83c00402918b7b123aa.js integrity="sha256-e5OGpa7VOMNnzsu1eNi0WL5vy2efp7g8AEApGLexI6o=" type=module></script>
</body> </body>
</html> </html>