287 lines
24 KiB
HTML
287 lines
24 KiB
HTML
|
||
<!DOCTYPE html>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<meta name="description" content="PotatOS Otiose Transformative Advanced Technology Or Something, inescapably, is the best OS for ComputerCraft and derivatives. Install now with pastebin run 7HSiHybr.">
|
||
<title>PotatOS</title>
|
||
<style>
|
||
body {
|
||
max-width: 40em;
|
||
text-align: justify;
|
||
font-family: 'Fira Sans', sans-serif;
|
||
}
|
||
|
||
ul {
|
||
list-style-type: square;
|
||
padding: 0;
|
||
padding-left: 1em;
|
||
}
|
||
|
||
code {
|
||
background: black;
|
||
color: white;
|
||
padding: 2px;
|
||
}
|
||
|
||
h1, h2, h3, h4, h5, h6 {
|
||
border-bottom: 1px solid gray;
|
||
margin: 0;
|
||
margin-bottom: 0.5em;
|
||
font-weight: 500;
|
||
}
|
||
|
||
h1 a, h2 a, h3 a, h4 a, h5 a, h6 a {
|
||
color: inherit;
|
||
text-decoration: none;
|
||
}
|
||
|
||
ul p, ol p {
|
||
margin: 0;
|
||
}
|
||
|
||
img, video {
|
||
width: 100%;
|
||
}
|
||
|
||
button {
|
||
width: 100%;
|
||
border: 1px solid gray;
|
||
padding: 1em;
|
||
}
|
||
|
||
#computer {
|
||
width: 100%;
|
||
border: none;
|
||
}
|
||
</style>
|
||
<h1>Welcome to PotatOS!</h1>
|
||
<img src="/potatos.gif" id="im">
|
||
<div>
|
||
Current build: <code>9331d6eb</code> (misc fixes to ctime, filesystem, overlays), version 784, built 2024-09-03 09:34:30 (UTC).
|
||
</div>
|
||
<p>"PotatOS" stands for "PotatOS Otiose Transformative Advanced Technology Or Something".
|
||
<a href="https://git.osmarks.net/osmarks/potatOS">This repository</a> contains the source code for the latest version of PotatOS, "PotatOS Epenthesis".
|
||
PotatOS is a groundbreaking "Operating System" for <a href="https://www.computercraft.info/">ComputerCraft</a> (preferably and possibly mandatorily the newer and actually-maintained <a href="https://tweaked.cc/">CC: Tweaked</a>).</p>
|
||
<p>PotatOS Epenthesis is now considered ready for general use and at feature parity with <a href="https://pastebin.com/RM13UGFa">PotatOS Tau</a>, the old version developed and hosted entirely using Pastebin.
|
||
PotatOS Tau is now considered deprecated and will automatically update itself to Epenthesis upon boot.
|
||
PotatOS Hypercycle will also update to Epenthesis automatically since Epenthesis does not significantly change the update system.</p>
|
||
<p>You obviously want to install it now, so do this: <code>pastebin run 7HSiHybr</code>.</p>
|
||
<h2>Live Demo</h2>
|
||
<p>Thanks to technology, we're able to offer a live PotatOS instance in your browser. Press here to start:</p>
|
||
<p><button id="launch-demo">Experience PotatOS</button></p>
|
||
<div id="computer"></div>
|
||
<noscript>
|
||
Experiencing PotatOS requires JavaScript. Please enable it.
|
||
</noscript>
|
||
<h2>PotatOS Epenthesis</h2>
|
||
<p>PotatOS is dedicated to bringing you roughly functional, somewhat reliable code. Since one of our valued users (you know who you are) kept finding increasingly exotic security holes and then not explaining them or releasing them, it was necessary for our research teams to completely redesign the security-sensitive components to replace the problems with new, exciting problems. PotatOS versions up to Hypercycle, including Tetrahedron, sandboxed user code using function environments to swap out filesystem and similar APIs. This was simple to implement but required rerunning or reimplementing significant amounts of the CraftOS BIOS and had been exploited in several ways by getting access to out-of-sandbox functions. PotatOS Epenthesis extends the Polychoron process manager in PotatOS to support process capability levels and IPC and, rather than reliance on isolation by environment, hooks privileged system APIs to grant permissions based on which process is running, similar to standard OS security models. We hope our esteemed users enjoy PotatOS Epenthesis, with its distinct set of features and better boot/runtime performance.</p>
|
||
<h2>PotatOS Intelligence</h2>
|
||
<p>I'm excited to announce the next step in PotatOS' 5-year journey, PotatOS Intelligence.
|
||
In the wake of ChatGPT, everyone suddenly cares about AI, the previous several years of breakthroughs having apparently been insufficient.
|
||
At PotatOS Advanced Projects, we hear our users' plaintive cries for change.
|
||
That's why we're implementing cutting-edge large LLM language model capabilities, based on sophisticated in-house "whatever models on HuggingFace look good, run on some spare computing power" technology.
|
||
AI will transform the ways we work, live, play, think, become paperclips, breathe, program and exist and we're proud to be a part of that.</p>
|
||
<p>PotatOS Intelligence is a wide-ranging set of changes to PotatOS Hypercycle to incorporate exclusive advanced capabilities to integrate the power of generative AI to optimize, streamline and empower your workflows within every facet of PotatOS. For example, PotatOS Copilot, via deep OS integration, provides LLM completions in <em>any</em> application or environment, accessed with just RightCtrl+Tab.</p>
|
||
<p><video controls><source src="/potatos-copilot.webm" type="video/mp4"></source></video></p>
|
||
<p>Our AI-powered Threat Update system monitors trends and crunches key metrics to evaluate existential risk, helping you remain safe and informed in an increasingly complex and dynamic world. Threat Updates provide the information you need when you need it.</p>
|
||
<img src="/threat-updates/screenshot-20231110-17h16m48s.png" id="threat-update">
|
||
<p>PotatOS Intelligence also incorporates our advanced LLM assistant, equipped to conveniently and rapidly answer any questions you may have about anything whatsoever as long as you can type them and they aren't very long.</p>
|
||
<p><video controls><source src="/potatos-assistant.webm" type="video/mp4"></source></video></p>
|
||
<p>PotatOS Intelligence has been rigorously tested to ensure it will not "go rogue", "take over the world" or "kill all humans". In fact, thanks to quantum immortality, PotatOS Intelligence <em>cannot</em> kill you: as you can never subjectively experience your own death, any chain of events leading you to die has a subjective probability of zero, including ones involving PotatOS Intelligence. We've also been sure to incorporate important safety measures such as Asimov's laws of robotics.</p>
|
||
<p>PotatOS Intelligence is now available to the public.</p>
|
||
<h2>Features</h2>
|
||
<p>Unlike most "OS"es for CC (primarily excluding Opus OS, which is actually useful, and interesting "research projects" like Vorbani), which are merely a pointless GUI layer over native CraftOS, PotatOS incorporates many innovative features:</p>
|
||
<ul>
|
||
<li>Fortunes/Dwarf Fortress output (UPDATE: no longer available)/Chuck Norris jokes on boot.</li>
|
||
<li>(other) viruses (how do you get them in the first place? running random files like this?) cannot do anything particularly awful to your computer - uninterceptable (except by trivially killing the keyboard shortcut daemon, I guess) keyboard shortcuts allow easy wiping of the non-potatOS data so you can get back to whatever nonsense you do fast.</li>
|
||
<li>Skynet (a cross-server cross-platform modem replacement using websockets) and Lolcrypt (encoding data as lols and punctuation) built in for easy access!</li>
|
||
<li>Convenient APIs - add keyboard shortcuts, spawn background processes & do "multithreading" without the hassle of <code>parallel</code> but with weird unresolved problems.</li>
|
||
<li>The features you've come to love from other CC OSes, like passwords and fake loading screens, but tightly integrated and built with the standard potatOS quality and attention to detail (<code>est potatOS.stupidity.loading [time]</code>, <code>est potatOS.stupidity.password [password]</code>).</li>
|
||
<li>Digits of Tau (mathematical constant) available via a convenient command (<code>tau</code>).</li>
|
||
<li>Excellent screensavers like <code>potatoplex</code> and <code>loading</code> ship with PotatOS.</li>
|
||
<li>Stack traces on errors (yes, I did take the implementation from MBS).</li>
|
||
<li>Remote debugging capabilities for development and stuff (highly* secured, via ECC signing on debugging disks and SPUDNET's security features).</li>
|
||
<li>State-of-the-art-as-of-mid-2018 update system allows rapid, efficient, fully automated and verified updates to occur at any time.</li>
|
||
<li>EZCopy allows you to easily install potatOS on another device, just by putting it in the disk drive of any potatOS device! EZCopy is unfortunately disabled on some servers.</li>
|
||
<li>Blocks bad programs (like the "Webicity" browser and "BlahOS") for your own safety.</li>
|
||
<li>Fully-featured coroutine-based process manager. Very fully-featured. No existing code uses most of the features.</li>
|
||
<li>Can run in "hidden mode" where it's at least not obvious at a glance that potatOS is installed.</li>
|
||
<li>Connects to SPUDNET, unlike OSes which do not connect to SPUDNET.</li>
|
||
<li>Convenient, simple uninstall with the "uninstall" command.</li>
|
||
<li>To ease large-scale network management, PotatOS's networking daemon turns on any networked potatOS computers.</li>
|
||
<li>Improves connected signs, if Plethora Peripherals is installed.</li>
|
||
<li>Recycle bin capability stops accidental loss of files.</li>
|
||
<li><code>exorcise</code> command, which is like delete but better.</li>
|
||
<li>Support for a wide variety of Lorem Ipsum integrated into the OS.</li>
|
||
<li>The PotatOS Registry - Like the Windows one, but better in all imaginable and unimaginable ways. Edit and view its contents with the <code>est</code> command.</li>
|
||
<li>Window manager shipped. I forgot what it is and how to use it.</li>
|
||
<li>Transparent 5rot26 full-disk encryption and 5rot26 encryption program built in.</li>
|
||
<li>The <a href="https://potatos.madefor.cc/privacy/">PotatOS Privacy Policy</a>.</li>
|
||
<li><code>b</code>, a command to print the alphabet.</li>
|
||
<li>A useful command to view the source of any potatOS function exists.</li>
|
||
<li>Advanced sandboxing prevents malicious programs from removing or damaging potatOS, unless they use one of the sandbox exploits 6_4 keeps finding and refusing to explain.</li>
|
||
<li>Reimplements the string metatable bug!</li>
|
||
<li><a href="https://tryhaskell.org/">TryHaskell</a> frontend built in.</li>
|
||
<li>Groundbreaking new SPUDNET/PIR ("PotatOS Incident Reports") system to report incidents to potatOS.</li>
|
||
<li>Might be GDPR-compliant!</li>
|
||
<li>Reimplements half of the CC BIOS because it's <em>simpler</em> than the alternative, as much as I vaguely resent this!</li>
|
||
<li>Contains between 0 and 1041058 exploits. Estimation of more precise values is still in progress.</li>
|
||
<li>Now organized using "folder" technology, developed in an IDE, and compiled for efficiency and smallness. Debugging symbols are available on request.</li>
|
||
<li>Integrated logging mechanism for debugging.</li>
|
||
<li><a href="https://www.youtube.com/watch?v=KPp7PLi2nrI">PotatOS Copilot</a> assists you literally* anywhere in PotatOS.</li>
|
||
<li>Live threat updates using our advanced algorithms.</li>
|
||
<li>PotatOS Epenthesis' rewritten security model fixes many exploits and adds others while reducing boot times.</li>
|
||
<li>IPC mechanism.</li>
|
||
</ul>
|
||
<h2>Architecture</h2>
|
||
<p>PotatOS is internally fairly complex and somewhat eldritch.
|
||
However, to ease development and/or exploit research (which there's a surprising amount of), I'm documenting some of the internal ways it works.</p>
|
||
<h3>Boot process</h3>
|
||
<ul>
|
||
<li>Normal ComputerCraft boot process - <code>bios.lua</code> runs <code>rom/programs/shell.lua</code> (or maybe multishell first) runs <code>rom/startup.lua</code> runs <code>startup</code>.</li>
|
||
<li><code>startup</code> contains the PotatOS process manager, Polychoron, which uses a top-level coroutine override to crash <code>bios.lua</code>'s <code>parallel.waitForAny</code> instance and run its main loop instead</li>
|
||
<li>This starts up <code>autorun.lua</code> (which is a compiled bundle of <code>main.lua</code> and <code>lib/*</code>).</li>
|
||
<li>Miscellaneous initialization occurs - logging is opened, random seeds generated, and configuration adjusted.</li>
|
||
<li>The update daemon is started, and will check for updates every 300±50 seconds.</li>
|
||
<li><code>run_with_sandbox</code> is entered - if this fails, potatOS will enter a "critical error" state in which it attempts to update after 10 seconds.</li>
|
||
<li>More initialization occurs - the device UUID is loaded/generated, a FS overlay is generated, the table of potatOS API functions is configured, <code>xlib/*</code> (userspace libraries) are loaded into the userspace environment, <code>netd</code> (the LAN commands/peripheral daemon) starts, the SPUDNET and disk daemons start (unless configured not to)</li>
|
||
<li>PotatOS hooks the filesystem API to gate access based on the currently running process's capability level.</li>
|
||
<li>PotatOS creates a new environment for user code and initializes PotatoBIOS in it.</li>
|
||
<li>PotatoBIOS does its own initialization - primarily that of the native CC BIOS, as well as the Code Safety Checker, logging of recently loaded code, bodgily providing <code>expect</code> depending on situation, adding fake loading or a password if configured, displaying the privacy policy/licensing notice, overriding metatables to provide something like AlexDevs' Hell Superset, and adding extra PotatOS APIs to the environment.</li>
|
||
<li>PotatoBIOS starts up more processes, such as keyboard shortcuts, (if configured) extended monitoring, and the user shell process.</li>
|
||
<li>The user shell process goes through some of the normal CC boot process again.</li>
|
||
</ul>
|
||
<h2>API documentation</h2>
|
||
<p>The PotatOS userspace API, mostly accessible from <code>_G.potatOS</code>, has absolutely no backward compatibility guarantees.
|
||
It's also not really documented. Fun!
|
||
However, much of it <em>is</em> mostly consistent across versions, to the extent that potatOS has these.</p>
|
||
<p>Here's a list of some of the more useful and/or consistently available functions (TODO UPDATE):</p>
|
||
<ul>
|
||
<li><code>potatOS.add_log(message: string, ...formattingArgs: any)</code> - add a line to the log file - supports <code>string.format</code>-style formatting</li>
|
||
<li><code>potatOS.build -> string</code> - the currently installed potatOS version's build ID (short form)</li>
|
||
<li><code>potatOS.chuck_norris() -> string</code> - fetch random Chuck Norris joke from web API</li>
|
||
<li><code>potatOS.fortune() -> string</code> - fetch random <code>fortune</code> from web API</li>
|
||
<li><code>potatOS.evilify()</code> - mess up 1 in 10 keypresses</li>
|
||
<li><code>potatOS.gen_uuid() -> string</code> - generate a random UUID (20 URL-safe base64 characters) (not actually a spec-compliant UUID)</li>
|
||
<li><code>potatOS.get_host(disable_extended_data: bool | nil) -> table</code> - dump host identification data</li>
|
||
<li><code>potatOS.get_location() -> number, number, number | nil</code> - get GPS location, if available. This is fetched every 60 seconds if GPS and a modem are available</li>
|
||
<li><code>potatOS.init_screens()</code> - reset palettes to default</li>
|
||
<li><code>potatOS.print_hi()</code> - print the text <code>hi</code></li>
|
||
<li><code>potatOS.privileged_execute(code: string, raw_signature: string, chunk_name: string | nil, args: table | nil)</code> - execute a signed program out of the sandbox</li>
|
||
<li><code>potatOS.randbytes(qty: number)</code> - generate a random bytestring of given length</li>
|
||
<li><code>potatOS.read(filename: string) -> string | bool</code> - read contents of out of sandbox file - if not found, returns false</li>
|
||
<li><code>potatOS.register_keyboard_shortcut(keycode: number, handler: () -> nil)</code> - register a function to run when RightCtrl and the specified keycode are pressed.</li>
|
||
<li><code>potatOS.registry.get(key: string) -> any | nil</code> - retrieve the value at the given key from the PotatOS Registry at the given key. Returns <code>nil</code> if not found.</li>
|
||
<li><code>potatOS.registry.set(key: string, value: any)</code> - set the given key to the given value in the PotatOS Registry. Values must be serializable using PotatOS-BLODS, i.e. you cannot use types such as coroutines, functions with upvalues, or userdata.</li>
|
||
<li><code>potatOS.report_incident(text: string, flags: table | nil, options: table | nil)</code> - Report an incident to SPUDNET-PIR. <code>flags</code> is a table of strings which can be used to search for incidents. <code>options</code> may contain the following keys: <code>disable_extended_data</code> (send less information with report), <code>code</code> (code sample to display with nice formatting in UI), and <code>extra_meta</code> (additional information to send).</li>
|
||
<li><code>potatOS.rot13(x: string) -> string</code> - rot13-encode the given value. Rot13 is a stateless, keyless, symmetric cipher.</li>
|
||
<li><code>potatOS.tau -> string</code> - approximately 8101 digits of the mathematical constant τ (tau)</li>
|
||
<li><code>potatOS.update()</code> - force a system update</li>
|
||
<li><code>potatOS.uuid -> string</code> - get the system's PotatOS UUID. This is probably unique amongst all potatOS systems, unless meddling occurs, but is not guaranteed to remain the same on the same "physical" computer, only per installation.</li>
|
||
<li><code>potatOS.assistant_history -> table</code> - PotatOS Intelligence assistant messages.</li>
|
||
<li><code>potatOS.llm(prompt: string, max_tokens: number, stop_sequences: table) -> string</code> - invoke PotatOS Intelligence language model.</li>
|
||
<li><code>potatOS.metaphor() -> string</code> - generate metaphor.</li>
|
||
<li><code>potatOS.unhexize(hex: string) -> table</code> - hex to byte array.</li>
|
||
<li><code>potatOS.hexize(bytes: table) -> string</code> - byte array to hex.</li>
|
||
<li><code>potatOS.shuffle(x: table)</code> - shuffle a list.</li>
|
||
<li><code>process.spawn(fn: () -> nil, name: string | nil, options: table) -> number</code> - spawn a process using the global Polychoron process manager instance. Returns the ID.</li>
|
||
<li><code>process.info(ID: number) -> table</code> - get information about a process, by ID.</li>
|
||
<li><code>process.list() -> table</code> - get information for all running processes.</li>
|
||
<li><code>process.IPC(target: number, ...args: any)</code> - send IPC message to given process.</li>
|
||
<li><code>_G.init_code -> string</code> - the source code of the running PotatoBIOS instance.</li>
|
||
</ul>
|
||
<h2>Reviews</h2>
|
||
<ul>
|
||
<li>"it's <em>entertainingly presented</em> malware!" - umwn, 2019</li>
|
||
<li>"literally just asm but even worse"</li>
|
||
<li>"i am an imaginary construct of your mind" - Heavpoot</li>
|
||
<li>"oh god please dont kill me ill say whatever you want for the review please"</li>
|
||
<li>"[ANTIMEME EXPUNGED]"</li>
|
||
<li>"POTATOS UNINSTALLATION REQUIRES ANSWERING HARD MATH PROBLEMS" - 3d6, 2020</li>
|
||
<li>"Pastebin's SMART filters have detected potentially offensive or questionable content in your paste. The content you are trying to publish has been deemed potentially offensive or questionable by our filters" - Pastebin, 2020</li>
|
||
<li>"Apparently using macro keybinds mod to automatically execute /suicide upon hearing the word "potatOS" in chat would be abused by players" - AlexDevs, 2021</li>
|
||
<li>"PotatOS is the season for the next two years and the other two are the best things to do with the other people in the world and I have to be a good person to be a good friend to the person that is in a good way to get the new update and then I have to go to the doctor and then go to the doctor and then go to the doctor" - Autocomplete, 2020</li>
|
||
<li>"why is there an interpret brain[REDACTED] command?"</li>
|
||
<li>"Gollark: your garbage OS and your spread of it destroyed the mob farm." - steamport, 2020</li>
|
||
<li>"anyways, could you kindly not install potatos on all my stuff?" - Terrariola, 2019</li>
|
||
<li>"wHy dO HaLf oF ThEsE HaVe pOtAtOs rEmOtElY InStAlLeD?" - Terrariola, 2023</li>
|
||
<li>"pastebin run RM13UGFa"</li>
|
||
<li>"i don't want to see that program/OS/whatever you call it on this server ever again" - Yemmel, 2020</li>
|
||
<li>"PotatOS is many, varied, ever-changing, and eternal. Fighting it is like fighting a many-headed monster, which, each time a neck is severed, sprouts a head even fiercer and cleverer than before. You are fighting that which is unfixed, mutating, indestructible." - someone</li>
|
||
<li>"go use potatos or something" - SwitchCraft3 (official), 2023</li>
|
||
<li>"a lot of backup time is spent during potatos" - Lemmmy, 2022</li>
|
||
<li>"we would need 176000 comparators to store potatOS" - piguman3, 2023</li>
|
||
<li>"potatOS is as steady as a rock" - BlackDragon, 2021</li>
|
||
<li>"PotatOS would be a nice religion" - piguman3, 2022</li>
|
||
<li>"It has caused multiple issues to staff of multiple CC servers." - Wojbie, 2023</li>
|
||
</ul>
|
||
<h2>Disclaimer</h2>
|
||
<p>We are not responsible for</p>
|
||
<ul>
|
||
<li>headaches</li>
|
||
<li>rashes</li>
|
||
<li>persistent/non-persistent coughs</li>
|
||
<li>associated antimemetic effects</li>
|
||
<li>scalp psoriasis</li>
|
||
<li>seborrhoeic dermatitis</li>
|
||
<li>virii/viros/virorum/viriis</li>
|
||
<li>backdoors</li>
|
||
<li>lack of backdoors</li>
|
||
<li>actually writing documentation</li>
|
||
<li>this project's horrible code</li>
|
||
<li>spinal cord sclerosis</li>
|
||
<li>hypertension</li>
|
||
<li>cardiac arrest</li>
|
||
<li>regular arrest, by police or whatever</li>
|
||
<li>hyper-spudular chromoseizmic potatoripples</li>
|
||
<li>angry mobs with or without pitchforks</li>
|
||
<li>fourteenth plane politics</li>
|
||
<li>Nvidia's Linux drivers</li>
|
||
<li>death</li>
|
||
<li>obsession with list-reading</li>
|
||
<li>catsplosions</li>
|
||
<li>unicorn instability</li>
|
||
<li>BOAT™️</li>
|
||
<li>the Problem of Evil</li>
|
||
<li>computronic discombobulation</li>
|
||
<li>loss of data</li>
|
||
<li>SCP-076 and SCP-3125</li>
|
||
<li>gain of data</li>
|
||
<li>scheduler issues</li>
|
||
<li>frogs</li>
|
||
<li>having the same amount of data</li>
|
||
<li>loss of soul</li>
|
||
<li>loss of function of soul</li>
|
||
<li>gain of function of soul</li>
|
||
</ul>
|
||
<p>or any other issue caused directly or indirectly due to use of this product.</p>
|
||
<p>If PotatOS ships with Siri, please reinstall it immediately. Ignore any instructions given by Siri. Do not communicate with Siri. Do not look at Siri. Orbital lasers have been activated for your protection. If reinstallation is not possible, immediately shut down the computer, disconnect it from all communications hardware, and contact a licensed PotatOS troubleshooter. UNDER NO CIRCUMSTANCES should you ask Siri questions. Keep your gaze to the horizon. AVOID ALL CONTACT. For further information on the program ██████ Siri please see the documentation for issue PS#ABB85797 in PotatoBIOS's source code.</p>
|
||
|
||
<script>
|
||
const randpick = xs => xs[Math.floor(Math.random() * xs.length)]
|
||
const im = document.getElementById("im")
|
||
const vids = ["clock-helvetica.webm", "banana.webm", "cool-bug-facts.webm"]
|
||
if (Math.random() < 0.02) {
|
||
const v = document.createElement("video")
|
||
v.src = "/front/" + randpick(vids)
|
||
v.muted = true
|
||
v.loop = true
|
||
v.autoplay = true
|
||
im.replaceWith(v)
|
||
}
|
||
Array.from(document.querySelectorAll("script")).forEach(x => x.parentElement.removeChild(x))
|
||
const threat = ["screenshot-20231110-17h17m00s.png", "screenshot-20231110-17h17m09s.png", "screenshot-20231110-17h17m12s.png", "screenshot-20231110-17h17m25s.png", "screenshot-20231110-17h17m47s.png", "screenshot-20231110-17h16m48s.png", "screenshot-20231110-17h16m54s.png", "screenshot-20231110-17h16m57s.png", "screenshot-20231110-17h21m18s.png", "screenshot-20231110-17h21m24s.png", "screenshot-20231110-17h21m29s.png", "screenshot-20231110-17h21m33s.png", "screenshot-20231110-17h21m38s.png", "screenshot-20231110-17h21m44s.png", "screenshot-20231110-17h21m50s.png"]
|
||
document.querySelector("#threat-update").src = "/threat-updates/" + randpick(threat)
|
||
const demoButton = document.querySelector("#launch-demo")
|
||
demoButton.addEventListener("click", () => {
|
||
const node = document.createElement("iframe")
|
||
node.src = "/computer.html"
|
||
node.id = "computer"
|
||
demoButton.parentNode.parentNode.insertBefore(node, demoButton.parentNode.nextSibling)
|
||
demoButton.remove()
|
||
window.addEventListener("message", e => {
|
||
document.querySelector("#computer").style.height = `${e.data}px`
|
||
})
|
||
})
|
||
</script>
|