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 & Principal Investigator</h3> 172<p>Ryan Straight, Ph.D<br> 173Honors & Assistant Professor<br> 174Cyber, Intel, & 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 & 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<!--  --> 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.