diff --git a/.github/workflows/render-distill.yaml b/.github/workflows/render-distill.yaml index 232f4f8..24aaf73 100644 --- a/.github/workflows/render-distill.yaml +++ b/.github/workflows/render-distill.yaml @@ -27,6 +27,9 @@ jobs: run: | pip install pandas pip install seaborn + pip install netCDF4 + pip install cartopy + pip install cmocean pip install git+http://github.com/euroargodev/argopy.git@master - name: Install R dependencies diff --git a/_posts/2024-02-15-canadian-polar-deployments/canadian-polar-deployments.Rmd b/_posts/2024-02-15-canadian-polar-deployments/canadian-polar-deployments.Rmd new file mode 100644 index 0000000..cc10683 --- /dev/null +++ b/_posts/2024-02-15-canadian-polar-deployments/canadian-polar-deployments.Rmd @@ -0,0 +1,174 @@ +--- +title: "Canadian Polar Deployments" +description: | + A brief overview of recent deployments of Canadian floats in polar oceans. +author: + - name: Christopher Gordon + url: https://github.com/cgrdn +date: 2024-02-29 +output: + distill::distill_article: + self_contained: false + code_folding: true +--- + + +```{r setup, include=FALSE} +knitr::opts_chunk$set(echo = FALSE) +library(reticulate) +# use_condaenv("py39") +``` + +In this post we will summarize recent polar deployments of NKE ARVOR and look at their initial data. The deployments occurred in the Beaufort Sea in the Arctic Ocean, North of Alaska/Northwest Territories and the Ross Sea in the Southern Ocean. Ice avoidance parameters for each region will be shown. + +All data will be pulled from the GDAC using [argopy](https://argopy.readthedocs.io/en/latest/index.html), code can be expanded in each section. + +```{python imports and setup, include=TRUE} +### imports and setup + +import argopy + +from pathlib import Path +from netCDF4 import Dataset +import numpy as np + +import matplotlib.pyplot as plt +import matplotlib.path as mpath +import cmocean.cm as cmo + +import seaborn as sns +sns.set(style="ticks", palette="colorblind") + +import cartopy.crs as ccrs +import cartopy.feature as cfeature +``` + +## Deployments + +Recent polar region deployments consist of 2 floats (4902610, 4902611) deployed in the Beaufort Sea by the Louis S. St. Laurent in September 2023, and 5 floats (4902664, 4902665, 4902667, 4902668, 4902669) deployed in the Ross Sea by the Italian ship Laura Bassi. + +```{python maps, include=TRUE} + +# define some useful mapping functions +def polarCentral_set_latlim(lat_lims, ax): + ax.set_extent([-180, 180, lat_lims[0], lat_lims[1]], ccrs.PlateCarree()) + # Compute a circle in axes coordinates, which we can use as a boundary + # for the map. We can pan/zoom as much as we like - the boundary will be + # permanently circular. + theta = np.linspace(0, 2*np.pi, 100) + center, radius = [0.5, 0.5], 0.5 + verts = np.vstack([np.sin(theta), np.cos(theta)]).T + circle = mpath.Path(verts * radius + center) + + ax.set_boundary(circle, transform=ax.transAxes) + +def add_map_features(ax): + ax.coastlines() + gl = ax.gridlines() + ax.add_feature(cfeature.BORDERS) + ax.add_feature(cfeature.LAND) + gl = ax.gridlines(draw_labels=True) + + +# wmo numbers of the floats +beaufort_wmos = [4902610, 4902611] +ross_wmos = [4902664, 4902665, 4902667, 4902668, 4902669] + +# grab Argo index for each group +index = argopy.ArgoIndex().load() +beaufort_ix = index.search_wmo(beaufort_wmos).to_dataframe() +ross_ix = index.search_wmo(ross_wmos).to_dataframe() + +# geo axis figures +fig = plt.figure(constrained_layout=True) +axes = [ + fig.add_subplot(1, 2, 1, projection=ccrs.NorthPolarStereo()), + fig.add_subplot(1, 2, 2, projection=ccrs.SouthPolarStereo()) +] + +# bathymetry for plot +bath_file = Path('/Users/GordonC/Documents/data/GEBCO/GEBCO_2020.nc') +bath = Dataset(bath_file) +blat = bath['lat'][:] +blon = bath['lon'][:] +elev = bath['elevation'][:] + +# subset/decimate bathymetry - really big array +iy = np.logical_or(blat > 60, blat < -65) + +blat = blat[iy] +elev = elev[iy,:] +elev = -np.ma.masked_array(elev.data, elev > 0) + +N = 20 +blat = blat[::N] +blon = blon[::N] +elev = elev[::N,:] +elev = elev[:,::N] + +for ix, ax in zip([beaufort_ix, ross_ix], axes): + # add bathymetry + im = ax.contourf( + blon, blat, elev, list(range(0, 3800, 200)), + transform=ccrs.PlateCarree(), + cmap=cmo.deep, + vmin=0, extend='max' + ) + + # plot profiles so far + sns.scatterplot( + data=ix, x='longitude', y='latitude', + hue='wmo', ax=ax, palette='Set2', + transform=ccrs.PlateCarree() + ) + add_map_features(ax) + +# move legend so somewhere more friendly +axes[0].legend(loc=3, bbox_to_anchor=(-0.25, 0.0)) +axes[1].legend(loc=4, bbox_to_anchor=(1.25, 0.0)) + +# set limits +polarCentral_set_latlim([65, 90], axes[0]) +polarCentral_set_latlim([-70, -90], axes[1]) + +axes[0].set_title('Arctic Ocean - Beaufort Sea upper left', loc='left', fontsize=8, fontweight='bold') +axes[1].set_title('Southern Ocean - Ross Sea lower left', loc='left', fontsize=8, fontweight='bold') + +plt.show() +``` + +## Ice Avoidance Configuration + +In addition to the basic configuration described here, complete ice avoidance parameters can be found on the [Argo Canada data management github page](https://github.com/ArgoCanada/argo-dm/tree/main/float-programming/ISA_configs). The Ice Sensing Algorithm (ISA) works by measuring temperatures in a defined near-surface depth window, and if the median temperature is lower than the threshold temperature set by the user, inferring that there will be ice coverage above. Clearly, the proper threshold temperature will depend on the region and water properties, and so should be carefully selected. + +```{r ISA parameter table, layout="l-body shaded"} +df = read.csv('data/ISA_parameters.csv') +knitr::kable(df, caption='ISA parameters') +``` + +## Initial Data + +```{python data, include=TRUE} +beaufort_df = df = argopy.DataFetcher().float(beaufort_wmos).to_dataframe() +ross_df = argopy.DataFetcher().float(ross_wmos).to_dataframe() + +fig, axes = plt.subplots(2, 2, sharex=False, sharey=True, constrained_layout=True) +for axrow, varname in zip(axes, ['TEMP', 'PSAL']): + for ax, df in zip(axrow, [beaufort_df, ross_df]): + # remove bad conductivity values from one float w/ broken cell + df = df.loc[df.PSAL > 30] + sns.scatterplot( + data=df, x=varname, y='PRES', + hue='PLATFORM_NUMBER', + palette='Set2', ax=ax, linewidth=0.2 + ) +axes[0,0].set_ylim((2050, -50)) +axes[0,0].set_title('Beaufort Sea', loc='left', fontweight='bold') +axes[0,1].set_title('Ross Sea', loc='left', fontweight='bold') +axes[0,0].legend(loc=3, fontsize=10) +axes[0,1].legend(loc=3, fontsize=10) +axes[1,0].get_legend().remove() +axes[1,1].get_legend().remove() +fig.set_size_inches(fig.get_figwidth(), 1.66*fig.get_figheight()) +plt.show() +``` diff --git a/_posts/2024-02-15-canadian-polar-deployments/canadian-polar-deployments.html b/_posts/2024-02-15-canadian-polar-deployments/canadian-polar-deployments.html new file mode 100644 index 0000000..3822839 --- /dev/null +++ b/_posts/2024-02-15-canadian-polar-deployments/canadian-polar-deployments.html @@ -0,0 +1,1740 @@ + + + + +
+ + + + + + + + + + + + + + + +A brief overview of recent deployments of Canadian floats in polar oceans.
+In this post we will summarize recent polar deployments of NKE ARVOR and look at their initial data. The deployments occurred in the Beaufort Sea in the Arctic Ocean, North of Alaska/Northwest Territories and the Ross Sea in the Southern Ocean. Ice avoidance parameters for each region will be shown.
+All data will be pulled from the GDAC using argopy, code can be expanded in each section.
+### imports and setup
+
+import argopy
+
+from pathlib import Path
+from netCDF4 import Dataset
+import numpy as np
+
+import matplotlib.pyplot as plt
+import matplotlib.path as mpath
+import cmocean.cm as cmo
+
+import seaborn as sns
+set(style="ticks", palette="colorblind")
+ sns.
+import cartopy.crs as ccrs
+import cartopy.feature as cfeature
Recent polar region deployments consist of 2 floats (4902610, 4902611) deployed in the Beaufort Sea by the Louis S. St. Laurent in September 2023, and 5 floats (4902664, 4902665, 4902667, 4902668, 4902669) deployed in the Ross Sea by the Italian ship Laura Bassi.
+# define some useful mapping functions
+def polarCentral_set_latlim(lat_lims, ax):
+-180, 180, lat_lims[0], lat_lims[1]], ccrs.PlateCarree())
+ ax.set_extent([# Compute a circle in axes coordinates, which we can use as a boundary
+ # for the map. We can pan/zoom as much as we like - the boundary will be
+ # permanently circular.
+ = np.linspace(0, 2*np.pi, 100)
+ theta = [0.5, 0.5], 0.5
+ center, radius = np.vstack([np.sin(theta), np.cos(theta)]).T
+ verts = mpath.Path(verts * radius + center)
+ circle
+ =ax.transAxes)
+ ax.set_boundary(circle, transform
+def add_map_features(ax):
+
+ ax.coastlines()= ax.gridlines()
+ gl
+ ax.add_feature(cfeature.BORDERS)
+ ax.add_feature(cfeature.LAND)= ax.gridlines(draw_labels=True)
+ gl
+
+# wmo numbers of the floats
+= [4902610, 4902611]
+ beaufort_wmos = [4902664, 4902665, 4902667, 4902668, 4902669]
+ ross_wmos
+# grab Argo index for each group
+= argopy.ArgoIndex().load()
+ index = index.search_wmo(beaufort_wmos).to_dataframe()
+ beaufort_ix = index.search_wmo(ross_wmos).to_dataframe()
+ ross_ix
+# geo axis figures
+= plt.figure(constrained_layout=True)
+ fig = [
+ axes 1, 2, 1, projection=ccrs.NorthPolarStereo()),
+ fig.add_subplot(1, 2, 2, projection=ccrs.SouthPolarStereo())
+ fig.add_subplot(
+ ]
+# bathymetry for plot
+= Path('/Users/GordonC/Documents/data/GEBCO/GEBCO_2020.nc')
+ bath_file = Dataset(bath_file)
+ bath = bath['lat'][:]
+ blat = bath['lon'][:]
+ blon = bath['elevation'][:]
+ elev
+# subset/decimate bathymetry - really big array
+= np.logical_or(blat > 60, blat < -65)
+ iy
+= blat[iy]
+ blat = elev[iy,:]
+ elev = -np.ma.masked_array(elev.data, elev > 0)
+ elev
+= 20
+ N = blat[::N]
+ blat = blon[::N]
+ blon = elev[::N,:]
+ elev = elev[:,::N]
+ elev
+for ix, ax in zip([beaufort_ix, ross_ix], axes):
+# add bathymetry
+ = ax.contourf(
+ im list(range(0, 3800, 200)),
+ blon, blat, elev, =ccrs.PlateCarree(),
+ transform=cmo.deep,
+ cmap=0, extend='max'
+ vmin
+ )
+ # plot profiles so far
+
+ sns.scatterplot(=ix, x='longitude', y='latitude',
+ data='wmo', ax=ax, palette='Set2',
+ hue=ccrs.PlateCarree()
+ transform
+ )
+ add_map_features(ax)
+# move legend so somewhere more friendly
+0].legend(loc=3, bbox_to_anchor=(-0.25, 0.0))
+ axes[1].legend(loc=4, bbox_to_anchor=(1.25, 0.0))
+ axes[
+# set limits
+65, 90], axes[0])
+ polarCentral_set_latlim([-70, -90], axes[1])
+ polarCentral_set_latlim([
+0].set_title('Arctic Ocean - Beaufort Sea upper left', loc='left', fontsize=8, fontweight='bold')
+ axes[1].set_title('Southern Ocean - Ross Sea lower left', loc='left', fontsize=8, fontweight='bold')
+ axes[
+ plt.show()
In addition to the basic configuration described here, complete ice avoidance parameters can be found on the Argo Canada data management github page. The Ice Sensing Algorithm (ISA) works by measuring temperatures in a defined near-surface depth window, and if the median temperature is lower than the threshold temperature set by the user, inferring that there will be ice coverage above. Clearly, the proper threshold temperature will depend on the region and water properties, and so should be carefully selected.
+Parameter | +Beaufort.Sea.Value | +Ross.Sea.Value | +
---|---|---|
Start Pressure Detection | +20.0 | +50.000 | +
Stop Pressure Detection | +10.0 | +30.000 | +
Temperature Threshold | +-1.8 | +-1.225 | +
= df = argopy.DataFetcher().float(beaufort_wmos).to_dataframe()
+ beaufort_df = argopy.DataFetcher().float(ross_wmos).to_dataframe()
+ ross_df
+= plt.subplots(2, 2, sharex=False, sharey=True, constrained_layout=True)
+ fig, axes for axrow, varname in zip(axes, ['TEMP', 'PSAL']):
+for ax, df in zip(axrow, [beaufort_df, ross_df]):
+ # remove bad conductivity values from one float w/ broken cell
+ = df.loc[df.PSAL > 30]
+ df
+ sns.scatterplot(=df, x=varname, y='PRES',
+ data='PLATFORM_NUMBER',
+ hue='Set2', ax=ax, linewidth=0.2
+ palette
+ )0,0].set_ylim((2050, -50)) axes[
(2050.0, -50.0)
+0,0].set_title('Beaufort Sea', loc='left', fontweight='bold')
+ axes[0,1].set_title('Ross Sea', loc='left', fontweight='bold')
+ axes[0,0].legend(loc=3, fontsize=10)
+ axes[0,1].legend(loc=3, fontsize=10)
+ axes[1,0].get_legend().remove()
+ axes[1,1].get_legend().remove()
+ axes[1.66*fig.get_figheight())
+ fig.set_size_inches(fig.get_figwidth(), plt.show()
`,e.githubCompareUpdatesUrl&&(t+=`View all changes to this article since it was first published.`),t+=` + If you see mistakes or want to suggest changes, please create an issue on GitHub.
+ `);const n=e.journal;return'undefined'!=typeof n&&'Distill'===n.title&&(t+=` +Diagrams and text are licensed under Creative Commons Attribution CC-BY 4.0 with the source available on GitHub, unless noted otherwise. The figures that have been reused from other sources don’t fall under this license and can be recognized by a note in their caption: “Figure from …”.
+ `),'undefined'!=typeof e.publishedDate&&(t+=` +For attribution in academic contexts, please cite this work as
+${e.concatenatedAuthors}, "${e.title}", Distill, ${e.publishedYear}.+
BibTeX citation
+${m(e)}+ `),t}var An=Math.sqrt,En=Math.atan2,Dn=Math.sin,Mn=Math.cos,On=Math.PI,Un=Math.abs,In=Math.pow,Nn=Math.LN10,jn=Math.log,Rn=Math.max,qn=Math.ceil,Fn=Math.floor,Pn=Math.round,Hn=Math.min;const zn=['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],Bn=['Jan.','Feb.','March','April','May','June','July','Aug.','Sept.','Oct.','Nov.','Dec.'],Wn=(e)=>10>e?'0'+e:e,Vn=function(e){const t=zn[e.getDay()].substring(0,3),n=Wn(e.getDate()),i=Bn[e.getMonth()].substring(0,3),a=e.getFullYear().toString(),d=e.getUTCHours().toString(),r=e.getUTCMinutes().toString(),o=e.getUTCSeconds().toString();return`${t}, ${n} ${i} ${a} ${d}:${r}:${o} Z`},$n=function(e){const t=Array.from(e).reduce((e,[t,n])=>Object.assign(e,{[t]:n}),{});return t},Jn=function(e){const t=new Map;for(var n in e)e.hasOwnProperty(n)&&t.set(n,e[n]);return t};class Qn{constructor(e){this.name=e.author,this.personalURL=e.authorURL,this.affiliation=e.affiliation,this.affiliationURL=e.affiliationURL,this.affiliations=e.affiliations||[]}get firstName(){const e=this.name.split(' ');return e.slice(0,e.length-1).join(' ')}get lastName(){const e=this.name.split(' ');return e[e.length-1]}}class Gn{constructor(){this.title='unnamed article',this.description='',this.authors=[],this.bibliography=new Map,this.bibliographyParsed=!1,this.citations=[],this.citationsCollected=!1,this.journal={},this.katex={},this.publishedDate=void 0}set url(e){this._url=e}get url(){if(this._url)return this._url;return this.distillPath&&this.journal.url?this.journal.url+'/'+this.distillPath:this.journal.url?this.journal.url:void 0}get githubUrl(){return this.githubPath?'https://github.com/'+this.githubPath:void 0}set previewURL(e){this._previewURL=e}get previewURL(){return this._previewURL?this._previewURL:this.url+'/thumbnail.jpg'}get publishedDateRFC(){return Vn(this.publishedDate)}get updatedDateRFC(){return Vn(this.updatedDate)}get publishedYear(){return this.publishedDate.getFullYear()}get publishedMonth(){return Bn[this.publishedDate.getMonth()]}get publishedDay(){return this.publishedDate.getDate()}get publishedMonthPadded(){return Wn(this.publishedDate.getMonth()+1)}get publishedDayPadded(){return Wn(this.publishedDate.getDate())}get publishedISODateOnly(){return this.publishedDate.toISOString().split('T')[0]}get volume(){const e=this.publishedYear-2015;if(1>e)throw new Error('Invalid publish date detected during computing volume');return e}get issue(){return this.publishedDate.getMonth()+1}get concatenatedAuthors(){if(2
tag. We found the following text: '+t);const n=document.createElement('span');n.innerHTML=e.nodeValue,e.parentNode.insertBefore(n,e),e.parentNode.removeChild(e)}}}}).observe(this,{childList:!0})}}var Ti='undefined'==typeof window?'undefined'==typeof global?'undefined'==typeof self?{}:self:global:window,_i=f(function(e,t){(function(e){function t(){this.months=['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec'],this.notKey=[',','{','}',' ','='],this.pos=0,this.input='',this.entries=[],this.currentEntry='',this.setInput=function(e){this.input=e},this.getEntries=function(){return this.entries},this.isWhitespace=function(e){return' '==e||'\r'==e||'\t'==e||'\n'==e},this.match=function(e,t){if((void 0==t||null==t)&&(t=!0),this.skipWhitespace(t),this.input.substring(this.pos,this.pos+e.length)==e)this.pos+=e.length;else throw'Token mismatch, expected '+e+', found '+this.input.substring(this.pos);this.skipWhitespace(t)},this.tryMatch=function(e,t){return(void 0==t||null==t)&&(t=!0),this.skipWhitespace(t),this.input.substring(this.pos,this.pos+e.length)==e},this.matchAt=function(){for(;this.input.length>this.pos&&'@'!=this.input[this.pos];)this.pos++;return!('@'!=this.input[this.pos])},this.skipWhitespace=function(e){for(;this.isWhitespace(this.input[this.pos]);)this.pos++;if('%'==this.input[this.pos]&&!0==e){for(;'\n'!=this.input[this.pos];)this.pos++;this.skipWhitespace(e)}},this.value_braces=function(){var e=0;this.match('{',!1);for(var t=this.pos,n=!1;;){if(!n)if('}'==this.input[this.pos]){if(0 =k&&(++x,i=k);if(d[x]instanceof n||d[T-1].greedy)continue;w=T-x,y=e.slice(i,k),v.index-=i}if(v){g&&(h=v[1].length);var S=v.index+h,v=v[0].slice(h),C=S+v.length,_=y.slice(0,S),L=y.slice(C),A=[x,w];_&&A.push(_);var E=new n(o,u?a.tokenize(v,u):v,b,v,f);A.push(E),L&&A.push(L),Array.prototype.splice.apply(d,A)}}}}}return d},hooks:{all:{},add:function(e,t){var n=a.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=a.hooks.all[e];if(n&&n.length)for(var d,r=0;d=n[r++];)d(t)}}},i=a.Token=function(e,t,n,i,a){this.type=e,this.content=t,this.alias=n,this.length=0|(i||'').length,this.greedy=!!a};if(i.stringify=function(e,t,n){if('string'==typeof e)return e;if('Array'===a.util.type(e))return e.map(function(n){return i.stringify(n,t,e)}).join('');var d={type:e.type,content:i.stringify(e.content,t,n),tag:'span',classes:['token',e.type],attributes:{},language:t,parent:n};if('comment'==d.type&&(d.attributes.spellcheck='true'),e.alias){var r='Array'===a.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(d.classes,r)}a.hooks.run('wrap',d);var l=Object.keys(d.attributes).map(function(e){return e+'="'+(d.attributes[e]||'').replace(/"/g,'"')+'"'}).join(' ');return'<'+d.tag+' class="'+d.classes.join(' ')+'"'+(l?' '+l:'')+'>'+d.content+''+d.tag+'>'},!t.document)return t.addEventListener?(t.addEventListener('message',function(e){var n=JSON.parse(e.data),i=n.language,d=n.code,r=n.immediateClose;t.postMessage(a.highlight(d,a.languages[i],i)),r&&t.close()},!1),t.Prism):t.Prism;var d=document.currentScript||[].slice.call(document.getElementsByTagName('script')).pop();return d&&(a.filename=d.src,document.addEventListener&&!d.hasAttribute('data-manual')&&('loading'===document.readyState?document.addEventListener('DOMContentLoaded',a.highlightAll):window.requestAnimationFrame?window.requestAnimationFrame(a.highlightAll):window.setTimeout(a.highlightAll,16))),t.Prism}();e.exports&&(e.exports=n),'undefined'!=typeof Ti&&(Ti.Prism=n),n.languages.markup={comment://,prolog:/<\?[\w\W]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i,inside:{punctuation:/[=>"']/}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/?[\da-z]{1,8};/i},n.hooks.add('wrap',function(e){'entity'===e.type&&(e.attributes.title=e.content.replace(/&/,'&'))}),n.languages.xml=n.languages.markup,n.languages.html=n.languages.markup,n.languages.mathml=n.languages.markup,n.languages.svg=n.languages.markup,n.languages.css={comment:/\/\*[\w\W]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^\{\}\s][^\{\};]*?(?=\s*\{)/,string:{pattern:/("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,greedy:!0},property:/(\b|\B)[\w-]+(?=\s*:)/i,important:/\B!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},n.languages.css.atrule.inside.rest=n.util.clone(n.languages.css),n.languages.markup&&(n.languages.insertBefore('markup','tag',{style:{pattern:/(
+
+
+ ${e.map(l).map((e)=>`
`)}}const Mi=`
+d-citation-list {
+ contain: layout style;
+}
+
+d-citation-list .references {
+ grid-column: text;
+}
+
+d-citation-list .references .title {
+ font-weight: 500;
+}
+`;class Oi extends HTMLElement{static get is(){return'd-citation-list'}connectedCallback(){this.hasAttribute('distill-prerendered')||(this.style.display='none')}set citations(e){x(this,e)}}var Ui=f(function(e){var t='undefined'==typeof window?'undefined'!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{}:window,n=function(){var e=/\blang(?:uage)?-(\w+)\b/i,n=0,a=t.Prism={util:{encode:function(e){return e instanceof i?new i(e.type,a.util.encode(e.content),e.alias):'Array'===a.util.type(e)?e.map(a.util.encode):e.replace(/&/g,'&').replace(/e.length)break tokenloop;if(!(y instanceof n)){c.lastIndex=0;var v=c.exec(y),w=1;if(!v&&f&&x!=d.length-1){if(c.lastIndex=i,v=c.exec(e),!v)break;for(var S=v.index+(g?v[1].length:0),C=v.index+v[0].length,T=x,k=i,p=d.length;T
+
+`);class Ni extends ei(Ii(HTMLElement)){renderContent(){if(this.languageName=this.getAttribute('language'),!this.languageName)return void console.warn('You need to provide a language attribute to your
Footnotes
+
+`,!1);class Fi extends qi(HTMLElement){connectedCallback(){super.connectedCallback(),this.list=this.root.querySelector('ol'),this.root.style.display='none'}set footnotes(e){if(this.list.innerHTML='',e.length){this.root.style.display='';for(const t of e){const e=document.createElement('li');e.id=t.id+'-listing',e.innerHTML=t.innerHTML;const n=document.createElement('a');n.setAttribute('class','footnote-backlink'),n.textContent='[\u21A9]',n.href='#'+t.id,e.appendChild(n),this.list.appendChild(e)}}else this.root.style.display='none'}}const Pi=ti('d-hover-box',`
+
+
+