PageSourceSearch

https://mavrxlab.org/team/

html mavrxlab.org collected 2026-10-06 13:17:26 UTC 26,376 bytes, 758 lines download raw bytes

1<!DOCTYPE html>
2<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
3
4<meta charset="utf-8">
5<meta name="generator" content="quarto-1.6.40">
6
7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
8
9
10<title>Team – MA{VR}X Lab</title>
11<style>
12code{white-space: pre-wrap;}
13span.smallcaps{font-variant: small-caps;}
14div.columns{display: flex; gap: min(4vw, 1.5em);}
15div.column{flex: auto; overflow-x: auto;}
16div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
17ul.task-list{list-style: none;}
18ul.task-list li input[type="checkbox"] {
19  width: 0.8em;
20  margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ 
21  vertical-align: middle;
22}
23</style>
24
25
26<script src="../site_libs/quarto-nav/quarto-nav.js"></script>
vendor: 1 bytes, line 26
26
27<script src="../site_libs/quarto-nav/headroom.min.js"></script>
vendor: 1 bytes, line 27
27
28<script src="../site_libs/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 28
28
29<script src="../site_libs/quarto-search/autocomplete.umd.js"></script>
vendor: 1 bytes, line 29
29
30<script src="../site_libs/quarto-search/fuse.min.js"></script>
vendor: 1 bytes, line 30
30
31<script src="../site_libs/quarto-search/quarto-search.js"></script>
31
32<meta name="quarto:offset" content="../">
33<script src="../site_libs/quarto-html/quarto.js"></script>
vendor: 1 bytes, line 33
33
34<script src="../site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 34
34
35<script src="../site_libs/quarto-html/tippy.umd.min.js"></script>
vendor: 1 bytes, line 35
35
36<script src="../site_libs/quarto-html/anchor.min.js"></script>
36
37<link href="../site_libs/quarto-html/tippy.css" rel="stylesheet">
38<link href="../site_libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css" rel="stylesheet" id="quarto-text-highlighting-styles">
39<script src="../site_libs/bootstrap/bootstrap.min.js"></script>
39
40<link href="../site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
41<link href="../site_libs/bootstrap/bootstrap-d83fba8907f73068b64e07941be842b2.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light">
42<link href="../site_libs/quarto-contrib/fontawesome6-0.1.0/all.css" rel="stylesheet">
43<link href="../site_libs/quarto-contrib/fontawesome6-0.1.0/latex-fontsize.css" rel="stylesheet">
44<script id="quarto-search-options" type="application/json">{
45  "location": "navbar",
46  "copy-button": false,
47  "collapse-after": 3,
48  "panel-placement": "end",
49  "type": "overlay",
50  "limit": 50,
51  "keyboard-shortcut": [
52    "f",
53    "/",
54    "s"
55  ],
56  "show-item-context": false,
57  "language": {
58    "search-no-results-text": "No results",
59    "search-matching-documents-text": "matching documents",
60    "search-copy-link-title": "Copy link to search",
61    "search-hide-matches-text": "Hide additional matches",
62    "search-more-match-text": "more match in this document",
63    "search-more-matches-text": "more matches in this document",
64    "search-clear-button-title": "Clear",
65    "search-text-placeholder": "",
66    "search-detached-cancel-button-title": "Cancel",
67    "search-submit-button-title": "Submit",
68    "search-label": "Search"
69  }
70}</script>
70
71<!-- Proxima Nova reference. -->
72<link href="https://use.typekit.net/emv3zbo.css" rel="stylesheet" crossorigin="anonymous">
73<!-- Arizona Bootstrap reference. -->
74<link rel="stylesheet" href="https://cdn.digital.arizona.edu/lib/arizona-bootstrap/2.0.19/css/arizona-bootstrap.min.css" crossorigin="anonymous">
75
76
77<link rel="stylesheet" href="../styles.css">
78<meta property="og:title" content="Team – MA{VR}X Lab">
79<meta property="og:description" content="Official site for the University of Arizona’s MA{VR}X Lab">
80<meta property="og:image" content="https://mavrxlab.org/team/images/director.jpg">
81<meta property="og:site_name" content="MA{VR}X Lab">
82</head>
83
84<body class="nav-fixed">
85
86<div id="quarto-search-results"></div>
87  <header id="quarto-header" class="headroom fixed-top quarto-banner">
88    <nav class="navbar navbar-expand-lg " data-bs-theme="dark">
89      <div class="navbar-container container-fluid">
90      <div class="navbar-brand-container mx-auto">
91    <a class='navbar-brand navbar-brand-logo' href='/'>
92    <img src="../assets/images/big-banner-white.png" alt="MA{VR}X Lab" class="navbar-logo">
93    </a>
94  </div>
95            <div id="quarto-search" class="" title="Search"></div>
96          <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" role="menu" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }">
97  <span class="navbar-toggler-icon"></span>
98</button>
99          <div class="collapse navbar-collapse" id="navbarCollapse">
100            <ul class="navbar-nav navbar-nav-scroll me-auto">
101  <li class="nav-item">
102    <a class='nav-link' href='/'> 
103<span class="menu-text">Home</span></a>
104  </li>  
105  <li class="nav-item">
106    <a class="nav-link" href="../about/"> 
107<span class="menu-text">About</span></a>
108  </li>  
109  <li class="nav-item">
110    <a class='nav-link' href='/news'> 
111<span class="menu-text">News</span></a>
112  </li>  
113  <li class="nav-item">
114    <a class='nav-link' href='/projects'> 
115<span class="menu-text">Projects</span></a>
116  </li>  
117  <li class="nav-item">
118    <a class="nav-link" href="../team/"> 
119<span class="menu-text">Team</span></a>
120  </li>  
121  <li class="nav-item">
122    <a class="nav-link" href="../resources/"> 
123<span class="menu-text">Resources</span></a>
124  </li>  
125</ul>
126            <ul class="navbar-nav navbar-nav-scroll ms-auto">
127  <li class="nav-item compact">
128    <a class="nav-link" href="../index.xml"> <i class="bi bi-rss" role="img">
129</i> 
130<span class="menu-text"></span></a>
131  </li>  
132</ul>
133          </div> <!-- /navcollapse -->
134            <div class="quarto-navbar-tools">
135</div>
136      </div> <!-- /container-fluid -->
137    </nav>
138</header>
139<!-- content -->
140<header id="title-block-header" class="quarto-title-block default page-columns page-full">
141  <div class="quarto-title-banner page-columns page-full">
142    <div class="quarto-title column-page">
143      <h1 class="title">Team</h1>
144                      </div>
145  </div>
146    
147  
148  <div class="quarto-title-meta column-page">
149
150      
151    
152      
153    </div>
154    
155  
156  </header><div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-full page-navbar">
157<!-- sidebar -->
158<!-- margin-sidebar -->
159    
160<!-- main -->
161<main class="content quarto-banner-title-block column-page" id="quarto-document-content">
162
163
164
165
166
167<!--# Use to crop: https://www.adobe.com/express/feature/image/crop -->
168<center>
169<p><img src="images/director.jpg" class="img-fluid"></p>
170<section id="director-principal-investigator" class="level3">
171<h3 class="anchored" data-anchor-id="director-principal-investigator">Director &amp; Principal Investigator</h3>
172<p>Ryan Straight, Ph.D<br>
173Honors &amp; Assistant Professor<br>
174Cyber, Intel, &amp; Information Operations<br>
175</p>
176</section></center>
177
178<section id="graduate-students" class="level3">
179<h3 class="anchored" data-anchor-id="graduate-students">Graduate Students</h3>
180<!--# Grad students -->
181<center>
182<div class="grid">
183<div class="g-col-3">
184<p><img src="images/christian.png" class="img-fluid"></p>
185<p><strong>Christian Stuart</strong><br>
186Cyber &amp; Intel Operations<br>
187Graduate Researcher<br>
188</p>
189</div>
190</div>
191</center>
192<!--# Undergrads -->
193</section>
194<section id="undergraduate-students" class="level3">
195<h3 class="anchored" data-anchor-id="undergraduate-students">Undergraduate Students</h3>
196<center>
197<div class="grid">
198<div class="g-col-3">
199<p><img src="images/waamene.png" class="img-fluid"></p>
200<p><strong>Waamene Yowika</strong><br>
201Cyber Operations<br>
202Undergraduate Researcher<br>
203</p>
204</div>
205<div class="g-col-3">
206<p><img src="images/david.png" class="img-fluid"></p>
207<p><strong>David Poehlman</strong><br>
208Cyber Operations<br>
209Lab Volunteer<br>
210</p>
211</div>
212<!-- ::: g-col-3 -->
213<!-- ![](images/wildcat.png) -->
214<!-- **Aaron Beck**\ -->
215<!-- Cyber Operations\ -->
216<!-- ::: -->
217</div>
218</center>
219<!--# Collaborators -->
220</section>
221<section id="collaborators" class="level3">
222<h3 class="anchored" data-anchor-id="collaborators">Collaborators</h3>
223<center>
224<div class="grid">
225<div class="g-col-3">
226<p><img src="images/saldana.png" class="img-fluid"></p>
227<p>Diana Saldana, Ph.D<br>
228Assistant Professor of Practice<br>
229Software Engineering<br>
230College of Engineering<br>
231</p>
232</div>
233<!--# Brian, when he gets here
234
235::: g-col-3
236![]()
237
238Brian Yecies, Ph.D\
239Associate Professor\
240University of Wollongong\
241:::
242
243-->
244<div class="g-col-3">
245<p><img src="images/ariella.png" class="img-fluid"></p>
246<p>Ariella McGeachy<br>
247Administrative Assistant<br>
248Cyber, Intelligence, and Information Operations (CIIO)<br>
249College of Applied Science and Technology<br>
250</p>
251</div>
252</div>
253</center>
254<!--# Student section -->
255</section>
256<section id="alumni" class="level3">
257<h3 class="anchored" data-anchor-id="alumni">Alumni</h3>
258<p>Those who have survived their time in the lab.</p>
259<div class="grid">
260<div class="g-col-3">
261<p><img src="images/nikki.png" class="img-fluid"></p>
262<p><strong>Nikki Diguardi</strong><br>
263Software Development<br>
264Undergraduate Researcher<br>
265</p>
266</div>
267<div class="g-col-3">
268<p><img src="images/anthony-s.png" class="img-fluid"></p>
269<p><strong>Anthony Somohano</strong><br>
270Pre-Business<br>
271Undergraduate Researcher<br>
272</p>
273</div>
274<div class="g-col-3">
275<p><img src="images/jacob.png" class="img-fluid"></p>
276<p><strong>Jacob Keroack</strong><br>
277Neuroscience and Cognitive Science<br>
278Undergraduate Researcher<br>
279</p>
280</div>
281<div class="g-col-3">
282<p><img src="images/anthony.png" class="img-fluid"></p>
283<p>Anthony Vega<br>
284Applied Computing<br>
285(2022)<br>
286</p>
287</div>
288<div class="g-col-3">
289<p><img src="images/tyler.jpg" class="img-fluid"></p>
290<p>Tyler Rhea<br>
291Applied Computing<br>
292(2022)<br>
293</p>
294</div>
295<!--# Template
296::: g-col-3
297![]()
298
299Student's name\
300Program\
301Title\
302:::
303-->
304</div>
305
306
307</section>
308
309</main> <!-- /main -->
310<script id="quarto-html-after-body" type="application/javascript">
311window.document.addEventListener("DOMContentLoaded", function (event) {
312  const toggleBodyColorMode = (bsSheetEl) => {
313    const mode = bsSheetEl.getAttribute("data-mode");
314    const bodyEl = window.document.querySelector("body");
315    if (mode === "dark") {
316      bodyEl.classList.add("quarto-dark");
317      bodyEl.classList.remove("quarto-light");
318    } else {
319      bodyEl.classList.add("quarto-light");
320      bodyEl.classList.remove("quarto-dark");
321    }
322  }
323  const toggleBodyColorPrimary = () => {
324    const bsSheetEl = window.document.querySelector("link#quarto-bootstrap");
325    if (bsSheetEl) {
326      toggleBodyColorMode(bsSheetEl);
327    }
328  }
329  toggleBodyColorPrimary();  
330  const icon = "";
331  const anchorJS = new window.AnchorJS();
332  anchorJS.options = {
333    placement: 'right',
334    icon: icon
335  };
336  anchorJS.add('.anchored');
337  const isCodeAnnotation = (el) => {
338    for (const clz of el.classList) {
339      if (clz.startsWith('code-annotation-')) {                     
340        return true;
341      }
342    }
343    return false;
344  }
345  const onCopySuccess = function(e) {
346    // button target
347    const button = e.trigger;
348    // don't keep focus
349    button.blur();
350    // flash "checked"
351    button.classList.add('code-copy-button-checked');
352    var currentTitle = button.getAttribute("title");
353    button.setAttribute("title", "Copied!");
354    let tooltip;
355    if (window.bootstrap) {
356      button.setAttribute("data-bs-toggle", "tooltip");
357      button.setAttribute("data-bs-placement", "left");
358      button.setAttribute("data-bs-title", "Copied!");
359      tooltip = new bootstrap.Tooltip(button, 
360        { trigger: "manual", 
361          customClass: "code-copy-button-tooltip",
362          offset: [0, -8]});
363      tooltip.show();    
364    }
365    setTimeout(function() {
366      if (tooltip) {
367        tooltip.hide();
368        button.removeAttribute("data-bs-title");
369        button.removeAttribute("data-bs-toggle");
370        button.removeAttribute("data-bs-placement");
371      }
372      button.setAttribute("title", currentTitle);
373      button.classList.remove('code-copy-button-checked');
374    }, 1000);
375    // clear code selection
376    e.clearSelection();
377  }
378  const getTextToCopy = function(trigger) {
379      const codeEl = trigger.previousElementSibling.cloneNode(true);
380      for (const childEl of codeEl.children) {
381        if (isCodeAnnotation(childEl)) {
382          childEl.remove();
383        }
384      }
385      return codeEl.innerText;
386  }
387  const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
388    text: getTextToCopy
389  });
390  clipboard.on('success', onCopySuccess);
391  if (window.document.getElementById('quarto-embedded-source-code-modal')) {
392    const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
393      text: getTextToCopy,
394      container: window.document.getElementById('quarto-embedded-source-code-modal')
395    });
396    clipboardModal.on('success', onCopySuccess);
397  }
398    var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
399    var mailtoRegex = new RegExp(/^mailto:/);
400      var filterRegex = new RegExp("https:\/\/mavrxlab\.org");
401    var isInternal = (href) => {
402        return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
403    }
404    // Inspect non-navigation links and adorn them if external
405 	var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool):not(.about-link)');
406    for (var i=0; i<links.length; i++) {
407      const link = links[i];
408      if (!isInternal(link.href)) {
409        // undo the damage that might have been done by quarto-nav.js in the case of
410        // links that we want to consider external
411        if (link.dataset.originalHref !== undefined) {
412          link.href = link.dataset.originalHref;
413        }
414      }
415    }
416  function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
417    const config = {
418      allowHTML: true,
419      maxWidth: 500,
420      delay: 100,
421      arrow: false,
422      appendTo: function(el) {
423          return el.parentElement;
424      },
425      interactive: true,
426      interactiveBorder: 10,
427      theme: 'quarto',
428      placement: 'bottom-start',
429    };
430    if (contentFn) {
431      config.content = contentFn;
432    }
433    if (onTriggerFn) {
434      config.onTrigger = onTriggerFn;
435    }
436    if (onUntriggerFn) {
437      config.onUntrigger = onUntriggerFn;
438    }
439    window.tippy(el, config); 
440  }
441  const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
442  for (var i=0; i<noterefs.length; i++) {
443    const ref = noterefs[i];
444    tippyHover(ref, function() {
445      // use id or data attribute instead here
446      let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
447      try { href = new URL(href).hash; } catch {}
448      const id = href.replace(/^#\/?/, "");
449      const note = window.document.getElementById(id);
450      if (note) {
451        return note.innerHTML;
452      } else {
453        return "";
454      }
455    });
456  }
457  const xrefs = window.document.querySelectorAll('a.quarto-xref');
458  const processXRef = (id, note) => {
459    // Strip column container classes
460    const stripColumnClz = (el) => {
461      el.classList.remove("page-full", "page-columns");
462      if (el.children) {
463        for (const child of el.children) {
464          stripColumnClz(child);
465        }
466      }
467    }
468    stripColumnClz(note)
469    if (id === null || id.startsWith('sec-')) {
470      // Special case sections, only their first couple elements
471      const container = document.createElement("div");
472      if (note.children && note.children.length > 2) {
473        container.appendChild(note.children[0].cloneNode(true));
474        for (let i = 1; i < note.children.length; i++) {
475          const child = note.children[i];
476          if (child.tagName === "P" && child.innerText === "") {
477            continue;
478          } else {
479            container.appendChild(child.cloneNode(true));
480            break;
481          }
482        }
483        if (window.Quarto?.typesetMath) {
484          window.Quarto.typesetMath(container);
485        }
486        return container.innerHTML
487      } else {
488        if (window.Quarto?.typesetMath) {
489          window.Quarto.typesetMath(note);
490        }
491        return note.innerHTML;
492      }
493    } else {
494      // Remove any anchor links if they are present
495      const anchorLink = note.querySelector('a.anchorjs-link');
496      if (anchorLink) {
497        anchorLink.remove();
498      }
499      if (window.Quarto?.typesetMath) {
500        window.Quarto.typesetMath(note);
501      }
502      if (note.classList.contains("callout")) {
503        return note.outerHTML;
504      } else {
505        return note.innerHTML;
506      }
507    }
508  }
509  for (var i=0; i<xrefs.length; i++) {
510    const xref = xrefs[i];
511    tippyHover(xref, undefined, function(instance) {
512      instance.disable();
513      let url = xref.getAttribute('href');
514      let hash = undefined; 
515      if (url.startsWith('#')) {
516        hash = url;
517      } else {
518        try { hash = new URL(url).hash; } catch {}
519      }
520      if (hash) {
521        const id = hash.replace(/^#\/?/, "");
522        const note = window.document.getElementById(id);
523        if (note !== null) {
524          try {
525            const html = processXRef(id, note.cloneNode(true));
526            instance.setContent(html);
527          } finally {
528            instance.enable();
529            instance.show();
530          }
531        } else {
532          // See if we can fetch this
533          fetch(url.split('#')[0])
534          .then(res => res.text())
535          .then(html => {
536            const parser = new DOMParser();
537            const htmlDoc = parser.parseFromString(html, "text/html");
538            const note = htmlDoc.getElementById(id);
539            if (note !== null) {
540              const html = processXRef(id, note);
541              instance.setContent(html);
542            } 
543          }).finally(() => {
544            instance.enable();
545            instance.show();
546          });
547        }
548      } else {
549        // See if we can fetch a full url (with no hash to target)
550        // This is a special case and we should probably do some content thinning / targeting
551        fetch(url)
552        .then(res => res.text())
553        .then(html => {
554          const parser = new DOMParser();
555          const htmlDoc = parser.parseFromString(html, "text/html");
556          const note = htmlDoc.querySelector('main.content');
557          if (note !== null) {
558            // This should only happen for chapter cross references
559            // (since there is no id in the URL)
560            // remove the first header
561            if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
562              note.children[0].remove();
563            }
564            const html = processXRef(null, note);
565            instance.setContent(html);
566          } 
567        }).finally(() => {
568          instance.enable();
569          instance.show();
570        });
571      }
572    }, function(instance) {
573    });
574  }
575      let selectedAnnoteEl;
576      const selectorForAnnotation = ( cell, annotation) => {
577        let cellAttr = 'data-code-cell="' + cell + '"';
578        let lineAttr = 'data-code-annotation="' +  annotation + '"';
579        const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
580        return selector;
581      }
582      const selectCodeLines = (annoteEl) => {
583        const doc = window.document;
584        const targetCell = annoteEl.getAttribute("data-target-cell");
585        const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
586        const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
587        const lines = annoteSpan.getAttribute("data-code-lines").split(",");
588        const lineIds = lines.map((line) => {
589          return targetCell + "-" + line;
590        })
591        let top = null;
592        let height = null;
593        let parent = null;
594        if (lineIds.length > 0) {
595            //compute the position of the single el (top and bottom and make a div)
596            const el = window.document.getElementById(lineIds[0]);
597            top = el.offsetTop;
598            height = el.offsetHeight;
599            parent = el.parentElement.parentElement;
600          if (lineIds.length > 1) {
601            const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
602            const bottom = lastEl.offsetTop + lastEl.offsetHeight;
603            height = bottom - top;
604          }
605          if (top !== null && height !== null && parent !== null) {
606            // cook up a div (if necessary) and position it 
607            let div = window.document.getElementById("code-annotation-line-highlight");
608            if (div === null) {
609              div = window.document.createElement("div");
610              div.setAttribute("id", "code-annotation-line-highlight");
611              div.style.position = 'absolute';
612              parent.appendChild(div);
613            }
614            div.style.top = top - 2 + "px";
615            div.style.height = height + 4 + "px";
616            div.style.left = 0;
617            let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
618            if (gutterDiv === null) {
619              gutterDiv = window.document.createElement("div");
620              gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
621              gutterDiv.style.position = 'absolute';
622              const codeCell = window.document.getElementById(targetCell);
623              const gutter = codeCell.querySelector('.code-annotation-gutter');
624              gutter.appendChild(gutterDiv);
625            }
626            gutterDiv.style.top = top - 2 + "px";
627            gutterDiv.style.height = height + 4 + "px";
628          }
629          selectedAnnoteEl = annoteEl;
630        }
631      };
632      const unselectCodeLines = () => {
633        const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
634        elementsIds.forEach((elId) => {
635          const div = window.document.getElementById(elId);
636          if (div) {
637            div.remove();
638          }
639        });
640        selectedAnnoteEl = undefined;
641      };
642        // Handle positioning of the toggle
643    window.addEventListener(
644      "resize",
645      throttle(() => {
646        elRect = undefined;
647        if (selectedAnnoteEl) {
648          selectCodeLines(selectedAnnoteEl);
649        }
650      }, 10)
651    );
652    function throttle(fn, ms) {
653    let throttle = false;
654    let timer;
655      return (...args) => {
656        if(!throttle) { // first call gets through
657            fn.apply(this, args);
658            throttle = true;
659        } else { // all the others get throttled
660            if(timer) clearTimeout(timer); // cancel #2
661            timer = setTimeout(() => {
662              fn.apply(this, args);
663              timer = throttle = false;
664            }, ms);
665        }
666      };
667    }
668      // Attach click handler to the DT
669      const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
670      for (const annoteDlNode of annoteDls) {
671        annoteDlNode.addEventListener('click', (event) => {
672          const clickedEl = event.target;
673          if (clickedEl !== selectedAnnoteEl) {
674            unselectCodeLines();
675            const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
676            if (activeEl) {
677              activeEl.classList.remove('code-annotation-active');
678            }
679            selectCodeLines(clickedEl);
680            clickedEl.classList.add('code-annotation-active');
681          } else {
682            // Unselect the line
683            unselectCodeLines();
684            clickedEl.classList.remove('code-annotation-active');
685          }
686        });
687      }
688  const findCites = (el) => {
689    const parentEl = el.parentElement;
690    if (parentEl) {
691      const cites = parentEl.dataset.cites;
692      if (cites) {
693        return {
694          el,
695          cites: cites.split(' ')
696        };
697      } else {
698        return findCites(el.parentElement)
699      }
700    } else {
701      return undefined;
702    }
703  };
704  var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
705  for (var i=0; i<bibliorefs.length; i++) {
706    const ref = bibliorefs[i];
707    const citeInfo = findCites(ref);
708    if (citeInfo) {
709      tippyHover(citeInfo.el, function() {
710        var popup = window.document.createElement('div');
711        citeInfo.cites.forEach(function(cite) {
712          var citeDiv = window.document.createElement('div');
713          citeDiv.classList.add('hanging-indent');
714          citeDiv.classList.add('csl-entry');
715          var biblioDiv = window.document.getElementById('ref-' + cite);
716          if (biblioDiv) {
717            citeDiv.innerHTML = biblioDiv.innerHTML;
718          }
719          popup.appendChild(citeDiv);
720        });
721        return popup.innerHTML;
722      });
723    }
724  }
725});
726</script>
726
727</div> <!-- /content -->
728<footer class="footer">
729  <div class="nav-footer">
730    <div class="nav-footer-left">
731<p><i class="fa-regular fa-copyright" aria-label="copyright"></i> Ryan Straight, 2024<br> All content licensed under <i class="fa-brands fa-creative-commons" aria-label="creative-commons"></i> <i class="fa-brands fa-creative-commons-by" aria-label="creative-commons-by"></i> <i class="fa-brands fa-creative-commons-sa" aria-label="creative-commons-sa"></i> <i class="fa-brands fa-creative-commons-nc" aria-label="creative-commons-nc"></i> <a href="http://creativecommons.org/licenses/by-nc-sa/4.0/">(CC BY-NC-SA 4.0)</a></p>
732</div>   
733    <div class="nav-footer-center">
734      <ul class="footer-items list-unstyled">
735    <li class="nav-item compact">
736    <a class="nav-link" href="https://github.com/mavrxlab/">
737      <i class="bi bi-github" role="img" aria-label="GitHub">
738</i> 
739    </a>
740  </li>  
741    <li class="nav-item compact">
742    <a class="nav-link" href="https://hci.social/@mavrxlab/">
743      <i class="bi bi-mastodon" role="img" aria-label="Mastodon">
744</i> 
745    </a>
746  </li>  
747</ul>
748    </div>
749    <div class="nav-footer-right">
750<p>Made with <i class="fa-brands fa-r-project" aria-label="r-project"></i> and <a href="https://quarto.org/">Quarto</a><br> with much inspiration from <a href="https://github.com/andreashandel/andreashandelwebsite">Andreas Handel</a>.</p>
751</div>
752  </div>
753</footer>
754
755
756
757
758</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.