PageSourceSearch

https://fishmip.org/

html fishmip.org collected 2026-09-24 12:12:36 UTC 28,001 bytes, 692 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.9.38">
6
7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
8
9<meta name="description" content="<p>Welcome to the Fisheries and Marine Ecosystem Model Intercomparison Project.</p>">
10
11<title>Home | FishMIP</title>
12<style>
13/* Default styles provided by pandoc.
14** See https://pandoc.org/MANUAL.html#variables-for-html for config info.
15*/
16code{white-space: pre-wrap;}
17span.smallcaps{font-variant: small-caps;}
18div.columns{display: flex; gap: min(4vw, 1.5em);}
19div.column{flex: auto; overflow-x: auto;}
20div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
21ul.task-list{list-style: none;}
22ul.task-list li input[type="checkbox"] {
23  width: 0.8em;
24  margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ 
25  vertical-align: middle;
26}
27</style>
28
29
30<script src="site_libs/quarto-nav/quarto-nav.js"></script>
vendor: 1 bytes, line 30
30
31<script src="site_libs/quarto-nav/headroom.min.js"></script>
vendor: 1 bytes, line 31
31
32<script src="site_libs/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 32
32
33<script src="site_libs/quarto-search/autocomplete.umd.js"></script>
vendor: 1 bytes, line 33
33
34<script src="site_libs/quarto-search/fuse.min.js"></script>
vendor: 1 bytes, line 34
34
35<script src="site_libs/quarto-search/quarto-search.js"></script>
35
36<meta name="quarto:offset" content="./">
37<link href=".//FishMIP_assets/one line logo/pngs/one-line-colour-logo_transparent_background.png" rel="icon" type="image/png">
38<script src="site_libs/quarto-html/quarto.js" type="module"></script>
vendor: 1 bytes, line 38
38
39<script src="site_libs/quarto-html/tabsets/tabsets.js" type="module"></script>
vendor: 1 bytes, line 39
39
40<script src="site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 40
40
41<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
41
42<link href="site_libs/quarto-html/tippy.css" rel="stylesheet">
43<link href="site_libs/quarto-html/quarto-syntax-highlighting-15634bcf2e68342d4ad2dfa704d543f6.css" rel="stylesheet" id="quarto-text-highlighting-styles">
44<script src="site_libs/bootstrap/bootstrap.min.js"></script>
44
45<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
46<link href="site_libs/bootstrap/bootstrap-3e64310203e13f9486fedeb0de333de6.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light">
47<script src="site_libs/quarto-contrib/iconify-3.0.0/iconify-icon.min.js"></script>
vendor: 1 bytes, line 47
47
48<script id="quarto-search-options" type="application/json">{
49  "location": "navbar",
50  "copy-button": false,
51  "collapse-after": 3,
52  "panel-placement": "end",
53  "type": "overlay",
54  "limit": 50,
55  "keyboard-shortcut": [
56    "f",
57    "/",
58    "s"
59  ],
60  "show-item-context": false,
61  "language": {
62    "search-no-results-text": "No results",
63    "search-matching-documents-text": "matching documents",
64    "search-copy-link-title": "Copy link to search",
65    "search-hide-matches-text": "Hide additional matches",
66    "search-more-match-text": "more match in this document",
67    "search-more-matches-text": "more matches in this document",
68    "search-clear-button-title": "Clear",
69    "search-text-placeholder": "",
70    "search-detached-cancel-button-title": "Cancel",
71    "search-submit-button-title": "Submit",
72    "search-label": "Search"
73  }
74}</script>
74
75
76
77</head>
78
79<body class="nav-fixed fullcontent quarto-light">
80
81<div id="quarto-search-results"></div>
82  <header id="quarto-header" class="headroom fixed-top">
83    <nav class="navbar navbar-expand-lg " data-bs-theme="dark">
84      <div class="navbar-container container-fluid">
85      <div class="navbar-brand-container mx-auto">
86    <a href="./index.html" class="navbar-brand navbar-brand-logo">
87    <img src="./FishMIP_assets/one_line_colour_logo.png" alt="FishMIP Home" class="navbar-logo light-content">
88    <img src="./FishMIP_assets/one_line_colour_logo.png" alt="FishMIP Home" class="navbar-logo dark-content">
89    </a>
90  </div>
91            <div id="quarto-search" class="" title="Search"></div>
92          <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(); }">
93  <span class="navbar-toggler-icon"></span>
94</button>
95          <div class="collapse navbar-collapse" id="navbarCollapse">
96            <ul class="navbar-nav navbar-nav-scroll ms-auto">
97  <li class="nav-item">
98    <a class="nav-link active" href="./index.html" aria-current="page"> 
99<span class="menu-text">Home</span></a>
100  </li>  
101  <li class="nav-item">
102    <a class="nav-link" href="./pages/about.html"> 
103<span class="menu-text">Approach</span></a>
104  </li>  
105  <li class="nav-item dropdown ">
106    <a class="nav-link dropdown-toggle" href="#" id="nav-menu-people" role="link" data-bs-toggle="dropdown" aria-expanded="false">
107 <span class="menu-text">People</span>
108    </a>
109    <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="nav-menu-people">    
110        <li>
111    <a class="dropdown-item" href="./pages/sciencegroup.html">
112 <span class="dropdown-text">Science Coordination Group</span></a>
113  </li>  
114        <li>
115    <a class="dropdown-item" href="./pages/modellingteams.html">
116 <span class="dropdown-text">Modelling Teams</span></a>
117  </li>  
118        <li>
119    <a class="dropdown-item" href="./pages/workinggroups.html">
120 <span class="dropdown-text">Working Groups</span></a>
121  </li>  
122        <li>
123    <a class="dropdown-item" href="./pages/joinus.html">
124 <span class="dropdown-text">Join us</span></a>
125  </li>  
126    </ul>
127  </li>
128  <li class="nav-item">
129    <a class="nav-link" href="./pages/publications.html"> 
130<span class="menu-text">Publications</span></a>
131  </li>  
132  <li class="nav-item dropdown ">
133    <a class="nav-link dropdown-toggle" href="#" id="nav-menu-data--tools" role="link" data-bs-toggle="dropdown" aria-expanded="false">
134 <span class="menu-text">Data &amp; Tools</span>
135    </a>
136    <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="nav-menu-data--tools">    
137        <li>
138    <a class="dropdown-item" href="./pages/protocols.html">
139 <span class="dropdown-text">Protocols</span></a>
140  </li>  
141        <li>
142    <a class="dropdown-item" href="./pages/tools.html">
143 <span class="dropdown-text">Tools</span></a>
144  </li>  
145    </ul>
146  </li>
147  <li class="nav-item dropdown ">
148    <a class="nav-link dropdown-toggle" href="#" id="nav-menu-news" role="link" data-bs-toggle="dropdown" aria-expanded="false">
149 <span class="menu-text">News</span>
150    </a>
151    <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="nav-menu-news">    
152        <li>
153    <a class="dropdown-item" href="./pages/events.html">
154 <span class="dropdown-text">Events</span></a>
155  </li>  
156        <li>
157    <a class="dropdown-item" href="./pages/blogs.html">
158 <span class="dropdown-text">Blog</span></a>
159  </li>  
160    </ul>
161  </li>
162  <li class="nav-item compact">
163    <a class="nav-link" href="https://bsky.app/profile/fishmarinemip.bsky.social" target="_blank"> <i class="bi bi-bluesky" role="img">
164</i> 
165<span class="menu-text"></span></a>
166  </li>  
167  <li class="nav-item compact">
168    <a class="nav-link" href="https://www.linkedin.com/company/fisheries-and-marine-ecosystem-model-intercomparison-project-fishmip" target="_blank"> <i class="bi bi-linkedin" role="img">
169</i> 
170<span class="menu-text"></span></a>
171  </li>  
172  <li class="nav-item">
173    <a class="nav-link" href="https://scholar.google.com/citations?hl=en&amp;user=qC76LesAAAAJ&amp;view_op=list_works&amp;sortby=pubdate" target="_blank"> 
174<span class="menu-text"><iconify-icon role="img" inline="" icon="fa7-brands:google-scholar" style="color: #2c3792fe; hover-color: #2c3792cc;" aria-label="Icon google-scholar from fa7-brands Iconify.design set." title="Google Scholar"></iconify-icon></span></a>
175  </li>  
176  <li class="nav-item compact">
177    <a class="nav-link" href="https://github.com/Fish-MIP" target="_blank"> <i class="bi bi-github" role="img">
178</i> 
179<span class="menu-text"></span></a>
180  </li>  
181  <li class="nav-item compact">
182    <a class="nav-link" href="https://www.youtube.com/@FishMIP" target="_blank"> <i class="bi bi-youtube" role="img">
183</i> 
184<span class="menu-text"></span></a>
185  </li>  
186</ul>
187          </div> <!-- /navcollapse -->
188            <div class="quarto-navbar-tools">
189</div>
190      </div> <!-- /container-fluid -->
191    </nav>
192</header>
193<!-- content -->
194<div id="quarto-content" class="quarto-container page-layout-custom page-navbar">
195<!-- sidebar -->
196<!-- margin-sidebar -->
197<!-- main -->
198
199
200
201
202<div class="column-screen" style="padding: 0em; margin-top: -1em">
203<div class="quarto-figure quarto-figure-center">
204<figure class="figure">
205<p><img src="images/shutterstock_169126697 (3).jpeg" class="banner img-fluid quarto-figure quarto-figure-center figure-img"></p>
206</figure>
207</div>
208</div>
209<div class="grid mx-3 px-4 my-2 py-2">
210<section id="welcome-to-the-fisheries-and-marine-ecosystem-model-intercomparison-project-fishmip" class="level1 g-col-12" style="margin-left: 1.5em;, margin-left: 1.5em;">
211<h1>Welcome to the Fisheries and Marine Ecosystem Model Intercomparison Project (FishMIP)</h1>
212</section>
213<div class="g-col-12 text-center" style="font-size: 1.5em">
214<p>FishMIP is a network of more than 150 marine ecosystem modellers and researchers from around the world.</p>
215</div>
216<div class="g-col-12 text-center">
217<p>Our goal is to bring together diverse marine ecosystem models to help better understand and project the long-term impacts of climate change on fisheries and marine ecosystems, and to use our findings to help inform policy.</p>
218</div>
219</div>
220<div class="grid mx-3 px-4 my-2 py-2">
221<div class="g-col-12 g-col-xl-10 g-start-xl-2 text-center">
222<div class="quarto-video ratio ratio-16x9"><iframe data-external="1" src="https://player.vimeo.com/video/927985005" frameborder="0" title="" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe></div>
223</div>
224</div>
225<div class="grid mx-4 px-4 my-2 py-2 align-items-center jutify-contents-evenly">
226<section id="we-answer-questions-about-the-future-of" class="level1 g-col-12">
227<h1>We answer questions about the future of:</h1>
228</section>
229<div class="grid g-col-5 g-start-2 mx-4 align-items-center jutify-contents-evenly">
230<div class="g-col-4">
231<p><img src="images/icons/ship-solid-full.svg" class="img-fluid"></p>
232</div>
233<section id="fish-fisheries" class="level3 g-col-8 text-center">
234<h3 data-anchor-id="fish-fisheries">Fish &amp; Fisheries</h3>
235</section>
236</div>
237<div class="grid g-col-5 mx-4 align-items-center jutify-contents-evenly">
238<div class="g-col-4">
239<p><img src="images/icons/utensils-solid-full.svg" class="img-fluid"></p>
240</div>
241<section id="seafood-supply" class="level3 g-col-8 text-center">
242<h3 data-anchor-id="seafood-supply">Seafood supply</h3>
243</section>
244</div>
245<div class="grid g-col-5 g-start-2 mx-4 align-items-center jutify-contents-evenly">
246<div class="g-col-4">
247<p><img src="images/icons/fish-fins-solid-full.svg" class="img-fluid"></p>
248</div>
249<section id="marine-biodiversity" class="level3 g-col-8 text-center">
250<h3 data-anchor-id="marine-biodiversity">Marine biodiversity</h3>
251</section>
252</div>
253<div class="grid g-col-5 mx-4 align-items-center jutify-contents-evenly">
254<div class="g-col-4">
255<p><img src="images/icons/earth-asia-solid-full.svg" class="img-fluid"></p>
256</div>
257<section id="marine-ecosystem-functioning" class="level3 g-col-8 text-center">
258<h3 data-anchor-id="marine-ecosystem-functioning">Marine ecosystem functioning</h3>
259</section>
260</div>
261</div>
262<div class="grid column-screen mx-4 px-3 my-3">
263<div class="g-col-12 g-col-xl-10 g-start-xl-2 text-center">
264<div class="quarto-figure quarto-figure-center">
265<figure class="figure">
266<p><img src="images/nemow.jpg" class="column-page img-fluid quarto-figure quarto-figure-center figure-img" style="padding: 0em" width="1489"></p>
267</figure>
268</div>
269</div>
270<section id="part-of-a-wider-climate-impact-model-community" class="level1 g-col-12">
271<h1>Part of a wider climate impact model community</h1>
272</section>
273<div class="g-col-12 text-center" style="margin-bottom: 3em;">
274<p>FishMIP contributes to the <a href="https://www.isimip.org/"><strong>Intersectoral Impact ModelIntercomparisonProject (ISIMIP)</strong></a>.</p>
275</div>
276</div>
277
278
279
280
281<script id="quarto-html-after-body" type="application/javascript">
282  window.document.addEventListener("DOMContentLoaded", function (event) {
283    const isCodeAnnotation = (el) => {
284      for (const clz of el.classList) {
285        if (clz.startsWith('code-annotation-')) {                     
286          return true;
287        }
288      }
289      return false;
290    }
291    const onCopySuccess = function(e) {
292      // button target
293      const button = e.trigger;
294      // don't keep focus
295      button.blur();
296      // flash "checked"
297      button.classList.add('code-copy-button-checked');
298      var currentTitle = button.getAttribute("title");
299      button.setAttribute("title", "Copied!");
300      let tooltip;
301      if (window.bootstrap) {
302        button.setAttribute("data-bs-toggle", "tooltip");
303        button.setAttribute("data-bs-placement", "left");
304        button.setAttribute("data-bs-title", "Copied!");
305        tooltip = new bootstrap.Tooltip(button, 
306          { trigger: "manual", 
307            customClass: "code-copy-button-tooltip",
308            offset: [0, -8]});
309        tooltip.show();    
310      }
311      setTimeout(function() {
312        if (tooltip) {
313          tooltip.hide();
314          button.removeAttribute("data-bs-title");
315          button.removeAttribute("data-bs-toggle");
316          button.removeAttribute("data-bs-placement");
317        }
318        button.setAttribute("title", currentTitle);
319        button.classList.remove('code-copy-button-checked');
320      }, 1000);
321      // clear code selection
322      e.clearSelection();
323    }
324    const getTextToCopy = function(trigger) {
325      const outerScaffold = trigger.parentElement.cloneNode(true);
326      const codeEl = outerScaffold.querySelector('code');
327      for (const childEl of codeEl.children) {
328        if (isCodeAnnotation(childEl)) {
329          childEl.remove();
330        }
331      }
332      return codeEl.innerText;
333    }
334    const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
335      text: getTextToCopy
336    });
337    clipboard.on('success', onCopySuccess);
338    if (window.document.getElementById('quarto-embedded-source-code-modal')) {
339      const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
340        text: getTextToCopy,
341        container: window.document.getElementById('quarto-embedded-source-code-modal')
342      });
343      clipboardModal.on('success', onCopySuccess);
344    }
345      var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
346      var mailtoRegex = new RegExp(/^mailto:/);
347        var filterRegex = new RegExp('/' + window.location.host + '/');
348      var isInternal = (href) => {
349          return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
350      }
351      // Inspect non-navigation links and adorn them if external
352     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)');
353      for (var i=0; i<links.length; i++) {
354        const link = links[i];
355        if (!isInternal(link.href)) {
356          // undo the damage that might have been done by quarto-nav.js in the case of
357          // links that we want to consider external
358          if (link.dataset.originalHref !== undefined) {
359            link.href = link.dataset.originalHref;
360          }
361        }
362      }
363    function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
364      const config = {
365        allowHTML: true,
366        maxWidth: 500,
367        delay: 100,
368        arrow: false,
369        appendTo: function(el) {
370            return el.parentElement;
371        },
372        interactive: true,
373        interactiveBorder: 10,
374        theme: 'quarto',
375        placement: 'bottom-start',
376      };
377      if (contentFn) {
378        config.content = contentFn;
379      }
380      if (onTriggerFn) {
381        config.onTrigger = onTriggerFn;
382      }
383      if (onUntriggerFn) {
384        config.onUntrigger = onUntriggerFn;
385      }
386      window.tippy(el, config); 
387    }
388    const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
389    for (var i=0; i<noterefs.length; i++) {
390      const ref = noterefs[i];
391      tippyHover(ref, function() {
392        // use id or data attribute instead here
393        let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
394        try { href = new URL(href).hash; } catch {}
395        const id = href.replace(/^#\/?/, "");
396        const note = window.document.getElementById(id);
397        if (note) {
398          return note.innerHTML;
399        } else {
400          return "";
401        }
402      });
403    }
404    const xrefs = window.document.querySelectorAll('a.quarto-xref');
405    const processXRef = (id, note) => {
406      // Strip column container classes
407      const stripColumnClz = (el) => {
408        el.classList.remove("page-full", "page-columns");
409        if (el.children) {
410          for (const child of el.children) {
411            stripColumnClz(child);
412          }
413        }
414      }
415      stripColumnClz(note)
416      if (id === null || id.startsWith('sec-')) {
417        // Special case sections, only their first couple elements
418        const container = document.createElement("div");
419        if (note.children && note.children.length > 2) {
420          container.appendChild(note.children[0].cloneNode(true));
421          for (let i = 1; i < note.children.length; i++) {
422            const child = note.children[i];
423            if (child.tagName === "P" && child.innerText === "") {
424              continue;
425            } else {
426              container.appendChild(child.cloneNode(true));
427              break;
428            }
429          }
430          if (window.Quarto?.typesetMath) {
431            window.Quarto.typesetMath(container);
432          }
433          return container.innerHTML
434        } else {
435          if (window.Quarto?.typesetMath) {
436            window.Quarto.typesetMath(note);
437          }
438          return note.innerHTML;
439        }
440      } else {
441        // Remove any anchor links if they are present
442        const anchorLink = note.querySelector('a.anchorjs-link');
443        if (anchorLink) {
444          anchorLink.remove();
445        }
446        if (window.Quarto?.typesetMath) {
447          window.Quarto.typesetMath(note);
448        }
449        if (note.classList.contains("callout")) {
450          return note.outerHTML;
451        } else {
452          return note.innerHTML;
453        }
454      }
455    }
456    for (var i=0; i<xrefs.length; i++) {
457      const xref = xrefs[i];
458      tippyHover(xref, undefined, function(instance) {
459        instance.disable();
460        let url = xref.getAttribute('href');
461        let hash = undefined; 
462        if (url.startsWith('#')) {
463          hash = url;
464        } else {
465          try { hash = new URL(url).hash; } catch {}
466        }
467        if (hash) {
468          const id = hash.replace(/^#\/?/, "");
469          const note = window.document.getElementById(id);
470          if (note !== null) {
471            try {
472              const html = processXRef(id, note.cloneNode(true));
473              instance.setContent(html);
474            } finally {
475              instance.enable();
476              instance.show();
477            }
478          } else {
479            // See if we can fetch this
480            fetch(url.split('#')[0])
481            .then(res => res.text())
482            .then(html => {
483              const parser = new DOMParser();
484              const htmlDoc = parser.parseFromString(html, "text/html");
485              const note = htmlDoc.getElementById(id);
486              if (note !== null) {
487                const html = processXRef(id, note);
488                instance.setContent(html);
489              } 
490            }).finally(() => {
491              instance.enable();
492              instance.show();
493            });
494          }
495        } else {
496          // See if we can fetch a full url (with no hash to target)
497          // This is a special case and we should probably do some content thinning / targeting
498          fetch(url)
499          .then(res => res.text())
500          .then(html => {
501            const parser = new DOMParser();
502            const htmlDoc = parser.parseFromString(html, "text/html");
503            const note = htmlDoc.querySelector('main.content');
504            if (note !== null) {
505              // This should only happen for chapter cross references
506              // (since there is no id in the URL)
507              // remove the first header
508              if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
509                note.children[0].remove();
510              }
511              const html = processXRef(null, note);
512              instance.setContent(html);
513            } 
514          }).finally(() => {
515            instance.enable();
516            instance.show();
517          });
518        }
519      }, function(instance) {
520      });
521    }
522        let selectedAnnoteEl;
523        const selectorForAnnotation = ( cell, annotation) => {
524          let cellAttr = 'data-code-cell="' + cell + '"';
525          let lineAttr = 'data-code-annotation="' +  annotation + '"';
526          const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
527          return selector;
528        }
529        const selectCodeLines = (annoteEl) => {
530          const doc = window.document;
531          const targetCell = annoteEl.getAttribute("data-target-cell");
532          const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
533          const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
534          const lines = annoteSpan.getAttribute("data-code-lines").split(",");
535          const lineIds = lines.map((line) => {
536            return targetCell + "-" + line;
537          })
538          let top = null;
539          let height = null;
540          let parent = null;
541          if (lineIds.length > 0) {
542              //compute the position of the single el (top and bottom and make a div)
543              const el = window.document.getElementById(lineIds[0]);
544              top = el.offsetTop;
545              height = el.offsetHeight;
546              parent = el.parentElement.parentElement;
547            if (lineIds.length > 1) {
548              const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
549              const bottom = lastEl.offsetTop + lastEl.offsetHeight;
550              height = bottom - top;
551            }
552            if (top !== null && height !== null && parent !== null) {
553              // cook up a div (if necessary) and position it 
554              let div = window.document.getElementById("code-annotation-line-highlight");
555              if (div === null) {
556                div = window.document.createElement("div");
557                div.setAttribute("id", "code-annotation-line-highlight");
558                div.style.position = 'absolute';
559                parent.appendChild(div);
560              }
561              div.style.top = top - 2 + "px";
562              div.style.height = height + 4 + "px";
563              div.style.left = 0;
564              let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
565              if (gutterDiv === null) {
566                gutterDiv = window.document.createElement("div");
567                gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
568                gutterDiv.style.position = 'absolute';
569                const codeCell = window.document.getElementById(targetCell);
570                const gutter = codeCell.querySelector('.code-annotation-gutter');
571                gutter.appendChild(gutterDiv);
572              }
573              gutterDiv.style.top = top - 2 + "px";
574              gutterDiv.style.height = height + 4 + "px";
575            }
576            selectedAnnoteEl = annoteEl;
577          }
578        };
579        const unselectCodeLines = () => {
580          const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
581          elementsIds.forEach((elId) => {
582            const div = window.document.getElementById(elId);
583            if (div) {
584              div.remove();
585            }
586          });
587          selectedAnnoteEl = undefined;
588        };
589          // Handle positioning of the toggle
590      window.addEventListener(
591        "resize",
592        throttle(() => {
593          elRect = undefined;
594          if (selectedAnnoteEl) {
595            selectCodeLines(selectedAnnoteEl);
596          }
597        }, 10)
598      );
599      function throttle(fn, ms) {
600      let throttle = false;
601      let timer;
602        return (...args) => {
603          if(!throttle) { // first call gets through
604              fn.apply(this, args);
605              throttle = true;
606          } else { // all the others get throttled
607              if(timer) clearTimeout(timer); // cancel #2
608              timer = setTimeout(() => {
609                fn.apply(this, args);
610                timer = throttle = false;
611              }, ms);
612          }
613        };
614      }
615        // Attach click handler to the DT
616        const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
617        for (const annoteDlNode of annoteDls) {
618          annoteDlNode.addEventListener('click', (event) => {
619            const clickedEl = event.target;
620            if (clickedEl !== selectedAnnoteEl) {
621              unselectCodeLines();
622              const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
623              if (activeEl) {
624                activeEl.classList.remove('code-annotation-active');
625              }
626              selectCodeLines(clickedEl);
627              clickedEl.classList.add('code-annotation-active');
628            } else {
629              // Unselect the line
630              unselectCodeLines();
631              clickedEl.classList.remove('code-annotation-active');
632            }
633          });
634        }
635    const findCites = (el) => {
636      const parentEl = el.parentElement;
637      if (parentEl) {
638        const cites = parentEl.dataset.cites;
639        if (cites) {
640          return {
641            el,
642            cites: cites.split(' ')
643          };
644        } else {
645          return findCites(el.parentElement)
646        }
647      } else {
648        return undefined;
649      }
650    };
651    var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
652    for (var i=0; i<bibliorefs.length; i++) {
653      const ref = bibliorefs[i];
654      const citeInfo = findCites(ref);
655      if (citeInfo) {
656        tippyHover(citeInfo.el, function() {
657          var popup = window.document.createElement('div');
658          citeInfo.cites.forEach(function(cite) {
659            var citeDiv = window.document.createElement('div');
660            citeDiv.classList.add('hanging-indent');
661            citeDiv.classList.add('csl-entry');
662            var biblioDiv = window.document.getElementById('ref-' + cite);
663            if (biblioDiv) {
664              citeDiv.innerHTML = biblioDiv.innerHTML;
665            }
666            popup.appendChild(citeDiv);
667          });
668          return popup.innerHTML;
669        });
670      }
671    }
672  });
673  </script>
673
674</div> <!-- /content -->
675<footer class="footer">
676  <div class="nav-footer">
677    <div class="nav-footer-left">
678<p><img src="./FishMIP_assets/UN_OceanDecadeLogo.png" alt="UN Ocean Decade Logo" style="height: 7.5em; vertical-align: middle;"></p>
679</div>   
680    <div class="nav-footer-center">
681<p><br>Copyright © 2025 <a href="https://github.com/Fish-MIP">FishMIP</a></p>
682</div>
683    <div class="nav-footer-right">
684<p>Built using <a href="https://quarto.org/">Quarto</a><br>Report website issues <a href="https://github.com/Fish-MIP/Fish-MIP.github.io/issues">here</a></p>
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.