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.8.27"> 6 7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> 8 9<meta name="author" content="Rohith Kumar Shanmuganathan"> 10 11<title>Rohith Kumar Shanmuganathan â Rohithâs Webpage</title> 12<style> 13code{white-space: pre-wrap;} 14span.smallcaps{font-variant: small-caps;} 15div.columns{display: flex; gap: min(4vw, 1.5em);} 16div.column{flex: auto; overflow-x: auto;} 17div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;} 18ul.task-list{list-style: none;} 19ul.task-list li input[type="checkbox"] { 20 width: 0.8em; 21 margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ 22 vertical-align: middle; 23} 24</style> 25 26
27<script src="site_libs/quarto-nav/quarto-nav.js"></script>
vendor: 1 bytes, line 27
27
28<script src="site_libs/quarto-nav/headroom.min.js"></script>
vendor: 1 bytes, line 28
28
29<script src="site_libs/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 29
29
30<script src="site_libs/quarto-search/autocomplete.umd.js"></script>
vendor: 1 bytes, line 30
30
31<script src="site_libs/quarto-search/fuse.min.js"></script>
vendor: 1 bytes, line 31
31
32<script src="site_libs/quarto-search/quarto-search.js"></script>
32 33<meta name="quarto:offset" content="./">
34<script src="site_libs/quarto-html/quarto.js" type="module"></script>
vendor: 1 bytes, line 34
34
35<script src="site_libs/quarto-html/tabsets/tabsets.js" type="module"></script>
vendor: 1 bytes, line 35
35
36<script src="site_libs/quarto-html/axe/axe-check.js" type="module"></script>
vendor: 1 bytes, line 36
36
37<script src="site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 37
37
38<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
38 39<link href="site_libs/quarto-html/tippy.css" rel="stylesheet"> 40<link href="site_libs/quarto-html/quarto-syntax-highlighting-ed96de9b727972fe78a7b5d16c58bf87.css" rel="stylesheet" id="quarto-text-highlighting-styles">
41<script src="site_libs/bootstrap/bootstrap.min.js"></script>
41 42<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet"> 43<link href="site_libs/bootstrap/bootstrap-f22cdf64c810c887d8ac059dc91ab5d3.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light"> 44<link href="site_libs/quarto-contrib/academicons-1.9.2/all.css" rel="stylesheet"> 45<link href="site_libs/quarto-contrib/academicons-1.9.2/size.css" rel="stylesheet">
46<script id="quarto-search-options" type="application/json">{ 47 "location": "navbar", 48 "copy-button": false, 49 "collapse-after": 3, 50 "panel-placement": "end", 51 "type": "textbox", 52 "limit": 50, 53 "keyboard-shortcut": [ 54 "f", 55 "/", 56 "s" 57 ], 58 "language": { 59 "search-no-results-text": "No results", 60 "search-matching-documents-text": "matching documents", 61 "search-copy-link-title": "Copy link to search", 62 "search-hide-matches-text": "Hide additional matches", 63 "search-more-match-text": "more match in this document", 64 "search-more-matches-text": "more matches in this document", 65 "search-clear-button-title": "Clear", 66 "search-text-placeholder": "", 67 "search-detached-cancel-button-title": "Cancel", 68 "search-submit-button-title": "Submit", 69 "search-label": "Search" 70 } 71}</script>
vendor: 1 bytes, line 71
71
72<script async="" src="https://www.googletagmanager.com/gtag/js?id="></script>
72 73
74<script type="text/javascript"> 75 76window.dataLayer = window.dataLayer || []; 77function gtag(){dataLayer.push(arguments);} 78gtag('js', new Date()); 79gtag('config', '', { 'anonymize_ip': true}); 80</script>
80 81 82 83<!-- 84 85Load Academicons v1: https://jpswalsh.github.io/academicons/ 86 87--> 88 89<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/jpswalsh/academicons@1/css/academicons.min.css"> 90 91 92 93<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css"> 94 95 96 97 98 99<!--- 100 101The following code are needed to show dimension citation and altmetrics. 102 103https://api.altmetric.com/embeds.html 104 105https://badge.dimensions.ai/ 106 107---> 108 109 110
111<script type="text/javascript" src="https://d1bxh8uas1mnw7.cloudfront.net/assets/embed.js"></script>
111 112 113 114
115<script async="" src="https://badge.dimensions.ai/badge.js" charset="utf-8"></script>
115 116 117 118
119<script type="text/javascript" src="//cdn.plu.mx/widget-popup.js"></script>
119 120 121 122<link rel="stylesheet" href="styles.css"> 123<meta property="og:title" content="Rohith Kumar Shanmuganathan â Rohithâs Webpage"> 124<meta property="og:image" content="rohithsh.github.io/files/images/Photo.jpg"> 125<meta property="og:site_name" content="Rohith's Webpage"> 126<meta name="twitter:title" content="Rohith Kumar Shanmuganathan â Rohithâs Webpage"> 127<meta name="twitter:image" content="rohithsh.github.io/files/images/Photo.jpg"> 128<meta name="twitter:card" content="summary_large_image"> 129</head> 130 131<body class="nav-fixed quarto-light"> 132 133<div id="quarto-search-results"></div> 134 <header id="quarto-header" class="headroom fixed-top"> 135 <nav class="navbar navbar-expand-lg " data-bs-theme="dark"> 136 <div class="navbar-container container-fluid"> 137 <div class="navbar-brand-container mx-auto"> 138 <a class="navbar-brand" href="./index.html"> 139 <span class="navbar-title">Rohithâs Webpage</span> 140 </a> 141 </div> 142 <div id="quarto-search" class="" title="Search"></div> 143 <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(); }"> 144 <span class="navbar-toggler-icon"></span> 145</button> 146<div class="collapse navbar-collapse" id="navbarCollapse"> 147<ul class="navbar-nav navbar-nav-scroll me-auto"> 148 <li class="nav-item"> 149 <a class="nav-link" href="./publications.html"> 150 <span class="menu-text">Publications</span></a> 151</ul> 152</div> <!-- /navcollapse --> 153 <div class="quarto-navbar-tools"> 154 <a href="" class="quarto-reader-toggle quarto-navigation-tool px-1" onclick="window.quartoToggleReader(); return false;" title="Toggle reader mode"> 155 <div class="quarto-reader-toggle-btn"> 156 <i class="bi"></i> 157 </div> 158</a> 159</div> 160 </div> <!-- /container-fluid --> 161 </nav> 162</header> 163<!-- content --> 164<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-full page-navbar"> 165<!-- sidebar --> 166<!-- margin-sidebar --> 167 168<!-- main --> 169<main class="content column-page" id="quarto-document-content"> 170 171 172 173 174<div class="quarto-about-trestles column-page"> 175 <div class="about-entity"> 176 <img src="files/images/Photo.jpg" class="about-image 177 rounded " style="width: 70%;"> 178<header id="title-block-header" class="quarto-title-block default"> 179<div class="quarto-title"> 180<h1 class="title">Rohith Kumar Shanmuganathan</h1> 181</div> 182<div class="quarto-title-meta column-page"> 183 </div> 184</header> 185 <div class="about-links"> 186 <a href="https://uol.de/en/computingscience/groups/formal-methods" class="about-link" rel="" target="_blank"> 187 <i class="bi bi-sun"></i> 188 <span class="about-link-text">Group</span> 189 </a> 190 <a href="mailto:[email protected]" class="about-link" rel="" target=""> 191 <i class="bi bi-envelope"></i> 192 <span class="about-link-text">E-mail</span> 193 </a> 194 <a href="https://www.linkedin.com/in/rohith-kumar-shanmuganathan/" class="about-link" rel="" target="_blank"> 195 <i class="bi bi-linkedin"></i> 196 <span class="about-link-text">LinkedIn</span> 197 </a> 198 <a href="https://scholar.google.com/citations?user=z5ElQOIAAAAJ&hl=en" class="about-link" rel="" target="_blank"> 199 <span class="about-link-text"><i class="ai ai-google-scholar"></i> Google Scholar</span> 200 </a> 201</div> 202 </div> 203 <div class="about-contents"><div id="hero-heading"> 204<p>Iâm a Phd Student at the Carl von Ossietzky University of Oldenburg advised by Prof. Heike Wehrheim.</p> 205<p>I am currently working on explaining software bugs. My other research interests include software analysis, AI4SE and secure software engineering.</p> 206<p>I am also a Research Fellow at the DFG funded research and training group <a href="https://rtg-cause.github.io/">CAUSE</a>.</p> 207<section id="experience" class="level2"> 208<h2 data-anchor-id="experience">Experience</h2> 209<ul> 210<li>Research Assistant, Carl von Ossietzky University of Oldenburg, Oldenburg, Germany</li> 211<li>Student Research Assistant, Secure Software Engineering Group, Fraunhofer IEM, Paderborn, Germany</li> 212<li>Software Development Engineer 1, Trustt (formerly Novopay), Bengaluru, India</li> 213</ul> 214</section> 215<section id="education" class="level2"> 216<h2 data-anchor-id="education">Education</h2> 217<ul> 218<li>M.Sc. Computer Science, Paderborn University, Paderborn, Germany</li> 219<li>B.E. Computer Science and Engineering, Anna University, India</li> 220</ul> 221</section> 222 223</div></div> 224</div> 225 226<h2 id="news-title">News & Updates</h2> 227<section class="news-updates" aria-labelledby="news-title"> 228 <div class="news-item"> 229 <span class="news-date">07/2026</span> - 230 <span class="news-type">Committee Member</span> - 231 I will serve as a <i>Shadow PC member</i> at ICSE-2027. 232 </div> 233 234</section> 235 236 237<h2 id="news-title">Services</h2> 238<section id="committee-member" class="level3"> 239<h3 class="anchored" data-anchor-id="committee-member">Committee Member</h3> 240<p> 241 <a href="https://conf.researchr.org/track/icse-2027/icse-2027-shadow-research-track-program-committee">ICSE 2027 - Shadow PC</a>, 242 <a href="https://conf.researchr.org/committee/ase-2026/ase-2026-artifact-evaluation-artifact-evaluation-committee">ASE 2026 - AEC</a>, 243 <a href="https://conf.researchr.org/committee/issta-2026/issta-2026-artifact-evaluation-artifact-evaluation-committee">ISSTA 2026 - AEC</a>, 244 <a href="https://conf.researchr.org/track/fm-2026/fm-2026-artifact-evaluation">FM 2026 - AEC</a> 245</p> 246</section> 247<section id="Others" class="level3"> 248<h3 class="anchored" data-anchor-id="Others">Others</h3> 249<p>External Reviewer - <a href="https://conf.researchr.org/home/fm-2026">FM 2026 - Research Track</a></p> 250 251<h2 id="news-title">Teaching</h2> 252<section id="Software-Analysis" class="level2"> 253<b class="anchored">Software Analysis</b> - Summer 2026 254 255 256</main> <!-- /main -->
257<script id="quarto-html-after-body" type="application/javascript"> 258 window.document.addEventListener("DOMContentLoaded", function (event) { 259 const isCodeAnnotation = (el) => { 260 for (const clz of el.classList) { 261 if (clz.startsWith('code-annotation-')) { 262 return true; 263 } 264 } 265 return false; 266 } 267 const onCopySuccess = function(e) { 268 // button target 269 const button = e.trigger; 270 // don't keep focus 271 button.blur(); 272 // flash "checked" 273 button.classList.add('code-copy-button-checked'); 274 var currentTitle = button.getAttribute("title"); 275 button.setAttribute("title", "Copied!"); 276 let tooltip; 277 if (window.bootstrap) { 278 button.setAttribute("data-bs-toggle", "tooltip"); 279 button.setAttribute("data-bs-placement", "left"); 280 button.setAttribute("data-bs-title", "Copied!"); 281 tooltip = new bootstrap.Tooltip(button, 282 { trigger: "manual", 283 customClass: "code-copy-button-tooltip", 284 offset: [0, -8]}); 285 tooltip.show(); 286 } 287 setTimeout(function() { 288 if (tooltip) { 289 tooltip.hide(); 290 button.removeAttribute("data-bs-title"); 291 button.removeAttribute("data-bs-toggle"); 292 button.removeAttribute("data-bs-placement"); 293 } 294 button.setAttribute("title", currentTitle); 295 button.classList.remove('code-copy-button-checked'); 296 }, 1000); 297 // clear code selection 298 e.clearSelection(); 299 } 300 const getTextToCopy = function(trigger) { 301 const outerScaffold = trigger.parentElement.cloneNode(true); 302 const codeEl = outerScaffold.querySelector('code'); 303 for (const childEl of codeEl.children) { 304 if (isCodeAnnotation(childEl)) { 305 childEl.remove(); 306 } 307 } 308 return codeEl.innerText; 309 } 310 const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', { 311 text: getTextToCopy 312 }); 313 clipboard.on('success', onCopySuccess); 314 if (window.document.getElementById('quarto-embedded-source-code-modal')) { 315 const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', { 316 text: getTextToCopy, 317 container: window.document.getElementById('quarto-embedded-source-code-modal') 318 }); 319 clipboardModal.on('success', onCopySuccess); 320 } 321 var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//); 322 var mailtoRegex = new RegExp(/^mailto:/); 323 var filterRegex = new RegExp("^(?:http:|https:)\/\/drganghe\.github\.io\/custom"); 324 var isInternal = (href) => { 325 return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href); 326 } 327 // Inspect non-navigation links and adorn them if external 328 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)'); 329 for (var i=0; i<links.length; i++) { 330 const link = links[i]; 331 if (!isInternal(link.href)) { 332 // undo the damage that might have been done by quarto-nav.js in the case of 333 // links that we want to consider external 334 if (link.dataset.originalHref !== undefined) { 335 link.href = link.dataset.originalHref; 336 } 337 // target, if specified 338 link.setAttribute("target", "_blank"); 339 if (link.getAttribute("rel") === null) { 340 link.setAttribute("rel", "noopener"); 341 } 342 } 343 } 344 function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) { 345 const config = { 346 allowHTML: true, 347 maxWidth: 500, 348 delay: 100, 349 arrow: false, 350 appendTo: function(el) { 351 return el.parentElement; 352 }, 353 interactive: true, 354 interactiveBorder: 10, 355 theme: 'quarto', 356 placement: 'bottom-start', 357 }; 358 if (contentFn) { 359 config.content = contentFn; 360 } 361 if (onTriggerFn) { 362 config.onTrigger = onTriggerFn; 363 } 364 if (onUntriggerFn) { 365 config.onUntrigger = onUntriggerFn; 366 } 367 window.tippy(el, config); 368 } 369 const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]'); 370 for (var i=0; i<noterefs.length; i++) { 371 const ref = noterefs[i]; 372 tippyHover(ref, function() { 373 // use id or data attribute instead here 374 let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href'); 375 try { href = new URL(href).hash; } catch {} 376 const id = href.replace(/^#\/?/, ""); 377 const note = window.document.getElementById(id); 378 if (note) { 379 return note.innerHTML; 380 } else { 381 return ""; 382 } 383 }); 384 } 385 const xrefs = window.document.querySelectorAll('a.quarto-xref'); 386 const processXRef = (id, note) => { 387 // Strip column container classes 388 const stripColumnClz = (el) => { 389 el.classList.remove("page-full", "page-columns"); 390 if (el.children) { 391 for (const child of el.children) {
392 stripColumnClz(child); 393 } 394 } 395 } 396 stripColumnClz(note) 397 if (id === null || id.startsWith('sec-')) { 398 // Special case sections, only their first couple elements 399 const container = document.createElement("div"); 400 if (note.children && note.children.length > 2) { 401 container.appendChild(note.children[0].cloneNode(true)); 402 for (let i = 1; i < note.children.length; i++) { 403 const child = note.children[i]; 404 if (child.tagName === "P" && child.innerText === "") { 405 continue; 406 } else { 407 container.appendChild(child.cloneNode(true)); 408 break; 409 } 410 } 411 if (window.Quarto?.typesetMath) { 412 window.Quarto.typesetMath(container); 413 } 414 return container.innerHTML 415 } else { 416 if (window.Quarto?.typesetMath) { 417 window.Quarto.typesetMath(note); 418 } 419 return note.innerHTML; 420 } 421 } else { 422 // Remove any anchor links if they are present 423 const anchorLink = note.querySelector('a.anchorjs-link'); 424 if (anchorLink) { 425 anchorLink.remove(); 426 } 427 if (window.Quarto?.typesetMath) { 428 window.Quarto.typesetMath(note); 429 } 430 if (note.classList.contains("callout")) { 431 return note.outerHTML; 432 } else { 433 return note.innerHTML; 434 } 435 } 436 } 437 for (var i=0; i<xrefs.length; i++) { 438 const xref = xrefs[i]; 439 tippyHover(xref, undefined, function(instance) { 440 instance.disable(); 441 let url = xref.getAttribute('href'); 442 let hash = undefined; 443 if (url.startsWith('#')) { 444 hash = url; 445 } else { 446 try { hash = new URL(url).hash; } catch {} 447 } 448 if (hash) { 449 const id = hash.replace(/^#\/?/, ""); 450 const note = window.document.getElementById(id); 451 if (note !== null) { 452 try { 453 const html = processXRef(id, note.cloneNode(true)); 454 instance.setContent(html); 455 } finally { 456 instance.enable(); 457 instance.show(); 458 } 459 } else { 460 // See if we can fetch this 461 fetch(url.split('#')[0]) 462 .then(res => res.text()) 463 .then(html => { 464 const parser = new DOMParser(); 465 const htmlDoc = parser.parseFromString(html, "text/html"); 466 const note = htmlDoc.getElementById(id); 467 if (note !== null) { 468 const html = processXRef(id, note); 469 instance.setContent(html); 470 } 471 }).finally(() => { 472 instance.enable(); 473 instance.show(); 474 }); 475 } 476 } else { 477 // See if we can fetch a full url (with no hash to target) 478 // This is a special case and we should probably do some content thinning / targeting 479 fetch(url) 480 .then(res => res.text()) 481 .then(html => { 482 const parser = new DOMParser(); 483 const htmlDoc = parser.parseFromString(html, "text/html"); 484 const note = htmlDoc.querySelector('main.content'); 485 if (note !== null) { 486 // This should only happen for chapter cross references 487 // (since there is no id in the URL) 488 // remove the first header 489 if (note.children.length > 0 && note.children[0].tagName === "HEADER") { 490 note.children[0].remove(); 491 } 492 const html = processXRef(null, note); 493 instance.setContent(html); 494 } 495 }).finally(() => { 496 instance.enable(); 497 instance.show(); 498 }); 499 } 500 }, function(instance) { 501 }); 502 } 503 let selectedAnnoteEl; 504 const selectorForAnnotation = ( cell, annotation) => { 505 let cellAttr = 'data-code-cell="' + cell + '"'; 506 let lineAttr = 'data-code-annotation="' + annotation + '"'; 507 const selector = 'span[' + cellAttr + '][' + lineAttr + ']'; 508 return selector; 509 } 510 const selectCodeLines = (annoteEl) => { 511 const doc = window.document; 512 const targetCell = annoteEl.getAttribute("data-target-cell"); 513 const targetAnnotation = annoteEl.getAttribute("data-target-annotation"); 514 const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation)); 515 const lines = annoteSpan.getAttribute("data-code-lines").split(","); 516 const lineIds = lines.map((line) => { 517 return targetCell + "-" + line; 518 }) 519 let top = null; 520 let height = null; 521 let parent = null; 522 if (lineIds.length > 0) { 523 //compute the position of the single el (top and bottom and make a div) 524 const el = window.document.getElementById(lineIds[0]); 525 top = el.offsetTop; 526 height = el.offsetHeight; 527 parent = el.parentElement.parentElement; 528 if (lineIds.length > 1) { 529 const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]); 530 const bottom = lastEl.offsetTop + lastEl.offsetHeight; 531 height = bottom - top; 532 } 533 if (top !== null && height !== null && parent !== null) { 534 // cook up a div (if necessary) and position it 535 let div = window.document.getElementById("code-annotation-line-highlight"); 536 if (div === null) { 537 div = window.document.createElement("div"); 538 div.setAttribute("id", "code-annotation-line-highlight"); 539 div.style.position = 'absolute'; 540 parent.appendChild(div); 541 } 542 div.style.top = top - 2 + "px"; 543 div.style.height = height + 4 + "px"; 544 div.style.left = 0; 545 let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter"); 546 if (gutterDiv === null) { 547 gutterDiv = window.document.createElement("div"); 548 gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter"); 549 gutterDiv.style.position = 'absolute'; 550 const codeCell = window.document.getElementById(targetCell); 551 const gutter = codeCell.querySelector('.code-annotation-gutter'); 552 gutter.appendChild(gutterDiv); 553 } 554 gutterDiv.style.top = top - 2 + "px"; 555 gutterDiv.style.height = height + 4 + "px"; 556 } 557 selectedAnnoteEl = annoteEl; 558 } 559 }; 560 const unselectCodeLines = () => { 561 const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"]; 562 elementsIds.forEach((elId) => { 563 const div = window.document.getElementById(elId); 564 if (div) { 565 div.remove(); 566 } 567 }); 568 selectedAnnoteEl = undefined; 569 }; 570 // Handle positioning of the toggle 571 window.addEventListener( 572 "resize", 573 throttle(() => { 574 elRect = undefined; 575 if (selectedAnnoteEl) { 576 selectCodeLines(selectedAnnoteEl); 577 } 578 }, 10) 579 ); 580 function throttle(fn, ms) { 581 let throttle = false;
582 let timer; 583 return (...args) => { 584 if(!throttle) { // first call gets through 585 fn.apply(this, args); 586 throttle = true; 587 } else { // all the others get throttled 588 if(timer) clearTimeout(timer); // cancel #2 589 timer = setTimeout(() => { 590 fn.apply(this, args); 591 timer = throttle = false; 592 }, ms); 593 } 594 }; 595 } 596 // Attach click handler to the DT 597 const annoteDls = window.document.querySelectorAll('dt[data-target-cell]'); 598 for (const annoteDlNode of annoteDls) { 599 annoteDlNode.addEventListener('click', (event) => { 600 const clickedEl = event.target; 601 if (clickedEl !== selectedAnnoteEl) { 602 unselectCodeLines(); 603 const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active'); 604 if (activeEl) { 605 activeEl.classList.remove('code-annotation-active'); 606 } 607 selectCodeLines(clickedEl); 608 clickedEl.classList.add('code-annotation-active'); 609 } else { 610 // Unselect the line 611 unselectCodeLines(); 612 clickedEl.classList.remove('code-annotation-active'); 613 } 614 }); 615 } 616 const findCites = (el) => { 617 const parentEl = el.parentElement; 618 if (parentEl) { 619 const cites = parentEl.dataset.cites; 620 if (cites) { 621 return { 622 el, 623 cites: cites.split(' ') 624 }; 625 } else { 626 return findCites(el.parentElement) 627 } 628 } else { 629 return undefined; 630 } 631 }; 632 var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]'); 633 for (var i=0; i<bibliorefs.length; i++) { 634 const ref = bibliorefs[i]; 635 const citeInfo = findCites(ref); 636 if (citeInfo) { 637 tippyHover(citeInfo.el, function() { 638 var popup = window.document.createElement('div'); 639 citeInfo.cites.forEach(function(cite) { 640 var citeDiv = window.document.createElement('div'); 641 citeDiv.classList.add('hanging-indent'); 642 citeDiv.classList.add('csl-entry'); 643 var biblioDiv = window.document.getElementById('ref-' + cite); 644 if (biblioDiv) { 645 citeDiv.innerHTML = biblioDiv.innerHTML; 646 } 647 popup.appendChild(citeDiv); 648 }); 649 return popup.innerHTML; 650 }); 651 } 652 } 653 }); 654 </script>
654 655 <div style=" 656 position:fixed; 657 right:10px; 658 bottom:10px; 659 width:120px; 660 height:70px; 661 overflow:hidden; 662 z-index:9999; 663 "> 664 <div style=" 665 width:400px; 666 height:230px; 667 transform:scale(0.3); 668 transform-origin:top left; 669 "> 670
670<script type="text/javascript" id="mmvst_globe" src="//mapmyvisitors.com/globe.js?d=SxaaNkKrePduLeXryQJYKfjWqr1q0V_9VoaIU1zqXlI"></script>
670 671 </div> 672 </div> 673</div> <!-- /content --> 674<footer class="footer"> 675 <div class="nav-footer"> 676 <div class="nav-footer-left"> 677<a href="http://www.rohithsh.github.io">Rohith Kumar Shanmuganathan</a> ©
678<script>document.write(new Date().getFullYear())</script>
678 679</div> 680 <div class="nav-footer-center"> 681 682 </div> 683 <div class="nav-footer-right"> 684 685 </div> 686 </div> 687</footer> 688 689 690 691 692</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.