From 0ef46938eabbf41f4962b081853343b9cfb8300a Mon Sep 17 00:00:00 2001 From: cmpadden Date: Tue, 18 Jun 2024 03:37:06 +0000 Subject: [PATCH] deploy: 1d4425cf14428b28c75f4b5bd0c2357c17d887dd --- 200.html | 14 ++--- 404.html | 14 ++--- _nuxt/{Dr9mNFSB.js => 0JocX12m.js} | 2 +- _nuxt/{BlPTAj4D.js => 2n9fv25W.js} | 2 +- _nuxt/{BjpF7IbB.js => 5trsyYT2.js} | 2 +- _nuxt/AYZ4hdKF.js | 1 + _nuxt/AZz_nUEh.js | 1 - _nuxt/ApVjjWDH.js | 1 + _nuxt/{DnPT5WRD.js => B519It_T.js} | 2 +- _nuxt/B5Zj_RT4.js | 1 + _nuxt/{BNS4yJEB.js => B9SonXqr.js} | 2 +- _nuxt/{CPjbdFE6.js => BA65R9a-.js} | 2 +- _nuxt/{DmJB5K9d.js => BC8i9gG8.js} | 2 +- _nuxt/{DQ54uNhR.js => BDB7Hltw.js} | 2 +- _nuxt/BH04L1rH.js | 1 - _nuxt/{CvtpGHRQ.js => BIMfceTU.js} | 2 +- _nuxt/{CCMBC9ge.js => BJC4by4G.js} | 2 +- _nuxt/{DNf9KyJp.js => BS17ih1w.js} | 2 +- _nuxt/{BVJrLhrR.js => BUMyNB6i.js} | 2 +- _nuxt/{W6vbqLg7.js => BYBkJnue.js} | 2 +- _nuxt/{DIITZ_oT.js => BYuD9A8v.js} | 2 +- _nuxt/{DcN9AMIU.js => Baum9BnE.js} | 2 +- _nuxt/{NhjOPkCk.js => BlOjJ08E.js} | 2 +- _nuxt/{CAzXSrXZ.js => Bs6eKMw6.js} | 4 +- _nuxt/C-Ppi5pl.js | 1 - _nuxt/C2Jkzvlm.js | 1 - _nuxt/{4Lx8IeLa.js => C4mBrkTM.js} | 2 +- _nuxt/{BPc1APT0.js => CDtnVs50.js} | 2 +- _nuxt/{DmysA0Ea.js => CHcL3rNM.js} | 2 +- _nuxt/{B0OY2XLG.js => CJDBQGN9.js} | 2 +- _nuxt/{5U82x1xs.js => CLHUyLrC.js} | 2 +- _nuxt/CMLPrMyp.js | 1 + _nuxt/{Dw8zNcBR.js => CNKvkIMX.js} | 2 +- _nuxt/{BDqtaPAc.js => CRsxnQ9b.js} | 2 +- _nuxt/CV7OJtEk.js | 1 - _nuxt/{B4E9Ejgf.js => C_BaIC7i.js} | 2 +- _nuxt/{BJeRYyju.js => Caz8YKf-.js} | 2 +- _nuxt/CdNF5em2.js | 1 + _nuxt/CeHv7BBr.js | 1 + _nuxt/Ch5M0tju.js | 1 - _nuxt/{WlOj4iQ2.js => ChudRan8.js} | 2 +- _nuxt/{D49jv_td.js => Ci5PNU3b.js} | 2 +- _nuxt/CnVOBpLY.js | 1 + _nuxt/Cr8785qx.js | 1 - _nuxt/{BHKXDL_d.js => CsZz-VVf.js} | 2 +- _nuxt/{D9cQXS52.js => Cu-2mm29.js} | 2 +- _nuxt/{C0BUAfVO.js => CuqDoC_G.js} | 2 +- _nuxt/CvX9Ic8u.js | 1 - _nuxt/{4sYS9Rtn.js => CvplexO3.js} | 2 +- _nuxt/{DTidYmMf.js => D2RhQ0-u.js} | 2 +- _nuxt/D5N360oS.js | 1 + _nuxt/{CHAMBAea.js => DCWpba_A.js} | 2 +- _nuxt/{DPT0E5C3.js => DFeiu82-.js} | 2 +- _nuxt/{iK2nAm-v.js => DGNm3EUI.js} | 2 +- _nuxt/{BfNsWvZZ.js => DMZU-7l4.js} | 2 +- _nuxt/{Bay-NfhX.js => DQhOff_n.js} | 2 +- _nuxt/DQogfMZl.js | 1 - _nuxt/{Gu-IR7O7.js => DQvQFzcx.js} | 2 +- _nuxt/{D5qHgTT0.js => DUcsjegF.js} | 2 +- _nuxt/DYvJhXU5.js | 1 - _nuxt/{YbSleFl9.js => DaxLFRA2.js} | 2 +- _nuxt/{DKX5xB3o.js => DcKYe_Up.js} | 2 +- _nuxt/DdxBPLFy.js | 1 - _nuxt/DlZNh5M8.js | 1 + _nuxt/{DO2yUAnP.js => DsNrITmQ.js} | 2 +- _nuxt/Dtbyl6G-.js | 1 + _nuxt/{PQfcYOpS.js => DuiePBtr.js} | 2 +- _nuxt/DvLvbVZ0.js | 1 + _nuxt/DwbcVy96.js | 1 - _nuxt/DxveBo0P.js | 1 + _nuxt/DzLfPs8s.js | 1 - _nuxt/{7iwyPdUt.js => JctMNniL.js} | 4 +- _nuxt/builds/latest.json | 2 +- .../640f2415-89a1-4503-8629-242d808edc3c.json | 1 - .../d8634a4e-ab1a-4045-9220-3f7d159ce250.json | 1 + _nuxt/{DlW6eYPj.js => ch9Af6jL.js} | 2 +- _nuxt/gFw6sSaE.js | 1 - _nuxt/{DXsCzSxj.js => gOhWOHN0.js} | 8 +-- _nuxt/{D_k-9tiD.js => gtS2INEI.js} | 2 +- _nuxt/jWTPnbSg.js | 1 + _nuxt/{CgyoODLv.js => nX1iBwjm.js} | 2 +- _nuxt/qyNTjY-r.js | 1 - _nuxt/{CKgGom8U.js => tFc0TBNA.js} | 2 +- _nuxt/uM6gdZzG.js | 1 + _payload.json | 2 +- ...28834464.json => cache.1718681810623.json} | 2 +- ...464.json => 0ikQYfLQVZ.1718681810623.json} | 0 ...464.json => 0vuDGaHulu.1718681810623.json} | 0 ...464.json => 1BkkvizQw8.1718681810623.json} | 0 ...464.json => AwYZnKuAHr.1718681810623.json} | 0 ...464.json => C0SimRluqy.1718681810623.json} | 0 ...464.json => DIau8q3IMV.1718681810623.json} | 0 ...464.json => PYi9meWOqm.1718681810623.json} | 0 ...464.json => QB64GpMlA8.1718681810623.json} | 0 ...464.json => SFFy74pu72.1718681810623.json} | 0 ...464.json => TxpJ5sv0HY.1718681810623.json} | 0 ...464.json => bXj5vj6Ts0.1718681810623.json} | 0 ...464.json => cOxeB6k0CX.1718681810623.json} | 0 ...464.json => lIKyXFs9L8.1718681810623.json} | 0 ...464.json => ph6vNEpVOi.1718681810623.json} | 0 ...464.json => wVY7dvWXwt.1718681810623.json} | 0 ...464.json => x8mzqct7Ta.1718681810623.json} | 0 articles/_payload.json | 2 +- articles/apu2-firmware-upgrade/_payload.json | 2 +- articles/apu2-firmware-upgrade/index.html | 52 ++++++++--------- articles/docker-selinux-volumes/_payload.json | 2 +- articles/docker-selinux-volumes/index.html | 54 +++++++++--------- articles/doctl/_payload.json | 2 +- articles/doctl/index.html | 46 +++++++-------- .../fennel-initial-exploration/_payload.json | 2 +- .../fennel-initial-exploration/index.html | 52 ++++++++--------- articles/index.html | 38 ++++++------ .../_payload.json | 2 +- .../index.html | 44 +++++++------- articles/nuxt-content-rss-feed/_payload.json | 2 +- articles/nuxt-content-rss-feed/index.html | 46 +++++++-------- articles/nuxt-v3-migration/_payload.json | 2 +- articles/nuxt-v3-migration/index.html | 42 +++++++------- .../persistent-archlinux-usb/_payload.json | 2 +- articles/persistent-archlinux-usb/index.html | 54 +++++++++--------- .../_payload.json | 2 +- .../index.html | 46 +++++++-------- .../_payload.json | 2 +- .../index.html | 46 +++++++-------- .../_payload.json | 2 +- .../index.html | 46 +++++++-------- articles/ssh-ed25519-sk-yubikey/_payload.json | 2 +- articles/ssh-ed25519-sk-yubikey/index.html | 48 ++++++++-------- .../_payload.json | 2 +- .../index.html | 52 ++++++++--------- .../vim-fugitive-gpg-pinentry/_payload.json | 2 +- articles/vim-fugitive-gpg-pinentry/index.html | 46 +++++++-------- atom/index.html | 2 +- card/_payload.json | 2 +- card/index.html | 19 +++--- examples/nested_transitions/_payload.json | 2 +- examples/nested_transitions/index.html | 18 +++--- images/previews/metronome.png | Bin 120092 -> 160916 bytes index.html | 25 ++++---- playground/_payload.json | 2 +- playground/audio/_payload.json | 2 +- playground/audio/index.html | 18 +++--- playground/chords/_payload.json | 2 +- playground/chords/index.html | 18 +++--- playground/french/_payload.json | 2 +- playground/french/index.html | 20 +++---- playground/index.html | 20 +++---- playground/matrix/_payload.json | 2 +- playground/matrix/index.html | 18 +++--- playground/metronome/_payload.json | 2 +- playground/metronome/index.html | 18 +++--- playground/midi/_payload.json | 2 +- playground/midi/index.html | 18 +++--- playground/palettes/mountains/_payload.json | 2 +- playground/palettes/mountains/index.html | 18 +++--- playground/palettes/variance/_payload.json | 2 +- playground/palettes/variance/index.html | 18 +++--- playground/plotter/_payload.json | 2 +- playground/plotter/index.html | 18 +++--- playground/tiling/_payload.json | 2 +- playground/tiling/index.html | 18 +++--- playground/waves/_payload.json | 2 +- playground/waves/index.html | 18 +++--- 163 files changed, 613 insertions(+), 616 deletions(-) rename _nuxt/{Dr9mNFSB.js => 0JocX12m.js} (64%) rename _nuxt/{BlPTAj4D.js => 2n9fv25W.js} (65%) rename _nuxt/{BjpF7IbB.js => 5trsyYT2.js} (56%) create mode 100644 _nuxt/AYZ4hdKF.js delete mode 100644 _nuxt/AZz_nUEh.js create mode 100644 _nuxt/ApVjjWDH.js rename _nuxt/{DnPT5WRD.js => B519It_T.js} (98%) create mode 100644 _nuxt/B5Zj_RT4.js rename _nuxt/{BNS4yJEB.js => B9SonXqr.js} (58%) rename _nuxt/{CPjbdFE6.js => BA65R9a-.js} (95%) rename _nuxt/{DmJB5K9d.js => BC8i9gG8.js} (64%) rename _nuxt/{DQ54uNhR.js => BDB7Hltw.js} (53%) delete mode 100644 _nuxt/BH04L1rH.js rename _nuxt/{CvtpGHRQ.js => BIMfceTU.js} (96%) rename _nuxt/{CCMBC9ge.js => BJC4by4G.js} (84%) rename _nuxt/{DNf9KyJp.js => BS17ih1w.js} (64%) rename _nuxt/{BVJrLhrR.js => BUMyNB6i.js} (63%) rename _nuxt/{W6vbqLg7.js => BYBkJnue.js} (93%) rename _nuxt/{DIITZ_oT.js => BYuD9A8v.js} (96%) rename _nuxt/{DcN9AMIU.js => Baum9BnE.js} (79%) rename _nuxt/{NhjOPkCk.js => BlOjJ08E.js} (77%) rename _nuxt/{CAzXSrXZ.js => Bs6eKMw6.js} (92%) delete mode 100644 _nuxt/C-Ppi5pl.js delete mode 100644 _nuxt/C2Jkzvlm.js rename _nuxt/{4Lx8IeLa.js => C4mBrkTM.js} (86%) rename _nuxt/{BPc1APT0.js => CDtnVs50.js} (65%) rename _nuxt/{DmysA0Ea.js => CHcL3rNM.js} (65%) rename _nuxt/{B0OY2XLG.js => CJDBQGN9.js} (78%) rename _nuxt/{5U82x1xs.js => CLHUyLrC.js} (94%) create mode 100644 _nuxt/CMLPrMyp.js rename _nuxt/{Dw8zNcBR.js => CNKvkIMX.js} (64%) rename _nuxt/{BDqtaPAc.js => CRsxnQ9b.js} (87%) delete mode 100644 _nuxt/CV7OJtEk.js rename _nuxt/{B4E9Ejgf.js => C_BaIC7i.js} (65%) rename _nuxt/{BJeRYyju.js => Caz8YKf-.js} (63%) create mode 100644 _nuxt/CdNF5em2.js create mode 100644 _nuxt/CeHv7BBr.js delete mode 100644 _nuxt/Ch5M0tju.js rename _nuxt/{WlOj4iQ2.js => ChudRan8.js} (89%) rename _nuxt/{D49jv_td.js => Ci5PNU3b.js} (79%) create mode 100644 _nuxt/CnVOBpLY.js delete mode 100644 _nuxt/Cr8785qx.js rename _nuxt/{BHKXDL_d.js => CsZz-VVf.js} (65%) rename _nuxt/{D9cQXS52.js => Cu-2mm29.js} (72%) rename _nuxt/{C0BUAfVO.js => CuqDoC_G.js} (52%) delete mode 100644 _nuxt/CvX9Ic8u.js rename _nuxt/{4sYS9Rtn.js => CvplexO3.js} (99%) rename _nuxt/{DTidYmMf.js => D2RhQ0-u.js} (98%) create mode 100644 _nuxt/D5N360oS.js rename _nuxt/{CHAMBAea.js => DCWpba_A.js} (98%) rename _nuxt/{DPT0E5C3.js => DFeiu82-.js} (98%) rename _nuxt/{iK2nAm-v.js => DGNm3EUI.js} (99%) rename _nuxt/{BfNsWvZZ.js => DMZU-7l4.js} (64%) rename _nuxt/{Bay-NfhX.js => DQhOff_n.js} (78%) delete mode 100644 _nuxt/DQogfMZl.js rename _nuxt/{Gu-IR7O7.js => DQvQFzcx.js} (96%) rename _nuxt/{D5qHgTT0.js => DUcsjegF.js} (97%) delete mode 100644 _nuxt/DYvJhXU5.js rename _nuxt/{YbSleFl9.js => DaxLFRA2.js} (93%) rename _nuxt/{DKX5xB3o.js => DcKYe_Up.js} (64%) delete mode 100644 _nuxt/DdxBPLFy.js create mode 100644 _nuxt/DlZNh5M8.js rename _nuxt/{DO2yUAnP.js => DsNrITmQ.js} (79%) create mode 100644 _nuxt/Dtbyl6G-.js rename _nuxt/{PQfcYOpS.js => DuiePBtr.js} (64%) create mode 100644 _nuxt/DvLvbVZ0.js delete mode 100644 _nuxt/DwbcVy96.js create mode 100644 _nuxt/DxveBo0P.js delete mode 100644 _nuxt/DzLfPs8s.js rename _nuxt/{7iwyPdUt.js => JctMNniL.js} (74%) delete mode 100644 _nuxt/builds/meta/640f2415-89a1-4503-8629-242d808edc3c.json create mode 100644 _nuxt/builds/meta/d8634a4e-ab1a-4045-9220-3f7d159ce250.json rename _nuxt/{DlW6eYPj.js => ch9Af6jL.js} (65%) delete mode 100644 _nuxt/gFw6sSaE.js rename _nuxt/{DXsCzSxj.js => gOhWOHN0.js} (92%) rename _nuxt/{D_k-9tiD.js => gtS2INEI.js} (89%) create mode 100644 _nuxt/jWTPnbSg.js rename _nuxt/{CgyoODLv.js => nX1iBwjm.js} (82%) delete mode 100644 _nuxt/qyNTjY-r.js rename _nuxt/{CKgGom8U.js => tFc0TBNA.js} (93%) create mode 100644 _nuxt/uM6gdZzG.js rename api/_content/{cache.1718428834464.json => cache.1718681810623.json} (99%) rename api/_content/query/{0ikQYfLQVZ.1718428834464.json => 0ikQYfLQVZ.1718681810623.json} (100%) rename api/_content/query/{0vuDGaHulu.1718428834464.json => 0vuDGaHulu.1718681810623.json} (100%) rename api/_content/query/{1BkkvizQw8.1718428834464.json => 1BkkvizQw8.1718681810623.json} (100%) rename api/_content/query/{AwYZnKuAHr.1718428834464.json => AwYZnKuAHr.1718681810623.json} (100%) rename api/_content/query/{C0SimRluqy.1718428834464.json => C0SimRluqy.1718681810623.json} (100%) rename api/_content/query/{DIau8q3IMV.1718428834464.json => DIau8q3IMV.1718681810623.json} (100%) rename api/_content/query/{PYi9meWOqm.1718428834464.json => PYi9meWOqm.1718681810623.json} (100%) rename api/_content/query/{QB64GpMlA8.1718428834464.json => QB64GpMlA8.1718681810623.json} (100%) rename api/_content/query/{SFFy74pu72.1718428834464.json => SFFy74pu72.1718681810623.json} (100%) rename api/_content/query/{TxpJ5sv0HY.1718428834464.json => TxpJ5sv0HY.1718681810623.json} (100%) rename api/_content/query/{bXj5vj6Ts0.1718428834464.json => bXj5vj6Ts0.1718681810623.json} (100%) rename api/_content/query/{cOxeB6k0CX.1718428834464.json => cOxeB6k0CX.1718681810623.json} (100%) rename api/_content/query/{lIKyXFs9L8.1718428834464.json => lIKyXFs9L8.1718681810623.json} (100%) rename api/_content/query/{ph6vNEpVOi.1718428834464.json => ph6vNEpVOi.1718681810623.json} (100%) rename api/_content/query/{wVY7dvWXwt.1718428834464.json => wVY7dvWXwt.1718681810623.json} (100%) rename api/_content/query/{x8mzqct7Ta.1718428834464.json => x8mzqct7Ta.1718681810623.json} (100%) diff --git a/200.html b/200.html index a90bf3b0..b39e181e 100644 --- a/200.html +++ b/200.html @@ -1,9 +1,9 @@ - - - - - -
- \ No newline at end of file + + + + + +
+ \ No newline at end of file diff --git a/404.html b/404.html index a90bf3b0..b39e181e 100644 --- a/404.html +++ b/404.html @@ -1,9 +1,9 @@ - - - - - -
- \ No newline at end of file + + + + + +
+ \ No newline at end of file diff --git a/_nuxt/Dr9mNFSB.js b/_nuxt/0JocX12m.js similarity index 64% rename from _nuxt/Dr9mNFSB.js rename to _nuxt/0JocX12m.js index c92e072e..220a9152 100644 --- a/_nuxt/Dr9mNFSB.js +++ b/_nuxt/0JocX12m.js @@ -1 +1 @@ -import{_ as o,o as r,c as s,a7 as t}from"./DXsCzSxj.js";const c={};function n(e,a){return r(),s("em",null,[t(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; +import{_ as o,o as r,c as s,a7 as t}from"./gOhWOHN0.js";const c={};function n(e,a){return r(),s("em",null,[t(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/BlPTAj4D.js b/_nuxt/2n9fv25W.js similarity index 65% rename from _nuxt/BlPTAj4D.js rename to _nuxt/2n9fv25W.js index 21fc7f59..644289ae 100644 --- a/_nuxt/BlPTAj4D.js +++ b/_nuxt/2n9fv25W.js @@ -1 +1 @@ -import{_ as o,o as n,c as r,a7 as c}from"./DXsCzSxj.js";const s={};function t(e,a){return n(),r("code",null,[c(e.$slots,"default")])}const _=o(s,[["render",t]]);export{_ as default}; +import{_ as o,o as n,c as r,a7 as c}from"./gOhWOHN0.js";const s={};function t(e,a){return n(),r("code",null,[c(e.$slots,"default")])}const _=o(s,[["render",t]]);export{_ as default}; diff --git a/_nuxt/BjpF7IbB.js b/_nuxt/5trsyYT2.js similarity index 56% rename from _nuxt/BjpF7IbB.js rename to _nuxt/5trsyYT2.js index 14b30bbe..64c315eb 100644 --- a/_nuxt/BjpF7IbB.js +++ b/_nuxt/5trsyYT2.js @@ -1 +1 @@ -import{_ as r,a7 as t}from"./DXsCzSxj.js";const s={};function n(e,o){return t(e.$slots,"default")}const c=r(s,[["render",n]]);export{c as default}; +import{_ as r,a7 as t}from"./gOhWOHN0.js";const s={};function n(e,o){return t(e.$slots,"default")}const c=r(s,[["render",n]]);export{c as default}; diff --git a/_nuxt/AYZ4hdKF.js b/_nuxt/AYZ4hdKF.js new file mode 100644 index 00000000..f8450a6f --- /dev/null +++ b/_nuxt/AYZ4hdKF.js @@ -0,0 +1 @@ +import{d as i,H as c,v as p,o as s,c as n,a as u,a7 as t}from"./gOhWOHN0.js";const f=["id"],l=["href"],k=i({__name:"ProseH4",props:{id:{}},setup(a){const r=a,{headings:o}=c().public.mdc,d=p(()=>{var e;return r.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h4)});return(e,m)=>(s(),n("h4",{id:e.id},[e.id&&u(d)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,l)):t(e.$slots,"default",{key:1})],8,f))}});export{k as default}; diff --git a/_nuxt/AZz_nUEh.js b/_nuxt/AZz_nUEh.js deleted file mode 100644 index f30a6bf9..00000000 --- a/_nuxt/AZz_nUEh.js +++ /dev/null @@ -1 +0,0 @@ -import{d as i,H as c,p,o as s,c as n,a as u,a7 as t}from"./DXsCzSxj.js";const f=["id"],l=["href"],k=i({__name:"ProseH6",props:{id:{}},setup(a){const r=a,{headings:o}=c().public.mdc,d=p(()=>{var e;return r.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h6)});return(e,m)=>(s(),n("h6",{id:e.id},[e.id&&u(d)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,l)):t(e.$slots,"default",{key:1})],8,f))}});export{k as default}; diff --git a/_nuxt/ApVjjWDH.js b/_nuxt/ApVjjWDH.js new file mode 100644 index 00000000..0e0d2eea --- /dev/null +++ b/_nuxt/ApVjjWDH.js @@ -0,0 +1 @@ +import{d as i,H as c,v as p,o as s,c as n,a as u,a7 as t}from"./gOhWOHN0.js";const f=["id"],l=["href"],k=i({__name:"ProseH6",props:{id:{}},setup(a){const r=a,{headings:o}=c().public.mdc,d=p(()=>{var e;return r.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h6)});return(e,m)=>(s(),n("h6",{id:e.id},[e.id&&u(d)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,l)):t(e.$slots,"default",{key:1})],8,f))}});export{k as default}; diff --git a/_nuxt/DnPT5WRD.js b/_nuxt/B519It_T.js similarity index 98% rename from _nuxt/DnPT5WRD.js rename to _nuxt/B519It_T.js index 550f4119..9d657dd6 100644 --- a/_nuxt/DnPT5WRD.js +++ b/_nuxt/B519It_T.js @@ -1 +1 @@ -import{d as j,$ as ln,a1 as en,p as w,K as z,a2 as on,a3 as P,a4 as tn,a5 as rn,o as an,D as un,a as sn}from"./DXsCzSxj.js";import{p as F,k as cn}from"./C-v3KzvZ.js";import{u as pn}from"./BDqtaPAc.js";class S{constructor(l,o,t){this.property=l,this.normal=o,t&&(this.space=t)}}S.prototype.property={};S.prototype.normal={};S.prototype.space=null;function H(n,l){const o={},t={};let r=-1;for(;++r4&&o.slice(0,4)==="data"&&fn.test(l)){if(l.charAt(4)==="-"){const a=l.slice(5).replace(_,kn);t="data"+a.charAt(0).toUpperCase()+a.slice(1)}else{const a=l.slice(4);if(!_.test(a)){let i=a.replace(yn,bn);i.charAt(0)!=="-"&&(i="-"+i),l="data"+i}}r=T}return new r(t,l)}function bn(n){return"-"+n.toLowerCase()}function kn(n){return n.charAt(1).toUpperCase()}const Cn=H([q,N,X,Y,hn],"html");H([q,N,X,Y,mn],"svg");const A=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","math","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"],R="default",$=/^@|^v-on:/,Z=/^:|^v-bind:/,J=/^v-model/,Sn=["select","textarea","input"],xn=Object.fromEntries(["p","a","blockquote","code","pre","code","em","h1","h2","h3","h4","h5","h6","hr","img","ul","ol","li","strong","table","thead","tbody","td","th","tr","script"].map(n=>[n,`prose-${n}`])),wn=j({name:"MDCRenderer",props:{body:{type:Object,required:!0},data:{type:Object,default:()=>({})},tag:{type:[String,Boolean],default:void 0},prose:{type:Boolean,default:void 0},components:{type:Object,default:()=>({})}},async setup(n){var i,s,c,g,f,p,y,B;const l=(c=(s=(i=ln())==null?void 0:i.appContext)==null?void 0:s.app)==null?void 0:c.$nuxt,o=(l==null?void 0:l.$route)||(l==null?void 0:l._route),{mdc:t}=((g=l==null?void 0:l.$config)==null?void 0:g.public)||{},r={...(f=t==null?void 0:t.components)!=null&&f.prose&&n.prose!==!1?xn:{},...((p=t==null?void 0:t.components)==null?void 0:p.map)||{},...en(((B=(y=n.data)==null?void 0:y.mdc)==null?void 0:B.components)||{}),...n.components},a=w(()=>{var U;const nn=(((U=n.body)==null?void 0:U.children)||[]).map(x=>x.tag||x.type).filter(x=>!A.includes(x));return Array.from(new Set(nn)).sort().join(".")});return await Un(n.body,{tags:r}),{tags:r,contentKey:a,route:o}},render(n){var f,p,y;const{tags:l,tag:o,body:t,data:r,contentKey:a,route:i}=n;if(!t)return null;const s={...r,tags:l,$route:i},c=o!==!1?E(o||((f=s.component)==null?void 0:f.name)||s.component||"div"):void 0,g=G(t,z,s,s);return c?z(c,{...(p=s.component)==null?void 0:p.props,...this.$attrs,key:a},g):(y=g.default)==null?void 0:y.call(g)}});function Pn(n,l,o,t={}){if(n.type==="text")return l(P,n.value);if(n.type==="comment")return l(tn,null,n.value);const r=n.tag,a=Q(n,o.tags);if(n.tag==="binding")return On(n,l,o,t);const i=E(a);typeof i=="object"&&(i.tag=r);const s=Dn(n,o);return l(i,s,G(n,l,o,{...t,...s}))}function On(n,l,o,t={}){var g,f;const r={...t,$document:o,$doc:o},a=/\.|\[(\d+)\]/,s=((g=n.props)==null?void 0:g.value.trim().split(a).filter(Boolean)).reduce((p,y)=>{if(p&&y in p)return typeof p[y]=="function"?p[y]():p[y]},r),c=(f=n.props)==null?void 0:f.defaultValue;return l(P,s??c??"")}function G(n,l,o,t){const a=(n.children||[]).reduce((s,c)=>{if(!En(c))return s[R].push(c),s;const g=An(c);return s[g]=s[g]||[],c.type==="element"&&s[g].push(...c.children||[]),s},{[R]:[]});return Object.entries(a).reduce((s,[c,g])=>(g.length&&(s[c]=()=>{const f=g.map(p=>Pn(p,l,o,t));return Bn(f)}),s),{})}function Dn(n,l){const{tag:o="",props:t={}}=n;return Object.keys(t).reduce(function(r,a){if(a==="__ignoreMap")return r;const i=t[a];if(J.test(a)&&!Sn.includes(o))return Ln(a,i,r,l);if(a==="v-bind")return Mn(a,i,r,l);if($.test(a))return Rn(a,i,r,l);if(Z.test(a))return Tn(a,i,r,l);const{attribute:s}=vn(Cn,a);return Array.isArray(i)&&i.every(c=>typeof c=="string")?(r[s]=i.join(" "),r):(r[s]=i,r)},{})}function Ln(n,l,o,t){const r=p=>+p,a=p=>p.trim(),i=p=>p,s=n.replace(J,"").split(".").filter(p=>p).reduce((p,y)=>(p[y]=!0,p),{}),c="value",g=s.lazy?"change":"input",f=s.number?r:s.trim?a:i;return o[c]=O(l,t),o.on=o.on||{},o.on[g]=p=>t[l]=f(p),o}function Mn(n,l,o,t){const r=O(l,t);return o=Object.assign(o,r),o}function Rn(n,l,o,t){return n=n.replace($,""),o.on=o.on||{},o.on[n]=()=>O(l,t),o}function Tn(n,l,o,t){return n=n.replace(Z,""),o[n]=O(l,t),o}const E=n=>{if(!A.includes(n)&&!(n!=null&&n.render)&&!(n!=null&&n.ssrRender)){const l=on(F(n),!1);if(typeof l=="object")return l}return n};function O(n,l){const o=n.split(".").reduce((t,r)=>typeof t=="object"?t[r]:void 0,l);return typeof o>"u"?rn(n):o}function An(n){let l="";for(const o of Object.keys(n.props||{}))if(!(!o.startsWith("#")&&!o.startsWith("v-slot:"))){l=o.split(/[:#]/,2)[1];break}return l||R}function En(n){return n.tag==="template"}function Bn(n){const l=[];for(const o of n){const t=l[l.length-1];o.type===P&&(t==null?void 0:t.type)===P?t.children=t.children+o.children:l.push(o)}return l}async function Un(n,l){if(!n)return;const o=Array.from(new Set(t(n,l)));await Promise.all(o.map(async r=>{if(r!=null&&r.render||r!=null&&r.ssrRender||r!=null&&r.__ssrInlineRender)return;const a=E(r);a!=null&&a.__asyncLoader&&!a.__asyncResolved&&await a.__asyncLoader()}));function t(r,a){const i=r.tag;if(r.type==="text"||i==="binding"||r.type==="comment")return[];const s=Q(r,a.tags),c=[];r.type!=="root"&&!A.includes(s)&&c.push(s);for(const g of r.children||[])c.push(...t(g,a));return c}}function Q(n,l){var t;const o=n.tag;return!o||typeof((t=n.props)==null?void 0:t.__ignoreMap)<"u"?o:l[o]||l[F(o)]||l[cn(n.tag)]||o}const jn=j({__name:"ContentRendererMarkdown",props:{value:{type:Object,required:!0},excerpt:{type:Boolean,default:!1},tag:{type:String,default:"div"},components:{type:Object,default:()=>({})},data:{type:Object,default:()=>({})}},setup(n){const l=n,o=pn().isEnabled(),t=w(()=>{let i=l.value.body||l.value;return l.excerpt&&l.value.excerpt&&(i=l.value.excerpt),i}),r=w(()=>{const{body:i,excerpt:s,...c}=l.value;return{...c,...l.data}}),a=w(()=>({...l.components,...r.value._components||{}}));return(i,s)=>{const c=wn;return an(),un(c,{body:t.value,data:r.value,tag:n.tag,components:a.value,"data-content-id":sn(o)?n.value._id:void 0},null,8,["body","data","tag","components","data-content-id"])}}});export{jn as _}; +import{d as j,$ as ln,a1 as en,v as w,K as z,a2 as on,a3 as P,a4 as tn,a5 as rn,o as an,D as un,a as sn}from"./gOhWOHN0.js";import{p as F,k as cn}from"./C-v3KzvZ.js";import{u as pn}from"./CRsxnQ9b.js";class S{constructor(l,o,t){this.property=l,this.normal=o,t&&(this.space=t)}}S.prototype.property={};S.prototype.normal={};S.prototype.space=null;function H(n,l){const o={},t={};let r=-1;for(;++r4&&o.slice(0,4)==="data"&&fn.test(l)){if(l.charAt(4)==="-"){const a=l.slice(5).replace(_,kn);t="data"+a.charAt(0).toUpperCase()+a.slice(1)}else{const a=l.slice(4);if(!_.test(a)){let i=a.replace(yn,bn);i.charAt(0)!=="-"&&(i="-"+i),l="data"+i}}r=T}return new r(t,l)}function bn(n){return"-"+n.toLowerCase()}function kn(n){return n.charAt(1).toUpperCase()}const Cn=H([q,N,X,Y,hn],"html");H([q,N,X,Y,mn],"svg");const A=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","math","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"],R="default",$=/^@|^v-on:/,Z=/^:|^v-bind:/,J=/^v-model/,Sn=["select","textarea","input"],xn=Object.fromEntries(["p","a","blockquote","code","pre","code","em","h1","h2","h3","h4","h5","h6","hr","img","ul","ol","li","strong","table","thead","tbody","td","th","tr","script"].map(n=>[n,`prose-${n}`])),wn=j({name:"MDCRenderer",props:{body:{type:Object,required:!0},data:{type:Object,default:()=>({})},tag:{type:[String,Boolean],default:void 0},prose:{type:Boolean,default:void 0},components:{type:Object,default:()=>({})}},async setup(n){var i,s,c,g,f,p,y,B;const l=(c=(s=(i=ln())==null?void 0:i.appContext)==null?void 0:s.app)==null?void 0:c.$nuxt,o=(l==null?void 0:l.$route)||(l==null?void 0:l._route),{mdc:t}=((g=l==null?void 0:l.$config)==null?void 0:g.public)||{},r={...(f=t==null?void 0:t.components)!=null&&f.prose&&n.prose!==!1?xn:{},...((p=t==null?void 0:t.components)==null?void 0:p.map)||{},...en(((B=(y=n.data)==null?void 0:y.mdc)==null?void 0:B.components)||{}),...n.components},a=w(()=>{var U;const nn=(((U=n.body)==null?void 0:U.children)||[]).map(x=>x.tag||x.type).filter(x=>!A.includes(x));return Array.from(new Set(nn)).sort().join(".")});return await Un(n.body,{tags:r}),{tags:r,contentKey:a,route:o}},render(n){var f,p,y;const{tags:l,tag:o,body:t,data:r,contentKey:a,route:i}=n;if(!t)return null;const s={...r,tags:l,$route:i},c=o!==!1?E(o||((f=s.component)==null?void 0:f.name)||s.component||"div"):void 0,g=G(t,z,s,s);return c?z(c,{...(p=s.component)==null?void 0:p.props,...this.$attrs,key:a},g):(y=g.default)==null?void 0:y.call(g)}});function Pn(n,l,o,t={}){if(n.type==="text")return l(P,n.value);if(n.type==="comment")return l(tn,null,n.value);const r=n.tag,a=Q(n,o.tags);if(n.tag==="binding")return On(n,l,o,t);const i=E(a);typeof i=="object"&&(i.tag=r);const s=Dn(n,o);return l(i,s,G(n,l,o,{...t,...s}))}function On(n,l,o,t={}){var g,f;const r={...t,$document:o,$doc:o},a=/\.|\[(\d+)\]/,s=((g=n.props)==null?void 0:g.value.trim().split(a).filter(Boolean)).reduce((p,y)=>{if(p&&y in p)return typeof p[y]=="function"?p[y]():p[y]},r),c=(f=n.props)==null?void 0:f.defaultValue;return l(P,s??c??"")}function G(n,l,o,t){const a=(n.children||[]).reduce((s,c)=>{if(!En(c))return s[R].push(c),s;const g=An(c);return s[g]=s[g]||[],c.type==="element"&&s[g].push(...c.children||[]),s},{[R]:[]});return Object.entries(a).reduce((s,[c,g])=>(g.length&&(s[c]=()=>{const f=g.map(p=>Pn(p,l,o,t));return Bn(f)}),s),{})}function Dn(n,l){const{tag:o="",props:t={}}=n;return Object.keys(t).reduce(function(r,a){if(a==="__ignoreMap")return r;const i=t[a];if(J.test(a)&&!Sn.includes(o))return Ln(a,i,r,l);if(a==="v-bind")return Mn(a,i,r,l);if($.test(a))return Rn(a,i,r,l);if(Z.test(a))return Tn(a,i,r,l);const{attribute:s}=vn(Cn,a);return Array.isArray(i)&&i.every(c=>typeof c=="string")?(r[s]=i.join(" "),r):(r[s]=i,r)},{})}function Ln(n,l,o,t){const r=p=>+p,a=p=>p.trim(),i=p=>p,s=n.replace(J,"").split(".").filter(p=>p).reduce((p,y)=>(p[y]=!0,p),{}),c="value",g=s.lazy?"change":"input",f=s.number?r:s.trim?a:i;return o[c]=O(l,t),o.on=o.on||{},o.on[g]=p=>t[l]=f(p),o}function Mn(n,l,o,t){const r=O(l,t);return o=Object.assign(o,r),o}function Rn(n,l,o,t){return n=n.replace($,""),o.on=o.on||{},o.on[n]=()=>O(l,t),o}function Tn(n,l,o,t){return n=n.replace(Z,""),o[n]=O(l,t),o}const E=n=>{if(!A.includes(n)&&!(n!=null&&n.render)&&!(n!=null&&n.ssrRender)){const l=on(F(n),!1);if(typeof l=="object")return l}return n};function O(n,l){const o=n.split(".").reduce((t,r)=>typeof t=="object"?t[r]:void 0,l);return typeof o>"u"?rn(n):o}function An(n){let l="";for(const o of Object.keys(n.props||{}))if(!(!o.startsWith("#")&&!o.startsWith("v-slot:"))){l=o.split(/[:#]/,2)[1];break}return l||R}function En(n){return n.tag==="template"}function Bn(n){const l=[];for(const o of n){const t=l[l.length-1];o.type===P&&(t==null?void 0:t.type)===P?t.children=t.children+o.children:l.push(o)}return l}async function Un(n,l){if(!n)return;const o=Array.from(new Set(t(n,l)));await Promise.all(o.map(async r=>{if(r!=null&&r.render||r!=null&&r.ssrRender||r!=null&&r.__ssrInlineRender)return;const a=E(r);a!=null&&a.__asyncLoader&&!a.__asyncResolved&&await a.__asyncLoader()}));function t(r,a){const i=r.tag;if(r.type==="text"||i==="binding"||r.type==="comment")return[];const s=Q(r,a.tags),c=[];r.type!=="root"&&!A.includes(s)&&c.push(s);for(const g of r.children||[])c.push(...t(g,a));return c}}function Q(n,l){var t;const o=n.tag;return!o||typeof((t=n.props)==null?void 0:t.__ignoreMap)<"u"?o:l[o]||l[F(o)]||l[cn(n.tag)]||o}const jn=j({__name:"ContentRendererMarkdown",props:{value:{type:Object,required:!0},excerpt:{type:Boolean,default:!1},tag:{type:String,default:"div"},components:{type:Object,default:()=>({})},data:{type:Object,default:()=>({})}},setup(n){const l=n,o=pn().isEnabled(),t=w(()=>{let i=l.value.body||l.value;return l.excerpt&&l.value.excerpt&&(i=l.value.excerpt),i}),r=w(()=>{const{body:i,excerpt:s,...c}=l.value;return{...c,...l.data}}),a=w(()=>({...l.components,...r.value._components||{}}));return(i,s)=>{const c=wn;return an(),un(c,{body:t.value,data:r.value,tag:n.tag,components:a.value,"data-content-id":sn(o)?n.value._id:void 0},null,8,["body","data","tag","components","data-content-id"])}}});export{jn as _}; diff --git a/_nuxt/B5Zj_RT4.js b/_nuxt/B5Zj_RT4.js new file mode 100644 index 00000000..20dec762 --- /dev/null +++ b/_nuxt/B5Zj_RT4.js @@ -0,0 +1 @@ +import{d as i,H as c,v as p,o as s,c as n,a as u,a7 as t}from"./gOhWOHN0.js";const f=["id"],l=["href"],k=i({__name:"ProseH2",props:{id:{}},setup(a){const r=a,{headings:o}=c().public.mdc,d=p(()=>{var e;return r.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h2)});return(e,m)=>(s(),n("h2",{id:e.id},[e.id&&u(d)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,l)):t(e.$slots,"default",{key:1})],8,f))}});export{k as default}; diff --git a/_nuxt/BNS4yJEB.js b/_nuxt/B9SonXqr.js similarity index 58% rename from _nuxt/BNS4yJEB.js rename to _nuxt/B9SonXqr.js index d7718862..1e4f821e 100644 --- a/_nuxt/BNS4yJEB.js +++ b/_nuxt/B9SonXqr.js @@ -1 +1 @@ -import{d as n,K as e}from"./DXsCzSxj.js";const t=n({name:"DocumentDrivenNotFound",render(){return e("div","Document not found")}});export{t as default}; +import{d as n,K as e}from"./gOhWOHN0.js";const t=n({name:"DocumentDrivenNotFound",render(){return e("div","Document not found")}});export{t as default}; diff --git a/_nuxt/CPjbdFE6.js b/_nuxt/BA65R9a-.js similarity index 95% rename from _nuxt/CPjbdFE6.js rename to _nuxt/BA65R9a-.js index ca0fb298..4e9fd957 100644 --- a/_nuxt/CPjbdFE6.js +++ b/_nuxt/BA65R9a-.js @@ -1 +1 @@ -import{_ as x,c as u,o as v,b as c}from"./DXsCzSxj.js";const _={data(){return{}},mounted(){document.getElementById("canvas").textContent="";const o=["#FFBA08","#FAA307","#F48C06","#E85D04","#DC2F02","#D00000","#9D0208","#6A040F","#370617","#03071E"],m=e=>{const r=document.getElementById("canvas"),a=r.clientWidth,n=r.clientHeight,f=[{color:o[1],min:0,max:.2,yoff:2},{color:o[2],min:.2,max:.4,yoff:2},{color:o[3],min:.4,max:.6,yoff:2},{color:o[4],min:.6,max:.8,yoff:2},{color:o[5],min:.8,max:1,yoff:2}],l=t=>{e.fill(t.color),e.beginShape();let d=1;for(let i=0;i<=a;i+=10){const h=e.map(e.noise(d,t.yoff),0,1,t.min*n,t.max*n);e.curveVertex(i,h),d+=e.random(.5)}t.yoff+=e.random(-.5,.5),e.curveVertex(a,n),e.curveVertex(0,n),e.endShape(e.CLOSE)},s=()=>{e.clear(),e.background(o[0]),f.forEach(t=>l(t))};e.setup=()=>{e.createCanvas(a,n),e.frameRate(5),e.smooth(),e.stroke(255),e.strokeWeight(3),s(),e.noLoop()},e.mousePressed=()=>{s()}};new this.$p5(m,"canvas")}},y={class:"select-none bg-gradient-to-b from-green-800 to-gray-800"},p=c("div",{class:"m-6 grid h-2/3 place-items-center"},[c("div",{class:"font-mono text-white"},[c("div",{id:"canvas",class:"mb-2 h-96 border-2 border-white"}),c("div",{class:"my-2 w-48 text-center md:w-full"}," Click or tap anywhere to redraw the waves! ")])],-1),g=[p];function w(o,m,e,r,a,n){return v(),u("div",y,g)}const b=x(_,[["render",w]]);export{b as default}; +import{_ as x,c as u,o as v,b as c}from"./gOhWOHN0.js";const _={data(){return{}},mounted(){document.getElementById("canvas").textContent="";const o=["#FFBA08","#FAA307","#F48C06","#E85D04","#DC2F02","#D00000","#9D0208","#6A040F","#370617","#03071E"],m=e=>{const r=document.getElementById("canvas"),a=r.clientWidth,n=r.clientHeight,f=[{color:o[1],min:0,max:.2,yoff:2},{color:o[2],min:.2,max:.4,yoff:2},{color:o[3],min:.4,max:.6,yoff:2},{color:o[4],min:.6,max:.8,yoff:2},{color:o[5],min:.8,max:1,yoff:2}],l=t=>{e.fill(t.color),e.beginShape();let d=1;for(let i=0;i<=a;i+=10){const h=e.map(e.noise(d,t.yoff),0,1,t.min*n,t.max*n);e.curveVertex(i,h),d+=e.random(.5)}t.yoff+=e.random(-.5,.5),e.curveVertex(a,n),e.curveVertex(0,n),e.endShape(e.CLOSE)},s=()=>{e.clear(),e.background(o[0]),f.forEach(t=>l(t))};e.setup=()=>{e.createCanvas(a,n),e.frameRate(5),e.smooth(),e.stroke(255),e.strokeWeight(3),s(),e.noLoop()},e.mousePressed=()=>{s()}};new this.$p5(m,"canvas")}},y={class:"select-none bg-gradient-to-b from-green-800 to-gray-800"},p=c("div",{class:"m-6 grid h-2/3 place-items-center"},[c("div",{class:"font-mono text-white"},[c("div",{id:"canvas",class:"mb-2 h-96 border-2 border-white"}),c("div",{class:"my-2 w-48 text-center md:w-full"}," Click or tap anywhere to redraw the waves! ")])],-1),g=[p];function w(o,m,e,r,a,n){return v(),u("div",y,g)}const b=x(_,[["render",w]]);export{b as default}; diff --git a/_nuxt/DmJB5K9d.js b/_nuxt/BC8i9gG8.js similarity index 64% rename from _nuxt/DmJB5K9d.js rename to _nuxt/BC8i9gG8.js index 0e7cbaae..9811a304 100644 --- a/_nuxt/DmJB5K9d.js +++ b/_nuxt/BC8i9gG8.js @@ -1 +1 @@ -import{_ as o,o as r,c as s,a7 as t}from"./DXsCzSxj.js";const c={};function n(e,a){return r(),s("ul",null,[t(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; +import{_ as o,o as r,c as s,a7 as t}from"./gOhWOHN0.js";const c={};function n(e,a){return r(),s("ul",null,[t(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/DQ54uNhR.js b/_nuxt/BDB7Hltw.js similarity index 53% rename from _nuxt/DQ54uNhR.js rename to _nuxt/BDB7Hltw.js index 09ababaa..00250a94 100644 --- a/_nuxt/DQ54uNhR.js +++ b/_nuxt/BDB7Hltw.js @@ -1 +1 @@ -import{_ as e,o as r,c}from"./DXsCzSxj.js";const o={};function t(n,s){return r(),c("hr")}const a=e(o,[["render",t]]);export{a as default}; +import{_ as e,o as r,c}from"./gOhWOHN0.js";const o={};function t(n,s){return r(),c("hr")}const a=e(o,[["render",t]]);export{a as default}; diff --git a/_nuxt/BH04L1rH.js b/_nuxt/BH04L1rH.js deleted file mode 100644 index 962ef6f1..00000000 --- a/_nuxt/BH04L1rH.js +++ /dev/null @@ -1 +0,0 @@ -import{d as i,H as c,p,o as s,c as n,a as u,a7 as t}from"./DXsCzSxj.js";const f=["id"],l=["href"],k=i({__name:"ProseH3",props:{id:{}},setup(a){const r=a,{headings:o}=c().public.mdc,d=p(()=>{var e;return r.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h3)});return(e,m)=>(s(),n("h3",{id:e.id},[e.id&&u(d)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,l)):t(e.$slots,"default",{key:1})],8,f))}});export{k as default}; diff --git a/_nuxt/CvtpGHRQ.js b/_nuxt/BIMfceTU.js similarity index 96% rename from _nuxt/CvtpGHRQ.js rename to _nuxt/BIMfceTU.js index 5d256ea2..d5d1bb10 100644 --- a/_nuxt/CvtpGHRQ.js +++ b/_nuxt/BIMfceTU.js @@ -1 +1 @@ -import{_ as c,o as p,c as b,b as i,A as r,B as m,f as u}from"./DXsCzSxj.js";const h={props:{id:{type:String,default:"canvas"},canvasHeight:{type:Number,default:250},type:{type:String,default:"sin"},diameter:{type:Number,default:15},amplitude:{type:Number,default:75},lambda:{type:Number,default:266}},mounted(){const o=e=>{const a=e.windowWidth>=450?this.canvasHeight:200,l=e.windowWidth>=450?800:300;let t=0,d=a/2,s=0;const n=100,_=125;e.setup=()=>{e.createCanvas(l,a),t=-this.diameter},e.draw=()=>{this.type==="sin"?d=this.amplitude*e.sin(t*(e.TWO_PI/this.lambda))+a/2:this.type==="cos"?d=this.amplitude*e.cos(t*(e.TWO_PI/this.lambda))+a/2:this.type==="tan"?d=this.amplitude*e.tan(t*(e.TWO_PI/this.lambda))+a/2:d=a/2,s=Math.round(e.map(d,-this.amplitude+a/2,this.amplitude+a/2,0,255)),t=t>=l+this.diameter?-this.diameter:t+1,e.noStroke(),e.fill(e.color(s,n,_)),e.ellipse(t,d,this.diameter,this.diameter)},e.mousePressed=()=>{e.clear()}};new this.$p5(o,this.id)},data(){return{}}},v=["id"];function w(o,e,a,l,t,d){return p(),b("div",{id:a.id},null,8,v)}const f=c(h,[["render",w]]),y={data(){return{wave:{amplitude:75,lambda:266,diameter:15}}}},x={class:"bg-gradient-to-b from-green-800 to-gray-800"},g={class:"grid h-screen place-items-center"},I={class:"font-mono text-white"},k={class:"my-2 items-end md:flex"},W=i("div",{class:"flex-none md:flex-1"},"y(x) = A sin((2π / λ) x)",-1),N={class:"hidden md:block"},T=i("label",{for:"aInput",class:"form-label inline-block"},"A",-1),A=i("label",{for:"lInput",class:"form-label inline-block"},"λ",-1),B=i("label",{for:"dInput",class:"form-label inline-block"},"◒",-1),H={class:"mb-2 border-2 border-white"},P=i("div",null,"y(x) = A cos((2π / λ) x)",-1),V={class:"mb-2 border-2 border-white"},O=i("div",null,"y(x) = A tan((2π / λ) x)",-1),S={class:"border-2 border-white"},U=i("div",{class:"my-2 w-48 md:w-full"}," Click or tap anywhere to clear the canvas! ",-1);function C(o,e,a,l,t,d){const s=f;return p(),b("div",x,[i("div",g,[i("div",I,[i("div",k,[W,i("div",N,[T,r(i("input",{id:"aInput","onUpdate:modelValue":e[0]||(e[0]=n=>t.wave.amplitude=n),type:"number",class:"w-16 border-2 border-white bg-transparent p-2 focus:outline-none"},null,512),[[m,t.wave.amplitude,void 0,{number:!0}]]),A,r(i("input",{id:"lInput","onUpdate:modelValue":e[1]||(e[1]=n=>t.wave.lambda=n),type:"number",class:"w-16 border-2 border-white bg-transparent p-2 focus:outline-none"},null,512),[[m,t.wave.lambda,void 0,{number:!0}]]),B,r(i("input",{id:"dInput","onUpdate:modelValue":e[2]||(e[2]=n=>t.wave.diameter=n),type:"number",class:"w-16 border-2 border-white bg-transparent p-2 focus:outline-none"},null,512),[[m,t.wave.diameter,void 0,{number:!0}]])])]),i("div",H,[u(s,{id:"canvas1",type:"sin",diameter:t.wave.diameter,amplitude:t.wave.amplitude,lambda:t.wave.lambda},null,8,["diameter","amplitude","lambda"])]),P,i("div",V,[u(s,{id:"canvas2",type:"cos",diameter:t.wave.diameter,amplitude:t.wave.amplitude,lambda:t.wave.lambda},null,8,["diameter","amplitude","lambda"])]),O,i("div",S,[u(s,{id:"canvas3",type:"tan",diameter:t.wave.diameter,amplitude:t.wave.amplitude,lambda:t.wave.lambda},null,8,["diameter","amplitude","lambda"])]),U])])])}const E=c(y,[["render",C]]);export{E as default}; +import{_ as c,o as p,c as b,b as i,A as r,B as m,f as u}from"./gOhWOHN0.js";const h={props:{id:{type:String,default:"canvas"},canvasHeight:{type:Number,default:250},type:{type:String,default:"sin"},diameter:{type:Number,default:15},amplitude:{type:Number,default:75},lambda:{type:Number,default:266}},mounted(){const o=e=>{const a=e.windowWidth>=450?this.canvasHeight:200,l=e.windowWidth>=450?800:300;let t=0,d=a/2,s=0;const n=100,_=125;e.setup=()=>{e.createCanvas(l,a),t=-this.diameter},e.draw=()=>{this.type==="sin"?d=this.amplitude*e.sin(t*(e.TWO_PI/this.lambda))+a/2:this.type==="cos"?d=this.amplitude*e.cos(t*(e.TWO_PI/this.lambda))+a/2:this.type==="tan"?d=this.amplitude*e.tan(t*(e.TWO_PI/this.lambda))+a/2:d=a/2,s=Math.round(e.map(d,-this.amplitude+a/2,this.amplitude+a/2,0,255)),t=t>=l+this.diameter?-this.diameter:t+1,e.noStroke(),e.fill(e.color(s,n,_)),e.ellipse(t,d,this.diameter,this.diameter)},e.mousePressed=()=>{e.clear()}};new this.$p5(o,this.id)},data(){return{}}},v=["id"];function w(o,e,a,l,t,d){return p(),b("div",{id:a.id},null,8,v)}const f=c(h,[["render",w]]),y={data(){return{wave:{amplitude:75,lambda:266,diameter:15}}}},x={class:"bg-gradient-to-b from-green-800 to-gray-800"},g={class:"grid h-screen place-items-center"},I={class:"font-mono text-white"},k={class:"my-2 items-end md:flex"},W=i("div",{class:"flex-none md:flex-1"},"y(x) = A sin((2π / λ) x)",-1),N={class:"hidden md:block"},T=i("label",{for:"aInput",class:"form-label inline-block"},"A",-1),A=i("label",{for:"lInput",class:"form-label inline-block"},"λ",-1),B=i("label",{for:"dInput",class:"form-label inline-block"},"◒",-1),H={class:"mb-2 border-2 border-white"},P=i("div",null,"y(x) = A cos((2π / λ) x)",-1),V={class:"mb-2 border-2 border-white"},O=i("div",null,"y(x) = A tan((2π / λ) x)",-1),S={class:"border-2 border-white"},U=i("div",{class:"my-2 w-48 md:w-full"}," Click or tap anywhere to clear the canvas! ",-1);function C(o,e,a,l,t,d){const s=f;return p(),b("div",x,[i("div",g,[i("div",I,[i("div",k,[W,i("div",N,[T,r(i("input",{id:"aInput","onUpdate:modelValue":e[0]||(e[0]=n=>t.wave.amplitude=n),type:"number",class:"w-16 border-2 border-white bg-transparent p-2 focus:outline-none"},null,512),[[m,t.wave.amplitude,void 0,{number:!0}]]),A,r(i("input",{id:"lInput","onUpdate:modelValue":e[1]||(e[1]=n=>t.wave.lambda=n),type:"number",class:"w-16 border-2 border-white bg-transparent p-2 focus:outline-none"},null,512),[[m,t.wave.lambda,void 0,{number:!0}]]),B,r(i("input",{id:"dInput","onUpdate:modelValue":e[2]||(e[2]=n=>t.wave.diameter=n),type:"number",class:"w-16 border-2 border-white bg-transparent p-2 focus:outline-none"},null,512),[[m,t.wave.diameter,void 0,{number:!0}]])])]),i("div",H,[u(s,{id:"canvas1",type:"sin",diameter:t.wave.diameter,amplitude:t.wave.amplitude,lambda:t.wave.lambda},null,8,["diameter","amplitude","lambda"])]),P,i("div",V,[u(s,{id:"canvas2",type:"cos",diameter:t.wave.diameter,amplitude:t.wave.amplitude,lambda:t.wave.lambda},null,8,["diameter","amplitude","lambda"])]),O,i("div",S,[u(s,{id:"canvas3",type:"tan",diameter:t.wave.diameter,amplitude:t.wave.amplitude,lambda:t.wave.lambda},null,8,["diameter","amplitude","lambda"])]),U])])])}const E=c(y,[["render",C]]);export{E as default}; diff --git a/_nuxt/CCMBC9ge.js b/_nuxt/BJC4by4G.js similarity index 84% rename from _nuxt/CCMBC9ge.js rename to _nuxt/BJC4by4G.js index 6423a619..ba9e6075 100644 --- a/_nuxt/CCMBC9ge.js +++ b/_nuxt/BJC4by4G.js @@ -1 +1 @@ -import{l as q,q as D,s as T,o as y,c as b,b as t,d as E,k as W,v as R,f as k,a as x,F as A,r as F,t as u}from"./DXsCzSxj.js";const M={id:"waveform-canvas-container",class:"bg-green h-full w-full"},N=["width","height"],P={__name:"Waveform",props:{timeDomainBufferHistory:{type:Array},canvasWidth:{type:Number},canvasHeight:{type:Number},fillStyle:{type:String,default:"rgba(0,0,0)"},strokeStyle:{type:String,default:"rgb(255, 255, 255)"}},setup(f){const n=f;return q(()=>{const d=document.getElementById("waveformCanvas2"),e=d.getContext("2d"),s=document.getElementById("waveform-canvas-container"),i=n.canvasHeight?n.canvasHeight:s.clientHeight,o=n.canvasWidth?n.canvasWidth:s.clientWidth;d.height=i,d.width=o,e.fillRect(0,0,o,i),D(n.timeDomainBufferHistory,a=>{e.fillStyle=n.fillStyle,e.fillRect(0,0,o,i),e.lineWidth=2,e.strokeStyle=n.strokeStyle,e.beginPath();const h=a.slice(-1)[0],_=h.length,m=o/_;let g=0;for(let l=0;l<_;l++){const v=h[l]/128*i/2;l===0?e.moveTo(g,v):e.lineTo(g,v),g+=m}e.lineTo(d.width,d.height/2),e.stroke()})}),T(()=>{}),(d,e)=>(y(),b("div",M,[t("canvas",{id:"waveformCanvas2",width:f.canvasWidth,height:f.canvasHeight},null,8,N)]))}},U={id:"spectrogram-canvas-container",class:"h-full w-full"},O=["width","height"],C=36,G={__name:"Spectrogram",props:{frequencyDomainBufferHistory:{type:Array},canvasWidth:{type:Number},canvasHeight:{type:Number},fillStyle:{type:String,default:"rgba(0,0,0)"}},setup(f){const n=f,d=(e,s,i,o,a)=>(e-s)*(a-s)/(i-s)+o;return q(()=>{const e=document.getElementById("spectrogramCanvas"),s=e.getContext("2d"),i=document.getElementById("spectrogram-canvas-container"),o=n.canvasHeight?n.canvasHeight:i.clientHeight,a=n.canvasWidth?n.canvasWidth:i.clientWidth;e.height=o,e.width=a,s.fillRect(0,0,a,o),D(n.frequencyDomainBufferHistory,h=>{s.fillStyle=n.fillStyle,s.fillRect(0,0,a,o);const _=h.slice(-C),m=a/128,g=o/C;for(let l=0;l<128;l++)for(let c=0;c(y(),b("div",null,[t("div",U,[t("canvas",{id:"spectrogramCanvas",width:f.canvasWidth,height:f.canvasHeight},null,8,O)])]))}},L={id:"bar-graph-container",class:"h-full w-full"},V=["width","height"],I=2,Y={__name:"FrequencyBarGraph",props:{audioBufferHistory:{type:Array},canvasWidth:{type:Number},canvasHeight:{type:Number},fillStyle:{type:String,default:"rgba(0,0,0)"},strokeStyle:{type:String,default:"rgb(255, 255, 255)"}},setup(f){const n=f,d=(e,s,i,o,a)=>(e-s)*(a-s)/(i-s)+o;return q(()=>{const e=document.getElementById("frequencyBarGraphCanvas"),s=e.getContext("2d"),i=document.getElementById("bar-graph-container"),o=n.canvasHeight?n.canvasHeight:i.clientHeight,a=n.canvasWidth?n.canvasWidth:i.clientWidth;e.height=o,e.width=a,s.fillRect(0,0,a,o),D(n.audioBufferHistory,h=>{s.fillStyle=n.fillStyle,s.fillRect(0,0,a,o);const _=h.slice(-1)[0],m=a/_.length-I;let g=0;for(let l=0;l<_.length;l++){const c=_[l],v=d(c,0,255,0,o);s.fillStyle=`rgb(${c},0,${c})`,s.fillRect(g,o-v,m,v),g+=m+I}})}),(e,s)=>(y(),b("div",null,[t("div",L,[t("canvas",{id:"frequencyBarGraphCanvas",width:f.canvasWidth,height:f.canvasHeight},null,8,V)])]))}},z={class:"container mx-auto font-mono"},K={class:"bg-background text-white"},X={class:"grid grid-cols-3 gap-4"},Z={class:"col-span-3 rounded-xl bg-black/75 p-4 lg:col-span-1"},j=t("div",{class:"mb-2 text-xl font-bold"},"Time Domain Waveform",-1),J={class:"col-span-3 rounded-xl bg-black/75 p-4 lg:col-span-1"},Q=t("div",{class:"mb-2 text-xl font-bold"},"Frequency Spectrogram",-1),tt={class:"col-span-3 rounded-xl bg-black/75 p-4 lg:col-span-1"},et=t("div",{class:"mb-2 text-xl font-bold"},"Frequency Bar Chart",-1),st={class:"col-span-3 rounded-xl bg-black/75 p-4"},nt=t("div",{class:"mb-2 text-xl font-bold"},"Frequency Buffer History",-1),ot={class:"w-full table-fixed"},at=t("thead",{class:"collapse border-b-2 md:visible"},[t("tr",null,[t("th",{class:"text-left"},"Index"),t("th",{class:"text-left"},"Mean"),t("th",{class:"text-left"},"Min"),t("th",{class:"text-left"},"Max"),t("th",{class:"text-left"},"FFT"),t("th",{class:"text-right"},"Buffer")])],-1),lt={class:"text-left font-bold"},it={class:"text-left"},ct={class:"text-left"},rt={class:"text-left"},dt={class:"text-left"},ht={class:"truncate text-right"},ut={class:"col-span-3 rounded-xl bg-black/75 p-4"},ft=t("div",{class:"mb-2 text-xl font-bold"},"Time Domain Buffer History",-1),gt={class:"w-full table-fixed"},_t=t("thead",{class:"collapse border-b-2 md:visible"},[t("tr",null,[t("th",{class:"text-left"},"Index"),t("th",{class:"text-left"},"Mean"),t("th",{class:"text-left"},"Min"),t("th",{class:"text-left"},"Max"),t("th",{class:"text-left"},"FFT"),t("th",{class:"text-right"},"Buffer")])],-1),vt={class:"text-left font-bold"},mt={class:"text-left"},yt={class:"text-left"},bt={class:"text-left"},pt={class:"text-left"},xt={class:"truncate text-right"},B=256,wt=E({__name:"index",setup(f){let n=null,d=null,e=null,s=null,i=null,o=W([]),a=null,h=W([]);W(!1);const _=()=>{requestAnimationFrame(_),e.getByteTimeDomainData(i),i!==null&&(o.value.push(i.slice()),o.value.length>B&&o.value.shift()),e.getByteFrequencyData(a),a!==null&&(h.value.push(a.slice()),h.value.length>B&&h.value.shift())},m=()=>{navigator.mediaDevices.getUserMedia({audio:!0}).then(l=>{n=l,d=new(window.AudioContext||window.webkitAudioContext),e=d.createAnalyser(),s=d.createMediaStreamSource(n),s.connect(e),e.fftSize=2048,i=new Uint8Array(e.frequencyBinCount),a=new Uint8Array(e.frequencyBinCount);for(let c=0;c{n!==null&&n.active&&n.getAudioTracks().forEach(l=>{l.stop()})};return R(()=>{console.log("disabling"),g()}),(l,c)=>{const v=P,w=G,$=Y;return y(),b("div",z,[t("div",K,[t("div",X,[t("div",{class:"col-span-3 space-x-2"},[t("div",{class:"inline-block rounded-lg bg-black px-6 py-2 text-sm font-bold uppercase text-white shadow-lg shadow-green-400/25 transition duration-150 ease-in-out hover:cursor-pointer hover:shadow-white/25",onClick:m}," Enable "),t("div",{class:"inline-block rounded-lg bg-black px-6 py-2 text-sm font-bold uppercase text-white shadow-lg shadow-red-400/25 transition duration-150 ease-in-out hover:cursor-pointer hover:shadow-white/25",onClick:g}," Disable ")]),t("div",Z,[j,k(v,{timeDomainBufferHistory:x(o),strokeStyle:"rgb(255, 0, 255)",class:"h-72 border-2 border-gray-400"},null,8,["timeDomainBufferHistory"])]),t("div",J,[Q,k(w,{frequencyDomainBufferHistory:x(h),class:"h-72 border-2 border-gray-400"},null,8,["frequencyDomainBufferHistory"])]),t("div",tt,[et,k($,{audioBufferHistory:x(h),class:"h-72 border-2 border-gray-400"},null,8,["audioBufferHistory"])]),t("div",st,[nt,t("div",null,[t("table",ot,[at,t("tbody",null,[(y(!0),b(A,null,F(x(h).slice(-10),(r,p)=>(y(),b("tr",{key:p},[t("td",lt,u(p),1),t("td",it,u((r.reduce((H,S)=>H+S)/r.length).toFixed(2)),1),t("td",ct,u(Math.min(...r)),1),t("td",rt,u(Math.max(...r)),1),t("td",dt,u(r.length),1),t("td",ht,u(r.slice(0,4))+" ... "+u(r.slice(-4)),1)]))),128))])])])]),t("div",ut,[ft,t("div",null,[t("table",gt,[_t,t("tbody",null,[(y(!0),b(A,null,F(x(o).slice(-10),(r,p)=>(y(),b("tr",{key:p},[t("td",vt,u(p),1),t("td",mt,u((r.reduce((H,S)=>H+S)/r.length).toFixed(2)),1),t("td",yt,u(Math.min(...r)),1),t("td",bt,u(Math.max(...r)),1),t("td",pt,u(r.length),1),t("td",xt,u(r.slice(0,4))+" ... "+u(r.slice(-4)),1)]))),128))])])])])])])])}}});export{wt as default}; +import{l as q,p as D,q as T,o as y,c as b,b as t,d as E,k as W,s as R,f as k,a as x,F as A,r as F,t as u}from"./gOhWOHN0.js";const M={id:"waveform-canvas-container",class:"bg-green h-full w-full"},N=["width","height"],P={__name:"Waveform",props:{timeDomainBufferHistory:{type:Array},canvasWidth:{type:Number},canvasHeight:{type:Number},fillStyle:{type:String,default:"rgba(0,0,0)"},strokeStyle:{type:String,default:"rgb(255, 255, 255)"}},setup(f){const n=f;return q(()=>{const d=document.getElementById("waveformCanvas2"),e=d.getContext("2d"),s=document.getElementById("waveform-canvas-container"),i=n.canvasHeight?n.canvasHeight:s.clientHeight,o=n.canvasWidth?n.canvasWidth:s.clientWidth;d.height=i,d.width=o,e.fillRect(0,0,o,i),D(n.timeDomainBufferHistory,a=>{e.fillStyle=n.fillStyle,e.fillRect(0,0,o,i),e.lineWidth=2,e.strokeStyle=n.strokeStyle,e.beginPath();const h=a.slice(-1)[0],_=h.length,v=o/_;let g=0;for(let l=0;l<_;l++){const m=h[l]/128*i/2;l===0?e.moveTo(g,m):e.lineTo(g,m),g+=v}e.lineTo(d.width,d.height/2),e.stroke()})}),T(()=>{}),(d,e)=>(y(),b("div",M,[t("canvas",{id:"waveformCanvas2",width:f.canvasWidth,height:f.canvasHeight},null,8,N)]))}},U={id:"spectrogram-canvas-container",class:"h-full w-full"},O=["width","height"],C=36,G={__name:"Spectrogram",props:{frequencyDomainBufferHistory:{type:Array},canvasWidth:{type:Number},canvasHeight:{type:Number},fillStyle:{type:String,default:"rgba(0,0,0)"}},setup(f){const n=f,d=(e,s,i,o,a)=>(e-s)*(a-s)/(i-s)+o;return q(()=>{const e=document.getElementById("spectrogramCanvas"),s=e.getContext("2d"),i=document.getElementById("spectrogram-canvas-container"),o=n.canvasHeight?n.canvasHeight:i.clientHeight,a=n.canvasWidth?n.canvasWidth:i.clientWidth;e.height=o,e.width=a,s.fillRect(0,0,a,o),D(n.frequencyDomainBufferHistory,h=>{s.fillStyle=n.fillStyle,s.fillRect(0,0,a,o);const _=h.slice(-C),v=a/128,g=o/C;for(let l=0;l<128;l++)for(let c=0;c(y(),b("div",null,[t("div",U,[t("canvas",{id:"spectrogramCanvas",width:f.canvasWidth,height:f.canvasHeight},null,8,O)])]))}},L={id:"bar-graph-container",class:"h-full w-full"},V=["width","height"],I=2,Y={__name:"FrequencyBarGraph",props:{audioBufferHistory:{type:Array},canvasWidth:{type:Number},canvasHeight:{type:Number},fillStyle:{type:String,default:"rgba(0,0,0)"},strokeStyle:{type:String,default:"rgb(255, 255, 255)"}},setup(f){const n=f,d=(e,s,i,o,a)=>(e-s)*(a-s)/(i-s)+o;return q(()=>{const e=document.getElementById("frequencyBarGraphCanvas"),s=e.getContext("2d"),i=document.getElementById("bar-graph-container"),o=n.canvasHeight?n.canvasHeight:i.clientHeight,a=n.canvasWidth?n.canvasWidth:i.clientWidth;e.height=o,e.width=a,s.fillRect(0,0,a,o),D(n.audioBufferHistory,h=>{s.fillStyle=n.fillStyle,s.fillRect(0,0,a,o);const _=h.slice(-1)[0],v=a/_.length-I;let g=0;for(let l=0;l<_.length;l++){const c=_[l],m=d(c,0,255,0,o);s.fillStyle=`rgb(${c},0,${c})`,s.fillRect(g,o-m,v,m),g+=v+I}})}),(e,s)=>(y(),b("div",null,[t("div",L,[t("canvas",{id:"frequencyBarGraphCanvas",width:f.canvasWidth,height:f.canvasHeight},null,8,V)])]))}},z={class:"container mx-auto font-mono"},K={class:"bg-background text-white"},X={class:"grid grid-cols-3 gap-4"},Z={class:"col-span-3 rounded-xl bg-black/75 p-4 lg:col-span-1"},j=t("div",{class:"mb-2 text-xl font-bold"},"Time Domain Waveform",-1),J={class:"col-span-3 rounded-xl bg-black/75 p-4 lg:col-span-1"},Q=t("div",{class:"mb-2 text-xl font-bold"},"Frequency Spectrogram",-1),tt={class:"col-span-3 rounded-xl bg-black/75 p-4 lg:col-span-1"},et=t("div",{class:"mb-2 text-xl font-bold"},"Frequency Bar Chart",-1),st={class:"col-span-3 rounded-xl bg-black/75 p-4"},nt=t("div",{class:"mb-2 text-xl font-bold"},"Frequency Buffer History",-1),ot={class:"w-full table-fixed"},at=t("thead",{class:"collapse border-b-2 md:visible"},[t("tr",null,[t("th",{class:"text-left"},"Index"),t("th",{class:"text-left"},"Mean"),t("th",{class:"text-left"},"Min"),t("th",{class:"text-left"},"Max"),t("th",{class:"text-left"},"FFT"),t("th",{class:"text-right"},"Buffer")])],-1),lt={class:"text-left font-bold"},it={class:"text-left"},ct={class:"text-left"},rt={class:"text-left"},dt={class:"text-left"},ht={class:"truncate text-right"},ut={class:"col-span-3 rounded-xl bg-black/75 p-4"},ft=t("div",{class:"mb-2 text-xl font-bold"},"Time Domain Buffer History",-1),gt={class:"w-full table-fixed"},_t=t("thead",{class:"collapse border-b-2 md:visible"},[t("tr",null,[t("th",{class:"text-left"},"Index"),t("th",{class:"text-left"},"Mean"),t("th",{class:"text-left"},"Min"),t("th",{class:"text-left"},"Max"),t("th",{class:"text-left"},"FFT"),t("th",{class:"text-right"},"Buffer")])],-1),mt={class:"text-left font-bold"},vt={class:"text-left"},yt={class:"text-left"},bt={class:"text-left"},pt={class:"text-left"},xt={class:"truncate text-right"},B=256,wt=E({__name:"index",setup(f){let n=null,d=null,e=null,s=null,i=null,o=W([]),a=null,h=W([]);W(!1);const _=()=>{requestAnimationFrame(_),e.getByteTimeDomainData(i),i!==null&&(o.value.push(i.slice()),o.value.length>B&&o.value.shift()),e.getByteFrequencyData(a),a!==null&&(h.value.push(a.slice()),h.value.length>B&&h.value.shift())},v=()=>{navigator.mediaDevices.getUserMedia({audio:!0}).then(l=>{n=l,d=new(window.AudioContext||window.webkitAudioContext),e=d.createAnalyser(),s=d.createMediaStreamSource(n),s.connect(e),e.fftSize=2048,i=new Uint8Array(e.frequencyBinCount),a=new Uint8Array(e.frequencyBinCount);for(let c=0;c{n!==null&&n.active&&n.getAudioTracks().forEach(l=>{l.stop()})};return R(()=>{console.log("disabling"),g()}),(l,c)=>{const m=P,w=G,$=Y;return y(),b("div",z,[t("div",K,[t("div",X,[t("div",{class:"col-span-3 space-x-2"},[t("div",{class:"inline-block rounded-lg bg-black px-6 py-2 text-sm font-bold uppercase text-white shadow-lg shadow-green-400/25 transition duration-150 ease-in-out hover:cursor-pointer hover:shadow-white/25",onClick:v}," Enable "),t("div",{class:"inline-block rounded-lg bg-black px-6 py-2 text-sm font-bold uppercase text-white shadow-lg shadow-red-400/25 transition duration-150 ease-in-out hover:cursor-pointer hover:shadow-white/25",onClick:g}," Disable ")]),t("div",Z,[j,k(m,{timeDomainBufferHistory:x(o),strokeStyle:"rgb(255, 0, 255)",class:"h-72 border-2 border-gray-400"},null,8,["timeDomainBufferHistory"])]),t("div",J,[Q,k(w,{frequencyDomainBufferHistory:x(h),class:"h-72 border-2 border-gray-400"},null,8,["frequencyDomainBufferHistory"])]),t("div",tt,[et,k($,{audioBufferHistory:x(h),class:"h-72 border-2 border-gray-400"},null,8,["audioBufferHistory"])]),t("div",st,[nt,t("div",null,[t("table",ot,[at,t("tbody",null,[(y(!0),b(A,null,F(x(h).slice(-10),(r,p)=>(y(),b("tr",{key:p},[t("td",lt,u(p),1),t("td",it,u((r.reduce((H,S)=>H+S)/r.length).toFixed(2)),1),t("td",ct,u(Math.min(...r)),1),t("td",rt,u(Math.max(...r)),1),t("td",dt,u(r.length),1),t("td",ht,u(r.slice(0,4))+" ... "+u(r.slice(-4)),1)]))),128))])])])]),t("div",ut,[ft,t("div",null,[t("table",gt,[_t,t("tbody",null,[(y(!0),b(A,null,F(x(o).slice(-10),(r,p)=>(y(),b("tr",{key:p},[t("td",mt,u(p),1),t("td",vt,u((r.reduce((H,S)=>H+S)/r.length).toFixed(2)),1),t("td",yt,u(Math.min(...r)),1),t("td",bt,u(Math.max(...r)),1),t("td",pt,u(r.length),1),t("td",xt,u(r.slice(0,4))+" ... "+u(r.slice(-4)),1)]))),128))])])])])])])])}}});export{wt as default}; diff --git a/_nuxt/DNf9KyJp.js b/_nuxt/BS17ih1w.js similarity index 64% rename from _nuxt/DNf9KyJp.js rename to _nuxt/BS17ih1w.js index b691ab32..a975beb2 100644 --- a/_nuxt/DNf9KyJp.js +++ b/_nuxt/BS17ih1w.js @@ -1 +1 @@ -import{_ as o,o as r,c as s,a7 as t}from"./DXsCzSxj.js";const c={};function n(e,a){return r(),s("ol",null,[t(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; +import{_ as o,o as r,c as s,a7 as t}from"./gOhWOHN0.js";const c={};function n(e,a){return r(),s("ol",null,[t(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/BVJrLhrR.js b/_nuxt/BUMyNB6i.js similarity index 63% rename from _nuxt/BVJrLhrR.js rename to _nuxt/BUMyNB6i.js index e904eb3f..7c143add 100644 --- a/_nuxt/BVJrLhrR.js +++ b/_nuxt/BUMyNB6i.js @@ -1 +1 @@ -import{d as a,o as n,D as o,g as s,a7 as f,i as u}from"./DXsCzSxj.js";const i=a({__name:"ProseA",props:{href:{type:String,default:""},target:{type:String,default:void 0,required:!1}},setup(e){return(t,c)=>{const r=u;return n(),o(r,{href:e.href,target:e.target},{default:s(()=>[f(t.$slots,"default")]),_:3},8,["href","target"])}}});export{i as default}; +import{d as a,o as n,D as o,g as s,a7 as f,i as u}from"./gOhWOHN0.js";const i=a({__name:"ProseA",props:{href:{type:String,default:""},target:{type:String,default:void 0,required:!1}},setup(e){return(t,c)=>{const r=u;return n(),o(r,{href:e.href,target:e.target},{default:s(()=>[f(t.$slots,"default")]),_:3},8,["href","target"])}}});export{i as default}; diff --git a/_nuxt/W6vbqLg7.js b/_nuxt/BYBkJnue.js similarity index 93% rename from _nuxt/W6vbqLg7.js rename to _nuxt/BYBkJnue.js index 914ef8e0..58444314 100644 --- a/_nuxt/W6vbqLg7.js +++ b/_nuxt/BYBkJnue.js @@ -1 +1 @@ -import{V as C,k as y,W as w,M as b,X as O,v as B,q as M,Y as _,N as E,Z as H,a as R,$ as S,a0 as z}from"./DXsCzSxj.js";const N=s=>s==="defer"||s===!1;function q(...s){var m;const i=typeof s[s.length-1]=="string"?s.pop():void 0;typeof s[0]!="string"&&s.unshift(i);let[t,u,a={}]=s;if(typeof t!="string")throw new TypeError("[nuxt] [asyncData] key must be a string.");if(typeof u!="function")throw new TypeError("[nuxt] [asyncData] handler must be a function.");const e=E(),v=u,p=()=>null,g=()=>e.isHydrating?e.payload.data[t]:e.static.data[t];a.server=a.server??!0,a.default=a.default??p,a.getCachedData=a.getCachedData??g,a.lazy=a.lazy??!1,a.immediate=a.immediate??!0,a.deep=a.deep??C.deep,a.dedupe=a.dedupe??"cancel";const d=()=>a.getCachedData(t,e)!=null;if(!e._asyncData[t]||!a.immediate){(m=e.payload._errors)[t]??(m[t]=null);const o=a.deep?y:w;e._asyncData[t]={data:o(a.getCachedData(t,e)??a.default()),pending:y(!d()),error:b(e.payload._errors,t),status:y("idle")}}const r={...e._asyncData[t]};r.refresh=r.execute=(o={})=>{if(e._asyncDataPromises[t]){if(N(o.dedupe??a.dedupe))return e._asyncDataPromises[t];e._asyncDataPromises[t].cancelled=!0}if((o._initial||e.isHydrating&&o._initial!==!1)&&d())return Promise.resolve(a.getCachedData(t,e));r.pending.value=!0,r.status.value="pending";const l=new Promise((c,n)=>{try{c(v(e))}catch(f){n(f)}}).then(async c=>{if(l.cancelled)return e._asyncDataPromises[t];let n=c;a.transform&&(n=await a.transform(c)),a.pick&&(n=K(n,a.pick)),e.payload.data[t]=n,r.data.value=n,r.error.value=null,r.status.value="success"}).catch(c=>{if(l.cancelled)return e._asyncDataPromises[t];r.error.value=H(c),r.data.value=R(a.default()),r.status.value="error"}).finally(()=>{l.cancelled||(r.pending.value=!1,delete e._asyncDataPromises[t])});return e._asyncDataPromises[t]=l,e._asyncDataPromises[t]},r.clear=()=>j(e,t);const D=()=>r.refresh({_initial:!0}),P=a.server!==!1&&e.payload.serverRendered;{const o=S();if(o&&!o._nuxtOnBeforeMountCbs){o._nuxtOnBeforeMountCbs=[];const n=o._nuxtOnBeforeMountCbs;O(()=>{n.forEach(f=>{f()}),n.splice(0,n.length)}),B(()=>n.splice(0,n.length))}P&&e.isHydrating&&(r.error.value||d())?(r.pending.value=!1,r.status.value=r.error.value?"error":"success"):o&&(e.payload.serverRendered&&e.isHydrating||a.lazy)&&a.immediate?o._nuxtOnBeforeMountCbs.push(D):a.immediate&&D();const l=z();if(a.watch){const n=M(a.watch,()=>r.refresh());l&&_(n)}const c=e.hook("app:data:refresh",async n=>{(!n||n.includes(t))&&await r.refresh()});l&&_(c)}const h=Promise.resolve(e._asyncDataPromises[t]).then(()=>r);return Object.assign(h,r),h}function j(s,i){i in s.payload.data&&(s.payload.data[i]=void 0),i in s.payload._errors&&(s.payload._errors[i]=null),s._asyncData[i]&&(s._asyncData[i].data.value=void 0,s._asyncData[i].error.value=null,s._asyncData[i].pending.value=!1,s._asyncData[i].status.value="idle"),i in s._asyncDataPromises&&(s._asyncDataPromises[i].cancelled=!0,s._asyncDataPromises[i]=void 0)}function K(s,i){const t={};for(const u of i)t[u]=s[u];return t}export{q as u}; +import{V as C,k as y,W as w,M as b,X as O,s as B,p as M,Y as _,N as E,Z as H,a as R,$ as S,a0 as z}from"./gOhWOHN0.js";const N=s=>s==="defer"||s===!1;function F(...s){var m;const i=typeof s[s.length-1]=="string"?s.pop():void 0;typeof s[0]!="string"&&s.unshift(i);let[t,u,a={}]=s;if(typeof t!="string")throw new TypeError("[nuxt] [asyncData] key must be a string.");if(typeof u!="function")throw new TypeError("[nuxt] [asyncData] handler must be a function.");const e=E(),v=u,p=()=>null,g=()=>e.isHydrating?e.payload.data[t]:e.static.data[t];a.server=a.server??!0,a.default=a.default??p,a.getCachedData=a.getCachedData??g,a.lazy=a.lazy??!1,a.immediate=a.immediate??!0,a.deep=a.deep??C.deep,a.dedupe=a.dedupe??"cancel";const d=()=>a.getCachedData(t,e)!=null;if(!e._asyncData[t]||!a.immediate){(m=e.payload._errors)[t]??(m[t]=null);const o=a.deep?y:w;e._asyncData[t]={data:o(a.getCachedData(t,e)??a.default()),pending:y(!d()),error:b(e.payload._errors,t),status:y("idle")}}const r={...e._asyncData[t]};r.refresh=r.execute=(o={})=>{if(e._asyncDataPromises[t]){if(N(o.dedupe??a.dedupe))return e._asyncDataPromises[t];e._asyncDataPromises[t].cancelled=!0}if((o._initial||e.isHydrating&&o._initial!==!1)&&d())return Promise.resolve(a.getCachedData(t,e));r.pending.value=!0,r.status.value="pending";const l=new Promise((c,n)=>{try{c(v(e))}catch(f){n(f)}}).then(async c=>{if(l.cancelled)return e._asyncDataPromises[t];let n=c;a.transform&&(n=await a.transform(c)),a.pick&&(n=K(n,a.pick)),e.payload.data[t]=n,r.data.value=n,r.error.value=null,r.status.value="success"}).catch(c=>{if(l.cancelled)return e._asyncDataPromises[t];r.error.value=H(c),r.data.value=R(a.default()),r.status.value="error"}).finally(()=>{l.cancelled||(r.pending.value=!1,delete e._asyncDataPromises[t])});return e._asyncDataPromises[t]=l,e._asyncDataPromises[t]},r.clear=()=>j(e,t);const D=()=>r.refresh({_initial:!0}),P=a.server!==!1&&e.payload.serverRendered;{const o=S();if(o&&!o._nuxtOnBeforeMountCbs){o._nuxtOnBeforeMountCbs=[];const n=o._nuxtOnBeforeMountCbs;O(()=>{n.forEach(f=>{f()}),n.splice(0,n.length)}),B(()=>n.splice(0,n.length))}P&&e.isHydrating&&(r.error.value||d())?(r.pending.value=!1,r.status.value=r.error.value?"error":"success"):o&&(e.payload.serverRendered&&e.isHydrating||a.lazy)&&a.immediate?o._nuxtOnBeforeMountCbs.push(D):a.immediate&&D();const l=z();if(a.watch){const n=M(a.watch,()=>r.refresh());l&&_(n)}const c=e.hook("app:data:refresh",async n=>{(!n||n.includes(t))&&await r.refresh()});l&&_(c)}const h=Promise.resolve(e._asyncDataPromises[t]).then(()=>r);return Object.assign(h,r),h}function j(s,i){i in s.payload.data&&(s.payload.data[i]=void 0),i in s.payload._errors&&(s.payload._errors[i]=null),s._asyncData[i]&&(s._asyncData[i].data.value=void 0,s._asyncData[i].error.value=null,s._asyncData[i].pending.value=!1,s._asyncData[i].status.value="idle"),i in s._asyncDataPromises&&(s._asyncDataPromises[i].cancelled=!0,s._asyncDataPromises[i]=void 0)}function K(s,i){const t={};for(const u of i)t[u]=s[u];return t}export{F as u}; diff --git a/_nuxt/DIITZ_oT.js b/_nuxt/BYuD9A8v.js similarity index 96% rename from _nuxt/DIITZ_oT.js rename to _nuxt/BYuD9A8v.js index 498e5b51..e1a1d10e 100644 --- a/_nuxt/DIITZ_oT.js +++ b/_nuxt/BYuD9A8v.js @@ -1 +1 @@ -import{d as p,I as m,p as A,K as l,$ as w}from"./DXsCzSxj.js";const S=["p","h1","h2","h3","h4","h5","h6","li"];function f(r,t){return r.type===t||typeof r.type=="object"&&r.type.tag===t||r.tag===t}function s(r){return f(r,"text")||f(r,Symbol.for("v-txt"))}function y(r){var t;return Array.isArray(r.children)||typeof r.children=="string"?r.children:typeof((t=r.children)==null?void 0:t.default)=="function"?r.children.default():[]}function a(r){if(!r)return"";if(Array.isArray(r))return r.map(a).join("");if(s(r))return r.children||r.value||"";const t=y(r);return Array.isArray(t)?t.map(a).filter(Boolean).join(""):""}function c(r,t=[]){if(Array.isArray(r))return r.flatMap(n=>c(n,t));let e=r;return t.some(n=>n==="*"||f(r,n))&&(e=y(r)||r,!Array.isArray(e)&&S.some(n=>f(r,n))&&(e=[e])),e}function h(r,t=[]){return r=Array.isArray(r)?r:[r],t.length?r.flatMap(e=>h(c(e,[t[0]]),t.slice(1))).filter(e=>!(s(e)&&a(e).trim()==="")):r}function g(r,t=[]){return typeof t=="string"&&(t=t.split(",").map(e=>e.trim()).filter(Boolean)),t.length?h(r,t).reduce((e,n)=>(s(n)?typeof e[e.length-1]=="string"?e[e.length-1]+=n.children:e.push(n.children):e.push(n),e),[]):r}const C=p({name:"MDCSlot",functional:!0,props:{name:{type:String,default:"default"},unwrap:{type:[Boolean,String],default:!1},use:{type:Function,default:void 0}},setup(r){const{parent:t}=w(),{default:e}=m(),n=A(()=>typeof r.unwrap=="string"?r.unwrap.split(" "):["*"]);return{fallbackSlot:e,tags:n,parent:t}},render({use:r,unwrap:t,fallbackSlot:e,tags:n,parent:i}){var o;try{let u=r;return typeof r=="string"&&(u=(i==null?void 0:i.slots[r])||((o=i==null?void 0:i.parent)==null?void 0:o.slots[r]),console.warn(`Please set :use="$slots.${r}" in component to enable reactivity`)),u?t?g(u(),n):[u()]:e?e():l("div")}catch{return l("div")}}}),_=p({props:{use:{type:Function,default:void 0},unwrap:{type:[Boolean,String],default:!1}},render(r){return l(C,r)}});export{_ as default}; +import{d as p,I as m,v as A,K as l,$ as w}from"./gOhWOHN0.js";const S=["p","h1","h2","h3","h4","h5","h6","li"];function f(r,t){return r.type===t||typeof r.type=="object"&&r.type.tag===t||r.tag===t}function s(r){return f(r,"text")||f(r,Symbol.for("v-txt"))}function y(r){var t;return Array.isArray(r.children)||typeof r.children=="string"?r.children:typeof((t=r.children)==null?void 0:t.default)=="function"?r.children.default():[]}function a(r){if(!r)return"";if(Array.isArray(r))return r.map(a).join("");if(s(r))return r.children||r.value||"";const t=y(r);return Array.isArray(t)?t.map(a).filter(Boolean).join(""):""}function c(r,t=[]){if(Array.isArray(r))return r.flatMap(n=>c(n,t));let e=r;return t.some(n=>n==="*"||f(r,n))&&(e=y(r)||r,!Array.isArray(e)&&S.some(n=>f(r,n))&&(e=[e])),e}function h(r,t=[]){return r=Array.isArray(r)?r:[r],t.length?r.flatMap(e=>h(c(e,[t[0]]),t.slice(1))).filter(e=>!(s(e)&&a(e).trim()==="")):r}function g(r,t=[]){return typeof t=="string"&&(t=t.split(",").map(e=>e.trim()).filter(Boolean)),t.length?h(r,t).reduce((e,n)=>(s(n)?typeof e[e.length-1]=="string"?e[e.length-1]+=n.children:e.push(n.children):e.push(n),e),[]):r}const C=p({name:"MDCSlot",functional:!0,props:{name:{type:String,default:"default"},unwrap:{type:[Boolean,String],default:!1},use:{type:Function,default:void 0}},setup(r){const{parent:t}=w(),{default:e}=m(),n=A(()=>typeof r.unwrap=="string"?r.unwrap.split(" "):["*"]);return{fallbackSlot:e,tags:n,parent:t}},render({use:r,unwrap:t,fallbackSlot:e,tags:n,parent:i}){var o;try{let u=r;return typeof r=="string"&&(u=(i==null?void 0:i.slots[r])||((o=i==null?void 0:i.parent)==null?void 0:o.slots[r]),console.warn(`Please set :use="$slots.${r}" in component to enable reactivity`)),u?t?g(u(),n):[u()]:e?e():l("div")}catch{return l("div")}}}),_=p({props:{use:{type:Function,default:void 0},unwrap:{type:[Boolean,String],default:!1}},render(r){return l(C,r)}});export{_ as default}; diff --git a/_nuxt/DcN9AMIU.js b/_nuxt/Baum9BnE.js similarity index 79% rename from _nuxt/DcN9AMIU.js rename to _nuxt/Baum9BnE.js index e1f8086e..29a7f5cb 100644 --- a/_nuxt/DcN9AMIU.js +++ b/_nuxt/Baum9BnE.js @@ -1 +1 @@ -import{d as t,a7 as a}from"./DXsCzSxj.js";const o=t({__name:"ProseCode",props:{code:{type:String,default:""},language:{type:String,default:null},filename:{type:String,default:null},highlights:{type:Array,default:()=>[]},meta:{type:String,default:null}},setup(n){return(e,r)=>a(e.$slots,"default")}});export{o as _}; +import{d as t,a7 as a}from"./gOhWOHN0.js";const o=t({__name:"ProseCode",props:{code:{type:String,default:""},language:{type:String,default:null},filename:{type:String,default:null},highlights:{type:Array,default:()=>[]},meta:{type:String,default:null}},setup(n){return(e,r)=>a(e.$slots,"default")}});export{o as _}; diff --git a/_nuxt/NhjOPkCk.js b/_nuxt/BlOjJ08E.js similarity index 77% rename from _nuxt/NhjOPkCk.js rename to _nuxt/BlOjJ08E.js index 260ef9a6..000d49f6 100644 --- a/_nuxt/NhjOPkCk.js +++ b/_nuxt/BlOjJ08E.js @@ -1 +1 @@ -import{d as n,K as e}from"./DXsCzSxj.js";const r=n({name:"DocumentDrivenEmpty",props:{value:{type:Object,required:!0}},render({value:t}){return e("div",void 0,[e("p","Document is empty"),e("p",`Add content to it by opening ${t._source}/${t._file} file.`)])}});export{r as default}; +import{d as n,K as e}from"./gOhWOHN0.js";const r=n({name:"DocumentDrivenEmpty",props:{value:{type:Object,required:!0}},render({value:t}){return e("div",void 0,[e("p","Document is empty"),e("p",`Add content to it by opening ${t._source}/${t._file} file.`)])}});export{r as default}; diff --git a/_nuxt/CAzXSrXZ.js b/_nuxt/Bs6eKMw6.js similarity index 92% rename from _nuxt/CAzXSrXZ.js rename to _nuxt/Bs6eKMw6.js index 212a8912..febcc49b 100644 --- a/_nuxt/CAzXSrXZ.js +++ b/_nuxt/Bs6eKMw6.js @@ -1,2 +1,2 @@ -const __vite__fileDeps=["./CHAMBAea.js","./DXsCzSxj.js","./C-v3KzvZ.js","./BDqtaPAc.js","./DvDH6DOc.js"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]); -import{P,H as h,L as $,Q as b,R as C,U as E}from"./DXsCzSxj.js";import{h as l}from"./DvDH6DOc.js";import{u as w}from"./BDqtaPAc.js";const d=(t,r)=>r.split(".").reduce((n,i)=>n&&n[i],t),f=(t,r)=>Object.keys(t).filter(r).reduce((n,i)=>Object.assign(n,{[i]:t[i]}),{}),B=t=>r=>t&&t.length?f(r,n=>!t.includes(n)):r,j=t=>r=>Array.isArray(r)?r.map(n=>t(n)):t(r),m=t=>{const r=[],n=[];for(const i of t)["$","_"].includes(i)?r.push(i):n.push(i);return{prefixes:r,properties:n}},q=(t=[])=>r=>{if(t.length===0||!r)return r;const{prefixes:n,properties:i}=m(t);return f(r,o=>!i.includes(o)&&!n.includes(o[0]))},Q=(t=[])=>r=>{if(t.length===0||!r)return r;const{prefixes:n,properties:i}=m(t);return f(r,o=>i.includes(o)||n.includes(o[0]))},I=(t,r)=>{const n=new Intl.Collator(r.$locale,{numeric:r.$numeric,caseFirst:r.$caseFirst,sensitivity:r.$sensitivity}),i=Object.keys(r).filter(o=>!o.startsWith("$"));for(const o of i)t=t.sort((a,e)=>{const s=[d(a,o),d(e,o)].map(c=>{if(c!==null)return c instanceof Date?c.toISOString():c});return r[o]===-1&&s.reverse(),n.compare(s[0],s[1])});return t},F=(t,r="Expected an array")=>{if(!Array.isArray(t))throw new TypeError(r)},u=t=>Array.isArray(t)?t:[void 0,null].includes(t)?[]:[t],S=["sort","where","only","without"];function x(t,r={}){const n={};for(const e of Object.keys(r.initialParams||{}))n[e]=S.includes(e)?u(r.initialParams[e]):r.initialParams[e];const i=(e,s=c=>c)=>(...c)=>(n[e]=s(...c),a),o=e=>{var s;return r.legacy?e!=null&&e.surround?e.surround:e&&(e!=null&&e.dirConfig&&(e.result={_path:(s=e.dirConfig)==null?void 0:s._path,...e.result,_dir:e.dirConfig}),e!=null&&e._path||Array.isArray(e)||!Object.prototype.hasOwnProperty.call(e,"result")?e:e==null?void 0:e.result):e},a={params:()=>({...n,...n.where?{where:[...u(n.where)]}:{},...n.sort?{sort:[...u(n.sort)]}:{}}),only:i("only",u),without:i("without",u),where:i("where",e=>[...u(n.where),...u(e)]),sort:i("sort",e=>[...u(n.sort),...u(e)]),limit:i("limit",e=>parseInt(String(e),10)),skip:i("skip",e=>parseInt(String(e),10)),find:()=>t(a).then(o),findOne:()=>t(i("first")(!0)).then(o),count:()=>t(i("count")(!0)).then(o),locale:e=>a.where({_locale:e}),withSurround:i("surround",(e,s)=>({query:e,...s})),withDirConfig:()=>i("dirConfig")(!0)};return r.legacy&&(a.findSurround=(e,s)=>a.withSurround(e,s).find().then(o)),a}function g(t){return JSON.stringify(t,A)}function A(t,r){return r instanceof RegExp?`--REGEX ${r.toString()}`:r}const O=t=>{let r=g(t);return r=typeof Buffer<"u"?Buffer.from(r).toString("base64"):btoa(r),r=r.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,""),(r.match(/.{1,100}/g)||[]).join("/")},y=t=>P(t,h().public.content.api.baseURL),U=()=>{throw console.warn("useContent is only accessible when you are using `documentDriven` mode."),console.warn("Learn more by visiting: https://content.nuxt.com/document-driven"),new Error("useContent is only accessible when you are using `documentDriven` mode.")},D=()=>{const{experimental:t}=h().public.content;return t.clientDB?!0:w().isEnabled()},L=()=>async t=>{const{content:r}=h().public,n=t.params(),i=r.experimental.stripQueryParameters?y(`/query/${`${l(n)}.${r.integrity}`}/${O(n)}.json`):y(`/query/${l(n)}.${r.integrity}.json`);if(D())return(await $(()=>import("./CHAMBAea.js"),__vite__mapDeps([0,1,2,3,4]),import.meta.url).then(e=>e.useContentDatabase())).fetch(t);const o=await $fetch(i,{method:"GET",responseType:"json",params:r.experimental.stripQueryParameters?void 0:{_params:g(n),previewToken:w().getPreviewToken()}});if(typeof o=="string"&&o.startsWith(""))throw new Error("Not found");return o};function G(t,...r){const{content:n}=h().public,i=x(L(),{initialParams:typeof t!="string"?t:{},legacy:!0});let o;typeof t=="string"&&(o=b(C(t,...r)));const a=i.params;return i.params=()=>{var s,c,p;const e=a();return o&&(e.where=e.where||[],e.first&&(e.where||[]).length===0?e.where.push({_path:E(o)}):e.where.push({_path:new RegExp(`^${o.replace(/[-[\]{}()*+.,^$\s/]/g,"\\$&")}`)})),(s=e.sort)!=null&&s.length||(e.sort=[{_file:1,$numeric:!0}]),n.locales.length&&((p=(c=e.where)==null?void 0:c.find(_=>_._locale))!=null&&p._locale||(e.where=e.where||[],e.where.push({_locale:n.defaultLocale}))),e},i}export{F as a,u as b,I as c,j as d,O as e,q as f,d as g,Q as h,x as i,g as j,B as o,G as q,D as s,U as u,y as w}; +const __vite__fileDeps=["./DCWpba_A.js","./gOhWOHN0.js","./C-v3KzvZ.js","./CRsxnQ9b.js","./DvDH6DOc.js"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]); +import{P,H as h,L as $,Q as b,R as C,U as E}from"./gOhWOHN0.js";import{h as l}from"./DvDH6DOc.js";import{u as w}from"./CRsxnQ9b.js";const d=(t,r)=>r.split(".").reduce((n,i)=>n&&n[i],t),f=(t,r)=>Object.keys(t).filter(r).reduce((n,i)=>Object.assign(n,{[i]:t[i]}),{}),B=t=>r=>t&&t.length?f(r,n=>!t.includes(n)):r,j=t=>r=>Array.isArray(r)?r.map(n=>t(n)):t(r),m=t=>{const r=[],n=[];for(const i of t)["$","_"].includes(i)?r.push(i):n.push(i);return{prefixes:r,properties:n}},q=(t=[])=>r=>{if(t.length===0||!r)return r;const{prefixes:n,properties:i}=m(t);return f(r,o=>!i.includes(o)&&!n.includes(o[0]))},Q=(t=[])=>r=>{if(t.length===0||!r)return r;const{prefixes:n,properties:i}=m(t);return f(r,o=>i.includes(o)||n.includes(o[0]))},I=(t,r)=>{const n=new Intl.Collator(r.$locale,{numeric:r.$numeric,caseFirst:r.$caseFirst,sensitivity:r.$sensitivity}),i=Object.keys(r).filter(o=>!o.startsWith("$"));for(const o of i)t=t.sort((a,e)=>{const s=[d(a,o),d(e,o)].map(c=>{if(c!==null)return c instanceof Date?c.toISOString():c});return r[o]===-1&&s.reverse(),n.compare(s[0],s[1])});return t},F=(t,r="Expected an array")=>{if(!Array.isArray(t))throw new TypeError(r)},u=t=>Array.isArray(t)?t:[void 0,null].includes(t)?[]:[t],S=["sort","where","only","without"];function x(t,r={}){const n={};for(const e of Object.keys(r.initialParams||{}))n[e]=S.includes(e)?u(r.initialParams[e]):r.initialParams[e];const i=(e,s=c=>c)=>(...c)=>(n[e]=s(...c),a),o=e=>{var s;return r.legacy?e!=null&&e.surround?e.surround:e&&(e!=null&&e.dirConfig&&(e.result={_path:(s=e.dirConfig)==null?void 0:s._path,...e.result,_dir:e.dirConfig}),e!=null&&e._path||Array.isArray(e)||!Object.prototype.hasOwnProperty.call(e,"result")?e:e==null?void 0:e.result):e},a={params:()=>({...n,...n.where?{where:[...u(n.where)]}:{},...n.sort?{sort:[...u(n.sort)]}:{}}),only:i("only",u),without:i("without",u),where:i("where",e=>[...u(n.where),...u(e)]),sort:i("sort",e=>[...u(n.sort),...u(e)]),limit:i("limit",e=>parseInt(String(e),10)),skip:i("skip",e=>parseInt(String(e),10)),find:()=>t(a).then(o),findOne:()=>t(i("first")(!0)).then(o),count:()=>t(i("count")(!0)).then(o),locale:e=>a.where({_locale:e}),withSurround:i("surround",(e,s)=>({query:e,...s})),withDirConfig:()=>i("dirConfig")(!0)};return r.legacy&&(a.findSurround=(e,s)=>a.withSurround(e,s).find().then(o)),a}function g(t){return JSON.stringify(t,A)}function A(t,r){return r instanceof RegExp?`--REGEX ${r.toString()}`:r}const O=t=>{let r=g(t);return r=typeof Buffer<"u"?Buffer.from(r).toString("base64"):btoa(r),r=r.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,""),(r.match(/.{1,100}/g)||[]).join("/")},y=t=>P(t,h().public.content.api.baseURL),U=()=>{throw console.warn("useContent is only accessible when you are using `documentDriven` mode."),console.warn("Learn more by visiting: https://content.nuxt.com/document-driven"),new Error("useContent is only accessible when you are using `documentDriven` mode.")},D=()=>{const{experimental:t}=h().public.content;return t.clientDB?!0:w().isEnabled()},L=()=>async t=>{const{content:r}=h().public,n=t.params(),i=r.experimental.stripQueryParameters?y(`/query/${`${l(n)}.${r.integrity}`}/${O(n)}.json`):y(`/query/${l(n)}.${r.integrity}.json`);if(D())return(await $(()=>import("./DCWpba_A.js"),__vite__mapDeps([0,1,2,3,4]),import.meta.url).then(e=>e.useContentDatabase())).fetch(t);const o=await $fetch(i,{method:"GET",responseType:"json",params:r.experimental.stripQueryParameters?void 0:{_params:g(n),previewToken:w().getPreviewToken()}});if(typeof o=="string"&&o.startsWith(""))throw new Error("Not found");return o};function G(t,...r){const{content:n}=h().public,i=x(L(),{initialParams:typeof t!="string"?t:{},legacy:!0});let o;typeof t=="string"&&(o=b(C(t,...r)));const a=i.params;return i.params=()=>{var s,c,p;const e=a();return o&&(e.where=e.where||[],e.first&&(e.where||[]).length===0?e.where.push({_path:E(o)}):e.where.push({_path:new RegExp(`^${o.replace(/[-[\]{}()*+.,^$\s/]/g,"\\$&")}`)})),(s=e.sort)!=null&&s.length||(e.sort=[{_file:1,$numeric:!0}]),n.locales.length&&((p=(c=e.where)==null?void 0:c.find(_=>_._locale))!=null&&p._locale||(e.where=e.where||[],e.where.push({_locale:n.defaultLocale}))),e},i}export{F as a,u as b,I as c,j as d,O as e,q as f,d as g,Q as h,x as i,g as j,B as o,G as q,D as s,U as u,y as w}; diff --git a/_nuxt/C-Ppi5pl.js b/_nuxt/C-Ppi5pl.js deleted file mode 100644 index d2b6d8b9..00000000 --- a/_nuxt/C-Ppi5pl.js +++ /dev/null @@ -1 +0,0 @@ -import{o as t,c as n,b as e,f as r,g as l,h as u,a as h,i as c,p as w,t as g,F as x,r as y,D as k,e as m}from"./DXsCzSxj.js";function b(i,o){return t(),n("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 16 16",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[e("path",{"fill-rule":"evenodd",d:"M8.914 6.025a.75.75 0 0 1 1.06 0 3.5 3.5 0 0 1 0 4.95l-2 2a3.5 3.5 0 0 1-5.396-4.402.75.75 0 0 1 1.251.827 2 2 0 0 0 3.085 2.514l2-2a2 2 0 0 0 0-2.828.75.75 0 0 1 0-1.06Z","clip-rule":"evenodd"}),e("path",{"fill-rule":"evenodd",d:"M7.086 9.975a.75.75 0 0 1-1.06 0 3.5 3.5 0 0 1 0-4.95l2-2a3.5 3.5 0 0 1 5.396 4.402.75.75 0 0 1-1.251-.827 2 2 0 0 0-3.085-2.514l-2 2a2 2 0 0 0 0 2.828.75.75 0 0 1 0 1.06Z","clip-rule":"evenodd"})])}const M={class:"flex justify-end"},I={__name:"MoreLink",props:{to:{type:String,required:!0}},setup(i){const o=i;return(a,d)=>{const p=c;return t(),n("div",M,[r(p,{to:o.to,class:"flex items-center text-sm font-bold text-white hover:text-orange-500"},{default:l(()=>[u(" More "),r(h(b),{class:"ml-1 h-5 w-5","aria-hidden":"true"})]),_:1},8,["to"])])}}},D={class:"bg-gradient-to-b from-transparent to-background text-white"},V={class:"container mx-auto space-y-4 py-8 text-white"},N={class:"mb-4 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3"},P={class:"h-full rounded-xl bg-black bg-opacity-70 drop-shadow-lg hover:ring-1 hover:ring-white"},j={class:"min-h-28 px-4 pt-4"},B={class:"pb-2 text-xl font-bold"},L=["innerHTML"],T={key:0},C=["src"],S={key:0},q="Experiments",A={__name:"Playground",props:{showImages:{type:Boolean,default:!1},limit:{type:Number,default:null},linkToPlayground:{type:Boolean,default:!1}},setup(i){const o=i,a=[{title:"wm.spoon",description:"Hammerpoon Window Manager",link:"https://github.com/cmpadden/wm.spoon",img:"/images/previews/wm.spoon.png"},{title:"Metronome",description:"A simple metronome for tracking tempo.",link:"/playground/metronome",img:"/images/previews/metronome.png"},{title:"French Conjugations",description:"Search and explore the conjugations of 1000 French verbs",link:"/playground/french",img:"/images/previews/french-conjugations.png"},{title:"Noise Mountains",description:"Visualize a gradient of colored waves generated with Perlin noise",link:"/playground/palettes/mountains",img:"/images/previews/noise.png"},{title:"Audio Visualizations",description:"Visualize the audio from your microphone as a waveform, frequency bars, and a spectrogram",link:"/playground/audio",img:"/images/previews/microphone.png"},{title:"Trigonometric Waves",description:"Demonstration of using p5.js within Vue.js to visualize trigonometric functions",link:"/playground/waves",img:"/images/previews/waves.png"},{title:"MIDI Chords",description:"Identify the chords being played by your attached MIDI device",link:"/playground/chords",img:"/images/previews/chord-identifier.png"},{title:"MIDI Events",description:"View the MIDI events triggered by a MIDI-controller through the Web MIDI API",link:"/playground/midi",img:"/images/previews/midi-events.png"},{title:"Matrix Multiplication",description:"Step through the process of matrix multiplication",link:"/playground/matrix",img:"/images/previews/matrix-multiplication.png"},{title:"Sequence Plotter",description:"Plot the fist 10,000 digits of Pi, or any sequence of digits, in 2-dimensional space",link:"/playground/plotter",img:"/images/previews/plotter.png"}],d=w(()=>o.limit===null||o.limit<=0?a:a.slice(0,o.limit));return(p,z)=>{const _=c,f=c,v=I;return t(),n("section",D,[e("div",V,[r(_,{to:"/playground",class:"font-mono text-3xl font-semibold lowercase underline decoration-orange-500 underline-offset-4"},{default:l(()=>[u(g(q))]),_:1}),e("div",N,[(t(!0),n(x,null,y(h(d),s=>(t(),k(f,{key:s.title,to:s.link},{default:l(()=>[e("div",P,[e("div",j,[e("h3",B,g(s.title),1),e("div",{class:"line-clamp-2 text-base font-light",innerHTML:s.description},null,8,L)]),i.showImages?(t(),n("div",T,[e("img",{class:"h-48 w-full rounded-b-xl object-cover",src:s.img||"images/placeholder.png"},null,8,C)])):m("",!0)])]),_:2},1032,["to"]))),128))]),i.linkToPlayground?(t(),n("div",S,[r(v,{to:"/playground"})])):m("",!0)])])}}};export{I as _,A as a}; diff --git a/_nuxt/C2Jkzvlm.js b/_nuxt/C2Jkzvlm.js deleted file mode 100644 index 06070875..00000000 --- a/_nuxt/C2Jkzvlm.js +++ /dev/null @@ -1 +0,0 @@ -import{d as i,H as c,p,o as s,c as n,a as u,a7 as t}from"./DXsCzSxj.js";const f=["id"],l=["href"],k=i({__name:"ProseH4",props:{id:{}},setup(a){const r=a,{headings:o}=c().public.mdc,d=p(()=>{var e;return r.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h4)});return(e,m)=>(s(),n("h4",{id:e.id},[e.id&&u(d)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,l)):t(e.$slots,"default",{key:1})],8,f))}});export{k as default}; diff --git a/_nuxt/4Lx8IeLa.js b/_nuxt/C4mBrkTM.js similarity index 86% rename from _nuxt/4Lx8IeLa.js rename to _nuxt/C4mBrkTM.js index 436f066d..521e6264 100644 --- a/_nuxt/4Lx8IeLa.js +++ b/_nuxt/C4mBrkTM.js @@ -1 +1 @@ -import{_ as s,o as n,c,b as e,f as t,a7 as l,a9 as d}from"./DXsCzSxj.js";const i={},f={class:"pin-b w-full p-4 text-xs font-bold text-white"},h=e("div",{class:"flex justify-center space-x-2"},[e("a",{class:"hover:cursor-pointer hover:text-blue-200",href:"https://github.com/cmpadden/cmpadden.github.io"}," © Colton Padden"),e("span",null,"•"),e("a",{class:"hover:cursor-pointer hover:text-blue-200",href:"/sitemap.xml"},"Sitemap"),e("span",null,"•"),e("a",{class:"hover:cursor-pointer hover:text-blue-200",href:"/atom"},"RSS")],-1),u=[h];function p(o,r){return n(),c("footer",f,u)}const m=s(i,[["render",p]]),x={},b={class:"bg-orange-500"},v={class:"rounded-3xl border-[10px] border-orange-500"},g={class:"flex min-h-screen flex-col rounded-3xl bg-background font-display"},$={class:"flex-1"};function S(o,r){const a=d,_=m;return n(),c("div",b,[e("div",v,[e("main",g,[t(a),e("main",$,[l(o.$slots,"default")]),t(_)])])])}const B=s(x,[["render",S]]);export{B as default}; +import{_ as s,o as n,c,b as e,f as t,a7 as l,a9 as d}from"./gOhWOHN0.js";const i={},f={class:"pin-b w-full p-4 text-xs font-bold text-white"},h=e("div",{class:"flex justify-center space-x-2"},[e("a",{class:"hover:cursor-pointer hover:text-blue-200",href:"https://github.com/cmpadden/cmpadden.github.io"}," © Colton Padden"),e("span",null,"•"),e("a",{class:"hover:cursor-pointer hover:text-blue-200",href:"/sitemap.xml"},"Sitemap"),e("span",null,"•"),e("a",{class:"hover:cursor-pointer hover:text-blue-200",href:"/atom"},"RSS")],-1),u=[h];function p(o,r){return n(),c("footer",f,u)}const m=s(i,[["render",p]]),x={},b={class:"bg-orange-500"},v={class:"rounded-3xl border-[10px] border-orange-500"},g={class:"flex min-h-screen flex-col rounded-3xl bg-background font-display"},$={class:"flex-1"};function S(o,r){const a=d,_=m;return n(),c("div",b,[e("div",v,[e("main",g,[t(a),e("main",$,[l(o.$slots,"default")]),t(_)])])])}const B=s(x,[["render",S]]);export{B as default}; diff --git a/_nuxt/BPc1APT0.js b/_nuxt/CDtnVs50.js similarity index 65% rename from _nuxt/BPc1APT0.js rename to _nuxt/CDtnVs50.js index aae67096..35620dac 100644 --- a/_nuxt/BPc1APT0.js +++ b/_nuxt/CDtnVs50.js @@ -1 +1 @@ -import{_ as o,o as r,c as t,a7 as a}from"./DXsCzSxj.js";const s={};function c(e,n){return r(),t("thead",null,[a(e.$slots,"default")])}const _=o(s,[["render",c]]);export{_ as default}; +import{_ as o,o as r,c as t,a7 as a}from"./gOhWOHN0.js";const s={};function c(e,n){return r(),t("thead",null,[a(e.$slots,"default")])}const _=o(s,[["render",c]]);export{_ as default}; diff --git a/_nuxt/DmysA0Ea.js b/_nuxt/CHcL3rNM.js similarity index 65% rename from _nuxt/DmysA0Ea.js rename to _nuxt/CHcL3rNM.js index a3cde6d2..a3015e67 100644 --- a/_nuxt/DmysA0Ea.js +++ b/_nuxt/CHcL3rNM.js @@ -1 +1 @@ -import{_ as o,o as t,c,a7 as r}from"./DXsCzSxj.js";const s={};function n(e,a){return t(),c("blockquote",null,[r(e.$slots,"default")])}const _=o(s,[["render",n]]);export{_ as default}; +import{_ as o,o as t,c,a7 as r}from"./gOhWOHN0.js";const s={};function n(e,a){return t(),c("blockquote",null,[r(e.$slots,"default")])}const _=o(s,[["render",n]]);export{_ as default}; diff --git a/_nuxt/B0OY2XLG.js b/_nuxt/CJDBQGN9.js similarity index 78% rename from _nuxt/B0OY2XLG.js rename to _nuxt/CJDBQGN9.js index 72ef5d89..964bc3a8 100644 --- a/_nuxt/B0OY2XLG.js +++ b/_nuxt/CJDBQGN9.js @@ -1 +1 @@ -import{c as e,o as t,b as o}from"./DXsCzSxj.js";const s={class:"flex h-[768px] justify-center border-2 border-gray-500"},r=o("iframe",{src:"https://simple-tempo.com",width:"100%",height:"100%"},null,-1),c=[r],i={__name:"metronome",setup(a){return(n,_)=>(t(),e("main",s,c))}};export{i as default}; +import{c as e,o as t,b as o}from"./gOhWOHN0.js";const s={class:"flex h-[768px] justify-center border-2 border-gray-500"},r=o("iframe",{src:"https://simple-tempo.com",width:"100%",height:"100%"},null,-1),c=[r],i={__name:"metronome",setup(a){return(n,_)=>(t(),e("main",s,c))}};export{i as default}; diff --git a/_nuxt/5U82x1xs.js b/_nuxt/CLHUyLrC.js similarity index 94% rename from _nuxt/5U82x1xs.js rename to _nuxt/CLHUyLrC.js index efb7ba0a..6c9869c9 100644 --- a/_nuxt/5U82x1xs.js +++ b/_nuxt/CLHUyLrC.js @@ -1 +1 @@ -import{_ as x,c as o,b as t,F as d,r as _,o as l,f as g,g as p,h as f,t as a,n as u,i as v}from"./DXsCzSxj.js";import{_ as k}from"./DnPT5WRD.js";import y from"./D_k-9tiD.js";import{q as C}from"./CAzXSrXZ.js";import"./C-v3KzvZ.js";import"./BDqtaPAc.js";import"./DvDH6DOc.js";const w={async setup(){return{articles:await C().only(["_id","_path","title","description","date","img","author","tags","categories","img","excerpt","summary"]).sort({date:-1}).find()}},data(){return{selected_tags:[],selected_categories:[]}},computed:{categories(){return[...new Set(this.articles.map(s=>s.categories).flat().sort())]},tags(){return[...new Set(this.articles.map(s=>s.tags).flat().sort())]},visible_articles(){return this.articles.filter(s=>!(this.selected_categories.length>0&&!this.selected_categories.every(c=>s.categories.includes(c))||this.selected_tags.length>0&&!this.selected_tags.every(c=>s.tags.includes(c))))}},methods:{toggle_tag(s){this.selected_tags.includes(s)?this.selected_tags=this.selected_tags.filter(c=>c!==s):this.selected_tags.push(s)},toggle_category(s){this.selected_categories.includes(s)?this.selected_categories=this.selected_categories.filter(c=>c!==s):this.selected_categories.push(s)}}},N={class:"container mx-auto"},B={class:"grid grid-cols-4 gap-4"},S={class:"col-span-4 lg:col-span-3"},V={class:"rounded-xl bg-black/50 text-white shadow-xl"},q={class:"relative mb-2 h-full"},F={class:"px-4 py-2"},L={class:"mb-2 text-xl font-bold"},R={class:"flex items-center text-sm"},T={class:"mb-3 px-4 pb-12"},j={class:"prose-sm"},z={class:"absolute bottom-0 right-0 mb-4"},D={class:"tag"},E={class:"col-span-4 inline-block lg:col-span-1"},M={class:"mb-3 rounded-xl bg-black/50 text-white"},A=t("p",{class:"mb-0 px-3 py-2 text-xl font-bold"},"Categories",-1),G=["onClick"],H={class:"mb-3 rounded-xl bg-black/50 text-white"},I=t("p",{class:"mb-0 px-3 py-2 text-xl font-bold"},"Tags",-1),J={class:"p-2"},K=["onClick"];function O(s,c,P,Q,r,i){const h=v,m=k,b=y;return l(),o("section",N,[t("div",B,[t("div",S,[(l(!0),o(d,null,_(i.visible_articles,e=>(l(),o("div",{key:e._id},[t("div",V,[t("div",q,[t("div",F,[t("div",L,[g(h,{class:"border-b-2 border-orange-500 hover:text-orange-500",to:e._path},{default:p(()=>[f(a(e.title),1)]),_:2},1032,["to"])]),t("p",R,a(e.date),1)]),t("div",T,[t("p",j,[g(b,{class:"prose prose-sm mx-auto sm:prose lg:prose-lg xl:prose-2xl",value:e},{default:p(()=>[g(m,{value:{body:e.excerpt}},null,8,["value"])]),_:2},1032,["value"])])]),t("div",z,[(l(!0),o(d,null,_(e.tags,n=>(l(),o("span",{key:n,class:u([{"bg-green-600":r.selected_tags.includes(n)},"mr-2 inline-block select-none bg-black px-3 py-1 text-sm text-orange-200"])},[t("div",D,a(n),1)],2))),128))])])])]))),128))]),t("div",E,[t("div",M,[A,(l(!0),o(d,null,_(i.categories,e=>(l(),o("a",{key:e,class:u([{"bg-green-600":r.selected_categories.includes(e),"hover:bg-red-600":r.selected_categories.includes(e)},"block cursor-pointer select-none border-t border-black px-4 py-1 text-orange-200 hover:bg-black"]),onClick:n=>i.toggle_category(e)},a(e),11,G))),128))]),t("div",H,[I,t("div",J,[(l(!0),o(d,null,_(i.tags,(e,n)=>(l(),o("span",{key:n,class:u([{"bg-green-600":r.selected_tags.includes(e),"hover:bg-red-600":r.selected_tags.includes(e)},"mb-2 mr-2 inline-flex h-8 cursor-pointer select-none content-center justify-center bg-black px-3 py-2 text-sm leading-4 text-orange-200"]),onClick:U=>i.toggle_tag(e)},[t("div",null,a(e),1)],10,K))),128))])])])])])}const se=x(w,[["render",O]]);export{se as default}; +import{_ as x,c as o,b as t,F as d,r as _,o as l,f as g,g as p,h as f,t as a,n as u,i as v}from"./gOhWOHN0.js";import{_ as k}from"./B519It_T.js";import y from"./gtS2INEI.js";import{q as C}from"./Bs6eKMw6.js";import"./C-v3KzvZ.js";import"./CRsxnQ9b.js";import"./DvDH6DOc.js";const w={async setup(){return{articles:await C().only(["_id","_path","title","description","date","img","author","tags","categories","img","excerpt","summary"]).sort({date:-1}).find()}},data(){return{selected_tags:[],selected_categories:[]}},computed:{categories(){return[...new Set(this.articles.map(s=>s.categories).flat().sort())]},tags(){return[...new Set(this.articles.map(s=>s.tags).flat().sort())]},visible_articles(){return this.articles.filter(s=>!(this.selected_categories.length>0&&!this.selected_categories.every(c=>s.categories.includes(c))||this.selected_tags.length>0&&!this.selected_tags.every(c=>s.tags.includes(c))))}},methods:{toggle_tag(s){this.selected_tags.includes(s)?this.selected_tags=this.selected_tags.filter(c=>c!==s):this.selected_tags.push(s)},toggle_category(s){this.selected_categories.includes(s)?this.selected_categories=this.selected_categories.filter(c=>c!==s):this.selected_categories.push(s)}}},N={class:"container mx-auto"},B={class:"grid grid-cols-4 gap-4"},S={class:"col-span-4 lg:col-span-3"},V={class:"rounded-xl bg-black/50 text-white shadow-xl"},q={class:"relative mb-2 h-full"},F={class:"px-4 py-2"},L={class:"mb-2 text-xl font-bold"},R={class:"flex items-center text-sm"},T={class:"mb-3 px-4 pb-12"},j={class:"prose-sm"},z={class:"absolute bottom-0 right-0 mb-4"},D={class:"tag"},E={class:"col-span-4 inline-block lg:col-span-1"},M={class:"mb-3 rounded-xl bg-black/50 text-white"},A=t("p",{class:"mb-0 px-3 py-2 text-xl font-bold"},"Categories",-1),G=["onClick"],H={class:"mb-3 rounded-xl bg-black/50 text-white"},I=t("p",{class:"mb-0 px-3 py-2 text-xl font-bold"},"Tags",-1),J={class:"p-2"},K=["onClick"];function O(s,c,P,Q,r,i){const h=v,m=k,b=y;return l(),o("section",N,[t("div",B,[t("div",S,[(l(!0),o(d,null,_(i.visible_articles,e=>(l(),o("div",{key:e._id},[t("div",V,[t("div",q,[t("div",F,[t("div",L,[g(h,{class:"border-b-2 border-orange-500 hover:text-orange-500",to:e._path},{default:p(()=>[f(a(e.title),1)]),_:2},1032,["to"])]),t("p",R,a(e.date),1)]),t("div",T,[t("p",j,[g(b,{class:"prose prose-sm mx-auto sm:prose lg:prose-lg xl:prose-2xl",value:e},{default:p(()=>[g(m,{value:{body:e.excerpt}},null,8,["value"])]),_:2},1032,["value"])])]),t("div",z,[(l(!0),o(d,null,_(e.tags,n=>(l(),o("span",{key:n,class:u([{"bg-green-600":r.selected_tags.includes(n)},"mr-2 inline-block select-none bg-black px-3 py-1 text-sm text-orange-200"])},[t("div",D,a(n),1)],2))),128))])])])]))),128))]),t("div",E,[t("div",M,[A,(l(!0),o(d,null,_(i.categories,e=>(l(),o("a",{key:e,class:u([{"bg-green-600":r.selected_categories.includes(e),"hover:bg-red-600":r.selected_categories.includes(e)},"block cursor-pointer select-none border-t border-black px-4 py-1 text-orange-200 hover:bg-black"]),onClick:n=>i.toggle_category(e)},a(e),11,G))),128))]),t("div",H,[I,t("div",J,[(l(!0),o(d,null,_(i.tags,(e,n)=>(l(),o("span",{key:n,class:u([{"bg-green-600":r.selected_tags.includes(e),"hover:bg-red-600":r.selected_tags.includes(e)},"mb-2 mr-2 inline-flex h-8 cursor-pointer select-none content-center justify-center bg-black px-3 py-2 text-sm leading-4 text-orange-200"]),onClick:U=>i.toggle_tag(e)},[t("div",null,a(e),1)],10,K))),128))])])])])])}const se=x(w,[["render",O]]);export{se as default}; diff --git a/_nuxt/CMLPrMyp.js b/_nuxt/CMLPrMyp.js new file mode 100644 index 00000000..41308297 --- /dev/null +++ b/_nuxt/CMLPrMyp.js @@ -0,0 +1 @@ +import{d as i,H as c,v as p,o as s,c as n,a as u,a7 as t}from"./gOhWOHN0.js";const f=["id"],l=["href"],k=i({__name:"ProseH5",props:{id:{}},setup(a){const r=a,{headings:o}=c().public.mdc,d=p(()=>{var e;return r.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h5)});return(e,m)=>(s(),n("h5",{id:e.id},[e.id&&u(d)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,l)):t(e.$slots,"default",{key:1})],8,f))}});export{k as default}; diff --git a/_nuxt/Dw8zNcBR.js b/_nuxt/CNKvkIMX.js similarity index 64% rename from _nuxt/Dw8zNcBR.js rename to _nuxt/CNKvkIMX.js index 4d05892e..113f4928 100644 --- a/_nuxt/Dw8zNcBR.js +++ b/_nuxt/CNKvkIMX.js @@ -1 +1 @@ -import{_ as o,o as r,c as t,a7 as s}from"./DXsCzSxj.js";const c={};function n(e,a){return r(),t("td",null,[s(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; +import{_ as o,o as r,c as t,a7 as s}from"./gOhWOHN0.js";const c={};function n(e,a){return r(),t("td",null,[s(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/BDqtaPAc.js b/_nuxt/CRsxnQ9b.js similarity index 87% rename from _nuxt/BDqtaPAc.js rename to _nuxt/CRsxnQ9b.js index 508c3b86..82c24e72 100644 --- a/_nuxt/BDqtaPAc.js +++ b/_nuxt/CRsxnQ9b.js @@ -1 +1 @@ -import{k as S,a0 as T,Y as E,q as C,a6 as A,a5 as O,E as P,u as h}from"./DXsCzSxj.js";import{i as I}from"./DvDH6DOc.js";const m=/^[\u0009\u0020-\u007E\u0080-\u00FF]+$/;function R(e,i){if(typeof e!="string")throw new TypeError("argument str must be a string");const o={},a=(i||{}).decode||N;let s=0;for(;sO(decodeURIComponent(e)),encode:e=>encodeURIComponent(typeof e=="string"?e:JSON.stringify(e))},L=void 0;function y(e,i){var f;const o={...q,...i},t=b(o)||{};let a;o.maxAge!==void 0?a=o.maxAge*1e3:o.expires&&(a=o.expires.getTime()-Date.now());const s=a!==void 0&&a<=0,r=u(s?void 0:t[e]??((f=o.default)==null?void 0:f.call(o))),n=a&&!s?B(r,a,o.watch&&o.watch!=="shallow"):S(r);{let c=null;try{!L&&typeof BroadcastChannel<"u"&&(c=new BroadcastChannel(`nuxt:cookies:${e}`))}catch{}const l=()=>{o.readonly||I(n.value,t[e])||(_(e,n.value,o),t[e]=u(n.value),c==null||c.postMessage({value:o.encode(n.value)}))},p=w=>{var v;const j=w.refresh?(v=b(o))==null?void 0:v[e]:o.decode(w.value);d=!0,t[e]=n.value=j,P(()=>{d=!1})};let d=!1;T()&&E(()=>{d=!0,l(),c==null||c.close()}),c&&(c.onmessage=({data:w})=>p(w)),o.watch?C(n,()=>{d||l()},{deep:o.watch!=="shallow"}):l()}return n}function b(e={}){return R(document.cookie,e)}function U(e,i,o={}){return i==null?g(e,i,{...o,maxAge:-1}):g(e,i,o)}function _(e,i,o={}){document.cookie=U(e,i,o)}const k=2147483647;function B(e,i,o){let t,a,s=0;const r=o?S(e):{value:e};return T()&&E(()=>{a==null||a(),clearTimeout(t)}),A((n,f)=>{o&&(a=C(r,f));function c(){clearTimeout(t);const l=i-s,p=l{if(s+=p,s({isEnabled:()=>{const t=h().query;return Object.prototype.hasOwnProperty.call(t,"preview")&&!t.preview?!1:!!(t.preview||y("previewToken").value||sessionStorage.getItem("previewToken"))},getPreviewToken:()=>y("previewToken").value||sessionStorage.getItem("previewToken")||void 0,setPreviewToken:t=>{y("previewToken").value=t,h().query.preview=t||"",t?sessionStorage.setItem("previewToken",t):sessionStorage.removeItem("previewToken"),window.location.reload()}});export{z as u}; +import{k as S,a0 as T,Y as E,p as C,a6 as A,a5 as O,E as P,u as h}from"./gOhWOHN0.js";import{i as I}from"./DvDH6DOc.js";const m=/^[\u0009\u0020-\u007E\u0080-\u00FF]+$/;function R(e,i){if(typeof e!="string")throw new TypeError("argument str must be a string");const o={},a=(i||{}).decode||N;let s=0;for(;sO(decodeURIComponent(e)),encode:e=>encodeURIComponent(typeof e=="string"?e:JSON.stringify(e))},U=void 0;function y(e,i){var f;const o={...L,...i},t=b(o)||{};let a;o.maxAge!==void 0?a=o.maxAge*1e3:o.expires&&(a=o.expires.getTime()-Date.now());const s=a!==void 0&&a<=0,r=u(s?void 0:t[e]??((f=o.default)==null?void 0:f.call(o))),n=a&&!s?B(r,a,o.watch&&o.watch!=="shallow"):S(r);{let c=null;try{!U&&typeof BroadcastChannel<"u"&&(c=new BroadcastChannel(`nuxt:cookies:${e}`))}catch{}const l=()=>{o.readonly||I(n.value,t[e])||(q(e,n.value,o),t[e]=u(n.value),c==null||c.postMessage({value:o.encode(n.value)}))},p=w=>{var v;const j=w.refresh?(v=b(o))==null?void 0:v[e]:o.decode(w.value);d=!0,t[e]=n.value=j,P(()=>{d=!1})};let d=!1;T()&&E(()=>{d=!0,l(),c==null||c.close()}),c&&(c.onmessage=({data:w})=>p(w)),o.watch?C(n,()=>{d||l()},{deep:o.watch!=="shallow"}):l()}return n}function b(e={}){return R(document.cookie,e)}function _(e,i,o={}){return i==null?g(e,i,{...o,maxAge:-1}):g(e,i,o)}function q(e,i,o={}){document.cookie=_(e,i,o)}const k=2147483647;function B(e,i,o){let t,a,s=0;const r=o?S(e):{value:e};return T()&&E(()=>{a==null||a(),clearTimeout(t)}),A((n,f)=>{o&&(a=C(r,f));function c(){clearTimeout(t);const l=i-s,p=l{if(s+=p,s({isEnabled:()=>{const t=h().query;return Object.prototype.hasOwnProperty.call(t,"preview")&&!t.preview?!1:!!(t.preview||y("previewToken").value||sessionStorage.getItem("previewToken"))},getPreviewToken:()=>y("previewToken").value||sessionStorage.getItem("previewToken")||void 0,setPreviewToken:t=>{y("previewToken").value=t,h().query.preview=t||"",t?sessionStorage.setItem("previewToken",t):sessionStorage.removeItem("previewToken"),window.location.reload()}});export{z as u}; diff --git a/_nuxt/CV7OJtEk.js b/_nuxt/CV7OJtEk.js deleted file mode 100644 index 8219c06f..00000000 --- a/_nuxt/CV7OJtEk.js +++ /dev/null @@ -1 +0,0 @@ -import{p as C,x as O,y as R,z as _,d as U,k as N,w as V,q,o as r,c as n,b as o,a,F as y,A as E,B as I,C as K,r as k,h as B,t as x,e as S}from"./DXsCzSxj.js";import{h as W}from"./DvDH6DOc.js";import{u as M}from"./W6vbqLg7.js";function G(h,l,v){const[e={},c]=typeof l=="string"?[{},l]:[l,v],s=C(()=>_(h)),t=e.key||W([c,typeof s.value=="string"?s.value:"",...H(e)]);if(!t||typeof t!="string")throw new TypeError("[nuxt] [useFetch] key must be a string: "+t);const d=t===c?"$f"+t:t;if(!e.baseURL&&typeof s.value=="string"&&s.value[0]==="/"&&s.value[1]==="/")throw new Error('[nuxt] [useFetch] the request URL must not start with "//".');const{server:m,lazy:w,default:j,transform:D,pick:F,watch:u,immediate:p,getCachedData:i,deep:g,dedupe:L,...$}=e,b=O({...R,...$,cache:typeof e.cache=="boolean"?void 0:e.cache}),A={server:m,lazy:w,default:j,transform:D,pick:F,immediate:p,getCachedData:i,deep:g,dedupe:L,watch:u===!1?[]:[b,s,...u||[]]};let f;return M(d,()=>{var z;(z=f==null?void 0:f.abort)==null||z.call(f),f=typeof AbortController<"u"?new AbortController:{};const T=_(e.timeout);return T&&setTimeout(()=>f.abort(),T),(e.$fetch||globalThis.$fetch)(s.value,{signal:f.signal,...b})},A)}function H(h){var v;const l=[((v=_(h.method))==null?void 0:v.toUpperCase())||"GET",_(h.baseURL)];for(const e of[h.params||h.query]){const c=_(e);if(!c)continue;const s={};for(const[t,d]of Object.entries(c))s[_(t)]=_(d);l.push(s)}return l}const P={class:"flex h-screen flex-col font-mono"},Q={class:"flex flex-1 overflow-hidden"},J=o("div",{class:"flex w-20 bg-amber-500"},[o("div",{class:"absolute bottom-10 w-20 -rotate-90 transform whitespace-nowrap"},[o("div",{class:"text-4xl font-bold text-white"}," 1000 French Conjugations ")])],-1),X={class:"flex flex-1 flex-col overflow-y-auto bg-amber-100 p-8"},Y=o("div",{class:"flex rounded-xl bg-amber-500 p-4"},[o("div",{class:"text-center text-xl italic text-white"}," Click a word to the left or right to cycle through the 1000 most popular French verb conjugations! ")],-1),Z={class:"inline-flex flex-col justify-center py-4 text-gray-600"},ee={key:0,class:"mt-2 w-full border border-gray-100 bg-white"},te=["onClick"],oe=o("svg",{class:"absolute left-2 top-2 h-4 w-4",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor"},[o("path",{d:"M12.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-2.293-2.293a1 1 0 010-1.414z"})],-1),se={class:"flex p-4"},ae={class:"text-cyan-600 flex-1 text-center text-3xl font-bold"},re={class:"text-amber-500"},ne={class:"grid grid-cols-1 gap-8 md:grid-cols-3 xl:grid-cols-4 xl:gap-12"},le={class:"border-cyan-600 h-full space-y-3 rounded-md border-2 bg-white p-4 shadow shadow-amber-500"},ce={class:"text-2xl font-semibold capitalize text-gray-700"},ie={class:"text-gray-500"},ue={key:1,class:"italic"},xe=U({__name:"index",async setup(h){let l,v;const e=N(0),c=N(""),s=N([]),{data:t}=([l,v]=V(()=>G("/1000_french_conjugations.json",{transform:u=>u},"$lRKQKt9Al2")),l=await l,v(),l),d=C(()=>{if(t.value)return t.value[e.value]}),m=C(()=>{if(t.value!==null)return e.value===0?void 0:t.value[e.value-1]}),w=C(()=>{if(t.value!==null)return e.value+1===t.value.length?void 0:t.value[e.value+1]});q(c,u=>{if(s.value=[],!u)return;let p=0;s.value=t.value.filter(i=>i.word.normalize("NFD").replace(new RegExp("\\p{Diacritic}","gu"),"").includes(u)&&p<=5?(p++,!0):!1)});const j=()=>{t.value&&e.value{e.value>0&&(e.value-=1)},F=u=>{c.value="",s.value=[],e.value=u.word_popularity-1};return(u,p)=>(r(),n("div",P,[o("div",Q,[J,o("div",X,[a(t)&&a(t).length>0&&a(d)?(r(),n(y,{key:0},[Y,o("div",Z,[E(o("input",{"onUpdate:modelValue":p[0]||(p[0]=i=>K(c)?c.value=i:null),class:"rounded-xl border border-2 border-gray-400 p-2 pl-8 focus:border-amber-500 focus:outline-none",type:"search",autocomplete:"off",placeholder:"Search Words"},null,512),[[I,a(c)]]),a(s).length>0?(r(),n("ul",ee,[(r(!0),n(y,null,k(a(s),i=>(r(),n("li",{key:i.word,class:"relative cursor-pointer py-1 pl-8 pr-2 hover:bg-yellow-50 hover:text-gray-900",onClick:g=>F(i)},[oe,B(" "+x(i.word),1)],8,te))),128))])):S("",!0)]),o("div",se,[o("div",{class:"flex-1 cursor-pointer select-none text-center text-2xl text-gray-400",onClick:D},x(a(m)?a(m).word:"-"),1),o("div",ae,[o("span",re," #"+x(a(d).word_popularity),1),B(" "+x(a(d).word),1)]),o("div",{class:"flex-1 cursor-pointer select-none text-center text-2xl text-gray-400",onClick:j},x(a(w)?a(w).word:"-"),1)]),o("div",ne,[(r(!0),n(y,null,k(a(d).conjugations,(i,g)=>(r(),n("div",{key:g},[o("div",le,[o("h1",ce,x(g),1),o("div",ie,[(r(!0),n(y,null,k(i,(L,$)=>(r(),n("p",{key:$},[(r(!0),n(y,null,k(L,(b,A)=>(r(),n("i",{key:A},x(b.text),1))),128))]))),128))])])]))),128))])],64)):(r(),n("div",ue,"Loading..."))])])]))}});export{xe as default}; diff --git a/_nuxt/B4E9Ejgf.js b/_nuxt/C_BaIC7i.js similarity index 65% rename from _nuxt/B4E9Ejgf.js rename to _nuxt/C_BaIC7i.js index 515f55a6..c2f0c1b2 100644 --- a/_nuxt/B4E9Ejgf.js +++ b/_nuxt/C_BaIC7i.js @@ -1 +1 @@ -import{_ as o,o as r,c as t,a7 as a}from"./DXsCzSxj.js";const s={};function c(e,n){return r(),t("table",null,[a(e.$slots,"default")])}const _=o(s,[["render",c]]);export{_ as default}; +import{_ as o,o as r,c as t,a7 as a}from"./gOhWOHN0.js";const s={};function c(e,n){return r(),t("table",null,[a(e.$slots,"default")])}const _=o(s,[["render",c]]);export{_ as default}; diff --git a/_nuxt/BJeRYyju.js b/_nuxt/Caz8YKf-.js similarity index 63% rename from _nuxt/BJeRYyju.js rename to _nuxt/Caz8YKf-.js index 7e0b318c..13b7c770 100644 --- a/_nuxt/BJeRYyju.js +++ b/_nuxt/Caz8YKf-.js @@ -1 +1 @@ -import{_ as r,o,c as t,a7 as s}from"./DXsCzSxj.js";const c={};function n(e,a){return o(),t("tr",null,[s(e.$slots,"default")])}const _=r(c,[["render",n]]);export{_ as default}; +import{_ as r,o,c as t,a7 as s}from"./gOhWOHN0.js";const c={};function n(e,a){return o(),t("tr",null,[s(e.$slots,"default")])}const _=r(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/CdNF5em2.js b/_nuxt/CdNF5em2.js new file mode 100644 index 00000000..2a9d6486 --- /dev/null +++ b/_nuxt/CdNF5em2.js @@ -0,0 +1 @@ +import{_ as o}from"./B519It_T.js";import"./gOhWOHN0.js";import"./C-v3KzvZ.js";import"./CRsxnQ9b.js";import"./DvDH6DOc.js";export{o as default}; diff --git a/_nuxt/CeHv7BBr.js b/_nuxt/CeHv7BBr.js new file mode 100644 index 00000000..2b5cfc42 --- /dev/null +++ b/_nuxt/CeHv7BBr.js @@ -0,0 +1 @@ +import{d as i,H as c,v as p,o as s,c as n,a as u,a7 as t}from"./gOhWOHN0.js";const f=["id"],l=["href"],k=i({__name:"ProseH3",props:{id:{}},setup(a){const r=a,{headings:o}=c().public.mdc,d=p(()=>{var e;return r.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h3)});return(e,m)=>(s(),n("h3",{id:e.id},[e.id&&u(d)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,l)):t(e.$slots,"default",{key:1})],8,f))}});export{k as default}; diff --git a/_nuxt/Ch5M0tju.js b/_nuxt/Ch5M0tju.js deleted file mode 100644 index 15c6907f..00000000 --- a/_nuxt/Ch5M0tju.js +++ /dev/null @@ -1 +0,0 @@ -import"./DXsCzSxj.js";const e=window.setInterval;export{e as s}; diff --git a/_nuxt/WlOj4iQ2.js b/_nuxt/ChudRan8.js similarity index 89% rename from _nuxt/WlOj4iQ2.js rename to _nuxt/ChudRan8.js index f12c1a00..8877b25f 100644 --- a/_nuxt/WlOj4iQ2.js +++ b/_nuxt/ChudRan8.js @@ -1 +1 @@ -import{u as g}from"./W6vbqLg7.js";import{q as m}from"./CAzXSrXZ.js";import{d as C,O as S,p as b,H as O,q as _,I as k,K as A}from"./DXsCzSxj.js";import{h as N}from"./DvDH6DOc.js";import"./BDqtaPAc.js";const Q=C({name:"ContentQuery",props:{path:{type:String,required:!1,default:void 0},only:{type:Array,required:!1,default:void 0},without:{type:Array,required:!1,default:void 0},where:{type:Object,required:!1,default:void 0},sort:{type:Object,required:!1,default:void 0},limit:{type:Number,required:!1,default:void 0},skip:{type:Number,required:!1,default:void 0},locale:{type:String,required:!1,default:void 0},find:{type:String,required:!1,default:void 0}},async setup(u){const{path:t,only:r,without:o,where:a,sort:f,limit:l,skip:d,locale:s,find:p}=S(u),y=b(()=>{var e;return(e=t.value)==null?void 0:e.includes("/_")}),h=!O().public.content.experimental.advanceQuery;_(()=>u,()=>n(),{deep:!0});const i=e=>h?e!=null&&e.surround?e.surround:e!=null&&e._id||Array.isArray(e)?e:e==null?void 0:e.result:e.result,{data:v,refresh:n}=await g(`content-query-${N(u)}`,()=>{let e;return t.value?e=m(t.value):e=m(),r.value&&(e=e.only(r.value)),o.value&&(e=e.without(o.value)),a.value&&(e=e.where(a.value)),f.value&&(e=e.sort(f.value)),l.value&&(e=e.limit(l.value)),d.value&&(e=e.skip(d.value)),s.value&&(e=e.where({_locale:s.value})),p.value==="one"?e.findOne().then(i):p.value==="surround"?t.value?h?e.findSurround(t.value):e.withSurround(t.value).findOne().then(i):(console.warn("[Content] Surround queries requires `path` prop to be set."),console.warn("[Content] Query without `path` will return regular `find()` results."),e.find().then(i)):e.find().then(i)});return{isPartial:y,data:v,refresh:n}},render(u){var c;const t=k(),{data:r,refresh:o,isPartial:a,path:f,only:l,without:d,where:s,sort:p,limit:y,skip:h,locale:i,find:v}=u,n={path:f,only:l,without:d,where:s,sort:p,limit:y,skip:h,locale:i,find:v};if(n.find==="one"){if(!r&&(t!=null&&t["not-found"]))return t["not-found"]({props:n,...this.$attrs});if(t!=null&&t.empty&&(r==null?void 0:r._type)==="markdown"&&!((c=r==null?void 0:r.body)!=null&&c.children.length))return t.empty({props:n,...this.$attrs})}else if((!r||!r.length)&&t!=null&&t["not-found"])return t["not-found"]({props:n,...this.$attrs});return t!=null&&t.default?t.default({data:r,refresh:o,isPartial:a,props:n,...this.$attrs}):((w,q)=>A("pre",null,JSON.stringify({message:"You should use slots with !",slot:w,data:q},null,2)))("default",{data:r,props:n,isPartial:a})}}),B=Q;export{B as default}; +import{u as g}from"./BYBkJnue.js";import{q as m}from"./Bs6eKMw6.js";import{d as C,O as S,v as b,H as O,p as _,I as k,K as A}from"./gOhWOHN0.js";import{h as N}from"./DvDH6DOc.js";import"./CRsxnQ9b.js";const Q=C({name:"ContentQuery",props:{path:{type:String,required:!1,default:void 0},only:{type:Array,required:!1,default:void 0},without:{type:Array,required:!1,default:void 0},where:{type:Object,required:!1,default:void 0},sort:{type:Object,required:!1,default:void 0},limit:{type:Number,required:!1,default:void 0},skip:{type:Number,required:!1,default:void 0},locale:{type:String,required:!1,default:void 0},find:{type:String,required:!1,default:void 0}},async setup(u){const{path:t,only:r,without:o,where:a,sort:f,limit:l,skip:d,locale:s,find:p}=S(u),y=b(()=>{var e;return(e=t.value)==null?void 0:e.includes("/_")}),h=!O().public.content.experimental.advanceQuery;_(()=>u,()=>n(),{deep:!0});const i=e=>h?e!=null&&e.surround?e.surround:e!=null&&e._id||Array.isArray(e)?e:e==null?void 0:e.result:e.result,{data:v,refresh:n}=await g(`content-query-${N(u)}`,()=>{let e;return t.value?e=m(t.value):e=m(),r.value&&(e=e.only(r.value)),o.value&&(e=e.without(o.value)),a.value&&(e=e.where(a.value)),f.value&&(e=e.sort(f.value)),l.value&&(e=e.limit(l.value)),d.value&&(e=e.skip(d.value)),s.value&&(e=e.where({_locale:s.value})),p.value==="one"?e.findOne().then(i):p.value==="surround"?t.value?h?e.findSurround(t.value):e.withSurround(t.value).findOne().then(i):(console.warn("[Content] Surround queries requires `path` prop to be set."),console.warn("[Content] Query without `path` will return regular `find()` results."),e.find().then(i)):e.find().then(i)});return{isPartial:y,data:v,refresh:n}},render(u){var c;const t=k(),{data:r,refresh:o,isPartial:a,path:f,only:l,without:d,where:s,sort:p,limit:y,skip:h,locale:i,find:v}=u,n={path:f,only:l,without:d,where:s,sort:p,limit:y,skip:h,locale:i,find:v};if(n.find==="one"){if(!r&&(t!=null&&t["not-found"]))return t["not-found"]({props:n,...this.$attrs});if(t!=null&&t.empty&&(r==null?void 0:r._type)==="markdown"&&!((c=r==null?void 0:r.body)!=null&&c.children.length))return t.empty({props:n,...this.$attrs})}else if((!r||!r.length)&&t!=null&&t["not-found"])return t["not-found"]({props:n,...this.$attrs});return t!=null&&t.default?t.default({data:r,refresh:o,isPartial:a,props:n,...this.$attrs}):((w,q)=>A("pre",null,JSON.stringify({message:"You should use slots with !",slot:w,data:q},null,2)))("default",{data:r,props:n,isPartial:a})}}),B=Q;export{B as default}; diff --git a/_nuxt/D49jv_td.js b/_nuxt/Ci5PNU3b.js similarity index 79% rename from _nuxt/D49jv_td.js rename to _nuxt/Ci5PNU3b.js index ab3736cd..61661926 100644 --- a/_nuxt/D49jv_td.js +++ b/_nuxt/Ci5PNU3b.js @@ -1 +1 @@ -import{_ as p}from"./DnPT5WRD.js";import u from"./D_k-9tiD.js";import{d as x,u as f,w as h,a as s,o as r,c as n,b as e,e as c,t as i,f as l,g}from"./DXsCzSxj.js";import{u as b}from"./W6vbqLg7.js";import{q as y}from"./CAzXSrXZ.js";import"./C-v3KzvZ.js";import"./BDqtaPAc.js";import"./DvDH6DOc.js";const v={key:0,class:"container mx-auto"},w={class:"mb-10 bg-gray-200 p-10 shadow-lg"},k={class:"flex flex-auto items-center"},C=["src"],B={class:"flex items-center"},N={class:"text-xl font-bold text-gray-700 md:text-3xl"},R={class:"flex items-center text-sm text-gray-600"},V={class:"prose prose-sm max-w-none prose-a:text-blue-800 prose-a:no-underline hover:prose-a:text-blue-600 prose-pre:bg-white prose-pre:text-black"},G=x({__name:"[...slug]",async setup(q){let o,a;const _=f(),{data:t}=([o,a]=h(()=>b("page-data",()=>y(_.path).findOne())),o=await o,a(),o);return(A,D)=>{const m=p,d=u;return s(t)?(r(),n("div",v,[e("article",w,[e("div",k,[s(t).cover_image?(r(),n("img",{key:0,class:"mr-4 h-16 border-2 border-black",src:s(t).cover_image},null,8,C)):c("",!0),e("div",B,[e("div",null,[e("h1",N,i(s(t).title),1),e("p",R,i(s(t).date),1)])])]),e("article",V,[l(d,null,{default:g(()=>[l(m,{value:s(t)},null,8,["value"])]),_:1})])])])):c("",!0)}}});export{G as default}; +import{_ as p}from"./B519It_T.js";import u from"./gtS2INEI.js";import{d as x,u as f,w as h,a as s,o as r,c as n,b as e,e as c,t as i,f as l,g}from"./gOhWOHN0.js";import{u as b}from"./BYBkJnue.js";import{q as y}from"./Bs6eKMw6.js";import"./C-v3KzvZ.js";import"./CRsxnQ9b.js";import"./DvDH6DOc.js";const v={key:0,class:"container mx-auto"},w={class:"mb-10 bg-gray-200 p-10 shadow-lg"},k={class:"flex flex-auto items-center"},C=["src"],B={class:"flex items-center"},N={class:"text-xl font-bold text-gray-700 md:text-3xl"},R={class:"flex items-center text-sm text-gray-600"},V={class:"prose prose-sm max-w-none prose-a:text-blue-800 prose-a:no-underline hover:prose-a:text-blue-600 prose-pre:bg-white prose-pre:text-black"},G=x({__name:"[...slug]",async setup(q){let o,a;const _=f(),{data:t}=([o,a]=h(()=>b("page-data",()=>y(_.path).findOne())),o=await o,a(),o);return(A,D)=>{const m=p,d=u;return s(t)?(r(),n("div",v,[e("article",w,[e("div",k,[s(t).cover_image?(r(),n("img",{key:0,class:"mr-4 h-16 border-2 border-black",src:s(t).cover_image},null,8,C)):c("",!0),e("div",B,[e("div",null,[e("h1",N,i(s(t).title),1),e("p",R,i(s(t).date),1)])])]),e("article",V,[l(d,null,{default:g(()=>[l(m,{value:s(t)},null,8,["value"])]),_:1})])])])):c("",!0)}}});export{G as default}; diff --git a/_nuxt/CnVOBpLY.js b/_nuxt/CnVOBpLY.js new file mode 100644 index 00000000..cdf884bc --- /dev/null +++ b/_nuxt/CnVOBpLY.js @@ -0,0 +1 @@ +import{o as t,c as n,b as e,f as r,g as l,h as u,a as h,i as c,v as w,t as g,F as y,r as x,D as k,e as m}from"./gOhWOHN0.js";function b(o,i){return t(),n("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 16 16",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[e("path",{"fill-rule":"evenodd",d:"M8.914 6.025a.75.75 0 0 1 1.06 0 3.5 3.5 0 0 1 0 4.95l-2 2a3.5 3.5 0 0 1-5.396-4.402.75.75 0 0 1 1.251.827 2 2 0 0 0 3.085 2.514l2-2a2 2 0 0 0 0-2.828.75.75 0 0 1 0-1.06Z","clip-rule":"evenodd"}),e("path",{"fill-rule":"evenodd",d:"M7.086 9.975a.75.75 0 0 1-1.06 0 3.5 3.5 0 0 1 0-4.95l2-2a3.5 3.5 0 0 1 5.396 4.402.75.75 0 0 1-1.251-.827 2 2 0 0 0-3.085-2.514l-2 2a2 2 0 0 0 0 2.828.75.75 0 0 1 0 1.06Z","clip-rule":"evenodd"})])}const M={class:"flex justify-end"},I={__name:"MoreLink",props:{to:{type:String,required:!0}},setup(o){const i=o;return(a,d)=>{const p=c;return t(),n("div",M,[r(p,{to:i.to,class:"flex items-center text-sm font-bold text-white hover:text-orange-500"},{default:l(()=>[u(" More "),r(h(b),{class:"ml-1 h-5 w-5","aria-hidden":"true"})]),_:1},8,["to"])])}}},D={class:"bg-gradient-to-b from-transparent to-background text-white"},j={class:"container mx-auto space-y-4 py-8 text-white"},P={class:"mb-4 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4"},V={class:"h-full rounded-xl bg-black bg-opacity-70 drop-shadow-lg hover:ring-1 hover:ring-white"},B={class:"min-h-28 px-4 pt-4"},L={class:"pb-2 text-xl font-bold"},N=["innerHTML"],S={key:0},C=["src"],T={key:0},q="Experiments",F={__name:"Playground",props:{showImages:{type:Boolean,default:!1},limit:{type:Number,default:null},linkToPlayground:{type:Boolean,default:!1}},setup(o){const i=o,a=[{title:"wm.spoon",description:"Hammerpoon Window Manager",link:"https://github.com/cmpadden/wm.spoon",img:"/images/previews/wm.spoon.png"},{title:"Metronome",description:"A simple metronome for tracking tempo.",link:"/playground/metronome",img:"/images/previews/metronome.png"},{title:"Conjugations",description:"Search and explore the conjugations of 1000 French verbs",link:"/playground/french",img:"/images/previews/french-conjugations.png"},{title:"Mountains",description:"Visualize a gradient of colored waves generated with Perlin noise",link:"/playground/palettes/mountains",img:"/images/previews/noise.png"},{title:"Spectrogram",description:"Visualize the audio from your microphone as a waveform, frequency bars, and a spectrogram",link:"/playground/audio",img:"/images/previews/microphone.png"},{title:"Waves",description:"Demonstration of using p5.js within Vue.js to visualize trigonometric functions",link:"/playground/waves",img:"/images/previews/waves.png"},{title:"MIDI Chords",description:"Identify the chords being played by your attached MIDI device",link:"/playground/chords",img:"/images/previews/chord-identifier.png"},{title:"MIDI Events",description:"View the MIDI events triggered by a MIDI-controller through the Web MIDI API",link:"/playground/midi",img:"/images/previews/midi-events.png"},{title:"Matrix Multiplication",description:"Step through the process of matrix multiplication",link:"/playground/matrix",img:"/images/previews/matrix-multiplication.png"},{title:"Sequence Plotter",description:"Plot the fist 10,000 digits of Pi, or any sequence of digits, in 2-dimensional space",link:"/playground/plotter",img:"/images/previews/plotter.png"}],d=w(()=>i.limit===null||i.limit<=0?a:a.slice(0,i.limit));return(p,z)=>{const _=c,f=c,v=I;return t(),n("section",D,[e("div",j,[r(_,{to:"/playground",class:"font-mono text-3xl font-semibold lowercase underline decoration-orange-500 underline-offset-4 hover:text-orange-500"},{default:l(()=>[u(g(q))]),_:1}),e("div",P,[(t(!0),n(y,null,x(h(d),s=>(t(),k(f,{key:s.title,to:s.link},{default:l(()=>[e("div",V,[e("div",B,[e("h3",L,g(s.title),1),e("div",{class:"line-clamp-2 text-base font-light",innerHTML:s.description},null,8,N)]),o.showImages?(t(),n("div",S,[e("img",{class:"h-40 w-full rounded-b-xl object-cover object-top grayscale hover:grayscale-0",src:s.img||"images/placeholder.png"},null,8,C)])):m("",!0)])]),_:2},1032,["to"]))),128))]),o.linkToPlayground?(t(),n("div",T,[r(v,{to:"/playground"})])):m("",!0)])])}}};export{I as _,F as a}; diff --git a/_nuxt/Cr8785qx.js b/_nuxt/Cr8785qx.js deleted file mode 100644 index 655545fe..00000000 --- a/_nuxt/Cr8785qx.js +++ /dev/null @@ -1 +0,0 @@ -import r from"./DIITZ_oT.js";import{d as o,I as u,p as f,$ as p}from"./DXsCzSxj.js";const i=o({name:"Markdown",extends:r,setup(t){const{parent:e}=p(),{between:n,default:a}=u(),s=f(()=>typeof t.unwrap=="string"?t.unwrap.split(" "):["*"]);return{fallbackSlot:a,tags:s,between:n,parent:e}}});export{i as default}; diff --git a/_nuxt/BHKXDL_d.js b/_nuxt/CsZz-VVf.js similarity index 65% rename from _nuxt/BHKXDL_d.js rename to _nuxt/CsZz-VVf.js index e9903677..8297c30a 100644 --- a/_nuxt/BHKXDL_d.js +++ b/_nuxt/CsZz-VVf.js @@ -1 +1 @@ -import{_ as o,o as r,c as t,a7 as n}from"./DXsCzSxj.js";const s={};function c(e,a){return r(),t("strong",null,[n(e.$slots,"default")])}const _=o(s,[["render",c]]);export{_ as default}; +import{_ as o,o as r,c as t,a7 as n}from"./gOhWOHN0.js";const s={};function c(e,a){return r(),t("strong",null,[n(e.$slots,"default")])}const _=o(s,[["render",c]]);export{_ as default}; diff --git a/_nuxt/D9cQXS52.js b/_nuxt/Cu-2mm29.js similarity index 72% rename from _nuxt/D9cQXS52.js rename to _nuxt/Cu-2mm29.js index 96f2287c..2884d0e1 100644 --- a/_nuxt/D9cQXS52.js +++ b/_nuxt/Cu-2mm29.js @@ -1 +1 @@ -import{d as o,a as s,o as n,c as r,h as e,e as a,b as t}from"./DXsCzSxj.js";const c={key:0},i=t("code",null,"script",-1),d=t("code",null,"ProseScript",-1),f=o({__name:"ProseScript",props:{src:{type:String,default:""}},setup(l){return(_,m)=>s(!1)?(n(),r("div",c,[e(" Rendering the "),i,e(" element is dangerous and is disabled by default. Consider implementing your own "),d,e(" element to have control over script rendering. ")])):a("",!0)}});export{f as default}; +import{d as o,a as s,o as n,c as r,h as e,e as a,b as t}from"./gOhWOHN0.js";const c={key:0},i=t("code",null,"script",-1),d=t("code",null,"ProseScript",-1),f=o({__name:"ProseScript",props:{src:{type:String,default:""}},setup(l){return(_,m)=>s(!1)?(n(),r("div",c,[e(" Rendering the "),i,e(" element is dangerous and is disabled by default. Consider implementing your own "),d,e(" element to have control over script rendering. ")])):a("",!0)}});export{f as default}; diff --git a/_nuxt/C0BUAfVO.js b/_nuxt/CuqDoC_G.js similarity index 52% rename from _nuxt/C0BUAfVO.js rename to _nuxt/CuqDoC_G.js index 730c20ae..97167c75 100644 --- a/_nuxt/C0BUAfVO.js +++ b/_nuxt/CuqDoC_G.js @@ -1 +1 @@ -import{a as d,q as w,u as y,E as D,G as H,H as g,d as q,I as S,J as _,K as u}from"./DXsCzSxj.js";import b from"./D_k-9tiD.js";import x from"./WlOj4iQ2.js";import"./DnPT5WRD.js";import"./C-v3KzvZ.js";import"./BDqtaPAc.js";import"./DvDH6DOc.js";import"./W6vbqLg7.js";import"./CAzXSrXZ.js";const a=(p,s=y())=>{const e=d(p),f=g();w(()=>d(p),(n=e)=>{if(!s.path||!n)return;const t=Object.assign({},(n==null?void 0:n.head)||{});t.meta=[...t.meta||[]],t.link=[...t.link||[]];const r=t.title||(n==null?void 0:n.title);r&&(t.title=r),f.public.content.host;const c=(t==null?void 0:t.description)||(n==null?void 0:n.description);c&&t.meta.filter(l=>l.name==="description").length===0&&t.meta.push({name:"description",content:c}),t!=null&&t.image||(n==null||n.image),D(()=>H(t))},{immediate:!0})},$=q({name:"ContentDoc",props:{tag:{type:String,required:!1,default:"div"},excerpt:{type:Boolean,default:!1},path:{type:String,required:!1,default:void 0},query:{type:Object,required:!1,default:void 0},head:{type:Boolean,required:!1,default:void 0}},render(p){const{contentHead:s}=g().public.content,e=S(),{tag:f,excerpt:m,path:n,query:t,head:r}=p,c=r===void 0?s:r,l={...t||{},path:n||(t==null?void 0:t.path)||_(y().path),find:"one"},C=(o,i)=>u("pre",null,JSON.stringify({message:"You should use slots with ",slot:o,data:i},null,2));return u(x,l,{default:e!=null&&e.default?({data:o,refresh:i,isPartial:v})=>{var h;return c&&a(o),(h=e.default)==null?void 0:h.call(e,{doc:o,refresh:i,isPartial:v,excerpt:m,...this.$attrs})}:({data:o})=>(c&&a(o),u(b,{value:o,excerpt:m,tag:f,...this.$attrs},{empty:i=>e!=null&&e.empty?e.empty(i):C("default",o)})),empty:o=>{var i;return((i=e==null?void 0:e.empty)==null?void 0:i.call(e,o))||u("p",null,"Document is empty, overwrite this content with #empty slot in .")},"not-found":o=>{var i;return((i=e==null?void 0:e["not-found"])==null?void 0:i.call(e,o))||u("p",null,"Document not found, overwrite this content with #not-found slot in .")}})}}),E=$;export{E as default}; +import{a as d,p as w,u as y,E as D,G as H,H as g,d as S,I as _,J as b,K as p}from"./gOhWOHN0.js";import q from"./gtS2INEI.js";import x from"./ChudRan8.js";import"./B519It_T.js";import"./C-v3KzvZ.js";import"./CRsxnQ9b.js";import"./DvDH6DOc.js";import"./BYBkJnue.js";import"./Bs6eKMw6.js";const a=(u,s=y())=>{const e=d(u),f=g();w(()=>d(u),(n=e)=>{if(!s.path||!n)return;const t=Object.assign({},(n==null?void 0:n.head)||{});t.meta=[...t.meta||[]],t.link=[...t.link||[]];const r=t.title||(n==null?void 0:n.title);r&&(t.title=r),f.public.content.host;const c=(t==null?void 0:t.description)||(n==null?void 0:n.description);c&&t.meta.filter(l=>l.name==="description").length===0&&t.meta.push({name:"description",content:c}),t!=null&&t.image||(n==null||n.image),D(()=>H(t))},{immediate:!0})},$=S({name:"ContentDoc",props:{tag:{type:String,required:!1,default:"div"},excerpt:{type:Boolean,default:!1},path:{type:String,required:!1,default:void 0},query:{type:Object,required:!1,default:void 0},head:{type:Boolean,required:!1,default:void 0}},render(u){const{contentHead:s}=g().public.content,e=_(),{tag:f,excerpt:m,path:n,query:t,head:r}=u,c=r===void 0?s:r,l={...t||{},path:n||(t==null?void 0:t.path)||b(y().path),find:"one"},C=(o,i)=>p("pre",null,JSON.stringify({message:"You should use slots with ",slot:o,data:i},null,2));return p(x,l,{default:e!=null&&e.default?({data:o,refresh:i,isPartial:v})=>{var h;return c&&a(o),(h=e.default)==null?void 0:h.call(e,{doc:o,refresh:i,isPartial:v,excerpt:m,...this.$attrs})}:({data:o})=>(c&&a(o),p(q,{value:o,excerpt:m,tag:f,...this.$attrs},{empty:i=>e!=null&&e.empty?e.empty(i):C("default",o)})),empty:o=>{var i;return((i=e==null?void 0:e.empty)==null?void 0:i.call(e,o))||p("p",null,"Document is empty, overwrite this content with #empty slot in .")},"not-found":o=>{var i;return((i=e==null?void 0:e["not-found"])==null?void 0:i.call(e,o))||p("p",null,"Document not found, overwrite this content with #not-found slot in .")}})}}),E=$;export{E as default}; diff --git a/_nuxt/CvX9Ic8u.js b/_nuxt/CvX9Ic8u.js deleted file mode 100644 index 7b3344bc..00000000 --- a/_nuxt/CvX9Ic8u.js +++ /dev/null @@ -1 +0,0 @@ -import{a as o}from"./C-Ppi5pl.js";import{_ as c,c as n,f as t,o as a}from"./DXsCzSxj.js";const r={};function s(_,f){const e=o;return a(),n("div",null,[t(e,{showImages:""})])}const d=c(r,[["render",s]]);export{d as default}; diff --git a/_nuxt/4sYS9Rtn.js b/_nuxt/CvplexO3.js similarity index 99% rename from _nuxt/4sYS9Rtn.js rename to _nuxt/CvplexO3.js index 9e3dfa70..82296c69 100644 --- a/_nuxt/4sYS9Rtn.js +++ b/_nuxt/CvplexO3.js @@ -1 +1 @@ -import{_,c as s,h as l,b as e,n as v,t as d,F as c,r as h,f as b,g as y,T as M,o as r,e as g}from"./DXsCzSxj.js";var O={};Object.defineProperty(O,"__esModule",{value:!0});var p=O.identify=void 0;const u=["C","C# / Db","D","D# / Eb","E","F","F# / Gb","G","G# / Ab","A","A# / Bb","B"],x={"0 1":{name:"No 3 Major 7",rootOffset:1},"0 2":{name:"No 3 7",rootOffset:2},"0 3":{name:"Minor",rootOffset:0},"0 4":{name:"",rootOffset:0},"0 5":{name:"5",rootOffset:5},"0 6":{name:"7",rootOffset:2},"0 7":{name:"5",rootOffset:0},"0 8":{name:"",rootOffset:8},"0 9":{name:"Minor",rootOffset:9},"0 10":{name:"No 3 7",rootOffset:0},"0 11":{name:"No 3 Major 7",rootOffset:0},"0 2 7":{name:"Suspended 2",rootOffset:0},"0 3 6 10":{name:"Half-diminished 7",rootOffset:0},"0 3 6 9":{name:"Diminished 7",rootOffset:0},"0 3 6":{name:"Diminished",rootOffset:0},"0 3 7 10":{name:"Minor 7",rootOffset:0},"0 3 7 11":{name:"Minor-major 7",rootOffset:0},"0 3 7 9":{name:"Minor 6",rootOffset:0},"0 3 7":{name:"Minor",rootOffset:0},"0 4 10":{name:"7",rootOffset:0},"0 4 11":{name:"Major 7",rootOffset:0},"0 4 5 7":{name:"Add 11",rootOffset:0},"0 4 6":{name:"Flat 5",rootOffset:0},"0 4 7 10":{name:"Dominant 7",rootOffset:0},"0 4 7 11":{name:"Major 7",rootOffset:0},"0 4 7 9":{name:"Major 6",rootOffset:0},"0 4 7":{name:"",rootOffset:0},"0 4 8 10":{name:"Augmented 7",rootOffset:0},"0 4 8":{name:"Augmented",rootOffset:0},"0 5 7":{name:"Suspended 4",rootOffset:0},"0 5 8":{name:"Minor",rootOffset:5},"0 5 9":{name:"",rootOffset:5},"0 4 9":{name:"Minor",rootOffset:9},"0 3 8":{name:"",rootOffset:8},"0 1 5":{name:"Major 7",rootOffset:1},"0 2 6":{name:"Major 7",rootOffset:2},"0 4 5":{name:"5 Major 7",rootOffset:5},"0 1 2":{name:"No 3 7 Major 7",rootOffset:2},"0 1 3":{name:"Minor Add Flat 9",rootOffset:0},"0 1 6":{name:"5 Sharp 11",rootOffset:6},"0 1 7":{name:"5 Add Flat 9",rootOffset:0},"0 1 8":{name:"5 Major 7",rootOffset:1},"0 1 9":{name:"Sharp 9",rootOffset:9},"0 1 10":{name:"Minor Add 9",rootOffset:10},"0 1 11":{name:"No 3 7 Major 7",rootOffset:1},"0 2 10":{name:"Add 9",rootOffset:10},"0 2 11":{name:"Minor Add Flat 9",rootOffset:11},"0 2 3":{name:"Minor Add 9",rootOffset:0},"0 2 4":{name:"Add 9",rootOffset:0},"0 2 5":{name:"Minor 7",rootOffset:2},"0 2 8":{name:"Flat 5",rootOffset:8},"0 2 9":{name:"5 7",rootOffset:2},"0 3 10":{name:"Minor 7",rootOffset:0},"0 3 4":{name:"Sharp 9",rootOffset:0},"0 3 5":{name:"5 7",rootOffset:5},"0 3 9":{name:"Minor 6",rootOffset:0},"0 5 10":{name:"Suspended 2",rootOffset:10},"0 5 11":{name:"5 Sharp 11",rootOffset:5},"0 5 6":{name:"5 Add Flat 9",rootOffset:5},"0 6 10":{name:"Flat 5",rootOffset:6},"0 6 7":{name:"5 Sharp 11",rootOffset:0},"0 6 8":{name:"7",rootOffset:8},"0 6 9":{name:"Minor 6",rootOffset:9},"0 7 10":{name:"5 7",rootOffset:0},"0 7 11":{name:"5 Major 7",rootOffset:0},"0 7 8":{name:"Major 7",rootOffset:8},"0 7 9":{name:"Minor 7",rootOffset:9},"0 8 10":{name:"Add 9",rootOffset:8},"0 8 11":{name:"Sharp 9",rootOffset:8},"0 9 10":{name:"Minor Add Flat 9",rootOffset:9},"0 9 11":{name:"Minor Add 9",rootOffset:9},"0 10 11":{name:"No 3 7 Major 7",rootOffset:0},"0 1 4":{name:"Sharp 9",rootOffset:9},"0 8 9":{name:"Sharp 9",rootOffset:5},"0 6 11":{name:"7/13",rootOffset:2},"0 3 11":{name:"Sharp 9",rootOffset:8}};function w(f){const a=f.map(t=>typeof t=="number"?t:u.indexOf(t));if(a.some(t=>t<0))throw new Error("Unsupported note letter or number provided");if(new Set(a.map(t=>t%12)).size===1)return{name:u[a[0]%12]};const i=a.sort((t,o)=>t-o)[0]%12,m=[...new Set(a.map(t=>(t-i)%12).sort((t,o)=>t-o))],n=x[m.join(" ")];if(n){const t=(i+n.rootOffset)%12,o=u[t];return{name:n.name!==""?`${o} ${n.name}`:o,interval:m,root:t}}else return{name:void 0}}p=O.identify=w;const A={mounted(){typeof navigator.requestMIDIAccess<"u"&&navigator.requestMIDIAccess().then(f=>{this.midi=f,this.midi.inputs.forEach(a=>{a.onmidimessage=i=>{i.data[0]===144&&(this.activeKeys.set(i.data[1],i.data),this.$forceUpdate()),i.data[0]===128&&(this.activeKeys.delete(i.data[1]),this.$forceUpdate())}})},f=>{console.error(f)})},data(){return{tooltip:!1,midi:void 0,activeKeys:new Map}},computed:{inputs(){if(typeof this.midi<"u")return Array.from(this.midi.inputs.values())},outputs(){if(typeof this.midi<"u")return Array.from(this.midi.outputs.values())}},methods:{orderedNotes(){return Array.from(this.activeKeys.keys()).sort()},chord(){const f=Array.from(this.activeKeys.keys());return p(f).name}}},k={class:"h-2/3 bg-gradient-to-b from-green-900 via-purple-900 to-indigo-900 text-white"},N={key:0,class:"p-4 text-center font-light tracking-wide"},S=e("a",{class:"text-blue-500 underline",href:"https://developer.mozilla.org/en-US/docs/Web/API/MIDIMessageEvent#browser_compatibility"},"not supported",-1),j={key:1},I={class:"flex flex-wrap"},D={class:"absolute bottom-16 right-2"},F=e("div",{class:"mb-0 rounded-t-lg border-b border-solid bg-green-600 p-3 font-semibold uppercase text-white opacity-75"}," MIDI Status ",-1),E={class:"p-3 font-mono text-orange-900"},z={class:"mb-2 font-bold"},V={class:"mb-2"},C=e("div",{class:"font-bold"},"Inputs:",-1),B={key:0,class:"p-4 text-center italic"},K={key:1},T={class:"flex-1"},P={class:"flex-1"},U={class:"mb-2"},G=e("div",{class:"font-bold"},"Outputs:",-1),L={key:0,class:"p-4 text-center italic"},q={key:1},H={class:"flex-1"},R={class:"flex-1"},W={class:"absolute bottom-2 right-2"},Y=e("svg",{xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 20 20",class:"h-10 w-10"},[e("g",{fill:"none"},[e("path",{d:"M2.5 4a.5.5 0 0 0-.5.5v11a.5.5 0 0 0 .5.5h15a.5.5 0 0 0 .5-.5v-11a.5.5 0 0 0-.5-.5h-15zm.5 6h2v3.5a.5.5 0 0 0 1 0V10h2v3.5a.5.5 0 0 0 1 0V10h2v3.5a.5.5 0 0 0 1 0V10h2v3.5a.5.5 0 0 0 1 0V10h2v5H3v-5zm2.75-2.5a.75.75 0 1 1 0-1.5a.75.75 0 0 1 0 1.5zm6.25-1a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1-.5-.5zm-3 .251a.75.75 0 1 1-1.5 0a.75.75 0 0 1 1.5 0z",fill:"currentColor"})])],-1),J=[Y],Q={class:"absolute bottom-4 left-4"},X={class:"flex"},Z={class:"grid h-screen place-items-center"},$={class:"text-center text-4xl font-semibold tracking-wide"},ee={key:0};function te(f,a,i,m,n,t){return r(),s("div",k,[typeof n.midi>"u"?(r(),s("div",N,[l(" Unfortunately, the Web MIDI API is "),S,l(" in all browsers... ")])):(r(),s("div",j,[e("div",I,[e("div",D,[e("div",{class:v([{hidden:!n.tooltip,block:n.tooltip},"z-50 max-w-md break-words rounded-lg border-2 border-green-800 bg-yellow-200 text-sm font-normal leading-normal"])},[e("div",null,[F,e("div",E,[e("div",z,[l(" Enabled: "),e("span",null,d(typeof n.midi<"u"?"Yep!":"Nope"),1)]),e("div",V,[C,t.inputs.length===0?(r(),s("div",B," No input devices detected :( ")):(r(),s("div",K,[(r(!0),s(c,null,h(t.inputs,o=>(r(),s("div",{key:o.id,class:"flex"},[e("div",T,d(o.manufacturer),1),e("div",P,d(o.name),1)]))),128))]))]),e("div",U,[G,t.outputs.length===0?(r(),s("div",L," No output devices detected :( ")):(r(),s("div",q,[(r(!0),s(c,null,h(t.outputs,o=>(r(),s("div",{key:o.id,class:"flex"},[e("div",H,d(o.manufacturer),1),e("div",R,d(o.name),1)]))),128))]))])])])],2)]),e("div",W,[e("button",{onClick:a[0]||(a[0]=o=>n.tooltip=!n.tooltip),class:"border-3 rounded-lg border-green-600 bg-green-50 px-1 text-green-600 shadow hover:text-green-500 hover:shadow-lg",type:"button"},J)])]),e("div",Q,[e("div",X,[(r(!0),s(c,null,h(t.orderedNotes(),o=>(r(),s("div",{key:o,class:"p-4"},d(o),1))),128))])]),e("div",Z,[e("div",null,[e("div",$,[b(M,{"enter-active-class":"duration-500 ease-out","enter-class":"opacity-0 transform","enter-to-class":"opacity-100","leave-active-class":"duration-500","leave-class":"opacity-100","leave-to-class":"opacity-0 transform"},{default:y(()=>[n.activeKeys.size>=1?(r(),s("div",ee,d(t.chord()||"?"),1)):g("",!0)]),_:1})])])])]))])}const se=_(A,[["render",te]]);export{se as default}; +import{_,c as s,h as l,b as e,n as v,t as d,F as c,r as h,f as b,g as y,T as M,o as r,e as g}from"./gOhWOHN0.js";var O={};Object.defineProperty(O,"__esModule",{value:!0});var p=O.identify=void 0;const u=["C","C# / Db","D","D# / Eb","E","F","F# / Gb","G","G# / Ab","A","A# / Bb","B"],x={"0 1":{name:"No 3 Major 7",rootOffset:1},"0 2":{name:"No 3 7",rootOffset:2},"0 3":{name:"Minor",rootOffset:0},"0 4":{name:"",rootOffset:0},"0 5":{name:"5",rootOffset:5},"0 6":{name:"7",rootOffset:2},"0 7":{name:"5",rootOffset:0},"0 8":{name:"",rootOffset:8},"0 9":{name:"Minor",rootOffset:9},"0 10":{name:"No 3 7",rootOffset:0},"0 11":{name:"No 3 Major 7",rootOffset:0},"0 2 7":{name:"Suspended 2",rootOffset:0},"0 3 6 10":{name:"Half-diminished 7",rootOffset:0},"0 3 6 9":{name:"Diminished 7",rootOffset:0},"0 3 6":{name:"Diminished",rootOffset:0},"0 3 7 10":{name:"Minor 7",rootOffset:0},"0 3 7 11":{name:"Minor-major 7",rootOffset:0},"0 3 7 9":{name:"Minor 6",rootOffset:0},"0 3 7":{name:"Minor",rootOffset:0},"0 4 10":{name:"7",rootOffset:0},"0 4 11":{name:"Major 7",rootOffset:0},"0 4 5 7":{name:"Add 11",rootOffset:0},"0 4 6":{name:"Flat 5",rootOffset:0},"0 4 7 10":{name:"Dominant 7",rootOffset:0},"0 4 7 11":{name:"Major 7",rootOffset:0},"0 4 7 9":{name:"Major 6",rootOffset:0},"0 4 7":{name:"",rootOffset:0},"0 4 8 10":{name:"Augmented 7",rootOffset:0},"0 4 8":{name:"Augmented",rootOffset:0},"0 5 7":{name:"Suspended 4",rootOffset:0},"0 5 8":{name:"Minor",rootOffset:5},"0 5 9":{name:"",rootOffset:5},"0 4 9":{name:"Minor",rootOffset:9},"0 3 8":{name:"",rootOffset:8},"0 1 5":{name:"Major 7",rootOffset:1},"0 2 6":{name:"Major 7",rootOffset:2},"0 4 5":{name:"5 Major 7",rootOffset:5},"0 1 2":{name:"No 3 7 Major 7",rootOffset:2},"0 1 3":{name:"Minor Add Flat 9",rootOffset:0},"0 1 6":{name:"5 Sharp 11",rootOffset:6},"0 1 7":{name:"5 Add Flat 9",rootOffset:0},"0 1 8":{name:"5 Major 7",rootOffset:1},"0 1 9":{name:"Sharp 9",rootOffset:9},"0 1 10":{name:"Minor Add 9",rootOffset:10},"0 1 11":{name:"No 3 7 Major 7",rootOffset:1},"0 2 10":{name:"Add 9",rootOffset:10},"0 2 11":{name:"Minor Add Flat 9",rootOffset:11},"0 2 3":{name:"Minor Add 9",rootOffset:0},"0 2 4":{name:"Add 9",rootOffset:0},"0 2 5":{name:"Minor 7",rootOffset:2},"0 2 8":{name:"Flat 5",rootOffset:8},"0 2 9":{name:"5 7",rootOffset:2},"0 3 10":{name:"Minor 7",rootOffset:0},"0 3 4":{name:"Sharp 9",rootOffset:0},"0 3 5":{name:"5 7",rootOffset:5},"0 3 9":{name:"Minor 6",rootOffset:0},"0 5 10":{name:"Suspended 2",rootOffset:10},"0 5 11":{name:"5 Sharp 11",rootOffset:5},"0 5 6":{name:"5 Add Flat 9",rootOffset:5},"0 6 10":{name:"Flat 5",rootOffset:6},"0 6 7":{name:"5 Sharp 11",rootOffset:0},"0 6 8":{name:"7",rootOffset:8},"0 6 9":{name:"Minor 6",rootOffset:9},"0 7 10":{name:"5 7",rootOffset:0},"0 7 11":{name:"5 Major 7",rootOffset:0},"0 7 8":{name:"Major 7",rootOffset:8},"0 7 9":{name:"Minor 7",rootOffset:9},"0 8 10":{name:"Add 9",rootOffset:8},"0 8 11":{name:"Sharp 9",rootOffset:8},"0 9 10":{name:"Minor Add Flat 9",rootOffset:9},"0 9 11":{name:"Minor Add 9",rootOffset:9},"0 10 11":{name:"No 3 7 Major 7",rootOffset:0},"0 1 4":{name:"Sharp 9",rootOffset:9},"0 8 9":{name:"Sharp 9",rootOffset:5},"0 6 11":{name:"7/13",rootOffset:2},"0 3 11":{name:"Sharp 9",rootOffset:8}};function w(f){const a=f.map(t=>typeof t=="number"?t:u.indexOf(t));if(a.some(t=>t<0))throw new Error("Unsupported note letter or number provided");if(new Set(a.map(t=>t%12)).size===1)return{name:u[a[0]%12]};const i=a.sort((t,o)=>t-o)[0]%12,m=[...new Set(a.map(t=>(t-i)%12).sort((t,o)=>t-o))],n=x[m.join(" ")];if(n){const t=(i+n.rootOffset)%12,o=u[t];return{name:n.name!==""?`${o} ${n.name}`:o,interval:m,root:t}}else return{name:void 0}}p=O.identify=w;const A={mounted(){typeof navigator.requestMIDIAccess<"u"&&navigator.requestMIDIAccess().then(f=>{this.midi=f,this.midi.inputs.forEach(a=>{a.onmidimessage=i=>{i.data[0]===144&&(this.activeKeys.set(i.data[1],i.data),this.$forceUpdate()),i.data[0]===128&&(this.activeKeys.delete(i.data[1]),this.$forceUpdate())}})},f=>{console.error(f)})},data(){return{tooltip:!1,midi:void 0,activeKeys:new Map}},computed:{inputs(){if(typeof this.midi<"u")return Array.from(this.midi.inputs.values())},outputs(){if(typeof this.midi<"u")return Array.from(this.midi.outputs.values())}},methods:{orderedNotes(){return Array.from(this.activeKeys.keys()).sort()},chord(){const f=Array.from(this.activeKeys.keys());return p(f).name}}},k={class:"h-2/3 bg-gradient-to-b from-green-900 via-purple-900 to-indigo-900 text-white"},N={key:0,class:"p-4 text-center font-light tracking-wide"},S=e("a",{class:"text-blue-500 underline",href:"https://developer.mozilla.org/en-US/docs/Web/API/MIDIMessageEvent#browser_compatibility"},"not supported",-1),j={key:1},I={class:"flex flex-wrap"},D={class:"absolute bottom-16 right-2"},F=e("div",{class:"mb-0 rounded-t-lg border-b border-solid bg-green-600 p-3 font-semibold uppercase text-white opacity-75"}," MIDI Status ",-1),E={class:"p-3 font-mono text-orange-900"},z={class:"mb-2 font-bold"},V={class:"mb-2"},C=e("div",{class:"font-bold"},"Inputs:",-1),B={key:0,class:"p-4 text-center italic"},K={key:1},T={class:"flex-1"},P={class:"flex-1"},U={class:"mb-2"},G=e("div",{class:"font-bold"},"Outputs:",-1),L={key:0,class:"p-4 text-center italic"},q={key:1},H={class:"flex-1"},R={class:"flex-1"},W={class:"absolute bottom-2 right-2"},Y=e("svg",{xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 20 20",class:"h-10 w-10"},[e("g",{fill:"none"},[e("path",{d:"M2.5 4a.5.5 0 0 0-.5.5v11a.5.5 0 0 0 .5.5h15a.5.5 0 0 0 .5-.5v-11a.5.5 0 0 0-.5-.5h-15zm.5 6h2v3.5a.5.5 0 0 0 1 0V10h2v3.5a.5.5 0 0 0 1 0V10h2v3.5a.5.5 0 0 0 1 0V10h2v3.5a.5.5 0 0 0 1 0V10h2v5H3v-5zm2.75-2.5a.75.75 0 1 1 0-1.5a.75.75 0 0 1 0 1.5zm6.25-1a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1-.5-.5zm-3 .251a.75.75 0 1 1-1.5 0a.75.75 0 0 1 1.5 0z",fill:"currentColor"})])],-1),J=[Y],Q={class:"absolute bottom-4 left-4"},X={class:"flex"},Z={class:"grid h-screen place-items-center"},$={class:"text-center text-4xl font-semibold tracking-wide"},ee={key:0};function te(f,a,i,m,n,t){return r(),s("div",k,[typeof n.midi>"u"?(r(),s("div",N,[l(" Unfortunately, the Web MIDI API is "),S,l(" in all browsers... ")])):(r(),s("div",j,[e("div",I,[e("div",D,[e("div",{class:v([{hidden:!n.tooltip,block:n.tooltip},"z-50 max-w-md break-words rounded-lg border-2 border-green-800 bg-yellow-200 text-sm font-normal leading-normal"])},[e("div",null,[F,e("div",E,[e("div",z,[l(" Enabled: "),e("span",null,d(typeof n.midi<"u"?"Yep!":"Nope"),1)]),e("div",V,[C,t.inputs.length===0?(r(),s("div",B," No input devices detected :( ")):(r(),s("div",K,[(r(!0),s(c,null,h(t.inputs,o=>(r(),s("div",{key:o.id,class:"flex"},[e("div",T,d(o.manufacturer),1),e("div",P,d(o.name),1)]))),128))]))]),e("div",U,[G,t.outputs.length===0?(r(),s("div",L," No output devices detected :( ")):(r(),s("div",q,[(r(!0),s(c,null,h(t.outputs,o=>(r(),s("div",{key:o.id,class:"flex"},[e("div",H,d(o.manufacturer),1),e("div",R,d(o.name),1)]))),128))]))])])])],2)]),e("div",W,[e("button",{onClick:a[0]||(a[0]=o=>n.tooltip=!n.tooltip),class:"border-3 rounded-lg border-green-600 bg-green-50 px-1 text-green-600 shadow hover:text-green-500 hover:shadow-lg",type:"button"},J)])]),e("div",Q,[e("div",X,[(r(!0),s(c,null,h(t.orderedNotes(),o=>(r(),s("div",{key:o,class:"p-4"},d(o),1))),128))])]),e("div",Z,[e("div",null,[e("div",$,[b(M,{"enter-active-class":"duration-500 ease-out","enter-class":"opacity-0 transform","enter-to-class":"opacity-100","leave-active-class":"duration-500","leave-class":"opacity-100","leave-to-class":"opacity-0 transform"},{default:y(()=>[n.activeKeys.size>=1?(r(),s("div",ee,d(t.chord()||"?"),1)):g("",!0)]),_:1})])])])]))])}const se=_(A,[["render",te]]);export{se as default}; diff --git a/_nuxt/DTidYmMf.js b/_nuxt/D2RhQ0-u.js similarity index 98% rename from _nuxt/DTidYmMf.js rename to _nuxt/D2RhQ0-u.js index 127bb292..f45fcd19 100644 --- a/_nuxt/DTidYmMf.js +++ b/_nuxt/D2RhQ0-u.js @@ -1 +1 @@ -import{_ as u,c as s,h as r,b as t,n as f,t as n,F as c,r as h,e as m,o}from"./DXsCzSxj.js";const v={mounted(){typeof navigator.requestMIDIAccess<"u"&&navigator.requestMIDIAccess().then(i=>{this.midi=i,this.midi.inputs.forEach(l=>{l.onmidimessage=_=>{this.events.push(_),this.events.length>15&&this.events.shift()}})},i=>{console.error(i)})},data(){return{tooltip:!1,midi:void 0,events:[]}},computed:{inputs(){if(typeof this.midi<"u")return Array.from(this.midi.inputs.values())},outputs(){if(typeof this.midi<"u")return Array.from(this.midi.outputs.values())}},filters:{midiCommand:i=>{switch(i){case 144:return"Note On";case 128:return"Note Off";default:return i}},midiNote:i=>`${["C","C# / Db","D","D# / Eb","E","F","F# / Bb","G","G# / Ab","A","A# / Bb","B"][i%12]} (${Math.floor(i/12)-2})`}},b={class:"h-2/3 bg-gradient-to-b from-green-100 to-green-50"},x={key:0,class:"p-4 text-center font-light tracking-wide"},g=t("a",{class:"text-blue-500 underline",href:"https://developer.mozilla.org/en-US/docs/Web/API/MIDIMessageEvent#browser_compatibility"},"not supported",-1),y={key:1},w={class:"flex flex-wrap"},k={class:"absolute bottom-16 right-2"},I=t("div",{class:"mb-0 rounded-t-lg border-b border-solid bg-green-600 p-3 font-semibold uppercase text-white opacity-75"}," MIDI Status ",-1),M={class:"p-3 font-mono text-orange-900"},N={class:"mb-2 font-bold"},D={class:"mb-2"},C=t("div",{class:"font-bold"},"Inputs:",-1),A={key:0,class:"p-4 text-center italic"},z={key:1},E={class:"flex-1"},V={class:"flex-1"},B={class:"mb-2"},F=t("div",{class:"font-bold"},"Outputs:",-1),S={key:0,class:"p-4 text-center italic"},O={key:1},P={class:"flex-1"},q={class:"flex-1"},G={class:"absolute bottom-2 right-2"},T=t("svg",{xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 20 20",class:"h-10 w-10"},[t("g",{fill:"none"},[t("path",{d:"M2.5 4a.5.5 0 0 0-.5.5v11a.5.5 0 0 0 .5.5h15a.5.5 0 0 0 .5-.5v-11a.5.5 0 0 0-.5-.5h-15zm.5 6h2v3.5a.5.5 0 0 0 1 0V10h2v3.5a.5.5 0 0 0 1 0V10h2v3.5a.5.5 0 0 0 1 0V10h2v3.5a.5.5 0 0 0 1 0V10h2v5H3v-5zm2.75-2.5a.75.75 0 1 1 0-1.5a.75.75 0 0 1 0 1.5zm6.25-1a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1-.5-.5zm-3 .251a.75.75 0 1 1-1.5 0a.75.75 0 0 1 1.5 0z",fill:"currentColor"})])],-1),U=[T],W={class:"container mx-auto p-8"},H=t("div",{class:"font-display text-4xl font-light tracking-wide"}," MIDI Events ",-1),L={class:"w-full table-auto border-2 border-green-800 bg-green-50 text-sm"},R=t("thead",{class:"bg-green-800 font-semibold uppercase text-white"},[t("tr",null,[t("th",{class:"p-2 text-left"},"Timestamp"),t("th",{class:"p-2 text-left"},"Command #"),t("th",{class:"p-2 text-left"},"Command"),t("th",{class:"p-2 text-left"},"Note #"),t("th",{class:"p-2 text-left"},"Note"),t("th",{class:"p-2 text-left"},"Velocity"),t("th",{class:"p-2 text-right"},"MIDI Source")])],-1),Y={class:"divide-y divide-gray-100"},j={key:0},J=t("td",{class:"p-4 text-center italic",colspan:"7"}," Press a key, or turn a knob! ",-1),K=[J],Q={class:"p-2 text-left"},X={class:"p-2 text-left"},Z={class:"p-2 text-left"},$={class:"p-2 text-left"},tt={key:0,class:"p-2 text-left"},et={key:1,class:"p-2 text-left"},st={class:"p-2 text-left"},ot={class:"p-2 text-right"};function it(i,l,_,nt,d,a){return o(),s("div",b,[typeof d.midi>"u"?(o(),s("div",x,[r(" Unfortunately, the Web MIDI API is "),g,r(" in all browsers... ")])):(o(),s("div",y,[t("div",w,[t("div",k,[t("div",{class:f([{hidden:!d.tooltip,block:d.tooltip},"z-50 max-w-md break-words rounded-lg border-2 border-green-800 bg-yellow-200 text-sm font-normal leading-normal"])},[t("div",null,[I,t("div",M,[t("div",N,[r(" Enabled: "),t("span",null,n(typeof d.midi<"u"?"Yep!":"Nope"),1)]),t("div",D,[C,a.inputs.length===0?(o(),s("div",A," No input devices detected :( ")):(o(),s("div",z,[(o(!0),s(c,null,h(a.inputs,e=>(o(),s("div",{key:e.id,class:"flex"},[t("div",E,n(e.manufacturer),1),t("div",V,n(e.name),1)]))),128))]))]),t("div",B,[F,a.outputs.length===0?(o(),s("div",S," No output devices detected :( ")):(o(),s("div",O,[(o(!0),s(c,null,h(a.outputs,e=>(o(),s("div",{key:e.id,class:"flex"},[t("div",P,n(e.manufacturer),1),t("div",q,n(e.name),1)]))),128))]))])])])],2)]),t("div",G,[t("button",{ref:"btnRef",onClick:l[0]||(l[0]=e=>d.tooltip=!d.tooltip),class:"rounded-lg bg-green-800 px-2 py-1 text-white shadow hover:text-yellow-200 hover:shadow-lg",type:"button"},U,512)])]),t("div",W,[H,t("table",L,[R,t("tbody",Y,[d.events.length===0?(o(),s("tr",j,K)):m("",!0),(o(!0),s(c,null,h(d.events,(e,p)=>(o(),s("tr",{key:p},[t("td",Q,n(e.timeStamp.toFixed(2)),1),t("td",X,n(e.data[0]),1),t("td",Z,n(e.data[0]|i.midiCommand),1),t("td",$,n(e.data[1]),1),e.data[0]===144||e.data[0]==128?(o(),s("td",tt,n(e.data[1]|i.midiNote),1)):(o(),s("td",et,"-")),t("td",st,n(e.data[2]),1),t("td",ot,n(e.srcElement.name),1)]))),128))])])])]))])}const lt=u(v,[["render",it]]);export{lt as default}; +import{_ as u,c as s,h as r,b as t,n as f,t as n,F as c,r as h,e as m,o}from"./gOhWOHN0.js";const v={mounted(){typeof navigator.requestMIDIAccess<"u"&&navigator.requestMIDIAccess().then(i=>{this.midi=i,this.midi.inputs.forEach(l=>{l.onmidimessage=_=>{this.events.push(_),this.events.length>15&&this.events.shift()}})},i=>{console.error(i)})},data(){return{tooltip:!1,midi:void 0,events:[]}},computed:{inputs(){if(typeof this.midi<"u")return Array.from(this.midi.inputs.values())},outputs(){if(typeof this.midi<"u")return Array.from(this.midi.outputs.values())}},filters:{midiCommand:i=>{switch(i){case 144:return"Note On";case 128:return"Note Off";default:return i}},midiNote:i=>`${["C","C# / Db","D","D# / Eb","E","F","F# / Bb","G","G# / Ab","A","A# / Bb","B"][i%12]} (${Math.floor(i/12)-2})`}},b={class:"h-2/3 bg-gradient-to-b from-green-100 to-green-50"},x={key:0,class:"p-4 text-center font-light tracking-wide"},g=t("a",{class:"text-blue-500 underline",href:"https://developer.mozilla.org/en-US/docs/Web/API/MIDIMessageEvent#browser_compatibility"},"not supported",-1),y={key:1},w={class:"flex flex-wrap"},k={class:"absolute bottom-16 right-2"},I=t("div",{class:"mb-0 rounded-t-lg border-b border-solid bg-green-600 p-3 font-semibold uppercase text-white opacity-75"}," MIDI Status ",-1),M={class:"p-3 font-mono text-orange-900"},N={class:"mb-2 font-bold"},D={class:"mb-2"},C=t("div",{class:"font-bold"},"Inputs:",-1),A={key:0,class:"p-4 text-center italic"},z={key:1},E={class:"flex-1"},V={class:"flex-1"},B={class:"mb-2"},F=t("div",{class:"font-bold"},"Outputs:",-1),S={key:0,class:"p-4 text-center italic"},O={key:1},P={class:"flex-1"},q={class:"flex-1"},G={class:"absolute bottom-2 right-2"},T=t("svg",{xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 20 20",class:"h-10 w-10"},[t("g",{fill:"none"},[t("path",{d:"M2.5 4a.5.5 0 0 0-.5.5v11a.5.5 0 0 0 .5.5h15a.5.5 0 0 0 .5-.5v-11a.5.5 0 0 0-.5-.5h-15zm.5 6h2v3.5a.5.5 0 0 0 1 0V10h2v3.5a.5.5 0 0 0 1 0V10h2v3.5a.5.5 0 0 0 1 0V10h2v3.5a.5.5 0 0 0 1 0V10h2v5H3v-5zm2.75-2.5a.75.75 0 1 1 0-1.5a.75.75 0 0 1 0 1.5zm6.25-1a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1-.5-.5zm-3 .251a.75.75 0 1 1-1.5 0a.75.75 0 0 1 1.5 0z",fill:"currentColor"})])],-1),U=[T],W={class:"container mx-auto p-8"},H=t("div",{class:"font-display text-4xl font-light tracking-wide"}," MIDI Events ",-1),L={class:"w-full table-auto border-2 border-green-800 bg-green-50 text-sm"},R=t("thead",{class:"bg-green-800 font-semibold uppercase text-white"},[t("tr",null,[t("th",{class:"p-2 text-left"},"Timestamp"),t("th",{class:"p-2 text-left"},"Command #"),t("th",{class:"p-2 text-left"},"Command"),t("th",{class:"p-2 text-left"},"Note #"),t("th",{class:"p-2 text-left"},"Note"),t("th",{class:"p-2 text-left"},"Velocity"),t("th",{class:"p-2 text-right"},"MIDI Source")])],-1),Y={class:"divide-y divide-gray-100"},j={key:0},J=t("td",{class:"p-4 text-center italic",colspan:"7"}," Press a key, or turn a knob! ",-1),K=[J],Q={class:"p-2 text-left"},X={class:"p-2 text-left"},Z={class:"p-2 text-left"},$={class:"p-2 text-left"},tt={key:0,class:"p-2 text-left"},et={key:1,class:"p-2 text-left"},st={class:"p-2 text-left"},ot={class:"p-2 text-right"};function it(i,l,_,nt,d,a){return o(),s("div",b,[typeof d.midi>"u"?(o(),s("div",x,[r(" Unfortunately, the Web MIDI API is "),g,r(" in all browsers... ")])):(o(),s("div",y,[t("div",w,[t("div",k,[t("div",{class:f([{hidden:!d.tooltip,block:d.tooltip},"z-50 max-w-md break-words rounded-lg border-2 border-green-800 bg-yellow-200 text-sm font-normal leading-normal"])},[t("div",null,[I,t("div",M,[t("div",N,[r(" Enabled: "),t("span",null,n(typeof d.midi<"u"?"Yep!":"Nope"),1)]),t("div",D,[C,a.inputs.length===0?(o(),s("div",A," No input devices detected :( ")):(o(),s("div",z,[(o(!0),s(c,null,h(a.inputs,e=>(o(),s("div",{key:e.id,class:"flex"},[t("div",E,n(e.manufacturer),1),t("div",V,n(e.name),1)]))),128))]))]),t("div",B,[F,a.outputs.length===0?(o(),s("div",S," No output devices detected :( ")):(o(),s("div",O,[(o(!0),s(c,null,h(a.outputs,e=>(o(),s("div",{key:e.id,class:"flex"},[t("div",P,n(e.manufacturer),1),t("div",q,n(e.name),1)]))),128))]))])])])],2)]),t("div",G,[t("button",{ref:"btnRef",onClick:l[0]||(l[0]=e=>d.tooltip=!d.tooltip),class:"rounded-lg bg-green-800 px-2 py-1 text-white shadow hover:text-yellow-200 hover:shadow-lg",type:"button"},U,512)])]),t("div",W,[H,t("table",L,[R,t("tbody",Y,[d.events.length===0?(o(),s("tr",j,K)):m("",!0),(o(!0),s(c,null,h(d.events,(e,p)=>(o(),s("tr",{key:p},[t("td",Q,n(e.timeStamp.toFixed(2)),1),t("td",X,n(e.data[0]),1),t("td",Z,n(e.data[0]|i.midiCommand),1),t("td",$,n(e.data[1]),1),e.data[0]===144||e.data[0]==128?(o(),s("td",tt,n(e.data[1]|i.midiNote),1)):(o(),s("td",et,"-")),t("td",st,n(e.data[2]),1),t("td",ot,n(e.srcElement.name),1)]))),128))])])])]))])}const lt=u(v,[["render",it]]);export{lt as default}; diff --git a/_nuxt/D5N360oS.js b/_nuxt/D5N360oS.js new file mode 100644 index 00000000..e13d733c --- /dev/null +++ b/_nuxt/D5N360oS.js @@ -0,0 +1 @@ +import{a as o}from"./CnVOBpLY.js";import{_ as c,c as n,f as t,o as a}from"./gOhWOHN0.js";const r={};function s(_,f){const e=o;return a(),n("div",null,[t(e,{showImages:""})])}const d=c(r,[["render",s]]);export{d as default}; diff --git a/_nuxt/CHAMBAea.js b/_nuxt/DCWpba_A.js similarity index 98% rename from _nuxt/CHAMBAea.js rename to _nuxt/DCWpba_A.js index d45a2b18..aaa08c08 100644 --- a/_nuxt/CHAMBAea.js +++ b/_nuxt/DCWpba_A.js @@ -1 +1 @@ -import{a5 as _,R as W,aa as B,H as M,P as T,N as H}from"./DXsCzSxj.js";import{g as J,a as P,b as E,o as k,c as b,d as $,f as j,h as D,i as G}from"./CAzXSrXZ.js";import{p as Z}from"./C-v3KzvZ.js";import{u as U}from"./BDqtaPAc.js";import"./DvDH6DOc.js";const q="memory",F=()=>{const t=new Map;return{name:q,options:{},hasItem(r){return t.has(r)},getItem(r){return t.get(r)??null},getItemRaw(r){return t.get(r)??null},setItem(r,n){t.set(r,n)},setItemRaw(r,n){t.set(r,n)},removeItem(r){t.delete(r)},getKeys(){return Array.from(t.keys())},clear(){t.clear()},dispose(){t.clear()}}};function V(t){return!t||typeof t.then!="function"?Promise.resolve(t):t}function p(t,...r){try{return V(t(...r))}catch(n){return Promise.reject(n)}}function Q(t){const r=typeof t;return t===null||r!=="object"&&r!=="function"}function X(t){const r=Object.getPrototypeOf(t);return!r||r.isPrototypeOf(Object)}function K(t){if(Q(t))return String(t);if(X(t)||Array.isArray(t))return JSON.stringify(t);if(typeof t.toJSON=="function")return K(t.toJSON());throw new Error("[unstorage] Cannot stringify value!")}function z(){if(typeof Buffer===void 0)throw new TypeError("[unstorage] Buffer is not supported!")}const C="base64:";function ee(t){if(typeof t=="string")return t;z();const r=Buffer.from(t).toString("base64");return C+r}function te(t){return typeof t!="string"||!t.startsWith(C)?t:(z(),Buffer.from(t.slice(C.length),"base64"))}const re=["hasItem","getItem","getItemRaw","setItem","setItemRaw","removeItem","getMeta","setMeta","removeMeta","getKeys","clear","mount","unmount"];function ne(t,r){if(r=A(r),!r)return t;const n={...t};for(const a of re)n[a]=(l="",...c)=>t[a](r+l,...c);return n.getKeys=(a="",...l)=>t.getKeys(r+a,...l).then(c=>c.map(o=>o.slice(r.length))),n}function d(t){return t?t.split("?")[0].replace(/[/\\]/g,":").replace(/:+/g,":").replace(/^:|:$/g,""):""}function ie(...t){return d(t.join(":"))}function A(t){return t=d(t),t?t+":":""}const ae="memory",se=()=>{const t=new Map;return{name:ae,options:{},hasItem(r){return t.has(r)},getItem(r){return t.get(r)??null},getItemRaw(r){return t.get(r)??null},setItem(r,n){t.set(r,n)},setItemRaw(r,n){t.set(r,n)},removeItem(r){t.delete(r)},getKeys(){return Array.from(t.keys())},clear(){t.clear()},dispose(){t.clear()}}};function oe(t={}){const r={mounts:{"":t.driver||se()},mountpoints:[""],watching:!1,watchListeners:[],unwatch:{}},n=e=>{for(const i of r.mountpoints)if(e.startsWith(i))return{base:i,relativeKey:e.slice(i.length),driver:r.mounts[i]};return{base:"",relativeKey:e,driver:r.mounts[""]}},a=(e,i)=>r.mountpoints.filter(s=>s.startsWith(e)||i&&e.startsWith(s)).map(s=>({relativeBase:e.length>s.length?e.slice(s.length):void 0,mountpoint:s,driver:r.mounts[s]})),l=(e,i)=>{if(r.watching){i=d(i);for(const s of r.watchListeners)s(e,i)}},c=async()=>{if(!r.watching){r.watching=!0;for(const e in r.mounts)r.unwatch[e]=await x(r.mounts[e],l,e)}},o=async()=>{if(r.watching){for(const e in r.unwatch)await r.unwatch[e]();r.unwatch={},r.watching=!1}},h=(e,i,s)=>{const u=new Map,f=m=>{let y=u.get(m.base);return y||(y={driver:m.driver,base:m.base,items:[]},u.set(m.base,y)),y};for(const m of e){const y=typeof m=="string",v=d(y?m:m.key),w=y?void 0:m.value,I=y||!m.options?i:{...i,...m.options},O=n(v);f(O).items.push({key:v,value:w,relativeKey:O.relativeKey,options:I})}return Promise.all([...u.values()].map(m=>s(m))).then(m=>m.flat())},g={hasItem(e,i={}){e=d(e);const{relativeKey:s,driver:u}=n(e);return p(u.hasItem,s,i)},getItem(e,i={}){e=d(e);const{relativeKey:s,driver:u}=n(e);return p(u.getItem,s,i).then(f=>_(f))},getItems(e,i){return h(e,i,s=>s.driver.getItems?p(s.driver.getItems,s.items.map(u=>({key:u.relativeKey,options:u.options})),i).then(u=>u.map(f=>({key:ie(s.base,f.key),value:_(f.value)}))):Promise.all(s.items.map(u=>p(s.driver.getItem,u.relativeKey,u.options).then(f=>({key:u.key,value:_(f)})))))},getItemRaw(e,i={}){e=d(e);const{relativeKey:s,driver:u}=n(e);return u.getItemRaw?p(u.getItemRaw,s,i):p(u.getItem,s,i).then(f=>te(f))},async setItem(e,i,s={}){if(i===void 0)return g.removeItem(e);e=d(e);const{relativeKey:u,driver:f}=n(e);f.setItem&&(await p(f.setItem,u,K(i),s),f.watch||l("update",e))},async setItems(e,i){await h(e,i,async s=>{if(s.driver.setItems)return p(s.driver.setItems,s.items.map(u=>({key:u.relativeKey,value:K(u.value),options:u.options})),i);s.driver.setItem&&await Promise.all(s.items.map(u=>p(s.driver.setItem,u.relativeKey,K(u.value),u.options)))})},async setItemRaw(e,i,s={}){if(i===void 0)return g.removeItem(e,s);e=d(e);const{relativeKey:u,driver:f}=n(e);if(f.setItemRaw)await p(f.setItemRaw,u,i,s);else if(f.setItem)await p(f.setItem,u,ee(i),s);else return;f.watch||l("update",e)},async removeItem(e,i={}){typeof i=="boolean"&&(i={removeMeta:i}),e=d(e);const{relativeKey:s,driver:u}=n(e);u.removeItem&&(await p(u.removeItem,s,i),(i.removeMeta||i.removeMata)&&await p(u.removeItem,s+"$",i),u.watch||l("remove",e))},async getMeta(e,i={}){typeof i=="boolean"&&(i={nativeOnly:i}),e=d(e);const{relativeKey:s,driver:u}=n(e),f=Object.create(null);if(u.getMeta&&Object.assign(f,await p(u.getMeta,s,i)),!i.nativeOnly){const m=await p(u.getItem,s+"$",i).then(y=>_(y));m&&typeof m=="object"&&(typeof m.atime=="string"&&(m.atime=new Date(m.atime)),typeof m.mtime=="string"&&(m.mtime=new Date(m.mtime)),Object.assign(f,m))}return f},setMeta(e,i,s={}){return this.setItem(e+"$",i,s)},removeMeta(e,i={}){return this.removeItem(e+"$",i)},async getKeys(e,i={}){e=A(e);const s=a(e,!0);let u=[];const f=[];for(const m of s){const v=(await p(m.driver.getKeys,m.relativeBase,i)).map(w=>m.mountpoint+d(w)).filter(w=>!u.some(I=>w.startsWith(I)));f.push(...v),u=[m.mountpoint,...u.filter(w=>!w.startsWith(m.mountpoint))]}return e?f.filter(m=>m.startsWith(e)&&!m.endsWith("$")):f.filter(m=>!m.endsWith("$"))},async clear(e,i={}){e=A(e),await Promise.all(a(e,!1).map(async s=>{if(s.driver.clear)return p(s.driver.clear,s.relativeBase,i);if(s.driver.removeItem){const u=await s.driver.getKeys(s.relativeBase||"",i);return Promise.all(u.map(f=>s.driver.removeItem(f,i)))}}))},async dispose(){await Promise.all(Object.values(r.mounts).map(e=>L(e)))},async watch(e){return await c(),r.watchListeners.push(e),async()=>{r.watchListeners=r.watchListeners.filter(i=>i!==e),r.watchListeners.length===0&&await o()}},async unwatch(){r.watchListeners=[],await o()},mount(e,i){if(e=A(e),e&&r.mounts[e])throw new Error(`already mounted at ${e}`);return e&&(r.mountpoints.push(e),r.mountpoints.sort((s,u)=>u.length-s.length)),r.mounts[e]=i,r.watching&&Promise.resolve(x(i,l,e)).then(s=>{r.unwatch[e]=s}).catch(console.error),g},async unmount(e,i=!0){e=A(e),!(!e||!r.mounts[e])&&(r.watching&&e in r.unwatch&&(r.unwatch[e](),delete r.unwatch[e]),i&&await L(r.mounts[e]),r.mountpoints=r.mountpoints.filter(s=>s!==e),delete r.mounts[e])},getMount(e=""){e=d(e)+":";const i=n(e);return{driver:i.driver,base:i.base}},getMounts(e="",i={}){return e=d(e),a(e,i.parents).map(u=>({driver:u.driver,base:u.mountpoint}))}};return g}function x(t,r,n){return t.watch?t.watch((a,l)=>r(a,n+l)):()=>{}}async function L(t){typeof t.dispose=="function"&&await p(t.dispose)}function ue(t={}){const r=ce(n,t.operators);function n(a,l){return typeof l!="object"||l instanceof RegExp?r.$eq(a,l):Object.keys(l||{}).every(c=>{const o=l[c];if(c.startsWith("$")&&r[c]){const h=r[c];return typeof h=="function"?h(a,o):!1}return n(J(a,c),o)})}return n}function ce(t,r={}){return{$match:(n,a)=>t(n,a),$eq:(n,a)=>a instanceof RegExp?a.test(n):n===a,$ne:(n,a)=>a instanceof RegExp?!a.test(n):n!==a,$not:(n,a)=>!t(n,a),$and:(n,a)=>(P(a,"$and requires an array as condition"),a.every(l=>t(n,l))),$or:(n,a)=>(P(a,"$or requires an array as condition"),a.some(l=>t(n,l))),$in:(n,a)=>E(a).some(l=>Array.isArray(n)?t(n,{$contains:l}):t(n,l)),$contains:(n,a)=>(n=Array.isArray(n)?n:String(n),E(a).every(l=>n.includes(l))),$icontains:(n,a)=>{if(typeof a!="string")throw new TypeError("$icontains requires a string, use $contains instead");return n=String(n).toLocaleLowerCase(),E(a).every(l=>n.includes(l.toLocaleLowerCase()))},$containsAny:(n,a)=>(P(a,"$containsAny requires an array as condition"),n=Array.isArray(n)?n:String(n),a.some(l=>n.includes(l))),$exists:(n,a)=>a?typeof n<"u":typeof n>"u",$type:(n,a)=>typeof n===String(a),$regex:(n,a)=>{if(!(a instanceof RegExp)){const l=String(a).match(/\/(.*)\/([dgimsuy]*)$/);a=l?new RegExp(l[1],l[2]||""):new RegExp(a)}return a.test(String(n||""))},$lt:(n,a)=>nn<=a,$gt:(n,a)=>n>a,$gte:(n,a)=>n>=a,...r||{}}}function le(t){const r=ue(),n=(c,{query:o,before:h,after:g})=>{const e=typeof o=="string"?{_path:o}:o,i=c.findIndex(u=>r(u,e));h=h??1,g=g??1;const s=new Array(h+g).fill(null,0);return i===-1?s:s.map((u,f)=>c[i-h+f+ +(f>=h)]||null)},a=[(c,o)=>{const h=c.result.filter(g=>E(o.where).every(e=>r(g,e)));return{...c,result:h,total:h.length}},(c,o)=>E(o.sort).forEach(h=>b(c.result,h)),function(o,h,g){var e;if(h.surround){let i=n(((e=o.result)==null?void 0:e.length)===1?g:o.result,h.surround);i=$(j(h.without))(i),i=$(D(h.only))(i),o.surround=i}return o}],l=[(c,o)=>{if(o.skip)return{...c,result:c.result.slice(o.skip),skip:o.skip}},(c,o)=>{if(o.limit)return{...c,result:c.result.slice(0,o.limit),limit:o.limit}},function(o,h,g){var e,i,s;if(h.dirConfig){const u=((e=o.result[0])==null?void 0:e._path)||((s=(i=h.where)==null?void 0:i.find(f=>f._path))==null?void 0:s._path);if(typeof u=="string"){const f=g.find(m=>m._path===W(u,"_dir"));f&&(o.dirConfig={_path:f._path,...j(["_"])(f)})}}return o},(c,o)=>({...c,result:$(j(o.without))(c.result)}),(c,o)=>({...c,result:$(D(o.only))(c.result)})];return async c=>{const o=await t(),h=c.params(),g={result:o,limit:0,skip:0,total:o.length},e=a.reduce((s,u)=>u(s,h,o)||s,g);if(h.count)return{result:e.result.length};const i=l.reduce((s,u)=>u(s,h,o)||s,e);return h.first?{...k(["skip","limit","total"])(i),result:i.result[0]}:i}}function N(t){const r=le(t);return async n=>{var c;n.params().first&&n.withDirConfig();const a=n.params(),l=await r(n);return a.surround?l==null?void 0:l.surround:(l!=null&&l.dirConfig&&(l.result={_path:(c=l.dirConfig)==null?void 0:c._path,...l.result,_dir:l.dirConfig}),l==null?void 0:l.result)}}var fe={exports:{}};(function(t,r){(function(n,a,l){t.exports=l(),t.exports.default=l()})("slugify",B,function(){var n=JSON.parse(`{"$":"dollar","%":"percent","&":"and","<":"less",">":"greater","|":"or","¢":"cent","£":"pound","¤":"currency","¥":"yen","©":"(c)","ª":"a","®":"(r)","º":"o","À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","Æ":"AE","Ç":"C","È":"E","É":"E","Ê":"E","Ë":"E","Ì":"I","Í":"I","Î":"I","Ï":"I","Ð":"D","Ñ":"N","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","Ù":"U","Ú":"U","Û":"U","Ü":"U","Ý":"Y","Þ":"TH","ß":"ss","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","æ":"ae","ç":"c","è":"e","é":"e","ê":"e","ë":"e","ì":"i","í":"i","î":"i","ï":"i","ð":"d","ñ":"n","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","ù":"u","ú":"u","û":"u","ü":"u","ý":"y","þ":"th","ÿ":"y","Ā":"A","ā":"a","Ă":"A","ă":"a","Ą":"A","ą":"a","Ć":"C","ć":"c","Č":"C","č":"c","Ď":"D","ď":"d","Đ":"DJ","đ":"dj","Ē":"E","ē":"e","Ė":"E","ė":"e","Ę":"e","ę":"e","Ě":"E","ě":"e","Ğ":"G","ğ":"g","Ģ":"G","ģ":"g","Ĩ":"I","ĩ":"i","Ī":"i","ī":"i","Į":"I","į":"i","İ":"I","ı":"i","Ķ":"k","ķ":"k","Ļ":"L","ļ":"l","Ľ":"L","ľ":"l","Ł":"L","ł":"l","Ń":"N","ń":"n","Ņ":"N","ņ":"n","Ň":"N","ň":"n","Ō":"O","ō":"o","Ő":"O","ő":"o","Œ":"OE","œ":"oe","Ŕ":"R","ŕ":"r","Ř":"R","ř":"r","Ś":"S","ś":"s","Ş":"S","ş":"s","Š":"S","š":"s","Ţ":"T","ţ":"t","Ť":"T","ť":"t","Ũ":"U","ũ":"u","Ū":"u","ū":"u","Ů":"U","ů":"u","Ű":"U","ű":"u","Ų":"U","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","ź":"z","Ż":"Z","ż":"z","Ž":"Z","ž":"z","Ə":"E","ƒ":"f","Ơ":"O","ơ":"o","Ư":"U","ư":"u","Lj":"LJ","lj":"lj","Nj":"NJ","nj":"nj","Ș":"S","ș":"s","Ț":"T","ț":"t","ə":"e","˚":"o","Ά":"A","Έ":"E","Ή":"H","Ί":"I","Ό":"O","Ύ":"Y","Ώ":"W","ΐ":"i","Α":"A","Β":"B","Γ":"G","Δ":"D","Ε":"E","Ζ":"Z","Η":"H","Θ":"8","Ι":"I","Κ":"K","Λ":"L","Μ":"M","Ν":"N","Ξ":"3","Ο":"O","Π":"P","Ρ":"R","Σ":"S","Τ":"T","Υ":"Y","Φ":"F","Χ":"X","Ψ":"PS","Ω":"W","Ϊ":"I","Ϋ":"Y","ά":"a","έ":"e","ή":"h","ί":"i","ΰ":"y","α":"a","β":"b","γ":"g","δ":"d","ε":"e","ζ":"z","η":"h","θ":"8","ι":"i","κ":"k","λ":"l","μ":"m","ν":"n","ξ":"3","ο":"o","π":"p","ρ":"r","ς":"s","σ":"s","τ":"t","υ":"y","φ":"f","χ":"x","ψ":"ps","ω":"w","ϊ":"i","ϋ":"y","ό":"o","ύ":"y","ώ":"w","Ё":"Yo","Ђ":"DJ","Є":"Ye","І":"I","Ї":"Yi","Ј":"J","Љ":"LJ","Њ":"NJ","Ћ":"C","Џ":"DZ","А":"A","Б":"B","В":"V","Г":"G","Д":"D","Е":"E","Ж":"Zh","З":"Z","И":"I","Й":"J","К":"K","Л":"L","М":"M","Н":"N","О":"O","П":"P","Р":"R","С":"S","Т":"T","У":"U","Ф":"F","Х":"H","Ц":"C","Ч":"Ch","Ш":"Sh","Щ":"Sh","Ъ":"U","Ы":"Y","Ь":"","Э":"E","Ю":"Yu","Я":"Ya","а":"a","б":"b","в":"v","г":"g","д":"d","е":"e","ж":"zh","з":"z","и":"i","й":"j","к":"k","л":"l","м":"m","н":"n","о":"o","п":"p","р":"r","с":"s","т":"t","у":"u","ф":"f","х":"h","ц":"c","ч":"ch","ш":"sh","щ":"sh","ъ":"u","ы":"y","ь":"","э":"e","ю":"yu","я":"ya","ё":"yo","ђ":"dj","є":"ye","і":"i","ї":"yi","ј":"j","љ":"lj","њ":"nj","ћ":"c","ѝ":"u","џ":"dz","Ґ":"G","ґ":"g","Ғ":"GH","ғ":"gh","Қ":"KH","қ":"kh","Ң":"NG","ң":"ng","Ү":"UE","ү":"ue","Ұ":"U","ұ":"u","Һ":"H","һ":"h","Ә":"AE","ә":"ae","Ө":"OE","ө":"oe","Ա":"A","Բ":"B","Գ":"G","Դ":"D","Ե":"E","Զ":"Z","Է":"E'","Ը":"Y'","Թ":"T'","Ժ":"JH","Ի":"I","Լ":"L","Խ":"X","Ծ":"C'","Կ":"K","Հ":"H","Ձ":"D'","Ղ":"GH","Ճ":"TW","Մ":"M","Յ":"Y","Ն":"N","Շ":"SH","Չ":"CH","Պ":"P","Ջ":"J","Ռ":"R'","Ս":"S","Վ":"V","Տ":"T","Ր":"R","Ց":"C","Փ":"P'","Ք":"Q'","Օ":"O''","Ֆ":"F","և":"EV","ء":"a","آ":"aa","أ":"a","ؤ":"u","إ":"i","ئ":"e","ا":"a","ب":"b","ة":"h","ت":"t","ث":"th","ج":"j","ح":"h","خ":"kh","د":"d","ذ":"th","ر":"r","ز":"z","س":"s","ش":"sh","ص":"s","ض":"dh","ط":"t","ظ":"z","ع":"a","غ":"gh","ف":"f","ق":"q","ك":"k","ل":"l","م":"m","ن":"n","ه":"h","و":"w","ى":"a","ي":"y","ً":"an","ٌ":"on","ٍ":"en","َ":"a","ُ":"u","ِ":"e","ْ":"","٠":"0","١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","پ":"p","چ":"ch","ژ":"zh","ک":"k","گ":"g","ی":"y","۰":"0","۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","฿":"baht","ა":"a","ბ":"b","გ":"g","დ":"d","ე":"e","ვ":"v","ზ":"z","თ":"t","ი":"i","კ":"k","ლ":"l","მ":"m","ნ":"n","ო":"o","პ":"p","ჟ":"zh","რ":"r","ს":"s","ტ":"t","უ":"u","ფ":"f","ქ":"k","ღ":"gh","ყ":"q","შ":"sh","ჩ":"ch","ც":"ts","ძ":"dz","წ":"ts","ჭ":"ch","ხ":"kh","ჯ":"j","ჰ":"h","Ṣ":"S","ṣ":"s","Ẁ":"W","ẁ":"w","Ẃ":"W","ẃ":"w","Ẅ":"W","ẅ":"w","ẞ":"SS","Ạ":"A","ạ":"a","Ả":"A","ả":"a","Ấ":"A","ấ":"a","Ầ":"A","ầ":"a","Ẩ":"A","ẩ":"a","Ẫ":"A","ẫ":"a","Ậ":"A","ậ":"a","Ắ":"A","ắ":"a","Ằ":"A","ằ":"a","Ẳ":"A","ẳ":"a","Ẵ":"A","ẵ":"a","Ặ":"A","ặ":"a","Ẹ":"E","ẹ":"e","Ẻ":"E","ẻ":"e","Ẽ":"E","ẽ":"e","Ế":"E","ế":"e","Ề":"E","ề":"e","Ể":"E","ể":"e","Ễ":"E","ễ":"e","Ệ":"E","ệ":"e","Ỉ":"I","ỉ":"i","Ị":"I","ị":"i","Ọ":"O","ọ":"o","Ỏ":"O","ỏ":"o","Ố":"O","ố":"o","Ồ":"O","ồ":"o","Ổ":"O","ổ":"o","Ỗ":"O","ỗ":"o","Ộ":"O","ộ":"o","Ớ":"O","ớ":"o","Ờ":"O","ờ":"o","Ở":"O","ở":"o","Ỡ":"O","ỡ":"o","Ợ":"O","ợ":"o","Ụ":"U","ụ":"u","Ủ":"U","ủ":"u","Ứ":"U","ứ":"u","Ừ":"U","ừ":"u","Ử":"U","ử":"u","Ữ":"U","ữ":"u","Ự":"U","ự":"u","Ỳ":"Y","ỳ":"y","Ỵ":"Y","ỵ":"y","Ỷ":"Y","ỷ":"y","Ỹ":"Y","ỹ":"y","–":"-","‘":"'","’":"'","“":"\\"","”":"\\"","„":"\\"","†":"+","•":"*","…":"...","₠":"ecu","₢":"cruzeiro","₣":"french franc","₤":"lira","₥":"mill","₦":"naira","₧":"peseta","₨":"rupee","₩":"won","₪":"new shequel","₫":"dong","€":"euro","₭":"kip","₮":"tugrik","₯":"drachma","₰":"penny","₱":"peso","₲":"guarani","₳":"austral","₴":"hryvnia","₵":"cedi","₸":"kazakhstani tenge","₹":"indian rupee","₺":"turkish lira","₽":"russian ruble","₿":"bitcoin","℠":"sm","™":"tm","∂":"d","∆":"delta","∑":"sum","∞":"infinity","♥":"love","元":"yuan","円":"yen","﷼":"rial","ﻵ":"laa","ﻷ":"laa","ﻹ":"lai","ﻻ":"la"}`),a=JSON.parse('{"bg":{"Й":"Y","Ц":"Ts","Щ":"Sht","Ъ":"A","Ь":"Y","й":"y","ц":"ts","щ":"sht","ъ":"a","ь":"y"},"de":{"Ä":"AE","ä":"ae","Ö":"OE","ö":"oe","Ü":"UE","ü":"ue","ß":"ss","%":"prozent","&":"und","|":"oder","∑":"summe","∞":"unendlich","♥":"liebe"},"es":{"%":"por ciento","&":"y","<":"menor que",">":"mayor que","|":"o","¢":"centavos","£":"libras","¤":"moneda","₣":"francos","∑":"suma","∞":"infinito","♥":"amor"},"fr":{"%":"pourcent","&":"et","<":"plus petit",">":"plus grand","|":"ou","¢":"centime","£":"livre","¤":"devise","₣":"franc","∑":"somme","∞":"infini","♥":"amour"},"pt":{"%":"porcento","&":"e","<":"menor",">":"maior","|":"ou","¢":"centavo","∑":"soma","£":"libra","∞":"infinito","♥":"amor"},"uk":{"И":"Y","и":"y","Й":"Y","й":"y","Ц":"Ts","ц":"ts","Х":"Kh","х":"kh","Щ":"Shch","щ":"shch","Г":"H","г":"h"},"vi":{"Đ":"D","đ":"d"},"da":{"Ø":"OE","ø":"oe","Å":"AA","å":"aa","%":"procent","&":"og","|":"eller","$":"dollar","<":"mindre end",">":"større end"},"nb":{"&":"og","Å":"AA","Æ":"AE","Ø":"OE","å":"aa","æ":"ae","ø":"oe"},"it":{"&":"e"},"nl":{"&":"en"},"sv":{"&":"och","Å":"AA","Ä":"AE","Ö":"OE","å":"aa","ä":"ae","ö":"oe"}}');function l(c,o){if(typeof c!="string")throw new Error("slugify: string argument expected");o=typeof o=="string"?{replacement:o}:o||{};var h=a[o.locale]||{},g=o.replacement===void 0?"-":o.replacement,e=o.trim===void 0?!0:o.trim,i=c.normalize().split("").reduce(function(s,u){var f=h[u];return f===void 0&&(f=n[u]),f===void 0&&(f=u),f===g&&(f=" "),s+f.replace(o.remove||/[^\w\s$*_+~.()'"!\-:@]+/g,"")},"");return o.strict&&(i=i.replace(/[^A-Za-z0-9\s]/g,"")),e&&(i=i.trim()),i=i.replace(/\s+/g,g),o.lower&&(i=i.toLowerCase()),i}return l.extend=function(c){Object.assign(n,c)},l})})(fe);const me=t=>t.split(/[\s-]/g).map(Z).join(" ");function he(t,r){const{navigation:n}=M().public.content;if(n===!1)return[];const a=c=>({...pe(["title",...n.fields])(c),...de(c==null?void 0:c.navigation)?c.navigation:{}}),l=t.sort((c,o)=>c._path.localeCompare(o._path)).reduce((c,o)=>{const h=o._path.substring(1).split("/"),g=o._id.split(":").slice(1),e=!!g[g.length-1].match(/([1-9][0-9]*\.)?index.md/g),i=f=>({title:f.title,_path:f._path,_file:f._file,children:[],...a(f),...f._draft?{_draft:!0}:{}}),s=i(o);if(e){const f=r[s._path];if(typeof(f==null?void 0:f.navigation)<"u"&&!(f!=null&&f.navigation))return c;if(o._path!=="/"){const m=i(o);s.children.push(m)}Object.assign(s,a(f))}return h.length===1?(c.push(s),c):(h.slice(0,-1).reduce((f,m,y)=>{const v="/"+h.slice(0,y+1).join("/"),w=r[v];if(typeof(w==null?void 0:w.navigation)<"u"&&!w.navigation)return[];let I=f.find(O=>O._path===v);return I||(I={title:me(m),_path:v,_file:o._file,children:[],...a(w)},f.push(I)),I.children},c).push(s),c)},[]);return Y(l)}const ge=new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"});function Y(t){var n;t.forEach(a=>{a._file=a._file.split(".").slice(0,-1).join(".")});const r=t.sort((a,l)=>ge.compare(a._file,l._file));for(const a of r)(n=a.children)!=null&&n.length?Y(a.children):delete a.children,delete a._file;return t}function pe(t){return r=>(r=r||{},t&&t.length?t.filter(n=>typeof r[n]<"u").reduce((n,a)=>Object.assign(n,{[a]:r[a]}),{}):r)}function de(t){return Object.prototype.toString.call(t)==="[object Object]"}const ye=t=>T(t,M().public.content.api.baseURL),we=ne(oe({driver:F()}),"@content");function ve(t){async function r(){const n=new Set(await t.getKeys("cache:")),a=U().getPreviewToken();if(a){const c=await t.getItem(`${a}$`).then(g=>g||{});if(Array.isArray(c.ignoreSources)){const g=c.ignoreSources.map(e=>`cache:${e.trim()}:`);for(const e of n)g.some(i=>e.startsWith(i))&&n.delete(e)}const o=await t.getKeys(`${a}:`),h=await Promise.all(o.map(g=>t.getItem(g)));for(const g of h)n.delete(`cache:${g._id}`),g.__deleted||n.add(`${a}:${g._id}`)}return await Promise.all(Array.from(n).map(c=>t.getItem(c)))}return{storage:t,fetch:N(r),query:n=>G(N(r),{initialParams:n,legacy:!0})}}let R=null,S=null;async function Ie(){return S?await S:R||(S=Ae(),R=await S),R}async function Ae(){const t=H(),{content:r}=M().public,n=ve(we),a=await n.storage.getItem("integrity");if(r.integrity!==+(a||0)){const{contents:l,navigation:c}=await $fetch(ye(r.integrity?`cache.${r.integrity}.json`:"cache.json"));await Promise.all(l.map(o=>n.storage.setItem(`cache:${o._id}`,o))),await n.storage.setItem("navigation",c),await n.storage.setItem("integrity",r.integrity)}return await t.callHook("content:storage",n.storage),n}async function Ke(t){const r=await Ie();if(!U().getPreviewToken()&&Object.keys(t||{}).length===0)return r.storage.getItem("navigation");const n=await r.query(t).where({_partial:!1,navigation:{$ne:!1}}).find(),l=(await r.query().where({_path:/\/_dir$/i,_partial:!0}).find()).reduce((c,o)=>{var g;((g=o.title)==null?void 0:g.toLowerCase())==="dir"&&(o.title=void 0);const h=o._path.split("/").slice(0,-1).join("/")||"/";return c[h]={...o,...o.body},c},{});return he(n,l)}export{we as contentStorage,ve as createDB,Ke as generateNavigation,Ie as useContentDatabase}; +import{a5 as _,R as W,aa as B,H as M,P as T,N as H}from"./gOhWOHN0.js";import{g as J,a as P,b as E,o as k,c as b,d as $,f as j,h as D,i as G}from"./Bs6eKMw6.js";import{p as Z}from"./C-v3KzvZ.js";import{u as U}from"./CRsxnQ9b.js";import"./DvDH6DOc.js";const q="memory",F=()=>{const t=new Map;return{name:q,options:{},hasItem(r){return t.has(r)},getItem(r){return t.get(r)??null},getItemRaw(r){return t.get(r)??null},setItem(r,n){t.set(r,n)},setItemRaw(r,n){t.set(r,n)},removeItem(r){t.delete(r)},getKeys(){return Array.from(t.keys())},clear(){t.clear()},dispose(){t.clear()}}};function V(t){return!t||typeof t.then!="function"?Promise.resolve(t):t}function p(t,...r){try{return V(t(...r))}catch(n){return Promise.reject(n)}}function Q(t){const r=typeof t;return t===null||r!=="object"&&r!=="function"}function X(t){const r=Object.getPrototypeOf(t);return!r||r.isPrototypeOf(Object)}function K(t){if(Q(t))return String(t);if(X(t)||Array.isArray(t))return JSON.stringify(t);if(typeof t.toJSON=="function")return K(t.toJSON());throw new Error("[unstorage] Cannot stringify value!")}function z(){if(typeof Buffer===void 0)throw new TypeError("[unstorage] Buffer is not supported!")}const C="base64:";function ee(t){if(typeof t=="string")return t;z();const r=Buffer.from(t).toString("base64");return C+r}function te(t){return typeof t!="string"||!t.startsWith(C)?t:(z(),Buffer.from(t.slice(C.length),"base64"))}const re=["hasItem","getItem","getItemRaw","setItem","setItemRaw","removeItem","getMeta","setMeta","removeMeta","getKeys","clear","mount","unmount"];function ne(t,r){if(r=A(r),!r)return t;const n={...t};for(const a of re)n[a]=(l="",...c)=>t[a](r+l,...c);return n.getKeys=(a="",...l)=>t.getKeys(r+a,...l).then(c=>c.map(o=>o.slice(r.length))),n}function d(t){return t?t.split("?")[0].replace(/[/\\]/g,":").replace(/:+/g,":").replace(/^:|:$/g,""):""}function ie(...t){return d(t.join(":"))}function A(t){return t=d(t),t?t+":":""}const ae="memory",se=()=>{const t=new Map;return{name:ae,options:{},hasItem(r){return t.has(r)},getItem(r){return t.get(r)??null},getItemRaw(r){return t.get(r)??null},setItem(r,n){t.set(r,n)},setItemRaw(r,n){t.set(r,n)},removeItem(r){t.delete(r)},getKeys(){return Array.from(t.keys())},clear(){t.clear()},dispose(){t.clear()}}};function oe(t={}){const r={mounts:{"":t.driver||se()},mountpoints:[""],watching:!1,watchListeners:[],unwatch:{}},n=e=>{for(const i of r.mountpoints)if(e.startsWith(i))return{base:i,relativeKey:e.slice(i.length),driver:r.mounts[i]};return{base:"",relativeKey:e,driver:r.mounts[""]}},a=(e,i)=>r.mountpoints.filter(s=>s.startsWith(e)||i&&e.startsWith(s)).map(s=>({relativeBase:e.length>s.length?e.slice(s.length):void 0,mountpoint:s,driver:r.mounts[s]})),l=(e,i)=>{if(r.watching){i=d(i);for(const s of r.watchListeners)s(e,i)}},c=async()=>{if(!r.watching){r.watching=!0;for(const e in r.mounts)r.unwatch[e]=await x(r.mounts[e],l,e)}},o=async()=>{if(r.watching){for(const e in r.unwatch)await r.unwatch[e]();r.unwatch={},r.watching=!1}},h=(e,i,s)=>{const u=new Map,f=m=>{let y=u.get(m.base);return y||(y={driver:m.driver,base:m.base,items:[]},u.set(m.base,y)),y};for(const m of e){const y=typeof m=="string",v=d(y?m:m.key),w=y?void 0:m.value,I=y||!m.options?i:{...i,...m.options},O=n(v);f(O).items.push({key:v,value:w,relativeKey:O.relativeKey,options:I})}return Promise.all([...u.values()].map(m=>s(m))).then(m=>m.flat())},g={hasItem(e,i={}){e=d(e);const{relativeKey:s,driver:u}=n(e);return p(u.hasItem,s,i)},getItem(e,i={}){e=d(e);const{relativeKey:s,driver:u}=n(e);return p(u.getItem,s,i).then(f=>_(f))},getItems(e,i){return h(e,i,s=>s.driver.getItems?p(s.driver.getItems,s.items.map(u=>({key:u.relativeKey,options:u.options})),i).then(u=>u.map(f=>({key:ie(s.base,f.key),value:_(f.value)}))):Promise.all(s.items.map(u=>p(s.driver.getItem,u.relativeKey,u.options).then(f=>({key:u.key,value:_(f)})))))},getItemRaw(e,i={}){e=d(e);const{relativeKey:s,driver:u}=n(e);return u.getItemRaw?p(u.getItemRaw,s,i):p(u.getItem,s,i).then(f=>te(f))},async setItem(e,i,s={}){if(i===void 0)return g.removeItem(e);e=d(e);const{relativeKey:u,driver:f}=n(e);f.setItem&&(await p(f.setItem,u,K(i),s),f.watch||l("update",e))},async setItems(e,i){await h(e,i,async s=>{if(s.driver.setItems)return p(s.driver.setItems,s.items.map(u=>({key:u.relativeKey,value:K(u.value),options:u.options})),i);s.driver.setItem&&await Promise.all(s.items.map(u=>p(s.driver.setItem,u.relativeKey,K(u.value),u.options)))})},async setItemRaw(e,i,s={}){if(i===void 0)return g.removeItem(e,s);e=d(e);const{relativeKey:u,driver:f}=n(e);if(f.setItemRaw)await p(f.setItemRaw,u,i,s);else if(f.setItem)await p(f.setItem,u,ee(i),s);else return;f.watch||l("update",e)},async removeItem(e,i={}){typeof i=="boolean"&&(i={removeMeta:i}),e=d(e);const{relativeKey:s,driver:u}=n(e);u.removeItem&&(await p(u.removeItem,s,i),(i.removeMeta||i.removeMata)&&await p(u.removeItem,s+"$",i),u.watch||l("remove",e))},async getMeta(e,i={}){typeof i=="boolean"&&(i={nativeOnly:i}),e=d(e);const{relativeKey:s,driver:u}=n(e),f=Object.create(null);if(u.getMeta&&Object.assign(f,await p(u.getMeta,s,i)),!i.nativeOnly){const m=await p(u.getItem,s+"$",i).then(y=>_(y));m&&typeof m=="object"&&(typeof m.atime=="string"&&(m.atime=new Date(m.atime)),typeof m.mtime=="string"&&(m.mtime=new Date(m.mtime)),Object.assign(f,m))}return f},setMeta(e,i,s={}){return this.setItem(e+"$",i,s)},removeMeta(e,i={}){return this.removeItem(e+"$",i)},async getKeys(e,i={}){e=A(e);const s=a(e,!0);let u=[];const f=[];for(const m of s){const v=(await p(m.driver.getKeys,m.relativeBase,i)).map(w=>m.mountpoint+d(w)).filter(w=>!u.some(I=>w.startsWith(I)));f.push(...v),u=[m.mountpoint,...u.filter(w=>!w.startsWith(m.mountpoint))]}return e?f.filter(m=>m.startsWith(e)&&!m.endsWith("$")):f.filter(m=>!m.endsWith("$"))},async clear(e,i={}){e=A(e),await Promise.all(a(e,!1).map(async s=>{if(s.driver.clear)return p(s.driver.clear,s.relativeBase,i);if(s.driver.removeItem){const u=await s.driver.getKeys(s.relativeBase||"",i);return Promise.all(u.map(f=>s.driver.removeItem(f,i)))}}))},async dispose(){await Promise.all(Object.values(r.mounts).map(e=>L(e)))},async watch(e){return await c(),r.watchListeners.push(e),async()=>{r.watchListeners=r.watchListeners.filter(i=>i!==e),r.watchListeners.length===0&&await o()}},async unwatch(){r.watchListeners=[],await o()},mount(e,i){if(e=A(e),e&&r.mounts[e])throw new Error(`already mounted at ${e}`);return e&&(r.mountpoints.push(e),r.mountpoints.sort((s,u)=>u.length-s.length)),r.mounts[e]=i,r.watching&&Promise.resolve(x(i,l,e)).then(s=>{r.unwatch[e]=s}).catch(console.error),g},async unmount(e,i=!0){e=A(e),!(!e||!r.mounts[e])&&(r.watching&&e in r.unwatch&&(r.unwatch[e](),delete r.unwatch[e]),i&&await L(r.mounts[e]),r.mountpoints=r.mountpoints.filter(s=>s!==e),delete r.mounts[e])},getMount(e=""){e=d(e)+":";const i=n(e);return{driver:i.driver,base:i.base}},getMounts(e="",i={}){return e=d(e),a(e,i.parents).map(u=>({driver:u.driver,base:u.mountpoint}))}};return g}function x(t,r,n){return t.watch?t.watch((a,l)=>r(a,n+l)):()=>{}}async function L(t){typeof t.dispose=="function"&&await p(t.dispose)}function ue(t={}){const r=ce(n,t.operators);function n(a,l){return typeof l!="object"||l instanceof RegExp?r.$eq(a,l):Object.keys(l||{}).every(c=>{const o=l[c];if(c.startsWith("$")&&r[c]){const h=r[c];return typeof h=="function"?h(a,o):!1}return n(J(a,c),o)})}return n}function ce(t,r={}){return{$match:(n,a)=>t(n,a),$eq:(n,a)=>a instanceof RegExp?a.test(n):n===a,$ne:(n,a)=>a instanceof RegExp?!a.test(n):n!==a,$not:(n,a)=>!t(n,a),$and:(n,a)=>(P(a,"$and requires an array as condition"),a.every(l=>t(n,l))),$or:(n,a)=>(P(a,"$or requires an array as condition"),a.some(l=>t(n,l))),$in:(n,a)=>E(a).some(l=>Array.isArray(n)?t(n,{$contains:l}):t(n,l)),$contains:(n,a)=>(n=Array.isArray(n)?n:String(n),E(a).every(l=>n.includes(l))),$icontains:(n,a)=>{if(typeof a!="string")throw new TypeError("$icontains requires a string, use $contains instead");return n=String(n).toLocaleLowerCase(),E(a).every(l=>n.includes(l.toLocaleLowerCase()))},$containsAny:(n,a)=>(P(a,"$containsAny requires an array as condition"),n=Array.isArray(n)?n:String(n),a.some(l=>n.includes(l))),$exists:(n,a)=>a?typeof n<"u":typeof n>"u",$type:(n,a)=>typeof n===String(a),$regex:(n,a)=>{if(!(a instanceof RegExp)){const l=String(a).match(/\/(.*)\/([dgimsuy]*)$/);a=l?new RegExp(l[1],l[2]||""):new RegExp(a)}return a.test(String(n||""))},$lt:(n,a)=>nn<=a,$gt:(n,a)=>n>a,$gte:(n,a)=>n>=a,...r||{}}}function le(t){const r=ue(),n=(c,{query:o,before:h,after:g})=>{const e=typeof o=="string"?{_path:o}:o,i=c.findIndex(u=>r(u,e));h=h??1,g=g??1;const s=new Array(h+g).fill(null,0);return i===-1?s:s.map((u,f)=>c[i-h+f+ +(f>=h)]||null)},a=[(c,o)=>{const h=c.result.filter(g=>E(o.where).every(e=>r(g,e)));return{...c,result:h,total:h.length}},(c,o)=>E(o.sort).forEach(h=>b(c.result,h)),function(o,h,g){var e;if(h.surround){let i=n(((e=o.result)==null?void 0:e.length)===1?g:o.result,h.surround);i=$(j(h.without))(i),i=$(D(h.only))(i),o.surround=i}return o}],l=[(c,o)=>{if(o.skip)return{...c,result:c.result.slice(o.skip),skip:o.skip}},(c,o)=>{if(o.limit)return{...c,result:c.result.slice(0,o.limit),limit:o.limit}},function(o,h,g){var e,i,s;if(h.dirConfig){const u=((e=o.result[0])==null?void 0:e._path)||((s=(i=h.where)==null?void 0:i.find(f=>f._path))==null?void 0:s._path);if(typeof u=="string"){const f=g.find(m=>m._path===W(u,"_dir"));f&&(o.dirConfig={_path:f._path,...j(["_"])(f)})}}return o},(c,o)=>({...c,result:$(j(o.without))(c.result)}),(c,o)=>({...c,result:$(D(o.only))(c.result)})];return async c=>{const o=await t(),h=c.params(),g={result:o,limit:0,skip:0,total:o.length},e=a.reduce((s,u)=>u(s,h,o)||s,g);if(h.count)return{result:e.result.length};const i=l.reduce((s,u)=>u(s,h,o)||s,e);return h.first?{...k(["skip","limit","total"])(i),result:i.result[0]}:i}}function N(t){const r=le(t);return async n=>{var c;n.params().first&&n.withDirConfig();const a=n.params(),l=await r(n);return a.surround?l==null?void 0:l.surround:(l!=null&&l.dirConfig&&(l.result={_path:(c=l.dirConfig)==null?void 0:c._path,...l.result,_dir:l.dirConfig}),l==null?void 0:l.result)}}var fe={exports:{}};(function(t,r){(function(n,a,l){t.exports=l(),t.exports.default=l()})("slugify",B,function(){var n=JSON.parse(`{"$":"dollar","%":"percent","&":"and","<":"less",">":"greater","|":"or","¢":"cent","£":"pound","¤":"currency","¥":"yen","©":"(c)","ª":"a","®":"(r)","º":"o","À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","Æ":"AE","Ç":"C","È":"E","É":"E","Ê":"E","Ë":"E","Ì":"I","Í":"I","Î":"I","Ï":"I","Ð":"D","Ñ":"N","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","Ù":"U","Ú":"U","Û":"U","Ü":"U","Ý":"Y","Þ":"TH","ß":"ss","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","æ":"ae","ç":"c","è":"e","é":"e","ê":"e","ë":"e","ì":"i","í":"i","î":"i","ï":"i","ð":"d","ñ":"n","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","ù":"u","ú":"u","û":"u","ü":"u","ý":"y","þ":"th","ÿ":"y","Ā":"A","ā":"a","Ă":"A","ă":"a","Ą":"A","ą":"a","Ć":"C","ć":"c","Č":"C","č":"c","Ď":"D","ď":"d","Đ":"DJ","đ":"dj","Ē":"E","ē":"e","Ė":"E","ė":"e","Ę":"e","ę":"e","Ě":"E","ě":"e","Ğ":"G","ğ":"g","Ģ":"G","ģ":"g","Ĩ":"I","ĩ":"i","Ī":"i","ī":"i","Į":"I","į":"i","İ":"I","ı":"i","Ķ":"k","ķ":"k","Ļ":"L","ļ":"l","Ľ":"L","ľ":"l","Ł":"L","ł":"l","Ń":"N","ń":"n","Ņ":"N","ņ":"n","Ň":"N","ň":"n","Ō":"O","ō":"o","Ő":"O","ő":"o","Œ":"OE","œ":"oe","Ŕ":"R","ŕ":"r","Ř":"R","ř":"r","Ś":"S","ś":"s","Ş":"S","ş":"s","Š":"S","š":"s","Ţ":"T","ţ":"t","Ť":"T","ť":"t","Ũ":"U","ũ":"u","Ū":"u","ū":"u","Ů":"U","ů":"u","Ű":"U","ű":"u","Ų":"U","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","ź":"z","Ż":"Z","ż":"z","Ž":"Z","ž":"z","Ə":"E","ƒ":"f","Ơ":"O","ơ":"o","Ư":"U","ư":"u","Lj":"LJ","lj":"lj","Nj":"NJ","nj":"nj","Ș":"S","ș":"s","Ț":"T","ț":"t","ə":"e","˚":"o","Ά":"A","Έ":"E","Ή":"H","Ί":"I","Ό":"O","Ύ":"Y","Ώ":"W","ΐ":"i","Α":"A","Β":"B","Γ":"G","Δ":"D","Ε":"E","Ζ":"Z","Η":"H","Θ":"8","Ι":"I","Κ":"K","Λ":"L","Μ":"M","Ν":"N","Ξ":"3","Ο":"O","Π":"P","Ρ":"R","Σ":"S","Τ":"T","Υ":"Y","Φ":"F","Χ":"X","Ψ":"PS","Ω":"W","Ϊ":"I","Ϋ":"Y","ά":"a","έ":"e","ή":"h","ί":"i","ΰ":"y","α":"a","β":"b","γ":"g","δ":"d","ε":"e","ζ":"z","η":"h","θ":"8","ι":"i","κ":"k","λ":"l","μ":"m","ν":"n","ξ":"3","ο":"o","π":"p","ρ":"r","ς":"s","σ":"s","τ":"t","υ":"y","φ":"f","χ":"x","ψ":"ps","ω":"w","ϊ":"i","ϋ":"y","ό":"o","ύ":"y","ώ":"w","Ё":"Yo","Ђ":"DJ","Є":"Ye","І":"I","Ї":"Yi","Ј":"J","Љ":"LJ","Њ":"NJ","Ћ":"C","Џ":"DZ","А":"A","Б":"B","В":"V","Г":"G","Д":"D","Е":"E","Ж":"Zh","З":"Z","И":"I","Й":"J","К":"K","Л":"L","М":"M","Н":"N","О":"O","П":"P","Р":"R","С":"S","Т":"T","У":"U","Ф":"F","Х":"H","Ц":"C","Ч":"Ch","Ш":"Sh","Щ":"Sh","Ъ":"U","Ы":"Y","Ь":"","Э":"E","Ю":"Yu","Я":"Ya","а":"a","б":"b","в":"v","г":"g","д":"d","е":"e","ж":"zh","з":"z","и":"i","й":"j","к":"k","л":"l","м":"m","н":"n","о":"o","п":"p","р":"r","с":"s","т":"t","у":"u","ф":"f","х":"h","ц":"c","ч":"ch","ш":"sh","щ":"sh","ъ":"u","ы":"y","ь":"","э":"e","ю":"yu","я":"ya","ё":"yo","ђ":"dj","є":"ye","і":"i","ї":"yi","ј":"j","љ":"lj","њ":"nj","ћ":"c","ѝ":"u","џ":"dz","Ґ":"G","ґ":"g","Ғ":"GH","ғ":"gh","Қ":"KH","қ":"kh","Ң":"NG","ң":"ng","Ү":"UE","ү":"ue","Ұ":"U","ұ":"u","Һ":"H","һ":"h","Ә":"AE","ә":"ae","Ө":"OE","ө":"oe","Ա":"A","Բ":"B","Գ":"G","Դ":"D","Ե":"E","Զ":"Z","Է":"E'","Ը":"Y'","Թ":"T'","Ժ":"JH","Ի":"I","Լ":"L","Խ":"X","Ծ":"C'","Կ":"K","Հ":"H","Ձ":"D'","Ղ":"GH","Ճ":"TW","Մ":"M","Յ":"Y","Ն":"N","Շ":"SH","Չ":"CH","Պ":"P","Ջ":"J","Ռ":"R'","Ս":"S","Վ":"V","Տ":"T","Ր":"R","Ց":"C","Փ":"P'","Ք":"Q'","Օ":"O''","Ֆ":"F","և":"EV","ء":"a","آ":"aa","أ":"a","ؤ":"u","إ":"i","ئ":"e","ا":"a","ب":"b","ة":"h","ت":"t","ث":"th","ج":"j","ح":"h","خ":"kh","د":"d","ذ":"th","ر":"r","ز":"z","س":"s","ش":"sh","ص":"s","ض":"dh","ط":"t","ظ":"z","ع":"a","غ":"gh","ف":"f","ق":"q","ك":"k","ل":"l","م":"m","ن":"n","ه":"h","و":"w","ى":"a","ي":"y","ً":"an","ٌ":"on","ٍ":"en","َ":"a","ُ":"u","ِ":"e","ْ":"","٠":"0","١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","پ":"p","چ":"ch","ژ":"zh","ک":"k","گ":"g","ی":"y","۰":"0","۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","฿":"baht","ა":"a","ბ":"b","გ":"g","დ":"d","ე":"e","ვ":"v","ზ":"z","თ":"t","ი":"i","კ":"k","ლ":"l","მ":"m","ნ":"n","ო":"o","პ":"p","ჟ":"zh","რ":"r","ს":"s","ტ":"t","უ":"u","ფ":"f","ქ":"k","ღ":"gh","ყ":"q","შ":"sh","ჩ":"ch","ც":"ts","ძ":"dz","წ":"ts","ჭ":"ch","ხ":"kh","ჯ":"j","ჰ":"h","Ṣ":"S","ṣ":"s","Ẁ":"W","ẁ":"w","Ẃ":"W","ẃ":"w","Ẅ":"W","ẅ":"w","ẞ":"SS","Ạ":"A","ạ":"a","Ả":"A","ả":"a","Ấ":"A","ấ":"a","Ầ":"A","ầ":"a","Ẩ":"A","ẩ":"a","Ẫ":"A","ẫ":"a","Ậ":"A","ậ":"a","Ắ":"A","ắ":"a","Ằ":"A","ằ":"a","Ẳ":"A","ẳ":"a","Ẵ":"A","ẵ":"a","Ặ":"A","ặ":"a","Ẹ":"E","ẹ":"e","Ẻ":"E","ẻ":"e","Ẽ":"E","ẽ":"e","Ế":"E","ế":"e","Ề":"E","ề":"e","Ể":"E","ể":"e","Ễ":"E","ễ":"e","Ệ":"E","ệ":"e","Ỉ":"I","ỉ":"i","Ị":"I","ị":"i","Ọ":"O","ọ":"o","Ỏ":"O","ỏ":"o","Ố":"O","ố":"o","Ồ":"O","ồ":"o","Ổ":"O","ổ":"o","Ỗ":"O","ỗ":"o","Ộ":"O","ộ":"o","Ớ":"O","ớ":"o","Ờ":"O","ờ":"o","Ở":"O","ở":"o","Ỡ":"O","ỡ":"o","Ợ":"O","ợ":"o","Ụ":"U","ụ":"u","Ủ":"U","ủ":"u","Ứ":"U","ứ":"u","Ừ":"U","ừ":"u","Ử":"U","ử":"u","Ữ":"U","ữ":"u","Ự":"U","ự":"u","Ỳ":"Y","ỳ":"y","Ỵ":"Y","ỵ":"y","Ỷ":"Y","ỷ":"y","Ỹ":"Y","ỹ":"y","–":"-","‘":"'","’":"'","“":"\\"","”":"\\"","„":"\\"","†":"+","•":"*","…":"...","₠":"ecu","₢":"cruzeiro","₣":"french franc","₤":"lira","₥":"mill","₦":"naira","₧":"peseta","₨":"rupee","₩":"won","₪":"new shequel","₫":"dong","€":"euro","₭":"kip","₮":"tugrik","₯":"drachma","₰":"penny","₱":"peso","₲":"guarani","₳":"austral","₴":"hryvnia","₵":"cedi","₸":"kazakhstani tenge","₹":"indian rupee","₺":"turkish lira","₽":"russian ruble","₿":"bitcoin","℠":"sm","™":"tm","∂":"d","∆":"delta","∑":"sum","∞":"infinity","♥":"love","元":"yuan","円":"yen","﷼":"rial","ﻵ":"laa","ﻷ":"laa","ﻹ":"lai","ﻻ":"la"}`),a=JSON.parse('{"bg":{"Й":"Y","Ц":"Ts","Щ":"Sht","Ъ":"A","Ь":"Y","й":"y","ц":"ts","щ":"sht","ъ":"a","ь":"y"},"de":{"Ä":"AE","ä":"ae","Ö":"OE","ö":"oe","Ü":"UE","ü":"ue","ß":"ss","%":"prozent","&":"und","|":"oder","∑":"summe","∞":"unendlich","♥":"liebe"},"es":{"%":"por ciento","&":"y","<":"menor que",">":"mayor que","|":"o","¢":"centavos","£":"libras","¤":"moneda","₣":"francos","∑":"suma","∞":"infinito","♥":"amor"},"fr":{"%":"pourcent","&":"et","<":"plus petit",">":"plus grand","|":"ou","¢":"centime","£":"livre","¤":"devise","₣":"franc","∑":"somme","∞":"infini","♥":"amour"},"pt":{"%":"porcento","&":"e","<":"menor",">":"maior","|":"ou","¢":"centavo","∑":"soma","£":"libra","∞":"infinito","♥":"amor"},"uk":{"И":"Y","и":"y","Й":"Y","й":"y","Ц":"Ts","ц":"ts","Х":"Kh","х":"kh","Щ":"Shch","щ":"shch","Г":"H","г":"h"},"vi":{"Đ":"D","đ":"d"},"da":{"Ø":"OE","ø":"oe","Å":"AA","å":"aa","%":"procent","&":"og","|":"eller","$":"dollar","<":"mindre end",">":"større end"},"nb":{"&":"og","Å":"AA","Æ":"AE","Ø":"OE","å":"aa","æ":"ae","ø":"oe"},"it":{"&":"e"},"nl":{"&":"en"},"sv":{"&":"och","Å":"AA","Ä":"AE","Ö":"OE","å":"aa","ä":"ae","ö":"oe"}}');function l(c,o){if(typeof c!="string")throw new Error("slugify: string argument expected");o=typeof o=="string"?{replacement:o}:o||{};var h=a[o.locale]||{},g=o.replacement===void 0?"-":o.replacement,e=o.trim===void 0?!0:o.trim,i=c.normalize().split("").reduce(function(s,u){var f=h[u];return f===void 0&&(f=n[u]),f===void 0&&(f=u),f===g&&(f=" "),s+f.replace(o.remove||/[^\w\s$*_+~.()'"!\-:@]+/g,"")},"");return o.strict&&(i=i.replace(/[^A-Za-z0-9\s]/g,"")),e&&(i=i.trim()),i=i.replace(/\s+/g,g),o.lower&&(i=i.toLowerCase()),i}return l.extend=function(c){Object.assign(n,c)},l})})(fe);const me=t=>t.split(/[\s-]/g).map(Z).join(" ");function he(t,r){const{navigation:n}=M().public.content;if(n===!1)return[];const a=c=>({...pe(["title",...n.fields])(c),...de(c==null?void 0:c.navigation)?c.navigation:{}}),l=t.sort((c,o)=>c._path.localeCompare(o._path)).reduce((c,o)=>{const h=o._path.substring(1).split("/"),g=o._id.split(":").slice(1),e=!!g[g.length-1].match(/([1-9][0-9]*\.)?index.md/g),i=f=>({title:f.title,_path:f._path,_file:f._file,children:[],...a(f),...f._draft?{_draft:!0}:{}}),s=i(o);if(e){const f=r[s._path];if(typeof(f==null?void 0:f.navigation)<"u"&&!(f!=null&&f.navigation))return c;if(o._path!=="/"){const m=i(o);s.children.push(m)}Object.assign(s,a(f))}return h.length===1?(c.push(s),c):(h.slice(0,-1).reduce((f,m,y)=>{const v="/"+h.slice(0,y+1).join("/"),w=r[v];if(typeof(w==null?void 0:w.navigation)<"u"&&!w.navigation)return[];let I=f.find(O=>O._path===v);return I||(I={title:me(m),_path:v,_file:o._file,children:[],...a(w)},f.push(I)),I.children},c).push(s),c)},[]);return Y(l)}const ge=new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"});function Y(t){var n;t.forEach(a=>{a._file=a._file.split(".").slice(0,-1).join(".")});const r=t.sort((a,l)=>ge.compare(a._file,l._file));for(const a of r)(n=a.children)!=null&&n.length?Y(a.children):delete a.children,delete a._file;return t}function pe(t){return r=>(r=r||{},t&&t.length?t.filter(n=>typeof r[n]<"u").reduce((n,a)=>Object.assign(n,{[a]:r[a]}),{}):r)}function de(t){return Object.prototype.toString.call(t)==="[object Object]"}const ye=t=>T(t,M().public.content.api.baseURL),we=ne(oe({driver:F()}),"@content");function ve(t){async function r(){const n=new Set(await t.getKeys("cache:")),a=U().getPreviewToken();if(a){const c=await t.getItem(`${a}$`).then(g=>g||{});if(Array.isArray(c.ignoreSources)){const g=c.ignoreSources.map(e=>`cache:${e.trim()}:`);for(const e of n)g.some(i=>e.startsWith(i))&&n.delete(e)}const o=await t.getKeys(`${a}:`),h=await Promise.all(o.map(g=>t.getItem(g)));for(const g of h)n.delete(`cache:${g._id}`),g.__deleted||n.add(`${a}:${g._id}`)}return await Promise.all(Array.from(n).map(c=>t.getItem(c)))}return{storage:t,fetch:N(r),query:n=>G(N(r),{initialParams:n,legacy:!0})}}let R=null,S=null;async function Ie(){return S?await S:R||(S=Ae(),R=await S),R}async function Ae(){const t=H(),{content:r}=M().public,n=ve(we),a=await n.storage.getItem("integrity");if(r.integrity!==+(a||0)){const{contents:l,navigation:c}=await $fetch(ye(r.integrity?`cache.${r.integrity}.json`:"cache.json"));await Promise.all(l.map(o=>n.storage.setItem(`cache:${o._id}`,o))),await n.storage.setItem("navigation",c),await n.storage.setItem("integrity",r.integrity)}return await t.callHook("content:storage",n.storage),n}async function Ke(t){const r=await Ie();if(!U().getPreviewToken()&&Object.keys(t||{}).length===0)return r.storage.getItem("navigation");const n=await r.query(t).where({_partial:!1,navigation:{$ne:!1}}).find(),l=(await r.query().where({_path:/\/_dir$/i,_partial:!0}).find()).reduce((c,o)=>{var g;((g=o.title)==null?void 0:g.toLowerCase())==="dir"&&(o.title=void 0);const h=o._path.split("/").slice(0,-1).join("/")||"/";return c[h]={...o,...o.body},c},{});return he(n,l)}export{we as contentStorage,ve as createDB,Ke as generateNavigation,Ie as useContentDatabase}; diff --git a/_nuxt/DPT0E5C3.js b/_nuxt/DFeiu82-.js similarity index 98% rename from _nuxt/DPT0E5C3.js rename to _nuxt/DFeiu82-.js index 2a5648bd..044c2215 100644 --- a/_nuxt/DPT0E5C3.js +++ b/_nuxt/DFeiu82-.js @@ -1 +1 @@ -import{_ as w,c as r,b as s,n as x,e as m,F as h,r as _,h as f,o as l,t as p}from"./DXsCzSxj.js";const v={data(){return{ix:0,a:[],b:[],timeline:[]}},computed:{step(){return this.timeline.length>0?this.timeline[this.ix]:{}},done(){return this.timeline.length-1===this.ix},started(){return this.timeline.length>0}},mounted(){this.generateRandomMatrices()},created(){typeof window>"u"||window.addEventListener("keydown",o=>{o.key===" "?this.incStep():o.key==="Escape"&&(this.ix=0)})},methods:{randomMatrix(o,n){const d=[];for(let b=0;bMath.round(Math.random()*10)));return d},generateRandomMatrices(){this.a=this.randomMatrix(3,4),this.b=this.randomMatrix(4,3),this.timeline=[],this.ix=0},matmul(o,n){this.timeline=[];const d=[];for(let c=0;c{n[e].forEach((i,t)=>{const g=[];o[e].forEach((a,u)=>{g.push(`${o[t][u]}*${n[u][e]}`),d[t][e]+=o[t][u]*n[u][e],b[e*o.length+t]=`${g.join(" + ")} = ${d[t][e]}`;const y=JSON.parse(JSON.stringify(d));this.timeline.push({row_a:t,col_a:u,row_b:u,col_b:e,row_c:t,col_c:e,cur_a:o[t][u],cur_b:n[u][e],cur_c:d[t][e],c:y,all_steps:b.slice()})})})})},incStep(){this.ix!==this.timeline.length-1&&(this.ix+=1)},decStep(){this.ix>0&&(this.ix-=1)}}},k={class:"m-4 space-y-4"},M=s("div",{class:"m-2 w-4/5"},[f(" Walk through the steps of matrix multiplication with randomly generated matrices. Press the "),s("em",null,"Spacebar"),f(" or click the "),s("em",{class:"bg-blue-200 text-blue-800"},"buttons"),f(" to iterate through the steps. ")],-1),S={class:"m-2 inline-flex space-x-2"},C=["disabled"],B=s("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M11 19l-7-7 7-7m8 14l-7-7 7-7"})],-1),E=[B],A=["disabled"],N=s("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 5l7 7-7 7M5 5l7 7-7 7"})],-1),R=[N],V={class:"flex flex-wrap"},D={class:"w-34 m-2 border border-gray-400 sm:w-min"},F=s("div",{class:"bg-gray-200 p-4 text-center font-bold"},"Matrix A",-1),J={class:"flex items-center justify-center p-4"},L={class:"text-center"},O={class:"w-34 m-2 border border-gray-400 sm:w-min"},z=s("div",{class:"bg-gray-200 p-4 text-center font-bold"},"Matrix B",-1),P={class:"flex items-center justify-center p-4"},T={class:"text-center"},W=s("div",{class:"bg-gray-200 p-4 text-center font-bold"},"Result",-1),q={class:"flex items-center justify-center p-4"},G={class:"text-center"},H={key:1,class:"m-2 w-72 border border-gray-400 bg-gray-100 p-2"},I=s("div",{class:"text-center font-bold"},"Steps",-1),K={class:"font-mono"},Q={key:0,class:"italic text-green-600"};function U(o,n,d,b,c,e){return l(),r("div",k,[M,s("div",S,[s("button",{class:x(["bg-blue-200 px-4 py-2 font-bold text-blue-800 hover:bg-blue-800 hover:text-blue-200",{"cursor-not-allowed opacity-25":!e.started}]),disabled:!e.started,onClick:n[0]||(n[0]=(...i)=>e.decStep&&e.decStep(...i))},E,10,C),e.done?m("",!0):(l(),r("button",{key:0,class:"bg-blue-200 px-4 py-2 font-bold text-blue-800 hover:bg-blue-800 hover:text-blue-200",onClick:n[1]||(n[1]=i=>e.matmul(c.a,c.b))}," Start ")),e.done?(l(),r("button",{key:1,class:"bg-orange-200 px-4 py-2 font-bold text-orange-800 hover:bg-blue-800 hover:text-blue-200",onClick:n[2]||(n[2]=(...i)=>e.generateRandomMatrices&&e.generateRandomMatrices(...i))}," Again! ")):m("",!0),s("button",{class:x(["bg-blue-200 px-4 py-2 font-bold text-blue-800 hover:bg-blue-800 hover:text-blue-200",{"cursor-not-allowed opacity-25":!e.started}]),disabled:!e.started,onClick:n[3]||(n[3]=(...i)=>e.incStep&&e.incStep(...i))},R,10,A)]),s("div",V,[s("div",D,[F,s("div",J,[s("table",L,[(l(!0),r(h,null,_(c.a,(i,t)=>(l(),r("tr",{key:t},[(l(!0),r(h,null,_(c.a[t],(g,a)=>(l(),r("td",{key:a,class:x([{"text-green-600":e.step&&t==e.step.row_a&&a==e.step.col_a,"bg-orange-100":e.step&&t==e.step.row_a},"p-2"])},p(c.a[t][a]),3))),128))]))),128))])])]),s("div",O,[z,s("div",P,[s("table",T,[(l(!0),r(h,null,_(c.b,(i,t)=>(l(),r("tr",{key:t},[(l(!0),r(h,null,_(c.b[t],(g,a)=>(l(),r("td",{key:a,class:x([{"text-green-600":e.step&&t==e.step.row_b&&a==e.step.col_b,"bg-orange-100":e.step&&a==e.step.col_b},"p-2"])},p(c.b[t][a]),3))),128))]))),128))])])]),e.started?(l(),r("div",{key:0,class:x(["m-2 w-72 border border-gray-400 sm:w-min",{"bg-green-200":e.done}])},[W,s("div",q,[s("table",G,[(l(!0),r(h,null,_(e.step.c,(i,t)=>(l(),r("tr",{key:t},[(l(!0),r(h,null,_(e.step.c[t],(g,a)=>(l(),r("td",{key:a,class:"p-2"},p(e.step.c[t][a]),1))),128))]))),128))])])],2)):m("",!0),e.started?(l(),r("div",H,[I,s("div",K,[(l(!0),r(h,null,_(e.step.all_steps,(i,t)=>(l(),r("div",{key:t},p(i),1))),128)),e.done?(l(),r("div",Q,"Done!")):m("",!0)])])):m("",!0)]),m("",!0)])}const Y=w(v,[["render",U]]);export{Y as default}; +import{_ as w,c as r,b as s,n as x,e as m,F as h,r as _,h as f,o as l,t as p}from"./gOhWOHN0.js";const v={data(){return{ix:0,a:[],b:[],timeline:[]}},computed:{step(){return this.timeline.length>0?this.timeline[this.ix]:{}},done(){return this.timeline.length-1===this.ix},started(){return this.timeline.length>0}},mounted(){this.generateRandomMatrices()},created(){typeof window>"u"||window.addEventListener("keydown",o=>{o.key===" "?this.incStep():o.key==="Escape"&&(this.ix=0)})},methods:{randomMatrix(o,n){const d=[];for(let b=0;bMath.round(Math.random()*10)));return d},generateRandomMatrices(){this.a=this.randomMatrix(3,4),this.b=this.randomMatrix(4,3),this.timeline=[],this.ix=0},matmul(o,n){this.timeline=[];const d=[];for(let c=0;c{n[e].forEach((i,t)=>{const g=[];o[e].forEach((a,u)=>{g.push(`${o[t][u]}*${n[u][e]}`),d[t][e]+=o[t][u]*n[u][e],b[e*o.length+t]=`${g.join(" + ")} = ${d[t][e]}`;const y=JSON.parse(JSON.stringify(d));this.timeline.push({row_a:t,col_a:u,row_b:u,col_b:e,row_c:t,col_c:e,cur_a:o[t][u],cur_b:n[u][e],cur_c:d[t][e],c:y,all_steps:b.slice()})})})})},incStep(){this.ix!==this.timeline.length-1&&(this.ix+=1)},decStep(){this.ix>0&&(this.ix-=1)}}},k={class:"m-4 space-y-4"},M=s("div",{class:"m-2 w-4/5"},[f(" Walk through the steps of matrix multiplication with randomly generated matrices. Press the "),s("em",null,"Spacebar"),f(" or click the "),s("em",{class:"bg-blue-200 text-blue-800"},"buttons"),f(" to iterate through the steps. ")],-1),S={class:"m-2 inline-flex space-x-2"},C=["disabled"],B=s("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M11 19l-7-7 7-7m8 14l-7-7 7-7"})],-1),E=[B],A=["disabled"],N=s("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 5l7 7-7 7M5 5l7 7-7 7"})],-1),R=[N],V={class:"flex flex-wrap"},D={class:"w-34 m-2 border border-gray-400 sm:w-min"},F=s("div",{class:"bg-gray-200 p-4 text-center font-bold"},"Matrix A",-1),J={class:"flex items-center justify-center p-4"},L={class:"text-center"},O={class:"w-34 m-2 border border-gray-400 sm:w-min"},z=s("div",{class:"bg-gray-200 p-4 text-center font-bold"},"Matrix B",-1),P={class:"flex items-center justify-center p-4"},T={class:"text-center"},W=s("div",{class:"bg-gray-200 p-4 text-center font-bold"},"Result",-1),q={class:"flex items-center justify-center p-4"},G={class:"text-center"},H={key:1,class:"m-2 w-72 border border-gray-400 bg-gray-100 p-2"},I=s("div",{class:"text-center font-bold"},"Steps",-1),K={class:"font-mono"},Q={key:0,class:"italic text-green-600"};function U(o,n,d,b,c,e){return l(),r("div",k,[M,s("div",S,[s("button",{class:x(["bg-blue-200 px-4 py-2 font-bold text-blue-800 hover:bg-blue-800 hover:text-blue-200",{"cursor-not-allowed opacity-25":!e.started}]),disabled:!e.started,onClick:n[0]||(n[0]=(...i)=>e.decStep&&e.decStep(...i))},E,10,C),e.done?m("",!0):(l(),r("button",{key:0,class:"bg-blue-200 px-4 py-2 font-bold text-blue-800 hover:bg-blue-800 hover:text-blue-200",onClick:n[1]||(n[1]=i=>e.matmul(c.a,c.b))}," Start ")),e.done?(l(),r("button",{key:1,class:"bg-orange-200 px-4 py-2 font-bold text-orange-800 hover:bg-blue-800 hover:text-blue-200",onClick:n[2]||(n[2]=(...i)=>e.generateRandomMatrices&&e.generateRandomMatrices(...i))}," Again! ")):m("",!0),s("button",{class:x(["bg-blue-200 px-4 py-2 font-bold text-blue-800 hover:bg-blue-800 hover:text-blue-200",{"cursor-not-allowed opacity-25":!e.started}]),disabled:!e.started,onClick:n[3]||(n[3]=(...i)=>e.incStep&&e.incStep(...i))},R,10,A)]),s("div",V,[s("div",D,[F,s("div",J,[s("table",L,[(l(!0),r(h,null,_(c.a,(i,t)=>(l(),r("tr",{key:t},[(l(!0),r(h,null,_(c.a[t],(g,a)=>(l(),r("td",{key:a,class:x([{"text-green-600":e.step&&t==e.step.row_a&&a==e.step.col_a,"bg-orange-100":e.step&&t==e.step.row_a},"p-2"])},p(c.a[t][a]),3))),128))]))),128))])])]),s("div",O,[z,s("div",P,[s("table",T,[(l(!0),r(h,null,_(c.b,(i,t)=>(l(),r("tr",{key:t},[(l(!0),r(h,null,_(c.b[t],(g,a)=>(l(),r("td",{key:a,class:x([{"text-green-600":e.step&&t==e.step.row_b&&a==e.step.col_b,"bg-orange-100":e.step&&a==e.step.col_b},"p-2"])},p(c.b[t][a]),3))),128))]))),128))])])]),e.started?(l(),r("div",{key:0,class:x(["m-2 w-72 border border-gray-400 sm:w-min",{"bg-green-200":e.done}])},[W,s("div",q,[s("table",G,[(l(!0),r(h,null,_(e.step.c,(i,t)=>(l(),r("tr",{key:t},[(l(!0),r(h,null,_(e.step.c[t],(g,a)=>(l(),r("td",{key:a,class:"p-2"},p(e.step.c[t][a]),1))),128))]))),128))])])],2)):m("",!0),e.started?(l(),r("div",H,[I,s("div",K,[(l(!0),r(h,null,_(e.step.all_steps,(i,t)=>(l(),r("div",{key:t},p(i),1))),128)),e.done?(l(),r("div",Q,"Done!")):m("",!0)])])):m("",!0)]),m("",!0)])}const Y=w(v,[["render",U]]);export{Y as default}; diff --git a/_nuxt/iK2nAm-v.js b/_nuxt/DGNm3EUI.js similarity index 99% rename from _nuxt/iK2nAm-v.js rename to _nuxt/DGNm3EUI.js index f1af7cc6..1c130fc4 100644 --- a/_nuxt/iK2nAm-v.js +++ b/_nuxt/DGNm3EUI.js @@ -1 +1 @@ -import{_ as g,c as h,b as n,A as d,B as c,t as a,o as u}from"./DXsCzSxj.js";const p={data(){return{height:0,width:0,distance:3,strokeWidth:1,startingX:125,startingY:150,startingAngle:0,sequence:"3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275900994657640789512694683983525957098258226205224894077267194782684826014769909026401363944374553050682034962524517493996514314298091906592509372216964615157098583874105978859597729754989301617539284681382686838689427741559918559252459539594310499725246808459872736446958486538367362226260991246080512438843904512441365497627807977156914359977001296160894416948685558484063534220722258284886481584560285060168427394522674676788952521385225499546667278239864565961163548862305774564980355936345681743241125150760694794510965960940252288797108931456691368672287489405601015033086179286809208747609178249385890097149096759852613655497818931297848216829989487226588048575640142704775551323796414515237462343645428584447952658678210511413547357395231134271661021359695362314429524849371871101457654035902799344037420073105785390621983874478084784896833214457138687519435064302184531910484810053706146806749192781911979399520614196634287544406437451237181921799983910159195618146751426912397489409071864942319615679452080951465502252316038819301420937621378559566389377870830390697920773467221825625996615014215030680384477345492026054146659252014974428507325186660021324340881907104863317346496514539057962685610055081066587969981635747363840525714591028970641401109712062804390397595156771577004203378699360072305587631763594218731251471205329281918261861258673215791984148488291644706095752706957220917567116722910981690915280173506712748583222871835209353965725121083579151369882091444210067510334671103141267111369908658516398315019701651511685171437657618351556508849099898599823873455283316355076479185358932261854896321329330898570642046752590709154814165498594616371802709819943099244889575712828905923233260972997120844335732654893823911932597463667305836041428138830320382490375898524374417029132765618093773444030707469211201913020330380197621101100449293215160842444859637669838952286847831235526582131449576857262433441893039686426243410773226978028073189154411010446823252716201052652272111660396665573092547110557853763466820653109896526918620564769312570586356620185581007293606598764861179104533488503461136576867532494416680396265797877185560845529654126654085306143444318586769751456614068007002378776591344017127494704205622305389945613140711270004078547332699390814546646458807972708266830634328587856983052358089330657574067954571637752542021149557615814002501262285941302164715509792592309907965473761255176567513575178296664547791745011299614890304639947132962107340437518957359614589019389713111790429782856475032031986915140287080859904801094121472213179476477726224142548545403321571853061422881375850430633217518297986622371721591607716692547487389866549494501146540628433663937900397692656721463853067360965712091807638327166416274888800786925602902284721040317211860820419000422966171196377921337575114959501566049631862947265473642523081770367515906735023507283540567040386743513622224771589150495309844489333096340878076932599397805419341447377441842631298608099888687413260472156951623965864573021631598193195167353812974167729478672422924654366800980676928238280689964004824354037014163149658979409243237896907069779422362508221688957383798623001593776471651228935786015881617557829735233446042815126272037343146531977774160319906655418763979293344195215413418994854447345673831624993419131814809277771038638773431772075456545322077709212019051660962804909263601975988281613323166636528619326686336062735676303544776280350450777235547105859548702790814356240145171806246436267945612753181340783303362542327839449753824372058353114771199260638133467768796959703098339130771098704085913374641442822772634659470474587847787201927715280731767907707157213444730605700733492436931138350493163128404251219256517980694113528013147013047816437885185290928545201165839341965621349143415956258658655705526904965209858033850722426482939728584783163057777560688876446248246857926039535277348030480290058760758251047470916439613626760449256274204208320856611906254543372131535958450687724602901618766795240616342522577195429162991930645537799140373404328752628889639958794757291746426357455254079091451357111369410911939325191076020825202618798531887705842972591677813149699009019211697173727847684726860849003377024242916513005005168323364350389517029893922334517220138128069650117844087451960121228599371623130171144484640903890644954440061986907548516026327505298349187407866808818338510228334508504860825039302133219715518430635455007668282949304137765527939751754613953984683393638304746119966538581538420568533862186725233402830871123282789212507712629463229563989898935821167456270102183564622013496715188190973038119800497340723961036854066431939509790190699639552453005450580685501956730229219139339185680344903982059551002263535361920419947455385938102343955449597783779023742161727111723643435439478221818528624085140066604433258885698670543154706965747458550332323342107301545940516553790686627333799585115625784322988273723198987571415957811196358330059408730681216028764962867446047746491599505497374256269010490377819868359381465741268049256487985561453723478673303904688383436346553794986419270563872931748723320837601123029911367938627089438799362016295154133714248928307220126901475466847653576164773794675200490757155527819653621323926406160136358155907422020203187277605277219005561484255518792530343513984425322341576233610642506390497500865627109535919465897514131034822769306247435363256916078154781811528436679570611086153315044521274739245449454236828860613408414863776700961207151249140430272538607648236341433462351897576645216413767969031495019108575984423919862916421939949072362346468441173940326591840443780513338945257423995082965912285085558215725031071257012668302402929525220118726767562204154205161841634847565169998116141010029960783869092916030288400269104140792886215078424516709087000699282120660418371806535567252532567532861291042487761825829765157959847035622262934860034158722980534989650226291748788202734209222245339856264766914905562842503912757710284027998066365825488926488025456610172967026640765590429099456815065265305371829412703369313785178609040708667114965583434347693385781711386455873678123014587687126603489139095620099393610310291616152881384379099042317473363948045759314931405297634757481193567091101377517210080315590248530906692037671922033229094334676851422144773793937517034436619910403375111735471918550464490263655128162288244625759163330391072253837421821408835086573917715096828874782656995995744906617583441375223970968340800535598491754173818839994469748676265516582765848358845314277568790029095170283529716344562129640435231176006651012412006597558512761785838292041974844236080071930457618932349229279650198751872127267507981255470958904556357921221033346697499235630254947802490114195212382815309114079073860251522742995818072471625916685451333123948049470791191532673430282441860414263639548000448002670496248201792896476697583183271314251702969234889627668440323260927524960357996469256504936818360900323809293459588970695365349406034021665443755890045632882250545255640564482465151875471196218443965825337543885690941130315095261793780029741207665147939425902989695946995565761218656196733786236256125216320862869222103274889218654364802296780705765615144632046927906821207388377814233562823608963208068222468012248261177185896381409183903673672220888321513755600372798394004152970028783076670944474560134556417254370906979396122571429894671543578468788614445812314593571984922528471605049221242470141214780573455105008019086996033027634787081081754501193071412233908663938339529425786905076431006383519834389341596131854347546495569781038293097164651438407007073604112373599843452251610507027056235266012764848308407611830130527932054274628654036036745328651057065874882256981579367897669742205750596834408697350201410206723585020072452256326513410559240190274216248439140359989535394590944070469120914093870012645600162374288021092764579310657922955249887275846101264836999892256959688159205600101655256375678",sketch:void 0}},methods:{render(i){const e="0123456789",r=["#FFBA08","#FAA307","#F48C06","#E85D04","#DC2F02","#D00000","#9D0208","#6A040F","#370617","#03071E"],o={x:this.startingX,y:this.startingY,a:this.startingAngle};i.strokeWeight(this.strokeWidth),i.clear(),i.background(r[9]),i.beginShape(),i.vertex(o.x,o.y);for(let t=0;t{r.setup=()=>{r.createCanvas(this.width,this.height),r.noLoop(),r.noFill(),r.stroke(255),this.sketch=r,this.render(this.sketch)}};new this.$p5(e,"canvas")}},m={class:"select-none bg-gradient-to-b from-green-800 to-gray-800"},x={class:"m-8 grid place-items-center"},b={class:"font-mono text-white"},f=n("div",{id:"canvas-container",class:"mb-2 h-96 border-2 border-white"},[n("div",{id:"canvas"})],-1),v={class:"my-2 md:w-full"},k={class:"grid-rows-auto my-2 grid grid-cols-2 gap-4 border-2 border-white p-2 md:grid-rows-1"},_={class:"flex flex-col"},y={for:"distanceInput",class:"text-right"},A={class:"flex flex-col"},w={for:"strokeInput",class:"text-right"},I={class:"flex flex-col"},C={for:"startingXInput",class:"text-right"},V={class:"flex flex-col"},W={for:"startingYInput",class:"text-right"},X={class:"flex flex-col"},Y={for:"startingAngleInput",class:"text-right"};function D(i,e,r,o,t,l){return u(),h("div",m,[n("div",x,[n("div",b,[f,n("div",v,[d(n("textarea",{readonly:"","onUpdate:modelValue":e[0]||(e[0]=s=>t.sequence=s),class:"block h-24 w-full border-2 border-white bg-black p-2 text-white placeholder:italic placeholder:text-slate-400 focus:border-2 focus:border-yellow-500 focus:outline-none sm:text-sm",placeholder:"Enter a sequence of numbers...",type:"text"},null,512),[[c,t.sequence]])]),n("div",k,[n("div",_,[n("label",y,"Segment Length ["+a(t.distance)+"]",1),d(n("input",{id:"distanceInput","onUpdate:modelValue":e[1]||(e[1]=s=>t.distance=s),onChange:e[2]||(e[2]=s=>l.render(t.sketch)),type:"range",min:"1",max:"25",class:"accent-black"},null,544),[[c,t.distance,void 0,{number:!0}]])]),n("div",A,[n("label",w,"Stroke Width ["+a(t.strokeWidth)+"]",1),d(n("input",{id:"strokeInput","onUpdate:modelValue":e[3]||(e[3]=s=>t.strokeWidth=s),onChange:e[4]||(e[4]=s=>l.render(t.sketch)),type:"range",min:"1",max:"10",class:"accent-black"},null,544),[[c,t.strokeWidth,void 0,{number:!0}]])]),n("div",I,[n("label",C,"X Position ["+a(t.startingX)+"]",1),d(n("input",{id:"startingXInput","onUpdate:modelValue":e[5]||(e[5]=s=>t.startingX=s),onChange:e[6]||(e[6]=s=>l.render(t.sketch)),type:"range",min:"0",max:"500",class:"accent-black"},null,544),[[c,t.startingX,void 0,{number:!0}]])]),n("div",V,[n("label",W,"Y Position ["+a(t.startingY)+"]",1),d(n("input",{id:"startingYInput","onUpdate:modelValue":e[7]||(e[7]=s=>t.startingY=s),onChange:e[8]||(e[8]=s=>l.render(t.sketch)),type:"range",min:"0",max:"500",class:"accent-black"},null,544),[[c,t.startingY,void 0,{number:!0}]])]),n("div",X,[n("label",Y,"Angle ["+a(t.startingAngle)+"]",1),d(n("input",{id:"startingAngleInput","onUpdate:modelValue":e[9]||(e[9]=s=>t.startingAngle=s),onChange:e[10]||(e[10]=s=>l.render(t.sketch)),type:"range",min:"-180",max:"180",class:"accent-black"},null,544),[[c,t.startingAngle,void 0,{number:!0}]])])])])])])}const F=g(p,[["render",D]]);export{F as default}; +import{_ as g,c as h,b as n,A as d,B as c,t as a,o as u}from"./gOhWOHN0.js";const p={data(){return{height:0,width:0,distance:3,strokeWidth:1,startingX:125,startingY:150,startingAngle:0,sequence:"3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275900994657640789512694683983525957098258226205224894077267194782684826014769909026401363944374553050682034962524517493996514314298091906592509372216964615157098583874105978859597729754989301617539284681382686838689427741559918559252459539594310499725246808459872736446958486538367362226260991246080512438843904512441365497627807977156914359977001296160894416948685558484063534220722258284886481584560285060168427394522674676788952521385225499546667278239864565961163548862305774564980355936345681743241125150760694794510965960940252288797108931456691368672287489405601015033086179286809208747609178249385890097149096759852613655497818931297848216829989487226588048575640142704775551323796414515237462343645428584447952658678210511413547357395231134271661021359695362314429524849371871101457654035902799344037420073105785390621983874478084784896833214457138687519435064302184531910484810053706146806749192781911979399520614196634287544406437451237181921799983910159195618146751426912397489409071864942319615679452080951465502252316038819301420937621378559566389377870830390697920773467221825625996615014215030680384477345492026054146659252014974428507325186660021324340881907104863317346496514539057962685610055081066587969981635747363840525714591028970641401109712062804390397595156771577004203378699360072305587631763594218731251471205329281918261861258673215791984148488291644706095752706957220917567116722910981690915280173506712748583222871835209353965725121083579151369882091444210067510334671103141267111369908658516398315019701651511685171437657618351556508849099898599823873455283316355076479185358932261854896321329330898570642046752590709154814165498594616371802709819943099244889575712828905923233260972997120844335732654893823911932597463667305836041428138830320382490375898524374417029132765618093773444030707469211201913020330380197621101100449293215160842444859637669838952286847831235526582131449576857262433441893039686426243410773226978028073189154411010446823252716201052652272111660396665573092547110557853763466820653109896526918620564769312570586356620185581007293606598764861179104533488503461136576867532494416680396265797877185560845529654126654085306143444318586769751456614068007002378776591344017127494704205622305389945613140711270004078547332699390814546646458807972708266830634328587856983052358089330657574067954571637752542021149557615814002501262285941302164715509792592309907965473761255176567513575178296664547791745011299614890304639947132962107340437518957359614589019389713111790429782856475032031986915140287080859904801094121472213179476477726224142548545403321571853061422881375850430633217518297986622371721591607716692547487389866549494501146540628433663937900397692656721463853067360965712091807638327166416274888800786925602902284721040317211860820419000422966171196377921337575114959501566049631862947265473642523081770367515906735023507283540567040386743513622224771589150495309844489333096340878076932599397805419341447377441842631298608099888687413260472156951623965864573021631598193195167353812974167729478672422924654366800980676928238280689964004824354037014163149658979409243237896907069779422362508221688957383798623001593776471651228935786015881617557829735233446042815126272037343146531977774160319906655418763979293344195215413418994854447345673831624993419131814809277771038638773431772075456545322077709212019051660962804909263601975988281613323166636528619326686336062735676303544776280350450777235547105859548702790814356240145171806246436267945612753181340783303362542327839449753824372058353114771199260638133467768796959703098339130771098704085913374641442822772634659470474587847787201927715280731767907707157213444730605700733492436931138350493163128404251219256517980694113528013147013047816437885185290928545201165839341965621349143415956258658655705526904965209858033850722426482939728584783163057777560688876446248246857926039535277348030480290058760758251047470916439613626760449256274204208320856611906254543372131535958450687724602901618766795240616342522577195429162991930645537799140373404328752628889639958794757291746426357455254079091451357111369410911939325191076020825202618798531887705842972591677813149699009019211697173727847684726860849003377024242916513005005168323364350389517029893922334517220138128069650117844087451960121228599371623130171144484640903890644954440061986907548516026327505298349187407866808818338510228334508504860825039302133219715518430635455007668282949304137765527939751754613953984683393638304746119966538581538420568533862186725233402830871123282789212507712629463229563989898935821167456270102183564622013496715188190973038119800497340723961036854066431939509790190699639552453005450580685501956730229219139339185680344903982059551002263535361920419947455385938102343955449597783779023742161727111723643435439478221818528624085140066604433258885698670543154706965747458550332323342107301545940516553790686627333799585115625784322988273723198987571415957811196358330059408730681216028764962867446047746491599505497374256269010490377819868359381465741268049256487985561453723478673303904688383436346553794986419270563872931748723320837601123029911367938627089438799362016295154133714248928307220126901475466847653576164773794675200490757155527819653621323926406160136358155907422020203187277605277219005561484255518792530343513984425322341576233610642506390497500865627109535919465897514131034822769306247435363256916078154781811528436679570611086153315044521274739245449454236828860613408414863776700961207151249140430272538607648236341433462351897576645216413767969031495019108575984423919862916421939949072362346468441173940326591840443780513338945257423995082965912285085558215725031071257012668302402929525220118726767562204154205161841634847565169998116141010029960783869092916030288400269104140792886215078424516709087000699282120660418371806535567252532567532861291042487761825829765157959847035622262934860034158722980534989650226291748788202734209222245339856264766914905562842503912757710284027998066365825488926488025456610172967026640765590429099456815065265305371829412703369313785178609040708667114965583434347693385781711386455873678123014587687126603489139095620099393610310291616152881384379099042317473363948045759314931405297634757481193567091101377517210080315590248530906692037671922033229094334676851422144773793937517034436619910403375111735471918550464490263655128162288244625759163330391072253837421821408835086573917715096828874782656995995744906617583441375223970968340800535598491754173818839994469748676265516582765848358845314277568790029095170283529716344562129640435231176006651012412006597558512761785838292041974844236080071930457618932349229279650198751872127267507981255470958904556357921221033346697499235630254947802490114195212382815309114079073860251522742995818072471625916685451333123948049470791191532673430282441860414263639548000448002670496248201792896476697583183271314251702969234889627668440323260927524960357996469256504936818360900323809293459588970695365349406034021665443755890045632882250545255640564482465151875471196218443965825337543885690941130315095261793780029741207665147939425902989695946995565761218656196733786236256125216320862869222103274889218654364802296780705765615144632046927906821207388377814233562823608963208068222468012248261177185896381409183903673672220888321513755600372798394004152970028783076670944474560134556417254370906979396122571429894671543578468788614445812314593571984922528471605049221242470141214780573455105008019086996033027634787081081754501193071412233908663938339529425786905076431006383519834389341596131854347546495569781038293097164651438407007073604112373599843452251610507027056235266012764848308407611830130527932054274628654036036745328651057065874882256981579367897669742205750596834408697350201410206723585020072452256326513410559240190274216248439140359989535394590944070469120914093870012645600162374288021092764579310657922955249887275846101264836999892256959688159205600101655256375678",sketch:void 0}},methods:{render(i){const e="0123456789",r=["#FFBA08","#FAA307","#F48C06","#E85D04","#DC2F02","#D00000","#9D0208","#6A040F","#370617","#03071E"],o={x:this.startingX,y:this.startingY,a:this.startingAngle};i.strokeWeight(this.strokeWidth),i.clear(),i.background(r[9]),i.beginShape(),i.vertex(o.x,o.y);for(let t=0;t{r.setup=()=>{r.createCanvas(this.width,this.height),r.noLoop(),r.noFill(),r.stroke(255),this.sketch=r,this.render(this.sketch)}};new this.$p5(e,"canvas")}},m={class:"select-none bg-gradient-to-b from-green-800 to-gray-800"},x={class:"m-8 grid place-items-center"},b={class:"font-mono text-white"},f=n("div",{id:"canvas-container",class:"mb-2 h-96 border-2 border-white"},[n("div",{id:"canvas"})],-1),v={class:"my-2 md:w-full"},k={class:"grid-rows-auto my-2 grid grid-cols-2 gap-4 border-2 border-white p-2 md:grid-rows-1"},_={class:"flex flex-col"},y={for:"distanceInput",class:"text-right"},A={class:"flex flex-col"},w={for:"strokeInput",class:"text-right"},I={class:"flex flex-col"},C={for:"startingXInput",class:"text-right"},V={class:"flex flex-col"},W={for:"startingYInput",class:"text-right"},X={class:"flex flex-col"},Y={for:"startingAngleInput",class:"text-right"};function D(i,e,r,o,t,l){return u(),h("div",m,[n("div",x,[n("div",b,[f,n("div",v,[d(n("textarea",{readonly:"","onUpdate:modelValue":e[0]||(e[0]=s=>t.sequence=s),class:"block h-24 w-full border-2 border-white bg-black p-2 text-white placeholder:italic placeholder:text-slate-400 focus:border-2 focus:border-yellow-500 focus:outline-none sm:text-sm",placeholder:"Enter a sequence of numbers...",type:"text"},null,512),[[c,t.sequence]])]),n("div",k,[n("div",_,[n("label",y,"Segment Length ["+a(t.distance)+"]",1),d(n("input",{id:"distanceInput","onUpdate:modelValue":e[1]||(e[1]=s=>t.distance=s),onChange:e[2]||(e[2]=s=>l.render(t.sketch)),type:"range",min:"1",max:"25",class:"accent-black"},null,544),[[c,t.distance,void 0,{number:!0}]])]),n("div",A,[n("label",w,"Stroke Width ["+a(t.strokeWidth)+"]",1),d(n("input",{id:"strokeInput","onUpdate:modelValue":e[3]||(e[3]=s=>t.strokeWidth=s),onChange:e[4]||(e[4]=s=>l.render(t.sketch)),type:"range",min:"1",max:"10",class:"accent-black"},null,544),[[c,t.strokeWidth,void 0,{number:!0}]])]),n("div",I,[n("label",C,"X Position ["+a(t.startingX)+"]",1),d(n("input",{id:"startingXInput","onUpdate:modelValue":e[5]||(e[5]=s=>t.startingX=s),onChange:e[6]||(e[6]=s=>l.render(t.sketch)),type:"range",min:"0",max:"500",class:"accent-black"},null,544),[[c,t.startingX,void 0,{number:!0}]])]),n("div",V,[n("label",W,"Y Position ["+a(t.startingY)+"]",1),d(n("input",{id:"startingYInput","onUpdate:modelValue":e[7]||(e[7]=s=>t.startingY=s),onChange:e[8]||(e[8]=s=>l.render(t.sketch)),type:"range",min:"0",max:"500",class:"accent-black"},null,544),[[c,t.startingY,void 0,{number:!0}]])]),n("div",X,[n("label",Y,"Angle ["+a(t.startingAngle)+"]",1),d(n("input",{id:"startingAngleInput","onUpdate:modelValue":e[9]||(e[9]=s=>t.startingAngle=s),onChange:e[10]||(e[10]=s=>l.render(t.sketch)),type:"range",min:"-180",max:"180",class:"accent-black"},null,544),[[c,t.startingAngle,void 0,{number:!0}]])])])])])])}const F=g(p,[["render",D]]);export{F as default}; diff --git a/_nuxt/BfNsWvZZ.js b/_nuxt/DMZU-7l4.js similarity index 64% rename from _nuxt/BfNsWvZZ.js rename to _nuxt/DMZU-7l4.js index 8f2f33f7..749078f7 100644 --- a/_nuxt/BfNsWvZZ.js +++ b/_nuxt/DMZU-7l4.js @@ -1 +1 @@ -import{_ as o,o as r,c as t,a7 as s}from"./DXsCzSxj.js";const c={};function n(e,a){return r(),t("th",null,[s(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; +import{_ as o,o as r,c as t,a7 as s}from"./gOhWOHN0.js";const c={};function n(e,a){return r(),t("th",null,[s(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/Bay-NfhX.js b/_nuxt/DQhOff_n.js similarity index 78% rename from _nuxt/Bay-NfhX.js rename to _nuxt/DQhOff_n.js index 7ff4d846..83ec93b1 100644 --- a/_nuxt/Bay-NfhX.js +++ b/_nuxt/DQhOff_n.js @@ -1 +1 @@ -import n from"./WlOj4iQ2.js";import{d as c,I as l,K as u}from"./DXsCzSxj.js";import"./W6vbqLg7.js";import"./CAzXSrXZ.js";import"./DvDH6DOc.js";import"./BDqtaPAc.js";const p=(r,t)=>u("pre",null,JSON.stringify({message:"You should use slots with ",slot:r,data:t},null,2)),h=c({name:"ContentList",props:{path:{type:String,required:!1,default:void 0},query:{type:Object,required:!1,default:void 0}},render(r){const t=l(),{path:f,query:a}=r,m={...a||{},path:f||(a==null?void 0:a.path)||"/"};return u(n,m,{default:t!=null&&t.default?({data:e,refresh:o,isPartial:d})=>t.default({list:e,refresh:o,isPartial:d,...this.$attrs}):e=>p("default",e.data),empty:e=>t!=null&&t.empty?t.empty(e):p("default",e==null?void 0:e.data),"not-found":e=>{var o;return t!=null&&t["not-found"]?(o=t==null?void 0:t["not-found"])==null?void 0:o.call(t,e):p("not-found",e==null?void 0:e.data)}})}}),i=h;export{i as default}; +import n from"./ChudRan8.js";import{d as c,I as l,K as u}from"./gOhWOHN0.js";import"./BYBkJnue.js";import"./Bs6eKMw6.js";import"./DvDH6DOc.js";import"./CRsxnQ9b.js";const p=(r,t)=>u("pre",null,JSON.stringify({message:"You should use slots with ",slot:r,data:t},null,2)),h=c({name:"ContentList",props:{path:{type:String,required:!1,default:void 0},query:{type:Object,required:!1,default:void 0}},render(r){const t=l(),{path:f,query:a}=r,m={...a||{},path:f||(a==null?void 0:a.path)||"/"};return u(n,m,{default:t!=null&&t.default?({data:e,refresh:o,isPartial:d})=>t.default({list:e,refresh:o,isPartial:d,...this.$attrs}):e=>p("default",e.data),empty:e=>t!=null&&t.empty?t.empty(e):p("default",e==null?void 0:e.data),"not-found":e=>{var o;return t!=null&&t["not-found"]?(o=t==null?void 0:t["not-found"])==null?void 0:o.call(t,e):p("not-found",e==null?void 0:e.data)}})}}),i=h;export{i as default}; diff --git a/_nuxt/DQogfMZl.js b/_nuxt/DQogfMZl.js deleted file mode 100644 index 44971b6b..00000000 --- a/_nuxt/DQogfMZl.js +++ /dev/null @@ -1 +0,0 @@ -import{d as v,k as p,p as b,l as x,o as c,c as l,b as e,h as r,f as i,g as h,t as u,S as w,F as y,r as k,e as f,i as $,w as I,a as S}from"./DXsCzSxj.js";import{s as D}from"./Ch5M0tju.js";import{_ as N,a as A}from"./C-Ppi5pl.js";import{q as L}from"./CAzXSrXZ.js";import"./DvDH6DOc.js";import"./BDqtaPAc.js";const T={class:"container mx-auto pb-8"},V={class:"flex flex-wrap"},B={class:"w-full"},M={class:"lg:text-normal space-y-4 font-medium tracking-wide text-white sm:text-base"},C={class:"inline-block w-48"},E={class:"w-48 bg-white px-2 text-center font-extrabold tracking-wide text-black shadow-xl"},P=e("a",{class:"border-b-2 border-red-200",target:"_blank",rel:"noopener noreferrer",href:"https://dagster.io/"},"Dagster",-1),R=e("div",null,[r(" Previously, I worked at "),e("a",{class:"border-b-2 border-red-200",target:"_blank",rel:"noopener noreferrer",href:"https://www.gemini.com/"},"Gemini"),r(" building the future of finance, and before that at Georgetown University's "),e("a",{class:"border-b-2 border-red-200",target:"_blank",rel:"noopener noreferrer",href:"https://mccourt.georgetown.edu/research/the-massive-data-institute/"},"Massive Data Institute"),r(" building data warehousing and processing solutions to help social scientists and researchers more easily leverage large-scale organic data. ")],-1),U=1e3,q=4,F=v({__name:"AboutMe",setup(d){const t=p(0),o=p(!0),s=["Data Engineer","Developer Advocate","Web Developer","Musician","Tinkerer"],a=p(0),n=b(()=>s[a.value]);return x(()=>{D(function(){t.value++,t.value%q===0?o.value=!1:(o.value||(a.value===s.length-1?a.value=0:a.value++),o.value=!0)},U)}),(_,g)=>{const m=w;return c(),l("section",T,[e("div",V,[e("div",B,[e("div",M,[e("div",null,[r(" I am a "),e("span",C,[i(m,{as:"template",appear:"",show:o.value,enter:"transition transform duration-300 ease-out","enter-from":"translate-y-2 opacity-0","enter-to":"translate-x-0 opacity-100",leave:"transition transform duration-300 ease-in","leave-from":"opacity-100","leave-to":"-translate-y-2 opacity-0"},{default:h(()=>[e("div",E,u(n.value),1)]),_:1},8,["show"])]),r(" helping lead the way of modern data orchestration at "),P,r(". ")]),R])])])])}}}),G={class:"bg-gradient-to-b from-background to-transparent"},H={class:"container mx-auto space-y-4"},O={class:"mb-4 grid grid-cols-1 gap-4 md:grid-cols-2"},W={class:"space-y-4 rounded-xl bg-black bg-opacity-70 p-4 text-white drop-shadow-lg hover:ring-1 hover:ring-white"},j={class:""},z={class:"flex-1 text-lg font-bold md:text-xl"},J={key:0,class:"text-sm font-light text-gray-400"},K={class:"line-clamp-3 text-sm"},Q={__name:"BlogPosts",props:{articles:[],show_dates:!1},setup(d){return(t,o)=>{const s=$,a=N;return c(),l("section",G,[e("div",H,[i(s,{to:"/articles",class:"font-mono text-3xl font-semibold text-white underline decoration-orange-500 underline-offset-4"},{default:h(()=>[r(" blog posts ")]),_:1}),e("div",O,[(c(!0),l(y,null,k(d.articles,(n,_)=>(c(),l("div",{key:_},[i(s,{to:n._path,external:""},{default:h(()=>[e("div",W,[e("div",j,[e("div",z,u(n.title),1),d.show_dates?(c(),l("div",J,u(new Date(n.date).toLocaleDateString("en-US",{month:"long",day:"numeric",year:"numeric"})),1)):f("",!0)]),e("div",K,u(n.description),1)])]),_:2},1032,["to"])]))),128))]),e("div",null,[i(a,{to:"/articles"})])])])}}},X={class:"bg-emerald-950 bg-[url('/images/noise.svg')]"},ae={__name:"index",async setup(d){let t,o;const s=([t,o]=I(()=>L().only(["_id","_path","title","description","date","img","author","tags"]).sort({date:-1}).limit(4).find()),t=await t,o(),t);return(a,n)=>{const _=F,g=Q,m=A;return c(),l("div",null,[i(_),e("div",X,[f("",!0),i(g,{articles:S(s),show_dates:!0},null,8,["articles"]),i(m,{limit:6,showImages:"",linkToPlayground:""})])])}}};export{ae as default}; diff --git a/_nuxt/Gu-IR7O7.js b/_nuxt/DQvQFzcx.js similarity index 96% rename from _nuxt/Gu-IR7O7.js rename to _nuxt/DQvQFzcx.js index c2cab780..1940e6ff 100644 --- a/_nuxt/Gu-IR7O7.js +++ b/_nuxt/DQvQFzcx.js @@ -1 +1 @@ -import{_ as c,k as l,c as d,f as o,g as n,b as e,t as f,S as m,o as p,m as u}from"./DXsCzSxj.js";const h={setup(){return{show:l(!1)}}},g={class:"bg-gradeint-to-r flex min-h-screen items-center justify-center from-blue-400 to-indigo-500"},y={class:"flex w-96 items-center space-x-4 rounded-2xl bg-white p-4 shadow-xl"},_=e("h1",{class:"font-medium text-gray-900"},"Floofy McFloof",-1),x=e("p",{class:"mt-0.5 text-gray-500"}," Hey! I'm McFloof and I have been a very good boi this year. ",-1),v={class:"absolute inset-x-0 top-0 my-4 flex w-full items-center justify-center"};function w(r,a,b,t,k,H){const s=u,i=m;return p(),d("div",g,[o(i,{as:"template",show:t.show,enter:"transition transform duration-300 ease-out","enter-from":"translate-x-4 opacity-0","enter-to":"translate-x-0 opacity-100",leave:"transition transform duration-300 ease-in","leave-from":"opacity-100","leave-to":"opacity-0"},{default:n(()=>[e("div",y,[o(s,{as:"img",enter:"transition transform duration-300 ease-out","enter-from":"rotate-90 scale-50 opacity-0","enter-to":"rotate-0 scale-100 opacity-100",leave:"transition transform duration-300 ease-in","leave-from":"opacity-100","leave-to":"opacity-0",class:"h-16 w-16 rounded-full ring ring-indigo-500 ring-opacity-50 ring-offset-2",src:"/images/placeholder.png"}),o(s,{enter:"transition transform duration-300 ease-out","enter-from":"translate-x-12 opacity-0","enter-to":"translate-x-0 opacity-100",leave:"transition transform duration-300 ease-in","leave-from":"opacity-100","leave-to":"opacity-0"},{default:n(()=>[_,x]),_:1})])]),_:1},8,["show"]),e("div",v,[e("button",{class:"rounded-lg bg-blue-200 px-4 py-1.5 text-sm font-medium text-indigo-900 hover:bg-blue-100 focus:outline-none focus:ring-2 focus:ring-indigo-600",onClick:a[0]||(a[0]=S=>t.show=!t.show)},f(t.show?"Hide":"Show")+" profile ",1)])])}const C=c(h,[["render",w]]);export{C as default}; +import{_ as c,k as l,c as d,f as o,g as n,b as e,t as f,S as m,o as p,m as u}from"./gOhWOHN0.js";const h={setup(){return{show:l(!1)}}},g={class:"bg-gradeint-to-r flex min-h-screen items-center justify-center from-blue-400 to-indigo-500"},y={class:"flex w-96 items-center space-x-4 rounded-2xl bg-white p-4 shadow-xl"},_=e("h1",{class:"font-medium text-gray-900"},"Floofy McFloof",-1),x=e("p",{class:"mt-0.5 text-gray-500"}," Hey! I'm McFloof and I have been a very good boi this year. ",-1),v={class:"absolute inset-x-0 top-0 my-4 flex w-full items-center justify-center"};function w(r,a,b,t,k,H){const s=u,i=m;return p(),d("div",g,[o(i,{as:"template",show:t.show,enter:"transition transform duration-300 ease-out","enter-from":"translate-x-4 opacity-0","enter-to":"translate-x-0 opacity-100",leave:"transition transform duration-300 ease-in","leave-from":"opacity-100","leave-to":"opacity-0"},{default:n(()=>[e("div",y,[o(s,{as:"img",enter:"transition transform duration-300 ease-out","enter-from":"rotate-90 scale-50 opacity-0","enter-to":"rotate-0 scale-100 opacity-100",leave:"transition transform duration-300 ease-in","leave-from":"opacity-100","leave-to":"opacity-0",class:"h-16 w-16 rounded-full ring ring-indigo-500 ring-opacity-50 ring-offset-2",src:"/images/placeholder.png"}),o(s,{enter:"transition transform duration-300 ease-out","enter-from":"translate-x-12 opacity-0","enter-to":"translate-x-0 opacity-100",leave:"transition transform duration-300 ease-in","leave-from":"opacity-100","leave-to":"opacity-0"},{default:n(()=>[_,x]),_:1})])]),_:1},8,["show"]),e("div",v,[e("button",{class:"rounded-lg bg-blue-200 px-4 py-1.5 text-sm font-medium text-indigo-900 hover:bg-blue-100 focus:outline-none focus:ring-2 focus:ring-indigo-600",onClick:a[0]||(a[0]=S=>t.show=!t.show)},f(t.show?"Hide":"Show")+" profile ",1)])])}const C=c(h,[["render",w]]);export{C as default}; diff --git a/_nuxt/D5qHgTT0.js b/_nuxt/DUcsjegF.js similarity index 97% rename from _nuxt/D5qHgTT0.js rename to _nuxt/DUcsjegF.js index 55c1ea50..d18770bc 100644 --- a/_nuxt/D5qHgTT0.js +++ b/_nuxt/DUcsjegF.js @@ -1 +1 @@ -import{_ as d,c as h,o as c,j as l}from"./DXsCzSxj.js";const a=["#FFBA08","#FAA307","#F48C06","#E85D04","#DC2F02","#D00000","#9D0208","#6A040F","#370617","#03071E"];class o{constructor(){this.parent=void 0,this.children=[],this.orientation="h",this.x=0,this.y=0,this.w=500,this.h=500}add(i){i.parent=this,this.children.push(i),this.children.forEach((n,r)=>{if(this.orientation==="h"){const e=this.w/this.children.length,t=this.x+e*r;n.x=t,n.y=this.y,n.w=e,n.h=this.h}else if(this.orientation==="v"){const e=this.h/this.children.length,t=this.y+e*r;n.x=this.x,n.y=t,n.w=this.w,n.h=e}})}render(i){i.rect(this.x,this.y,this.w,this.h),this.children.forEach((n,r)=>{i.fill(a[r%9]),n.render(i)})}traverseForPoint(i,n){if(this.children.length===0)return this;for(let r=0;r=e.x&&i<=e.x+e.w&&n>=e.y&&n<=e.y+e.h)return e.children.length===0?e:e.traverseForPoint(i,n)}}}const f={data(){return{}},mounted(){const s=i=>{const e=new o;for(let t=0;t<5;t++)e.add(new o);e.children[0].orientation="v";for(let t=0;t<3;t++)e.children[0].add(new o);e.children[0].children[2].orientation="v";for(let t=0;t<4;t++)e.children[0].children[2].add(new o);e.children[1].orientation="v";for(let t=0;t<3;t++)e.children[1].add(new o);for(let t=0;t<9;t++)e.children[1].children[0].add(new o);e.children[3].orientation="v";for(let t=0;t<3;t++)e.children[3].add(new o);e.children[3].children[2].orientation="v";for(let t=0;t<9;t++)e.children[3].children[2].add(new o);i.setup=()=>{i.createCanvas(500,500),i.noLoop(),i.stroke(255),i.strokeWeight(2),e.render(i)},i.mouseClicked=()=>{const t=e.traverseForPoint(i.mouseX,i.mouseY);t&&(t.add(new o),t.add(new o),t.render(i))}};new this.$p5(s,"canvas")}},v={class:"select-none bg-gradient-to-b from-green-800 to-gray-800"},w=l('
m-ary tree based tiling
',1),u=[w];function m(s,i,n,r,e,t){return c(),h("div",v,u)}const _=d(f,[["render",m]]);export{_ as default}; +import{_ as d,c as h,o as c,j as l}from"./gOhWOHN0.js";const a=["#FFBA08","#FAA307","#F48C06","#E85D04","#DC2F02","#D00000","#9D0208","#6A040F","#370617","#03071E"];class o{constructor(){this.parent=void 0,this.children=[],this.orientation="h",this.x=0,this.y=0,this.w=500,this.h=500}add(i){i.parent=this,this.children.push(i),this.children.forEach((n,r)=>{if(this.orientation==="h"){const e=this.w/this.children.length,t=this.x+e*r;n.x=t,n.y=this.y,n.w=e,n.h=this.h}else if(this.orientation==="v"){const e=this.h/this.children.length,t=this.y+e*r;n.x=this.x,n.y=t,n.w=this.w,n.h=e}})}render(i){i.rect(this.x,this.y,this.w,this.h),this.children.forEach((n,r)=>{i.fill(a[r%9]),n.render(i)})}traverseForPoint(i,n){if(this.children.length===0)return this;for(let r=0;r=e.x&&i<=e.x+e.w&&n>=e.y&&n<=e.y+e.h)return e.children.length===0?e:e.traverseForPoint(i,n)}}}const f={data(){return{}},mounted(){const s=i=>{const e=new o;for(let t=0;t<5;t++)e.add(new o);e.children[0].orientation="v";for(let t=0;t<3;t++)e.children[0].add(new o);e.children[0].children[2].orientation="v";for(let t=0;t<4;t++)e.children[0].children[2].add(new o);e.children[1].orientation="v";for(let t=0;t<3;t++)e.children[1].add(new o);for(let t=0;t<9;t++)e.children[1].children[0].add(new o);e.children[3].orientation="v";for(let t=0;t<3;t++)e.children[3].add(new o);e.children[3].children[2].orientation="v";for(let t=0;t<9;t++)e.children[3].children[2].add(new o);i.setup=()=>{i.createCanvas(500,500),i.noLoop(),i.stroke(255),i.strokeWeight(2),e.render(i)},i.mouseClicked=()=>{const t=e.traverseForPoint(i.mouseX,i.mouseY);t&&(t.add(new o),t.add(new o),t.render(i))}};new this.$p5(s,"canvas")}},v={class:"select-none bg-gradient-to-b from-green-800 to-gray-800"},w=l('
m-ary tree based tiling
',1),u=[w];function m(s,i,n,r,e,t){return c(),h("div",v,u)}const _=d(f,[["render",m]]);export{_ as default}; diff --git a/_nuxt/DYvJhXU5.js b/_nuxt/DYvJhXU5.js deleted file mode 100644 index d26a8c27..00000000 --- a/_nuxt/DYvJhXU5.js +++ /dev/null @@ -1 +0,0 @@ -import{d as i,H as c,p,o as s,c as n,a as u,a7 as t}from"./DXsCzSxj.js";const f=["id"],l=["href"],k=i({__name:"ProseH2",props:{id:{}},setup(a){const r=a,{headings:o}=c().public.mdc,d=p(()=>{var e;return r.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h2)});return(e,m)=>(s(),n("h2",{id:e.id},[e.id&&u(d)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,l)):t(e.$slots,"default",{key:1})],8,f))}});export{k as default}; diff --git a/_nuxt/YbSleFl9.js b/_nuxt/DaxLFRA2.js similarity index 93% rename from _nuxt/YbSleFl9.js rename to _nuxt/DaxLFRA2.js index 32b16bb8..d57a7e19 100644 --- a/_nuxt/YbSleFl9.js +++ b/_nuxt/DaxLFRA2.js @@ -1 +1 @@ -import{_ as u,c as _,o as m,b as c}from"./DXsCzSxj.js";const p={data(){return{}},mounted(){const s=["#FFBA08","#FAA307","#F48C06","#E85D04","#DC2F02","#D00000","#9D0208","#6A040F","#370617","#03071E"],a=e=>{const i=t=>e.unhex([t.slice(1,3),t.slice(3,5),t.slice(5,7)]),d=(t,r)=>t.map(n=>{const o=e.floor(n+e.random(-r,r));return o<0?0:o>255?255:o});e.setup=()=>{e.createCanvas(400,400),e.frameRate(5)},e.draw=()=>{e.background(0,0,0),e.noStroke(),e.noFill();const t=9,r=400/t;for(let n=0;n<=t;n++)for(let o=0;o<=t;o++){const f=s[o%9];e.fill(d(i(f),15)),e.square(n*r,o*r,r)}}};new this.$p5(a,"canvas")}},h={class:"bg-gradient-to-b from-green-800 to-gray-800"},v=c("div",{class:"grid h-screen place-items-center"},[c("div",{class:"font-mono text-white"},[c("div",{class:"mb-2 border-2 border-white"},[c("div",{id:"canvas"})])])],-1),I=[v];function b(s,a,e,i,d,l){return m(),_("div",h,I)}const g=u(p,[["render",b]]);export{g as default}; +import{_ as u,c as _,o as m,b as c}from"./gOhWOHN0.js";const p={data(){return{}},mounted(){const s=["#FFBA08","#FAA307","#F48C06","#E85D04","#DC2F02","#D00000","#9D0208","#6A040F","#370617","#03071E"],a=e=>{const i=t=>e.unhex([t.slice(1,3),t.slice(3,5),t.slice(5,7)]),d=(t,r)=>t.map(n=>{const o=e.floor(n+e.random(-r,r));return o<0?0:o>255?255:o});e.setup=()=>{e.createCanvas(400,400),e.frameRate(5)},e.draw=()=>{e.background(0,0,0),e.noStroke(),e.noFill();const t=9,r=400/t;for(let n=0;n<=t;n++)for(let o=0;o<=t;o++){const f=s[o%9];e.fill(d(i(f),15)),e.square(n*r,o*r,r)}}};new this.$p5(a,"canvas")}},h={class:"bg-gradient-to-b from-green-800 to-gray-800"},v=c("div",{class:"grid h-screen place-items-center"},[c("div",{class:"font-mono text-white"},[c("div",{class:"mb-2 border-2 border-white"},[c("div",{id:"canvas"})])])],-1),I=[v];function b(s,a,e,i,d,l){return m(),_("div",h,I)}const g=u(p,[["render",b]]);export{g as default}; diff --git a/_nuxt/DKX5xB3o.js b/_nuxt/DcKYe_Up.js similarity index 64% rename from _nuxt/DKX5xB3o.js rename to _nuxt/DcKYe_Up.js index b0c6275e..6813a33d 100644 --- a/_nuxt/DKX5xB3o.js +++ b/_nuxt/DcKYe_Up.js @@ -1 +1 @@ -import{_ as o,o as r,c as s,a7 as t}from"./DXsCzSxj.js";const c={};function n(e,a){return r(),s("li",null,[t(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; +import{_ as o,o as r,c as s,a7 as t}from"./gOhWOHN0.js";const c={};function n(e,a){return r(),s("li",null,[t(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/DdxBPLFy.js b/_nuxt/DdxBPLFy.js deleted file mode 100644 index 844c31c6..00000000 --- a/_nuxt/DdxBPLFy.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as w,o as c,c as h,j as y,k as n,l as _,a as s,n as p,f as u,e as v,b as t,t as i,F as x}from"./DXsCzSxj.js";import{s as V}from"./Ch5M0tju.js";const k={},H={version:"1.1",id:"Layer_1",xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",x:"0px",y:"0px",viewBox:"0 0 1160 1160","enable-background":"new 0 0 1160 1160","xml:space":"preserve"},M=y('',2),S=[M];function C(o,r){return c(),h("svg",H,S)}const P=w(k,[["render",C]]),z={class:"bg-slate-800"},B={class:"flex h-screen items-center justify-center"},j={class:"mb-4 space-y-2 text-sm"},F=t("div",{class:"flex items-center"},[t("div",{class:"flex-none pr-2"},"Name"),t("div",{class:"flex-grow border-b border-dotted"}),t("div",{class:"flex-none pl-2"},"Colton")],-1),N={class:"flex items-center"},W=t("div",{class:"flex-none pr-2"},"Profession",-1),$=t("div",{class:"flex-grow border-b border-dotted"},null,-1),A={class:"flex-none pl-2"},I={class:"flex items-center"},D=t("div",{class:"flex-none pr-2"},"Hobby",-1),E=t("div",{class:"flex-grow border-b border-dotted"},null,-1),L={class:"flex-none pl-2"},R="TL;DR",q={__name:"card",setup(o){const r=n(!1),a=n(0),l=n(0),f=(e,g)=>e[g%e.length];_(()=>{V(function(){a.value>l.value?l.value+=1:a.value+=1},1500)});const m=["Skydiving","Bungee jumping","Rock climbing","White water rafting","Paragliding","Scuba diving","Base jumping","Mountain biking","Surfing","Snowboarding","Wakeboarding","Motorsports","Parkour","Zip-lining","Off-roading","Cave diving","Kiteboarding","Hang gliding","Free solo climbing","Bull riding","Ice climbing","Wing suit flying","Extreme skiing","Cliff jumping","Cave exploring"],d=["Astronaut","Archaeologist","Professional athlete","Chef","Fashion designer","Film director","Investigative journalist","Marine biologist","Musician","Photographer","Pilot","Professional gamer","Professor","Sculptor","Spy","Stand-up comedian","Surfing instructor","Travel writer","Wildlife photographer","Wine connoisseur","Yacht captain","Yoga instructor","Zookeeper","Adventure tour guide","Art curator"];return(e,g)=>{const b=P;return c(),h(x,null,[s(r)?(c(),h("div",{key:0,class:p(["absolute bottom-2 right-2 h-24 w-24",e.dynamic_bg])},[u(b)],2)):v("",!0),t("main",z,[t("div",B,[t("div",{id:"_card",onClick:g[0]||(g[0]=T=>r.value=!s(r)),class:"md:w-512px w-[350px] border border-white bg-black p-4 font-mono uppercase text-white shadow-xl shadow-yellow-950 transition-all hover:scale-102 hover:cursor-pointer"},[t("div",{class:"mb-2 font-extrabold tracking-wide"},i(R)),t("div",j,[F,t("div",N,[W,$,t("div",A,i(f(d,s(a))),1)]),t("div",I,[D,E,t("div",L,i(f(m,s(l))),1)])])])])])],64)}}};export{q as default}; diff --git a/_nuxt/DlZNh5M8.js b/_nuxt/DlZNh5M8.js new file mode 100644 index 00000000..f0e35c87 --- /dev/null +++ b/_nuxt/DlZNh5M8.js @@ -0,0 +1 @@ +import{v as C,x as O,y as R,z as _,d as U,k as N,w as V,p as E,o as r,c as n,b as o,a,F as y,A as q,B as I,C as K,r as k,h as B,t as x,e as S}from"./gOhWOHN0.js";import{h as W}from"./DvDH6DOc.js";import{u as M}from"./BYBkJnue.js";function G(h,l,v){const[e={},c]=typeof l=="string"?[{},l]:[l,v],s=C(()=>_(h)),t=e.key||W([c,typeof s.value=="string"?s.value:"",...H(e)]);if(!t||typeof t!="string")throw new TypeError("[nuxt] [useFetch] key must be a string: "+t);const d=t===c?"$f"+t:t;if(!e.baseURL&&typeof s.value=="string"&&s.value[0]==="/"&&s.value[1]==="/")throw new Error('[nuxt] [useFetch] the request URL must not start with "//".');const{server:m,lazy:w,default:j,transform:D,pick:F,watch:u,immediate:p,getCachedData:i,deep:g,dedupe:L,...$}=e,b=O({...R,...$,cache:typeof e.cache=="boolean"?void 0:e.cache}),A={server:m,lazy:w,default:j,transform:D,pick:F,immediate:p,getCachedData:i,deep:g,dedupe:L,watch:u===!1?[]:[b,s,...u||[]]};let f;return M(d,()=>{var z;(z=f==null?void 0:f.abort)==null||z.call(f),f=typeof AbortController<"u"?new AbortController:{};const T=_(e.timeout);return T&&setTimeout(()=>f.abort(),T),(e.$fetch||globalThis.$fetch)(s.value,{signal:f.signal,...b})},A)}function H(h){var v;const l=[((v=_(h.method))==null?void 0:v.toUpperCase())||"GET",_(h.baseURL)];for(const e of[h.params||h.query]){const c=_(e);if(!c)continue;const s={};for(const[t,d]of Object.entries(c))s[_(t)]=_(d);l.push(s)}return l}const P={class:"flex h-screen flex-col font-mono"},Q={class:"flex flex-1 overflow-hidden"},J=o("div",{class:"flex w-20 bg-amber-500"},[o("div",{class:"absolute bottom-10 w-20 -rotate-90 transform whitespace-nowrap"},[o("div",{class:"text-4xl font-bold text-white"}," 1000 French Conjugations ")])],-1),X={class:"flex flex-1 flex-col overflow-y-auto bg-amber-100 p-8"},Y=o("div",{class:"flex rounded-xl bg-amber-500 p-4"},[o("div",{class:"text-center text-xl italic text-white"}," Click a word to the left or right to cycle through the 1000 most popular French verb conjugations! ")],-1),Z={class:"inline-flex flex-col justify-center py-4 text-gray-600"},ee={key:0,class:"mt-2 w-full border border-gray-100 bg-white"},te=["onClick"],oe=o("svg",{class:"absolute left-2 top-2 h-4 w-4",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor"},[o("path",{d:"M12.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-2.293-2.293a1 1 0 010-1.414z"})],-1),se={class:"flex p-4"},ae={class:"text-cyan-600 flex-1 text-center text-3xl font-bold"},re={class:"text-amber-500"},ne={class:"grid grid-cols-1 gap-8 md:grid-cols-3 xl:grid-cols-4 xl:gap-12"},le={class:"border-cyan-600 h-full space-y-3 rounded-md border-2 bg-white p-4 shadow shadow-amber-500"},ce={class:"text-2xl font-semibold capitalize text-gray-700"},ie={class:"text-gray-500"},ue={key:1,class:"italic"},xe=U({__name:"index",async setup(h){let l,v;const e=N(0),c=N(""),s=N([]),{data:t}=([l,v]=V(()=>G("/1000_french_conjugations.json",{transform:u=>u},"$lRKQKt9Al2")),l=await l,v(),l),d=C(()=>{if(t.value)return t.value[e.value]}),m=C(()=>{if(t.value!==null)return e.value===0?void 0:t.value[e.value-1]}),w=C(()=>{if(t.value!==null)return e.value+1===t.value.length?void 0:t.value[e.value+1]});E(c,u=>{if(s.value=[],!u)return;let p=0;s.value=t.value.filter(i=>i.word.normalize("NFD").replace(new RegExp("\\p{Diacritic}","gu"),"").includes(u)&&p<=5?(p++,!0):!1)});const j=()=>{t.value&&e.value{e.value>0&&(e.value-=1)},F=u=>{c.value="",s.value=[],e.value=u.word_popularity-1};return(u,p)=>(r(),n("div",P,[o("div",Q,[J,o("div",X,[a(t)&&a(t).length>0&&a(d)?(r(),n(y,{key:0},[Y,o("div",Z,[q(o("input",{"onUpdate:modelValue":p[0]||(p[0]=i=>K(c)?c.value=i:null),class:"rounded-xl border border-2 border-gray-400 p-2 pl-8 focus:border-amber-500 focus:outline-none",type:"search",autocomplete:"off",placeholder:"Search Words"},null,512),[[I,a(c)]]),a(s).length>0?(r(),n("ul",ee,[(r(!0),n(y,null,k(a(s),i=>(r(),n("li",{key:i.word,class:"relative cursor-pointer py-1 pl-8 pr-2 hover:bg-yellow-50 hover:text-gray-900",onClick:g=>F(i)},[oe,B(" "+x(i.word),1)],8,te))),128))])):S("",!0)]),o("div",se,[o("div",{class:"flex-1 cursor-pointer select-none text-center text-2xl text-gray-400",onClick:D},x(a(m)?a(m).word:"-"),1),o("div",ae,[o("span",re," #"+x(a(d).word_popularity),1),B(" "+x(a(d).word),1)]),o("div",{class:"flex-1 cursor-pointer select-none text-center text-2xl text-gray-400",onClick:j},x(a(w)?a(w).word:"-"),1)]),o("div",ne,[(r(!0),n(y,null,k(a(d).conjugations,(i,g)=>(r(),n("div",{key:g},[o("div",le,[o("h1",ce,x(g),1),o("div",ie,[(r(!0),n(y,null,k(i,(L,$)=>(r(),n("p",{key:$},[(r(!0),n(y,null,k(L,(b,A)=>(r(),n("i",{key:A},x(b.text),1))),128))]))),128))])])]))),128))])],64)):(r(),n("div",ue,"Loading..."))])])]))}});export{xe as default}; diff --git a/_nuxt/DO2yUAnP.js b/_nuxt/DsNrITmQ.js similarity index 79% rename from _nuxt/DO2yUAnP.js rename to _nuxt/DsNrITmQ.js index f6beb35c..9042f396 100644 --- a/_nuxt/DO2yUAnP.js +++ b/_nuxt/DsNrITmQ.js @@ -1 +1 @@ -import{d as r,p as n,Q as c,J as h,H as o,R as d,o as l,c as u,a as f}from"./DXsCzSxj.js";const g=["src","alt","width","height"],p=r({__name:"ProseImg",props:{src:{type:String,default:""},alt:{type:String,default:""},width:{type:[String,Number],default:void 0},height:{type:[String,Number],default:void 0}},setup(e){const t=e,i=n(()=>{var a;if((a=t.src)!=null&&a.startsWith("/")&&!t.src.startsWith("//")){const s=c(h(o().app.baseURL));if(s!=="/"&&!t.src.startsWith(s))return d(s,t.src)}return t.src});return(a,s)=>(l(),u("img",{src:f(i),alt:e.alt,width:e.width,height:e.height},null,8,g))}});export{p as default}; +import{d as r,v as n,Q as c,J as h,H as o,R as d,o as l,c as u,a as f}from"./gOhWOHN0.js";const g=["src","alt","width","height"],p=r({__name:"ProseImg",props:{src:{type:String,default:""},alt:{type:String,default:""},width:{type:[String,Number],default:void 0},height:{type:[String,Number],default:void 0}},setup(e){const t=e,i=n(()=>{var a;if((a=t.src)!=null&&a.startsWith("/")&&!t.src.startsWith("//")){const s=c(h(o().app.baseURL));if(s!=="/"&&!t.src.startsWith(s))return d(s,t.src)}return t.src});return(a,s)=>(l(),u("img",{src:f(i),alt:e.alt,width:e.width,height:e.height},null,8,g))}});export{p as default}; diff --git a/_nuxt/Dtbyl6G-.js b/_nuxt/Dtbyl6G-.js new file mode 100644 index 00000000..3a00630f --- /dev/null +++ b/_nuxt/Dtbyl6G-.js @@ -0,0 +1 @@ +import{_ as w,o as c,c as h,j as y,k as n,l as _,a as s,n as v,f as u,e as p,b as t,t as i,F as x}from"./gOhWOHN0.js";const V={},k={version:"1.1",id:"Layer_1",xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",x:"0px",y:"0px",viewBox:"0 0 1160 1160","enable-background":"new 0 0 1160 1160","xml:space":"preserve"},H=y('',2),M=[H];function S(o,r){return c(),h("svg",k,M)}const C=w(V,[["render",S]]),P=window.setInterval,z={class:"bg-slate-800"},B={class:"flex h-screen items-center justify-center"},j={class:"mb-4 space-y-2 text-sm"},F=t("div",{class:"flex items-center"},[t("div",{class:"flex-none pr-2"},"Name"),t("div",{class:"flex-grow border-b border-dotted"}),t("div",{class:"flex-none pl-2"},"Colton")],-1),N={class:"flex items-center"},W=t("div",{class:"flex-none pr-2"},"Profession",-1),$=t("div",{class:"flex-grow border-b border-dotted"},null,-1),A={class:"flex-none pl-2"},I={class:"flex items-center"},D=t("div",{class:"flex-none pr-2"},"Hobby",-1),E=t("div",{class:"flex-grow border-b border-dotted"},null,-1),L={class:"flex-none pl-2"},R="TL;DR",Z={__name:"card",setup(o){const r=n(!1),a=n(0),l=n(0),f=(e,g)=>e[g%e.length];_(()=>{P(function(){a.value>l.value?l.value+=1:a.value+=1},1500)});const m=["Skydiving","Bungee jumping","Rock climbing","White water rafting","Paragliding","Scuba diving","Base jumping","Mountain biking","Surfing","Snowboarding","Wakeboarding","Motorsports","Parkour","Zip-lining","Off-roading","Cave diving","Kiteboarding","Hang gliding","Free solo climbing","Bull riding","Ice climbing","Wing suit flying","Extreme skiing","Cliff jumping","Cave exploring"],d=["Astronaut","Archaeologist","Professional athlete","Chef","Fashion designer","Film director","Investigative journalist","Marine biologist","Musician","Photographer","Pilot","Professional gamer","Professor","Sculptor","Spy","Stand-up comedian","Surfing instructor","Travel writer","Wildlife photographer","Wine connoisseur","Yacht captain","Yoga instructor","Zookeeper","Adventure tour guide","Art curator"];return(e,g)=>{const b=C;return c(),h(x,null,[s(r)?(c(),h("div",{key:0,class:v(["absolute bottom-2 right-2 h-24 w-24",e.dynamic_bg])},[u(b)],2)):p("",!0),t("main",z,[t("div",B,[t("div",{id:"_card",onClick:g[0]||(g[0]=T=>r.value=!s(r)),class:"md:w-512px w-[350px] border border-white bg-black p-4 font-mono uppercase text-white shadow-xl shadow-yellow-950 transition-all hover:scale-102 hover:cursor-pointer"},[t("div",{class:"mb-2 font-extrabold tracking-wide"},i(R)),t("div",j,[F,t("div",N,[W,$,t("div",A,i(f(d,s(a))),1)]),t("div",I,[D,E,t("div",L,i(f(m,s(l))),1)])])])])])],64)}}};export{Z as default}; diff --git a/_nuxt/PQfcYOpS.js b/_nuxt/DuiePBtr.js similarity index 64% rename from _nuxt/PQfcYOpS.js rename to _nuxt/DuiePBtr.js index 0b537db6..8c0a0d5e 100644 --- a/_nuxt/PQfcYOpS.js +++ b/_nuxt/DuiePBtr.js @@ -1 +1 @@ -import{_ as o,o as r,c as s,a7 as t}from"./DXsCzSxj.js";const c={};function n(e,a){return r(),s("p",null,[t(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; +import{_ as o,o as r,c as s,a7 as t}from"./gOhWOHN0.js";const c={};function n(e,a){return r(),s("p",null,[t(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/DvLvbVZ0.js b/_nuxt/DvLvbVZ0.js new file mode 100644 index 00000000..e8f4301a --- /dev/null +++ b/_nuxt/DvLvbVZ0.js @@ -0,0 +1 @@ +import{_ as m}from"./Baum9BnE.js";import"./gOhWOHN0.js";export{m as default}; diff --git a/_nuxt/DwbcVy96.js b/_nuxt/DwbcVy96.js deleted file mode 100644 index 9cb3fa89..00000000 --- a/_nuxt/DwbcVy96.js +++ /dev/null @@ -1 +0,0 @@ -import{d as i,H as c,p,o as s,c as n,a as u,a7 as t}from"./DXsCzSxj.js";const f=["id"],l=["href"],k=i({__name:"ProseH5",props:{id:{}},setup(a){const r=a,{headings:o}=c().public.mdc,d=p(()=>{var e;return r.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h5)});return(e,m)=>(s(),n("h5",{id:e.id},[e.id&&u(d)?(s(),n("a",{key:0,href:`#${e.id}`},[t(e.$slots,"default")],8,l)):t(e.$slots,"default",{key:1})],8,f))}});export{k as default}; diff --git a/_nuxt/DxveBo0P.js b/_nuxt/DxveBo0P.js new file mode 100644 index 00000000..6443e7ec --- /dev/null +++ b/_nuxt/DxveBo0P.js @@ -0,0 +1 @@ +import r from"./BYuD9A8v.js";import{d as o,I as u,v as f,$ as c}from"./gOhWOHN0.js";const i=o({name:"Markdown",extends:r,setup(t){const{parent:e}=c(),{between:n,default:a}=u(),s=f(()=>typeof t.unwrap=="string"?t.unwrap.split(" "):["*"]);return{fallbackSlot:a,tags:s,between:n,parent:e}}});export{i as default}; diff --git a/_nuxt/DzLfPs8s.js b/_nuxt/DzLfPs8s.js deleted file mode 100644 index e523c0a5..00000000 --- a/_nuxt/DzLfPs8s.js +++ /dev/null @@ -1 +0,0 @@ -import{d as c,H as i,p,o as s,c as t,a as u,a7 as n}from"./DXsCzSxj.js";const f=["id"],l=["href"],_=c({__name:"ProseH1",props:{id:{}},setup(a){const r=a,{headings:o}=i().public.mdc,d=p(()=>{var e;return r.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h1)});return(e,m)=>(s(),t("h1",{id:e.id},[u(d)?(s(),t("a",{key:0,href:`#${e.id}`},[n(e.$slots,"default")],8,l)):n(e.$slots,"default",{key:1})],8,f))}});export{_ as default}; diff --git a/_nuxt/7iwyPdUt.js b/_nuxt/JctMNniL.js similarity index 74% rename from _nuxt/7iwyPdUt.js rename to _nuxt/JctMNniL.js index 60204020..deb491b1 100644 --- a/_nuxt/7iwyPdUt.js +++ b/_nuxt/JctMNniL.js @@ -1,2 +1,2 @@ -const __vite__fileDeps=["./CHAMBAea.js","./DXsCzSxj.js","./CAzXSrXZ.js","./DvDH6DOc.js","./BDqtaPAc.js","./C-v3KzvZ.js"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]); -import{u as m}from"./W6vbqLg7.js";import{H as v,L as l,M as d,C as g,N as y,d as h,O as _,p as w,I as C,K as p,i as N}from"./DXsCzSxj.js";import{h as f}from"./DvDH6DOc.js";import{q as P,w as c,e as $,s as x,j as E,u as T}from"./CAzXSrXZ.js";import{u as j}from"./BDqtaPAc.js";const S=async t=>{const{content:e}=v().public;typeof(t==null?void 0:t.params)!="function"&&(t=P(t));const n=t.params(),o=e.experimental.stripQueryParameters?c(`/navigation/${`${f(n)}.${e.integrity}`}/${$(n)}.json`):c(`/navigation/${f(n)}.${e.integrity}.json`);if(x())return(await l(()=>import("./CHAMBAea.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url).then(i=>i.generateNavigation))(n);const a=await $fetch(o,{method:"GET",responseType:"json",params:e.experimental.stripQueryParameters?void 0:{_params:E(n),previewToken:j().getPreviewToken()}});if(typeof a=="string"&&a.startsWith(""))throw new Error("Not found");return a},b="$s";function D(...t){const e=typeof t[t.length-1]=="string"?t.pop():void 0;typeof t[0]!="string"&&t.unshift(e);const[n,o]=t;if(!n||typeof n!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+n);if(o!==void 0&&typeof o!="function")throw new Error("[nuxt] [useState] init must be a function: "+o);const a=b+n,r=y(),i=d(r.payload.state,a);if(i.value===void 0&&o){const s=o();if(g(s))return r.payload.state[a]=s,s;i.value=s}return i}const R=h({name:"ContentNavigation",props:{query:{type:Object,required:!1,default:void 0}},async setup(t){const{query:e}=_(t),n=w(()=>{var a;return typeof((a=e.value)==null?void 0:a.params)=="function"?e.value.params():e.value});if(!n.value&&D("dd-navigation").value){const{navigation:a}=T();return{navigation:a}}const{data:o}=await m(`content-navigation-${f(n.value)}`,()=>S(n.value));return{navigation:o}},render(t){const e=C(),{navigation:n}=t,o=i=>p(N,{to:i._path},()=>i.title),a=(i,s)=>p("ul",s?{"data-level":s}:null,i.map(u=>u.children?p("li",null,[o(u),a(u.children,s+1)]):p("li",null,o(u)))),r=i=>a(i,0);return e!=null&&e.default?e.default({navigation:n,...this.$attrs}):r(n)}}),Q=R;export{Q as default}; +const __vite__fileDeps=["./DCWpba_A.js","./gOhWOHN0.js","./Bs6eKMw6.js","./DvDH6DOc.js","./CRsxnQ9b.js","./C-v3KzvZ.js"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]); +import{u as m}from"./BYBkJnue.js";import{H as v,L as l,M as d,C as g,N as y,d as h,O as _,v as w,I as C,K as p,i as N}from"./gOhWOHN0.js";import{h as f}from"./DvDH6DOc.js";import{q as P,w as c,e as $,s as x,j as E,u as T}from"./Bs6eKMw6.js";import{u as j}from"./CRsxnQ9b.js";const S=async t=>{const{content:e}=v().public;typeof(t==null?void 0:t.params)!="function"&&(t=P(t));const n=t.params(),o=e.experimental.stripQueryParameters?c(`/navigation/${`${f(n)}.${e.integrity}`}/${$(n)}.json`):c(`/navigation/${f(n)}.${e.integrity}.json`);if(x())return(await l(()=>import("./DCWpba_A.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url).then(i=>i.generateNavigation))(n);const a=await $fetch(o,{method:"GET",responseType:"json",params:e.experimental.stripQueryParameters?void 0:{_params:E(n),previewToken:j().getPreviewToken()}});if(typeof a=="string"&&a.startsWith(""))throw new Error("Not found");return a},b="$s";function D(...t){const e=typeof t[t.length-1]=="string"?t.pop():void 0;typeof t[0]!="string"&&t.unshift(e);const[n,o]=t;if(!n||typeof n!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+n);if(o!==void 0&&typeof o!="function")throw new Error("[nuxt] [useState] init must be a function: "+o);const a=b+n,r=y(),i=d(r.payload.state,a);if(i.value===void 0&&o){const s=o();if(g(s))return r.payload.state[a]=s,s;i.value=s}return i}const R=h({name:"ContentNavigation",props:{query:{type:Object,required:!1,default:void 0}},async setup(t){const{query:e}=_(t),n=w(()=>{var a;return typeof((a=e.value)==null?void 0:a.params)=="function"?e.value.params():e.value});if(!n.value&&D("dd-navigation").value){const{navigation:a}=T();return{navigation:a}}const{data:o}=await m(`content-navigation-${f(n.value)}`,()=>S(n.value));return{navigation:o}},render(t){const e=C(),{navigation:n}=t,o=i=>p(N,{to:i._path},()=>i.title),a=(i,s)=>p("ul",s?{"data-level":s}:null,i.map(u=>u.children?p("li",null,[o(u),a(u.children,s+1)]):p("li",null,o(u)))),r=i=>a(i,0);return e!=null&&e.default?e.default({navigation:n,...this.$attrs}):r(n)}}),Q=R;export{Q as default}; diff --git a/_nuxt/builds/latest.json b/_nuxt/builds/latest.json index 549259bc..5867dc95 100644 --- a/_nuxt/builds/latest.json +++ b/_nuxt/builds/latest.json @@ -1 +1 @@ -{"id":"640f2415-89a1-4503-8629-242d808edc3c","timestamp":1718428834916} \ No newline at end of file +{"id":"d8634a4e-ab1a-4045-9220-3f7d159ce250","timestamp":1718681811067} \ No newline at end of file diff --git a/_nuxt/builds/meta/640f2415-89a1-4503-8629-242d808edc3c.json b/_nuxt/builds/meta/640f2415-89a1-4503-8629-242d808edc3c.json deleted file mode 100644 index 3df02a72..00000000 --- a/_nuxt/builds/meta/640f2415-89a1-4503-8629-242d808edc3c.json +++ /dev/null @@ -1 +0,0 @@ -{"id":"640f2415-89a1-4503-8629-242d808edc3c","timestamp":1718428834916,"matcher":{"static":{},"wildcard":{},"dynamic":{}},"prerendered":["/playground","/playground/french","/card","/playground/palettes/mountains","/playground/midi","/playground/tiling","/playground/chords","/playground/waves","/examples/nested_transitions","/playground/matrix","/playground/palettes/variance","/playground/audio","/playground/metronome","/playground/plotter","/","/articles","/articles/migrate-truenas-from-core-to-scale","/articles/nuxt-v3-migration","/articles/vim-fugitive-gpg-pinentry","/articles/podcast-transcription-whispercpp","/articles/doctl","/articles/nuxt-content-rss-feed","/articles/reset-ipmi-password-from-host-os","/articles/ssh-ed25519-sk-yubikey","/articles/quick-tip-rerunning-bash-commands","/articles/fennel-initial-exploration","/articles/unit-testing-micropython-with-mocks","/articles/apu2-firmware-upgrade","/articles/docker-selinux-volumes","/articles/persistent-archlinux-usb"]} \ No newline at end of file diff --git a/_nuxt/builds/meta/d8634a4e-ab1a-4045-9220-3f7d159ce250.json b/_nuxt/builds/meta/d8634a4e-ab1a-4045-9220-3f7d159ce250.json new file mode 100644 index 00000000..858b4e16 --- /dev/null +++ b/_nuxt/builds/meta/d8634a4e-ab1a-4045-9220-3f7d159ce250.json @@ -0,0 +1 @@ +{"id":"d8634a4e-ab1a-4045-9220-3f7d159ce250","timestamp":1718681811067,"matcher":{"static":{},"wildcard":{},"dynamic":{}},"prerendered":["/card","/playground/french","/playground","/playground/palettes/mountains","/examples/nested_transitions","/playground/chords","/playground/matrix","/playground/metronome","/playground/midi","/playground/tiling","/playground/plotter","/playground/waves","/playground/audio","/playground/palettes/variance","/","/articles","/articles/nuxt-v3-migration","/articles/migrate-truenas-from-core-to-scale","/articles/vim-fugitive-gpg-pinentry","/articles/nuxt-content-rss-feed","/articles/podcast-transcription-whispercpp","/articles/doctl","/articles/reset-ipmi-password-from-host-os","/articles/quick-tip-rerunning-bash-commands","/articles/ssh-ed25519-sk-yubikey","/articles/fennel-initial-exploration","/articles/unit-testing-micropython-with-mocks","/articles/apu2-firmware-upgrade","/articles/docker-selinux-volumes","/articles/persistent-archlinux-usb"]} \ No newline at end of file diff --git a/_nuxt/DlW6eYPj.js b/_nuxt/ch9Af6jL.js similarity index 65% rename from _nuxt/DlW6eYPj.js rename to _nuxt/ch9Af6jL.js index cfe00f0b..28c7055a 100644 --- a/_nuxt/DlW6eYPj.js +++ b/_nuxt/ch9Af6jL.js @@ -1 +1 @@ -import{_ as o,o as r,c as t,a7 as s}from"./DXsCzSxj.js";const c={};function n(e,a){return r(),t("tbody",null,[s(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; +import{_ as o,o as r,c as t,a7 as s}from"./gOhWOHN0.js";const c={};function n(e,a){return r(),t("tbody",null,[s(e.$slots,"default")])}const _=o(c,[["render",n]]);export{_ as default}; diff --git a/_nuxt/gFw6sSaE.js b/_nuxt/gFw6sSaE.js deleted file mode 100644 index 3c42011b..00000000 --- a/_nuxt/gFw6sSaE.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as m}from"./DcN9AMIU.js";import"./DXsCzSxj.js";export{m as default}; diff --git a/_nuxt/DXsCzSxj.js b/_nuxt/gOhWOHN0.js similarity index 92% rename from _nuxt/DXsCzSxj.js rename to _nuxt/gOhWOHN0.js index a719ad7e..8b151189 100644 --- a/_nuxt/DXsCzSxj.js +++ b/_nuxt/gOhWOHN0.js @@ -1,4 +1,4 @@ -const __vite__fileDeps=["./D49jv_td.js","./DnPT5WRD.js","./C-v3KzvZ.js","./BDqtaPAc.js","./DvDH6DOc.js","./D_k-9tiD.js","./W6vbqLg7.js","./CAzXSrXZ.js","./_...J8jiN4NX.css","./5U82x1xs.js","./DdxBPLFy.js","./Ch5M0tju.js","./DQogfMZl.js","./C-Ppi5pl.js","./CV7OJtEk.js","./CvX9Ic8u.js","./C0BUAfVO.js","./WlOj4iQ2.js","./Bay-NfhX.js","./7iwyPdUt.js","./qyNTjY-r.js","./Cr8785qx.js","./DIITZ_oT.js","./gFw6sSaE.js","./DcN9AMIU.js","./ProsePre.CchFRBtv.css","./CgyoODLv.js"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]); +const __vite__fileDeps=["./Ci5PNU3b.js","./B519It_T.js","./C-v3KzvZ.js","./CRsxnQ9b.js","./DvDH6DOc.js","./gtS2INEI.js","./BYBkJnue.js","./Bs6eKMw6.js","./_...J8jiN4NX.css","./CLHUyLrC.js","./uM6gdZzG.js","./CnVOBpLY.js","./DlZNh5M8.js","./D5N360oS.js","./CuqDoC_G.js","./ChudRan8.js","./DQhOff_n.js","./JctMNniL.js","./CdNF5em2.js","./DxveBo0P.js","./BYuD9A8v.js","./DvLvbVZ0.js","./Baum9BnE.js","./ProsePre.CchFRBtv.css","./nX1iBwjm.js"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]); /** * @vue/shared v3.4.25 * (c) 2018-present Yuxi (Evan) You and Vue contributors @@ -15,11 +15,11 @@ const __vite__fileDeps=["./D49jv_td.js","./DnPT5WRD.js","./C-v3KzvZ.js","./BDqta * @vue/runtime-dom v3.4.25 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/const Tm="http://www.w3.org/2000/svg",km="http://www.w3.org/1998/Math/MathML",Mn=typeof document<"u"?document:null,Pu=Mn&&Mn.createElement("template"),Mm={insert:(r,d,w)=>{d.insertBefore(r,w||null)},remove:r=>{const d=r.parentNode;d&&d.removeChild(r)},createElement:(r,d,w,t)=>{const x=d==="svg"?Mn.createElementNS(Tm,r):d==="mathml"?Mn.createElementNS(km,r):Mn.createElement(r,w?{is:w}:void 0);return r==="select"&&t&&t.multiple!=null&&x.setAttribute("multiple",t.multiple),x},createText:r=>Mn.createTextNode(r),createComment:r=>Mn.createComment(r),setText:(r,d)=>{r.nodeValue=d},setElementText:(r,d)=>{r.textContent=d},parentNode:r=>r.parentNode,nextSibling:r=>r.nextSibling,querySelector:r=>Mn.querySelector(r),setScopeId(r,d){r.setAttribute(d,"")},insertStaticContent(r,d,w,t,x,v){const s=w?w.previousSibling:d.lastChild;if(x&&(x===v||x.nextSibling))for(;d.insertBefore(x.cloneNode(!0),w),!(x===v||!(x=x.nextSibling)););else{Pu.innerHTML=t==="svg"?`${r}`:t==="mathml"?`${r}`:r;const u=Pu.content;if(t==="svg"||t==="mathml"){const o=u.firstChild;for(;o.firstChild;)u.appendChild(o.firstChild);u.removeChild(o)}d.insertBefore(u,w)}return[s?s.nextSibling:d.firstChild,w?w.previousSibling:d.lastChild]}},xn="transition",Io="animation",Jo=Symbol("_vtc"),cs=(r,{slots:d})=>tr(Gp,Cm(r),d);cs.displayName="Transition";const ef={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};cs.props=Yt({},xd,ef);const Bn=(r,d=[])=>{st(r)?r.forEach(w=>w(...d)):r&&r(...d)},Au=r=>r?st(r)?r.some(d=>d.length>1):r.length>1:!1;function Cm(r){const d={};for(const I in r)I in ef||(d[I]=r[I]);if(r.css===!1)return d;const{name:w="v",type:t,duration:x,enterFromClass:v=`${w}-enter-from`,enterActiveClass:s=`${w}-enter-active`,enterToClass:u=`${w}-enter-to`,appearFromClass:o=v,appearActiveClass:c=s,appearToClass:g=u,leaveFromClass:p=`${w}-leave-from`,leaveActiveClass:n=`${w}-leave-active`,leaveToClass:i=`${w}-leave-to`}=r,a=Om(x),h=a&&a[0],y=a&&a[1],{onBeforeEnter:l,onEnter:f,onEnterCancelled:m,onLeave:b,onLeaveCancelled:j,onBeforeAppear:k=l,onAppear:E=f,onAppearCancelled:M=m}=d,P=(I,A,N)=>{Gn(I,A?g:u),Gn(I,A?c:s),N&&N()},L=(I,A)=>{I._isLeaving=!1,Gn(I,p),Gn(I,i),Gn(I,n),A&&A()},C=I=>(A,N)=>{const F=I?E:f,B=()=>P(A,I,N);Bn(F,[A,B]),Ru(()=>{Gn(A,I?o:v),jn(A,I?g:u),Au(F)||Lu(A,t,h,B)})};return Yt(d,{onBeforeEnter(I){Bn(l,[I]),jn(I,v),jn(I,s)},onBeforeAppear(I){Bn(k,[I]),jn(I,o),jn(I,c)},onEnter:C(!1),onAppear:C(!0),onLeave(I,A){I._isLeaving=!0;const N=()=>L(I,A);jn(I,p),jn(I,n),Rm(),Ru(()=>{I._isLeaving&&(Gn(I,p),jn(I,i),Au(b)||Lu(I,t,y,N))}),Bn(b,[I,N])},onEnterCancelled(I){P(I,!1),Bn(m,[I])},onAppearCancelled(I){P(I,!0),Bn(M,[I])},onLeaveCancelled(I){L(I),Bn(j,[I])}})}function Om(r){if(r==null)return null;if(Ct(r))return[Fi(r.enter),Fi(r.leave)];{const d=Fi(r);return[d,d]}}function Fi(r){return Hc(r)}function jn(r,d){d.split(/\s+/).forEach(w=>w&&r.classList.add(w)),(r[Jo]||(r[Jo]=new Set)).add(d)}function Gn(r,d){d.split(/\s+/).forEach(t=>t&&r.classList.remove(t));const w=r[Jo];w&&(w.delete(d),w.size||(r[Jo]=void 0))}function Ru(r){requestAnimationFrame(()=>{requestAnimationFrame(r)})}let Pm=0;function Lu(r,d,w,t){const x=r._endId=++Pm,v=()=>{x===r._endId&&t()};if(w)return setTimeout(v,w);const{type:s,timeout:u,propCount:o}=Am(r,d);if(!s)return t();const c=s+"end";let g=0;const p=()=>{r.removeEventListener(c,n),v()},n=i=>{i.target===r&&++g>=o&&p()};setTimeout(()=>{g(w[a]||"").split(", "),x=t(`${xn}Delay`),v=t(`${xn}Duration`),s=Iu(x,v),u=t(`${Io}Delay`),o=t(`${Io}Duration`),c=Iu(u,o);let g=null,p=0,n=0;d===xn?s>0&&(g=xn,p=s,n=v.length):d===Io?c>0&&(g=Io,p=c,n=o.length):(p=Math.max(s,c),g=p>0?s>c?xn:Io:null,n=g?g===xn?v.length:o.length:0);const i=g===xn&&/\b(transform|all)(,|$)/.test(t(`${xn}Property`).toString());return{type:g,timeout:p,propCount:n,hasTransform:i}}function Iu(r,d){for(;r.lengthDu(w)+Du(r[t])))}function Du(r){return r==="auto"?0:Number(r.slice(0,-1).replace(",","."))*1e3}function Rm(){return document.body.offsetHeight}function Lm(r,d,w){const t=r[Jo];t&&(d=(d?[d,...t]:[...t]).join(" ")),d==null?r.removeAttribute("class"):w?r.setAttribute("class",d):r.className=d}const Fu=Symbol("_vod"),Im=Symbol("_vsh"),Dm=Symbol(""),Fm=/(^|;)\s*display\s*:/;function Nm(r,d,w){const t=r.style,x=Gt(w);let v=!1;if(w&&!x){if(d)if(Gt(d))for(const s of d.split(";")){const u=s.slice(0,s.indexOf(":")).trim();w[u]==null&&Is(t,u,"")}else for(const s in d)w[s]==null&&Is(t,s,"");for(const s in w)s==="display"&&(v=!0),Is(t,s,w[s])}else if(x){if(d!==w){const s=t[Dm];s&&(w+=";"+s),t.cssText=w,v=Fm.test(w)}}else d&&r.removeAttribute("style");Fu in r&&(r[Fu]=v?t.display:"",r[Im]&&(t.display="none"))}const Nu=/\s*!important$/;function Is(r,d,w){if(st(w))w.forEach(t=>Is(r,d,t));else if(w==null&&(w=""),d.startsWith("--"))r.setProperty(d,w);else{const t=Um(r,d);Nu.test(w)?r.setProperty(xo(t),w.replace(Nu,""),"important"):r[t]=w}}const Uu=["Webkit","Moz","ms"],Ni={};function Um(r,d){const w=Ni[d];if(w)return w;let t=sn(d);if(t!=="filter"&&t in r)return Ni[d]=t;t=ri(t);for(let x=0;xUi||(Wm.then(()=>Ui=0),Ui=Date.now());function Xm(r,d){const w=t=>{if(!t._vts)t._vts=Date.now();else if(t._vts<=w.attached)return;Hr(Ym(t,w.value),d,5,[t])};return w.value=r,w.attached=qm(),w}function Ym(r,d){if(st(d)){const w=r.stopImmediatePropagation;return r.stopImmediatePropagation=()=>{w.call(r),r._stopped=!0},d.map(t=>x=>!x._stopped&&t&&t(x))}else return d}const Hu=r=>r.charCodeAt(0)===111&&r.charCodeAt(1)===110&&r.charCodeAt(2)>96&&r.charCodeAt(2)<123,$m=(r,d,w,t,x,v,s,u,o)=>{const c=x==="svg";d==="class"?Lm(r,t,c):d==="style"?Nm(r,w,t):ns(d)?Ua(d)||Hm(r,d,w,t,s):(d[0]==="."?(d=d.slice(1),!0):d[0]==="^"?(d=d.slice(1),!1):Km(r,d,t,c))?Gm(r,d,t,v,s,u,o):(d==="true-value"?r._trueValue=t:d==="false-value"&&(r._falseValue=t),Bm(r,d,t,c))};function Km(r,d,w,t){if(t)return!!(d==="innerHTML"||d==="textContent"||d in r&&Hu(d)&&at(w));if(d==="spellcheck"||d==="draggable"||d==="translate"||d==="form"||d==="list"&&r.tagName==="INPUT"||d==="type"&&r.tagName==="TEXTAREA")return!1;if(d==="width"||d==="height"){const x=r.tagName;if(x==="IMG"||x==="VIDEO"||x==="CANVAS"||x==="SOURCE")return!1}return Hu(d)&&Gt(w)?!1:d in r}const zu=r=>{const d=r.props["onUpdate:modelValue"]||!1;return st(d)?w=>fo(d,w):d};function Zm(r){r.target.composing=!0}function Wu(r){const d=r.target;d.composing&&(d.composing=!1,d.dispatchEvent(new Event("input")))}const Bi=Symbol("_assign"),x_={created(r,{modifiers:{lazy:d,trim:w,number:t}},x){r[Bi]=zu(x);const v=t||x.props&&x.props.type==="number";oo(r,d?"change":"input",s=>{if(s.target.composing)return;let u=r.value;w&&(u=u.trim()),v&&(u=ra(u)),r[Bi](u)}),w&&oo(r,"change",()=>{r.value=r.value.trim()}),d||(oo(r,"compositionstart",Zm),oo(r,"compositionend",Wu),oo(r,"change",Wu))},mounted(r,{value:d}){r.value=d??""},beforeUpdate(r,{value:d,modifiers:{lazy:w,trim:t,number:x}},v){if(r[Bi]=zu(v),r.composing)return;const s=(x||r.type==="number")&&!/^0\d/.test(r.value)?ra(r.value):r.value,u=d??"";s!==u&&(document.activeElement===r&&r.type!=="range"&&(w||t&&r.value.trim()===u)||(r.value=u))}},tf=Yt({patchProp:$m},Mm);let zo,qu=!1;function Qm(){return zo||(zo=hm(tf))}function Jm(){return zo=qu?zo:pm(tf),qu=!0,zo}const ey=(...r)=>{const d=Qm().createApp(...r),{mount:w}=d;return d.mount=t=>{const x=nf(t);if(!x)return;const v=d._component;!at(v)&&!v.render&&!v.template&&(v.template=x.innerHTML),x.innerHTML="";const s=w(x,!1,rf(x));return x instanceof Element&&(x.removeAttribute("v-cloak"),x.setAttribute("data-v-app","")),s},d},ty=(...r)=>{const d=Jm().createApp(...r),{mount:w}=d;return d.mount=t=>{const x=nf(t);if(x)return w(x,!0,rf(x))},d};function rf(r){if(r instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&r instanceof MathMLElement)return"mathml"}function nf(r){return Gt(r)?document.querySelector(r):r}const ry=/"(?:_|\\u0{2}5[Ff]){2}(?:p|\\u0{2}70)(?:r|\\u0{2}72)(?:o|\\u0{2}6[Ff])(?:t|\\u0{2}74)(?:o|\\u0{2}6[Ff])(?:_|\\u0{2}5[Ff]){2}"\s*:/,ny=/"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/,oy=/^\s*["[{]|^\s*-?\d{1,16}(\.\d{1,17})?([Ee][+-]?\d+)?\s*$/;function sy(r,d){if(r==="__proto__"||r==="constructor"&&d&&typeof d=="object"&&"prototype"in d){iy(r);return}return d}function iy(r){console.warn(`[destr] Dropping "${r}" key to prevent prototype pollution.`)}function Xs(r,d={}){if(typeof r!="string")return r;const w=r.trim();if(r[0]==='"'&&r.endsWith('"')&&!r.includes("\\"))return w.slice(1,-1);if(w.length<=9){const t=w.toLowerCase();if(t==="true")return!0;if(t==="false")return!1;if(t==="undefined")return;if(t==="null")return null;if(t==="nan")return Number.NaN;if(t==="infinity")return Number.POSITIVE_INFINITY;if(t==="-infinity")return Number.NEGATIVE_INFINITY}if(!oy.test(r)){if(d.strict)throw new SyntaxError("[destr] Invalid JSON");return r}try{if(ry.test(r)||ny.test(r)){if(d.strict)throw new Error("[destr] Possible prototype pollution");return JSON.parse(r,sy)}return JSON.parse(r)}catch(t){if(d.strict)throw t;return r}}const ay=/#/g,ly=/&/g,uy=/\//g,cy=/=/g,il=/\+/g,dy=/%5e/gi,fy=/%60/gi,hy=/%7c/gi,py=/%20/gi;function my(r){return encodeURI(""+r).replace(hy,"|")}function va(r){return my(typeof r=="string"?r:JSON.stringify(r)).replace(il,"%2B").replace(py,"+").replace(ay,"%23").replace(ly,"%26").replace(fy,"`").replace(dy,"^").replace(uy,"%2F")}function Gi(r){return va(r).replace(cy,"%3D")}function Ys(r=""){try{return decodeURIComponent(""+r)}catch{return""+r}}function yy(r){return Ys(r.replace(il," "))}function gy(r){return Ys(r.replace(il," "))}function of(r=""){const d={};r[0]==="?"&&(r=r.slice(1));for(const w of r.split("&")){const t=w.match(/([^=]+)=?(.*)/)||[];if(t.length<2)continue;const x=yy(t[1]);if(x==="__proto__"||x==="constructor")continue;const v=gy(t[2]||"");d[x]===void 0?d[x]=v:Array.isArray(d[x])?d[x].push(v):d[x]=[d[x],v]}return d}function vy(r,d){return(typeof d=="number"||typeof d=="boolean")&&(d=String(d)),d?Array.isArray(d)?d.map(w=>`${Gi(r)}=${va(w)}`).join("&"):`${Gi(r)}=${va(d)}`:Gi(r)}function by(r){return Object.keys(r).filter(d=>r[d]!==void 0).map(d=>vy(d,r[d])).filter(Boolean).join("&")}const _y=/^[\s\w\0+.-]{2,}:([/\\]{1,2})/,wy=/^[\s\w\0+.-]{2,}:([/\\]{2})?/,xy=/^([/\\]\s*){2,}[^/\\]/,jy=/^[\s\0]*(blob|data|javascript|vbscript):$/i,Sy=/\/$|\/\?|\/#/,Ey=/^\.?\//;function mn(r,d={}){return typeof d=="boolean"&&(d={acceptRelative:d}),d.strict?_y.test(r):wy.test(r)||(d.acceptRelative?xy.test(r):!1)}function Ty(r){return!!r&&jy.test(r)}function ba(r="",d){return d?Sy.test(r):r.endsWith("/")}function ui(r="",d){if(!d)return(ba(r)?r.slice(0,-1):r)||"/";if(!ba(r,!0))return r||"/";let w=r,t="";const x=r.indexOf("#");x>=0&&(w=r.slice(0,x),t=r.slice(x));const[v,...s]=w.split("?");return((v.endsWith("/")?v.slice(0,-1):v)||"/")+(s.length>0?`?${s.join("?")}`:"")+t}function $s(r="",d){if(!d)return r.endsWith("/")?r:r+"/";if(ba(r,!0))return r||"/";let w=r,t="";const x=r.indexOf("#");if(x>=0&&(w=r.slice(0,x),t=r.slice(x),!w))return t;const[v,...s]=w.split("?");return v+"/"+(s.length>0?`?${s.join("?")}`:"")+t}function ky(r=""){return r.startsWith("/")}function Xu(r=""){return ky(r)?r:"/"+r}function My(r,d){if(af(d)||mn(r))return r;const w=ui(d);return r.startsWith(w)?r:ci(w,r)}function Yu(r,d){if(af(d))return r;const w=ui(d);if(!r.startsWith(w))return r;const t=r.slice(w.length);return t[0]==="/"?t:"/"+t}function sf(r,d){const w=ds(r),t={...of(w.search),...d};return w.search=by(t),Py(w)}function af(r){return!r||r==="/"}function Cy(r){return r&&r!=="/"}function ci(r,...d){let w=r||"";for(const t of d.filter(x=>Cy(x)))if(w){const x=t.replace(Ey,"");w=$s(w)+x}else w=t;return w}function lf(...r){var s,u,o,c;const d=/\/(?!\/)/,w=r.filter(Boolean),t=[];let x=0;for(const g of w)if(!(!g||g==="/")){for(const[p,n]of g.split(d).entries())if(!(!n||n===".")){if(n===".."){if(t.length===1&&mn(t[0]))continue;t.pop(),x--;continue}if(p===1&&((s=t[t.length-1])!=null&&s.endsWith(":/"))){t[t.length-1]+="/"+n;continue}t.push(n),x++}}let v=t.join("/");return x>=0?(u=w[0])!=null&&u.startsWith("/")&&!v.startsWith("/")?v="/"+v:(o=w[0])!=null&&o.startsWith("./")&&!v.startsWith("./")&&(v="./"+v):v="../".repeat(-1*x)+v,(c=w[w.length-1])!=null&&c.endsWith("/")&&!v.endsWith("/")&&(v+="/"),v}function Oy(r,d,w={}){return w.trailingSlash||(r=$s(r),d=$s(d)),w.leadingSlash||(r=Xu(r),d=Xu(d)),w.encoding||(r=Ys(r),d=Ys(d)),r===d}const uf=Symbol.for("ufo:protocolRelative");function ds(r="",d){const w=r.match(/^[\s\0]*(blob:|data:|javascript:|vbscript:)(.*)/i);if(w){const[,p,n=""]=w;return{protocol:p.toLowerCase(),pathname:n,href:p+n,auth:"",host:"",search:"",hash:""}}if(!mn(r,{acceptRelative:!0}))return d?ds(d+r):$u(r);const[,t="",x,v=""]=r.replace(/\\/g,"/").match(/^[\s\0]*([\w+.-]{2,}:)?\/\/([^/@]+@)?(.*)/)||[],[,s="",u=""]=v.match(/([^#/?]*)(.*)?/)||[],{pathname:o,search:c,hash:g}=$u(u.replace(/\/(?=[A-Za-z]:)/,""));return{protocol:t.toLowerCase(),auth:x?x.slice(0,Math.max(0,x.length-1)):"",host:s,pathname:o,search:c,hash:g,[uf]:!t}}function $u(r=""){const[d="",w="",t=""]=(r.match(/([^#?]*)(\?[^#]*)?(#.*)?/)||[]).splice(1);return{pathname:d,search:w,hash:t}}function Py(r){const d=r.pathname||"",w=r.search?(r.search.startsWith("?")?"":"?")+r.search:"",t=r.hash||"",x=r.auth?r.auth+"@":"",v=r.host||"";return(r.protocol||r[uf]?(r.protocol||"")+"//":"")+x+v+d+w+t}class Ay extends Error{constructor(d,w){super(d,w),this.name="FetchError",w!=null&&w.cause&&!this.cause&&(this.cause=w.cause)}}function Ry(r){var o,c,g,p,n;const d=((o=r.error)==null?void 0:o.message)||((c=r.error)==null?void 0:c.toString())||"",w=((g=r.request)==null?void 0:g.method)||((p=r.options)==null?void 0:p.method)||"GET",t=((n=r.request)==null?void 0:n.url)||String(r.request)||"/",x=`[${w}] ${JSON.stringify(t)}`,v=r.response?`${r.response.status} ${r.response.statusText}`:"",s=`${x}: ${v}${d?` ${d}`:""}`,u=new Ay(s,r.error?{cause:r.error}:void 0);for(const i of["request","options","response"])Object.defineProperty(u,i,{get(){return r[i]}});for(const[i,a]of[["data","_data"],["status","status"],["statusCode","status"],["statusText","statusText"],["statusMessage","statusText"]])Object.defineProperty(u,i,{get(){return r.response&&r.response[a]}});return u}const Ly=new Set(Object.freeze(["PATCH","POST","PUT","DELETE"]));function Ku(r="GET"){return Ly.has(r.toUpperCase())}function Iy(r){if(r===void 0)return!1;const d=typeof r;return d==="string"||d==="number"||d==="boolean"||d===null?!0:d!=="object"?!1:Array.isArray(r)?!0:r.buffer?!1:r.constructor&&r.constructor.name==="Object"||typeof r.toJSON=="function"}const Dy=new Set(["image/svg","application/xml","application/xhtml","application/html"]),Fy=/^application\/(?:[\w!#$%&*.^`~-]*\+)?json(;.+)?$/i;function Ny(r=""){if(!r)return"json";const d=r.split(";").shift()||"";return Fy.test(d)?"json":Dy.has(d)||d.startsWith("text/")?"text":"blob"}function Uy(r,d,w=globalThis.Headers){const t={...d,...r};if(d!=null&&d.params&&(r!=null&&r.params)&&(t.params={...d==null?void 0:d.params,...r==null?void 0:r.params}),d!=null&&d.query&&(r!=null&&r.query)&&(t.query={...d==null?void 0:d.query,...r==null?void 0:r.query}),d!=null&&d.headers&&(r!=null&&r.headers)){t.headers=new w((d==null?void 0:d.headers)||{});for(const[x,v]of new w((r==null?void 0:r.headers)||{}))t.headers.set(x,v)}return t}const By=new Set([408,409,425,429,500,502,503,504]),Gy=new Set([101,204,205,304]);function cf(r={}){const{fetch:d=globalThis.fetch,Headers:w=globalThis.Headers,AbortController:t=globalThis.AbortController}=r;async function x(u){const o=u.error&&u.error.name==="AbortError"&&!u.options.timeout||!1;if(u.options.retry!==!1&&!o){let g;typeof u.options.retry=="number"?g=u.options.retry:g=Ku(u.options.method)?0:1;const p=u.response&&u.response.status||500;if(g>0&&(Array.isArray(u.options.retryStatusCodes)?u.options.retryStatusCodes.includes(p):By.has(p))){const n=u.options.retryDelay||0;return n>0&&await new Promise(i=>setTimeout(i,n)),v(u.request,{...u.options,retry:g-1})}}const c=Ry(u);throw Error.captureStackTrace&&Error.captureStackTrace(c,v),c}const v=async function(o,c={}){var i;const g={request:o,options:Uy(c,r.defaults,w),response:void 0,error:void 0};g.options.method=(i=g.options.method)==null?void 0:i.toUpperCase(),g.options.onRequest&&await g.options.onRequest(g),typeof g.request=="string"&&(g.options.baseURL&&(g.request=My(g.request,g.options.baseURL)),(g.options.query||g.options.params)&&(g.request=sf(g.request,{...g.options.params,...g.options.query}))),g.options.body&&Ku(g.options.method)&&(Iy(g.options.body)?(g.options.body=typeof g.options.body=="string"?g.options.body:JSON.stringify(g.options.body),g.options.headers=new w(g.options.headers||{}),g.options.headers.has("content-type")||g.options.headers.set("content-type","application/json"),g.options.headers.has("accept")||g.options.headers.set("accept","application/json")):("pipeTo"in g.options.body&&typeof g.options.body.pipeTo=="function"||typeof g.options.body.pipe=="function")&&("duplex"in g.options||(g.options.duplex="half")));let p;if(!g.options.signal&&g.options.timeout){const a=new t;p=setTimeout(()=>a.abort(),g.options.timeout),g.options.signal=a.signal}try{g.response=await d(g.request,g.options)}catch(a){return g.error=a,g.options.onRequestError&&await g.options.onRequestError(g),await x(g)}finally{p&&clearTimeout(p)}if(g.response.body&&!Gy.has(g.response.status)&&g.options.method!=="HEAD"){const a=(g.options.parseResponse?"json":g.options.responseType)||Ny(g.response.headers.get("content-type")||"");switch(a){case"json":{const h=await g.response.text(),y=g.options.parseResponse||Xs;g.response._data=y(h);break}case"stream":{g.response._data=g.response.body;break}default:g.response._data=await g.response[a]()}}return g.options.onResponse&&await g.options.onResponse(g),!g.options.ignoreResponseError&&g.response.status>=400&&g.response.status<600?(g.options.onResponseError&&await g.options.onResponseError(g),await x(g)):g.response},s=async function(o,c){return(await v(o,c))._data};return s.raw=v,s.native=(...u)=>d(...u),s.create=(u={})=>cf({...r,defaults:{...r.defaults,...u}}),s}const al=function(){if(typeof globalThis<"u")return globalThis;if(typeof self<"u")return self;if(typeof window<"u")return window;if(typeof global<"u")return global;throw new Error("unable to locate global object")}(),Vy=al.fetch||(()=>Promise.reject(new Error("[ofetch] global.fetch is not supported!"))),Hy=al.Headers,zy=al.AbortController,Wy=cf({fetch:Vy,Headers:Hy,AbortController:zy}),qy=Wy,Xy=()=>{var r;return((r=window==null?void 0:window.__NUXT__)==null?void 0:r.config)||{}},Ks=Xy().app,Yy=()=>Ks.baseURL,$y=()=>Ks.buildAssetsDir,ll=(...r)=>lf(df(),$y(),...r),df=(...r)=>{const d=Ks.cdnURL||Ks.baseURL;return r.length?lf(d,...r):d};globalThis.__buildAssetsURL=ll,globalThis.__publicAssetsURL=df;globalThis.$fetch||(globalThis.$fetch=qy.create({baseURL:Yy()}));function _a(r,d={},w){for(const t in r){const x=r[t],v=w?`${w}:${t}`:t;typeof x=="object"&&x!==null?_a(x,d,v):typeof x=="function"&&(d[v]=x)}return d}const Ky={run:r=>r()},Zy=()=>Ky,ff=typeof console.createTask<"u"?console.createTask:Zy;function Qy(r,d){const w=d.shift(),t=ff(w);return r.reduce((x,v)=>x.then(()=>t.run(()=>v(...d))),Promise.resolve())}function Jy(r,d){const w=d.shift(),t=ff(w);return Promise.all(r.map(x=>t.run(()=>x(...d))))}function Vi(r,d){for(const w of[...r])w(d)}class eg{constructor(){this._hooks={},this._before=void 0,this._after=void 0,this._deprecatedMessages=void 0,this._deprecatedHooks={},this.hook=this.hook.bind(this),this.callHook=this.callHook.bind(this),this.callHookWith=this.callHookWith.bind(this)}hook(d,w,t={}){if(!d||typeof w!="function")return()=>{};const x=d;let v;for(;this._deprecatedHooks[d];)v=this._deprecatedHooks[d],d=v.to;if(v&&!t.allowDeprecated){let s=v.message;s||(s=`${x} hook has been deprecated`+(v.to?`, please use ${v.to}`:"")),this._deprecatedMessages||(this._deprecatedMessages=new Set),this._deprecatedMessages.has(s)||(console.warn(s),this._deprecatedMessages.add(s))}if(!w.name)try{Object.defineProperty(w,"name",{get:()=>"_"+d.replace(/\W+/g,"_")+"_hook_cb",configurable:!0})}catch{}return this._hooks[d]=this._hooks[d]||[],this._hooks[d].push(w),()=>{w&&(this.removeHook(d,w),w=void 0)}}hookOnce(d,w){let t,x=(...v)=>(typeof t=="function"&&t(),t=void 0,x=void 0,w(...v));return t=this.hook(d,x),t}removeHook(d,w){if(this._hooks[d]){const t=this._hooks[d].indexOf(w);t!==-1&&this._hooks[d].splice(t,1),this._hooks[d].length===0&&delete this._hooks[d]}}deprecateHook(d,w){this._deprecatedHooks[d]=typeof w=="string"?{to:w}:w;const t=this._hooks[d]||[];delete this._hooks[d];for(const x of t)this.hook(d,x)}deprecateHooks(d){Object.assign(this._deprecatedHooks,d);for(const w in d)this.deprecateHook(w,d[w])}addHooks(d){const w=_a(d),t=Object.keys(w).map(x=>this.hook(x,w[x]));return()=>{for(const x of t.splice(0,t.length))x()}}removeHooks(d){const w=_a(d);for(const t in w)this.removeHook(t,w[t])}removeAllHooks(){for(const d in this._hooks)delete this._hooks[d]}callHook(d,...w){return w.unshift(d),this.callHookWith(Qy,d,...w)}callHookParallel(d,...w){return w.unshift(d),this.callHookWith(Jy,d,...w)}callHookWith(d,w,...t){const x=this._before||this._after?{name:w,args:t,context:{}}:void 0;this._before&&Vi(this._before,x);const v=d(w in this._hooks?[...this._hooks[w]]:[],t);return v instanceof Promise?v.finally(()=>{this._after&&x&&Vi(this._after,x)}):(this._after&&x&&Vi(this._after,x),v)}beforeEach(d){return this._before=this._before||[],this._before.push(d),()=>{if(this._before!==void 0){const w=this._before.indexOf(d);w!==-1&&this._before.splice(w,1)}}}afterEach(d){return this._after=this._after||[],this._after.push(d),()=>{if(this._after!==void 0){const w=this._after.indexOf(d);w!==-1&&this._after.splice(w,1)}}}}function hf(){return new eg}function tg(r={}){let d,w=!1;const t=s=>{if(d&&d!==s)throw new Error("Context conflict")};let x;if(r.asyncContext){const s=r.AsyncLocalStorage||globalThis.AsyncLocalStorage;s?x=new s:console.warn("[unctx] `AsyncLocalStorage` is not provided.")}const v=()=>{if(x&&d===void 0){const s=x.getStore();if(s!==void 0)return s}return d};return{use:()=>{const s=v();if(s===void 0)throw new Error("Context is not available");return s},tryUse:()=>v(),set:(s,u)=>{u||t(s),d=s,w=!0},unset:()=>{d=void 0,w=!1},call:(s,u)=>{t(s),d=s;try{return x?x.run(s,u):u()}finally{w||(d=void 0)}},async callAsync(s,u){d=s;const o=()=>{d=s},c=()=>d===s?o:void 0;wa.add(c);try{const g=x?x.run(s,u):u();return w||(d=void 0),await g}finally{wa.delete(c)}}}}function rg(r={}){const d={};return{get(w,t={}){return d[w]||(d[w]=tg({...r,...t})),d[w],d[w]}}}const Zs=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof global<"u"?global:typeof window<"u"?window:{},Zu="__unctx__",ng=Zs[Zu]||(Zs[Zu]=rg()),og=(r,d={})=>ng.get(r,d),Qu="__unctx_async_handlers__",wa=Zs[Qu]||(Zs[Qu]=new Set);function es(r){const d=[];for(const x of wa){const v=x();v&&d.push(v)}const w=()=>{for(const x of d)x()};let t=r();return t&&typeof t=="object"&&"catch"in t&&(t=t.catch(x=>{throw w(),x})),[t,w]}const pf=og("nuxt-app",{asyncContext:!1}),sg="__nuxt_plugin";function ig(r){let d=0;const w={_scope:Vh(),provide:void 0,globalName:"nuxt",versions:{get nuxt(){return"3.11.2"},get vue(){return w.vueApp.version}},payload:Nn({data:{},state:{},once:new Set,_errors:{},...window.__NUXT__??{}}),static:{data:{}},runWithContext:x=>w._scope.run(()=>ug(w,x)),isHydrating:!0,deferHydration(){if(!w.isHydrating)return()=>{};d++;let x=!1;return()=>{if(!x&&(x=!0,d--,d===0))return w.isHydrating=!1,w.callHook("app:suspense:resolve")}},_asyncDataPromises:{},_asyncData:{},_payloadRevivers:{},...r};w.hooks=hf(),w.hook=w.hooks.hook,w.callHook=w.hooks.callHook,w.provide=(x,v)=>{const s="$"+x;Ms(w,s,v),Ms(w.vueApp.config.globalProperties,s,v)},Ms(w.vueApp,"$nuxt",w),Ms(w.vueApp.config.globalProperties,"$nuxt",w);{window.addEventListener("nuxt.preloadError",v=>{w.callHook("app:chunkError",{error:v.payload})}),window.useNuxtApp=window.useNuxtApp||It;const x=w.hook("app:error",(...v)=>{console.error("[nuxt] error caught during app initialization",...v)});w.hook("app:mounted",x)}const t=w.payload.config;return w.provide("config",t),w}async function ag(r,d){if(d.hooks&&r.hooks.addHooks(d.hooks),typeof d=="function"){const{provide:w}=await r.runWithContext(()=>d(r))||{};if(w&&typeof w=="object")for(const t in w)r.provide(t,w[t])}}async function lg(r,d){const w=[],t=[],x=[],v=[];let s=0;async function u(o){var g;const c=((g=o.dependsOn)==null?void 0:g.filter(p=>d.some(n=>n._name===p)&&!w.includes(p)))??[];if(c.length>0)t.push([new Set(c),o]);else{const p=ag(r,o).then(async()=>{o._name&&(w.push(o._name),await Promise.all(t.map(async([n,i])=>{n.has(o._name)&&(n.delete(o._name),n.size===0&&(s++,await u(i)))})))});o.parallel?x.push(p.catch(n=>v.push(n))):await p}}for(const o of d)await u(o);if(await Promise.all(x),s)for(let o=0;o{}),r,{[sg]:!0,_name:d})}function ug(r,d,w){const t=()=>d();return pf.set(r),r.vueApp.runWithContext(t)}function cg(){var d;let r;return Rd()&&(r=(d=So())==null?void 0:d.appContext.app.$nuxt),r=r||pf.tryUse(),r||null}function It(){const r=cg();if(!r)throw new Error("[nuxt] instance unavailable");return r}function di(r){return It().$config}function Ms(r,d,w){Object.defineProperty(r,d,{get:()=>w})}function dg(r,d){return{ctx:{table:r},matchAll:w=>yf(w,r)}}function mf(r){const d={};for(const w in r)d[w]=w==="dynamic"?new Map(Object.entries(r[w]).map(([t,x])=>[t,mf(x)])):new Map(Object.entries(r[w]));return d}function fg(r){return dg(mf(r))}function yf(r,d,w){r.endsWith("/")&&(r=r.slice(0,-1)||"/");const t=[];for(const[v,s]of Ju(d.wildcard))(r===v||r.startsWith(v+"/"))&&t.push(s);for(const[v,s]of Ju(d.dynamic))if(r.startsWith(v+"/")){const u="/"+r.slice(v.length).split("/").splice(2).join("/");t.push(...yf(u,s))}const x=d.static.get(r);return x&&t.push(x),t.filter(Boolean)}function Ju(r){return[...r.entries()].sort((d,w)=>d[0].length-w[0].length)}function Hi(r){if(r===null||typeof r!="object")return!1;const d=Object.getPrototypeOf(r);return d!==null&&d!==Object.prototype&&Object.getPrototypeOf(d)!==null||Symbol.iterator in r?!1:Symbol.toStringTag in r?Object.prototype.toString.call(r)==="[object Module]":!0}function xa(r,d,w=".",t){if(!Hi(d))return xa(r,{},w,t);const x=Object.assign({},d);for(const v in r){if(v==="__proto__"||v==="constructor")continue;const s=r[v];s!=null&&(t&&t(x,v,s,w)||(Array.isArray(s)&&Array.isArray(x[v])?x[v]=[...s,...x[v]]:Hi(s)&&Hi(x[v])?x[v]=xa(s,x[v],(w?`${w}.`:"")+v.toString(),t):x[v]=s))}return x}function gf(r){return(...d)=>d.reduce((w,t)=>xa(w,t,"",r),{})}const vf=gf(),hg=gf((r,d,w)=>{if(r[d]!==void 0&&typeof w=="function")return r[d]=w(r[d]),!0});function pg(r,d){try{return d in r}catch{return!1}}var mg=Object.defineProperty,yg=(r,d,w)=>d in r?mg(r,d,{enumerable:!0,configurable:!0,writable:!0,value:w}):r[d]=w,Hn=(r,d,w)=>(yg(r,typeof d!="symbol"?d+"":d,w),w);class ja extends Error{constructor(d,w={}){super(d,w),Hn(this,"statusCode",500),Hn(this,"fatal",!1),Hn(this,"unhandled",!1),Hn(this,"statusMessage"),Hn(this,"data"),Hn(this,"cause"),w.cause&&!this.cause&&(this.cause=w.cause)}toJSON(){const d={message:this.message,statusCode:Ea(this.statusCode,500)};return this.statusMessage&&(d.statusMessage=bf(this.statusMessage)),this.data!==void 0&&(d.data=this.data),d}}Hn(ja,"__h3_error__",!0);function Sa(r){if(typeof r=="string")return new ja(r);if(gg(r))return r;const d=new ja(r.message??r.statusMessage??"",{cause:r.cause||r});if(pg(r,"stack"))try{Object.defineProperty(d,"stack",{get(){return r.stack}})}catch{try{d.stack=r.stack}catch{}}if(r.data&&(d.data=r.data),r.statusCode?d.statusCode=Ea(r.statusCode,d.statusCode):r.status&&(d.statusCode=Ea(r.status,d.statusCode)),r.statusMessage?d.statusMessage=r.statusMessage:r.statusText&&(d.statusMessage=r.statusText),d.statusMessage){const w=d.statusMessage;bf(d.statusMessage)!==w&&console.warn("[h3] Please prefer using `message` for longer error messages instead of `statusMessage`. In the future, `statusMessage` will be sanitized by default.")}return r.fatal!==void 0&&(d.fatal=r.fatal),r.unhandled!==void 0&&(d.unhandled=r.unhandled),d}function gg(r){var d;return((d=r==null?void 0:r.constructor)==null?void 0:d.__h3_error__)===!0}const vg=/[^\u0009\u0020-\u007E]/g;function bf(r=""){return r.replace(vg,"")}function Ea(r,d=200){return!r||(typeof r=="string"&&(r=Number.parseInt(r,10)),r<100||r>999)?d:r}const _f=Symbol("layout-meta"),fs=Symbol("route"),Wr=()=>{var r;return(r=It())==null?void 0:r.$router},fi=()=>Rd()?Ht(fs,It()._route):It()._route;const bg=()=>{try{if(It()._processingMiddleware)return!0}catch{return!1}return!1},_g=(r,d)=>{r||(r="/");const w=typeof r=="string"?r:sf(r.path||"/",r.query||{})+(r.hash||"");if(d!=null&&d.open){const{target:u="_blank",windowFeatures:o={}}=d.open,c=Object.entries(o).filter(([g,p])=>p!==void 0).map(([g,p])=>`${g.toLowerCase()}=${p}`).join(", ");return open(w,u,c),Promise.resolve()}const t=(d==null?void 0:d.external)||mn(w,{acceptRelative:!0});if(t){if(!(d!=null&&d.external))throw new Error("Navigating to an external URL is not allowed by default. Use `navigateTo(url, { external: true })`.");const u=ds(w).protocol;if(u&&Ty(u))throw new Error(`Cannot navigate to a URL with '${u}' protocol.`)}const x=bg();if(!t&&x)return r;const v=Wr(),s=It();return t?(s._scope.stop(),d!=null&&d.replace?location.replace(w):location.href=w,x?s.isHydrating?new Promise(()=>{}):!1:Promise.resolve()):d!=null&&d.replace?v.replace(r):v.push(r)},wf="__nuxt_error",hi=()=>vp(It().payload,"error"),ao=r=>{const d=pi(r);try{const w=It(),t=hi();w.hooks.callHook("app:error",d),t.value=t.value||d}catch{throw d}return d},wg=async(r={})=>{const d=It(),w=hi();d.callHook("app:error:cleared",r),r.redirect&&await Wr().replace(r.redirect),w.value=null},xg=r=>!!r&&typeof r=="object"&&wf in r,pi=r=>{const d=Sa(r);return Object.defineProperty(d,wf,{value:!0,configurable:!1,writable:!1}),d},jg="modulepreload",Sg=function(r,d){return r[0]==="."?new URL(r,d).href:r},ec={},Eg=function(d,w,t){let x=Promise.resolve();if(w&&w.length>0){document.getElementsByTagName("link");const v=document.querySelector("meta[property=csp-nonce]"),s=(v==null?void 0:v.nonce)||(v==null?void 0:v.getAttribute("nonce"));x=Promise.all(w.map(u=>{if(u=Sg(u,t),u in ec)return;ec[u]=!0;const o=u.endsWith(".css"),c=o?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${u}"]${c}`))return;const g=document.createElement("link");if(g.rel=o?"stylesheet":jg,o||(g.as="script",g.crossOrigin=""),g.href=u,s&&g.setAttribute("nonce",s),document.head.appendChild(g),o)return new Promise((p,n)=>{g.addEventListener("load",p),g.addEventListener("error",()=>n(new Error(`Unable to preload CSS for ${u}`)))})}))}return x.then(()=>d()).catch(v=>{const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=v,window.dispatchEvent(s),!s.defaultPrevented)throw v})},rt=(...r)=>Eg(...r).catch(d=>{const w=new Event("nuxt.preloadError");throw w.payload=d,window.dispatchEvent(w),d}),Tg=-1,kg=-2,Mg=-3,Cg=-4,Og=-5,Pg=-6;function Ag(r,d){return Rg(JSON.parse(r),d)}function Rg(r,d){if(typeof r=="number")return x(r,!0);if(!Array.isArray(r)||r.length===0)throw new Error("Invalid input");const w=r,t=Array(w.length);function x(v,s=!1){if(v===Tg)return;if(v===Mg)return NaN;if(v===Cg)return 1/0;if(v===Og)return-1/0;if(v===Pg)return-0;if(s)throw new Error("Invalid input");if(v in t)return t[v];const u=w[v];if(!u||typeof u!="object")t[v]=u;else if(Array.isArray(u))if(typeof u[0]=="string"){const o=u[0],c=d==null?void 0:d[o];if(c)return t[v]=c(x(u[1]));switch(o){case"Date":t[v]=new Date(u[1]);break;case"Set":const g=new Set;t[v]=g;for(let i=1;i>>9)+65536).toString(16).substring(1,8).toLowerCase()}function tc(r){return r._h||ul(r._d?r._d:`${r.tag}:${r.textContent||r.innerHTML||""}:${Object.entries(r.props).map(([d,w])=>`${d}:${String(w)}`).join(",")}`)}function jf(r,d){const{props:w,tag:t}=r;if(Fg.includes(t))return t;if(t==="link"&&w.rel==="canonical")return"canonical";if(w.charset)return"charset";const x=["id"];t==="meta"&&x.push("name","property","http-equiv");for(const v of x)if(typeof w[v]<"u"){const s=String(w[v]);return`${t}:${v}:${s}`}return!1}function rc(r,d){return r==null?d||null:typeof r=="function"?r(d):r}function Sf(r,d){const w=[],t=d.resolveKeyData||(v=>v.key),x=d.resolveValueData||(v=>v.value);for(const[v,s]of Object.entries(r))w.push(...(Array.isArray(s)?s:[s]).map(u=>{const o={key:v,value:u},c=x(o);return typeof c=="object"?Sf(c,d):Array.isArray(c)?c:{[typeof d.key=="function"?d.key(o):d.key]:t(o),[typeof d.value=="function"?d.value(o):d.value]:c}}).flat());return w}function Ef(r,d){return Object.entries(r).map(([w,t])=>{if(typeof t=="object"&&(t=Ef(t,d)),d.resolve){const x=d.resolve({key:w,value:t});if(typeof x<"u")return x}return typeof t=="number"&&(t=t.toString()),typeof t=="string"&&d.wrapValue&&(t=t.replace(new RegExp(d.wrapValue,"g"),`\\${d.wrapValue}`),t=`${d.wrapValue}${t}${d.wrapValue}`),`${w}${d.keyValueSeparator||""}${t}`}).join(d.entrySeparator||"")}const pr=r=>({keyValue:r,metaKey:"property"}),zi=r=>({keyValue:r}),cl={appleItunesApp:{unpack:{entrySeparator:", ",resolve({key:r,value:d}){return`${fn(r)}=${d}`}}},articleExpirationTime:pr("article:expiration_time"),articleModifiedTime:pr("article:modified_time"),articlePublishedTime:pr("article:published_time"),bookReleaseDate:pr("book:release_date"),charset:{metaKey:"charset"},contentSecurityPolicy:{unpack:{entrySeparator:"; ",resolve({key:r,value:d}){return`${fn(r)} ${d}`}},metaKey:"http-equiv"},contentType:{metaKey:"http-equiv"},defaultStyle:{metaKey:"http-equiv"},fbAppId:pr("fb:app_id"),msapplicationConfig:zi("msapplication-Config"),msapplicationTileColor:zi("msapplication-TileColor"),msapplicationTileImage:zi("msapplication-TileImage"),ogAudioSecureUrl:pr("og:audio:secure_url"),ogAudioUrl:pr("og:audio"),ogImageSecureUrl:pr("og:image:secure_url"),ogImageUrl:pr("og:image"),ogSiteName:pr("og:site_name"),ogVideoSecureUrl:pr("og:video:secure_url"),ogVideoUrl:pr("og:video"),profileFirstName:pr("profile:first_name"),profileLastName:pr("profile:last_name"),profileUsername:pr("profile:username"),refresh:{metaKey:"http-equiv",unpack:{entrySeparator:";",resolve({key:r,value:d}){if(r==="seconds")return`${d}`}}},robots:{unpack:{entrySeparator:", ",resolve({key:r,value:d}){return typeof d=="boolean"?`${fn(r)}`:`${fn(r)}:${d}`}}},xUaCompatible:{metaKey:"http-equiv"}},Tf=["og","book","article","profile"];function kf(r){var w;const d=fn(r).split(":")[0];return Tf.includes(d)?"property":((w=cl[r])==null?void 0:w.metaKey)||"name"}function Ug(r){var d;return((d=cl[r])==null?void 0:d.keyValue)||fn(r)}function fn(r){const d=r.replace(/([A-Z])/g,"-$1").toLowerCase(),w=d.split("-")[0];return Tf.includes(w)||w==="twitter"?r.replace(/([A-Z])/g,":$1").toLowerCase():d}function Ta(r){if(Array.isArray(r))return r.map(w=>Ta(w));if(typeof r!="object"||Array.isArray(r))return r;const d={};for(const[w,t]of Object.entries(r))d[fn(w)]=Ta(t);return d}function Bg(r,d){const w=cl[d];return d==="refresh"?`${r.seconds};url=${r.url}`:Ef(Ta(r),{keyValueSeparator:"=",entrySeparator:", ",resolve({value:t,key:x}){if(t===null)return"";if(typeof t=="boolean")return`${x}`},...w==null?void 0:w.unpack})}const Mf=["og:image","og:video","og:audio","twitter:image"];function Cf(r){const d={};return Object.entries(r).forEach(([w,t])=>{String(t)!=="false"&&w&&(d[w]=t)}),d}function nc(r,d){const w=Cf(d),t=fn(r),x=kf(t);if(Mf.includes(t)){const v={};return Object.entries(w).forEach(([s,u])=>{v[`${r}${s==="url"?"":`${s.charAt(0).toUpperCase()}${s.slice(1)}`}`]=u}),dl(v).sort((s,u)=>{var o,c;return(((o=s[x])==null?void 0:o.length)||0)-(((c=u[x])==null?void 0:c.length)||0)})}return[{[x]:t,...w}]}function dl(r){const d=[],w={};Object.entries(r).forEach(([x,v])=>{if(!Array.isArray(v)){if(typeof v=="object"&&v){if(Mf.includes(fn(x))){d.push(...nc(x,v));return}w[x]=Cf(v)}else w[x]=v;return}v.forEach(s=>{d.push(...typeof s=="string"?dl({[x]:s}):nc(x,s))})});const t=Sf(w,{key({key:x}){return kf(x)},value({key:x}){return x==="charset"?"charset":"content"},resolveKeyData({key:x}){return Ug(x)},resolveValueData({value:x,key:v}){return x===null?"_null":typeof x=="object"?Bg(x,v):typeof x=="number"?x.toString():x}});return[...d,...t].map(x=>(x.content==="_null"&&(x.content=null),x))}async function Gg(r,d,w){const t={tag:r,props:await Of(typeof d=="object"&&typeof d!="function"&&!(d instanceof Promise)?{...d}:{[["script","noscript","style"].includes(r)?"innerHTML":"textContent"]:d},["templateParams","titleTemplate"].includes(r))};return xf.forEach(x=>{const v=typeof t.props[x]<"u"?t.props[x]:w[x];typeof v<"u"&&((!["innerHTML","textContent","children"].includes(x)||Ig.includes(t.tag))&&(t[x==="children"?"innerHTML":x]=v),delete t.props[x])}),t.props.body&&(t.tagPosition="bodyClose",delete t.props.body),t.tag==="script"&&typeof t.innerHTML=="object"&&(t.innerHTML=JSON.stringify(t.innerHTML),t.props.type=t.props.type||"application/json"),Array.isArray(t.props.content)?t.props.content.map(x=>({...t,props:{...t.props,content:x}})):t}function Vg(r,d){var t;const w=r==="class"?" ":";";return typeof d=="object"&&!Array.isArray(d)&&(d=Object.entries(d).filter(([,x])=>x).map(([x,v])=>r==="style"?`${x}:${v}`:x)),(t=Array.isArray(d)?d.join(w):d)==null?void 0:t.split(w).filter(x=>x.trim()).filter(Boolean).join(w)}async function Of(r,d){for(const w of Object.keys(r)){if(["class","style"].includes(w)){r[w]=Vg(w,r[w]);continue}if(r[w]instanceof Promise&&(r[w]=await r[w]),!d&&!xf.includes(w)){const t=String(r[w]),x=w.startsWith("data-");t==="true"||t===""?r[w]=x?"true":!0:r[w]||(x&&t==="false"?r[w]="false":delete r[w])}}return r}const Hg=10;async function zg(r){const d=[];return Object.entries(r.resolvedInput).filter(([w,t])=>typeof t<"u"&&Dg.includes(w)).forEach(([w,t])=>{const x=Lg(t);d.push(...x.map(v=>Gg(w,v,r)).flat())}),(await Promise.all(d)).flat().filter(Boolean).map((w,t)=>(w._e=r._i,r.mode&&(w._m=r.mode),w._p=(r._i<o&&o[c]||void 0,d):u=d[s],typeof u<"u"?(u||"").replace(/"/g,'\\"'):!1}let x=r;try{x=decodeURI(r)}catch{}return(x.match(/%(\w+\.+\w+)|%(\w+)/g)||[]).sort().reverse().forEach(s=>{const u=t(s.slice(1));typeof u=="string"&&(r=r.replace(new RegExp(`\\${s}(\\W|$)`,"g"),(o,c)=>`${u}${c}`).trim())}),r.includes(Sn)&&(r.endsWith(Sn)&&(r=r.slice(0,-Sn.length).trim()),r.startsWith(Sn)&&(r=r.slice(Sn.length).trim()),r=r.replace(new RegExp(`\\${Sn}\\s*\\${Sn}`,"g"),Sn),r=Fs(r,{separator:w},w)),r}async function Pf(r,d={}){var g;const w=d.document||r.resolvedOptions.document;if(!w||!r.dirty)return;const t={shouldRender:!0,tags:[]};if(await r.hooks.callHook("dom:beforeRender",t),!t.shouldRender)return;const x=(await r.resolveTags()).map(p=>({tag:p,id:Ds.includes(p.tag)?tc(p):p.tag,shouldRender:!0}));let v=r._dom;if(!v){v={elMap:{htmlAttrs:w.documentElement,bodyAttrs:w.body}};for(const p of["body","head"]){const n=(g=w[p])==null?void 0:g.children,i=[];for(const a of[...n].filter(h=>Ds.includes(h.tagName.toLowerCase()))){const h={tag:a.tagName.toLowerCase(),props:await Of(a.getAttributeNames().reduce((f,m)=>({...f,[m]:a.getAttribute(m)}),{})),innerHTML:a.innerHTML};let y=1,l=jf(h);for(;l&&i.find(f=>f._d===l);)l=`${l}:${y++}`;h._d=l||void 0,i.push(h),v.elMap[a.getAttribute("data-hid")||tc(h)]=a}}}v.pendingSideEffects={...v.sideEffects||{}},v.sideEffects={};function s(p,n,i){const a=`${p}:${n}`;v.sideEffects[a]=i,delete v.pendingSideEffects[a]}function u({id:p,$el:n,tag:i}){const a=i.tag.endsWith("Attrs");v.elMap[p]=n,a||(["textContent","innerHTML"].forEach(h=>{i[h]&&i[h]!==n[h]&&(n[h]=i[h])}),s(p,"el",()=>{var h;(h=v.elMap[p])==null||h.remove(),delete v.elMap[p]}));for(const[h,y]of Object.entries(i._eventHandlers||{}))n.getAttribute(`data-${h}`)!==""&&((i.tag==="bodyAttrs"?w.defaultView:n).addEventListener(h.replace("on",""),y.bind(n)),n.setAttribute(`data-${h}`,""));Object.entries(i.props).forEach(([h,y])=>{const l=`attr:${h}`;if(h==="class")for(const f of(y||"").split(" ").filter(Boolean))a&&s(p,`${l}:${f}`,()=>n.classList.remove(f)),!n.classList.contains(f)&&n.classList.add(f);else if(h==="style")for(const f of(y||"").split(";").filter(Boolean)){const[m,...b]=f.split(":").map(j=>j.trim());s(p,`${l}:${f}:${m}`,()=>{n.style.removeProperty(m)}),n.style.setProperty(m,b.join(":"))}else n.getAttribute(h)!==y&&n.setAttribute(h,y===!0?"":String(y)),a&&s(p,l,()=>n.removeAttribute(h))})}const o=[],c={bodyClose:void 0,bodyOpen:void 0,head:void 0};for(const p of x){const{tag:n,shouldRender:i,id:a}=p;if(i){if(n.tag==="title"){w.title=n.textContent;continue}p.$el=p.$el||v.elMap[a],p.$el?u(p):Ds.includes(n.tag)&&o.push(p)}}for(const p of o){const n=p.tag.tagPosition||"head";p.$el=w.createElement(p.tag.tag),u(p),c[n]=c[n]||w.createDocumentFragment(),c[n].appendChild(p.$el)}for(const p of x)await r.hooks.callHook("dom:renderTag",p,w,s);c.head&&w.head.appendChild(c.head),c.bodyOpen&&w.body.insertBefore(c.bodyOpen,w.body.firstChild),c.bodyClose&&w.body.appendChild(c.bodyClose),Object.values(v.pendingSideEffects).forEach(p=>p()),r._dom=v,r.dirty=!1,await r.hooks.callHook("dom:rendered",{renders:x})}async function qg(r,d={}){const w=d.delayFn||(t=>setTimeout(t,10));return r._domUpdatePromise=r._domUpdatePromise||new Promise(t=>w(async()=>{await Pf(r,d),delete r._domUpdatePromise,t()}))}function Xg(r){return d=>{var t,x;const w=((x=(t=d.resolvedOptions.document)==null?void 0:t.head.querySelector('script[id="unhead:payload"]'))==null?void 0:x.innerHTML)||!1;return w&&d.push(JSON.parse(w)),{mode:"client",hooks:{"entries:updated":function(v){qg(v,r)}}}}}const Yg=["templateParams","htmlAttrs","bodyAttrs"],$g={hooks:{"tag:normalise":function({tag:r}){["hid","vmid","key"].forEach(t=>{r.props[t]&&(r.key=r.props[t],delete r.props[t])});const w=jf(r)||(r.key?`${r.tag}:${r.key}`:!1);w&&(r._d=w)},"tags:resolve":function(r){const d={};r.tags.forEach(t=>{const x=(t.key?`${t.tag}:${t.key}`:t._d)||t._p,v=d[x];if(v){let u=t==null?void 0:t.tagDuplicateStrategy;if(!u&&Yg.includes(t.tag)&&(u="merge"),u==="merge"){const o=v.props;["class","style"].forEach(c=>{o[c]&&(t.props[c]?(c==="style"&&!o[c].endsWith(";")&&(o[c]+=";"),t.props[c]=`${o[c]} ${t.props[c]}`):t.props[c]=o[c])}),d[x].props={...o,...t.props};return}else if(t._e===v._e){v._duped=v._duped||[],t._d=`${v._d}:${v._duped.length+1}`,v._duped.push(t);return}else if(Qs(t)>Qs(v))return}const s=Object.keys(t.props).length+(t.innerHTML?1:0)+(t.textContent?1:0);if(Ds.includes(t.tag)&&s===0){delete d[x];return}d[x]=t});const w=[];Object.values(d).forEach(t=>{const x=t._duped;delete t._duped,w.push(t),x&&w.push(...x)}),r.tags=w,r.tags=r.tags.filter(t=>!(t.tag==="meta"&&(t.props.name||t.props.property)&&!t.props.content))}}},Kg={mode:"server",hooks:{"tags:resolve":function(r){const d={};r.tags.filter(w=>["titleTemplate","templateParams","title"].includes(w.tag)&&w._m==="server").forEach(w=>{d[w.tag]=w.tag.startsWith("title")?w.textContent:w.props}),Object.keys(d).length&&r.tags.push({tag:"script",innerHTML:JSON.stringify(d),props:{id:"unhead:payload",type:"application/json"}})}}},Zg=["script","link","bodyAttrs"],Qg=r=>({hooks:{"tags:resolve":function(d){for(const w of d.tags.filter(t=>Zg.includes(t.tag)))Object.entries(w.props).forEach(([t,x])=>{t.startsWith("on")&&typeof x=="function"&&(r.ssr&&ic.includes(t)?w.props[t]=`this.dataset.${t}fired = true`:delete w.props[t],w._eventHandlers=w._eventHandlers||{},w._eventHandlers[t]=x)}),r.ssr&&w._eventHandlers&&(w.props.src||w.props.href)&&(w.key=w.key||ul(w.props.src||w.props.href))},"dom:renderTag":function({$el:d,tag:w}){var t,x;for(const v of Object.keys((d==null?void 0:d.dataset)||{}).filter(s=>ic.some(u=>`${u}fired`===s))){const s=v.replace("fired","");(x=(t=w._eventHandlers)==null?void 0:t[s])==null||x.call(d,new Event(s.replace("on","")))}}}}),Jg=["link","style","script","noscript"],ev={hooks:{"tag:normalise":({tag:r})=>{r.key&&Jg.includes(r.tag)&&(r.props["data-hid"]=r._h=ul(r.key))}}},tv={hooks:{"tags:resolve":r=>{const d=w=>{var t;return(t=r.tags.find(x=>x._d===w))==null?void 0:t._p};for(const{prefix:w,offset:t}of Wg)for(const x of r.tags.filter(v=>typeof v.tagPriority=="string"&&v.tagPriority.startsWith(w))){const v=d(x.tagPriority.replace(w,""));typeof v<"u"&&(x._p=v+t)}r.tags.sort((w,t)=>w._p-t._p).sort((w,t)=>Qs(w)-Qs(t))}}},rv={meta:"content",link:"href",htmlAttrs:"lang"},nv=r=>({hooks:{"tags:resolve":d=>{var u;const{tags:w}=d,t=(u=w.find(o=>o.tag==="title"))==null?void 0:u.textContent,x=w.findIndex(o=>o.tag==="templateParams"),v=x!==-1?w[x].props:{},s=v.separator||"|";delete v.separator,v.pageTitle=Fs(v.pageTitle||t||"",v,s);for(const o of w.filter(c=>c.processTemplateParams!==!1)){const c=rv[o.tag];c&&typeof o.props[c]=="string"?o.props[c]=Fs(o.props[c],v,s):(o.processTemplateParams===!0||["titleTemplate","title"].includes(o.tag))&&["innerHTML","textContent"].forEach(g=>{typeof o[g]=="string"&&(o[g]=Fs(o[g],v,s))})}r._templateParams=v,r._separator=s,d.tags=w.filter(o=>o.tag!=="templateParams")}}}),ov={hooks:{"tags:resolve":r=>{const{tags:d}=r;let w=d.findIndex(x=>x.tag==="titleTemplate");const t=d.findIndex(x=>x.tag==="title");if(t!==-1&&w!==-1){const x=rc(d[w].textContent,d[t].textContent);x!==null?d[t].textContent=x||d[t].textContent:delete d[t]}else if(w!==-1){const x=rc(d[w].textContent);x!==null&&(d[w].textContent=x,d[w].tag="title",w=-1)}w!==-1&&delete d[w],r.tags=d.filter(Boolean)}}},sv={hooks:{"tags:afterResolve":function(r){for(const d of r.tags)typeof d.innerHTML=="string"&&(d.innerHTML&&["application/ld+json","application/json"].includes(d.props.type)?d.innerHTML=d.innerHTML.replace(/{u.dirty=!0,d.callHook("entries:updated",u)};let x=0,v=[];const s=[],u={plugins:s,dirty:!1,resolvedOptions:r,hooks:d,headEntries(){return v},use(o){const c=typeof o=="function"?o(u):o;(!c.key||!s.some(g=>g.key===c.key))&&(s.push(c),ac(c.mode,w)&&d.addHooks(c.hooks||{}))},push(o,c){c==null||delete c.head;const g={_i:x++,input:o,...c};return ac(g.mode,w)&&(v.push(g),t()),{dispose(){v=v.filter(p=>p._i!==g._i),d.callHook("entries:updated",u),t()},patch(p){v=v.map(n=>(n._i===g._i&&(n.input=g.input=p),n)),t()}}},async resolveTags(){const o={tags:[],entries:[...v]};await d.callHook("entries:resolve",o);for(const c of o.entries){const g=c.resolvedInput||c.input;if(c.resolvedInput=await(c.transform?c.transform(g):g),c.resolvedInput)for(const p of await zg(c)){const n={tag:p,entry:c,resolvedOptions:u.resolvedOptions};await d.callHook("tag:normalise",n),o.tags.push(n.tag)}}return await d.callHook("tags:beforeResolve",o),await d.callHook("tags:resolve",o),await d.callHook("tags:afterResolve",o),o.tags},ssr:w};return[$g,Kg,Qg,ev,tv,nv,ov,sv,...(r==null?void 0:r.plugins)||[]].forEach(o=>u.use(o)),u.hooks.callHook("init",u),u}function lv(){return Af}const uv=Jd.startsWith("3");function cv(r){return typeof r=="function"?r():Bt(r)}function Js(r,d=""){if(r instanceof Promise)return r;const w=cv(r);return!r||!w?w:Array.isArray(w)?w.map(t=>Js(t,d)):typeof w=="object"?Object.fromEntries(Object.entries(w).map(([t,x])=>t==="titleTemplate"||t.startsWith("on")?[t,Bt(x)]:[t,Js(x,t)])):w}const dv={hooks:{"entries:resolve":function(r){for(const d of r.entries)d.resolvedInput=Js(d.input)}}},Rf="usehead";function fv(r){return{install(w){uv&&(w.config.globalProperties.$unhead=r,w.config.globalProperties.$head=r,w.provide(Rf,r))}}.install}function hv(r={}){r.domDelayFn=r.domDelayFn||(w=>Dr(()=>setTimeout(()=>w(),0)));const d=iv(r);return d.use(dv),d.install=fv(d),d}const ka=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Ma="__unhead_injection_handler__";function pv(r){ka[Ma]=r}function mv(){if(Ma in ka)return ka[Ma]();const r=Ht(Rf);return r||lv()}function yv(r,d={}){const w=d.head||mv();if(w)return w.ssr?w.push(r,d):gv(w,r,d)}function gv(r,d,w={}){const t=mt(!1),x=mt({});an(()=>{x.value=t.value?{}:Js(d)});const v=r.push(x.value,w);return Ln(x,u=>{v.patch(u)}),So()&&(as(()=>{v.dispose()}),Td(()=>{t.value=!0}),Ed(()=>{t.value=!1})),v}function vv(r,d){const{title:w,titleTemplate:t,...x}=r;return yv({title:w,titleTemplate:t,_flatMeta:x},{...d,transform(v){const s=dl({...v._flatMeta});return delete v._flatMeta,{...v,meta:s}}})}const bv={nuxt:{buildId:"640f2415-89a1-4503-8629-242d808edc3c"}},_v=hg(bv);function Lf(){const r=It();return r._appConfig||(r._appConfig=Nn(_v)),r._appConfig}const wv=!1,Ca=!1,xv=!1,jv={componentName:"NuxtLink"},j_={deep:!0},S_={},Sv="#__nuxt";let Ns,If;function Ev(){var d;const r=(d=Lf().nuxt)==null?void 0:d.buildId;return Ns=$fetch(ll(`builds/meta/${r}.json`)),Ns.then(w=>{If=fg(w.matcher)}),Ns}function mi(){return Ns||Ev()}async function fl(r){return await mi(),vf({},...If.matchAll(r).reverse())}function lc(r,d={}){const w=kv(r,d),t=It(),x=t._payloadCache=t._payloadCache||{};return w in x||(x[w]=Mv(r).then(v=>v?Df(w).then(s=>s||(delete x[w],null)):(x[w]=null,null))),x[w]}const Tv="_payload.json";function kv(r,d={}){var x;const w=new URL(r,"http://localhost");if(w.host!=="localhost"||mn(w.pathname,{acceptRelative:!0}))throw new Error("Payload URL must not include hostname: "+r);const t=d.hash||(d.fresh?Date.now():(x=Lf().nuxt)==null?void 0:x.buildId);return ci(di().app.baseURL,w.pathname,Tv+(t?`?${t}`:""))}async function Df(r){const d=fetch(r).then(w=>w.text().then(Ff));try{return await d}catch(w){console.warn("[nuxt] Cannot load payload ",r,w)}return null}async function Mv(r=fi().path){if(r=ui(r),(await mi()).prerendered.includes(r))return!0;const w=await fl(r);return!!w.prerender&&!w.redirect}let Cs=null;async function Cv(){if(Cs)return Cs;const r=document.getElementById("__NUXT_DATA__");if(!r)return{};const d=await Ff(r.textContent||""),w=r.dataset.src?await Df(r.dataset.src):void 0;return Cs={...d,...w,...window.__NUXT__},Cs}async function Ff(r){return await Ag(r,It()._payloadRevivers)}function Ov(r,d){It()._payloadRevivers[r]=d}const uc={NuxtError:r=>pi(r),EmptyShallowRef:r=>$o(r==="_"?void 0:r==="0n"?BigInt(0):Xs(r)),EmptyRef:r=>mt(r==="_"?void 0:r==="0n"?BigInt(0):Xs(r)),ShallowRef:r=>$o(r),ShallowReactive:r=>ss(r),Ref:r=>mt(r),Reactive:r=>Nn(r)},Pv=yn({name:"nuxt:revive-payload:client",order:-30,async setup(r){let d,w;for(const t in uc)Ov(t,uc[t]);Object.assign(r.payload,([d,w]=es(()=>r.runWithContext(Cv)),d=await d,w(),d)),window.__NUXT__=r.payload}}),Av=[],Rv=yn({name:"nuxt:head",enforce:"pre",setup(r){const d=hv({plugins:Av});pv(()=>It().vueApp._context.provides.usehead),r.vueApp.use(d);{let w=!0;const t=async()=>{w=!1,await Pf(d)};d.hooks.hook("dom:beforeRender",x=>{x.shouldRender=!w}),r.hooks.hook("page:start",()=>{w=!0}),r.hooks.hook("page:finish",()=>{r.isHydrating||t()}),r.hooks.hook("app:error",t),r.hooks.hook("app:suspense:resolve",t)}}});/*! +**/const Tm="http://www.w3.org/2000/svg",km="http://www.w3.org/1998/Math/MathML",Mn=typeof document<"u"?document:null,Pu=Mn&&Mn.createElement("template"),Mm={insert:(r,d,w)=>{d.insertBefore(r,w||null)},remove:r=>{const d=r.parentNode;d&&d.removeChild(r)},createElement:(r,d,w,t)=>{const x=d==="svg"?Mn.createElementNS(Tm,r):d==="mathml"?Mn.createElementNS(km,r):Mn.createElement(r,w?{is:w}:void 0);return r==="select"&&t&&t.multiple!=null&&x.setAttribute("multiple",t.multiple),x},createText:r=>Mn.createTextNode(r),createComment:r=>Mn.createComment(r),setText:(r,d)=>{r.nodeValue=d},setElementText:(r,d)=>{r.textContent=d},parentNode:r=>r.parentNode,nextSibling:r=>r.nextSibling,querySelector:r=>Mn.querySelector(r),setScopeId(r,d){r.setAttribute(d,"")},insertStaticContent(r,d,w,t,x,v){const s=w?w.previousSibling:d.lastChild;if(x&&(x===v||x.nextSibling))for(;d.insertBefore(x.cloneNode(!0),w),!(x===v||!(x=x.nextSibling)););else{Pu.innerHTML=t==="svg"?`${r}`:t==="mathml"?`${r}`:r;const u=Pu.content;if(t==="svg"||t==="mathml"){const o=u.firstChild;for(;o.firstChild;)u.appendChild(o.firstChild);u.removeChild(o)}d.insertBefore(u,w)}return[s?s.nextSibling:d.firstChild,w?w.previousSibling:d.lastChild]}},xn="transition",Io="animation",Jo=Symbol("_vtc"),cs=(r,{slots:d})=>tr(Gp,Cm(r),d);cs.displayName="Transition";const ef={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};cs.props=Yt({},xd,ef);const Bn=(r,d=[])=>{st(r)?r.forEach(w=>w(...d)):r&&r(...d)},Au=r=>r?st(r)?r.some(d=>d.length>1):r.length>1:!1;function Cm(r){const d={};for(const I in r)I in ef||(d[I]=r[I]);if(r.css===!1)return d;const{name:w="v",type:t,duration:x,enterFromClass:v=`${w}-enter-from`,enterActiveClass:s=`${w}-enter-active`,enterToClass:u=`${w}-enter-to`,appearFromClass:o=v,appearActiveClass:c=s,appearToClass:g=u,leaveFromClass:p=`${w}-leave-from`,leaveActiveClass:n=`${w}-leave-active`,leaveToClass:i=`${w}-leave-to`}=r,a=Om(x),h=a&&a[0],y=a&&a[1],{onBeforeEnter:l,onEnter:f,onEnterCancelled:m,onLeave:b,onLeaveCancelled:j,onBeforeAppear:k=l,onAppear:E=f,onAppearCancelled:M=m}=d,P=(I,A,N)=>{Gn(I,A?g:u),Gn(I,A?c:s),N&&N()},L=(I,A)=>{I._isLeaving=!1,Gn(I,p),Gn(I,i),Gn(I,n),A&&A()},C=I=>(A,N)=>{const F=I?E:f,B=()=>P(A,I,N);Bn(F,[A,B]),Ru(()=>{Gn(A,I?o:v),jn(A,I?g:u),Au(F)||Lu(A,t,h,B)})};return Yt(d,{onBeforeEnter(I){Bn(l,[I]),jn(I,v),jn(I,s)},onBeforeAppear(I){Bn(k,[I]),jn(I,o),jn(I,c)},onEnter:C(!1),onAppear:C(!0),onLeave(I,A){I._isLeaving=!0;const N=()=>L(I,A);jn(I,p),jn(I,n),Rm(),Ru(()=>{I._isLeaving&&(Gn(I,p),jn(I,i),Au(b)||Lu(I,t,y,N))}),Bn(b,[I,N])},onEnterCancelled(I){P(I,!1),Bn(m,[I])},onAppearCancelled(I){P(I,!0),Bn(M,[I])},onLeaveCancelled(I){L(I),Bn(j,[I])}})}function Om(r){if(r==null)return null;if(Ct(r))return[Fi(r.enter),Fi(r.leave)];{const d=Fi(r);return[d,d]}}function Fi(r){return Hc(r)}function jn(r,d){d.split(/\s+/).forEach(w=>w&&r.classList.add(w)),(r[Jo]||(r[Jo]=new Set)).add(d)}function Gn(r,d){d.split(/\s+/).forEach(t=>t&&r.classList.remove(t));const w=r[Jo];w&&(w.delete(d),w.size||(r[Jo]=void 0))}function Ru(r){requestAnimationFrame(()=>{requestAnimationFrame(r)})}let Pm=0;function Lu(r,d,w,t){const x=r._endId=++Pm,v=()=>{x===r._endId&&t()};if(w)return setTimeout(v,w);const{type:s,timeout:u,propCount:o}=Am(r,d);if(!s)return t();const c=s+"end";let g=0;const p=()=>{r.removeEventListener(c,n),v()},n=i=>{i.target===r&&++g>=o&&p()};setTimeout(()=>{g(w[a]||"").split(", "),x=t(`${xn}Delay`),v=t(`${xn}Duration`),s=Iu(x,v),u=t(`${Io}Delay`),o=t(`${Io}Duration`),c=Iu(u,o);let g=null,p=0,n=0;d===xn?s>0&&(g=xn,p=s,n=v.length):d===Io?c>0&&(g=Io,p=c,n=o.length):(p=Math.max(s,c),g=p>0?s>c?xn:Io:null,n=g?g===xn?v.length:o.length:0);const i=g===xn&&/\b(transform|all)(,|$)/.test(t(`${xn}Property`).toString());return{type:g,timeout:p,propCount:n,hasTransform:i}}function Iu(r,d){for(;r.lengthDu(w)+Du(r[t])))}function Du(r){return r==="auto"?0:Number(r.slice(0,-1).replace(",","."))*1e3}function Rm(){return document.body.offsetHeight}function Lm(r,d,w){const t=r[Jo];t&&(d=(d?[d,...t]:[...t]).join(" ")),d==null?r.removeAttribute("class"):w?r.setAttribute("class",d):r.className=d}const Fu=Symbol("_vod"),Im=Symbol("_vsh"),Dm=Symbol(""),Fm=/(^|;)\s*display\s*:/;function Nm(r,d,w){const t=r.style,x=Gt(w);let v=!1;if(w&&!x){if(d)if(Gt(d))for(const s of d.split(";")){const u=s.slice(0,s.indexOf(":")).trim();w[u]==null&&Is(t,u,"")}else for(const s in d)w[s]==null&&Is(t,s,"");for(const s in w)s==="display"&&(v=!0),Is(t,s,w[s])}else if(x){if(d!==w){const s=t[Dm];s&&(w+=";"+s),t.cssText=w,v=Fm.test(w)}}else d&&r.removeAttribute("style");Fu in r&&(r[Fu]=v?t.display:"",r[Im]&&(t.display="none"))}const Nu=/\s*!important$/;function Is(r,d,w){if(st(w))w.forEach(t=>Is(r,d,t));else if(w==null&&(w=""),d.startsWith("--"))r.setProperty(d,w);else{const t=Um(r,d);Nu.test(w)?r.setProperty(xo(t),w.replace(Nu,""),"important"):r[t]=w}}const Uu=["Webkit","Moz","ms"],Ni={};function Um(r,d){const w=Ni[d];if(w)return w;let t=sn(d);if(t!=="filter"&&t in r)return Ni[d]=t;t=ri(t);for(let x=0;xUi||(Wm.then(()=>Ui=0),Ui=Date.now());function Xm(r,d){const w=t=>{if(!t._vts)t._vts=Date.now();else if(t._vts<=w.attached)return;Hr(Ym(t,w.value),d,5,[t])};return w.value=r,w.attached=qm(),w}function Ym(r,d){if(st(d)){const w=r.stopImmediatePropagation;return r.stopImmediatePropagation=()=>{w.call(r),r._stopped=!0},d.map(t=>x=>!x._stopped&&t&&t(x))}else return d}const Hu=r=>r.charCodeAt(0)===111&&r.charCodeAt(1)===110&&r.charCodeAt(2)>96&&r.charCodeAt(2)<123,$m=(r,d,w,t,x,v,s,u,o)=>{const c=x==="svg";d==="class"?Lm(r,t,c):d==="style"?Nm(r,w,t):ns(d)?Ua(d)||Hm(r,d,w,t,s):(d[0]==="."?(d=d.slice(1),!0):d[0]==="^"?(d=d.slice(1),!1):Km(r,d,t,c))?Gm(r,d,t,v,s,u,o):(d==="true-value"?r._trueValue=t:d==="false-value"&&(r._falseValue=t),Bm(r,d,t,c))};function Km(r,d,w,t){if(t)return!!(d==="innerHTML"||d==="textContent"||d in r&&Hu(d)&&at(w));if(d==="spellcheck"||d==="draggable"||d==="translate"||d==="form"||d==="list"&&r.tagName==="INPUT"||d==="type"&&r.tagName==="TEXTAREA")return!1;if(d==="width"||d==="height"){const x=r.tagName;if(x==="IMG"||x==="VIDEO"||x==="CANVAS"||x==="SOURCE")return!1}return Hu(d)&&Gt(w)?!1:d in r}const zu=r=>{const d=r.props["onUpdate:modelValue"]||!1;return st(d)?w=>fo(d,w):d};function Zm(r){r.target.composing=!0}function Wu(r){const d=r.target;d.composing&&(d.composing=!1,d.dispatchEvent(new Event("input")))}const Bi=Symbol("_assign"),x_={created(r,{modifiers:{lazy:d,trim:w,number:t}},x){r[Bi]=zu(x);const v=t||x.props&&x.props.type==="number";oo(r,d?"change":"input",s=>{if(s.target.composing)return;let u=r.value;w&&(u=u.trim()),v&&(u=ra(u)),r[Bi](u)}),w&&oo(r,"change",()=>{r.value=r.value.trim()}),d||(oo(r,"compositionstart",Zm),oo(r,"compositionend",Wu),oo(r,"change",Wu))},mounted(r,{value:d}){r.value=d??""},beforeUpdate(r,{value:d,modifiers:{lazy:w,trim:t,number:x}},v){if(r[Bi]=zu(v),r.composing)return;const s=(x||r.type==="number")&&!/^0\d/.test(r.value)?ra(r.value):r.value,u=d??"";s!==u&&(document.activeElement===r&&r.type!=="range"&&(w||t&&r.value.trim()===u)||(r.value=u))}},tf=Yt({patchProp:$m},Mm);let zo,qu=!1;function Qm(){return zo||(zo=hm(tf))}function Jm(){return zo=qu?zo:pm(tf),qu=!0,zo}const ey=(...r)=>{const d=Qm().createApp(...r),{mount:w}=d;return d.mount=t=>{const x=nf(t);if(!x)return;const v=d._component;!at(v)&&!v.render&&!v.template&&(v.template=x.innerHTML),x.innerHTML="";const s=w(x,!1,rf(x));return x instanceof Element&&(x.removeAttribute("v-cloak"),x.setAttribute("data-v-app","")),s},d},ty=(...r)=>{const d=Jm().createApp(...r),{mount:w}=d;return d.mount=t=>{const x=nf(t);if(x)return w(x,!0,rf(x))},d};function rf(r){if(r instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&r instanceof MathMLElement)return"mathml"}function nf(r){return Gt(r)?document.querySelector(r):r}const ry=/"(?:_|\\u0{2}5[Ff]){2}(?:p|\\u0{2}70)(?:r|\\u0{2}72)(?:o|\\u0{2}6[Ff])(?:t|\\u0{2}74)(?:o|\\u0{2}6[Ff])(?:_|\\u0{2}5[Ff]){2}"\s*:/,ny=/"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/,oy=/^\s*["[{]|^\s*-?\d{1,16}(\.\d{1,17})?([Ee][+-]?\d+)?\s*$/;function sy(r,d){if(r==="__proto__"||r==="constructor"&&d&&typeof d=="object"&&"prototype"in d){iy(r);return}return d}function iy(r){console.warn(`[destr] Dropping "${r}" key to prevent prototype pollution.`)}function Xs(r,d={}){if(typeof r!="string")return r;const w=r.trim();if(r[0]==='"'&&r.endsWith('"')&&!r.includes("\\"))return w.slice(1,-1);if(w.length<=9){const t=w.toLowerCase();if(t==="true")return!0;if(t==="false")return!1;if(t==="undefined")return;if(t==="null")return null;if(t==="nan")return Number.NaN;if(t==="infinity")return Number.POSITIVE_INFINITY;if(t==="-infinity")return Number.NEGATIVE_INFINITY}if(!oy.test(r)){if(d.strict)throw new SyntaxError("[destr] Invalid JSON");return r}try{if(ry.test(r)||ny.test(r)){if(d.strict)throw new Error("[destr] Possible prototype pollution");return JSON.parse(r,sy)}return JSON.parse(r)}catch(t){if(d.strict)throw t;return r}}const ay=/#/g,ly=/&/g,uy=/\//g,cy=/=/g,il=/\+/g,dy=/%5e/gi,fy=/%60/gi,hy=/%7c/gi,py=/%20/gi;function my(r){return encodeURI(""+r).replace(hy,"|")}function va(r){return my(typeof r=="string"?r:JSON.stringify(r)).replace(il,"%2B").replace(py,"+").replace(ay,"%23").replace(ly,"%26").replace(fy,"`").replace(dy,"^").replace(uy,"%2F")}function Gi(r){return va(r).replace(cy,"%3D")}function Ys(r=""){try{return decodeURIComponent(""+r)}catch{return""+r}}function yy(r){return Ys(r.replace(il," "))}function gy(r){return Ys(r.replace(il," "))}function of(r=""){const d={};r[0]==="?"&&(r=r.slice(1));for(const w of r.split("&")){const t=w.match(/([^=]+)=?(.*)/)||[];if(t.length<2)continue;const x=yy(t[1]);if(x==="__proto__"||x==="constructor")continue;const v=gy(t[2]||"");d[x]===void 0?d[x]=v:Array.isArray(d[x])?d[x].push(v):d[x]=[d[x],v]}return d}function vy(r,d){return(typeof d=="number"||typeof d=="boolean")&&(d=String(d)),d?Array.isArray(d)?d.map(w=>`${Gi(r)}=${va(w)}`).join("&"):`${Gi(r)}=${va(d)}`:Gi(r)}function by(r){return Object.keys(r).filter(d=>r[d]!==void 0).map(d=>vy(d,r[d])).filter(Boolean).join("&")}const _y=/^[\s\w\0+.-]{2,}:([/\\]{1,2})/,wy=/^[\s\w\0+.-]{2,}:([/\\]{2})?/,xy=/^([/\\]\s*){2,}[^/\\]/,jy=/^[\s\0]*(blob|data|javascript|vbscript):$/i,Sy=/\/$|\/\?|\/#/,Ey=/^\.?\//;function mn(r,d={}){return typeof d=="boolean"&&(d={acceptRelative:d}),d.strict?_y.test(r):wy.test(r)||(d.acceptRelative?xy.test(r):!1)}function Ty(r){return!!r&&jy.test(r)}function ba(r="",d){return d?Sy.test(r):r.endsWith("/")}function ui(r="",d){if(!d)return(ba(r)?r.slice(0,-1):r)||"/";if(!ba(r,!0))return r||"/";let w=r,t="";const x=r.indexOf("#");x>=0&&(w=r.slice(0,x),t=r.slice(x));const[v,...s]=w.split("?");return((v.endsWith("/")?v.slice(0,-1):v)||"/")+(s.length>0?`?${s.join("?")}`:"")+t}function $s(r="",d){if(!d)return r.endsWith("/")?r:r+"/";if(ba(r,!0))return r||"/";let w=r,t="";const x=r.indexOf("#");if(x>=0&&(w=r.slice(0,x),t=r.slice(x),!w))return t;const[v,...s]=w.split("?");return v+"/"+(s.length>0?`?${s.join("?")}`:"")+t}function ky(r=""){return r.startsWith("/")}function Xu(r=""){return ky(r)?r:"/"+r}function My(r,d){if(af(d)||mn(r))return r;const w=ui(d);return r.startsWith(w)?r:ci(w,r)}function Yu(r,d){if(af(d))return r;const w=ui(d);if(!r.startsWith(w))return r;const t=r.slice(w.length);return t[0]==="/"?t:"/"+t}function sf(r,d){const w=ds(r),t={...of(w.search),...d};return w.search=by(t),Py(w)}function af(r){return!r||r==="/"}function Cy(r){return r&&r!=="/"}function ci(r,...d){let w=r||"";for(const t of d.filter(x=>Cy(x)))if(w){const x=t.replace(Ey,"");w=$s(w)+x}else w=t;return w}function lf(...r){var s,u,o,c;const d=/\/(?!\/)/,w=r.filter(Boolean),t=[];let x=0;for(const g of w)if(!(!g||g==="/")){for(const[p,n]of g.split(d).entries())if(!(!n||n===".")){if(n===".."){if(t.length===1&&mn(t[0]))continue;t.pop(),x--;continue}if(p===1&&((s=t[t.length-1])!=null&&s.endsWith(":/"))){t[t.length-1]+="/"+n;continue}t.push(n),x++}}let v=t.join("/");return x>=0?(u=w[0])!=null&&u.startsWith("/")&&!v.startsWith("/")?v="/"+v:(o=w[0])!=null&&o.startsWith("./")&&!v.startsWith("./")&&(v="./"+v):v="../".repeat(-1*x)+v,(c=w[w.length-1])!=null&&c.endsWith("/")&&!v.endsWith("/")&&(v+="/"),v}function Oy(r,d,w={}){return w.trailingSlash||(r=$s(r),d=$s(d)),w.leadingSlash||(r=Xu(r),d=Xu(d)),w.encoding||(r=Ys(r),d=Ys(d)),r===d}const uf=Symbol.for("ufo:protocolRelative");function ds(r="",d){const w=r.match(/^[\s\0]*(blob:|data:|javascript:|vbscript:)(.*)/i);if(w){const[,p,n=""]=w;return{protocol:p.toLowerCase(),pathname:n,href:p+n,auth:"",host:"",search:"",hash:""}}if(!mn(r,{acceptRelative:!0}))return d?ds(d+r):$u(r);const[,t="",x,v=""]=r.replace(/\\/g,"/").match(/^[\s\0]*([\w+.-]{2,}:)?\/\/([^/@]+@)?(.*)/)||[],[,s="",u=""]=v.match(/([^#/?]*)(.*)?/)||[],{pathname:o,search:c,hash:g}=$u(u.replace(/\/(?=[A-Za-z]:)/,""));return{protocol:t.toLowerCase(),auth:x?x.slice(0,Math.max(0,x.length-1)):"",host:s,pathname:o,search:c,hash:g,[uf]:!t}}function $u(r=""){const[d="",w="",t=""]=(r.match(/([^#?]*)(\?[^#]*)?(#.*)?/)||[]).splice(1);return{pathname:d,search:w,hash:t}}function Py(r){const d=r.pathname||"",w=r.search?(r.search.startsWith("?")?"":"?")+r.search:"",t=r.hash||"",x=r.auth?r.auth+"@":"",v=r.host||"";return(r.protocol||r[uf]?(r.protocol||"")+"//":"")+x+v+d+w+t}class Ay extends Error{constructor(d,w){super(d,w),this.name="FetchError",w!=null&&w.cause&&!this.cause&&(this.cause=w.cause)}}function Ry(r){var o,c,g,p,n;const d=((o=r.error)==null?void 0:o.message)||((c=r.error)==null?void 0:c.toString())||"",w=((g=r.request)==null?void 0:g.method)||((p=r.options)==null?void 0:p.method)||"GET",t=((n=r.request)==null?void 0:n.url)||String(r.request)||"/",x=`[${w}] ${JSON.stringify(t)}`,v=r.response?`${r.response.status} ${r.response.statusText}`:"",s=`${x}: ${v}${d?` ${d}`:""}`,u=new Ay(s,r.error?{cause:r.error}:void 0);for(const i of["request","options","response"])Object.defineProperty(u,i,{get(){return r[i]}});for(const[i,a]of[["data","_data"],["status","status"],["statusCode","status"],["statusText","statusText"],["statusMessage","statusText"]])Object.defineProperty(u,i,{get(){return r.response&&r.response[a]}});return u}const Ly=new Set(Object.freeze(["PATCH","POST","PUT","DELETE"]));function Ku(r="GET"){return Ly.has(r.toUpperCase())}function Iy(r){if(r===void 0)return!1;const d=typeof r;return d==="string"||d==="number"||d==="boolean"||d===null?!0:d!=="object"?!1:Array.isArray(r)?!0:r.buffer?!1:r.constructor&&r.constructor.name==="Object"||typeof r.toJSON=="function"}const Dy=new Set(["image/svg","application/xml","application/xhtml","application/html"]),Fy=/^application\/(?:[\w!#$%&*.^`~-]*\+)?json(;.+)?$/i;function Ny(r=""){if(!r)return"json";const d=r.split(";").shift()||"";return Fy.test(d)?"json":Dy.has(d)||d.startsWith("text/")?"text":"blob"}function Uy(r,d,w=globalThis.Headers){const t={...d,...r};if(d!=null&&d.params&&(r!=null&&r.params)&&(t.params={...d==null?void 0:d.params,...r==null?void 0:r.params}),d!=null&&d.query&&(r!=null&&r.query)&&(t.query={...d==null?void 0:d.query,...r==null?void 0:r.query}),d!=null&&d.headers&&(r!=null&&r.headers)){t.headers=new w((d==null?void 0:d.headers)||{});for(const[x,v]of new w((r==null?void 0:r.headers)||{}))t.headers.set(x,v)}return t}const By=new Set([408,409,425,429,500,502,503,504]),Gy=new Set([101,204,205,304]);function cf(r={}){const{fetch:d=globalThis.fetch,Headers:w=globalThis.Headers,AbortController:t=globalThis.AbortController}=r;async function x(u){const o=u.error&&u.error.name==="AbortError"&&!u.options.timeout||!1;if(u.options.retry!==!1&&!o){let g;typeof u.options.retry=="number"?g=u.options.retry:g=Ku(u.options.method)?0:1;const p=u.response&&u.response.status||500;if(g>0&&(Array.isArray(u.options.retryStatusCodes)?u.options.retryStatusCodes.includes(p):By.has(p))){const n=u.options.retryDelay||0;return n>0&&await new Promise(i=>setTimeout(i,n)),v(u.request,{...u.options,retry:g-1})}}const c=Ry(u);throw Error.captureStackTrace&&Error.captureStackTrace(c,v),c}const v=async function(o,c={}){var i;const g={request:o,options:Uy(c,r.defaults,w),response:void 0,error:void 0};g.options.method=(i=g.options.method)==null?void 0:i.toUpperCase(),g.options.onRequest&&await g.options.onRequest(g),typeof g.request=="string"&&(g.options.baseURL&&(g.request=My(g.request,g.options.baseURL)),(g.options.query||g.options.params)&&(g.request=sf(g.request,{...g.options.params,...g.options.query}))),g.options.body&&Ku(g.options.method)&&(Iy(g.options.body)?(g.options.body=typeof g.options.body=="string"?g.options.body:JSON.stringify(g.options.body),g.options.headers=new w(g.options.headers||{}),g.options.headers.has("content-type")||g.options.headers.set("content-type","application/json"),g.options.headers.has("accept")||g.options.headers.set("accept","application/json")):("pipeTo"in g.options.body&&typeof g.options.body.pipeTo=="function"||typeof g.options.body.pipe=="function")&&("duplex"in g.options||(g.options.duplex="half")));let p;if(!g.options.signal&&g.options.timeout){const a=new t;p=setTimeout(()=>a.abort(),g.options.timeout),g.options.signal=a.signal}try{g.response=await d(g.request,g.options)}catch(a){return g.error=a,g.options.onRequestError&&await g.options.onRequestError(g),await x(g)}finally{p&&clearTimeout(p)}if(g.response.body&&!Gy.has(g.response.status)&&g.options.method!=="HEAD"){const a=(g.options.parseResponse?"json":g.options.responseType)||Ny(g.response.headers.get("content-type")||"");switch(a){case"json":{const h=await g.response.text(),y=g.options.parseResponse||Xs;g.response._data=y(h);break}case"stream":{g.response._data=g.response.body;break}default:g.response._data=await g.response[a]()}}return g.options.onResponse&&await g.options.onResponse(g),!g.options.ignoreResponseError&&g.response.status>=400&&g.response.status<600?(g.options.onResponseError&&await g.options.onResponseError(g),await x(g)):g.response},s=async function(o,c){return(await v(o,c))._data};return s.raw=v,s.native=(...u)=>d(...u),s.create=(u={})=>cf({...r,defaults:{...r.defaults,...u}}),s}const al=function(){if(typeof globalThis<"u")return globalThis;if(typeof self<"u")return self;if(typeof window<"u")return window;if(typeof global<"u")return global;throw new Error("unable to locate global object")}(),Vy=al.fetch||(()=>Promise.reject(new Error("[ofetch] global.fetch is not supported!"))),Hy=al.Headers,zy=al.AbortController,Wy=cf({fetch:Vy,Headers:Hy,AbortController:zy}),qy=Wy,Xy=()=>{var r;return((r=window==null?void 0:window.__NUXT__)==null?void 0:r.config)||{}},Ks=Xy().app,Yy=()=>Ks.baseURL,$y=()=>Ks.buildAssetsDir,ll=(...r)=>lf(df(),$y(),...r),df=(...r)=>{const d=Ks.cdnURL||Ks.baseURL;return r.length?lf(d,...r):d};globalThis.__buildAssetsURL=ll,globalThis.__publicAssetsURL=df;globalThis.$fetch||(globalThis.$fetch=qy.create({baseURL:Yy()}));function _a(r,d={},w){for(const t in r){const x=r[t],v=w?`${w}:${t}`:t;typeof x=="object"&&x!==null?_a(x,d,v):typeof x=="function"&&(d[v]=x)}return d}const Ky={run:r=>r()},Zy=()=>Ky,ff=typeof console.createTask<"u"?console.createTask:Zy;function Qy(r,d){const w=d.shift(),t=ff(w);return r.reduce((x,v)=>x.then(()=>t.run(()=>v(...d))),Promise.resolve())}function Jy(r,d){const w=d.shift(),t=ff(w);return Promise.all(r.map(x=>t.run(()=>x(...d))))}function Vi(r,d){for(const w of[...r])w(d)}class eg{constructor(){this._hooks={},this._before=void 0,this._after=void 0,this._deprecatedMessages=void 0,this._deprecatedHooks={},this.hook=this.hook.bind(this),this.callHook=this.callHook.bind(this),this.callHookWith=this.callHookWith.bind(this)}hook(d,w,t={}){if(!d||typeof w!="function")return()=>{};const x=d;let v;for(;this._deprecatedHooks[d];)v=this._deprecatedHooks[d],d=v.to;if(v&&!t.allowDeprecated){let s=v.message;s||(s=`${x} hook has been deprecated`+(v.to?`, please use ${v.to}`:"")),this._deprecatedMessages||(this._deprecatedMessages=new Set),this._deprecatedMessages.has(s)||(console.warn(s),this._deprecatedMessages.add(s))}if(!w.name)try{Object.defineProperty(w,"name",{get:()=>"_"+d.replace(/\W+/g,"_")+"_hook_cb",configurable:!0})}catch{}return this._hooks[d]=this._hooks[d]||[],this._hooks[d].push(w),()=>{w&&(this.removeHook(d,w),w=void 0)}}hookOnce(d,w){let t,x=(...v)=>(typeof t=="function"&&t(),t=void 0,x=void 0,w(...v));return t=this.hook(d,x),t}removeHook(d,w){if(this._hooks[d]){const t=this._hooks[d].indexOf(w);t!==-1&&this._hooks[d].splice(t,1),this._hooks[d].length===0&&delete this._hooks[d]}}deprecateHook(d,w){this._deprecatedHooks[d]=typeof w=="string"?{to:w}:w;const t=this._hooks[d]||[];delete this._hooks[d];for(const x of t)this.hook(d,x)}deprecateHooks(d){Object.assign(this._deprecatedHooks,d);for(const w in d)this.deprecateHook(w,d[w])}addHooks(d){const w=_a(d),t=Object.keys(w).map(x=>this.hook(x,w[x]));return()=>{for(const x of t.splice(0,t.length))x()}}removeHooks(d){const w=_a(d);for(const t in w)this.removeHook(t,w[t])}removeAllHooks(){for(const d in this._hooks)delete this._hooks[d]}callHook(d,...w){return w.unshift(d),this.callHookWith(Qy,d,...w)}callHookParallel(d,...w){return w.unshift(d),this.callHookWith(Jy,d,...w)}callHookWith(d,w,...t){const x=this._before||this._after?{name:w,args:t,context:{}}:void 0;this._before&&Vi(this._before,x);const v=d(w in this._hooks?[...this._hooks[w]]:[],t);return v instanceof Promise?v.finally(()=>{this._after&&x&&Vi(this._after,x)}):(this._after&&x&&Vi(this._after,x),v)}beforeEach(d){return this._before=this._before||[],this._before.push(d),()=>{if(this._before!==void 0){const w=this._before.indexOf(d);w!==-1&&this._before.splice(w,1)}}}afterEach(d){return this._after=this._after||[],this._after.push(d),()=>{if(this._after!==void 0){const w=this._after.indexOf(d);w!==-1&&this._after.splice(w,1)}}}}function hf(){return new eg}function tg(r={}){let d,w=!1;const t=s=>{if(d&&d!==s)throw new Error("Context conflict")};let x;if(r.asyncContext){const s=r.AsyncLocalStorage||globalThis.AsyncLocalStorage;s?x=new s:console.warn("[unctx] `AsyncLocalStorage` is not provided.")}const v=()=>{if(x&&d===void 0){const s=x.getStore();if(s!==void 0)return s}return d};return{use:()=>{const s=v();if(s===void 0)throw new Error("Context is not available");return s},tryUse:()=>v(),set:(s,u)=>{u||t(s),d=s,w=!0},unset:()=>{d=void 0,w=!1},call:(s,u)=>{t(s),d=s;try{return x?x.run(s,u):u()}finally{w||(d=void 0)}},async callAsync(s,u){d=s;const o=()=>{d=s},c=()=>d===s?o:void 0;wa.add(c);try{const g=x?x.run(s,u):u();return w||(d=void 0),await g}finally{wa.delete(c)}}}}function rg(r={}){const d={};return{get(w,t={}){return d[w]||(d[w]=tg({...r,...t})),d[w],d[w]}}}const Zs=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof global<"u"?global:typeof window<"u"?window:{},Zu="__unctx__",ng=Zs[Zu]||(Zs[Zu]=rg()),og=(r,d={})=>ng.get(r,d),Qu="__unctx_async_handlers__",wa=Zs[Qu]||(Zs[Qu]=new Set);function es(r){const d=[];for(const x of wa){const v=x();v&&d.push(v)}const w=()=>{for(const x of d)x()};let t=r();return t&&typeof t=="object"&&"catch"in t&&(t=t.catch(x=>{throw w(),x})),[t,w]}const pf=og("nuxt-app",{asyncContext:!1}),sg="__nuxt_plugin";function ig(r){let d=0;const w={_scope:Vh(),provide:void 0,globalName:"nuxt",versions:{get nuxt(){return"3.11.2"},get vue(){return w.vueApp.version}},payload:Nn({data:{},state:{},once:new Set,_errors:{},...window.__NUXT__??{}}),static:{data:{}},runWithContext:x=>w._scope.run(()=>ug(w,x)),isHydrating:!0,deferHydration(){if(!w.isHydrating)return()=>{};d++;let x=!1;return()=>{if(!x&&(x=!0,d--,d===0))return w.isHydrating=!1,w.callHook("app:suspense:resolve")}},_asyncDataPromises:{},_asyncData:{},_payloadRevivers:{},...r};w.hooks=hf(),w.hook=w.hooks.hook,w.callHook=w.hooks.callHook,w.provide=(x,v)=>{const s="$"+x;Ms(w,s,v),Ms(w.vueApp.config.globalProperties,s,v)},Ms(w.vueApp,"$nuxt",w),Ms(w.vueApp.config.globalProperties,"$nuxt",w);{window.addEventListener("nuxt.preloadError",v=>{w.callHook("app:chunkError",{error:v.payload})}),window.useNuxtApp=window.useNuxtApp||It;const x=w.hook("app:error",(...v)=>{console.error("[nuxt] error caught during app initialization",...v)});w.hook("app:mounted",x)}const t=w.payload.config;return w.provide("config",t),w}async function ag(r,d){if(d.hooks&&r.hooks.addHooks(d.hooks),typeof d=="function"){const{provide:w}=await r.runWithContext(()=>d(r))||{};if(w&&typeof w=="object")for(const t in w)r.provide(t,w[t])}}async function lg(r,d){const w=[],t=[],x=[],v=[];let s=0;async function u(o){var g;const c=((g=o.dependsOn)==null?void 0:g.filter(p=>d.some(n=>n._name===p)&&!w.includes(p)))??[];if(c.length>0)t.push([new Set(c),o]);else{const p=ag(r,o).then(async()=>{o._name&&(w.push(o._name),await Promise.all(t.map(async([n,i])=>{n.has(o._name)&&(n.delete(o._name),n.size===0&&(s++,await u(i)))})))});o.parallel?x.push(p.catch(n=>v.push(n))):await p}}for(const o of d)await u(o);if(await Promise.all(x),s)for(let o=0;o{}),r,{[sg]:!0,_name:d})}function ug(r,d,w){const t=()=>d();return pf.set(r),r.vueApp.runWithContext(t)}function cg(){var d;let r;return Rd()&&(r=(d=So())==null?void 0:d.appContext.app.$nuxt),r=r||pf.tryUse(),r||null}function It(){const r=cg();if(!r)throw new Error("[nuxt] instance unavailable");return r}function di(r){return It().$config}function Ms(r,d,w){Object.defineProperty(r,d,{get:()=>w})}function dg(r,d){return{ctx:{table:r},matchAll:w=>yf(w,r)}}function mf(r){const d={};for(const w in r)d[w]=w==="dynamic"?new Map(Object.entries(r[w]).map(([t,x])=>[t,mf(x)])):new Map(Object.entries(r[w]));return d}function fg(r){return dg(mf(r))}function yf(r,d,w){r.endsWith("/")&&(r=r.slice(0,-1)||"/");const t=[];for(const[v,s]of Ju(d.wildcard))(r===v||r.startsWith(v+"/"))&&t.push(s);for(const[v,s]of Ju(d.dynamic))if(r.startsWith(v+"/")){const u="/"+r.slice(v.length).split("/").splice(2).join("/");t.push(...yf(u,s))}const x=d.static.get(r);return x&&t.push(x),t.filter(Boolean)}function Ju(r){return[...r.entries()].sort((d,w)=>d[0].length-w[0].length)}function Hi(r){if(r===null||typeof r!="object")return!1;const d=Object.getPrototypeOf(r);return d!==null&&d!==Object.prototype&&Object.getPrototypeOf(d)!==null||Symbol.iterator in r?!1:Symbol.toStringTag in r?Object.prototype.toString.call(r)==="[object Module]":!0}function xa(r,d,w=".",t){if(!Hi(d))return xa(r,{},w,t);const x=Object.assign({},d);for(const v in r){if(v==="__proto__"||v==="constructor")continue;const s=r[v];s!=null&&(t&&t(x,v,s,w)||(Array.isArray(s)&&Array.isArray(x[v])?x[v]=[...s,...x[v]]:Hi(s)&&Hi(x[v])?x[v]=xa(s,x[v],(w?`${w}.`:"")+v.toString(),t):x[v]=s))}return x}function gf(r){return(...d)=>d.reduce((w,t)=>xa(w,t,"",r),{})}const vf=gf(),hg=gf((r,d,w)=>{if(r[d]!==void 0&&typeof w=="function")return r[d]=w(r[d]),!0});function pg(r,d){try{return d in r}catch{return!1}}var mg=Object.defineProperty,yg=(r,d,w)=>d in r?mg(r,d,{enumerable:!0,configurable:!0,writable:!0,value:w}):r[d]=w,Hn=(r,d,w)=>(yg(r,typeof d!="symbol"?d+"":d,w),w);class ja extends Error{constructor(d,w={}){super(d,w),Hn(this,"statusCode",500),Hn(this,"fatal",!1),Hn(this,"unhandled",!1),Hn(this,"statusMessage"),Hn(this,"data"),Hn(this,"cause"),w.cause&&!this.cause&&(this.cause=w.cause)}toJSON(){const d={message:this.message,statusCode:Ea(this.statusCode,500)};return this.statusMessage&&(d.statusMessage=bf(this.statusMessage)),this.data!==void 0&&(d.data=this.data),d}}Hn(ja,"__h3_error__",!0);function Sa(r){if(typeof r=="string")return new ja(r);if(gg(r))return r;const d=new ja(r.message??r.statusMessage??"",{cause:r.cause||r});if(pg(r,"stack"))try{Object.defineProperty(d,"stack",{get(){return r.stack}})}catch{try{d.stack=r.stack}catch{}}if(r.data&&(d.data=r.data),r.statusCode?d.statusCode=Ea(r.statusCode,d.statusCode):r.status&&(d.statusCode=Ea(r.status,d.statusCode)),r.statusMessage?d.statusMessage=r.statusMessage:r.statusText&&(d.statusMessage=r.statusText),d.statusMessage){const w=d.statusMessage;bf(d.statusMessage)!==w&&console.warn("[h3] Please prefer using `message` for longer error messages instead of `statusMessage`. In the future, `statusMessage` will be sanitized by default.")}return r.fatal!==void 0&&(d.fatal=r.fatal),r.unhandled!==void 0&&(d.unhandled=r.unhandled),d}function gg(r){var d;return((d=r==null?void 0:r.constructor)==null?void 0:d.__h3_error__)===!0}const vg=/[^\u0009\u0020-\u007E]/g;function bf(r=""){return r.replace(vg,"")}function Ea(r,d=200){return!r||(typeof r=="string"&&(r=Number.parseInt(r,10)),r<100||r>999)?d:r}const _f=Symbol("layout-meta"),fs=Symbol("route"),Wr=()=>{var r;return(r=It())==null?void 0:r.$router},fi=()=>Rd()?Ht(fs,It()._route):It()._route;const bg=()=>{try{if(It()._processingMiddleware)return!0}catch{return!1}return!1},_g=(r,d)=>{r||(r="/");const w=typeof r=="string"?r:sf(r.path||"/",r.query||{})+(r.hash||"");if(d!=null&&d.open){const{target:u="_blank",windowFeatures:o={}}=d.open,c=Object.entries(o).filter(([g,p])=>p!==void 0).map(([g,p])=>`${g.toLowerCase()}=${p}`).join(", ");return open(w,u,c),Promise.resolve()}const t=(d==null?void 0:d.external)||mn(w,{acceptRelative:!0});if(t){if(!(d!=null&&d.external))throw new Error("Navigating to an external URL is not allowed by default. Use `navigateTo(url, { external: true })`.");const u=ds(w).protocol;if(u&&Ty(u))throw new Error(`Cannot navigate to a URL with '${u}' protocol.`)}const x=bg();if(!t&&x)return r;const v=Wr(),s=It();return t?(s._scope.stop(),d!=null&&d.replace?location.replace(w):location.href=w,x?s.isHydrating?new Promise(()=>{}):!1:Promise.resolve()):d!=null&&d.replace?v.replace(r):v.push(r)},wf="__nuxt_error",hi=()=>vp(It().payload,"error"),ao=r=>{const d=pi(r);try{const w=It(),t=hi();w.hooks.callHook("app:error",d),t.value=t.value||d}catch{throw d}return d},wg=async(r={})=>{const d=It(),w=hi();d.callHook("app:error:cleared",r),r.redirect&&await Wr().replace(r.redirect),w.value=null},xg=r=>!!r&&typeof r=="object"&&wf in r,pi=r=>{const d=Sa(r);return Object.defineProperty(d,wf,{value:!0,configurable:!1,writable:!1}),d},jg="modulepreload",Sg=function(r,d){return r[0]==="."?new URL(r,d).href:r},ec={},Eg=function(d,w,t){let x=Promise.resolve();if(w&&w.length>0){document.getElementsByTagName("link");const v=document.querySelector("meta[property=csp-nonce]"),s=(v==null?void 0:v.nonce)||(v==null?void 0:v.getAttribute("nonce"));x=Promise.all(w.map(u=>{if(u=Sg(u,t),u in ec)return;ec[u]=!0;const o=u.endsWith(".css"),c=o?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${u}"]${c}`))return;const g=document.createElement("link");if(g.rel=o?"stylesheet":jg,o||(g.as="script",g.crossOrigin=""),g.href=u,s&&g.setAttribute("nonce",s),document.head.appendChild(g),o)return new Promise((p,n)=>{g.addEventListener("load",p),g.addEventListener("error",()=>n(new Error(`Unable to preload CSS for ${u}`)))})}))}return x.then(()=>d()).catch(v=>{const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=v,window.dispatchEvent(s),!s.defaultPrevented)throw v})},rt=(...r)=>Eg(...r).catch(d=>{const w=new Event("nuxt.preloadError");throw w.payload=d,window.dispatchEvent(w),d}),Tg=-1,kg=-2,Mg=-3,Cg=-4,Og=-5,Pg=-6;function Ag(r,d){return Rg(JSON.parse(r),d)}function Rg(r,d){if(typeof r=="number")return x(r,!0);if(!Array.isArray(r)||r.length===0)throw new Error("Invalid input");const w=r,t=Array(w.length);function x(v,s=!1){if(v===Tg)return;if(v===Mg)return NaN;if(v===Cg)return 1/0;if(v===Og)return-1/0;if(v===Pg)return-0;if(s)throw new Error("Invalid input");if(v in t)return t[v];const u=w[v];if(!u||typeof u!="object")t[v]=u;else if(Array.isArray(u))if(typeof u[0]=="string"){const o=u[0],c=d==null?void 0:d[o];if(c)return t[v]=c(x(u[1]));switch(o){case"Date":t[v]=new Date(u[1]);break;case"Set":const g=new Set;t[v]=g;for(let i=1;i>>9)+65536).toString(16).substring(1,8).toLowerCase()}function tc(r){return r._h||ul(r._d?r._d:`${r.tag}:${r.textContent||r.innerHTML||""}:${Object.entries(r.props).map(([d,w])=>`${d}:${String(w)}`).join(",")}`)}function jf(r,d){const{props:w,tag:t}=r;if(Fg.includes(t))return t;if(t==="link"&&w.rel==="canonical")return"canonical";if(w.charset)return"charset";const x=["id"];t==="meta"&&x.push("name","property","http-equiv");for(const v of x)if(typeof w[v]<"u"){const s=String(w[v]);return`${t}:${v}:${s}`}return!1}function rc(r,d){return r==null?d||null:typeof r=="function"?r(d):r}function Sf(r,d){const w=[],t=d.resolveKeyData||(v=>v.key),x=d.resolveValueData||(v=>v.value);for(const[v,s]of Object.entries(r))w.push(...(Array.isArray(s)?s:[s]).map(u=>{const o={key:v,value:u},c=x(o);return typeof c=="object"?Sf(c,d):Array.isArray(c)?c:{[typeof d.key=="function"?d.key(o):d.key]:t(o),[typeof d.value=="function"?d.value(o):d.value]:c}}).flat());return w}function Ef(r,d){return Object.entries(r).map(([w,t])=>{if(typeof t=="object"&&(t=Ef(t,d)),d.resolve){const x=d.resolve({key:w,value:t});if(typeof x<"u")return x}return typeof t=="number"&&(t=t.toString()),typeof t=="string"&&d.wrapValue&&(t=t.replace(new RegExp(d.wrapValue,"g"),`\\${d.wrapValue}`),t=`${d.wrapValue}${t}${d.wrapValue}`),`${w}${d.keyValueSeparator||""}${t}`}).join(d.entrySeparator||"")}const pr=r=>({keyValue:r,metaKey:"property"}),zi=r=>({keyValue:r}),cl={appleItunesApp:{unpack:{entrySeparator:", ",resolve({key:r,value:d}){return`${fn(r)}=${d}`}}},articleExpirationTime:pr("article:expiration_time"),articleModifiedTime:pr("article:modified_time"),articlePublishedTime:pr("article:published_time"),bookReleaseDate:pr("book:release_date"),charset:{metaKey:"charset"},contentSecurityPolicy:{unpack:{entrySeparator:"; ",resolve({key:r,value:d}){return`${fn(r)} ${d}`}},metaKey:"http-equiv"},contentType:{metaKey:"http-equiv"},defaultStyle:{metaKey:"http-equiv"},fbAppId:pr("fb:app_id"),msapplicationConfig:zi("msapplication-Config"),msapplicationTileColor:zi("msapplication-TileColor"),msapplicationTileImage:zi("msapplication-TileImage"),ogAudioSecureUrl:pr("og:audio:secure_url"),ogAudioUrl:pr("og:audio"),ogImageSecureUrl:pr("og:image:secure_url"),ogImageUrl:pr("og:image"),ogSiteName:pr("og:site_name"),ogVideoSecureUrl:pr("og:video:secure_url"),ogVideoUrl:pr("og:video"),profileFirstName:pr("profile:first_name"),profileLastName:pr("profile:last_name"),profileUsername:pr("profile:username"),refresh:{metaKey:"http-equiv",unpack:{entrySeparator:";",resolve({key:r,value:d}){if(r==="seconds")return`${d}`}}},robots:{unpack:{entrySeparator:", ",resolve({key:r,value:d}){return typeof d=="boolean"?`${fn(r)}`:`${fn(r)}:${d}`}}},xUaCompatible:{metaKey:"http-equiv"}},Tf=["og","book","article","profile"];function kf(r){var w;const d=fn(r).split(":")[0];return Tf.includes(d)?"property":((w=cl[r])==null?void 0:w.metaKey)||"name"}function Ug(r){var d;return((d=cl[r])==null?void 0:d.keyValue)||fn(r)}function fn(r){const d=r.replace(/([A-Z])/g,"-$1").toLowerCase(),w=d.split("-")[0];return Tf.includes(w)||w==="twitter"?r.replace(/([A-Z])/g,":$1").toLowerCase():d}function Ta(r){if(Array.isArray(r))return r.map(w=>Ta(w));if(typeof r!="object"||Array.isArray(r))return r;const d={};for(const[w,t]of Object.entries(r))d[fn(w)]=Ta(t);return d}function Bg(r,d){const w=cl[d];return d==="refresh"?`${r.seconds};url=${r.url}`:Ef(Ta(r),{keyValueSeparator:"=",entrySeparator:", ",resolve({value:t,key:x}){if(t===null)return"";if(typeof t=="boolean")return`${x}`},...w==null?void 0:w.unpack})}const Mf=["og:image","og:video","og:audio","twitter:image"];function Cf(r){const d={};return Object.entries(r).forEach(([w,t])=>{String(t)!=="false"&&w&&(d[w]=t)}),d}function nc(r,d){const w=Cf(d),t=fn(r),x=kf(t);if(Mf.includes(t)){const v={};return Object.entries(w).forEach(([s,u])=>{v[`${r}${s==="url"?"":`${s.charAt(0).toUpperCase()}${s.slice(1)}`}`]=u}),dl(v).sort((s,u)=>{var o,c;return(((o=s[x])==null?void 0:o.length)||0)-(((c=u[x])==null?void 0:c.length)||0)})}return[{[x]:t,...w}]}function dl(r){const d=[],w={};Object.entries(r).forEach(([x,v])=>{if(!Array.isArray(v)){if(typeof v=="object"&&v){if(Mf.includes(fn(x))){d.push(...nc(x,v));return}w[x]=Cf(v)}else w[x]=v;return}v.forEach(s=>{d.push(...typeof s=="string"?dl({[x]:s}):nc(x,s))})});const t=Sf(w,{key({key:x}){return kf(x)},value({key:x}){return x==="charset"?"charset":"content"},resolveKeyData({key:x}){return Ug(x)},resolveValueData({value:x,key:v}){return x===null?"_null":typeof x=="object"?Bg(x,v):typeof x=="number"?x.toString():x}});return[...d,...t].map(x=>(x.content==="_null"&&(x.content=null),x))}async function Gg(r,d,w){const t={tag:r,props:await Of(typeof d=="object"&&typeof d!="function"&&!(d instanceof Promise)?{...d}:{[["script","noscript","style"].includes(r)?"innerHTML":"textContent"]:d},["templateParams","titleTemplate"].includes(r))};return xf.forEach(x=>{const v=typeof t.props[x]<"u"?t.props[x]:w[x];typeof v<"u"&&((!["innerHTML","textContent","children"].includes(x)||Ig.includes(t.tag))&&(t[x==="children"?"innerHTML":x]=v),delete t.props[x])}),t.props.body&&(t.tagPosition="bodyClose",delete t.props.body),t.tag==="script"&&typeof t.innerHTML=="object"&&(t.innerHTML=JSON.stringify(t.innerHTML),t.props.type=t.props.type||"application/json"),Array.isArray(t.props.content)?t.props.content.map(x=>({...t,props:{...t.props,content:x}})):t}function Vg(r,d){var t;const w=r==="class"?" ":";";return typeof d=="object"&&!Array.isArray(d)&&(d=Object.entries(d).filter(([,x])=>x).map(([x,v])=>r==="style"?`${x}:${v}`:x)),(t=Array.isArray(d)?d.join(w):d)==null?void 0:t.split(w).filter(x=>x.trim()).filter(Boolean).join(w)}async function Of(r,d){for(const w of Object.keys(r)){if(["class","style"].includes(w)){r[w]=Vg(w,r[w]);continue}if(r[w]instanceof Promise&&(r[w]=await r[w]),!d&&!xf.includes(w)){const t=String(r[w]),x=w.startsWith("data-");t==="true"||t===""?r[w]=x?"true":!0:r[w]||(x&&t==="false"?r[w]="false":delete r[w])}}return r}const Hg=10;async function zg(r){const d=[];return Object.entries(r.resolvedInput).filter(([w,t])=>typeof t<"u"&&Dg.includes(w)).forEach(([w,t])=>{const x=Lg(t);d.push(...x.map(v=>Gg(w,v,r)).flat())}),(await Promise.all(d)).flat().filter(Boolean).map((w,t)=>(w._e=r._i,r.mode&&(w._m=r.mode),w._p=(r._i<o&&o[c]||void 0,d):u=d[s],typeof u<"u"?(u||"").replace(/"/g,'\\"'):!1}let x=r;try{x=decodeURI(r)}catch{}return(x.match(/%(\w+\.+\w+)|%(\w+)/g)||[]).sort().reverse().forEach(s=>{const u=t(s.slice(1));typeof u=="string"&&(r=r.replace(new RegExp(`\\${s}(\\W|$)`,"g"),(o,c)=>`${u}${c}`).trim())}),r.includes(Sn)&&(r.endsWith(Sn)&&(r=r.slice(0,-Sn.length).trim()),r.startsWith(Sn)&&(r=r.slice(Sn.length).trim()),r=r.replace(new RegExp(`\\${Sn}\\s*\\${Sn}`,"g"),Sn),r=Fs(r,{separator:w},w)),r}async function Pf(r,d={}){var g;const w=d.document||r.resolvedOptions.document;if(!w||!r.dirty)return;const t={shouldRender:!0,tags:[]};if(await r.hooks.callHook("dom:beforeRender",t),!t.shouldRender)return;const x=(await r.resolveTags()).map(p=>({tag:p,id:Ds.includes(p.tag)?tc(p):p.tag,shouldRender:!0}));let v=r._dom;if(!v){v={elMap:{htmlAttrs:w.documentElement,bodyAttrs:w.body}};for(const p of["body","head"]){const n=(g=w[p])==null?void 0:g.children,i=[];for(const a of[...n].filter(h=>Ds.includes(h.tagName.toLowerCase()))){const h={tag:a.tagName.toLowerCase(),props:await Of(a.getAttributeNames().reduce((f,m)=>({...f,[m]:a.getAttribute(m)}),{})),innerHTML:a.innerHTML};let y=1,l=jf(h);for(;l&&i.find(f=>f._d===l);)l=`${l}:${y++}`;h._d=l||void 0,i.push(h),v.elMap[a.getAttribute("data-hid")||tc(h)]=a}}}v.pendingSideEffects={...v.sideEffects||{}},v.sideEffects={};function s(p,n,i){const a=`${p}:${n}`;v.sideEffects[a]=i,delete v.pendingSideEffects[a]}function u({id:p,$el:n,tag:i}){const a=i.tag.endsWith("Attrs");v.elMap[p]=n,a||(["textContent","innerHTML"].forEach(h=>{i[h]&&i[h]!==n[h]&&(n[h]=i[h])}),s(p,"el",()=>{var h;(h=v.elMap[p])==null||h.remove(),delete v.elMap[p]}));for(const[h,y]of Object.entries(i._eventHandlers||{}))n.getAttribute(`data-${h}`)!==""&&((i.tag==="bodyAttrs"?w.defaultView:n).addEventListener(h.replace("on",""),y.bind(n)),n.setAttribute(`data-${h}`,""));Object.entries(i.props).forEach(([h,y])=>{const l=`attr:${h}`;if(h==="class")for(const f of(y||"").split(" ").filter(Boolean))a&&s(p,`${l}:${f}`,()=>n.classList.remove(f)),!n.classList.contains(f)&&n.classList.add(f);else if(h==="style")for(const f of(y||"").split(";").filter(Boolean)){const[m,...b]=f.split(":").map(j=>j.trim());s(p,`${l}:${f}:${m}`,()=>{n.style.removeProperty(m)}),n.style.setProperty(m,b.join(":"))}else n.getAttribute(h)!==y&&n.setAttribute(h,y===!0?"":String(y)),a&&s(p,l,()=>n.removeAttribute(h))})}const o=[],c={bodyClose:void 0,bodyOpen:void 0,head:void 0};for(const p of x){const{tag:n,shouldRender:i,id:a}=p;if(i){if(n.tag==="title"){w.title=n.textContent;continue}p.$el=p.$el||v.elMap[a],p.$el?u(p):Ds.includes(n.tag)&&o.push(p)}}for(const p of o){const n=p.tag.tagPosition||"head";p.$el=w.createElement(p.tag.tag),u(p),c[n]=c[n]||w.createDocumentFragment(),c[n].appendChild(p.$el)}for(const p of x)await r.hooks.callHook("dom:renderTag",p,w,s);c.head&&w.head.appendChild(c.head),c.bodyOpen&&w.body.insertBefore(c.bodyOpen,w.body.firstChild),c.bodyClose&&w.body.appendChild(c.bodyClose),Object.values(v.pendingSideEffects).forEach(p=>p()),r._dom=v,r.dirty=!1,await r.hooks.callHook("dom:rendered",{renders:x})}async function qg(r,d={}){const w=d.delayFn||(t=>setTimeout(t,10));return r._domUpdatePromise=r._domUpdatePromise||new Promise(t=>w(async()=>{await Pf(r,d),delete r._domUpdatePromise,t()}))}function Xg(r){return d=>{var t,x;const w=((x=(t=d.resolvedOptions.document)==null?void 0:t.head.querySelector('script[id="unhead:payload"]'))==null?void 0:x.innerHTML)||!1;return w&&d.push(JSON.parse(w)),{mode:"client",hooks:{"entries:updated":function(v){qg(v,r)}}}}}const Yg=["templateParams","htmlAttrs","bodyAttrs"],$g={hooks:{"tag:normalise":function({tag:r}){["hid","vmid","key"].forEach(t=>{r.props[t]&&(r.key=r.props[t],delete r.props[t])});const w=jf(r)||(r.key?`${r.tag}:${r.key}`:!1);w&&(r._d=w)},"tags:resolve":function(r){const d={};r.tags.forEach(t=>{const x=(t.key?`${t.tag}:${t.key}`:t._d)||t._p,v=d[x];if(v){let u=t==null?void 0:t.tagDuplicateStrategy;if(!u&&Yg.includes(t.tag)&&(u="merge"),u==="merge"){const o=v.props;["class","style"].forEach(c=>{o[c]&&(t.props[c]?(c==="style"&&!o[c].endsWith(";")&&(o[c]+=";"),t.props[c]=`${o[c]} ${t.props[c]}`):t.props[c]=o[c])}),d[x].props={...o,...t.props};return}else if(t._e===v._e){v._duped=v._duped||[],t._d=`${v._d}:${v._duped.length+1}`,v._duped.push(t);return}else if(Qs(t)>Qs(v))return}const s=Object.keys(t.props).length+(t.innerHTML?1:0)+(t.textContent?1:0);if(Ds.includes(t.tag)&&s===0){delete d[x];return}d[x]=t});const w=[];Object.values(d).forEach(t=>{const x=t._duped;delete t._duped,w.push(t),x&&w.push(...x)}),r.tags=w,r.tags=r.tags.filter(t=>!(t.tag==="meta"&&(t.props.name||t.props.property)&&!t.props.content))}}},Kg={mode:"server",hooks:{"tags:resolve":function(r){const d={};r.tags.filter(w=>["titleTemplate","templateParams","title"].includes(w.tag)&&w._m==="server").forEach(w=>{d[w.tag]=w.tag.startsWith("title")?w.textContent:w.props}),Object.keys(d).length&&r.tags.push({tag:"script",innerHTML:JSON.stringify(d),props:{id:"unhead:payload",type:"application/json"}})}}},Zg=["script","link","bodyAttrs"],Qg=r=>({hooks:{"tags:resolve":function(d){for(const w of d.tags.filter(t=>Zg.includes(t.tag)))Object.entries(w.props).forEach(([t,x])=>{t.startsWith("on")&&typeof x=="function"&&(r.ssr&&ic.includes(t)?w.props[t]=`this.dataset.${t}fired = true`:delete w.props[t],w._eventHandlers=w._eventHandlers||{},w._eventHandlers[t]=x)}),r.ssr&&w._eventHandlers&&(w.props.src||w.props.href)&&(w.key=w.key||ul(w.props.src||w.props.href))},"dom:renderTag":function({$el:d,tag:w}){var t,x;for(const v of Object.keys((d==null?void 0:d.dataset)||{}).filter(s=>ic.some(u=>`${u}fired`===s))){const s=v.replace("fired","");(x=(t=w._eventHandlers)==null?void 0:t[s])==null||x.call(d,new Event(s.replace("on","")))}}}}),Jg=["link","style","script","noscript"],ev={hooks:{"tag:normalise":({tag:r})=>{r.key&&Jg.includes(r.tag)&&(r.props["data-hid"]=r._h=ul(r.key))}}},tv={hooks:{"tags:resolve":r=>{const d=w=>{var t;return(t=r.tags.find(x=>x._d===w))==null?void 0:t._p};for(const{prefix:w,offset:t}of Wg)for(const x of r.tags.filter(v=>typeof v.tagPriority=="string"&&v.tagPriority.startsWith(w))){const v=d(x.tagPriority.replace(w,""));typeof v<"u"&&(x._p=v+t)}r.tags.sort((w,t)=>w._p-t._p).sort((w,t)=>Qs(w)-Qs(t))}}},rv={meta:"content",link:"href",htmlAttrs:"lang"},nv=r=>({hooks:{"tags:resolve":d=>{var u;const{tags:w}=d,t=(u=w.find(o=>o.tag==="title"))==null?void 0:u.textContent,x=w.findIndex(o=>o.tag==="templateParams"),v=x!==-1?w[x].props:{},s=v.separator||"|";delete v.separator,v.pageTitle=Fs(v.pageTitle||t||"",v,s);for(const o of w.filter(c=>c.processTemplateParams!==!1)){const c=rv[o.tag];c&&typeof o.props[c]=="string"?o.props[c]=Fs(o.props[c],v,s):(o.processTemplateParams===!0||["titleTemplate","title"].includes(o.tag))&&["innerHTML","textContent"].forEach(g=>{typeof o[g]=="string"&&(o[g]=Fs(o[g],v,s))})}r._templateParams=v,r._separator=s,d.tags=w.filter(o=>o.tag!=="templateParams")}}}),ov={hooks:{"tags:resolve":r=>{const{tags:d}=r;let w=d.findIndex(x=>x.tag==="titleTemplate");const t=d.findIndex(x=>x.tag==="title");if(t!==-1&&w!==-1){const x=rc(d[w].textContent,d[t].textContent);x!==null?d[t].textContent=x||d[t].textContent:delete d[t]}else if(w!==-1){const x=rc(d[w].textContent);x!==null&&(d[w].textContent=x,d[w].tag="title",w=-1)}w!==-1&&delete d[w],r.tags=d.filter(Boolean)}}},sv={hooks:{"tags:afterResolve":function(r){for(const d of r.tags)typeof d.innerHTML=="string"&&(d.innerHTML&&["application/ld+json","application/json"].includes(d.props.type)?d.innerHTML=d.innerHTML.replace(/{u.dirty=!0,d.callHook("entries:updated",u)};let x=0,v=[];const s=[],u={plugins:s,dirty:!1,resolvedOptions:r,hooks:d,headEntries(){return v},use(o){const c=typeof o=="function"?o(u):o;(!c.key||!s.some(g=>g.key===c.key))&&(s.push(c),ac(c.mode,w)&&d.addHooks(c.hooks||{}))},push(o,c){c==null||delete c.head;const g={_i:x++,input:o,...c};return ac(g.mode,w)&&(v.push(g),t()),{dispose(){v=v.filter(p=>p._i!==g._i),d.callHook("entries:updated",u),t()},patch(p){v=v.map(n=>(n._i===g._i&&(n.input=g.input=p),n)),t()}}},async resolveTags(){const o={tags:[],entries:[...v]};await d.callHook("entries:resolve",o);for(const c of o.entries){const g=c.resolvedInput||c.input;if(c.resolvedInput=await(c.transform?c.transform(g):g),c.resolvedInput)for(const p of await zg(c)){const n={tag:p,entry:c,resolvedOptions:u.resolvedOptions};await d.callHook("tag:normalise",n),o.tags.push(n.tag)}}return await d.callHook("tags:beforeResolve",o),await d.callHook("tags:resolve",o),await d.callHook("tags:afterResolve",o),o.tags},ssr:w};return[$g,Kg,Qg,ev,tv,nv,ov,sv,...(r==null?void 0:r.plugins)||[]].forEach(o=>u.use(o)),u.hooks.callHook("init",u),u}function lv(){return Af}const uv=Jd.startsWith("3");function cv(r){return typeof r=="function"?r():Bt(r)}function Js(r,d=""){if(r instanceof Promise)return r;const w=cv(r);return!r||!w?w:Array.isArray(w)?w.map(t=>Js(t,d)):typeof w=="object"?Object.fromEntries(Object.entries(w).map(([t,x])=>t==="titleTemplate"||t.startsWith("on")?[t,Bt(x)]:[t,Js(x,t)])):w}const dv={hooks:{"entries:resolve":function(r){for(const d of r.entries)d.resolvedInput=Js(d.input)}}},Rf="usehead";function fv(r){return{install(w){uv&&(w.config.globalProperties.$unhead=r,w.config.globalProperties.$head=r,w.provide(Rf,r))}}.install}function hv(r={}){r.domDelayFn=r.domDelayFn||(w=>Dr(()=>setTimeout(()=>w(),0)));const d=iv(r);return d.use(dv),d.install=fv(d),d}const ka=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Ma="__unhead_injection_handler__";function pv(r){ka[Ma]=r}function mv(){if(Ma in ka)return ka[Ma]();const r=Ht(Rf);return r||lv()}function yv(r,d={}){const w=d.head||mv();if(w)return w.ssr?w.push(r,d):gv(w,r,d)}function gv(r,d,w={}){const t=mt(!1),x=mt({});an(()=>{x.value=t.value?{}:Js(d)});const v=r.push(x.value,w);return Ln(x,u=>{v.patch(u)}),So()&&(as(()=>{v.dispose()}),Td(()=>{t.value=!0}),Ed(()=>{t.value=!1})),v}function vv(r,d){const{title:w,titleTemplate:t,...x}=r;return yv({title:w,titleTemplate:t,_flatMeta:x},{...d,transform(v){const s=dl({...v._flatMeta});return delete v._flatMeta,{...v,meta:s}}})}const bv={nuxt:{buildId:"d8634a4e-ab1a-4045-9220-3f7d159ce250"}},_v=hg(bv);function Lf(){const r=It();return r._appConfig||(r._appConfig=Nn(_v)),r._appConfig}const wv=!1,Ca=!1,xv=!1,jv={componentName:"NuxtLink"},j_={deep:!0},S_={},Sv="#__nuxt";let Ns,If;function Ev(){var d;const r=(d=Lf().nuxt)==null?void 0:d.buildId;return Ns=$fetch(ll(`builds/meta/${r}.json`)),Ns.then(w=>{If=fg(w.matcher)}),Ns}function mi(){return Ns||Ev()}async function fl(r){return await mi(),vf({},...If.matchAll(r).reverse())}function lc(r,d={}){const w=kv(r,d),t=It(),x=t._payloadCache=t._payloadCache||{};return w in x||(x[w]=Mv(r).then(v=>v?Df(w).then(s=>s||(delete x[w],null)):(x[w]=null,null))),x[w]}const Tv="_payload.json";function kv(r,d={}){var x;const w=new URL(r,"http://localhost");if(w.host!=="localhost"||mn(w.pathname,{acceptRelative:!0}))throw new Error("Payload URL must not include hostname: "+r);const t=d.hash||(d.fresh?Date.now():(x=Lf().nuxt)==null?void 0:x.buildId);return ci(di().app.baseURL,w.pathname,Tv+(t?`?${t}`:""))}async function Df(r){const d=fetch(r).then(w=>w.text().then(Ff));try{return await d}catch(w){console.warn("[nuxt] Cannot load payload ",r,w)}return null}async function Mv(r=fi().path){if(r=ui(r),(await mi()).prerendered.includes(r))return!0;const w=await fl(r);return!!w.prerender&&!w.redirect}let Cs=null;async function Cv(){if(Cs)return Cs;const r=document.getElementById("__NUXT_DATA__");if(!r)return{};const d=await Ff(r.textContent||""),w=r.dataset.src?await Df(r.dataset.src):void 0;return Cs={...d,...w,...window.__NUXT__},Cs}async function Ff(r){return await Ag(r,It()._payloadRevivers)}function Ov(r,d){It()._payloadRevivers[r]=d}const uc={NuxtError:r=>pi(r),EmptyShallowRef:r=>$o(r==="_"?void 0:r==="0n"?BigInt(0):Xs(r)),EmptyRef:r=>mt(r==="_"?void 0:r==="0n"?BigInt(0):Xs(r)),ShallowRef:r=>$o(r),ShallowReactive:r=>ss(r),Ref:r=>mt(r),Reactive:r=>Nn(r)},Pv=yn({name:"nuxt:revive-payload:client",order:-30,async setup(r){let d,w;for(const t in uc)Ov(t,uc[t]);Object.assign(r.payload,([d,w]=es(()=>r.runWithContext(Cv)),d=await d,w(),d)),window.__NUXT__=r.payload}}),Av=[],Rv=yn({name:"nuxt:head",enforce:"pre",setup(r){const d=hv({plugins:Av});pv(()=>It().vueApp._context.provides.usehead),r.vueApp.use(d);{let w=!0;const t=async()=>{w=!1,await Pf(d)};d.hooks.hook("dom:beforeRender",x=>{x.shouldRender=!w}),r.hooks.hook("page:start",()=>{w=!0}),r.hooks.hook("page:finish",()=>{r.isHydrating||t()}),r.hooks.hook("app:error",t),r.hooks.hook("app:suspense:resolve",t)}}});/*! * vue-router v4.3.2 * (c) 2024 Eduardo San Martin Morote * @license MIT - */const so=typeof document<"u";function Lv(r){return r.__esModule||r[Symbol.toStringTag]==="Module"}const xt=Object.assign;function Wi(r,d){const w={};for(const t in d){const x=d[t];w[t]=Qr(x)?x.map(r):r(x)}return w}const Wo=()=>{},Qr=Array.isArray,Nf=/#/g,Iv=/&/g,Dv=/\//g,Fv=/=/g,Nv=/\?/g,Uf=/\+/g,Uv=/%5B/g,Bv=/%5D/g,Bf=/%5E/g,Gv=/%60/g,Gf=/%7B/g,Vv=/%7C/g,Vf=/%7D/g,Hv=/%20/g;function hl(r){return encodeURI(""+r).replace(Vv,"|").replace(Uv,"[").replace(Bv,"]")}function zv(r){return hl(r).replace(Gf,"{").replace(Vf,"}").replace(Bf,"^")}function Oa(r){return hl(r).replace(Uf,"%2B").replace(Hv,"+").replace(Nf,"%23").replace(Iv,"%26").replace(Gv,"`").replace(Gf,"{").replace(Vf,"}").replace(Bf,"^")}function Wv(r){return Oa(r).replace(Fv,"%3D")}function qv(r){return hl(r).replace(Nf,"%23").replace(Nv,"%3F")}function Xv(r){return r==null?"":qv(r).replace(Dv,"%2F")}function ts(r){try{return decodeURIComponent(""+r)}catch{}return""+r}const Yv=/\/$/,$v=r=>r.replace(Yv,"");function qi(r,d,w="/"){let t,x={},v="",s="";const u=d.indexOf("#");let o=d.indexOf("?");return u=0&&(o=-1),o>-1&&(t=d.slice(0,o),v=d.slice(o+1,u>-1?u:d.length),x=r(v)),u>-1&&(t=t||d.slice(0,u),s=d.slice(u,d.length)),t=Jv(t??d,w),{fullPath:t+(v&&"?")+v+s,path:t,query:x,hash:ts(s)}}function Kv(r,d){const w=d.query?r(d.query):"";return d.path+(w&&"?")+w+(d.hash||"")}function cc(r,d){return!d||!r.toLowerCase().startsWith(d.toLowerCase())?r:r.slice(d.length)||"/"}function Zv(r,d,w){const t=d.matched.length-1,x=w.matched.length-1;return t>-1&&t===x&&_o(d.matched[t],w.matched[x])&&Hf(d.params,w.params)&&r(d.query)===r(w.query)&&d.hash===w.hash}function _o(r,d){return(r.aliasOf||r)===(d.aliasOf||d)}function Hf(r,d){if(Object.keys(r).length!==Object.keys(d).length)return!1;for(const w in r)if(!Qv(r[w],d[w]))return!1;return!0}function Qv(r,d){return Qr(r)?dc(r,d):Qr(d)?dc(d,r):r===d}function dc(r,d){return Qr(d)?r.length===d.length&&r.every((w,t)=>w===d[t]):r.length===1&&r[0]===d}function Jv(r,d){if(r.startsWith("/"))return r;if(!r)return d;const w=d.split("/"),t=r.split("/"),x=t[t.length-1];(x===".."||x===".")&&t.push("");let v=w.length-1,s,u;for(s=0;s1&&v--;else break;return w.slice(0,v).join("/")+"/"+t.slice(s).join("/")}var rs;(function(r){r.pop="pop",r.push="push"})(rs||(rs={}));var qo;(function(r){r.back="back",r.forward="forward",r.unknown=""})(qo||(qo={}));function e0(r){if(!r)if(so){const d=document.querySelector("base");r=d&&d.getAttribute("href")||"/",r=r.replace(/^\w+:\/\/[^\/]+/,"")}else r="/";return r[0]!=="/"&&r[0]!=="#"&&(r="/"+r),$v(r)}const t0=/^[^#]+#/;function r0(r,d){return r.replace(t0,"#")+d}function n0(r,d){const w=document.documentElement.getBoundingClientRect(),t=r.getBoundingClientRect();return{behavior:d.behavior,left:t.left-w.left-(d.left||0),top:t.top-w.top-(d.top||0)}}const yi=()=>({left:window.scrollX,top:window.scrollY});function o0(r){let d;if("el"in r){const w=r.el,t=typeof w=="string"&&w.startsWith("#"),x=typeof w=="string"?t?document.getElementById(w.slice(1)):document.querySelector(w):w;if(!x)return;d=n0(x,r)}else d=r;"scrollBehavior"in document.documentElement.style?window.scrollTo(d):window.scrollTo(d.left!=null?d.left:window.scrollX,d.top!=null?d.top:window.scrollY)}function fc(r,d){return(history.state?history.state.position-d:-1)+r}const Pa=new Map;function s0(r,d){Pa.set(r,d)}function i0(r){const d=Pa.get(r);return Pa.delete(r),d}let a0=()=>location.protocol+"//"+location.host;function zf(r,d){const{pathname:w,search:t,hash:x}=d,v=r.indexOf("#");if(v>-1){let u=x.includes(r.slice(v))?r.slice(v).length:1,o=x.slice(u);return o[0]!=="/"&&(o="/"+o),cc(o,"")}return cc(w,r)+t+x}function l0(r,d,w,t){let x=[],v=[],s=null;const u=({state:n})=>{const i=zf(r,location),a=w.value,h=d.value;let y=0;if(n){if(w.value=i,d.value=n,s&&s===a){s=null;return}y=h?n.position-h.position:0}else t(i);x.forEach(l=>{l(w.value,a,{delta:y,type:rs.pop,direction:y?y>0?qo.forward:qo.back:qo.unknown})})};function o(){s=w.value}function c(n){x.push(n);const i=()=>{const a=x.indexOf(n);a>-1&&x.splice(a,1)};return v.push(i),i}function g(){const{history:n}=window;n.state&&n.replaceState(xt({},n.state,{scroll:yi()}),"")}function p(){for(const n of v)n();v=[],window.removeEventListener("popstate",u),window.removeEventListener("beforeunload",g)}return window.addEventListener("popstate",u),window.addEventListener("beforeunload",g,{passive:!0}),{pauseListeners:o,listen:c,destroy:p}}function hc(r,d,w,t=!1,x=!1){return{back:r,current:d,forward:w,replaced:t,position:window.history.length,scroll:x?yi():null}}function u0(r){const{history:d,location:w}=window,t={value:zf(r,w)},x={value:d.state};x.value||v(t.value,{back:null,current:t.value,forward:null,position:d.length-1,replaced:!0,scroll:null},!0);function v(o,c,g){const p=r.indexOf("#"),n=p>-1?(w.host&&document.querySelector("base")?r:r.slice(p))+o:a0()+r+o;try{d[g?"replaceState":"pushState"](c,"",n),x.value=c}catch(i){console.error(i),w[g?"replace":"assign"](n)}}function s(o,c){const g=xt({},d.state,hc(x.value.back,o,x.value.forward,!0),c,{position:x.value.position});v(o,g,!0),t.value=o}function u(o,c){const g=xt({},x.value,d.state,{forward:o,scroll:yi()});v(g.current,g,!0);const p=xt({},hc(t.value,o,null),{position:g.position+1},c);v(o,p,!1),t.value=o}return{location:t,state:x,push:u,replace:s}}function Wf(r){r=e0(r);const d=u0(r),w=l0(r,d.state,d.location,d.replace);function t(v,s=!0){s||w.pauseListeners(),history.go(v)}const x=xt({location:"",base:r,go:t,createHref:r0.bind(null,r)},d,w);return Object.defineProperty(x,"location",{enumerable:!0,get:()=>d.location.value}),Object.defineProperty(x,"state",{enumerable:!0,get:()=>d.state.value}),x}function c0(r){return r=location.host?r||location.pathname+location.search:"",r.includes("#")||(r+="#"),Wf(r)}function d0(r){return typeof r=="string"||r&&typeof r=="object"}function qf(r){return typeof r=="string"||typeof r=="symbol"}const $r={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},Xf=Symbol("");var pc;(function(r){r[r.aborted=4]="aborted",r[r.cancelled=8]="cancelled",r[r.duplicated=16]="duplicated"})(pc||(pc={}));function wo(r,d){return xt(new Error,{type:r,[Xf]:!0},d)}function dn(r,d){return r instanceof Error&&Xf in r&&(d==null||!!(r.type&d))}const mc="[^/]+?",f0={sensitive:!1,strict:!1,start:!0,end:!0},h0=/[.+*?^${}()[\]/\\]/g;function p0(r,d){const w=xt({},f0,d),t=[];let x=w.start?"^":"";const v=[];for(const c of r){const g=c.length?[]:[90];w.strict&&!c.length&&(x+="/");for(let p=0;pd.length?d.length===1&&d[0]===80?1:-1:0}function y0(r,d){let w=0;const t=r.score,x=d.score;for(;w0&&d[d.length-1]<0}const g0={type:0,value:""},v0=/[a-zA-Z0-9_]/;function b0(r){if(!r)return[[]];if(r==="/")return[[g0]];if(!r.startsWith("/"))throw new Error(`Invalid path "${r}"`);function d(i){throw new Error(`ERR (${w})/"${c}": ${i}`)}let w=0,t=w;const x=[];let v;function s(){v&&x.push(v),v=[]}let u=0,o,c="",g="";function p(){c&&(w===0?v.push({type:0,value:c}):w===1||w===2||w===3?(v.length>1&&(o==="*"||o==="+")&&d(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),v.push({type:1,value:c,regexp:g,repeatable:o==="*"||o==="+",optional:o==="*"||o==="?"})):d("Invalid state to consume buffer"),c="")}function n(){c+=o}for(;u{s(f)}:Wo}function s(g){if(qf(g)){const p=t.get(g);p&&(t.delete(g),w.splice(w.indexOf(p),1),p.children.forEach(s),p.alias.forEach(s))}else{const p=w.indexOf(g);p>-1&&(w.splice(p,1),g.record.name&&t.delete(g.record.name),g.children.forEach(s),g.alias.forEach(s))}}function u(){return w}function o(g){let p=0;for(;p=0&&(g.record.path!==w[p].record.path||!Yf(g,w[p]));)p++;w.splice(p,0,g),g.record.name&&!vc(g)&&t.set(g.record.name,g)}function c(g,p){let n,i={},a,h;if("name"in g&&g.name){if(n=t.get(g.name),!n)throw wo(1,{location:g});h=n.record.name,i=xt(gc(p.params,n.keys.filter(f=>!f.optional).concat(n.parent?n.parent.keys.filter(f=>f.optional):[]).map(f=>f.name)),g.params&&gc(g.params,n.keys.map(f=>f.name))),a=n.stringify(i)}else if(g.path!=null)a=g.path,n=w.find(f=>f.re.test(a)),n&&(i=n.parse(a),h=n.record.name);else{if(n=p.name?t.get(p.name):w.find(f=>f.re.test(p.path)),!n)throw wo(1,{location:g,currentLocation:p});h=n.record.name,i=xt({},p.params,g.params),a=n.stringify(i)}const y=[];let l=n;for(;l;)y.unshift(l.record),l=l.parent;return{name:h,path:a,params:i,matched:y,meta:S0(y)}}return r.forEach(g=>v(g)),{addRoute:v,resolve:c,removeRoute:s,getRoutes:u,getRecordMatcher:x}}function gc(r,d){const w={};for(const t of d)t in r&&(w[t]=r[t]);return w}function x0(r){return{path:r.path,redirect:r.redirect,name:r.name,meta:r.meta||{},aliasOf:void 0,beforeEnter:r.beforeEnter,props:j0(r),children:r.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in r?r.components||null:r.component&&{default:r.component}}}function j0(r){const d={},w=r.props||!1;if("component"in r)d.default=w;else for(const t in r.components)d[t]=typeof w=="object"?w[t]:w;return d}function vc(r){for(;r;){if(r.record.aliasOf)return!0;r=r.parent}return!1}function S0(r){return r.reduce((d,w)=>xt(d,w.meta),{})}function bc(r,d){const w={};for(const t in r)w[t]=t in d?d[t]:r[t];return w}function Yf(r,d){return d.children.some(w=>w===r||Yf(r,w))}function E0(r){const d={};if(r===""||r==="?")return d;const t=(r[0]==="?"?r.slice(1):r).split("&");for(let x=0;xv&&Oa(v)):[t&&Oa(t)]).forEach(v=>{v!==void 0&&(d+=(d.length?"&":"")+w,v!=null&&(d+="="+v))})}return d}function T0(r){const d={};for(const w in r){const t=r[w];t!==void 0&&(d[w]=Qr(t)?t.map(x=>x==null?null:""+x):t==null?t:""+t)}return d}const k0=Symbol(""),wc=Symbol(""),pl=Symbol(""),ml=Symbol(""),Aa=Symbol("");function Do(){let r=[];function d(t){return r.push(t),()=>{const x=r.indexOf(t);x>-1&&r.splice(x,1)}}function w(){r=[]}return{add:d,list:()=>r.slice(),reset:w}}function Cn(r,d,w,t,x,v=s=>s()){const s=t&&(t.enterCallbacks[x]=t.enterCallbacks[x]||[]);return()=>new Promise((u,o)=>{const c=n=>{n===!1?o(wo(4,{from:w,to:d})):n instanceof Error?o(n):d0(n)?o(wo(2,{from:d,to:n})):(s&&t.enterCallbacks[x]===s&&typeof n=="function"&&s.push(n),u())},g=v(()=>r.call(t&&t.instances[x],d,w,c));let p=Promise.resolve(g);r.length<3&&(p=p.then(c)),p.catch(n=>o(n))})}function Xi(r,d,w,t,x=v=>v()){const v=[];for(const s of r)for(const u in s.components){let o=s.components[u];if(!(d!=="beforeRouteEnter"&&!s.instances[u]))if(M0(o)){const g=(o.__vccOpts||o)[d];g&&v.push(Cn(g,w,t,s,u,x))}else{let c=o();v.push(()=>c.then(g=>{if(!g)return Promise.reject(new Error(`Couldn't resolve component "${u}" at "${s.path}"`));const p=Lv(g)?g.default:g;s.components[u]=p;const i=(p.__vccOpts||p)[d];return i&&Cn(i,w,t,s,u,x)()}))}}return v}function M0(r){return typeof r=="object"||"displayName"in r||"props"in r||"__vccOpts"in r}function xc(r){const d=Ht(pl),w=Ht(ml),t=jt(()=>{const o=Bt(r.to);return d.resolve(o)}),x=jt(()=>{const{matched:o}=t.value,{length:c}=o,g=o[c-1],p=w.matched;if(!g||!p.length)return-1;const n=p.findIndex(_o.bind(null,g));if(n>-1)return n;const i=jc(o[c-2]);return c>1&&jc(g)===i&&p[p.length-1].path!==i?p.findIndex(_o.bind(null,o[c-2])):n}),v=jt(()=>x.value>-1&&A0(w.params,t.value.params)),s=jt(()=>x.value>-1&&x.value===w.matched.length-1&&Hf(w.params,t.value.params));function u(o={}){return P0(o)?d[Bt(r.replace)?"replace":"push"](Bt(r.to)).catch(Wo):Promise.resolve()}return{route:t,href:jt(()=>t.value.href),isActive:v,isExactActive:s,navigate:u}}const C0=hr({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:xc,setup(r,{slots:d}){const w=Nn(xc(r)),{options:t}=Ht(pl),x=jt(()=>({[Sc(r.activeClass,t.linkActiveClass,"router-link-active")]:w.isActive,[Sc(r.exactActiveClass,t.linkExactActiveClass,"router-link-exact-active")]:w.isExactActive}));return()=>{const v=d.default&&d.default(w);return r.custom?v:tr("a",{"aria-current":w.isExactActive?r.ariaCurrentValue:null,href:w.href,onClick:w.navigate,class:x.value},v)}}}),O0=C0;function P0(r){if(!(r.metaKey||r.altKey||r.ctrlKey||r.shiftKey)&&!r.defaultPrevented&&!(r.button!==void 0&&r.button!==0)){if(r.currentTarget&&r.currentTarget.getAttribute){const d=r.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(d))return}return r.preventDefault&&r.preventDefault(),!0}}function A0(r,d){for(const w in d){const t=d[w],x=r[w];if(typeof t=="string"){if(t!==x)return!1}else if(!Qr(x)||x.length!==t.length||t.some((v,s)=>v!==x[s]))return!1}return!0}function jc(r){return r?r.aliasOf?r.aliasOf.path:r.path:""}const Sc=(r,d,w)=>r??d??w,R0=hr({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(r,{attrs:d,slots:w}){const t=Ht(Aa),x=jt(()=>r.route||t.value),v=Ht(wc,0),s=jt(()=>{let c=Bt(v);const{matched:g}=x.value;let p;for(;(p=g[c])&&!p.components;)c++;return c}),u=jt(()=>x.value.matched[s.value]);zr(wc,jt(()=>s.value+1)),zr(k0,u),zr(Aa,x);const o=mt();return Ln(()=>[o.value,u.value,r.name],([c,g,p],[n,i,a])=>{g&&(g.instances[p]=c,i&&i!==g&&c&&c===n&&(g.leaveGuards.size||(g.leaveGuards=i.leaveGuards),g.updateGuards.size||(g.updateGuards=i.updateGuards))),c&&g&&(!i||!_o(g,i)||!n)&&(g.enterCallbacks[p]||[]).forEach(h=>h(c))},{flush:"post"}),()=>{const c=x.value,g=r.name,p=u.value,n=p&&p.components[g];if(!n)return Ec(w.default,{Component:n,route:c});const i=p.props[g],a=i?i===!0?c.params:typeof i=="function"?i(c):i:null,y=tr(n,xt({},a,d,{onVnodeUnmounted:l=>{l.component.isUnmounted&&(p.instances[g]=null)},ref:o}));return Ec(w.default,{Component:y,route:c})||y}}});function Ec(r,d){if(!r)return null;const w=r(d);return w.length===1?w[0]:w}const $f=R0;function L0(r){const d=w0(r.routes,r),w=r.parseQuery||E0,t=r.stringifyQuery||_c,x=r.history,v=Do(),s=Do(),u=Do(),o=$o($r);let c=$r;so&&r.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const g=Wi.bind(null,$=>""+$),p=Wi.bind(null,Xv),n=Wi.bind(null,ts);function i($,J){let ne,ce;return qf($)?(ne=d.getRecordMatcher($),ce=J):ce=$,d.addRoute(ce,ne)}function a($){const J=d.getRecordMatcher($);J&&d.removeRoute(J)}function h(){return d.getRoutes().map($=>$.record)}function y($){return!!d.getRecordMatcher($)}function l($,J){if(J=xt({},J||o.value),typeof $=="string"){const z=qi(w,$,J.path),te=d.resolve({path:z.path},J),le=x.createHref(z.fullPath);return xt(z,te,{params:n(te.params),hash:ts(z.hash),redirectedFrom:void 0,href:le})}let ne;if($.path!=null)ne=xt({},$,{path:qi(w,$.path,J.path).path});else{const z=xt({},$.params);for(const te in z)z[te]==null&&delete z[te];ne=xt({},$,{params:p(z)}),J.params=p(J.params)}const ce=d.resolve(ne,J),ie=$.hash||"";ce.params=g(n(ce.params));const pe=Kv(t,xt({},$,{hash:zv(ie),path:ce.path})),K=x.createHref(pe);return xt({fullPath:pe,hash:ie,query:t===_c?T0($.query):$.query||{}},ce,{redirectedFrom:void 0,href:K})}function f($){return typeof $=="string"?qi(w,$,o.value.path):xt({},$)}function m($,J){if(c!==$)return wo(8,{from:J,to:$})}function b($){return E($)}function j($){return b(xt(f($),{replace:!0}))}function k($){const J=$.matched[$.matched.length-1];if(J&&J.redirect){const{redirect:ne}=J;let ce=typeof ne=="function"?ne($):ne;return typeof ce=="string"&&(ce=ce.includes("?")||ce.includes("#")?ce=f(ce):{path:ce},ce.params={}),xt({query:$.query,hash:$.hash,params:ce.path!=null?{}:$.params},ce)}}function E($,J){const ne=c=l($),ce=o.value,ie=$.state,pe=$.force,K=$.replace===!0,z=k(ne);if(z)return E(xt(f(z),{state:typeof z=="object"?xt({},ie,z.state):ie,force:pe,replace:K}),J||ne);const te=ne;te.redirectedFrom=J;let le;return!pe&&Zv(t,ce,ne)&&(le=wo(16,{to:te,from:ce}),ee(ce,ce,!0,!1)),(le?Promise.resolve(le):L(te,ce)).catch(me=>dn(me)?dn(me,2)?me:Z(me):V(me,te,ce)).then(me=>{if(me){if(dn(me,2))return E(xt({replace:K},f(me.to),{state:typeof me.to=="object"?xt({},ie,me.to.state):ie,force:pe}),J||te)}else me=I(te,ce,!0,K,ie);return C(te,ce,me),me})}function M($,J){const ne=m($,J);return ne?Promise.reject(ne):Promise.resolve()}function P($){const J=D.values().next().value;return J&&typeof J.runWithContext=="function"?J.runWithContext($):$()}function L($,J){let ne;const[ce,ie,pe]=I0($,J);ne=Xi(ce.reverse(),"beforeRouteLeave",$,J);for(const z of ce)z.leaveGuards.forEach(te=>{ne.push(Cn(te,$,J))});const K=M.bind(null,$,J);return ne.push(K),W(ne).then(()=>{ne=[];for(const z of v.list())ne.push(Cn(z,$,J));return ne.push(K),W(ne)}).then(()=>{ne=Xi(ie,"beforeRouteUpdate",$,J);for(const z of ie)z.updateGuards.forEach(te=>{ne.push(Cn(te,$,J))});return ne.push(K),W(ne)}).then(()=>{ne=[];for(const z of pe)if(z.beforeEnter)if(Qr(z.beforeEnter))for(const te of z.beforeEnter)ne.push(Cn(te,$,J));else ne.push(Cn(z.beforeEnter,$,J));return ne.push(K),W(ne)}).then(()=>($.matched.forEach(z=>z.enterCallbacks={}),ne=Xi(pe,"beforeRouteEnter",$,J,P),ne.push(K),W(ne))).then(()=>{ne=[];for(const z of s.list())ne.push(Cn(z,$,J));return ne.push(K),W(ne)}).catch(z=>dn(z,8)?z:Promise.reject(z))}function C($,J,ne){u.list().forEach(ce=>P(()=>ce($,J,ne)))}function I($,J,ne,ce,ie){const pe=m($,J);if(pe)return pe;const K=J===$r,z=so?history.state:{};ne&&(ce||K?x.replace($.fullPath,xt({scroll:K&&z&&z.scroll},ie)):x.push($.fullPath,ie)),o.value=$,ee($,J,ne,K),Z()}let A;function N(){A||(A=x.listen(($,J,ne)=>{if(!G.listening)return;const ce=l($),ie=k(ce);if(ie){E(xt(ie,{replace:!0}),ce).catch(Wo);return}c=ce;const pe=o.value;so&&s0(fc(pe.fullPath,ne.delta),yi()),L(ce,pe).catch(K=>dn(K,12)?K:dn(K,2)?(E(K.to,ce).then(z=>{dn(z,20)&&!ne.delta&&ne.type===rs.pop&&x.go(-1,!1)}).catch(Wo),Promise.reject()):(ne.delta&&x.go(-ne.delta,!1),V(K,ce,pe))).then(K=>{K=K||I(ce,pe,!1),K&&(ne.delta&&!dn(K,8)?x.go(-ne.delta,!1):ne.type===rs.pop&&dn(K,20)&&x.go(-1,!1)),C(ce,pe,K)}).catch(Wo)}))}let F=Do(),B=Do(),q;function V($,J,ne){Z($);const ce=B.list();return ce.length?ce.forEach(ie=>ie($,J,ne)):console.error($),Promise.reject($)}function H(){return q&&o.value!==$r?Promise.resolve():new Promise(($,J)=>{F.add([$,J])})}function Z($){return q||(q=!$,N(),F.list().forEach(([J,ne])=>$?ne($):J()),F.reset()),$}function ee($,J,ne,ce){const{scrollBehavior:ie}=r;if(!so||!ie)return Promise.resolve();const pe=!ne&&i0(fc($.fullPath,0))||(ce||!ne)&&history.state&&history.state.scroll||null;return Dr().then(()=>ie($,J,pe)).then(K=>K&&o0(K)).catch(K=>V(K,$,J))}const ue=$=>x.go($);let T;const D=new Set,G={currentRoute:o,listening:!0,addRoute:i,removeRoute:a,hasRoute:y,getRoutes:h,resolve:l,options:r,push:b,replace:j,go:ue,back:()=>ue(-1),forward:()=>ue(1),beforeEach:v.add,beforeResolve:s.add,afterEach:u.add,onError:B.add,isReady:H,install($){const J=this;$.component("RouterLink",O0),$.component("RouterView",$f),$.config.globalProperties.$router=J,Object.defineProperty($.config.globalProperties,"$route",{enumerable:!0,get:()=>Bt(o)}),so&&!T&&o.value===$r&&(T=!0,b(x.location).catch(ie=>{}));const ne={};for(const ie in $r)Object.defineProperty(ne,ie,{get:()=>o.value[ie],enumerable:!0});$.provide(pl,J),$.provide(ml,ss(ne)),$.provide(Aa,o);const ce=$.unmount;D.add($),$.unmount=function(){D.delete($),D.size<1&&(c=$r,A&&A(),A=null,o.value=$r,T=!1,q=!1),ce()}}};function W($){return $.reduce((J,ne)=>J.then(()=>P(ne)),Promise.resolve())}return G}function I0(r,d){const w=[],t=[],x=[],v=Math.max(d.matched.length,r.matched.length);for(let s=0;s_o(c,u))?t.push(u):w.push(u));const o=r.matched[s];o&&(d.matched.find(c=>_o(c,o))||x.push(o))}return[w,t,x]}function D0(){return Ht(ml)}const F0=(r,d)=>d.path.replace(/(:\w+)\([^)]+\)/g,"$1").replace(/(:\w+)[?+*]/g,"$1").replace(/:\w+/g,w=>{var t;return((t=r.params[w.slice(1)])==null?void 0:t.toString())||""}),Ra=(r,d)=>{const w=r.route.matched.find(x=>{var v;return((v=x.components)==null?void 0:v.default)===r.Component.type}),t=d??(w==null?void 0:w.meta.key)??(w&&F0(r.route,w));return typeof t=="function"?t(r.route):t},N0=(r,d)=>({default:()=>r?tr(Hp,r===!0?{}:r,d):d});function yl(r){return Array.isArray(r)?r:[r]}const Yi=null,$i=null,wr={layout:"empty"},Ki=null,Zi=null,Qi=null,xr={layout:"light"},jr={layout:"light"},Ji=null,Sr={layout:"light"},Er={layout:"light"},Tr={layout:"light"},kr={layout:"light"},Mr={layout:"light"},Cr={layout:"light"},Or={layout:"light"},Pr={layout:"light"},Tc=[{name:"articles-slug",path:"/articles/:slug(.*)*",meta:{},alias:[],redirect:Yi==null?void 0:Yi.redirect,component:()=>rt(()=>import("./D49jv_td.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8]),import.meta.url).then(r=>r.default||r)},{name:"articles",path:"/articles",meta:{},alias:[],redirect:$i==null?void 0:$i.redirect,component:()=>rt(()=>import("./5U82x1xs.js"),__vite__mapDeps([9,1,2,3,4,5,7]),import.meta.url).then(r=>r.default||r)},{name:(wr==null?void 0:wr.name)??"card",path:(wr==null?void 0:wr.path)??"/card",meta:wr||{},alias:(wr==null?void 0:wr.alias)||[],redirect:wr==null?void 0:wr.redirect,component:()=>rt(()=>import("./DdxBPLFy.js"),__vite__mapDeps([10,11]),import.meta.url).then(r=>r.default||r)},{name:"examples-nested_transitions",path:"/examples/nested_transitions",meta:{},alias:[],redirect:Ki==null?void 0:Ki.redirect,component:()=>rt(()=>import("./Gu-IR7O7.js"),[],import.meta.url).then(r=>r.default||r)},{name:"index",path:"/",meta:{},alias:[],redirect:Zi==null?void 0:Zi.redirect,component:()=>rt(()=>import("./DQogfMZl.js"),__vite__mapDeps([12,11,13,7,4,3]),import.meta.url).then(r=>r.default||r)},{name:"playground-audio",path:"/playground/audio",meta:{},alias:[],redirect:Qi==null?void 0:Qi.redirect,component:()=>rt(()=>import("./CCMBC9ge.js"),[],import.meta.url).then(r=>r.default||r)},{name:(xr==null?void 0:xr.name)??"playground-chords",path:(xr==null?void 0:xr.path)??"/playground/chords",meta:xr||{},alias:(xr==null?void 0:xr.alias)||[],redirect:xr==null?void 0:xr.redirect,component:()=>rt(()=>import("./4sYS9Rtn.js"),[],import.meta.url).then(r=>r.default||r)},{name:(jr==null?void 0:jr.name)??"playground-french",path:(jr==null?void 0:jr.path)??"/playground/french",meta:jr||{},alias:(jr==null?void 0:jr.alias)||[],redirect:jr==null?void 0:jr.redirect,component:()=>rt(()=>import("./CV7OJtEk.js"),__vite__mapDeps([14,4,6]),import.meta.url).then(r=>r.default||r)},{name:"playground",path:"/playground",meta:{},alias:[],redirect:Ji==null?void 0:Ji.redirect,component:()=>rt(()=>import("./CvX9Ic8u.js"),__vite__mapDeps([15,13]),import.meta.url).then(r=>r.default||r)},{name:(Sr==null?void 0:Sr.name)??"playground-matrix",path:(Sr==null?void 0:Sr.path)??"/playground/matrix",meta:Sr||{},alias:(Sr==null?void 0:Sr.alias)||[],redirect:Sr==null?void 0:Sr.redirect,component:()=>rt(()=>import("./DPT0E5C3.js"),[],import.meta.url).then(r=>r.default||r)},{name:(Er==null?void 0:Er.name)??"playground-metronome",path:(Er==null?void 0:Er.path)??"/playground/metronome",meta:Er||{},alias:(Er==null?void 0:Er.alias)||[],redirect:Er==null?void 0:Er.redirect,component:()=>rt(()=>import("./B0OY2XLG.js"),[],import.meta.url).then(r=>r.default||r)},{name:(Tr==null?void 0:Tr.name)??"playground-midi",path:(Tr==null?void 0:Tr.path)??"/playground/midi",meta:Tr||{},alias:(Tr==null?void 0:Tr.alias)||[],redirect:Tr==null?void 0:Tr.redirect,component:()=>rt(()=>import("./DTidYmMf.js"),[],import.meta.url).then(r=>r.default||r)},{name:(kr==null?void 0:kr.name)??"playground-palettes-mountains",path:(kr==null?void 0:kr.path)??"/playground/palettes/mountains",meta:kr||{},alias:(kr==null?void 0:kr.alias)||[],redirect:kr==null?void 0:kr.redirect,component:()=>rt(()=>import("./CPjbdFE6.js"),[],import.meta.url).then(r=>r.default||r)},{name:(Mr==null?void 0:Mr.name)??"playground-palettes-variance",path:(Mr==null?void 0:Mr.path)??"/playground/palettes/variance",meta:Mr||{},alias:(Mr==null?void 0:Mr.alias)||[],redirect:Mr==null?void 0:Mr.redirect,component:()=>rt(()=>import("./YbSleFl9.js"),[],import.meta.url).then(r=>r.default||r)},{name:(Cr==null?void 0:Cr.name)??"playground-plotter",path:(Cr==null?void 0:Cr.path)??"/playground/plotter",meta:Cr||{},alias:(Cr==null?void 0:Cr.alias)||[],redirect:Cr==null?void 0:Cr.redirect,component:()=>rt(()=>import("./iK2nAm-v.js"),[],import.meta.url).then(r=>r.default||r)},{name:(Or==null?void 0:Or.name)??"playground-tiling",path:(Or==null?void 0:Or.path)??"/playground/tiling",meta:Or||{},alias:(Or==null?void 0:Or.alias)||[],redirect:Or==null?void 0:Or.redirect,component:()=>rt(()=>import("./D5qHgTT0.js"),[],import.meta.url).then(r=>r.default||r)},{name:(Pr==null?void 0:Pr.name)??"playground-waves",path:(Pr==null?void 0:Pr.path)??"/playground/waves",meta:Pr||{},alias:(Pr==null?void 0:Pr.alias)||[],redirect:Pr==null?void 0:Pr.redirect,component:()=>rt(()=>import("./CvtpGHRQ.js"),[],import.meta.url).then(r=>r.default||r)}],Kf=(r,d,w)=>(d=d===!0?{}:d,{default:()=>{var t;return d?tr(r,d,w):(t=w.default)==null?void 0:t.call(w)}});function kc(r){const d=(r==null?void 0:r.meta.key)??r.path.replace(/(:\w+)\([^)]+\)/g,"$1").replace(/(:\w+)[?+*]/g,"$1").replace(/:\w+/g,w=>{var t;return((t=r.params[w.slice(1)])==null?void 0:t.toString())||""});return typeof d=="function"?d(r):d}function U0(r,d){return r===d||d===$r?!1:kc(r)!==kc(d)?!0:!r.matched.every((t,x)=>{var v,s;return t.components&&t.components.default===((s=(v=d.matched[x])==null?void 0:v.components)==null?void 0:s.default)})}const B0={scrollBehavior(r,d,w){var c;const t=It(),x=((c=Wr().options)==null?void 0:c.scrollBehaviorType)??"auto";let v=w||void 0;const s=typeof r.meta.scrollToTop=="function"?r.meta.scrollToTop(r,d):r.meta.scrollToTop;if(!v&&d&&r&&s!==!1&&U0(r,d)&&(v={left:0,top:0}),r.path===d.path)return d.hash&&!r.hash?{left:0,top:0}:r.hash?{el:r.hash,top:Mc(r.hash),behavior:x}:!1;const u=g=>!!(g.meta.pageTransition??Ca),o=u(d)&&u(r)?"page:transition:finish":"page:finish";return new Promise(g=>{t.hooks.hookOnce(o,async()=>{await new Promise(p=>setTimeout(p,0)),r.hash&&(v={el:r.hash,top:Mc(r.hash),behavior:x}),g(v)})})}};function Mc(r){try{const d=document.querySelector(r);if(d)return parseFloat(getComputedStyle(d).scrollMarginTop)}catch{}return 0}const G0={hashMode:!1,scrollBehaviorType:"auto"},Ar={...G0,...B0},V0=async r=>{var o;let d,w;if(!((o=r.meta)!=null&&o.validate))return;const t=It(),x=Wr();if(([d,w]=es(()=>Promise.resolve(r.meta.validate(r))),d=await d,w(),d)===!0)return;const s=pi({statusCode:404,statusMessage:`Page Not Found: ${r.fullPath}`,data:{path:r.fullPath}}),u=x.beforeResolve(c=>{if(u(),c===r){const g=x.afterEach(async()=>{g(),await t.runWithContext(()=>ao(s)),window.history.pushState({},"",r.fullPath)});return!1}})},H0=async r=>{let d,w;const t=([d,w]=es(()=>fl(r.path)),d=await d,w(),d);if(t.redirect)return mn(t.redirect,{acceptRelative:!0})?(window.location.href=t.redirect,!1):t.redirect},z0=[V0,H0],Xo={};function W0(r,d,w){const{pathname:t,search:x,hash:v}=d,s=r.indexOf("#");if(s>-1){const c=v.includes(r.slice(s))?r.slice(s).length:1;let g=v.slice(c);return g[0]!=="/"&&(g="/"+g),Yu(g,"")}const u=Yu(t,r),o=!w||Oy(u,w,{trailingSlash:!0})?u:w;return o+(o.includes("?")?"":x)+v}const q0=yn({name:"nuxt:router",enforce:"pre",async setup(r){var y,l;let d,w,t=di().app.baseURL;Ar.hashMode&&!t.includes("#")&&(t+="#");const x=((y=Ar.history)==null?void 0:y.call(Ar,t))??(Ar.hashMode?c0(t):Wf(t)),v=((l=Ar.routes)==null?void 0:l.call(Ar,Tc))??Tc;let s;const u=L0({...Ar,scrollBehavior:(f,m,b)=>{if(m===$r){s=b;return}if(Ar.scrollBehavior){if(u.options.scrollBehavior=Ar.scrollBehavior,"scrollRestoration"in window.history){const j=u.beforeEach(()=>{j(),window.history.scrollRestoration="manual"})}return Ar.scrollBehavior(f,$r,s||b)}},history:x,routes:v});"scrollRestoration"in window.history&&(window.history.scrollRestoration="auto"),r.vueApp.use(u);const o=$o(u.currentRoute.value);u.afterEach((f,m)=>{o.value=m}),Object.defineProperty(r.vueApp.config.globalProperties,"previousRoute",{get:()=>o.value});const c=W0(t,window.location,r.payload.path),g=$o(u.currentRoute.value),p=()=>{g.value=u.currentRoute.value};r.hook("page:finish",p),u.afterEach((f,m)=>{var b,j,k,E;((j=(b=f.matched[0])==null?void 0:b.components)==null?void 0:j.default)===((E=(k=m.matched[0])==null?void 0:k.components)==null?void 0:E.default)&&p()});const n={};for(const f in g.value)Object.defineProperty(n,f,{get:()=>g.value[f]});r._route=ss(n),r._middleware=r._middleware||{global:[],named:{}};try{[d,w]=es(()=>u.isReady()),await d,w()}catch(f){[d,w]=es(()=>r.runWithContext(()=>ao(f))),await d,w()}const i=c!==u.currentRoute.value.fullPath?u.resolve(c):u.currentRoute.value;p();const a=r.payload.state._layout;u.beforeEach(async(f,m)=>{var b;await r.callHook("page:loading:start"),f.meta=Nn(f.meta),r.isHydrating&&a&&!yo(f.meta.layout)&&(f.meta.layout=a),r._processingMiddleware=!0;{const j=new Set([...z0,...r._middleware.global]);for(const k of f.matched){const E=k.meta.middleware;if(E)for(const M of yl(E))j.add(M)}{const k=await r.runWithContext(()=>fl(f.path));if(k.appMiddleware)for(const E in k.appMiddleware)k.appMiddleware[E]?j.add(E):j.delete(E)}for(const k of j){const E=typeof k=="string"?r._middleware.named[k]||await((b=Xo[k])==null?void 0:b.call(Xo).then(P=>P.default||P)):k;if(!E)throw new Error(`Unknown route middleware: '${k}'.`);const M=await r.runWithContext(()=>E(f,m));if(!r.payload.serverRendered&&r.isHydrating&&(M===!1||M instanceof Error)){const P=M||Sa({statusCode:404,statusMessage:`Page Not Found: ${c}`});return await r.runWithContext(()=>ao(P)),!1}if(M!==!0&&(M||M===!1))return M}}}),u.onError(async()=>{delete r._processingMiddleware,await r.callHook("page:loading:end")});const h=hi();return u.afterEach(async(f,m,b)=>{delete r._processingMiddleware,!r.isHydrating&&h.value&&await r.runWithContext(wg),b&&await r.callHook("page:loading:end"),f.matched.length===0&&await r.runWithContext(()=>ao(Sa({statusCode:404,fatal:!1,statusMessage:`Page not found: ${f.fullPath}`,data:{path:f.fullPath}})))}),r.hooks.hookOnce("app:created",async()=>{try{"name"in i&&(i.name=void 0),await u.replace({...i,force:!0}),u.options.scrollBehavior=Ar.scrollBehavior}catch(f){await r.runWithContext(()=>ao(f))}}),{provide:{router:u}}}}),La=globalThis.requestIdleCallback||(r=>{const d=Date.now(),w={didTimeout:!1,timeRemaining:()=>Math.max(0,50-(Date.now()-d))};return setTimeout(()=>{r(w)},1)}),X0=globalThis.cancelIdleCallback||(r=>{clearTimeout(r)}),gl=r=>{const d=It();d.isHydrating?d.hooks.hookOnce("app:suspense:resolve",()=>{La(r)}):La(r)},Y0=yn({name:"nuxt:payload",setup(r){Wr().beforeResolve(async(d,w)=>{if(d.path===w.path)return;const t=await lc(d.path);t&&Object.assign(r.static.data,t.data)}),gl(()=>{var d;r.hooks.hook("link:prefetch",async w=>{ds(w).protocol||await lc(w)}),((d=navigator.connection)==null?void 0:d.effectiveType)!=="slow-2g"&&setTimeout(mi,1e3)})}}),$0=yn(r=>{let d;async function w(){const t=await mi();d&&clearTimeout(d),d=setTimeout(w,1e3*60*60);try{const x=await $fetch(ll("builds/latest.json")+`?${Date.now()}`);x.id!==t.id&&r.hooks.callHook("app:manifest:update",x)}catch{}}gl(()=>{d=setTimeout(w,1e3*60*60)})}),K0=ft(()=>rt(()=>import("./C0BUAfVO.js"),__vite__mapDeps([16,5,1,2,3,4,17,6,7]),import.meta.url).then(r=>r.default||r.default||r)),Z0=ft(()=>rt(()=>import("./Bay-NfhX.js"),__vite__mapDeps([18,17,6,7,4,3]),import.meta.url).then(r=>r.default||r.default||r)),Q0=ft(()=>rt(()=>import("./7iwyPdUt.js"),__vite__mapDeps([19,6,4,7,3]),import.meta.url).then(r=>r.default||r.default||r)),J0=ft(()=>rt(()=>import("./WlOj4iQ2.js"),__vite__mapDeps([17,6,7,4,3]),import.meta.url).then(r=>r.default||r.default||r)),eb=ft(()=>rt(()=>import("./D_k-9tiD.js"),__vite__mapDeps([5,1,2,3,4]),import.meta.url).then(r=>r.default||r.default||r)),tb=ft(()=>rt(()=>import("./qyNTjY-r.js"),__vite__mapDeps([20,1,2,3,4]),import.meta.url).then(r=>r.default||r.default||r)),rb=ft(()=>rt(()=>import("./DIITZ_oT.js"),[],import.meta.url).then(r=>r.default||r.default||r)),nb=ft(()=>rt(()=>import("./NhjOPkCk.js"),[],import.meta.url).then(r=>r.default||r.default||r)),ob=ft(()=>rt(()=>import("./BNS4yJEB.js"),[],import.meta.url).then(r=>r.default||r.default||r)),sb=ft(()=>rt(()=>import("./Cr8785qx.js"),__vite__mapDeps([21,22]),import.meta.url).then(r=>r.default||r.default||r)),ib=ft(()=>rt(()=>import("./gFw6sSaE.js"),__vite__mapDeps([23,24,25]),import.meta.url).then(r=>r.default||r.default||r)),ab=ft(()=>rt(()=>import("./BlPTAj4D.js"),[],import.meta.url).then(r=>r.default||r.default||r)),lb=ft(()=>rt(()=>import("./CgyoODLv.js"),__vite__mapDeps([26,24,25]),import.meta.url).then(r=>r.default||r.default||r)),ub=ft(()=>rt(()=>import("./BVJrLhrR.js"),[],import.meta.url).then(r=>r.default||r.default||r)),cb=ft(()=>rt(()=>import("./DmysA0Ea.js"),[],import.meta.url).then(r=>r.default||r.default||r)),db=ft(()=>rt(()=>import("./Dr9mNFSB.js"),[],import.meta.url).then(r=>r.default||r.default||r)),fb=ft(()=>rt(()=>import("./DzLfPs8s.js"),[],import.meta.url).then(r=>r.default||r.default||r)),hb=ft(()=>rt(()=>import("./DYvJhXU5.js"),[],import.meta.url).then(r=>r.default||r.default||r)),pb=ft(()=>rt(()=>import("./BH04L1rH.js"),[],import.meta.url).then(r=>r.default||r.default||r)),mb=ft(()=>rt(()=>import("./C2Jkzvlm.js"),[],import.meta.url).then(r=>r.default||r.default||r)),yb=ft(()=>rt(()=>import("./DwbcVy96.js"),[],import.meta.url).then(r=>r.default||r.default||r)),gb=ft(()=>rt(()=>import("./AZz_nUEh.js"),[],import.meta.url).then(r=>r.default||r.default||r)),vb=ft(()=>rt(()=>import("./DQ54uNhR.js"),[],import.meta.url).then(r=>r.default||r.default||r)),bb=ft(()=>rt(()=>import("./DO2yUAnP.js"),[],import.meta.url).then(r=>r.default||r.default||r)),_b=ft(()=>rt(()=>import("./DKX5xB3o.js"),[],import.meta.url).then(r=>r.default||r.default||r)),wb=ft(()=>rt(()=>import("./DNf9KyJp.js"),[],import.meta.url).then(r=>r.default||r.default||r)),xb=ft(()=>rt(()=>import("./PQfcYOpS.js"),[],import.meta.url).then(r=>r.default||r.default||r)),jb=ft(()=>rt(()=>import("./D9cQXS52.js"),[],import.meta.url).then(r=>r.default||r.default||r)),Sb=ft(()=>rt(()=>import("./BHKXDL_d.js"),[],import.meta.url).then(r=>r.default||r.default||r)),Eb=ft(()=>rt(()=>import("./B4E9Ejgf.js"),[],import.meta.url).then(r=>r.default||r.default||r)),Tb=ft(()=>rt(()=>import("./DlW6eYPj.js"),[],import.meta.url).then(r=>r.default||r.default||r)),kb=ft(()=>rt(()=>import("./Dw8zNcBR.js"),[],import.meta.url).then(r=>r.default||r.default||r)),Mb=ft(()=>rt(()=>import("./BfNsWvZZ.js"),[],import.meta.url).then(r=>r.default||r.default||r)),Cb=ft(()=>rt(()=>import("./BPc1APT0.js"),[],import.meta.url).then(r=>r.default||r.default||r)),Ob=ft(()=>rt(()=>import("./BJeRYyju.js"),[],import.meta.url).then(r=>r.default||r.default||r)),Pb=ft(()=>rt(()=>import("./DmJB5K9d.js"),[],import.meta.url).then(r=>r.default||r.default||r)),Ab=[["ContentDoc",K0],["ContentList",Z0],["ContentNavigation",Q0],["ContentQuery",J0],["ContentRenderer",eb],["ContentRendererMarkdown",tb],["MDCSlot",rb],["DocumentDrivenEmpty",nb],["DocumentDrivenNotFound",ob],["Markdown",sb],["ProseCode",ib],["ProseCodeInline",ab],["ProsePre",lb],["ProseA",ub],["ProseBlockquote",cb],["ProseEm",db],["ProseH1",fb],["ProseH2",hb],["ProseH3",pb],["ProseH4",mb],["ProseH5",yb],["ProseH6",gb],["ProseHr",vb],["ProseImg",bb],["ProseLi",_b],["ProseOl",wb],["ProseP",xb],["ProseScript",jb],["ProseStrong",Sb],["ProseTable",Eb],["ProseTbody",Tb],["ProseTd",kb],["ProseTh",Mb],["ProseThead",Cb],["ProseTr",Ob],["ProseUl",Pb]],Rb=yn({name:"nuxt:global-components",setup(r){for(const[d,w]of Ab)r.vueApp.component(d,w),r.vueApp.component("Lazy"+d,w)}}),On={default:()=>rt(()=>import("./4Lx8IeLa.js"),[],import.meta.url).then(r=>r.default||r),empty:()=>rt(()=>import("./BjpF7IbB.js"),[],import.meta.url).then(r=>r.default||r),light:()=>rt(()=>import("./CKgGom8U.js"),[],import.meta.url).then(r=>r.default||r)},Lb=yn({name:"nuxt:prefetch",setup(r){const d=Wr();r.hooks.hook("app:mounted",()=>{d.beforeEach(async w=>{var x;const t=(x=w==null?void 0:w.meta)==null?void 0:x.layout;t&&typeof On[t]=="function"&&await On[t]()})}),r.hooks.hook("link:prefetch",w=>{if(mn(w))return;const t=d.resolve(w);if(!t)return;const x=t.meta.layout;let v=yl(t.meta.middleware);v=v.filter(s=>typeof s=="string");for(const s of v)typeof Xo[s]=="function"&&Xo[s]();x&&typeof On[x]=="function"&&On[x]()})}});function Ib(r={}){const d=r.path||window.location.pathname;let w={};try{w=Xs(sessionStorage.getItem("nuxt:reload")||"{}")}catch{}if(r.force||(w==null?void 0:w.path)!==d||(w==null?void 0:w.expires){t.clear()}),r.hook("app:chunkError",({error:v})=>{t.add(v)});function x(v){const u="href"in v&&v.href[0]==="#"?w.app.baseURL+v.href:ci(w.app.baseURL,v.fullPath);Ib({path:u,persistState:!0})}r.hook("app:manifest:update",()=>{d.beforeResolve(x)}),d.onError((v,s)=>{t.has(v)&&x(s)})}});var Os=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Fb(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r.default:r}function Ps(r){throw new Error('Could not dynamically require "'+r+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var Zf={exports:{}};/*! p5.js v1.9.3 April 24, 2024 */(function(r,d){(function(w){r.exports=w()})(function(){var w;return function t(x,v,s){function u(g,p){if(!v[g]){if(!x[g]){var n=typeof Ps=="function"&&Ps;if(!p&&n)return n(g,!0);if(o)return o(g,!0);throw(p=new Error("Cannot find module '"+g+"'")).code="MODULE_NOT_FOUND",p}n=v[g]={exports:{}},x[g][0].call(n.exports,function(i){return u(x[g][1][i]||i)},n,n.exports,t,x,v,s)}return v[g].exports}for(var o=typeof Ps=="function"&&Ps,c=0;c>16&255,f[m++]=a>>8&255,f[m++]=255&a;return l===2&&(a=u[i.charCodeAt(h)]<<2|u[i.charCodeAt(h+1)]>>4,f[m++]=255&a),l===1&&(a=u[i.charCodeAt(h)]<<10|u[i.charCodeAt(h+1)]<<4|u[i.charCodeAt(h+2)]>>2,f[m++]=a>>8&255,f[m++]=255&a),f},v.fromByteArray=function(i){for(var a,h=i.length,y=h%3,l=[],f=0,m=h-y;f>18&63]+s[L>>12&63]+s[L>>6&63]+s[63&L]}(E));return M.join("")}(i,f,m>2]+s[a<<4&63]+"==")):y==2&&(a=(i[h-2]<<8)+i[h-1],l.push(s[a>>10]+s[a>>4&63]+s[a<<2&63]+"=")),l.join("")};for(var s=[],u=[],o=typeof Uint8Array<"u"?Uint8Array:Array,c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",g=0,p=c.length;g>>1;case"base64":return V(T).length;default:if($)return W?-1:q(T).length;D=(""+D).toLowerCase(),$=!0}}function m(T,D,G){var W,$=!1;if((D=D===void 0||D<0?0:D)>this.length||(G=G===void 0||G>this.length?this.length:G)<=0||(G>>>=0)<=(D>>>=0))return"";for(T=T||"utf8";;)switch(T){case"hex":var J=this,de=D,ne=G,K=J.length;(!ne||ne<0||K=T.length){if($)return-1;G=T.length-1}else if(G<0){if(!$)return-1;G=0}if(typeof D=="string"&&(D=n.from(D,W)),n.isBuffer(D))return D.length===0?-1:k(T,D,G,W,$);if(typeof D=="number")return D&=255,typeof Uint8Array.prototype.indexOf=="function"?($?Uint8Array.prototype.indexOf:Uint8Array.prototype.lastIndexOf).call(T,D,G):k(T,[D],G,W,$);throw new TypeError("val must be string, number or Buffer")}function k(T,D,G,W,$){var J=1,ne=T.length,ce=D.length;if(W!==void 0&&((W=String(W).toLowerCase())==="ucs2"||W==="ucs-2"||W==="utf16le"||W==="utf-16le")){if(T.length<2||D.length<2)return-1;ne/=J=2,ce/=2,G/=2}function ie(le,me){return J===1?le[me]:le.readUInt16BE(me*J)}if($)for(var pe=-1,K=G;K>8,ce=ce%256,ie.push(ce),ie.push(ne);return ie}(D,T.length-G),T,G,W)}function P(T,D,G){G=Math.min(T.length,G);for(var W=[],$=D;$>>10&1023|55296),K=56320|1023&K),W.push(K),$+=z}var te=W,le=te.length;if(le<=L)return String.fromCharCode.apply(String,te);for(var me="",de=0;de"u"||typeof console.error!="function"||console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."),Object.defineProperty(n.prototype,"parent",{enumerable:!0,get:function(){if(n.isBuffer(this))return this.buffer}}),Object.defineProperty(n.prototype,"offset",{enumerable:!0,get:function(){if(n.isBuffer(this))return this.byteOffset}}),typeof Symbol<"u"&&Symbol.species!=null&&n[Symbol.species]===n&&Object.defineProperty(n,Symbol.species,{value:null,configurable:!0,enumerable:!1,writable:!1}),n.poolSize=8192,n.from=i,Object.setPrototypeOf(n.prototype,Uint8Array.prototype),Object.setPrototypeOf(n,Uint8Array),n.alloc=function(T,D,G){return D=D,G=G,a(T=T),!(T<=0)&&D!==void 0?typeof G=="string"?p(T).fill(D,G):p(T).fill(D):p(T)},n.allocUnsafe=h,n.allocUnsafeSlow=h,n.isBuffer=function(T){return T!=null&&T._isBuffer===!0&&T!==n.prototype},n.compare=function(T,D){if(Z(T,Uint8Array)&&(T=n.from(T,T.offset,T.byteLength)),Z(D,Uint8Array)&&(D=n.from(D,D.offset,D.byteLength)),!n.isBuffer(T)||!n.isBuffer(D))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(T===D)return 0;for(var G=T.length,W=D.length,$=0,J=Math.min(G,W);$T&&(D+=" ... "),""},c&&(n.prototype[c]=n.prototype.inspect),n.prototype.compare=function(T,D,G,W,$){if(Z(T,Uint8Array)&&(T=n.from(T,T.offset,T.byteLength)),!n.isBuffer(T))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof T);if(G===void 0&&(G=T?T.length:0),W===void 0&&(W=0),$===void 0&&($=this.length),(D=D===void 0?0:D)<0||G>T.length||W<0||$>this.length)throw new RangeError("out of range index");if($<=W&&G<=D)return 0;if($<=W)return-1;if(G<=D)return 1;if(this===T)return 0;for(var J=($>>>=0)-(W>>>=0),ne=(G>>>=0)-(D>>>=0),ce=Math.min(J,ne),ie=this.slice(W,$),pe=T.slice(D,G),K=0;K>>=0,isFinite(G)?(G>>>=0,W===void 0&&(W="utf8")):(W=G,G=void 0)}var $=this.length-D;if((G===void 0||$this.length)throw new RangeError("Attempt to write outside buffer bounds");W=W||"utf8";for(var J,ne,ce,ie=!1;;)switch(W){case"hex":var pe=this,K=T,z=D,te=G,le=(z=Number(z)||0,pe.length-z);(!te||le<(te=Number(te)))&&(te=le),(le=K.length)/2T.length)throw new RangeError("Index out of range")}function A(T,D,G,W){if(G+W>T.length)throw new RangeError("Index out of range");if(G<0)throw new RangeError("Index out of range")}function N(T,D,G,W,$){return D=+D,G>>>=0,$||A(T,0,G,4),o.write(T,D,G,W,23,4),G+4}function F(T,D,G,W,$){return D=+D,G>>>=0,$||A(T,0,G,8),o.write(T,D,G,W,52,8),G+8}n.prototype.slice=function(T,D){var G=this.length,G=((T=~~T)<0?(T+=G)<0&&(T=0):G>>=0,D>>>=0,G||C(T,D,this.length);for(var W=this[T],$=1,J=0;++J>>=0,D>>>=0,G||C(T,D,this.length);for(var W=this[T+--D],$=1;0>>=0,D||C(T,1,this.length),this[T]},n.prototype.readUInt16LE=function(T,D){return T>>>=0,D||C(T,2,this.length),this[T]|this[T+1]<<8},n.prototype.readUInt16BE=function(T,D){return T>>>=0,D||C(T,2,this.length),this[T]<<8|this[T+1]},n.prototype.readUInt32LE=function(T,D){return T>>>=0,D||C(T,4,this.length),(this[T]|this[T+1]<<8|this[T+2]<<16)+16777216*this[T+3]},n.prototype.readUInt32BE=function(T,D){return T>>>=0,D||C(T,4,this.length),16777216*this[T]+(this[T+1]<<16|this[T+2]<<8|this[T+3])},n.prototype.readIntLE=function(T,D,G){T>>>=0,D>>>=0,G||C(T,D,this.length);for(var W=this[T],$=1,J=0;++J>>=0,D>>>=0,G||C(T,D,this.length);for(var W=D,$=1,J=this[T+--W];0>>=0,D||C(T,1,this.length),128&this[T]?-1*(255-this[T]+1):this[T]},n.prototype.readInt16LE=function(T,D){return T>>>=0,D||C(T,2,this.length),D=this[T]|this[T+1]<<8,32768&D?4294901760|D:D},n.prototype.readInt16BE=function(T,D){return T>>>=0,D||C(T,2,this.length),D=this[T+1]|this[T]<<8,32768&D?4294901760|D:D},n.prototype.readInt32LE=function(T,D){return T>>>=0,D||C(T,4,this.length),this[T]|this[T+1]<<8|this[T+2]<<16|this[T+3]<<24},n.prototype.readInt32BE=function(T,D){return T>>>=0,D||C(T,4,this.length),this[T]<<24|this[T+1]<<16|this[T+2]<<8|this[T+3]},n.prototype.readFloatLE=function(T,D){return T>>>=0,D||C(T,4,this.length),o.read(this,T,!0,23,4)},n.prototype.readFloatBE=function(T,D){return T>>>=0,D||C(T,4,this.length),o.read(this,T,!1,23,4)},n.prototype.readDoubleLE=function(T,D){return T>>>=0,D||C(T,8,this.length),o.read(this,T,!0,52,8)},n.prototype.readDoubleBE=function(T,D){return T>>>=0,D||C(T,8,this.length),o.read(this,T,!1,52,8)},n.prototype.writeUIntLE=function(T,D,G,W){T=+T,D>>>=0,G>>>=0,W||I(this,T,D,G,Math.pow(2,8*G)-1,0);var $=1,J=0;for(this[D]=255&T;++J>>=0,G>>>=0,W||I(this,T,D,G,Math.pow(2,8*G)-1,0);var $=G-1,J=1;for(this[D+$]=255&T;0<=--$&&(J*=256);)this[D+$]=T/J&255;return D+G},n.prototype.writeUInt8=function(T,D,G){return T=+T,D>>>=0,G||I(this,T,D,1,255,0),this[D]=255&T,D+1},n.prototype.writeUInt16LE=function(T,D,G){return T=+T,D>>>=0,G||I(this,T,D,2,65535,0),this[D]=255&T,this[D+1]=T>>>8,D+2},n.prototype.writeUInt16BE=function(T,D,G){return T=+T,D>>>=0,G||I(this,T,D,2,65535,0),this[D]=T>>>8,this[D+1]=255&T,D+2},n.prototype.writeUInt32LE=function(T,D,G){return T=+T,D>>>=0,G||I(this,T,D,4,4294967295,0),this[D+3]=T>>>24,this[D+2]=T>>>16,this[D+1]=T>>>8,this[D]=255&T,D+4},n.prototype.writeUInt32BE=function(T,D,G){return T=+T,D>>>=0,G||I(this,T,D,4,4294967295,0),this[D]=T>>>24,this[D+1]=T>>>16,this[D+2]=T>>>8,this[D+3]=255&T,D+4},n.prototype.writeIntLE=function(T,D,G,W){T=+T,D>>>=0,W||I(this,T,D,G,(W=Math.pow(2,8*G-1))-1,-W);var $=0,J=1,ne=0;for(this[D]=255&T;++$>0)-ne&255;return D+G},n.prototype.writeIntBE=function(T,D,G,W){T=+T,D>>>=0,W||I(this,T,D,G,(W=Math.pow(2,8*G-1))-1,-W);var $=G-1,J=1,ne=0;for(this[D+$]=255&T;0<=--$&&(J*=256);)T<0&&ne===0&&this[D+$+1]!==0&&(ne=1),this[D+$]=(T/J>>0)-ne&255;return D+G},n.prototype.writeInt8=function(T,D,G){return T=+T,D>>>=0,G||I(this,T,D,1,127,-128),this[D]=255&(T=T<0?255+T+1:T),D+1},n.prototype.writeInt16LE=function(T,D,G){return T=+T,D>>>=0,G||I(this,T,D,2,32767,-32768),this[D]=255&T,this[D+1]=T>>>8,D+2},n.prototype.writeInt16BE=function(T,D,G){return T=+T,D>>>=0,G||I(this,T,D,2,32767,-32768),this[D]=T>>>8,this[D+1]=255&T,D+2},n.prototype.writeInt32LE=function(T,D,G){return T=+T,D>>>=0,G||I(this,T,D,4,2147483647,-2147483648),this[D]=255&T,this[D+1]=T>>>8,this[D+2]=T>>>16,this[D+3]=T>>>24,D+4},n.prototype.writeInt32BE=function(T,D,G){return T=+T,D>>>=0,G||I(this,T,D,4,2147483647,-2147483648),this[D]=(T=T<0?4294967295+T+1:T)>>>24,this[D+1]=T>>>16,this[D+2]=T>>>8,this[D+3]=255&T,D+4},n.prototype.writeFloatLE=function(T,D,G){return N(this,T,D,!0,G)},n.prototype.writeFloatBE=function(T,D,G){return N(this,T,D,!1,G)},n.prototype.writeDoubleLE=function(T,D,G){return F(this,T,D,!0,G)},n.prototype.writeDoubleBE=function(T,D,G){return F(this,T,D,!1,G)},n.prototype.copy=function(T,D,G,W){if(!n.isBuffer(T))throw new TypeError("argument should be a Buffer");if(G=G||0,W||W===0||(W=this.length),D>=T.length&&(D=T.length),(W=0=this.length)throw new RangeError("Index out of range");if(W<0)throw new RangeError("sourceEnd out of bounds");W>this.length&&(W=this.length);var $=(W=T.length-D>>=0,G=G===void 0?this.length:G>>>0,typeof(T=T||0)=="number")for(J=D;J>6|192,63&G|128)}else if(G<65536){if((D-=3)<0)break;J.push(G>>12|224,G>>6&63|128,63&G|128)}else{if(!(G<1114112))throw new Error("Invalid code point");if((D-=4)<0)break;J.push(G>>18|240,G>>12&63|128,G>>6&63|128,63&G|128)}}return J}function V(T){return u.toByteArray(function(D){if((D=(D=D.split("=")[0]).trim().replace(B,"")).length<2)return"";for(;D.length%4!=0;)D+="=";return D}(T))}function H(T,D,G,W){for(var $=0;$=D.length||$>=T.length);++$)D[$+G]=T[$];return $}function Z(T,D){return T instanceof D||T!=null&&T.constructor!=null&&T.constructor.name!=null&&T.constructor.name===D.name}function ee(T){return T!=T}var ue=function(){for(var T="0123456789abcdef",D=new Array(256),G=0;G<16;++G)for(var W=16*G,$=0;$<16;++$)D[W+$]=T[G]+T[$];return D}()}).call(this,t("buffer").Buffer)},{"base64-js":1,buffer:4,ieee754:251}],5:[function(t,x,v){x.exports=function(s){if(typeof s!="function")throw TypeError(String(s)+" is not a function");return s}},{}],6:[function(t,x,v){var s=t("../internals/is-object");x.exports=function(u){if(s(u)||u===null)return u;throw TypeError("Can't set "+String(u)+" as a prototype")}},{"../internals/is-object":75}],7:[function(o,x,v){var s=o("../internals/well-known-symbol"),u=o("../internals/object-create"),o=o("../internals/object-define-property"),c=s("unscopables"),g=Array.prototype;g[c]==null&&o.f(g,c,{configurable:!0,value:u(null)}),x.exports=function(p){g[c][p]=!0}},{"../internals/object-create":91,"../internals/object-define-property":93,"../internals/well-known-symbol":149}],8:[function(t,x,v){var s=t("../internals/string-multibyte").charAt;x.exports=function(u,o,c){return o+(c?s(u,o).length:1)}},{"../internals/string-multibyte":124}],9:[function(t,x,v){x.exports=function(s,u,o){if(s instanceof u)return s;throw TypeError("Incorrect "+(o?o+" ":"")+"invocation")}},{}],10:[function(t,x,v){var s=t("../internals/is-object");x.exports=function(u){if(s(u))return u;throw TypeError(String(u)+" is not an object")}},{"../internals/is-object":75}],11:[function(t,x,v){x.exports=typeof ArrayBuffer<"u"&&typeof DataView<"u"},{}],12:[function(A,x,v){function s(F){return p(F)&&n(N,i(F))}var u,o=A("../internals/array-buffer-native"),c=A("../internals/descriptors"),g=A("../internals/global"),p=A("../internals/is-object"),n=A("../internals/has"),i=A("../internals/classof"),a=A("../internals/create-non-enumerable-property"),h=A("../internals/redefine"),y=A("../internals/object-define-property").f,l=A("../internals/object-get-prototype-of"),f=A("../internals/object-set-prototype-of"),L=A("../internals/well-known-symbol"),A=A("../internals/uid"),m=g.Int8Array,b=m&&m.prototype,j=g.Uint8ClampedArray,j=j&&j.prototype,k=m&&l(m),E=b&&l(b),M=Object.prototype,P=M.isPrototypeOf,L=L("toStringTag"),C=A("TYPED_ARRAY_TAG"),I=o&&!!f&&i(g.opera)!=="Opera",A=!1,N={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8};for(u in N)g[u]||(I=!1);if((!I||typeof k!="function"||k===Function.prototype)&&(k=function(){throw TypeError("Incorrect invocation")},I))for(u in N)g[u]&&f(g[u],k);if((!I||!E||E===M)&&(E=k.prototype,I))for(u in N)g[u]&&f(g[u].prototype,E);if(I&&l(j)!==E&&f(j,E),c&&!n(E,L))for(u in A=!0,y(E,L,{get:function(){return p(this)?this[C]:void 0}}),N)g[u]&&a(g[u],C,u);x.exports={NATIVE_ARRAY_BUFFER_VIEWS:I,TYPED_ARRAY_TAG:A&&C,aTypedArray:function(F){if(s(F))return F;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(F){if(f){if(P.call(k,F))return F}else for(var B in N)if(n(N,u)&&(B=g[B],B&&(F===B||P.call(B,F))))return F;throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(F,B,q){if(c){if(q)for(var V in N)V=g[V],V&&n(V.prototype,F)&&delete V.prototype[F];E[F]&&!q||h(E,F,!q&&I&&b[F]||B)}},exportTypedArrayStaticMethod:function(F,B,q){var V,H;if(c){if(f){if(q)for(V in N)(H=g[V])&&n(H,F)&&delete H[F];if(k[F]&&!q)return;try{return h(k,F,!q&&I&&m[F]||B)}catch{}}for(V in N)!(H=g[V])||H[F]&&!q||h(H,F,B)}},isView:function(F){return F=i(F),F==="DataView"||n(N,F)},isTypedArray:s,TypedArray:k,TypedArrayPrototype:E}},{"../internals/array-buffer-native":11,"../internals/classof":29,"../internals/create-non-enumerable-property":38,"../internals/descriptors":43,"../internals/global":60,"../internals/has":61,"../internals/is-object":75,"../internals/object-define-property":93,"../internals/object-get-prototype-of":98,"../internals/object-set-prototype-of":102,"../internals/redefine":109,"../internals/uid":146,"../internals/well-known-symbol":149}],13:[function(G,x,v){function s(z){return[255&z]}function u(z){return[255&z,z>>8&255]}function o(z){return[255&z,z>>8&255,z>>16&255,z>>24&255]}function c(z){return z[3]<<24|z[2]<<16|z[1]<<8|z[0]}function g(z){return J(z,23,4)}function p(z){return J(z,52,8)}function n(z,te){A(z[Z],te,{get:function(){return B(this)[te]}})}function i(ge,te,ye,me){if(ye=M(ye),ge=B(ge),ye+te>ge.byteLength)throw $(ee);var de=B(ge.buffer).bytes,ye=ye+ge.byteOffset,ge=de.slice(ye,ye+te);return me?ge:ge.reverse()}function a(z,te,le,me,de,ye){if(le=M(le),z=B(z),le+te>z.byteLength)throw $(ee);for(var ge=B(z.buffer).bytes,ke=le+z.byteOffset,be=me(+de),Ie=0;Iepe;)(ce=ie[pe++])in T||f(T,ce,ue[ce]);h.constructor=T}C&&L(G)!==W&&C(G,W);var P=new D(new T(2)),K=G.setInt8;P.setInt8(0,2147483648),P.setInt8(1,2147483649),!P.getInt8(0)&&P.getInt8(1)||m(G,{setInt8:function(te,le){K.call(this,te,le<<24>>24)},setUint8:function(te,le){K.call(this,te,le<<24>>24)}},{unsafe:!0})}else T=function(z){j(this,T,V),z=M(z),q(this,{bytes:N.call(new Array(z),0),byteLength:z}),y||(this.byteLength=z)},D=function(z,de,le){j(this,D,H),j(z,T,H);var me=B(z).byteLength,de=k(de);if(de<0||me>24},getUint8:function(z){return i(this,1,z)[0]},getInt16:function(z){return z=i(this,2,z,1>16},getUint16:function(z){return z=i(this,2,z,1>>0},getFloat32:function(z){return ne(i(this,4,z,1"+n+""}},{"../internals/require-object-coercible":114}],37:[function(t,x,v){function s(){return this}var u=t("../internals/iterators-core").IteratorPrototype,o=t("../internals/object-create"),c=t("../internals/create-property-descriptor"),g=t("../internals/set-to-string-tag"),p=t("../internals/iterators");x.exports=function(n,i,a){return i+=" Iterator",n.prototype=o(u,{next:c(1,a)}),g(n,i,!1,!0),p[i]=s,n}},{"../internals/create-property-descriptor":39,"../internals/iterators":80,"../internals/iterators-core":79,"../internals/object-create":91,"../internals/set-to-string-tag":118}],38:[function(t,x,v){var s=t("../internals/descriptors"),u=t("../internals/object-define-property"),o=t("../internals/create-property-descriptor");x.exports=s?function(c,g,p){return u.f(c,g,o(1,p))}:function(c,g,p){return c[g]=p,c}},{"../internals/create-property-descriptor":39,"../internals/descriptors":43,"../internals/object-define-property":93}],39:[function(t,x,v){x.exports=function(s,u){return{enumerable:!(1&s),configurable:!(2&s),writable:!(4&s),value:u}}},{}],40:[function(t,x,v){var s=t("../internals/to-primitive"),u=t("../internals/object-define-property"),o=t("../internals/create-property-descriptor");x.exports=function(c,g,p){g=s(g),g in c?u.f(c,g,o(0,p)):c[g]=p}},{"../internals/create-property-descriptor":39,"../internals/object-define-property":93,"../internals/to-primitive":141}],41:[function(l,x,v){function s(){return this}var u=l("../internals/export"),o=l("../internals/create-iterator-constructor"),c=l("../internals/object-get-prototype-of"),g=l("../internals/object-set-prototype-of"),p=l("../internals/set-to-string-tag"),n=l("../internals/create-non-enumerable-property"),i=l("../internals/redefine"),a=l("../internals/well-known-symbol"),h=l("../internals/is-pure"),y=l("../internals/iterators"),l=l("../internals/iterators-core"),f=l.IteratorPrototype,m=l.BUGGY_SAFARI_ITERATORS,b=a("iterator"),j="values",k="entries";x.exports=function(E,M,P,q,C,I,A){o(P,M,q);function N(T){if(T===C&&ee)return ee;if(!m&&T in H)return H[T];switch(T){case"keys":case j:case k:return function(){return new P(this,T)}}return function(){return new P(this)}}var F,B,q=M+" Iterator",V=!1,H=E.prototype,Z=H[b]||H["@@iterator"]||C&&H[C],ee=!m&&Z||N(C),ue=M=="Array"&&H.entries||Z;if(ue&&(ue=c(ue.call(new E)),f!==Object.prototype&&ue.next&&(h||c(ue)===f||(g?g(ue,f):typeof ue[b]!="function"&&n(ue,b,s)),p(ue,q,!0,!0),h&&(y[q]=s))),C==j&&Z&&Z.name!==j&&(V=!0,ee=function(){return Z.call(this)}),h&&!A||H[b]===ee||n(H,b,ee),y[M]=ee,C)if(F={values:N(j),keys:I?ee:N("keys"),entries:N(k)},A)for(B in F)!m&&!V&&B in H||i(H,B,F[B]);else u({target:M,proto:!0,forced:m||V},F);return F}},{"../internals/create-iterator-constructor":37,"../internals/create-non-enumerable-property":38,"../internals/export":50,"../internals/is-pure":76,"../internals/iterators":80,"../internals/iterators-core":79,"../internals/object-get-prototype-of":98,"../internals/object-set-prototype-of":102,"../internals/redefine":109,"../internals/set-to-string-tag":118,"../internals/well-known-symbol":149}],42:[function(t,x,v){var s=t("../internals/path"),u=t("../internals/has"),o=t("../internals/well-known-symbol-wrapped"),c=t("../internals/object-define-property").f;x.exports=function(g){var p=s.Symbol||(s.Symbol={});u(p,g)||c(p,g,{value:o.f(g)})}},{"../internals/has":61,"../internals/object-define-property":93,"../internals/path":105,"../internals/well-known-symbol-wrapped":148}],43:[function(t,x,v){t=t("../internals/fails"),x.exports=!t(function(){return Object.defineProperty({},1,{get:function(){return 7}})[1]!=7})},{"../internals/fails":51}],44:[function(u,x,v){var s=u("../internals/global"),u=u("../internals/is-object"),o=s.document,c=u(o)&&u(o.createElement);x.exports=function(g){return c?o.createElement(g):{}}},{"../internals/global":60,"../internals/is-object":75}],45:[function(t,x,v){x.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},{}],46:[function(t,x,v){t=t("../internals/engine-user-agent"),x.exports=/(iphone|ipod|ipad).*applewebkit/i.test(t)},{"../internals/engine-user-agent":47}],47:[function(t,x,v){t=t("../internals/get-built-in"),x.exports=t("navigator","userAgent")||""},{"../internals/get-built-in":57}],48:[function(o,x,v){var s,u,c=o("../internals/global"),o=o("../internals/engine-user-agent"),c=c.process,c=c&&c.versions,c=c&&c.v8;c?u=(s=c.split("."))[0]+s[1]:o&&(!(s=o.match(/Edge\/(\d+)/))||74<=s[1])&&(s=o.match(/Chrome\/(\d+)/))&&(u=s[1]),x.exports=u&&+u},{"../internals/engine-user-agent":47,"../internals/global":60}],49:[function(t,x,v){x.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},{}],50:[function(t,x,v){var s=t("../internals/global"),u=t("../internals/object-get-own-property-descriptor").f,o=t("../internals/create-non-enumerable-property"),c=t("../internals/redefine"),g=t("../internals/set-global"),p=t("../internals/copy-constructor-properties"),n=t("../internals/is-forced");x.exports=function(i,a){var h,y,l,f=i.target,m=i.global,b=i.stat,j=m?s:b?s[f]||g(f,{}):(s[f]||{}).prototype;if(j)for(h in a){if(y=a[h],l=i.noTargetGet?(l=u(j,h))&&l.value:j[h],!n(m?h:f+(b?".":"#")+h,i.forced)&&l!==void 0){if(typeof y==typeof l)continue;p(y,l)}(i.sham||l&&l.sham)&&o(y,"sham",!0),c(j,h,y,i)}}},{"../internals/copy-constructor-properties":33,"../internals/create-non-enumerable-property":38,"../internals/global":60,"../internals/is-forced":74,"../internals/object-get-own-property-descriptor":94,"../internals/redefine":109,"../internals/set-global":116}],51:[function(t,x,v){x.exports=function(s){try{return!!s()}catch{return!0}}},{}],52:[function(a,x,v){a("../modules/es.regexp.exec");var s=a("../internals/redefine"),u=a("../internals/fails"),o=a("../internals/well-known-symbol"),c=a("../internals/regexp-exec"),g=a("../internals/create-non-enumerable-property"),p=o("species"),n=!u(function(){var l=/./;return l.exec=function(){var f=[];return f.groups={a:"7"},f},"".replace(l,"$")!=="7"}),i="a".replace(/./,"$0")==="$0",a=o("replace"),h=!!/./[a]&&/./[a]("a","$0")==="",y=!u(function(){var f=/(?:)/,l=f.exec,f=(f.exec=function(){return l.apply(this,arguments)},"ab".split(f));return f.length!==2||f[0]!=="a"||f[1]!=="b"});x.exports=function(l,f,m,b){var j,k,E=o(l),M=!u(function(){var L={};return L[E]=function(){return 7},""[l](L)!=7}),P=M&&!u(function(){var L=!1,C=/a/;return l==="split"&&((C={constructor:{}}).constructor[p]=function(){return C},C.flags="",C[E]=/./[E]),C.exec=function(){return L=!0,null},C[E](""),!L});M&&P&&(l!=="replace"||n&&i&&!h)&&(l!=="split"||y)||(j=/./[E],m=(P=m(E,""[l],function(L,C,I,A,N){return C.exec===c?M&&!N?{done:!0,value:j.call(C,I,A)}:{done:!0,value:L.call(I,C,A)}:{done:!1}},{REPLACE_KEEPS_$0:i,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:h}))[0],k=P[1],s(String.prototype,l,m),s(RegExp.prototype,E,f==2?function(L,C){return k.call(L,this,C)}:function(L){return k.call(L,this)})),b&&g(RegExp.prototype[E],"sham",!0)}},{"../internals/create-non-enumerable-property":38,"../internals/fails":51,"../internals/redefine":109,"../internals/regexp-exec":111,"../internals/well-known-symbol":149,"../modules/es.regexp.exec":192}],53:[function(t,x,v){function s(g,p,n,i,a,h,y,l){for(var f,m=a,b=0,j=!!y&&c(y,l,3);b>1,j=n===23?u(2,-24)-u(2,-77):0,k=p<0||p===0&&1/p<0?1:0,E=0;for((p=s(p))!=p||p===1/0?(h=p!=p?1:0,a=m):(a=o(c(p)/g),p*(y=u(2,-a))<1&&(a--,y*=2),2<=(p+=1<=a+b?j/y:j*u(2,1-b))*y&&(a++,y/=2),m<=a+b?(h=0,a=m):1<=a+b?(h=(p*y-1)*u(2,n),a+=b):(h=p*u(2,b-1)*u(2,n),a=0));8<=n;l[E++]=255&h,h/=256,n-=8);for(a=a<>1,l=m-7,f=a-1,m=p[f--],b=127&m;for(m>>=7;0>=-l,l+=n;0"+b+""},m=function(){try{u=document.domain&&new ActiveXObject("htmlfile")}catch{}m=u?((b=u).write(f("")),b.close(),j=b.parentWindow.Object,b=null,j):(b=i("iframe"),j="java"+y+":",b.style.display="none",n.appendChild(b),b.src=String(j),(j=b.contentWindow.document).open(),j.write(f("document.F=Object")),j.close(),j.F);for(var b,j,k=g.length;k--;)delete m[h][g[k]];return m()};p[l]=!0,x.exports=Object.create||function(b,j){var k;return b!==null?(s[h]=o(b),k=new s,s[h]=null,k[l]=b):k=m(),j===void 0?k:c(k,j)}},{"../internals/an-object":10,"../internals/document-create-element":44,"../internals/enum-bug-keys":49,"../internals/hidden-keys":62,"../internals/html":64,"../internals/object-define-properties":92,"../internals/shared-key":119}],92:[function(t,x,v){var s=t("../internals/descriptors"),u=t("../internals/object-define-property"),o=t("../internals/an-object"),c=t("../internals/object-keys");x.exports=s?Object.defineProperties:function(g,p){o(g);for(var n,i=c(p),a=i.length,h=0;ha;)!s(i,n=p[a++])||~o(h,n)||h.push(n);return h}},{"../internals/array-includes":18,"../internals/has":61,"../internals/hidden-keys":62,"../internals/to-indexed-object":135}],100:[function(t,x,v){var s=t("../internals/object-keys-internal"),u=t("../internals/enum-bug-keys");x.exports=Object.keys||function(o){return s(o,u)}},{"../internals/enum-bug-keys":49,"../internals/object-keys-internal":99}],101:[function(t,x,v){var s={}.propertyIsEnumerable,u=Object.getOwnPropertyDescriptor,o=u&&!s.call({1:2},1);v.f=o?function(c){return c=u(this,c),!!c&&c.enumerable}:s},{}],102:[function(t,x,v){var s=t("../internals/an-object"),u=t("../internals/a-possible-prototype");x.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var o,c=!1,g={};try{(o=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(g,[]),c=g instanceof Array}catch{}return function(p,n){return s(p),u(n),c?o.call(p,n):p.__proto__=n,p}}():void 0)},{"../internals/a-possible-prototype":6,"../internals/an-object":10}],103:[function(t,x,v){var s=t("../internals/to-string-tag-support"),u=t("../internals/classof");x.exports=s?{}.toString:function(){return"[object "+u(this)+"]"}},{"../internals/classof":29,"../internals/to-string-tag-support":142}],104:[function(t,x,v){var s=t("../internals/get-built-in"),u=t("../internals/object-get-own-property-names"),o=t("../internals/object-get-own-property-symbols"),c=t("../internals/an-object");x.exports=s("Reflect","ownKeys")||function(g){var p=u.f(c(g)),n=o.f;return n?p.concat(n(g)):p}},{"../internals/an-object":10,"../internals/get-built-in":57,"../internals/object-get-own-property-names":96,"../internals/object-get-own-property-symbols":97}],105:[function(t,x,v){t=t("../internals/global"),x.exports=t},{"../internals/global":60}],106:[function(t,x,v){x.exports=function(s){try{return{error:!1,value:s()}}catch(u){return{error:!0,value:u}}}},{}],107:[function(t,x,v){var s=t("../internals/an-object"),u=t("../internals/is-object"),o=t("../internals/new-promise-capability");x.exports=function(c,g){return s(c),u(g)&&g.constructor===c?g:((0,(c=o.f(c)).resolve)(g),c.promise)}},{"../internals/an-object":10,"../internals/is-object":75,"../internals/new-promise-capability":87}],108:[function(t,x,v){var s=t("../internals/redefine");x.exports=function(u,o,c){for(var g in o)s(u,g,o[g],c);return u}},{"../internals/redefine":109}],109:[function(p,x,v){var s=p("../internals/global"),u=p("../internals/create-non-enumerable-property"),o=p("../internals/has"),c=p("../internals/set-global"),g=p("../internals/inspect-source"),p=p("../internals/internal-state"),n=p.get,i=p.enforce,a=String(String).split("String");(x.exports=function(h,y,l,j){var m=!!j&&!!j.unsafe,b=!!j&&!!j.enumerable,j=!!j&&!!j.noTargetGet;typeof l=="function"&&(typeof y!="string"||o(l,"name")||u(l,"name",y),i(l).source=a.join(typeof y=="string"?y:"")),h===s?b?h[y]=l:c(y,l):(m?!j&&h[y]&&(b=!0):delete h[y],b?h[y]=l:u(h,y,l))})(Function.prototype,"toString",function(){return typeof this=="function"&&n(this).source||g(this)})},{"../internals/create-non-enumerable-property":38,"../internals/global":60,"../internals/has":61,"../internals/inspect-source":69,"../internals/internal-state":71,"../internals/set-global":116}],110:[function(t,x,v){var s=t("./classof-raw"),u=t("./regexp-exec");x.exports=function(o,c){var g=o.exec;if(typeof g=="function"){if(g=g.call(o,c),typeof g!="object")throw TypeError("RegExp exec method returned something other than an Object or null");return g}if(s(o)!=="RegExp")throw TypeError("RegExp#exec called on incompatible receiver");return u.call(o,c)}},{"./classof-raw":28,"./regexp-exec":111}],111:[function(c,x,v){var s,u,o=c("./regexp-flags"),c=c("./regexp-sticky-helpers"),g=RegExp.prototype.exec,p=String.prototype.replace,n=g,i=(s=/a/,u=/b*/g,g.call(s,"a"),g.call(u,"a"),s.lastIndex!==0||u.lastIndex!==0),a=c.UNSUPPORTED_Y||c.BROKEN_CARET,h=/()??/.exec("")[1]!==void 0;x.exports=n=i||h||a?function(y){var l,f,m,b,j=this,k=a&&j.sticky,E=o.call(j),M=j.source,P=0,L=y;return k&&((E=E.replace("y","")).indexOf("g")===-1&&(E+="g"),L=String(y).slice(j.lastIndex),0{},Qr=Array.isArray,Nf=/#/g,Iv=/&/g,Dv=/\//g,Fv=/=/g,Nv=/\?/g,Uf=/\+/g,Uv=/%5B/g,Bv=/%5D/g,Bf=/%5E/g,Gv=/%60/g,Gf=/%7B/g,Vv=/%7C/g,Vf=/%7D/g,Hv=/%20/g;function hl(r){return encodeURI(""+r).replace(Vv,"|").replace(Uv,"[").replace(Bv,"]")}function zv(r){return hl(r).replace(Gf,"{").replace(Vf,"}").replace(Bf,"^")}function Oa(r){return hl(r).replace(Uf,"%2B").replace(Hv,"+").replace(Nf,"%23").replace(Iv,"%26").replace(Gv,"`").replace(Gf,"{").replace(Vf,"}").replace(Bf,"^")}function Wv(r){return Oa(r).replace(Fv,"%3D")}function qv(r){return hl(r).replace(Nf,"%23").replace(Nv,"%3F")}function Xv(r){return r==null?"":qv(r).replace(Dv,"%2F")}function ts(r){try{return decodeURIComponent(""+r)}catch{}return""+r}const Yv=/\/$/,$v=r=>r.replace(Yv,"");function qi(r,d,w="/"){let t,x={},v="",s="";const u=d.indexOf("#");let o=d.indexOf("?");return u=0&&(o=-1),o>-1&&(t=d.slice(0,o),v=d.slice(o+1,u>-1?u:d.length),x=r(v)),u>-1&&(t=t||d.slice(0,u),s=d.slice(u,d.length)),t=Jv(t??d,w),{fullPath:t+(v&&"?")+v+s,path:t,query:x,hash:ts(s)}}function Kv(r,d){const w=d.query?r(d.query):"";return d.path+(w&&"?")+w+(d.hash||"")}function cc(r,d){return!d||!r.toLowerCase().startsWith(d.toLowerCase())?r:r.slice(d.length)||"/"}function Zv(r,d,w){const t=d.matched.length-1,x=w.matched.length-1;return t>-1&&t===x&&_o(d.matched[t],w.matched[x])&&Hf(d.params,w.params)&&r(d.query)===r(w.query)&&d.hash===w.hash}function _o(r,d){return(r.aliasOf||r)===(d.aliasOf||d)}function Hf(r,d){if(Object.keys(r).length!==Object.keys(d).length)return!1;for(const w in r)if(!Qv(r[w],d[w]))return!1;return!0}function Qv(r,d){return Qr(r)?dc(r,d):Qr(d)?dc(d,r):r===d}function dc(r,d){return Qr(d)?r.length===d.length&&r.every((w,t)=>w===d[t]):r.length===1&&r[0]===d}function Jv(r,d){if(r.startsWith("/"))return r;if(!r)return d;const w=d.split("/"),t=r.split("/"),x=t[t.length-1];(x===".."||x===".")&&t.push("");let v=w.length-1,s,u;for(s=0;s1&&v--;else break;return w.slice(0,v).join("/")+"/"+t.slice(s).join("/")}var rs;(function(r){r.pop="pop",r.push="push"})(rs||(rs={}));var qo;(function(r){r.back="back",r.forward="forward",r.unknown=""})(qo||(qo={}));function e0(r){if(!r)if(so){const d=document.querySelector("base");r=d&&d.getAttribute("href")||"/",r=r.replace(/^\w+:\/\/[^\/]+/,"")}else r="/";return r[0]!=="/"&&r[0]!=="#"&&(r="/"+r),$v(r)}const t0=/^[^#]+#/;function r0(r,d){return r.replace(t0,"#")+d}function n0(r,d){const w=document.documentElement.getBoundingClientRect(),t=r.getBoundingClientRect();return{behavior:d.behavior,left:t.left-w.left-(d.left||0),top:t.top-w.top-(d.top||0)}}const yi=()=>({left:window.scrollX,top:window.scrollY});function o0(r){let d;if("el"in r){const w=r.el,t=typeof w=="string"&&w.startsWith("#"),x=typeof w=="string"?t?document.getElementById(w.slice(1)):document.querySelector(w):w;if(!x)return;d=n0(x,r)}else d=r;"scrollBehavior"in document.documentElement.style?window.scrollTo(d):window.scrollTo(d.left!=null?d.left:window.scrollX,d.top!=null?d.top:window.scrollY)}function fc(r,d){return(history.state?history.state.position-d:-1)+r}const Pa=new Map;function s0(r,d){Pa.set(r,d)}function i0(r){const d=Pa.get(r);return Pa.delete(r),d}let a0=()=>location.protocol+"//"+location.host;function zf(r,d){const{pathname:w,search:t,hash:x}=d,v=r.indexOf("#");if(v>-1){let u=x.includes(r.slice(v))?r.slice(v).length:1,o=x.slice(u);return o[0]!=="/"&&(o="/"+o),cc(o,"")}return cc(w,r)+t+x}function l0(r,d,w,t){let x=[],v=[],s=null;const u=({state:n})=>{const i=zf(r,location),a=w.value,h=d.value;let y=0;if(n){if(w.value=i,d.value=n,s&&s===a){s=null;return}y=h?n.position-h.position:0}else t(i);x.forEach(l=>{l(w.value,a,{delta:y,type:rs.pop,direction:y?y>0?qo.forward:qo.back:qo.unknown})})};function o(){s=w.value}function c(n){x.push(n);const i=()=>{const a=x.indexOf(n);a>-1&&x.splice(a,1)};return v.push(i),i}function g(){const{history:n}=window;n.state&&n.replaceState(xt({},n.state,{scroll:yi()}),"")}function p(){for(const n of v)n();v=[],window.removeEventListener("popstate",u),window.removeEventListener("beforeunload",g)}return window.addEventListener("popstate",u),window.addEventListener("beforeunload",g,{passive:!0}),{pauseListeners:o,listen:c,destroy:p}}function hc(r,d,w,t=!1,x=!1){return{back:r,current:d,forward:w,replaced:t,position:window.history.length,scroll:x?yi():null}}function u0(r){const{history:d,location:w}=window,t={value:zf(r,w)},x={value:d.state};x.value||v(t.value,{back:null,current:t.value,forward:null,position:d.length-1,replaced:!0,scroll:null},!0);function v(o,c,g){const p=r.indexOf("#"),n=p>-1?(w.host&&document.querySelector("base")?r:r.slice(p))+o:a0()+r+o;try{d[g?"replaceState":"pushState"](c,"",n),x.value=c}catch(i){console.error(i),w[g?"replace":"assign"](n)}}function s(o,c){const g=xt({},d.state,hc(x.value.back,o,x.value.forward,!0),c,{position:x.value.position});v(o,g,!0),t.value=o}function u(o,c){const g=xt({},x.value,d.state,{forward:o,scroll:yi()});v(g.current,g,!0);const p=xt({},hc(t.value,o,null),{position:g.position+1},c);v(o,p,!1),t.value=o}return{location:t,state:x,push:u,replace:s}}function Wf(r){r=e0(r);const d=u0(r),w=l0(r,d.state,d.location,d.replace);function t(v,s=!0){s||w.pauseListeners(),history.go(v)}const x=xt({location:"",base:r,go:t,createHref:r0.bind(null,r)},d,w);return Object.defineProperty(x,"location",{enumerable:!0,get:()=>d.location.value}),Object.defineProperty(x,"state",{enumerable:!0,get:()=>d.state.value}),x}function c0(r){return r=location.host?r||location.pathname+location.search:"",r.includes("#")||(r+="#"),Wf(r)}function d0(r){return typeof r=="string"||r&&typeof r=="object"}function qf(r){return typeof r=="string"||typeof r=="symbol"}const $r={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},Xf=Symbol("");var pc;(function(r){r[r.aborted=4]="aborted",r[r.cancelled=8]="cancelled",r[r.duplicated=16]="duplicated"})(pc||(pc={}));function wo(r,d){return xt(new Error,{type:r,[Xf]:!0},d)}function dn(r,d){return r instanceof Error&&Xf in r&&(d==null||!!(r.type&d))}const mc="[^/]+?",f0={sensitive:!1,strict:!1,start:!0,end:!0},h0=/[.+*?^${}()[\]/\\]/g;function p0(r,d){const w=xt({},f0,d),t=[];let x=w.start?"^":"";const v=[];for(const c of r){const g=c.length?[]:[90];w.strict&&!c.length&&(x+="/");for(let p=0;pd.length?d.length===1&&d[0]===80?1:-1:0}function y0(r,d){let w=0;const t=r.score,x=d.score;for(;w0&&d[d.length-1]<0}const g0={type:0,value:""},v0=/[a-zA-Z0-9_]/;function b0(r){if(!r)return[[]];if(r==="/")return[[g0]];if(!r.startsWith("/"))throw new Error(`Invalid path "${r}"`);function d(i){throw new Error(`ERR (${w})/"${c}": ${i}`)}let w=0,t=w;const x=[];let v;function s(){v&&x.push(v),v=[]}let u=0,o,c="",g="";function p(){c&&(w===0?v.push({type:0,value:c}):w===1||w===2||w===3?(v.length>1&&(o==="*"||o==="+")&&d(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),v.push({type:1,value:c,regexp:g,repeatable:o==="*"||o==="+",optional:o==="*"||o==="?"})):d("Invalid state to consume buffer"),c="")}function n(){c+=o}for(;u{s(f)}:Wo}function s(g){if(qf(g)){const p=t.get(g);p&&(t.delete(g),w.splice(w.indexOf(p),1),p.children.forEach(s),p.alias.forEach(s))}else{const p=w.indexOf(g);p>-1&&(w.splice(p,1),g.record.name&&t.delete(g.record.name),g.children.forEach(s),g.alias.forEach(s))}}function u(){return w}function o(g){let p=0;for(;p=0&&(g.record.path!==w[p].record.path||!Yf(g,w[p]));)p++;w.splice(p,0,g),g.record.name&&!vc(g)&&t.set(g.record.name,g)}function c(g,p){let n,i={},a,h;if("name"in g&&g.name){if(n=t.get(g.name),!n)throw wo(1,{location:g});h=n.record.name,i=xt(gc(p.params,n.keys.filter(f=>!f.optional).concat(n.parent?n.parent.keys.filter(f=>f.optional):[]).map(f=>f.name)),g.params&&gc(g.params,n.keys.map(f=>f.name))),a=n.stringify(i)}else if(g.path!=null)a=g.path,n=w.find(f=>f.re.test(a)),n&&(i=n.parse(a),h=n.record.name);else{if(n=p.name?t.get(p.name):w.find(f=>f.re.test(p.path)),!n)throw wo(1,{location:g,currentLocation:p});h=n.record.name,i=xt({},p.params,g.params),a=n.stringify(i)}const y=[];let l=n;for(;l;)y.unshift(l.record),l=l.parent;return{name:h,path:a,params:i,matched:y,meta:S0(y)}}return r.forEach(g=>v(g)),{addRoute:v,resolve:c,removeRoute:s,getRoutes:u,getRecordMatcher:x}}function gc(r,d){const w={};for(const t of d)t in r&&(w[t]=r[t]);return w}function x0(r){return{path:r.path,redirect:r.redirect,name:r.name,meta:r.meta||{},aliasOf:void 0,beforeEnter:r.beforeEnter,props:j0(r),children:r.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in r?r.components||null:r.component&&{default:r.component}}}function j0(r){const d={},w=r.props||!1;if("component"in r)d.default=w;else for(const t in r.components)d[t]=typeof w=="object"?w[t]:w;return d}function vc(r){for(;r;){if(r.record.aliasOf)return!0;r=r.parent}return!1}function S0(r){return r.reduce((d,w)=>xt(d,w.meta),{})}function bc(r,d){const w={};for(const t in r)w[t]=t in d?d[t]:r[t];return w}function Yf(r,d){return d.children.some(w=>w===r||Yf(r,w))}function E0(r){const d={};if(r===""||r==="?")return d;const t=(r[0]==="?"?r.slice(1):r).split("&");for(let x=0;xv&&Oa(v)):[t&&Oa(t)]).forEach(v=>{v!==void 0&&(d+=(d.length?"&":"")+w,v!=null&&(d+="="+v))})}return d}function T0(r){const d={};for(const w in r){const t=r[w];t!==void 0&&(d[w]=Qr(t)?t.map(x=>x==null?null:""+x):t==null?t:""+t)}return d}const k0=Symbol(""),wc=Symbol(""),pl=Symbol(""),ml=Symbol(""),Aa=Symbol("");function Do(){let r=[];function d(t){return r.push(t),()=>{const x=r.indexOf(t);x>-1&&r.splice(x,1)}}function w(){r=[]}return{add:d,list:()=>r.slice(),reset:w}}function Cn(r,d,w,t,x,v=s=>s()){const s=t&&(t.enterCallbacks[x]=t.enterCallbacks[x]||[]);return()=>new Promise((u,o)=>{const c=n=>{n===!1?o(wo(4,{from:w,to:d})):n instanceof Error?o(n):d0(n)?o(wo(2,{from:d,to:n})):(s&&t.enterCallbacks[x]===s&&typeof n=="function"&&s.push(n),u())},g=v(()=>r.call(t&&t.instances[x],d,w,c));let p=Promise.resolve(g);r.length<3&&(p=p.then(c)),p.catch(n=>o(n))})}function Xi(r,d,w,t,x=v=>v()){const v=[];for(const s of r)for(const u in s.components){let o=s.components[u];if(!(d!=="beforeRouteEnter"&&!s.instances[u]))if(M0(o)){const g=(o.__vccOpts||o)[d];g&&v.push(Cn(g,w,t,s,u,x))}else{let c=o();v.push(()=>c.then(g=>{if(!g)return Promise.reject(new Error(`Couldn't resolve component "${u}" at "${s.path}"`));const p=Lv(g)?g.default:g;s.components[u]=p;const i=(p.__vccOpts||p)[d];return i&&Cn(i,w,t,s,u,x)()}))}}return v}function M0(r){return typeof r=="object"||"displayName"in r||"props"in r||"__vccOpts"in r}function xc(r){const d=Ht(pl),w=Ht(ml),t=jt(()=>{const o=Bt(r.to);return d.resolve(o)}),x=jt(()=>{const{matched:o}=t.value,{length:c}=o,g=o[c-1],p=w.matched;if(!g||!p.length)return-1;const n=p.findIndex(_o.bind(null,g));if(n>-1)return n;const i=jc(o[c-2]);return c>1&&jc(g)===i&&p[p.length-1].path!==i?p.findIndex(_o.bind(null,o[c-2])):n}),v=jt(()=>x.value>-1&&A0(w.params,t.value.params)),s=jt(()=>x.value>-1&&x.value===w.matched.length-1&&Hf(w.params,t.value.params));function u(o={}){return P0(o)?d[Bt(r.replace)?"replace":"push"](Bt(r.to)).catch(Wo):Promise.resolve()}return{route:t,href:jt(()=>t.value.href),isActive:v,isExactActive:s,navigate:u}}const C0=hr({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:xc,setup(r,{slots:d}){const w=Nn(xc(r)),{options:t}=Ht(pl),x=jt(()=>({[Sc(r.activeClass,t.linkActiveClass,"router-link-active")]:w.isActive,[Sc(r.exactActiveClass,t.linkExactActiveClass,"router-link-exact-active")]:w.isExactActive}));return()=>{const v=d.default&&d.default(w);return r.custom?v:tr("a",{"aria-current":w.isExactActive?r.ariaCurrentValue:null,href:w.href,onClick:w.navigate,class:x.value},v)}}}),O0=C0;function P0(r){if(!(r.metaKey||r.altKey||r.ctrlKey||r.shiftKey)&&!r.defaultPrevented&&!(r.button!==void 0&&r.button!==0)){if(r.currentTarget&&r.currentTarget.getAttribute){const d=r.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(d))return}return r.preventDefault&&r.preventDefault(),!0}}function A0(r,d){for(const w in d){const t=d[w],x=r[w];if(typeof t=="string"){if(t!==x)return!1}else if(!Qr(x)||x.length!==t.length||t.some((v,s)=>v!==x[s]))return!1}return!0}function jc(r){return r?r.aliasOf?r.aliasOf.path:r.path:""}const Sc=(r,d,w)=>r??d??w,R0=hr({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(r,{attrs:d,slots:w}){const t=Ht(Aa),x=jt(()=>r.route||t.value),v=Ht(wc,0),s=jt(()=>{let c=Bt(v);const{matched:g}=x.value;let p;for(;(p=g[c])&&!p.components;)c++;return c}),u=jt(()=>x.value.matched[s.value]);zr(wc,jt(()=>s.value+1)),zr(k0,u),zr(Aa,x);const o=mt();return Ln(()=>[o.value,u.value,r.name],([c,g,p],[n,i,a])=>{g&&(g.instances[p]=c,i&&i!==g&&c&&c===n&&(g.leaveGuards.size||(g.leaveGuards=i.leaveGuards),g.updateGuards.size||(g.updateGuards=i.updateGuards))),c&&g&&(!i||!_o(g,i)||!n)&&(g.enterCallbacks[p]||[]).forEach(h=>h(c))},{flush:"post"}),()=>{const c=x.value,g=r.name,p=u.value,n=p&&p.components[g];if(!n)return Ec(w.default,{Component:n,route:c});const i=p.props[g],a=i?i===!0?c.params:typeof i=="function"?i(c):i:null,y=tr(n,xt({},a,d,{onVnodeUnmounted:l=>{l.component.isUnmounted&&(p.instances[g]=null)},ref:o}));return Ec(w.default,{Component:y,route:c})||y}}});function Ec(r,d){if(!r)return null;const w=r(d);return w.length===1?w[0]:w}const $f=R0;function L0(r){const d=w0(r.routes,r),w=r.parseQuery||E0,t=r.stringifyQuery||_c,x=r.history,v=Do(),s=Do(),u=Do(),o=$o($r);let c=$r;so&&r.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const g=Wi.bind(null,$=>""+$),p=Wi.bind(null,Xv),n=Wi.bind(null,ts);function i($,J){let ne,ce;return qf($)?(ne=d.getRecordMatcher($),ce=J):ce=$,d.addRoute(ce,ne)}function a($){const J=d.getRecordMatcher($);J&&d.removeRoute(J)}function h(){return d.getRoutes().map($=>$.record)}function y($){return!!d.getRecordMatcher($)}function l($,J){if(J=xt({},J||o.value),typeof $=="string"){const z=qi(w,$,J.path),te=d.resolve({path:z.path},J),le=x.createHref(z.fullPath);return xt(z,te,{params:n(te.params),hash:ts(z.hash),redirectedFrom:void 0,href:le})}let ne;if($.path!=null)ne=xt({},$,{path:qi(w,$.path,J.path).path});else{const z=xt({},$.params);for(const te in z)z[te]==null&&delete z[te];ne=xt({},$,{params:p(z)}),J.params=p(J.params)}const ce=d.resolve(ne,J),ie=$.hash||"";ce.params=g(n(ce.params));const pe=Kv(t,xt({},$,{hash:zv(ie),path:ce.path})),K=x.createHref(pe);return xt({fullPath:pe,hash:ie,query:t===_c?T0($.query):$.query||{}},ce,{redirectedFrom:void 0,href:K})}function f($){return typeof $=="string"?qi(w,$,o.value.path):xt({},$)}function m($,J){if(c!==$)return wo(8,{from:J,to:$})}function b($){return E($)}function j($){return b(xt(f($),{replace:!0}))}function k($){const J=$.matched[$.matched.length-1];if(J&&J.redirect){const{redirect:ne}=J;let ce=typeof ne=="function"?ne($):ne;return typeof ce=="string"&&(ce=ce.includes("?")||ce.includes("#")?ce=f(ce):{path:ce},ce.params={}),xt({query:$.query,hash:$.hash,params:ce.path!=null?{}:$.params},ce)}}function E($,J){const ne=c=l($),ce=o.value,ie=$.state,pe=$.force,K=$.replace===!0,z=k(ne);if(z)return E(xt(f(z),{state:typeof z=="object"?xt({},ie,z.state):ie,force:pe,replace:K}),J||ne);const te=ne;te.redirectedFrom=J;let le;return!pe&&Zv(t,ce,ne)&&(le=wo(16,{to:te,from:ce}),ee(ce,ce,!0,!1)),(le?Promise.resolve(le):L(te,ce)).catch(me=>dn(me)?dn(me,2)?me:Z(me):V(me,te,ce)).then(me=>{if(me){if(dn(me,2))return E(xt({replace:K},f(me.to),{state:typeof me.to=="object"?xt({},ie,me.to.state):ie,force:pe}),J||te)}else me=I(te,ce,!0,K,ie);return C(te,ce,me),me})}function M($,J){const ne=m($,J);return ne?Promise.reject(ne):Promise.resolve()}function P($){const J=D.values().next().value;return J&&typeof J.runWithContext=="function"?J.runWithContext($):$()}function L($,J){let ne;const[ce,ie,pe]=I0($,J);ne=Xi(ce.reverse(),"beforeRouteLeave",$,J);for(const z of ce)z.leaveGuards.forEach(te=>{ne.push(Cn(te,$,J))});const K=M.bind(null,$,J);return ne.push(K),W(ne).then(()=>{ne=[];for(const z of v.list())ne.push(Cn(z,$,J));return ne.push(K),W(ne)}).then(()=>{ne=Xi(ie,"beforeRouteUpdate",$,J);for(const z of ie)z.updateGuards.forEach(te=>{ne.push(Cn(te,$,J))});return ne.push(K),W(ne)}).then(()=>{ne=[];for(const z of pe)if(z.beforeEnter)if(Qr(z.beforeEnter))for(const te of z.beforeEnter)ne.push(Cn(te,$,J));else ne.push(Cn(z.beforeEnter,$,J));return ne.push(K),W(ne)}).then(()=>($.matched.forEach(z=>z.enterCallbacks={}),ne=Xi(pe,"beforeRouteEnter",$,J,P),ne.push(K),W(ne))).then(()=>{ne=[];for(const z of s.list())ne.push(Cn(z,$,J));return ne.push(K),W(ne)}).catch(z=>dn(z,8)?z:Promise.reject(z))}function C($,J,ne){u.list().forEach(ce=>P(()=>ce($,J,ne)))}function I($,J,ne,ce,ie){const pe=m($,J);if(pe)return pe;const K=J===$r,z=so?history.state:{};ne&&(ce||K?x.replace($.fullPath,xt({scroll:K&&z&&z.scroll},ie)):x.push($.fullPath,ie)),o.value=$,ee($,J,ne,K),Z()}let A;function N(){A||(A=x.listen(($,J,ne)=>{if(!G.listening)return;const ce=l($),ie=k(ce);if(ie){E(xt(ie,{replace:!0}),ce).catch(Wo);return}c=ce;const pe=o.value;so&&s0(fc(pe.fullPath,ne.delta),yi()),L(ce,pe).catch(K=>dn(K,12)?K:dn(K,2)?(E(K.to,ce).then(z=>{dn(z,20)&&!ne.delta&&ne.type===rs.pop&&x.go(-1,!1)}).catch(Wo),Promise.reject()):(ne.delta&&x.go(-ne.delta,!1),V(K,ce,pe))).then(K=>{K=K||I(ce,pe,!1),K&&(ne.delta&&!dn(K,8)?x.go(-ne.delta,!1):ne.type===rs.pop&&dn(K,20)&&x.go(-1,!1)),C(ce,pe,K)}).catch(Wo)}))}let F=Do(),B=Do(),q;function V($,J,ne){Z($);const ce=B.list();return ce.length?ce.forEach(ie=>ie($,J,ne)):console.error($),Promise.reject($)}function H(){return q&&o.value!==$r?Promise.resolve():new Promise(($,J)=>{F.add([$,J])})}function Z($){return q||(q=!$,N(),F.list().forEach(([J,ne])=>$?ne($):J()),F.reset()),$}function ee($,J,ne,ce){const{scrollBehavior:ie}=r;if(!so||!ie)return Promise.resolve();const pe=!ne&&i0(fc($.fullPath,0))||(ce||!ne)&&history.state&&history.state.scroll||null;return Dr().then(()=>ie($,J,pe)).then(K=>K&&o0(K)).catch(K=>V(K,$,J))}const ue=$=>x.go($);let T;const D=new Set,G={currentRoute:o,listening:!0,addRoute:i,removeRoute:a,hasRoute:y,getRoutes:h,resolve:l,options:r,push:b,replace:j,go:ue,back:()=>ue(-1),forward:()=>ue(1),beforeEach:v.add,beforeResolve:s.add,afterEach:u.add,onError:B.add,isReady:H,install($){const J=this;$.component("RouterLink",O0),$.component("RouterView",$f),$.config.globalProperties.$router=J,Object.defineProperty($.config.globalProperties,"$route",{enumerable:!0,get:()=>Bt(o)}),so&&!T&&o.value===$r&&(T=!0,b(x.location).catch(ie=>{}));const ne={};for(const ie in $r)Object.defineProperty(ne,ie,{get:()=>o.value[ie],enumerable:!0});$.provide(pl,J),$.provide(ml,ss(ne)),$.provide(Aa,o);const ce=$.unmount;D.add($),$.unmount=function(){D.delete($),D.size<1&&(c=$r,A&&A(),A=null,o.value=$r,T=!1,q=!1),ce()}}};function W($){return $.reduce((J,ne)=>J.then(()=>P(ne)),Promise.resolve())}return G}function I0(r,d){const w=[],t=[],x=[],v=Math.max(d.matched.length,r.matched.length);for(let s=0;s_o(c,u))?t.push(u):w.push(u));const o=r.matched[s];o&&(d.matched.find(c=>_o(c,o))||x.push(o))}return[w,t,x]}function D0(){return Ht(ml)}const F0=(r,d)=>d.path.replace(/(:\w+)\([^)]+\)/g,"$1").replace(/(:\w+)[?+*]/g,"$1").replace(/:\w+/g,w=>{var t;return((t=r.params[w.slice(1)])==null?void 0:t.toString())||""}),Ra=(r,d)=>{const w=r.route.matched.find(x=>{var v;return((v=x.components)==null?void 0:v.default)===r.Component.type}),t=d??(w==null?void 0:w.meta.key)??(w&&F0(r.route,w));return typeof t=="function"?t(r.route):t},N0=(r,d)=>({default:()=>r?tr(Hp,r===!0?{}:r,d):d});function yl(r){return Array.isArray(r)?r:[r]}const Yi=null,$i=null,wr={layout:"empty"},Ki=null,Zi=null,Qi=null,xr={layout:"light"},jr={layout:"light"},Ji=null,Sr={layout:"light"},Er={layout:"light"},Tr={layout:"light"},kr={layout:"light"},Mr={layout:"light"},Cr={layout:"light"},Or={layout:"light"},Pr={layout:"light"},Tc=[{name:"articles-slug",path:"/articles/:slug(.*)*",meta:{},alias:[],redirect:Yi==null?void 0:Yi.redirect,component:()=>rt(()=>import("./Ci5PNU3b.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8]),import.meta.url).then(r=>r.default||r)},{name:"articles",path:"/articles",meta:{},alias:[],redirect:$i==null?void 0:$i.redirect,component:()=>rt(()=>import("./CLHUyLrC.js"),__vite__mapDeps([9,1,2,3,4,5,7]),import.meta.url).then(r=>r.default||r)},{name:(wr==null?void 0:wr.name)??"card",path:(wr==null?void 0:wr.path)??"/card",meta:wr||{},alias:(wr==null?void 0:wr.alias)||[],redirect:wr==null?void 0:wr.redirect,component:()=>rt(()=>import("./Dtbyl6G-.js"),[],import.meta.url).then(r=>r.default||r)},{name:"examples-nested_transitions",path:"/examples/nested_transitions",meta:{},alias:[],redirect:Ki==null?void 0:Ki.redirect,component:()=>rt(()=>import("./DQvQFzcx.js"),[],import.meta.url).then(r=>r.default||r)},{name:"index",path:"/",meta:{},alias:[],redirect:Zi==null?void 0:Zi.redirect,component:()=>rt(()=>import("./uM6gdZzG.js"),__vite__mapDeps([10,11,7,4,3]),import.meta.url).then(r=>r.default||r)},{name:"playground-audio",path:"/playground/audio",meta:{},alias:[],redirect:Qi==null?void 0:Qi.redirect,component:()=>rt(()=>import("./BJC4by4G.js"),[],import.meta.url).then(r=>r.default||r)},{name:(xr==null?void 0:xr.name)??"playground-chords",path:(xr==null?void 0:xr.path)??"/playground/chords",meta:xr||{},alias:(xr==null?void 0:xr.alias)||[],redirect:xr==null?void 0:xr.redirect,component:()=>rt(()=>import("./CvplexO3.js"),[],import.meta.url).then(r=>r.default||r)},{name:(jr==null?void 0:jr.name)??"playground-french",path:(jr==null?void 0:jr.path)??"/playground/french",meta:jr||{},alias:(jr==null?void 0:jr.alias)||[],redirect:jr==null?void 0:jr.redirect,component:()=>rt(()=>import("./DlZNh5M8.js"),__vite__mapDeps([12,4,6]),import.meta.url).then(r=>r.default||r)},{name:"playground",path:"/playground",meta:{},alias:[],redirect:Ji==null?void 0:Ji.redirect,component:()=>rt(()=>import("./D5N360oS.js"),__vite__mapDeps([13,11]),import.meta.url).then(r=>r.default||r)},{name:(Sr==null?void 0:Sr.name)??"playground-matrix",path:(Sr==null?void 0:Sr.path)??"/playground/matrix",meta:Sr||{},alias:(Sr==null?void 0:Sr.alias)||[],redirect:Sr==null?void 0:Sr.redirect,component:()=>rt(()=>import("./DFeiu82-.js"),[],import.meta.url).then(r=>r.default||r)},{name:(Er==null?void 0:Er.name)??"playground-metronome",path:(Er==null?void 0:Er.path)??"/playground/metronome",meta:Er||{},alias:(Er==null?void 0:Er.alias)||[],redirect:Er==null?void 0:Er.redirect,component:()=>rt(()=>import("./CJDBQGN9.js"),[],import.meta.url).then(r=>r.default||r)},{name:(Tr==null?void 0:Tr.name)??"playground-midi",path:(Tr==null?void 0:Tr.path)??"/playground/midi",meta:Tr||{},alias:(Tr==null?void 0:Tr.alias)||[],redirect:Tr==null?void 0:Tr.redirect,component:()=>rt(()=>import("./D2RhQ0-u.js"),[],import.meta.url).then(r=>r.default||r)},{name:(kr==null?void 0:kr.name)??"playground-palettes-mountains",path:(kr==null?void 0:kr.path)??"/playground/palettes/mountains",meta:kr||{},alias:(kr==null?void 0:kr.alias)||[],redirect:kr==null?void 0:kr.redirect,component:()=>rt(()=>import("./BA65R9a-.js"),[],import.meta.url).then(r=>r.default||r)},{name:(Mr==null?void 0:Mr.name)??"playground-palettes-variance",path:(Mr==null?void 0:Mr.path)??"/playground/palettes/variance",meta:Mr||{},alias:(Mr==null?void 0:Mr.alias)||[],redirect:Mr==null?void 0:Mr.redirect,component:()=>rt(()=>import("./DaxLFRA2.js"),[],import.meta.url).then(r=>r.default||r)},{name:(Cr==null?void 0:Cr.name)??"playground-plotter",path:(Cr==null?void 0:Cr.path)??"/playground/plotter",meta:Cr||{},alias:(Cr==null?void 0:Cr.alias)||[],redirect:Cr==null?void 0:Cr.redirect,component:()=>rt(()=>import("./DGNm3EUI.js"),[],import.meta.url).then(r=>r.default||r)},{name:(Or==null?void 0:Or.name)??"playground-tiling",path:(Or==null?void 0:Or.path)??"/playground/tiling",meta:Or||{},alias:(Or==null?void 0:Or.alias)||[],redirect:Or==null?void 0:Or.redirect,component:()=>rt(()=>import("./DUcsjegF.js"),[],import.meta.url).then(r=>r.default||r)},{name:(Pr==null?void 0:Pr.name)??"playground-waves",path:(Pr==null?void 0:Pr.path)??"/playground/waves",meta:Pr||{},alias:(Pr==null?void 0:Pr.alias)||[],redirect:Pr==null?void 0:Pr.redirect,component:()=>rt(()=>import("./BIMfceTU.js"),[],import.meta.url).then(r=>r.default||r)}],Kf=(r,d,w)=>(d=d===!0?{}:d,{default:()=>{var t;return d?tr(r,d,w):(t=w.default)==null?void 0:t.call(w)}});function kc(r){const d=(r==null?void 0:r.meta.key)??r.path.replace(/(:\w+)\([^)]+\)/g,"$1").replace(/(:\w+)[?+*]/g,"$1").replace(/:\w+/g,w=>{var t;return((t=r.params[w.slice(1)])==null?void 0:t.toString())||""});return typeof d=="function"?d(r):d}function U0(r,d){return r===d||d===$r?!1:kc(r)!==kc(d)?!0:!r.matched.every((t,x)=>{var v,s;return t.components&&t.components.default===((s=(v=d.matched[x])==null?void 0:v.components)==null?void 0:s.default)})}const B0={scrollBehavior(r,d,w){var c;const t=It(),x=((c=Wr().options)==null?void 0:c.scrollBehaviorType)??"auto";let v=w||void 0;const s=typeof r.meta.scrollToTop=="function"?r.meta.scrollToTop(r,d):r.meta.scrollToTop;if(!v&&d&&r&&s!==!1&&U0(r,d)&&(v={left:0,top:0}),r.path===d.path)return d.hash&&!r.hash?{left:0,top:0}:r.hash?{el:r.hash,top:Mc(r.hash),behavior:x}:!1;const u=g=>!!(g.meta.pageTransition??Ca),o=u(d)&&u(r)?"page:transition:finish":"page:finish";return new Promise(g=>{t.hooks.hookOnce(o,async()=>{await new Promise(p=>setTimeout(p,0)),r.hash&&(v={el:r.hash,top:Mc(r.hash),behavior:x}),g(v)})})}};function Mc(r){try{const d=document.querySelector(r);if(d)return parseFloat(getComputedStyle(d).scrollMarginTop)}catch{}return 0}const G0={hashMode:!1,scrollBehaviorType:"auto"},Ar={...G0,...B0},V0=async r=>{var o;let d,w;if(!((o=r.meta)!=null&&o.validate))return;const t=It(),x=Wr();if(([d,w]=es(()=>Promise.resolve(r.meta.validate(r))),d=await d,w(),d)===!0)return;const s=pi({statusCode:404,statusMessage:`Page Not Found: ${r.fullPath}`,data:{path:r.fullPath}}),u=x.beforeResolve(c=>{if(u(),c===r){const g=x.afterEach(async()=>{g(),await t.runWithContext(()=>ao(s)),window.history.pushState({},"",r.fullPath)});return!1}})},H0=async r=>{let d,w;const t=([d,w]=es(()=>fl(r.path)),d=await d,w(),d);if(t.redirect)return mn(t.redirect,{acceptRelative:!0})?(window.location.href=t.redirect,!1):t.redirect},z0=[V0,H0],Xo={};function W0(r,d,w){const{pathname:t,search:x,hash:v}=d,s=r.indexOf("#");if(s>-1){const c=v.includes(r.slice(s))?r.slice(s).length:1;let g=v.slice(c);return g[0]!=="/"&&(g="/"+g),Yu(g,"")}const u=Yu(t,r),o=!w||Oy(u,w,{trailingSlash:!0})?u:w;return o+(o.includes("?")?"":x)+v}const q0=yn({name:"nuxt:router",enforce:"pre",async setup(r){var y,l;let d,w,t=di().app.baseURL;Ar.hashMode&&!t.includes("#")&&(t+="#");const x=((y=Ar.history)==null?void 0:y.call(Ar,t))??(Ar.hashMode?c0(t):Wf(t)),v=((l=Ar.routes)==null?void 0:l.call(Ar,Tc))??Tc;let s;const u=L0({...Ar,scrollBehavior:(f,m,b)=>{if(m===$r){s=b;return}if(Ar.scrollBehavior){if(u.options.scrollBehavior=Ar.scrollBehavior,"scrollRestoration"in window.history){const j=u.beforeEach(()=>{j(),window.history.scrollRestoration="manual"})}return Ar.scrollBehavior(f,$r,s||b)}},history:x,routes:v});"scrollRestoration"in window.history&&(window.history.scrollRestoration="auto"),r.vueApp.use(u);const o=$o(u.currentRoute.value);u.afterEach((f,m)=>{o.value=m}),Object.defineProperty(r.vueApp.config.globalProperties,"previousRoute",{get:()=>o.value});const c=W0(t,window.location,r.payload.path),g=$o(u.currentRoute.value),p=()=>{g.value=u.currentRoute.value};r.hook("page:finish",p),u.afterEach((f,m)=>{var b,j,k,E;((j=(b=f.matched[0])==null?void 0:b.components)==null?void 0:j.default)===((E=(k=m.matched[0])==null?void 0:k.components)==null?void 0:E.default)&&p()});const n={};for(const f in g.value)Object.defineProperty(n,f,{get:()=>g.value[f]});r._route=ss(n),r._middleware=r._middleware||{global:[],named:{}};try{[d,w]=es(()=>u.isReady()),await d,w()}catch(f){[d,w]=es(()=>r.runWithContext(()=>ao(f))),await d,w()}const i=c!==u.currentRoute.value.fullPath?u.resolve(c):u.currentRoute.value;p();const a=r.payload.state._layout;u.beforeEach(async(f,m)=>{var b;await r.callHook("page:loading:start"),f.meta=Nn(f.meta),r.isHydrating&&a&&!yo(f.meta.layout)&&(f.meta.layout=a),r._processingMiddleware=!0;{const j=new Set([...z0,...r._middleware.global]);for(const k of f.matched){const E=k.meta.middleware;if(E)for(const M of yl(E))j.add(M)}{const k=await r.runWithContext(()=>fl(f.path));if(k.appMiddleware)for(const E in k.appMiddleware)k.appMiddleware[E]?j.add(E):j.delete(E)}for(const k of j){const E=typeof k=="string"?r._middleware.named[k]||await((b=Xo[k])==null?void 0:b.call(Xo).then(P=>P.default||P)):k;if(!E)throw new Error(`Unknown route middleware: '${k}'.`);const M=await r.runWithContext(()=>E(f,m));if(!r.payload.serverRendered&&r.isHydrating&&(M===!1||M instanceof Error)){const P=M||Sa({statusCode:404,statusMessage:`Page Not Found: ${c}`});return await r.runWithContext(()=>ao(P)),!1}if(M!==!0&&(M||M===!1))return M}}}),u.onError(async()=>{delete r._processingMiddleware,await r.callHook("page:loading:end")});const h=hi();return u.afterEach(async(f,m,b)=>{delete r._processingMiddleware,!r.isHydrating&&h.value&&await r.runWithContext(wg),b&&await r.callHook("page:loading:end"),f.matched.length===0&&await r.runWithContext(()=>ao(Sa({statusCode:404,fatal:!1,statusMessage:`Page not found: ${f.fullPath}`,data:{path:f.fullPath}})))}),r.hooks.hookOnce("app:created",async()=>{try{"name"in i&&(i.name=void 0),await u.replace({...i,force:!0}),u.options.scrollBehavior=Ar.scrollBehavior}catch(f){await r.runWithContext(()=>ao(f))}}),{provide:{router:u}}}}),La=globalThis.requestIdleCallback||(r=>{const d=Date.now(),w={didTimeout:!1,timeRemaining:()=>Math.max(0,50-(Date.now()-d))};return setTimeout(()=>{r(w)},1)}),X0=globalThis.cancelIdleCallback||(r=>{clearTimeout(r)}),gl=r=>{const d=It();d.isHydrating?d.hooks.hookOnce("app:suspense:resolve",()=>{La(r)}):La(r)},Y0=yn({name:"nuxt:payload",setup(r){Wr().beforeResolve(async(d,w)=>{if(d.path===w.path)return;const t=await lc(d.path);t&&Object.assign(r.static.data,t.data)}),gl(()=>{var d;r.hooks.hook("link:prefetch",async w=>{ds(w).protocol||await lc(w)}),((d=navigator.connection)==null?void 0:d.effectiveType)!=="slow-2g"&&setTimeout(mi,1e3)})}}),$0=yn(r=>{let d;async function w(){const t=await mi();d&&clearTimeout(d),d=setTimeout(w,1e3*60*60);try{const x=await $fetch(ll("builds/latest.json")+`?${Date.now()}`);x.id!==t.id&&r.hooks.callHook("app:manifest:update",x)}catch{}}gl(()=>{d=setTimeout(w,1e3*60*60)})}),K0=ft(()=>rt(()=>import("./CuqDoC_G.js"),__vite__mapDeps([14,5,1,2,3,4,15,6,7]),import.meta.url).then(r=>r.default||r.default||r)),Z0=ft(()=>rt(()=>import("./DQhOff_n.js"),__vite__mapDeps([16,15,6,7,4,3]),import.meta.url).then(r=>r.default||r.default||r)),Q0=ft(()=>rt(()=>import("./JctMNniL.js"),__vite__mapDeps([17,6,4,7,3]),import.meta.url).then(r=>r.default||r.default||r)),J0=ft(()=>rt(()=>import("./ChudRan8.js"),__vite__mapDeps([15,6,7,4,3]),import.meta.url).then(r=>r.default||r.default||r)),eb=ft(()=>rt(()=>import("./gtS2INEI.js"),__vite__mapDeps([5,1,2,3,4]),import.meta.url).then(r=>r.default||r.default||r)),tb=ft(()=>rt(()=>import("./CdNF5em2.js"),__vite__mapDeps([18,1,2,3,4]),import.meta.url).then(r=>r.default||r.default||r)),rb=ft(()=>rt(()=>import("./BYuD9A8v.js"),[],import.meta.url).then(r=>r.default||r.default||r)),nb=ft(()=>rt(()=>import("./BlOjJ08E.js"),[],import.meta.url).then(r=>r.default||r.default||r)),ob=ft(()=>rt(()=>import("./B9SonXqr.js"),[],import.meta.url).then(r=>r.default||r.default||r)),sb=ft(()=>rt(()=>import("./DxveBo0P.js"),__vite__mapDeps([19,20]),import.meta.url).then(r=>r.default||r.default||r)),ib=ft(()=>rt(()=>import("./DvLvbVZ0.js"),__vite__mapDeps([21,22,23]),import.meta.url).then(r=>r.default||r.default||r)),ab=ft(()=>rt(()=>import("./2n9fv25W.js"),[],import.meta.url).then(r=>r.default||r.default||r)),lb=ft(()=>rt(()=>import("./nX1iBwjm.js"),__vite__mapDeps([24,22,23]),import.meta.url).then(r=>r.default||r.default||r)),ub=ft(()=>rt(()=>import("./BUMyNB6i.js"),[],import.meta.url).then(r=>r.default||r.default||r)),cb=ft(()=>rt(()=>import("./CHcL3rNM.js"),[],import.meta.url).then(r=>r.default||r.default||r)),db=ft(()=>rt(()=>import("./0JocX12m.js"),[],import.meta.url).then(r=>r.default||r.default||r)),fb=ft(()=>rt(()=>import("./jWTPnbSg.js"),[],import.meta.url).then(r=>r.default||r.default||r)),hb=ft(()=>rt(()=>import("./B5Zj_RT4.js"),[],import.meta.url).then(r=>r.default||r.default||r)),pb=ft(()=>rt(()=>import("./CeHv7BBr.js"),[],import.meta.url).then(r=>r.default||r.default||r)),mb=ft(()=>rt(()=>import("./AYZ4hdKF.js"),[],import.meta.url).then(r=>r.default||r.default||r)),yb=ft(()=>rt(()=>import("./CMLPrMyp.js"),[],import.meta.url).then(r=>r.default||r.default||r)),gb=ft(()=>rt(()=>import("./ApVjjWDH.js"),[],import.meta.url).then(r=>r.default||r.default||r)),vb=ft(()=>rt(()=>import("./BDB7Hltw.js"),[],import.meta.url).then(r=>r.default||r.default||r)),bb=ft(()=>rt(()=>import("./DsNrITmQ.js"),[],import.meta.url).then(r=>r.default||r.default||r)),_b=ft(()=>rt(()=>import("./DcKYe_Up.js"),[],import.meta.url).then(r=>r.default||r.default||r)),wb=ft(()=>rt(()=>import("./BS17ih1w.js"),[],import.meta.url).then(r=>r.default||r.default||r)),xb=ft(()=>rt(()=>import("./DuiePBtr.js"),[],import.meta.url).then(r=>r.default||r.default||r)),jb=ft(()=>rt(()=>import("./Cu-2mm29.js"),[],import.meta.url).then(r=>r.default||r.default||r)),Sb=ft(()=>rt(()=>import("./CsZz-VVf.js"),[],import.meta.url).then(r=>r.default||r.default||r)),Eb=ft(()=>rt(()=>import("./C_BaIC7i.js"),[],import.meta.url).then(r=>r.default||r.default||r)),Tb=ft(()=>rt(()=>import("./ch9Af6jL.js"),[],import.meta.url).then(r=>r.default||r.default||r)),kb=ft(()=>rt(()=>import("./CNKvkIMX.js"),[],import.meta.url).then(r=>r.default||r.default||r)),Mb=ft(()=>rt(()=>import("./DMZU-7l4.js"),[],import.meta.url).then(r=>r.default||r.default||r)),Cb=ft(()=>rt(()=>import("./CDtnVs50.js"),[],import.meta.url).then(r=>r.default||r.default||r)),Ob=ft(()=>rt(()=>import("./Caz8YKf-.js"),[],import.meta.url).then(r=>r.default||r.default||r)),Pb=ft(()=>rt(()=>import("./BC8i9gG8.js"),[],import.meta.url).then(r=>r.default||r.default||r)),Ab=[["ContentDoc",K0],["ContentList",Z0],["ContentNavigation",Q0],["ContentQuery",J0],["ContentRenderer",eb],["ContentRendererMarkdown",tb],["MDCSlot",rb],["DocumentDrivenEmpty",nb],["DocumentDrivenNotFound",ob],["Markdown",sb],["ProseCode",ib],["ProseCodeInline",ab],["ProsePre",lb],["ProseA",ub],["ProseBlockquote",cb],["ProseEm",db],["ProseH1",fb],["ProseH2",hb],["ProseH3",pb],["ProseH4",mb],["ProseH5",yb],["ProseH6",gb],["ProseHr",vb],["ProseImg",bb],["ProseLi",_b],["ProseOl",wb],["ProseP",xb],["ProseScript",jb],["ProseStrong",Sb],["ProseTable",Eb],["ProseTbody",Tb],["ProseTd",kb],["ProseTh",Mb],["ProseThead",Cb],["ProseTr",Ob],["ProseUl",Pb]],Rb=yn({name:"nuxt:global-components",setup(r){for(const[d,w]of Ab)r.vueApp.component(d,w),r.vueApp.component("Lazy"+d,w)}}),On={default:()=>rt(()=>import("./C4mBrkTM.js"),[],import.meta.url).then(r=>r.default||r),empty:()=>rt(()=>import("./5trsyYT2.js"),[],import.meta.url).then(r=>r.default||r),light:()=>rt(()=>import("./tFc0TBNA.js"),[],import.meta.url).then(r=>r.default||r)},Lb=yn({name:"nuxt:prefetch",setup(r){const d=Wr();r.hooks.hook("app:mounted",()=>{d.beforeEach(async w=>{var x;const t=(x=w==null?void 0:w.meta)==null?void 0:x.layout;t&&typeof On[t]=="function"&&await On[t]()})}),r.hooks.hook("link:prefetch",w=>{if(mn(w))return;const t=d.resolve(w);if(!t)return;const x=t.meta.layout;let v=yl(t.meta.middleware);v=v.filter(s=>typeof s=="string");for(const s of v)typeof Xo[s]=="function"&&Xo[s]();x&&typeof On[x]=="function"&&On[x]()})}});function Ib(r={}){const d=r.path||window.location.pathname;let w={};try{w=Xs(sessionStorage.getItem("nuxt:reload")||"{}")}catch{}if(r.force||(w==null?void 0:w.path)!==d||(w==null?void 0:w.expires){t.clear()}),r.hook("app:chunkError",({error:v})=>{t.add(v)});function x(v){const u="href"in v&&v.href[0]==="#"?w.app.baseURL+v.href:ci(w.app.baseURL,v.fullPath);Ib({path:u,persistState:!0})}r.hook("app:manifest:update",()=>{d.beforeResolve(x)}),d.onError((v,s)=>{t.has(v)&&x(s)})}});var Os=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Fb(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r.default:r}function Ps(r){throw new Error('Could not dynamically require "'+r+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var Zf={exports:{}};/*! p5.js v1.9.3 April 24, 2024 */(function(r,d){(function(w){r.exports=w()})(function(){var w;return function t(x,v,s){function u(g,p){if(!v[g]){if(!x[g]){var n=typeof Ps=="function"&&Ps;if(!p&&n)return n(g,!0);if(o)return o(g,!0);throw(p=new Error("Cannot find module '"+g+"'")).code="MODULE_NOT_FOUND",p}n=v[g]={exports:{}},x[g][0].call(n.exports,function(i){return u(x[g][1][i]||i)},n,n.exports,t,x,v,s)}return v[g].exports}for(var o=typeof Ps=="function"&&Ps,c=0;c>16&255,f[m++]=a>>8&255,f[m++]=255&a;return l===2&&(a=u[i.charCodeAt(h)]<<2|u[i.charCodeAt(h+1)]>>4,f[m++]=255&a),l===1&&(a=u[i.charCodeAt(h)]<<10|u[i.charCodeAt(h+1)]<<4|u[i.charCodeAt(h+2)]>>2,f[m++]=a>>8&255,f[m++]=255&a),f},v.fromByteArray=function(i){for(var a,h=i.length,y=h%3,l=[],f=0,m=h-y;f>18&63]+s[L>>12&63]+s[L>>6&63]+s[63&L]}(E));return M.join("")}(i,f,m>2]+s[a<<4&63]+"==")):y==2&&(a=(i[h-2]<<8)+i[h-1],l.push(s[a>>10]+s[a>>4&63]+s[a<<2&63]+"=")),l.join("")};for(var s=[],u=[],o=typeof Uint8Array<"u"?Uint8Array:Array,c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",g=0,p=c.length;g>>1;case"base64":return V(T).length;default:if($)return W?-1:q(T).length;D=(""+D).toLowerCase(),$=!0}}function m(T,D,G){var W,$=!1;if((D=D===void 0||D<0?0:D)>this.length||(G=G===void 0||G>this.length?this.length:G)<=0||(G>>>=0)<=(D>>>=0))return"";for(T=T||"utf8";;)switch(T){case"hex":var J=this,de=D,ne=G,K=J.length;(!ne||ne<0||K=T.length){if($)return-1;G=T.length-1}else if(G<0){if(!$)return-1;G=0}if(typeof D=="string"&&(D=n.from(D,W)),n.isBuffer(D))return D.length===0?-1:k(T,D,G,W,$);if(typeof D=="number")return D&=255,typeof Uint8Array.prototype.indexOf=="function"?($?Uint8Array.prototype.indexOf:Uint8Array.prototype.lastIndexOf).call(T,D,G):k(T,[D],G,W,$);throw new TypeError("val must be string, number or Buffer")}function k(T,D,G,W,$){var J=1,ne=T.length,ce=D.length;if(W!==void 0&&((W=String(W).toLowerCase())==="ucs2"||W==="ucs-2"||W==="utf16le"||W==="utf-16le")){if(T.length<2||D.length<2)return-1;ne/=J=2,ce/=2,G/=2}function ie(le,me){return J===1?le[me]:le.readUInt16BE(me*J)}if($)for(var pe=-1,K=G;K>8,ce=ce%256,ie.push(ce),ie.push(ne);return ie}(D,T.length-G),T,G,W)}function P(T,D,G){G=Math.min(T.length,G);for(var W=[],$=D;$>>10&1023|55296),K=56320|1023&K),W.push(K),$+=z}var te=W,le=te.length;if(le<=L)return String.fromCharCode.apply(String,te);for(var me="",de=0;de"u"||typeof console.error!="function"||console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."),Object.defineProperty(n.prototype,"parent",{enumerable:!0,get:function(){if(n.isBuffer(this))return this.buffer}}),Object.defineProperty(n.prototype,"offset",{enumerable:!0,get:function(){if(n.isBuffer(this))return this.byteOffset}}),typeof Symbol<"u"&&Symbol.species!=null&&n[Symbol.species]===n&&Object.defineProperty(n,Symbol.species,{value:null,configurable:!0,enumerable:!1,writable:!1}),n.poolSize=8192,n.from=i,Object.setPrototypeOf(n.prototype,Uint8Array.prototype),Object.setPrototypeOf(n,Uint8Array),n.alloc=function(T,D,G){return D=D,G=G,a(T=T),!(T<=0)&&D!==void 0?typeof G=="string"?p(T).fill(D,G):p(T).fill(D):p(T)},n.allocUnsafe=h,n.allocUnsafeSlow=h,n.isBuffer=function(T){return T!=null&&T._isBuffer===!0&&T!==n.prototype},n.compare=function(T,D){if(Z(T,Uint8Array)&&(T=n.from(T,T.offset,T.byteLength)),Z(D,Uint8Array)&&(D=n.from(D,D.offset,D.byteLength)),!n.isBuffer(T)||!n.isBuffer(D))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(T===D)return 0;for(var G=T.length,W=D.length,$=0,J=Math.min(G,W);$T&&(D+=" ... "),""},c&&(n.prototype[c]=n.prototype.inspect),n.prototype.compare=function(T,D,G,W,$){if(Z(T,Uint8Array)&&(T=n.from(T,T.offset,T.byteLength)),!n.isBuffer(T))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof T);if(G===void 0&&(G=T?T.length:0),W===void 0&&(W=0),$===void 0&&($=this.length),(D=D===void 0?0:D)<0||G>T.length||W<0||$>this.length)throw new RangeError("out of range index");if($<=W&&G<=D)return 0;if($<=W)return-1;if(G<=D)return 1;if(this===T)return 0;for(var J=($>>>=0)-(W>>>=0),ne=(G>>>=0)-(D>>>=0),ce=Math.min(J,ne),ie=this.slice(W,$),pe=T.slice(D,G),K=0;K>>=0,isFinite(G)?(G>>>=0,W===void 0&&(W="utf8")):(W=G,G=void 0)}var $=this.length-D;if((G===void 0||$this.length)throw new RangeError("Attempt to write outside buffer bounds");W=W||"utf8";for(var J,ne,ce,ie=!1;;)switch(W){case"hex":var pe=this,K=T,z=D,te=G,le=(z=Number(z)||0,pe.length-z);(!te||le<(te=Number(te)))&&(te=le),(le=K.length)/2T.length)throw new RangeError("Index out of range")}function A(T,D,G,W){if(G+W>T.length)throw new RangeError("Index out of range");if(G<0)throw new RangeError("Index out of range")}function N(T,D,G,W,$){return D=+D,G>>>=0,$||A(T,0,G,4),o.write(T,D,G,W,23,4),G+4}function F(T,D,G,W,$){return D=+D,G>>>=0,$||A(T,0,G,8),o.write(T,D,G,W,52,8),G+8}n.prototype.slice=function(T,D){var G=this.length,G=((T=~~T)<0?(T+=G)<0&&(T=0):G>>=0,D>>>=0,G||C(T,D,this.length);for(var W=this[T],$=1,J=0;++J>>=0,D>>>=0,G||C(T,D,this.length);for(var W=this[T+--D],$=1;0>>=0,D||C(T,1,this.length),this[T]},n.prototype.readUInt16LE=function(T,D){return T>>>=0,D||C(T,2,this.length),this[T]|this[T+1]<<8},n.prototype.readUInt16BE=function(T,D){return T>>>=0,D||C(T,2,this.length),this[T]<<8|this[T+1]},n.prototype.readUInt32LE=function(T,D){return T>>>=0,D||C(T,4,this.length),(this[T]|this[T+1]<<8|this[T+2]<<16)+16777216*this[T+3]},n.prototype.readUInt32BE=function(T,D){return T>>>=0,D||C(T,4,this.length),16777216*this[T]+(this[T+1]<<16|this[T+2]<<8|this[T+3])},n.prototype.readIntLE=function(T,D,G){T>>>=0,D>>>=0,G||C(T,D,this.length);for(var W=this[T],$=1,J=0;++J>>=0,D>>>=0,G||C(T,D,this.length);for(var W=D,$=1,J=this[T+--W];0>>=0,D||C(T,1,this.length),128&this[T]?-1*(255-this[T]+1):this[T]},n.prototype.readInt16LE=function(T,D){return T>>>=0,D||C(T,2,this.length),D=this[T]|this[T+1]<<8,32768&D?4294901760|D:D},n.prototype.readInt16BE=function(T,D){return T>>>=0,D||C(T,2,this.length),D=this[T+1]|this[T]<<8,32768&D?4294901760|D:D},n.prototype.readInt32LE=function(T,D){return T>>>=0,D||C(T,4,this.length),this[T]|this[T+1]<<8|this[T+2]<<16|this[T+3]<<24},n.prototype.readInt32BE=function(T,D){return T>>>=0,D||C(T,4,this.length),this[T]<<24|this[T+1]<<16|this[T+2]<<8|this[T+3]},n.prototype.readFloatLE=function(T,D){return T>>>=0,D||C(T,4,this.length),o.read(this,T,!0,23,4)},n.prototype.readFloatBE=function(T,D){return T>>>=0,D||C(T,4,this.length),o.read(this,T,!1,23,4)},n.prototype.readDoubleLE=function(T,D){return T>>>=0,D||C(T,8,this.length),o.read(this,T,!0,52,8)},n.prototype.readDoubleBE=function(T,D){return T>>>=0,D||C(T,8,this.length),o.read(this,T,!1,52,8)},n.prototype.writeUIntLE=function(T,D,G,W){T=+T,D>>>=0,G>>>=0,W||I(this,T,D,G,Math.pow(2,8*G)-1,0);var $=1,J=0;for(this[D]=255&T;++J>>=0,G>>>=0,W||I(this,T,D,G,Math.pow(2,8*G)-1,0);var $=G-1,J=1;for(this[D+$]=255&T;0<=--$&&(J*=256);)this[D+$]=T/J&255;return D+G},n.prototype.writeUInt8=function(T,D,G){return T=+T,D>>>=0,G||I(this,T,D,1,255,0),this[D]=255&T,D+1},n.prototype.writeUInt16LE=function(T,D,G){return T=+T,D>>>=0,G||I(this,T,D,2,65535,0),this[D]=255&T,this[D+1]=T>>>8,D+2},n.prototype.writeUInt16BE=function(T,D,G){return T=+T,D>>>=0,G||I(this,T,D,2,65535,0),this[D]=T>>>8,this[D+1]=255&T,D+2},n.prototype.writeUInt32LE=function(T,D,G){return T=+T,D>>>=0,G||I(this,T,D,4,4294967295,0),this[D+3]=T>>>24,this[D+2]=T>>>16,this[D+1]=T>>>8,this[D]=255&T,D+4},n.prototype.writeUInt32BE=function(T,D,G){return T=+T,D>>>=0,G||I(this,T,D,4,4294967295,0),this[D]=T>>>24,this[D+1]=T>>>16,this[D+2]=T>>>8,this[D+3]=255&T,D+4},n.prototype.writeIntLE=function(T,D,G,W){T=+T,D>>>=0,W||I(this,T,D,G,(W=Math.pow(2,8*G-1))-1,-W);var $=0,J=1,ne=0;for(this[D]=255&T;++$>0)-ne&255;return D+G},n.prototype.writeIntBE=function(T,D,G,W){T=+T,D>>>=0,W||I(this,T,D,G,(W=Math.pow(2,8*G-1))-1,-W);var $=G-1,J=1,ne=0;for(this[D+$]=255&T;0<=--$&&(J*=256);)T<0&&ne===0&&this[D+$+1]!==0&&(ne=1),this[D+$]=(T/J>>0)-ne&255;return D+G},n.prototype.writeInt8=function(T,D,G){return T=+T,D>>>=0,G||I(this,T,D,1,127,-128),this[D]=255&(T=T<0?255+T+1:T),D+1},n.prototype.writeInt16LE=function(T,D,G){return T=+T,D>>>=0,G||I(this,T,D,2,32767,-32768),this[D]=255&T,this[D+1]=T>>>8,D+2},n.prototype.writeInt16BE=function(T,D,G){return T=+T,D>>>=0,G||I(this,T,D,2,32767,-32768),this[D]=T>>>8,this[D+1]=255&T,D+2},n.prototype.writeInt32LE=function(T,D,G){return T=+T,D>>>=0,G||I(this,T,D,4,2147483647,-2147483648),this[D]=255&T,this[D+1]=T>>>8,this[D+2]=T>>>16,this[D+3]=T>>>24,D+4},n.prototype.writeInt32BE=function(T,D,G){return T=+T,D>>>=0,G||I(this,T,D,4,2147483647,-2147483648),this[D]=(T=T<0?4294967295+T+1:T)>>>24,this[D+1]=T>>>16,this[D+2]=T>>>8,this[D+3]=255&T,D+4},n.prototype.writeFloatLE=function(T,D,G){return N(this,T,D,!0,G)},n.prototype.writeFloatBE=function(T,D,G){return N(this,T,D,!1,G)},n.prototype.writeDoubleLE=function(T,D,G){return F(this,T,D,!0,G)},n.prototype.writeDoubleBE=function(T,D,G){return F(this,T,D,!1,G)},n.prototype.copy=function(T,D,G,W){if(!n.isBuffer(T))throw new TypeError("argument should be a Buffer");if(G=G||0,W||W===0||(W=this.length),D>=T.length&&(D=T.length),(W=0=this.length)throw new RangeError("Index out of range");if(W<0)throw new RangeError("sourceEnd out of bounds");W>this.length&&(W=this.length);var $=(W=T.length-D>>=0,G=G===void 0?this.length:G>>>0,typeof(T=T||0)=="number")for(J=D;J>6|192,63&G|128)}else if(G<65536){if((D-=3)<0)break;J.push(G>>12|224,G>>6&63|128,63&G|128)}else{if(!(G<1114112))throw new Error("Invalid code point");if((D-=4)<0)break;J.push(G>>18|240,G>>12&63|128,G>>6&63|128,63&G|128)}}return J}function V(T){return u.toByteArray(function(D){if((D=(D=D.split("=")[0]).trim().replace(B,"")).length<2)return"";for(;D.length%4!=0;)D+="=";return D}(T))}function H(T,D,G,W){for(var $=0;$=D.length||$>=T.length);++$)D[$+G]=T[$];return $}function Z(T,D){return T instanceof D||T!=null&&T.constructor!=null&&T.constructor.name!=null&&T.constructor.name===D.name}function ee(T){return T!=T}var ue=function(){for(var T="0123456789abcdef",D=new Array(256),G=0;G<16;++G)for(var W=16*G,$=0;$<16;++$)D[W+$]=T[G]+T[$];return D}()}).call(this,t("buffer").Buffer)},{"base64-js":1,buffer:4,ieee754:251}],5:[function(t,x,v){x.exports=function(s){if(typeof s!="function")throw TypeError(String(s)+" is not a function");return s}},{}],6:[function(t,x,v){var s=t("../internals/is-object");x.exports=function(u){if(s(u)||u===null)return u;throw TypeError("Can't set "+String(u)+" as a prototype")}},{"../internals/is-object":75}],7:[function(o,x,v){var s=o("../internals/well-known-symbol"),u=o("../internals/object-create"),o=o("../internals/object-define-property"),c=s("unscopables"),g=Array.prototype;g[c]==null&&o.f(g,c,{configurable:!0,value:u(null)}),x.exports=function(p){g[c][p]=!0}},{"../internals/object-create":91,"../internals/object-define-property":93,"../internals/well-known-symbol":149}],8:[function(t,x,v){var s=t("../internals/string-multibyte").charAt;x.exports=function(u,o,c){return o+(c?s(u,o).length:1)}},{"../internals/string-multibyte":124}],9:[function(t,x,v){x.exports=function(s,u,o){if(s instanceof u)return s;throw TypeError("Incorrect "+(o?o+" ":"")+"invocation")}},{}],10:[function(t,x,v){var s=t("../internals/is-object");x.exports=function(u){if(s(u))return u;throw TypeError(String(u)+" is not an object")}},{"../internals/is-object":75}],11:[function(t,x,v){x.exports=typeof ArrayBuffer<"u"&&typeof DataView<"u"},{}],12:[function(A,x,v){function s(F){return p(F)&&n(N,i(F))}var u,o=A("../internals/array-buffer-native"),c=A("../internals/descriptors"),g=A("../internals/global"),p=A("../internals/is-object"),n=A("../internals/has"),i=A("../internals/classof"),a=A("../internals/create-non-enumerable-property"),h=A("../internals/redefine"),y=A("../internals/object-define-property").f,l=A("../internals/object-get-prototype-of"),f=A("../internals/object-set-prototype-of"),L=A("../internals/well-known-symbol"),A=A("../internals/uid"),m=g.Int8Array,b=m&&m.prototype,j=g.Uint8ClampedArray,j=j&&j.prototype,k=m&&l(m),E=b&&l(b),M=Object.prototype,P=M.isPrototypeOf,L=L("toStringTag"),C=A("TYPED_ARRAY_TAG"),I=o&&!!f&&i(g.opera)!=="Opera",A=!1,N={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8};for(u in N)g[u]||(I=!1);if((!I||typeof k!="function"||k===Function.prototype)&&(k=function(){throw TypeError("Incorrect invocation")},I))for(u in N)g[u]&&f(g[u],k);if((!I||!E||E===M)&&(E=k.prototype,I))for(u in N)g[u]&&f(g[u].prototype,E);if(I&&l(j)!==E&&f(j,E),c&&!n(E,L))for(u in A=!0,y(E,L,{get:function(){return p(this)?this[C]:void 0}}),N)g[u]&&a(g[u],C,u);x.exports={NATIVE_ARRAY_BUFFER_VIEWS:I,TYPED_ARRAY_TAG:A&&C,aTypedArray:function(F){if(s(F))return F;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(F){if(f){if(P.call(k,F))return F}else for(var B in N)if(n(N,u)&&(B=g[B],B&&(F===B||P.call(B,F))))return F;throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(F,B,q){if(c){if(q)for(var V in N)V=g[V],V&&n(V.prototype,F)&&delete V.prototype[F];E[F]&&!q||h(E,F,!q&&I&&b[F]||B)}},exportTypedArrayStaticMethod:function(F,B,q){var V,H;if(c){if(f){if(q)for(V in N)(H=g[V])&&n(H,F)&&delete H[F];if(k[F]&&!q)return;try{return h(k,F,!q&&I&&m[F]||B)}catch{}}for(V in N)!(H=g[V])||H[F]&&!q||h(H,F,B)}},isView:function(F){return F=i(F),F==="DataView"||n(N,F)},isTypedArray:s,TypedArray:k,TypedArrayPrototype:E}},{"../internals/array-buffer-native":11,"../internals/classof":29,"../internals/create-non-enumerable-property":38,"../internals/descriptors":43,"../internals/global":60,"../internals/has":61,"../internals/is-object":75,"../internals/object-define-property":93,"../internals/object-get-prototype-of":98,"../internals/object-set-prototype-of":102,"../internals/redefine":109,"../internals/uid":146,"../internals/well-known-symbol":149}],13:[function(G,x,v){function s(z){return[255&z]}function u(z){return[255&z,z>>8&255]}function o(z){return[255&z,z>>8&255,z>>16&255,z>>24&255]}function c(z){return z[3]<<24|z[2]<<16|z[1]<<8|z[0]}function g(z){return J(z,23,4)}function p(z){return J(z,52,8)}function n(z,te){A(z[Z],te,{get:function(){return B(this)[te]}})}function i(ge,te,ye,me){if(ye=M(ye),ge=B(ge),ye+te>ge.byteLength)throw $(ee);var de=B(ge.buffer).bytes,ye=ye+ge.byteOffset,ge=de.slice(ye,ye+te);return me?ge:ge.reverse()}function a(z,te,le,me,de,ye){if(le=M(le),z=B(z),le+te>z.byteLength)throw $(ee);for(var ge=B(z.buffer).bytes,ke=le+z.byteOffset,be=me(+de),Ie=0;Iepe;)(ce=ie[pe++])in T||f(T,ce,ue[ce]);h.constructor=T}C&&L(G)!==W&&C(G,W);var P=new D(new T(2)),K=G.setInt8;P.setInt8(0,2147483648),P.setInt8(1,2147483649),!P.getInt8(0)&&P.getInt8(1)||m(G,{setInt8:function(te,le){K.call(this,te,le<<24>>24)},setUint8:function(te,le){K.call(this,te,le<<24>>24)}},{unsafe:!0})}else T=function(z){j(this,T,V),z=M(z),q(this,{bytes:N.call(new Array(z),0),byteLength:z}),y||(this.byteLength=z)},D=function(z,de,le){j(this,D,H),j(z,T,H);var me=B(z).byteLength,de=k(de);if(de<0||me>24},getUint8:function(z){return i(this,1,z)[0]},getInt16:function(z){return z=i(this,2,z,1>16},getUint16:function(z){return z=i(this,2,z,1>>0},getFloat32:function(z){return ne(i(this,4,z,1"+n+""}},{"../internals/require-object-coercible":114}],37:[function(t,x,v){function s(){return this}var u=t("../internals/iterators-core").IteratorPrototype,o=t("../internals/object-create"),c=t("../internals/create-property-descriptor"),g=t("../internals/set-to-string-tag"),p=t("../internals/iterators");x.exports=function(n,i,a){return i+=" Iterator",n.prototype=o(u,{next:c(1,a)}),g(n,i,!1,!0),p[i]=s,n}},{"../internals/create-property-descriptor":39,"../internals/iterators":80,"../internals/iterators-core":79,"../internals/object-create":91,"../internals/set-to-string-tag":118}],38:[function(t,x,v){var s=t("../internals/descriptors"),u=t("../internals/object-define-property"),o=t("../internals/create-property-descriptor");x.exports=s?function(c,g,p){return u.f(c,g,o(1,p))}:function(c,g,p){return c[g]=p,c}},{"../internals/create-property-descriptor":39,"../internals/descriptors":43,"../internals/object-define-property":93}],39:[function(t,x,v){x.exports=function(s,u){return{enumerable:!(1&s),configurable:!(2&s),writable:!(4&s),value:u}}},{}],40:[function(t,x,v){var s=t("../internals/to-primitive"),u=t("../internals/object-define-property"),o=t("../internals/create-property-descriptor");x.exports=function(c,g,p){g=s(g),g in c?u.f(c,g,o(0,p)):c[g]=p}},{"../internals/create-property-descriptor":39,"../internals/object-define-property":93,"../internals/to-primitive":141}],41:[function(l,x,v){function s(){return this}var u=l("../internals/export"),o=l("../internals/create-iterator-constructor"),c=l("../internals/object-get-prototype-of"),g=l("../internals/object-set-prototype-of"),p=l("../internals/set-to-string-tag"),n=l("../internals/create-non-enumerable-property"),i=l("../internals/redefine"),a=l("../internals/well-known-symbol"),h=l("../internals/is-pure"),y=l("../internals/iterators"),l=l("../internals/iterators-core"),f=l.IteratorPrototype,m=l.BUGGY_SAFARI_ITERATORS,b=a("iterator"),j="values",k="entries";x.exports=function(E,M,P,q,C,I,A){o(P,M,q);function N(T){if(T===C&&ee)return ee;if(!m&&T in H)return H[T];switch(T){case"keys":case j:case k:return function(){return new P(this,T)}}return function(){return new P(this)}}var F,B,q=M+" Iterator",V=!1,H=E.prototype,Z=H[b]||H["@@iterator"]||C&&H[C],ee=!m&&Z||N(C),ue=M=="Array"&&H.entries||Z;if(ue&&(ue=c(ue.call(new E)),f!==Object.prototype&&ue.next&&(h||c(ue)===f||(g?g(ue,f):typeof ue[b]!="function"&&n(ue,b,s)),p(ue,q,!0,!0),h&&(y[q]=s))),C==j&&Z&&Z.name!==j&&(V=!0,ee=function(){return Z.call(this)}),h&&!A||H[b]===ee||n(H,b,ee),y[M]=ee,C)if(F={values:N(j),keys:I?ee:N("keys"),entries:N(k)},A)for(B in F)!m&&!V&&B in H||i(H,B,F[B]);else u({target:M,proto:!0,forced:m||V},F);return F}},{"../internals/create-iterator-constructor":37,"../internals/create-non-enumerable-property":38,"../internals/export":50,"../internals/is-pure":76,"../internals/iterators":80,"../internals/iterators-core":79,"../internals/object-get-prototype-of":98,"../internals/object-set-prototype-of":102,"../internals/redefine":109,"../internals/set-to-string-tag":118,"../internals/well-known-symbol":149}],42:[function(t,x,v){var s=t("../internals/path"),u=t("../internals/has"),o=t("../internals/well-known-symbol-wrapped"),c=t("../internals/object-define-property").f;x.exports=function(g){var p=s.Symbol||(s.Symbol={});u(p,g)||c(p,g,{value:o.f(g)})}},{"../internals/has":61,"../internals/object-define-property":93,"../internals/path":105,"../internals/well-known-symbol-wrapped":148}],43:[function(t,x,v){t=t("../internals/fails"),x.exports=!t(function(){return Object.defineProperty({},1,{get:function(){return 7}})[1]!=7})},{"../internals/fails":51}],44:[function(u,x,v){var s=u("../internals/global"),u=u("../internals/is-object"),o=s.document,c=u(o)&&u(o.createElement);x.exports=function(g){return c?o.createElement(g):{}}},{"../internals/global":60,"../internals/is-object":75}],45:[function(t,x,v){x.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},{}],46:[function(t,x,v){t=t("../internals/engine-user-agent"),x.exports=/(iphone|ipod|ipad).*applewebkit/i.test(t)},{"../internals/engine-user-agent":47}],47:[function(t,x,v){t=t("../internals/get-built-in"),x.exports=t("navigator","userAgent")||""},{"../internals/get-built-in":57}],48:[function(o,x,v){var s,u,c=o("../internals/global"),o=o("../internals/engine-user-agent"),c=c.process,c=c&&c.versions,c=c&&c.v8;c?u=(s=c.split("."))[0]+s[1]:o&&(!(s=o.match(/Edge\/(\d+)/))||74<=s[1])&&(s=o.match(/Chrome\/(\d+)/))&&(u=s[1]),x.exports=u&&+u},{"../internals/engine-user-agent":47,"../internals/global":60}],49:[function(t,x,v){x.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},{}],50:[function(t,x,v){var s=t("../internals/global"),u=t("../internals/object-get-own-property-descriptor").f,o=t("../internals/create-non-enumerable-property"),c=t("../internals/redefine"),g=t("../internals/set-global"),p=t("../internals/copy-constructor-properties"),n=t("../internals/is-forced");x.exports=function(i,a){var h,y,l,f=i.target,m=i.global,b=i.stat,j=m?s:b?s[f]||g(f,{}):(s[f]||{}).prototype;if(j)for(h in a){if(y=a[h],l=i.noTargetGet?(l=u(j,h))&&l.value:j[h],!n(m?h:f+(b?".":"#")+h,i.forced)&&l!==void 0){if(typeof y==typeof l)continue;p(y,l)}(i.sham||l&&l.sham)&&o(y,"sham",!0),c(j,h,y,i)}}},{"../internals/copy-constructor-properties":33,"../internals/create-non-enumerable-property":38,"../internals/global":60,"../internals/is-forced":74,"../internals/object-get-own-property-descriptor":94,"../internals/redefine":109,"../internals/set-global":116}],51:[function(t,x,v){x.exports=function(s){try{return!!s()}catch{return!0}}},{}],52:[function(a,x,v){a("../modules/es.regexp.exec");var s=a("../internals/redefine"),u=a("../internals/fails"),o=a("../internals/well-known-symbol"),c=a("../internals/regexp-exec"),g=a("../internals/create-non-enumerable-property"),p=o("species"),n=!u(function(){var l=/./;return l.exec=function(){var f=[];return f.groups={a:"7"},f},"".replace(l,"$")!=="7"}),i="a".replace(/./,"$0")==="$0",a=o("replace"),h=!!/./[a]&&/./[a]("a","$0")==="",y=!u(function(){var f=/(?:)/,l=f.exec,f=(f.exec=function(){return l.apply(this,arguments)},"ab".split(f));return f.length!==2||f[0]!=="a"||f[1]!=="b"});x.exports=function(l,f,m,b){var j,k,E=o(l),M=!u(function(){var L={};return L[E]=function(){return 7},""[l](L)!=7}),P=M&&!u(function(){var L=!1,C=/a/;return l==="split"&&((C={constructor:{}}).constructor[p]=function(){return C},C.flags="",C[E]=/./[E]),C.exec=function(){return L=!0,null},C[E](""),!L});M&&P&&(l!=="replace"||n&&i&&!h)&&(l!=="split"||y)||(j=/./[E],m=(P=m(E,""[l],function(L,C,I,A,N){return C.exec===c?M&&!N?{done:!0,value:j.call(C,I,A)}:{done:!0,value:L.call(I,C,A)}:{done:!1}},{REPLACE_KEEPS_$0:i,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:h}))[0],k=P[1],s(String.prototype,l,m),s(RegExp.prototype,E,f==2?function(L,C){return k.call(L,this,C)}:function(L){return k.call(L,this)})),b&&g(RegExp.prototype[E],"sham",!0)}},{"../internals/create-non-enumerable-property":38,"../internals/fails":51,"../internals/redefine":109,"../internals/regexp-exec":111,"../internals/well-known-symbol":149,"../modules/es.regexp.exec":192}],53:[function(t,x,v){function s(g,p,n,i,a,h,y,l){for(var f,m=a,b=0,j=!!y&&c(y,l,3);b>1,j=n===23?u(2,-24)-u(2,-77):0,k=p<0||p===0&&1/p<0?1:0,E=0;for((p=s(p))!=p||p===1/0?(h=p!=p?1:0,a=m):(a=o(c(p)/g),p*(y=u(2,-a))<1&&(a--,y*=2),2<=(p+=1<=a+b?j/y:j*u(2,1-b))*y&&(a++,y/=2),m<=a+b?(h=0,a=m):1<=a+b?(h=(p*y-1)*u(2,n),a+=b):(h=p*u(2,b-1)*u(2,n),a=0));8<=n;l[E++]=255&h,h/=256,n-=8);for(a=a<>1,l=m-7,f=a-1,m=p[f--],b=127&m;for(m>>=7;0>=-l,l+=n;0"+b+""},m=function(){try{u=document.domain&&new ActiveXObject("htmlfile")}catch{}m=u?((b=u).write(f("")),b.close(),j=b.parentWindow.Object,b=null,j):(b=i("iframe"),j="java"+y+":",b.style.display="none",n.appendChild(b),b.src=String(j),(j=b.contentWindow.document).open(),j.write(f("document.F=Object")),j.close(),j.F);for(var b,j,k=g.length;k--;)delete m[h][g[k]];return m()};p[l]=!0,x.exports=Object.create||function(b,j){var k;return b!==null?(s[h]=o(b),k=new s,s[h]=null,k[l]=b):k=m(),j===void 0?k:c(k,j)}},{"../internals/an-object":10,"../internals/document-create-element":44,"../internals/enum-bug-keys":49,"../internals/hidden-keys":62,"../internals/html":64,"../internals/object-define-properties":92,"../internals/shared-key":119}],92:[function(t,x,v){var s=t("../internals/descriptors"),u=t("../internals/object-define-property"),o=t("../internals/an-object"),c=t("../internals/object-keys");x.exports=s?Object.defineProperties:function(g,p){o(g);for(var n,i=c(p),a=i.length,h=0;ha;)!s(i,n=p[a++])||~o(h,n)||h.push(n);return h}},{"../internals/array-includes":18,"../internals/has":61,"../internals/hidden-keys":62,"../internals/to-indexed-object":135}],100:[function(t,x,v){var s=t("../internals/object-keys-internal"),u=t("../internals/enum-bug-keys");x.exports=Object.keys||function(o){return s(o,u)}},{"../internals/enum-bug-keys":49,"../internals/object-keys-internal":99}],101:[function(t,x,v){var s={}.propertyIsEnumerable,u=Object.getOwnPropertyDescriptor,o=u&&!s.call({1:2},1);v.f=o?function(c){return c=u(this,c),!!c&&c.enumerable}:s},{}],102:[function(t,x,v){var s=t("../internals/an-object"),u=t("../internals/a-possible-prototype");x.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var o,c=!1,g={};try{(o=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(g,[]),c=g instanceof Array}catch{}return function(p,n){return s(p),u(n),c?o.call(p,n):p.__proto__=n,p}}():void 0)},{"../internals/a-possible-prototype":6,"../internals/an-object":10}],103:[function(t,x,v){var s=t("../internals/to-string-tag-support"),u=t("../internals/classof");x.exports=s?{}.toString:function(){return"[object "+u(this)+"]"}},{"../internals/classof":29,"../internals/to-string-tag-support":142}],104:[function(t,x,v){var s=t("../internals/get-built-in"),u=t("../internals/object-get-own-property-names"),o=t("../internals/object-get-own-property-symbols"),c=t("../internals/an-object");x.exports=s("Reflect","ownKeys")||function(g){var p=u.f(c(g)),n=o.f;return n?p.concat(n(g)):p}},{"../internals/an-object":10,"../internals/get-built-in":57,"../internals/object-get-own-property-names":96,"../internals/object-get-own-property-symbols":97}],105:[function(t,x,v){t=t("../internals/global"),x.exports=t},{"../internals/global":60}],106:[function(t,x,v){x.exports=function(s){try{return{error:!1,value:s()}}catch(u){return{error:!0,value:u}}}},{}],107:[function(t,x,v){var s=t("../internals/an-object"),u=t("../internals/is-object"),o=t("../internals/new-promise-capability");x.exports=function(c,g){return s(c),u(g)&&g.constructor===c?g:((0,(c=o.f(c)).resolve)(g),c.promise)}},{"../internals/an-object":10,"../internals/is-object":75,"../internals/new-promise-capability":87}],108:[function(t,x,v){var s=t("../internals/redefine");x.exports=function(u,o,c){for(var g in o)s(u,g,o[g],c);return u}},{"../internals/redefine":109}],109:[function(p,x,v){var s=p("../internals/global"),u=p("../internals/create-non-enumerable-property"),o=p("../internals/has"),c=p("../internals/set-global"),g=p("../internals/inspect-source"),p=p("../internals/internal-state"),n=p.get,i=p.enforce,a=String(String).split("String");(x.exports=function(h,y,l,j){var m=!!j&&!!j.unsafe,b=!!j&&!!j.enumerable,j=!!j&&!!j.noTargetGet;typeof l=="function"&&(typeof y!="string"||o(l,"name")||u(l,"name",y),i(l).source=a.join(typeof y=="string"?y:"")),h===s?b?h[y]=l:c(y,l):(m?!j&&h[y]&&(b=!0):delete h[y],b?h[y]=l:u(h,y,l))})(Function.prototype,"toString",function(){return typeof this=="function"&&n(this).source||g(this)})},{"../internals/create-non-enumerable-property":38,"../internals/global":60,"../internals/has":61,"../internals/inspect-source":69,"../internals/internal-state":71,"../internals/set-global":116}],110:[function(t,x,v){var s=t("./classof-raw"),u=t("./regexp-exec");x.exports=function(o,c){var g=o.exec;if(typeof g=="function"){if(g=g.call(o,c),typeof g!="object")throw TypeError("RegExp exec method returned something other than an Object or null");return g}if(s(o)!=="RegExp")throw TypeError("RegExp#exec called on incompatible receiver");return u.call(o,c)}},{"./classof-raw":28,"./regexp-exec":111}],111:[function(c,x,v){var s,u,o=c("./regexp-flags"),c=c("./regexp-sticky-helpers"),g=RegExp.prototype.exec,p=String.prototype.replace,n=g,i=(s=/a/,u=/b*/g,g.call(s,"a"),g.call(u,"a"),s.lastIndex!==0||u.lastIndex!==0),a=c.UNSUPPORTED_Y||c.BROKEN_CARET,h=/()??/.exec("")[1]!==void 0;x.exports=n=i||h||a?function(y){var l,f,m,b,j=this,k=a&&j.sticky,E=o.call(j),M=j.source,P=0,L=y;return k&&((E=E.replace("y","")).indexOf("g")===-1&&(E+="g"),L=String(y).slice(j.lastIndex),0f&&(y=y.slice(0,f)),p?h+y:y+h)}}var u=t("../internals/to-length"),o=t("../internals/string-repeat"),c=t("../internals/require-object-coercible"),g=Math.ceil;x.exports={start:s(!1),end:s(!0)}},{"../internals/require-object-coercible":114,"../internals/string-repeat":128,"../internals/to-length":137}],127:[function(t,x,v){function s(m){return m+22+75*(m<26)}function u(m){var b,j=[],k=(m=function(Z){for(var ee=[],ue=0,T=Z.length;uel((o-M)/N))throw RangeError(h);for(M+=(I-E)*N,E=I,A=0;Ao)throw RangeError(h);if(b==E){for(var F=M,B=c;;B+=c){var q=B<=P?1:P+g<=B?g:B-P;if(F>1,Z+=l(Z/ee);y*g>>1>>=1)&&(c+=c))1&p&&(g+=c);return g}},{"../internals/require-object-coercible":114,"../internals/to-integer":136}],129:[function(t,x,v){var s=t("../internals/fails"),u=t("../internals/whitespaces");x.exports=function(o){return s(function(){return!!u[o]()||"​…᠎"[o]()!="​…᠎"||u[o].name!==o})}},{"../internals/fails":51,"../internals/whitespaces":150}],130:[function(o,x,v){function s(p){return function(n){return n=String(u(n)),1&p&&(n=n.replace(c,"")),n=2&p?n.replace(g,""):n}}var u=o("../internals/require-object-coercible"),o="["+o("../internals/whitespaces")+"]",c=RegExp("^"+o+o+"*"),g=RegExp(o+o+"*$");x.exports={start:s(1),end:s(2),trim:s(3)}},{"../internals/require-object-coercible":114,"../internals/whitespaces":150}],131:[function(y,x,v){function s(C){return function(){L(C)}}function u(C){L(C.data)}function o(C){g.postMessage(C+"",l.protocol+"//"+l.host)}var c,g=y("../internals/global"),p=y("../internals/fails"),n=y("../internals/classof-raw"),i=y("../internals/function-bind-context"),a=y("../internals/html"),h=y("../internals/document-create-element"),y=y("../internals/engine-is-ios"),l=g.location,f=g.setImmediate,m=g.clearImmediate,b=g.process,j=g.MessageChannel,k=g.Dispatch,E=0,M={},P="onreadystatechange",L=function(C){var I;M.hasOwnProperty(C)&&(I=M[C],delete M[C],I())};f&&m||(f=function(C){for(var I=[],A=1;A=h.length?{value:a.target=void 0,done:!0}:y=="keys"?{value:l,done:!1}:y=="values"?{value:h[l],done:!1}:{value:[l,h[l]],done:!1}},"values"),o.Arguments=o.Array,u("keys"),u("values"),u("entries")},{"../internals/add-to-unscopables":7,"../internals/define-iterator":41,"../internals/internal-state":71,"../internals/iterators":80,"../internals/to-indexed-object":135}],165:[function(g,x,v){var s=g("../internals/export"),c=g("../internals/indexed-object"),u=g("../internals/to-indexed-object"),g=g("../internals/array-method-is-strict"),o=[].join,c=c!=Object,g=g("join",",");s({target:"Array",proto:!0,forced:c||!g},{join:function(p){return o.call(u(this),p===void 0?",":p)}})},{"../internals/array-method-is-strict":22,"../internals/export":50,"../internals/indexed-object":67,"../internals/to-indexed-object":135}],166:[function(u,x,v){var s=u("../internals/export"),u=u("../internals/array-last-index-of");s({target:"Array",proto:!0,forced:u!==[].lastIndexOf},{lastIndexOf:u})},{"../internals/array-last-index-of":20,"../internals/export":50}],167:[function(c,x,v){var s=c("../internals/export"),u=c("../internals/array-iteration").map,o=c("../internals/array-method-has-species-support"),c=c("../internals/array-method-uses-to-length"),o=o("map"),c=c("map");s({target:"Array",proto:!0,forced:!o||!c},{map:function(g){return u(this,g,1I;I++)p(k,P=C[I])&&!p(L,P)&&m(L,P,f(k,P));(L.prototype=E).constructor=L,g(o,j,L)}},{"../internals/classof-raw":28,"../internals/descriptors":43,"../internals/fails":51,"../internals/global":60,"../internals/has":61,"../internals/inherit-if-required":68,"../internals/is-forced":74,"../internals/object-create":91,"../internals/object-define-property":93,"../internals/object-get-own-property-descriptor":94,"../internals/object-get-own-property-names":96,"../internals/redefine":109,"../internals/string-trim":130,"../internals/to-primitive":141}],179:[function(t,x,v){t("../internals/export")({target:"Number",stat:!0},{isFinite:t("../internals/number-is-finite")})},{"../internals/export":50,"../internals/number-is-finite":89}],180:[function(p,x,v){function s(a,h,y){return h===0?y:h%2==1?s(a,h-1,y*a):s(a*a,h/2,y)}var u=p("../internals/export"),o=p("../internals/to-integer"),c=p("../internals/this-number-value"),g=p("../internals/string-repeat"),p=p("../internals/fails"),n=1 .toFixed,i=Math.floor;u({target:"Number",proto:!0,forced:n&&(8e-5.toFixed(3)!=="0.000"||.9.toFixed(0)!=="1"||1.255.toFixed(2)!=="1.25"||0xde0b6b3a7640080.toFixed(0)!=="1000000000000000128")||!p(function(){n.call({})})},{toFixed:function(j){function h(P,L){for(var C=-1,I=L;++C<6;)I+=P*k[C],k[C]=I%1e7,I=i(I/1e7)}function y(P){for(var L=6,C=0;0<=--L;)C+=k[L],k[L]=i(C/P),C=C%P*1e7}function l(){for(var P,L=6,C="";0<=--L;)C===""&&L!==0&&k[L]===0||(P=String(k[L]),C=C===""?P:C+g.call("0",7-P.length)+P);return C}var f,m,b=c(this),j=o(j),k=[0,0,0,0,0,0],E="",M="0";if(j<0||20Pe;){var He,We,qe,Ye=se[Pe++],lt=Se?Ye.ok:Ye.fail,ot=Ye.resolve,Ze=Ye.reject,it=Ye.domain;try{lt?(Se||(Ee.rejection===ye&&function(nt,kt){C.call(n,function(){pe?J.emit("rejectionHandled",nt):De(te,nt,kt.value)})}(Re,Ee),Ee.rejection=de),lt===!0?He=xe:(it&&it.enter(),He=lt(xe),it&&(it.exit(),qe=!0)),He===Ye.promise?Ze(W("Promise-chain cycle")):(We=be(He))?We.call(He,ot,Ze):ot(He)):Ze(xe)}catch(nt){it&&!qe&&it.exit(),Ze(nt)}}Ee.reactions=[],Ee.notified=!1,re&&!Ee.rejection&&(Q=Re,ae=Ee,C.call(n,function(){var nt=ae.value,kt=Le(ae);if(kt&&(kt=B(function(){pe?J.emit("unhandledRejection",nt,Q):De(z,Q,nt)}),ae.rejection=pe||Le(ae)?ye:de,kt.error))throw kt.value}))}))},De=function(Re,Ee,re){var se;K?((se=$.createEvent("Event")).promise=Ee,se.reason=re,se.initEvent(Re,!1,!0),n.dispatchEvent(se)):se={promise:Ee,reason:re},(Ee=n["on"+Re])?Ee(se):Re===z&&N("Unhandled promise rejection",re)},Le=function(Re){return Re.rejection!==de&&!Re.parent},Ne=function(Re,Ee,re,se){return function(Q){Re(Ee,re,Q,se)}},Be=function(Re,Ee,re,se){Ee.done||(Ee.done=!0,(Ee=se||Ee).value=re,Ee.state=me,Ie(Re,Ee,!0))},we=function(Re,Ee,re,se){if(!Ee.done){Ee.done=!0,se&&(Ee=se);try{if(Re===re)throw W("Promise can't be resolved itself");var Q=be(re);Q?I(function(){var ae={done:!1};try{Q.call(re,Ne(we,Re,ae,Ee),Ne(Be,Re,ae,Ee))}catch(xe){Be(Re,ae,xe,Ee)}}):(Ee.value=re,Ee.state=le,Ie(Re,Ee,!1))}catch(ae){Be(Re,{done:!1},ae,Ee)}}};ge&&(G=function(Re){j(this,G,ee),b(Re),s.call(this);var Ee=ue(this);try{Re(Ne(we,this,Ee),Ne(Be,this,Ee))}catch(re){Be(this,Ee,re)}},(s=function(Re){T(this,{type:ee,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=y(G.prototype,{then:function(Re,Ee){var re=D(this),se=ce(L(this,G));return se.ok=typeof Re!="function"||Re,se.fail=typeof Ee=="function"&&Ee,se.domain=pe?J.domain:void 0,re.parent=!0,re.reactions.push(se),re.state!=0&&Ie(this,re,!1),se.promise},catch:function(Re){return this.then(void 0,Re)}}),u=function(){var Re=new s,Ee=ue(Re);this.promise=Re,this.resolve=Ne(we,Re,Ee),this.reject=Ne(Be,Re,Ee)},F.f=ce=function(Re){return Re===G||Re===o?new u:ie(Re)},p||typeof a!="function"||(c=a.prototype.then,h(a.prototype,"then",function(Re,Ee){var re=this;return new G(function(se,Q){c.call(re,se,Q)}).then(Re,Ee)},{unsafe:!0}),typeof ne=="function"&&g({global:!0,enumerable:!0,forced:!0},{fetch:function(Re){return A(G,ne.apply(n,arguments))}}))),g({global:!0,wrap:!0,forced:ge},{Promise:G}),l(G,ee,!1,!0),f(ee),o=i(ee),g({target:ee,stat:!0,forced:ge},{reject:function(Re){var Ee=ce(this);return Ee.reject.call(void 0,Re),Ee.promise}}),g({target:ee,stat:!0,forced:p||ge},{resolve:function(Re){return A(p&&this===o?G:this,Re)}}),g({target:ee,stat:!0,forced:ke},{all:function(Re){var Ee=this,re=ce(Ee),se=re.resolve,Q=re.reject,ae=B(function(){var xe=b(Ee.resolve),Se=[],Pe=0,He=1;M(Re,function(We){var qe=Pe++,Ye=!1;Se.push(void 0),He++,xe.call(Ee,We).then(function(lt){Ye||(Ye=!0,Se[qe]=lt,--He||se(Se))},Q)}),--He||se(Se)});return ae.error&&Q(ae.value),re.promise},race:function(Re){var Ee=this,re=ce(Ee),se=re.reject,Q=B(function(){var ae=b(Ee.resolve);M(Re,function(xe){ae.call(Ee,xe).then(re.resolve,se)})});return Q.error&&se(Q.value),re.promise}})},{"../internals/a-function":5,"../internals/an-instance":9,"../internals/check-correctness-of-iteration":27,"../internals/classof-raw":28,"../internals/engine-v8-version":48,"../internals/export":50,"../internals/get-built-in":57,"../internals/global":60,"../internals/host-report-errors":63,"../internals/inspect-source":69,"../internals/internal-state":71,"../internals/is-forced":74,"../internals/is-object":75,"../internals/is-pure":76,"../internals/iterate":78,"../internals/microtask":82,"../internals/native-promise-constructor":83,"../internals/new-promise-capability":87,"../internals/perform":106,"../internals/promise-resolve":107,"../internals/redefine":109,"../internals/redefine-all":108,"../internals/set-species":117,"../internals/set-to-string-tag":118,"../internals/species-constructor":122,"../internals/task":131,"../internals/well-known-symbol":149}],189:[function(n,x,v){var s=n("../internals/export"),y=n("../internals/get-built-in"),u=n("../internals/a-function"),o=n("../internals/an-object"),c=n("../internals/is-object"),g=n("../internals/object-create"),p=n("../internals/function-bind"),n=n("../internals/fails"),i=y("Reflect","construct"),a=n(function(){function l(){}return!(i(function(){},[],l)instanceof l)}),h=!n(function(){i(function(){})}),y=a||h;s({target:"Reflect",stat:!0,forced:y,sham:y},{construct:function(l,f){u(l),o(f);var m=arguments.length<3?l:u(arguments[2]);if(h&&!a)return i(l,f,m);if(l==m){switch(f.length){case 0:return new l;case 1:return new l(f[0]);case 2:return new l(f[0],f[1]);case 3:return new l(f[0],f[1],f[2]);case 4:return new l(f[0],f[1],f[2],f[3])}var b=[null];return b.push.apply(b,f),new(p.apply(l,b))}return b=m.prototype,m=g(c(b)?b:Object.prototype),b=Function.apply.call(l,m,f),c(b)?b:m}})},{"../internals/a-function":5,"../internals/an-object":10,"../internals/export":50,"../internals/fails":51,"../internals/function-bind":56,"../internals/get-built-in":57,"../internals/is-object":75,"../internals/object-create":91}],190:[function(t,x,v){var s=t("../internals/export"),u=t("../internals/is-object"),o=t("../internals/an-object"),c=t("../internals/has"),g=t("../internals/object-get-own-property-descriptor"),p=t("../internals/object-get-prototype-of");s({target:"Reflect",stat:!0},{get:function n(i,a){var h,y=arguments.length<3?i:arguments[2];return o(i)===y?i[a]:(h=g.f(i,a))?c(h,"value")?h.value:h.get===void 0?void 0:h.get.call(y):u(h=p(i))?n(h,a,y):void 0}})},{"../internals/an-object":10,"../internals/export":50,"../internals/has":61,"../internals/is-object":75,"../internals/object-get-own-property-descriptor":94,"../internals/object-get-prototype-of":98}],191:[function(t,x,v){var s=t("../internals/descriptors"),u=t("../internals/global"),o=t("../internals/is-forced"),c=t("../internals/inherit-if-required"),g=t("../internals/object-define-property").f,p=t("../internals/object-get-own-property-names").f,n=t("../internals/is-regexp"),i=t("../internals/regexp-flags"),a=t("../internals/regexp-sticky-helpers"),h=t("../internals/redefine"),y=t("../internals/fails"),l=t("../internals/internal-state").set,f=t("../internals/set-species"),m=t("../internals/well-known-symbol")("match"),b=u.RegExp,j=b.prototype,k=/a/g,E=/a/g,M=new b(k)!==k,P=a.UNSUPPORTED_Y;if(s&&o("RegExp",!M||P||y(function(){return E[m]=!1,b(k)!=k||b(E)==E||b(k,"i")!="/a/i"}))){for(var L=function(A,N){var F,B=this instanceof L,q=n(A),V=N===void 0;return!B&&q&&A.constructor===L&&V?A:(M?q&&!V&&(A=A.source):A instanceof L&&(V&&(N=i.call(A)),A=A.source),P&&(F=!!N&&-1I;)(function(A){A in L||g(L,A,{configurable:!0,get:function(){return b[A]},set:function(N){b[A]=N}})})(C[I++]);(j.constructor=L).prototype=j,h(u,"RegExp",L)}f("RegExp")},{"../internals/descriptors":43,"../internals/fails":51,"../internals/global":60,"../internals/inherit-if-required":68,"../internals/internal-state":71,"../internals/is-forced":74,"../internals/is-regexp":77,"../internals/object-define-property":93,"../internals/object-get-own-property-names":96,"../internals/redefine":109,"../internals/regexp-flags":112,"../internals/regexp-sticky-helpers":113,"../internals/set-species":117,"../internals/well-known-symbol":149}],192:[function(u,x,v){var s=u("../internals/export"),u=u("../internals/regexp-exec");s({target:"RegExp",proto:!0,forced:/./.exec!==u},{exec:u})},{"../internals/export":50,"../internals/regexp-exec":111}],193:[function(c,x,v){var s=c("../internals/redefine"),u=c("../internals/an-object"),n=c("../internals/fails"),o=c("../internals/regexp-flags"),c="toString",g=RegExp.prototype,p=g[c],n=n(function(){return p.call({source:"a",flags:"b"})!="/a/b"}),i=p.name!=c;(n||i)&&s(RegExp.prototype,c,function(){var a=u(this),h=String(a.source),y=a.flags;return"/"+h+"/"+String(y===void 0&&a instanceof RegExp&&!("flags"in g)?o.call(a):y)},{unsafe:!0})},{"../internals/an-object":10,"../internals/fails":51,"../internals/redefine":109,"../internals/regexp-flags":112}],194:[function(u,x,v){var s=u("../internals/collection"),u=u("../internals/collection-strong");x.exports=s("Set",function(o){return function(){return o(this,arguments.length?arguments[0]:void 0)}},u)},{"../internals/collection":32,"../internals/collection-strong":30}],195:[function(p,x,v){var s=p("../internals/export"),u=p("../internals/object-get-own-property-descriptor").f,o=p("../internals/to-length"),c=p("../internals/not-a-regexp"),g=p("../internals/require-object-coercible"),a=p("../internals/correct-is-regexp-logic"),p=p("../internals/is-pure"),n="".endsWith,i=Math.min,a=a("endsWith");s({target:"String",proto:!0,forced:!!(p||a||!(s=u(String.prototype,"endsWith"))||s.writable)&&!a},{endsWith:function(h){var y=String(g(this)),l=(c(h),1=i.length?{value:void 0,done:!0}:(i=s(i,a),n.index+=i.length,{value:i,done:!1})})},{"../internals/define-iterator":41,"../internals/internal-state":71,"../internals/string-multibyte":124}],198:[function(t,x,v){var s=t("../internals/fix-regexp-well-known-symbol-logic"),u=t("../internals/an-object"),o=t("../internals/to-length"),c=t("../internals/require-object-coercible"),g=t("../internals/advance-string-index"),p=t("../internals/regexp-exec-abstract");s("match",1,function(n,i,a){return[function(h){var y=c(this),l=h==null?void 0:h[n];return l!==void 0?l.call(h,y):new RegExp(h)[n](String(y))},function(h){var y=a(i,h,this);if(y.done)return y.value;var l=u(h),f=String(this);if(!l.global)return p(l,f);for(var m=l.unicode,b=[],j=l.lastIndex=0;(k=p(l,f))!==null;){var k=String(k[0]);(b[j]=k)===""&&(l.lastIndex=g(f,o(l.lastIndex),m)),j++}return j===0?null:b}]})},{"../internals/advance-string-index":8,"../internals/an-object":10,"../internals/fix-regexp-well-known-symbol-logic":52,"../internals/regexp-exec-abstract":110,"../internals/require-object-coercible":114,"../internals/to-length":137}],199:[function(t,x,v){var s=t("../internals/export"),u=t("../internals/string-pad").start;s({target:"String",proto:!0,forced:t("../internals/string-pad-webkit-bug")},{padStart:function(o){return u(this,o,1]*>)/g,f=/\$([$&'`]|\d\d?)/g;s("replace",2,function(m,b,j,k){var E=k.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,M=k.REPLACE_KEEPS_$0,P=E?"$":"$0";return[function(L,C){var I=p(this),A=L==null?void 0:L[m];return A!==void 0?A.call(L,I,C):b.call(String(I),L,C)},function(L,C){if(!E&&M||typeof C=="string"&&C.indexOf(P)===-1){var I=j(b,L,this,C);if(I.done)return I.value}for(var A,N=u(L),F=String(this),B=typeof C=="function",q=(B||(C=String(C)),N.global),V=(q&&(A=N.unicode,N.lastIndex=0),[]);(T=i(N,F))!==null&&(V.push(T),q);)String(T[0])===""&&(N.lastIndex=n(F,c(N.lastIndex),A));for(var H,Z="",ee=0,ue=0;ue>>0;if(C==0)return[];if(M===void 0)return[L];if(!u(M))return j.call(L,M,C);for(var I,A,N,F=[],P=(M.ignoreCase?"i":"")+(M.multiline?"m":"")+(M.unicode?"u":"")+(M.sticky?"y":""),B=0,q=new RegExp(M.source,P+"g");(I=a.call(q,L))&&!(B<(A=q.lastIndex)&&(F.push(L.slice(B,I.index)),1=C));)q.lastIndex===I.index&&q.lastIndex++;return B===L.length?!N&&q.test("")||F.push(""):F.push(L.slice(B)),F.length>C?F.slice(0,C):F}:"0".split(void 0,0).length?function(M,P){return M===void 0&&P===0?[]:j.call(this,M,P)}:j;return[function(M,P){var L=c(this),C=M==null?void 0:M[b];return C!==void 0?C.call(M,L,P):E.call(String(L),M,P)},function(I,P){var L=k(E,I,this,P,E!==j);if(L.done)return L.value;var L=o(I),C=String(this),I=g(L,RegExp),A=L.unicode,N=(L.ignoreCase?"i":"")+(L.multiline?"m":"")+(L.unicode?"u":"")+(m?"y":"g"),F=new I(m?L:"^(?:"+L.source+")",N),B=P===void 0?f:P>>>0;if(B==0)return[];if(C.length===0)return i(F,C)===null?[C]:[];for(var q=0,V=0,H=[];Vne.key){pe.splice(ce,0,ne);break}ce===z&&pe.push(ne)}ie.updateURL()},forEach:function(ne){for(var ce,ie=H(this).entries,pe=j(ne,16))return;for(Nt=0;Jt();){if(Qt=null,Nt>0)if(Jt()=="."&&Nt<4)$e++;else return;if(!G.test(Jt()))return;for(;G.test(Jt());){if(Jr=parseInt(Jt(),10),Qt===null)Qt=Jr;else{if(Qt==0)return;Qt=Qt*10+Jr}if(Qt>255)return;$e++}gt[Xe]=gt[Xe]*256+Qt,Nt++,(Nt==2||Nt==4)&&Xe++}if(Nt!=4)return;break}else if(Jt()==":"){if($e++,!Jt())return}else if(Jt())return;gt[Xe++]=Vt}if(ht!==null)for(_r=Xe-ht,Xe=7;Xe!=0&&_r>0;)en=gt[Xe],gt[Xe--]=gt[ht+_r-1],gt[ht+--_r]=en;else if(Xe!=8)return;return gt}(ze.slice(1,-1)))?void(_e.host=Ke):ee;if(be(_e))return ze=M(ze),ce.test(ze)||(Ke=function(Ge){var gt=Ge.split("."),Xe,ht,$e,Vt,$t,Nt,Qt;if(gt.length&>[gt.length-1]==""&>.pop(),(Xe=gt.length)>4)return Ge;for(ht=[],$e=0;$e1&&Vt.charAt(0)=="0"&&($t=W.test(Vt)?16:8,Vt=Vt.slice($t==8?1:2)),Vt==="")Nt=0;else{if(!($t==10?J:$t==8?$:ne).test(Vt))return Ge;Nt=parseInt(Vt,$t)}ht.push(Nt)}for($e=0;$e=V(256,5-Xe))return null}else if(Nt>255)return null;for(Qt=ht.pop(),$e=0;$e":1,"`":1}),de=j({},me,{"#":1,"?":1,"{":1,"}":1}),ye=j({},de,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),ge=function(_e,ze){var Ke=E(_e,0);return 32"u"&&s!==void 0&&{}.toString.call(s)==="[object process]",m=typeof Uint8ClampedArray<"u"&&typeof importScripts<"u"&&typeof MessageChannel<"u";function b(){var z=setTimeout;return function(){return z(k,1)}}var j=new Array(1e3);function k(){for(var z=0;zL,applyPalette:()=>function(B,q,V="rgb565"){if(!B||!B.buffer)throw new Error("quantize() expected RGBA Uint8Array data");if(!(B instanceof Uint8Array||B instanceof Uint8ClampedArray))throw new Error("quantize() expected RGBA Uint8Array data");if(256>24&255,G=$>>16&255,W=$>>8&255,$=255&$,J=h($,W,G,D),J=J in T?T[J]:T[J]=function(z,te,le,me,de){let ye=0,ge=1e100;for(let De=0;Dege||(ke=be[0],(Ie+=E(ke-z))>ge||(ke=be[1],(Ie+=E(ke-te))>ge||(ke=be[2],(Ie+=E(ke-le))>ge||(ge=Ie,ye=De))))}return ye}($,W,G,D,q);ue[K]=J}else{const K=V==="rgb444"?y:a;for(let z=0;z>16&255,ce=ie>>8&255,ie=255&ie,pe=K(ie,ce,ne),pe=pe in T?T[pe]:T[pe]=function(te,le,me,de){let ye=0,ge=1e100;for(let De=0;Dege||(ke=be[1],(Ie+=E(ke-le))>ge||(ke=be[2],(Ie+=E(ke-me))>ge||(ge=Ie,ye=De)))}return ye}(ie,ce,ne,q);ue[z]=pe}}return ue},default:()=>F,nearestColor:()=>function(B,q,V=j){return B[M(B,q,V)]},nearestColorIndex:()=>M,nearestColorIndexWithDistance:()=>P,prequantize:()=>function(B,{roundRGB:q=5,roundAlpha:V=10,oneBitAlpha:H=null}={}){const Z=new Uint32Array(B.buffer);for(let G=0;G>24&255;var ee,ue=D>>16&255,T=D>>8&255,D=255&D;W=k(W,V),H&&(ee=typeof H=="number"?H:127,W=W<=ee?0:255),D=k(D,q),T=k(T,q),ue=k(ue,q),Z[G]=W<<24|ue<<16|T<<8|D<<0}},quantize:()=>function(B,q,V={}){var{format:H="rgb565",clearAlpha:Z=!0,clearAlphaColor:ee=0,clearAlphaThreshold:ue=0,oneBitAlpha:T=!1}=V;if(!B||!B.buffer)throw new Error("quantize() expected RGBA Uint8Array data");if(!(B instanceof Uint8Array||B instanceof Uint8ClampedArray))throw new Error("quantize() expected RGBA Uint8Array data");B=new Uint32Array(B.buffer);let D=V.useSqrt!==!1;const G=H==="rgba4444",W=function(Le,Ne){const Be=Ne==="rgb444"?4096:65536,we=new Array(Be),Re=Le.length;if(Ne==="rgba4444")for(let ot=0;ot>24&255,re=Q>>16&255,se=Q>>8&255,Q=255&Q,ae=h(Q,se,re,Ee);let Ze=ae in we?we[ae]:we[ae]=b();Ze.rc+=Q,Ze.gc+=se,Ze.bc+=re,Ze.ac+=Ee,Ze.cnt++}else if(Ne==="rgb444")for(let ot=0;ot>16&255,Se=Pe>>8&255,Pe=255&Pe,He=y(Pe,Se,xe);let Ze=He in we?we[He]:we[He]=b();Ze.rc+=Pe,Ze.gc+=Se,Ze.bc+=xe,Ze.cnt++}else for(let ot=0;ot>16&255,qe=Ye>>8&255,Ye=255&Ye,lt=a(Ye,qe,We);let Ze=lt in we?we[lt]:we[lt]=b();Ze.rc+=Ye,Ze.gc+=qe,Ze.bc+=We,Ze.cnt++}return we}(B,H),$=W.length,J=$-1,ne=new Uint32Array($+1);for(var ce=0,ie=0;ie<$;++ie){const Le=W[ie];Le!=null&&(be=1/Le.cnt,G&&(Le.ac*=be),Le.rc*=be,Le.gc*=be,Le.bc*=be,W[ce++]=Le)}f(q)/ce<.022&&(D=!1);for(var pe,K,z,ie=0;ie>1,!(W[pe=ne[z]].err<=te));K=z)ne[K]=pe;ne[K]=ie}var le,me=ce-q;for(ie=0;ie=le.mtm&&W[le.nn].mtm<=le.tm)break;for(le.mtm==J?de=ne[1]=ne[ne[0]--]:(m(W,de),le.tm=ie),te=W[de].err,K=1;(z=K+K)<=ne[0]&&(zW[ne[z+1]].err&&z++,!(te<=W[pe=ne[z]].err));K=z)ne[K]=pe;ne[K]=de}var ye=W[le.nn],ge=le.cnt,ke=ye.cnt,be=1/(ge+ke);G&&(le.ac=be*(ge*le.ac+ke*ye.ac)),le.rc=be*(ge*le.rc+ke*ye.rc),le.gc=be*(ge*le.gc+ke*ye.gc),le.bc=be*(ge*le.bc+ke*ye.bc),le.cnt+=ye.cnt,le.mtm=++ie,W[ye.bk].fw=ye.fw,W[ye.fw].bk=ye.bk,ye.mtm=J}let Ie=[];for(ie=0;;0){let Le=l(Math.round(W[ie].rc),0,255),Ne=l(Math.round(W[ie].gc),0,255),Be=l(Math.round(W[ie].bc),0,255),we=255;G&&(we=l(Math.round(W[ie].ac),0,255),T&&(De=typeof T=="number"?T:127,we=we<=De?0:255),Z&&we<=ue&&(Le=Ne=Be=ee,we=0));var De=G?[Le,Ne,Be,we]:[Le,Ne,Be];if(function(Re,Ee){for(let Q=0;Qfunction(B,q,V=5){if(B.length&&q.length){var H=B.map(D=>D.slice(0,3)),Z=V*V,ee=B[0].length;for(let D=0;Dee?G.slice(0,3):G.slice();var T=P(H,G.slice(0,3),j),ue=T[0],T=T[1];0>>0),ee!=0&&(Z=Math.max(Z,256));const ue=V;V=new Uint8Array(Z),0>=8,$-=8;if((te>pe||ce)&&(ce?(ie=ne,pe=(1<>=8,$-=8;0>3}function h(B,q,V,H){return B>>4|240&q|(240&V)<<4|(240&H)<<8}function y(B,q,V){return B>>4<<8|240&q|V>>4}function l(B,q,V){return B>8&255)}function A(B,q){for(var V=0;V>1,y=-7,l=o?m-1:0,f=o?-1:1,m=s[u+l];for(l+=f,p=m&(1<<-y)-1,m>>=-y,y+=i;0>=-y,y+=c;0>1,l=g===23?Math.pow(2,-24)-Math.pow(2,-77):0,f=c?0:b-1,m=c?1:-1,b=u<0||u===0&&1/u<0?1:0;for(u=Math.abs(u),isNaN(u)||u===1/0?(i=isNaN(u)?1:0,n=h):(n=Math.floor(Math.log(u)/Math.LN2),u*(c=Math.pow(2,-n))<1&&(n--,c*=2),2<=(u+=1<=n+y?l/c:l*Math.pow(2,1-y))*c&&(n++,c/=2),h<=n+y?(i=0,n=h):1<=n+y?(i=(u*c-1)*Math.pow(2,g),n+=y):(i=u*Math.pow(2,y-1)*Math.pow(2,g),n=0));8<=g;s[o+f]=255&i,f+=m,i/=256,g-=8);for(n=n<Math.abs(re[0])&&(se=1),se=Math.abs(re[2])>Math.abs(re[se])?2:se}function I(re,se){re.f+=se.f,re.b.f+=se.b.f}function A(re,se,Q){return re=re.a,se=se.a,Q=Q.a,se.b.a===re?Q.b.a===re?o(se.a,Q.a)?g(Q.b.a,se.a,Q.a)<=0:0<=g(se.b.a,Q.a,se.a):g(Q.b.a,re,Q.a)<=0:Q.b.a===re?0<=g(se.b.a,re,se.a):(se=c(se.b.a,re,se.a),(re=c(Q.b.a,re,Q.a))<=se)}function N(re){re.a.i=null;var se=re.e;se.a.c=se.c,se.c.a=se.a,re.e=null}function F(re,se){l(re.a),re.c=!1,(re.a=se).i=re}function B(re){for(var se=re.a.a;(re=Ee(re)).a.a===se;);return re.c&&(F(re,se=m(Re(re).a.b,re.a.e)),re=Ee(re)),re}function q(re,se,Q){var ae=new we;return ae.a=Q,ae.e=ce(re.f,se.e,ae),Q.i=ae}function V(re,se){switch(re.s){case 100130:return(1&se)!=0;case 100131:return se!==0;case 100132:return 0>1]],He[Pe[qe]])?Ne:Be)(Q,qe),He[Se]=null,We[Se]=Q.b,Q.b=Se}else for(Q.c[-(Se+1)]=null;0Math.max(Pe.a,We.a))){if(o(Se,Pe)){if(0Q.f&&(Q.f*=2,Q.c=Ie(Q.c,Q.f+1)),Q.b===0?xe=ae:(xe=Q.b,Q.b=Q.c[Q.b]),Q.e[xe]=se,Q.c[xe]=ae,Q.d[ae]=xe,Q.h&&Be(Q,ae),xe):(Q=re.a++,re.c[Q]=se,-(Q+1))}function ke(re){if(re.a===0)return Le(re.b);var se=re.c[re.d[re.a-1]];if(re.b.a!==0&&o(De(re.b),se))return Le(re.b);for(;--re.a,0re.a||o(ae[Pe],ae[We])){xe[Q[Se]=Pe]=Se;break}xe[Q[Se]=We]=Se,Se=He}}function Be(re,se){for(var Q=re.d,ae=re.e,xe=re.c,Se=se,Pe=Q[Se];;){var He=Se>>1,We=Q[He];if(He==0||o(ae[We],ae[Pe])){xe[Q[Se]=Pe]=Se;break}xe[Q[Se]=We]=Se,Se=He}}function we(){this.e=this.a=null,this.f=0,this.c=this.b=this.h=this.d=!1}function Re(re){return re.e.c.b}function Ee(re){return re.e.a.b}(s=pe.prototype).x=function(){K(this,0)},s.B=function(re,se){switch(re){case 100142:return;case 100140:switch(se){case 100130:case 100131:case 100132:case 100133:case 100134:return void(this.s=se)}break;case 100141:return void(this.m=!!se);default:return void z(this,100900)}z(this,100901)},s.y=function(re){switch(re){case 100142:return 0;case 100140:return this.s;case 100141:return this.m;default:z(this,100900)}return!1},s.A=function(re,se,Q){this.j[0]=re,this.j[1]=se,this.j[2]=Q},s.z=function(re,se){var Q=se||null;switch(re){case 100100:case 100106:this.h=Q;break;case 100104:case 100110:this.l=Q;break;case 100101:case 100107:this.k=Q;break;case 100102:case 100108:this.i=Q;break;case 100103:case 100109:this.p=Q;break;case 100105:case 100111:this.o=Q;break;case 100112:this.r=Q;break;default:z(this,100900)}},s.C=function(re,se){var Q=!1,ae=[0,0,0];K(this,2);for(var xe=0;xe<3;++xe){var Se=re[xe];Se<-1e150&&(Se=-1e150,Q=!0),1e150ae[qe]&&(ae[qe]=Ye,xe[qe]=Q)}if(ae[1]-He[1]>ae[Q=0]-He[0]&&(Q=1),He[Q=ae[2]-He[2]>ae[Q]-He[Q]?2:Q]>=ae[Q])Pe[0]=0,Pe[1]=0,Pe[2]=1;else{for(He=We[Q],xe=xe[Q],We=[ae=0,0,0],He=[He.g[0]-xe.g[0],He.g[1]-xe.g[1],He.g[2]-xe.g[2]],qe=[0,0,0],Q=Se.e;Q!==Se;Q=Q.e)qe[0]=Q.g[0]-xe.g[0],qe[1]=Q.g[1]-xe.g[1],qe[2]=Q.g[2]-xe.g[2],We[0]=He[1]*qe[2]-He[2]*qe[1],We[1]=He[2]*qe[0]-He[0]*qe[2],We[2]=He[0]*qe[1]-He[1]*qe[0],ae<(Ye=We[0]*We[0]+We[1]*We[1]+We[2]*We[2])&&(ae=Ye,Pe[0]=We[0],Pe[1]=We[1],Pe[2]=We[2]);ae<=0&&(Pe[0]=Pe[1]=Pe[2]=0,Pe[C(He)]=1)}Se=!0}for(We=C(Pe),Q=this.b.c,ae=(We+1)%3,xe=(We+2)%3,We=0>=1;)++y;if(f=1<>8&255,o[n++]=255&g,o[n++]=g>>8&255,o[n++]=(a!==null?128:0)|y,o[n++]=l,o[n++]=0,a!==null)for(var m=0,b=a.length;m>16&255,o[n++]=j>>8&255,o[n++]=255&j}if(i!==null){if(i<0||65535>8&255,o[n++]=0}var k=!1;this.addFrame=function(E,M,P,L,C,I){if(k===!0&&(--n,k=!1),I=I===void 0?{}:I,E<0||M<0||65535>=1;)++F;var B=1<>8&255,o[n++]=Z,o[n++]=0),o[n++]=44,o[n++]=255&E,o[n++]=E>>8&255,o[n++]=255&M,o[n++]=M>>8&255,o[n++]=255&P,o[n++]=P>>8&255,o[n++]=255&L,o[n++]=L>>8&255,o[n++]=A===!0?128|F-1:0,A===!0)for(var ee=0,ue=N.length;ee>16&255,o[n++]=T>>8&255,o[n++]=255&T}return n=function(D,G,W,$){D[G++]=W;var J=G++,ne=1<>=8,z-=8,G===J+256&&(D[J]=255,J=G++)}function me(Le){te|=Le<>=8,z-=8,G===J+256&&(D[J]=255,J=G++);pe===4096?(me(ne),pe=1+ie,K=W+1,ye={}):(1<>=y,f-=y,M==i)h=1+a,l=(1<<(y=n+1))-1,E=null;else{if(M==a)break;for(var P=M>8,++L;var I=C;if(p>=8;E!==null&&h<4096&&(k[h++]=E<<8|I,l+1<=h&&y<12&&(++y,l=l<<1|1)),E=M}}b!==p&&console.log("Warning, gif stream shorter than expected.")}try{v.GifWriter=s,v.GifReader=function(o){var c=0;if(o[c++]!==71||o[c++]!==73||o[c++]!==70||o[c++]!==56||(o[c++]+1&253)!=56||o[c++]!==97)throw new Error("Invalid GIF 87a/89a header.");var g=o[c++]|o[c++]<<8,p=o[c++]|o[c++]<<8,n=o[c++],i=1<<1+(7&n),a=(o[c++],o[c++],null),h=null,y=(n>>7&&(a=c,c+=3*(h=i)),!0),l=[],f=0,m=null,b=0,j=null;for(this.width=g,this.height=p;y&&c>2&7,c++;break;case 254:for(;;){if(!(0<=(E=o[c++])))throw Error("Invalid block size");if(E===0)break;c+=E}break;default:throw new Error("Unknown graphic control label: 0x"+o[c-1].toString(16))}break;case 44:var E,M=o[c++]|o[c++]<<8,P=o[c++]|o[c++]<<8,L=o[c++]|o[c++]<<8,C=o[c++]|o[c++]<<8,q=o[c++],I=q>>6&1,A=1<<1+(7&q),N=a,F=h,B=!1,q=(q>>7&&(B=!0,N=c,c+=3*(F=A)),c);for(c++;;){if(!(0<=(E=o[c++])))throw Error("Invalid block size");if(E===0)break;c+=E}l.push({x:M,y:P,width:L,height:C,has_local_palette:B,palette_offset:N,palette_size:F,data_offset:q,data_length:c-q,transparent_index:m,interlaced:!!I,delay:f,disposal:b});break;case 59:y=!1;break;default:throw new Error("Unknown gif block: 0x"+o[c-1].toString(16))}this.numFrames=function(){return l.length},this.loopCount=function(){return j},this.frameInfo=function(V){if(V<0||V>=l.length)throw new Error("Frame index out of range.");return l[V]},this.decodeAndBlitFrameBGRA=function(V,H){for(var V=this.frameInfo(V),Z=V.width*V.height,ee=new Uint8Array(Z),ue=(u(o,V.data_offset,ee,Z),V.palette_offset),T=V.transparent_index,D=(T===null&&(T=256),V.width),G=g-D,W=D,$=4*(V.y*g+V.x),J=4*((V.y+V.height)*g+V.x),ne=$,ce=4*G,ie=(V.interlaced===!0&&(ce+=4*g*7),8),pe=0,K=ee.length;pe>=1)),le===T?ne+=4:(z=o[ue+3*le],te=o[ue+3*le+1],le=o[ue+3*le+2],H[ne++]=le,H[ne++]=te,H[ne++]=z,H[ne++]=255),--W}},this.decodeAndBlitFrameRGBA=function(V,H){for(var V=this.frameInfo(V),Z=V.width*V.height,ee=new Uint8Array(Z),ue=(u(o,V.data_offset,ee,Z),V.palette_offset),T=V.transparent_index,D=(T===null&&(T=256),V.width),G=g-D,W=D,$=4*(V.y*g+V.x),J=4*((V.y+V.height)*g+V.x),ne=$,ce=4*G,ie=(V.interlaced===!0&&(ce+=4*g*7),8),pe=0,K=ee.length;pe>=1)),le===T?ne+=4:(z=o[ue+3*le],te=o[ue+3*le+1],le=o[ue+3*le+2],H[ne++]=z,H[ne++]=te,H[ne++]=le,H[ne++]=255),--W}}}}catch{}},{}],254:[function(t,x,v){(function(s){var u,o;u=this,o=function(c){function g(U){if(this==null)throw TypeError();var S,O=String(this),R=O.length,U=U?Number(U):0;if(!((U=U!=U?0:U)<0||R<=U))return 55296<=(S=O.charCodeAt(U))&&S<=56319&&U+1>>16-S;return _.tag>>>=S,_.bitcount-=S,R+O}function A(_,S){for(;_.bitcount<24;)_.tag|=_.source[_.sourceIndex++]<<_.bitcount,_.bitcount+=8;for(var O=0,R=0,U=0,X=_.tag;R=2*R+(1&X),X>>>=1,O+=S.table[++U],0<=(R-=S.table[U]););return _.tag=X,_.bitcount-=U,S.trans[O+R]}function N(_,S,O){for(;;){var R=A(_,S);if(R===256)return n;if(R<256)_.dest[_.destLen++]=R;else for(var U,X=I(_,f[R-=257],m[R]),R=A(_,O),Y=U=_.destLen-I(_,b[R],j[R]);Y>>=1,R=U,I(X,2,0)){case 0:O=function(Oe){for(var Je,ut;8this.x2&&(this.x2=_)),typeof S=="number"&&((isNaN(this.y1)||isNaN(this.y2))&&(this.y1=S,this.y2=S),Sthis.y2&&(this.y2=S))},Z.prototype.addX=function(_){this.addPoint(_,null)},Z.prototype.addY=function(_){this.addPoint(null,_)},Z.prototype.addBezier=function(_,S,O,R,U,X,Y,oe){var he=[_,S],fe=[O,R],je=[U,X],Me=[Y,oe];this.addPoint(_,S),this.addPoint(Y,oe);for(var Te=0;Te<=1;Te++){var ve,Ue=6*he[Te]-12*fe[Te]+6*je[Te],Ae=-3*he[Te]+9*fe[Te]-9*je[Te]+3*Me[Te],Fe=3*fe[Te]-3*he[Te];Ae==0?Ue==0||0<(ve=-Fe/Ue)&&ve<1&&(Te===0&&this.addX(H(he[Te],fe[Te],je[Te],Me[Te],ve)),Te===1&&this.addY(H(he[Te],fe[Te],je[Te],Me[Te],ve))):(ve=Math.pow(Ue,2)-4*Fe*Ae)<0||(0<(Fe=(-Ue+Math.sqrt(ve))/(2*Ae))&&Fe<1&&(Te===0&&this.addX(H(he[Te],fe[Te],je[Te],Me[Te],Fe)),Te===1&&this.addY(H(he[Te],fe[Te],je[Te],Me[Te],Fe))),0<(Fe=(-Ue-Math.sqrt(ve))/(2*Ae))&&Fe<1&&(Te===0&&this.addX(H(he[Te],fe[Te],je[Te],Me[Te],Fe)),Te===1&&this.addY(H(he[Te],fe[Te],je[Te],Me[Te],Fe))))}},Z.prototype.addQuad=function(_,S,O,R,U,X){O=_+2/3*(O-_),R=S+2/3*(R-S),this.addBezier(_,S,O,R,O+1/3*(U-_),R+1/3*(X-S),U,X)},ee.prototype.moveTo=function(_,S){this.commands.push({type:"M",x:_,y:S})},ee.prototype.lineTo=function(_,S){this.commands.push({type:"L",x:_,y:S})},ee.prototype.curveTo=ee.prototype.bezierCurveTo=function(_,S,O,R,U,X){this.commands.push({type:"C",x1:_,y1:S,x2:O,y2:R,x:U,y:X})},ee.prototype.quadTo=ee.prototype.quadraticCurveTo=function(_,S,O,R){this.commands.push({type:"Q",x1:_,y1:S,x:O,y:R})},ee.prototype.close=ee.prototype.closePath=function(){this.commands.push({type:"Z"})},ee.prototype.extend=function(_){var S;if(_.commands)_=_.commands;else if(_ instanceof Z)return S=_,this.moveTo(S.x1,S.y1),this.lineTo(S.x2,S.y1),this.lineTo(S.x2,S.y2),this.lineTo(S.x1,S.y2),void this.close();Array.prototype.push.apply(this.commands,_)},ee.prototype.getBoundingBox=function(){for(var _=new Z,S=0,O=0,R=0,U=0,X=0;X>8&255,255&_]},$.USHORT=J(2),W.SHORT=function(_){return[(_=32768<=_?-(65536-_):_)>>8&255,255&_]},$.SHORT=J(2),W.UINT24=function(_){return[_>>16&255,_>>8&255,255&_]},$.UINT24=J(3),W.ULONG=function(_){return[_>>24&255,_>>16&255,_>>8&255,255&_]},$.ULONG=J(4),W.LONG=function(_){return[(_=2147483648<=_?-(4294967296-_):_)>>24&255,_>>16&255,_>>8&255,255&_]},$.LONG=J(4),W.FIXED=W.ULONG,$.FIXED=$.ULONG,W.FWORD=W.SHORT,$.FWORD=$.SHORT,W.UFWORD=W.USHORT,$.UFWORD=$.USHORT,W.LONGDATETIME=function(_){return[0,0,0,0,_>>24&255,_>>16&255,_>>8&255,255&_]},$.LONGDATETIME=J(8),W.TAG=function(_){return D.argument(_.length===4,"Tag should be exactly 4 ASCII characters."),[_.charCodeAt(0),_.charCodeAt(1),_.charCodeAt(2),_.charCodeAt(3)]},$.TAG=J(4),W.Card8=W.BYTE,$.Card8=$.BYTE,W.Card16=W.USHORT,$.Card16=$.USHORT,W.OffSize=W.BYTE,$.OffSize=$.BYTE,W.SID=W.USHORT,$.SID=$.USHORT,W.NUMBER=function(_){return-107<=_&&_<=107?[_+139]:108<=_&&_<=1131?[247+((_-=108)>>8),255&_]:-1131<=_&&_<=-108?[251+((_=-_-108)>>8),255&_]:-32768<=_&&_<=32767?W.NUMBER16(_):W.NUMBER32(_)},$.NUMBER=function(_){return W.NUMBER(_).length},W.NUMBER16=function(_){return[28,_>>8&255,255&_]},$.NUMBER16=J(3),W.NUMBER32=function(_){return[29,_>>24&255,_>>16&255,_>>8&255,255&_]},$.NUMBER32=J(5),W.REAL=function(_){for(var S=_.toString(),O=/\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/.exec(S),R=(O&&(O=parseFloat("1e"+((O[2]?+O[2]:0)+O[1].length)),S=(Math.round(_*O)/O).toString()),""),U=0,X=S.length;U>8&255,S[S.length]=255&R}return S},$.UTF16=function(_){return 2*_.length};var ne,ce={"x-mac-croatian":"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®Š™´¨≠ŽØ∞±≤≥∆µ∂∑∏š∫ªºΩžø¿¡¬√ƒ≈Ć«Č… ÀÃÕŒœĐ—“”‘’÷◊©⁄€‹›Æ»–·‚„‰ÂćÁčÈÍÎÏÌÓÔđÒÚÛÙıˆ˜¯πË˚¸Êæˇ","x-mac-cyrillic":"АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°Ґ£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµґЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю","x-mac-gaelic":"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØḂ±≤≥ḃĊċḊḋḞḟĠġṀæøṁṖṗɼƒſṠ«»… ÀÃÕŒœ–—“”‘’ṡẛÿŸṪ€‹›Ŷŷṫ·Ỳỳ⁊ÂÊÁËÈÍÎÏÌÓÔ♣ÒÚÛÙıÝýŴŵẄẅẀẁẂẃ","x-mac-greek":"Ĺ²É³ÖÜ΅àâä΄¨çéèê룙î‰ôö¦€ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ­","x-mac-icelandic":"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüÝ°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄€ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ","x-mac-inuit":"ᐃᐄᐅᐆᐊᐋᐱᐲᐳᐴᐸᐹᑉᑎᑏᑐᑑᑕᑖᑦᑭᑮᑯᑰᑲᑳᒃᒋᒌᒍᒎᒐᒑ°ᒡᒥᒦ•¶ᒧ®©™ᒨᒪᒫᒻᓂᓃᓄᓅᓇᓈᓐᓯᓰᓱᓲᓴᓵᔅᓕᓖᓗᓘᓚᓛᓪᔨᔩᔪᔫᔭ… ᔮᔾᕕᕖᕗ–—“”‘’ᕘᕙᕚᕝᕆᕇᕈᕉᕋᕌᕐᕿᖀᖁᖂᖃᖄᖅᖏᖐᖑᖒᖓᖔᖕᙱᙲᙳᙴᙵᙶᖖᖠᖡᖢᖣᖤᖥᖦᕼŁł","x-mac-ce":"ÄĀāÉĄÖÜáąČäčĆć鏟ĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņѬ√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ",macintosh:"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄€‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ","x-mac-romanian":"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ĂȘ∞±≤≥¥µ∂∑∏π∫ªºΩăș¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄€‹›Țț‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ","x-mac-turkish":"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙˆ˜¯˘˙˚¸˝˛ˇ"},ie=(G.MACSTRING=function(_,S,O,R){var U=ce[R];if(U!==void 0){for(var X="",Y=0;Y>8&255,Te+256&255)}return fe})(_,R,S);return S},W.INDEX=function(_){for(var S=1,O=[S],R=[],U=0;U<_.length;U+=1){var X=W.OBJECT(_[U]);Array.prototype.push.apply(R,X),S+=X.length,O.push(S)}if(R.length===0)return[0,0];for(var Y=[],oe=1+Math.floor(Math.log(S)/Math.log(2))/8|0,he=[void 0,W.BYTE,W.USHORT,W.UINT24,W.ULONG][oe],fe=0;fe>8,S[je+1]=255&Me,S=S.concat(R[fe])}return S},$.TABLE=function(_){for(var S=0,O=_.fields.length,R=0;R>1,oe.skip("uShort",3),Fe.glyphIndexMap={};for(var ut,et=new Ee.Parser(Ce,Oe+Je+14),tt=new Ee.Parser(Ce,Oe+Je+16+2*ut),ct=new Ee.Parser(Ce,Oe+Je+16+4*ut),Mt=new Ee.Parser(Ce,Oe+Je+16+6*ut),Ut=Oe+Je+16+8*ut,qt=0;qt>4,Y=15&Y;if(X==15||(R+=U[X],Y==15))break;R+=U[Y]}return parseFloat(R)}if(32<=S&&S<=246)return S-139;if(247<=S&&S<=250)return 256*(S-247)+_.parseByte()+108;if(251<=S&&S<=254)return 256*-(S-251)-_.parseByte()-108;throw new Error("Invalid b0 "+S)}function ar(_,S,O){var R=new Ee.Parser(_,S=S!==void 0?S:0),U=[],X=[];for(O=O!==void 0?O:_.length;R.relativeOffset>1,ve.length=0,Ae=!0}return function tt(ct){for(var Mt,Ut,qt,lr,ur,Yr,Tt,Pt,wt,cr,Dt,or,At=0;AtMath.abs(or-Oe)?Ce=Dt+ve.shift():Oe=or+ve.shift(),Te.curveTo(R,U,X,Y,Tt,Pt),Te.curveTo(wt,cr,Dt,or,Ce,Oe);break;default:console.log("Glyph "+S.index+": unknown operator 1200"+er),ve.length=0}break;case 14:0>3;break;case 21:2>16),At+=2;break;case 29:ur=ve.pop()+_.gsubrsBias,(Yr=_.gsubrs[ur])&&tt(Yr);break;case 30:for(;0=O.begin&&_=xe.length&&(X=R.parseChar(),O.names.push(R.parseString(X)));break;case 2.5:O.numberOfGlyphs=R.parseUShort(),O.offset=new Array(O.numberOfGlyphs);for(var oe=0;oeMe.value.tag?1:-1}),S.fields=S.fields.concat(R),S.fields=S.fields.concat(U),S}function Pl(_,S,O){for(var R=0;R 123 are reserved for internal usage");ve|=1<>>1,X=_[U].tag;if(X===S)return U;X>>1,X=_[U];if(X===S)return U;X>>1,Y=(U=_[X]).start;if(Y===S)return U;Y(U=_[O-1]).end?0:U}function ms(_,S){this.font=_,this.tableName=S}function ys(_){ms.call(this,_,"gpos")}function tn(_){ms.call(this,_,"gsub")}function Ll(_,S,O){for(var R=_.subtables,U=0;US.points.length-1||R.matchedPoints[1]>U.points.length-1)throw Error("Matched points out of range in "+S.name);var Y=S.points[R.matchedPoints[0]],oe=U.points[R.matchedPoints[1]],R={xScale:R.xScale,scale01:R.scale01,scale10:R.scale10,yScale:R.yScale,dx:0,dy:0},oe=ji([oe],R)[0];R.dx=Y.x-oe.x,R.dy=Y.y-oe.y,X=ji(U.points,R)}S.points=S.points.concat(X)}}return Fl(S.points)}(ys.prototype=ms.prototype={searchTag:xi,binSearch:Al,getTable:function(_){var S=this.font.tables[this.tableName];return S=!S&&_?this.font.tables[this.tableName]=this.createDefaultTable():S},getScriptNames:function(){var _=this.getTable();return _?_.scripts.map(function(S){return S.tag}):[]},getDefaultScriptName:function(){var _=this.getTable();if(_){for(var S=!1,O=0;O<_.scripts.length;O++){var R=_.scripts[O].tag;if(R==="DFLT")return R;R==="latn"&&(S=!0)}return S?"latn":void 0}},getScriptTable:function(_,S){var O,R=this.getTable(S);if(R)return O=R.scripts,0<=(R=xi(R.scripts,_=_||"DFLT"))?O[R].script:S?(O.splice(-1-R,0,S={tag:_,script:{defaultLangSys:{reserved:0,reqFeatureIndex:65535,featureIndexes:[]},langSysRecords:[]}}),S.script):void 0},getLangSysTable:function(U,S,O){var R,U=this.getScriptTable(U,O);if(U)return S&&S!=="dflt"&&S!=="DFLT"?0<=(R=xi(U.langSysRecords,S))?U.langSysRecords[R].langSys:O?(U.langSysRecords.splice(-1-R,0,O={tag:S,langSys:{reserved:0,reqFeatureIndex:65535,featureIndexes:[]}}),O.langSys):void 0:U.defaultLangSys},getFeatureTable:function(_,S,O,R){if(_=this.getLangSysTable(_,S,R),_){for(var U,X=_.featureIndexes,Y=this.font.tables[this.tableName].features,oe=0;oe=Y[S-1].tag,"Features must be added in alphabetical order."),Y.push(U={tag:O,feature:{params:0,lookupListIndexes:[]}}),X.push(S),U.feature}},getLookupTables:function(X,S,O,R,U){var X=this.getFeatureTable(X,S,O,U),Y=[];if(X){for(var oe,he=X.lookupListIndexes,fe=this.font.tables[this.tableName].lookups,je=0;je",X),S.stack.push(Math.round(64*X))}function Ei(_,S){var O=S.stack,R=O.pop(),U=S.fv,X=S.pv,Y=S.ppem,oe=S.deltaBase+16*(_-1),he=S.deltaShift,fe=S.z0;c.DEBUG&&console.log(S.step,"DELTAP["+_+"]",R,O);for(var je=0;je>4)===Y&&(0<=(Te=(15&Te)-8)&&Te++,c.DEBUG&&console.log(S.step,"DELTAPFIX",Me,"by",Te*he),Me=fe[Me],U.setRelative(Me,Me,Te*he,X))}}function vs(_,S){var O=S.stack,R=O.pop();c.DEBUG&&console.log(S.step,"ROUND[]"),O.push(64*S.round(R/64))}function Ti(_,S){var O=S.stack,R=O.pop(),U=S.ppem,X=S.deltaBase+16*(_-1),Y=S.deltaShift;c.DEBUG&&console.log(S.step,"DELTAC["+_+"]",R,O);for(var oe=0;oe>4)===U&&(0<=(fe=(15&fe)-8)&&fe++,fe=fe*Y,c.DEBUG&&console.log(S.step,"DELTACFIX",he,"by",fe),S.cvt[he]+=fe)}}function nu(_,S){var O,U=S.stack,R=U.pop(),U=U.pop(),X=S.z2[R],Y=S.z1[U];c.DEBUG&&console.log(S.step,"SDPVTL["+_+"]",R,U),R=_?(O=X.y-Y.y,Y.x-X.x):(O=Y.x-X.x,Y.y-X.y),S.dpv=Ao(O,R)}function vn(_,S){var O=S.stack,R=S.prog,U=S.ip;c.DEBUG&&console.log(S.step,"PUSHB["+_+"]");for(var X=0;X<_;X++)O.push(R[++U]);S.ip=U}function bn(_,S){var O=S.ip,R=S.prog,U=S.stack;c.DEBUG&&console.log(S.ip,"PUSHW["+_+"]");for(var X=0;X<_;X++){var Y=R[++O]<<8|R[++O];32768&Y&&(Y=-(1+(65535^Y))),U.push(Y)}S.ip=O}function Qe(_,S,O,R,U,X){var Y,oe,fe=X.stack,he=_&&fe.pop(),fe=fe.pop(),je=X.rp0,je=X.z0[je],Me=X.z1[fe],Te=X.minDis,ve=X.fv,Ue=X.dpv,Ae=Y=Ue.distance(Me,je,!0,!0),Fe=0<=Ae?1:-1;Ae=Math.abs(Ae),_&&(oe=X.cvt[he],R&&Math.abs(Ae-oe)":"_")+(R?"R":"_")+(U===0?"Gr":U===1?"Bl":U===2?"Wh":"")+"]",_?he+"("+X.cvt[he]+","+oe+")":"",fe,"(d =",Y,"->",Fe*Ae,")"),X.rp1=X.rp0,X.rp2=fe,S&&(X.rp0=fe)}Ul.prototype.exec=function(_,S){if(typeof S!="number")throw new Error("Point size is not a number!");if(!(2",R),oe.interpolate(Me,X,Y,he),oe.touch(Me)}_.loop=1},Jl.bind(void 0,0),Jl.bind(void 0,1),function(_){for(var S=_.stack,O=_.rp0,R=_.z0[O],U=_.loop,X=_.fv,Y=_.pv,oe=_.z1;U--;){var he=S.pop(),fe=oe[he];c.DEBUG&&console.log(_.step,(1<_.loop?"loop "+(_.loop-U)+": ":"")+"ALIGNRP[]",he),X.setRelative(fe,R,0,Y),X.touch(fe)}_.loop=1},function(_){c.DEBUG&&console.log(_.step,"RTDG[]"),_.round=mh},eu.bind(void 0,0),eu.bind(void 0,1),function(_){var S=_.prog,O=_.ip,R=_.stack,U=S[++O];c.DEBUG&&console.log(_.step,"NPUSHB[]",U);for(var X=0;X"u"?Mh:Ch)(_,function(O,R){if(O)return S(O);var U;try{U=ki(R)}catch(X){return S(X,null)}return S(null,U)})},c.loadSync=function(_){return ki(Il(t("fs").readFileSync(_)))},Object.defineProperty(c,"__esModule",{value:!0})},o(typeof v=="object"&&x!==void 0?v:u.opentype={})}).call(this,t("buffer").Buffer)},{buffer:4,fs:2}],255:[function(t,x,v){(function(s){function u(g,p){for(var n=0,i=g.length-1;0<=i;i--){var a=g[i];a==="."?g.splice(i,1):a===".."?(g.splice(i,1),n++):n&&(g.splice(i,1),n--)}if(p)for(;n--;)g.unshift("..");return g}function o(g,p){if(g.filter)return g.filter(p);for(var n=[],i=0;i'.concat(f,"").concat(h,""),this.dummyDOM||(this.dummyDOM=document.getElementById(l).parentNode),this.descriptions?this.descriptions.fallbackElements||(this.descriptions.fallbackElements={}):this.descriptions={fallbackElements:{}},this.descriptions.fallbackElements[a]?this.descriptions.fallbackElements[a].innerHTML!==f&&(this.descriptions.fallbackElements[a].innerHTML=f):this._describeElementHTML("fallback",a,f),y===this.LABEL&&(this.descriptions.labelElements||(this.descriptions.labelElements={}),this.descriptions.labelElements[a]?this.descriptions.labelElements[a].innerHTML!==f&&(this.descriptions.labelElements[a].innerHTML=f):this._describeElementHTML("label",a,f)))},s.default.prototype._describeHTML=function(a,h){var y,l=this.canvas.id;a==="fallback"?(this.dummyDOM.querySelector("#".concat(l+u))?this.dummyDOM.querySelector("#"+l+c).insertAdjacentHTML("beforebegin",'

')):(y='

'),this.dummyDOM.querySelector("#".concat(l,"accessibleOutput"))?this.dummyDOM.querySelector("#".concat(l,"accessibleOutput")).insertAdjacentHTML("beforebegin",y):this.dummyDOM.querySelector("#".concat(l)).innerHTML=y),this.descriptions.fallback=this.dummyDOM.querySelector("#".concat(l).concat(o)),this.descriptions.fallback.innerHTML=h):a==="label"&&(this.dummyDOM.querySelector("#".concat(l+g))?this.dummyDOM.querySelector("#".concat(l+n))&&this.dummyDOM.querySelector("#".concat(l+n)).insertAdjacentHTML("beforebegin",'

')):(y='

'),this.dummyDOM.querySelector("#".concat(l,"accessibleOutputLabel"))?this.dummyDOM.querySelector("#".concat(l,"accessibleOutputLabel")).insertAdjacentHTML("beforebegin",y):this.dummyDOM.querySelector("#"+l).insertAdjacentHTML("afterend",y)),this.descriptions.label=this.dummyDOM.querySelector("#"+l+p),this.descriptions.label.innerHTML=h)},s.default.prototype._describeElementHTML=function(a,h,y){var l,f=this.canvas.id;a==="fallback"?(this.dummyDOM.querySelector("#".concat(f+u))?this.dummyDOM.querySelector("#"+f+c)||this.dummyDOM.querySelector("#"+f+o).insertAdjacentHTML("afterend",'
Canvas elements and their descriptions
')):(l='
Canvas elements and their descriptions
'),this.dummyDOM.querySelector("#".concat(f,"accessibleOutput"))?this.dummyDOM.querySelector("#".concat(f,"accessibleOutput")).insertAdjacentHTML("beforebegin",l):this.dummyDOM.querySelector("#"+f).innerHTML=l),(l=document.createElement("tr")).id=f+"_fte_"+h,this.dummyDOM.querySelector("#"+f+c).appendChild(l),this.descriptions.fallbackElements[h]=this.dummyDOM.querySelector("#".concat(f).concat("_fte_").concat(h)),this.descriptions.fallbackElements[h].innerHTML=y):a==="label"&&(this.dummyDOM.querySelector("#".concat(f+g))?this.dummyDOM.querySelector("#".concat(f+n))||this.dummyDOM.querySelector("#"+f+p).insertAdjacentHTML("afterend",'
')):(l='
'),this.dummyDOM.querySelector("#".concat(f,"accessibleOutputLabel"))?this.dummyDOM.querySelector("#".concat(f,"accessibleOutputLabel")).insertAdjacentHTML("beforebegin",l):this.dummyDOM.querySelector("#"+f).insertAdjacentHTML("afterend",l)),(a=document.createElement("tr")).id=f+"_lte_"+h,this.dummyDOM.querySelector("#"+f+n).appendChild(a),this.descriptions.labelElements[h]=this.dummyDOM.querySelector("#".concat(f).concat("_lte_").concat(h)),this.descriptions.labelElements[h].innerHTML=y)},t=s.default,v.default=t},{"../core/main":280,"core-js/modules/es.array.concat":152,"core-js/modules/es.regexp.exec":192,"core-js/modules/es.string.ends-with":195,"core-js/modules/es.string.replace":201}],261:[function(t,x,v){t("core-js/modules/es.array.concat"),t("core-js/modules/es.array.from"),t("core-js/modules/es.array.map"),t("core-js/modules/es.string.iterator"),t("core-js/modules/es.array.concat"),t("core-js/modules/es.array.from"),t("core-js/modules/es.array.map"),t("core-js/modules/es.string.iterator"),Object.defineProperty(v,"__esModule",{value:!0}),v.default=void 0,t=(t=t("../core/main"))&&t.__esModule?t:{default:t},t.default.prototype._updateGridOutput=function(s){var u,o,c,g;this.dummyDOM.querySelector("#".concat(s,"_summary"))&&(u=this._accessibleOutputs[s],c=function(p,n,i,a){return n="".concat(n," canvas, ").concat(i," by ").concat(a," pixels, contains ").concat(p[0]),n=(p[0]===1?"".concat(n," shape: "):"".concat(n," shapes: ")).concat(p[1]),n}((o=function(p,n){var i,a="",h="",y=0;for(i in n){var l,f=0;for(l in n[i]){var m='
  • ').concat(n[i][l].color," ").concat(i,",");i==="line"?m+=" location = ".concat(n[i][l].pos,", length = ").concat(n[i][l].length," pixels"):(m+=" location = ".concat(n[i][l].pos),i!=="point"&&(m+=", area = ".concat(n[i][l].area," %")),m+="
  • "),a+=m,f++,y++}h=1').concat(n[i][f].color," ").concat(i,"
    "):'').concat(n[i][f].color," ").concat(i," midpoint"),l[n[i][f].loc.locY][n[i][f].loc.locX]?l[n[i][f].loc.locY][n[i][f].loc.locX]=l[n[i][f].loc.locY][n[i][f].loc.locX]+" "+m:l[n[i][f].loc.locY][n[i][f].loc.locX]=m,h++}for(a in l){var b,j="";for(b in l[a])j+="",l[a][b]!==void 0&&(j+=l[a][b]),j+="";y=y+j+""}return y}(s,this.ingredients.shapes),c!==u.summary.innerHTML&&(u.summary.innerHTML=c),g!==u.map.innerHTML&&(u.map.innerHTML=g),o.details!==u.shapeDetails.innerHTML&&(u.shapeDetails.innerHTML=o.details),this._accessibleOutputs[s]=u)},t=t.default,v.default=t},{"../core/main":280,"core-js/modules/es.array.concat":152,"core-js/modules/es.array.from":161,"core-js/modules/es.array.map":167,"core-js/modules/es.string.iterator":197}],262:[function(t,x,v){t("core-js/modules/es.symbol"),t("core-js/modules/es.symbol.description"),t("core-js/modules/es.symbol.iterator"),t("core-js/modules/es.array.concat"),t("core-js/modules/es.array.fill"),t("core-js/modules/es.array.from"),t("core-js/modules/es.array.iterator"),t("core-js/modules/es.array.map"),t("core-js/modules/es.number.to-fixed"),t("core-js/modules/es.object.to-string"),t("core-js/modules/es.regexp.to-string"),t("core-js/modules/es.string.iterator"),t("core-js/modules/web.dom-collections.iterator"),t("core-js/modules/es.array.concat"),t("core-js/modules/es.array.fill"),t("core-js/modules/es.array.map"),t("core-js/modules/es.number.to-fixed"),Object.defineProperty(v,"__esModule",{value:!0}),v.default=void 0;var s=(t=t("../core/main"))&&t.__esModule?t:{default:t};function u(c){return function(g){if(Array.isArray(g)){for(var p=0,n=new Array(g.length);p')):this.dummyDOM.querySelector("#".concat(a)).innerHTML='
    '))):g==="Label"&&(p=a+c+(h=g),this.dummyDOM.querySelector("#".concat(n=a+"accessibleOutput"+g))||(this.dummyDOM.querySelector("#".concat(a,"_Label"))?this.dummyDOM.querySelector("#".concat(a,"_Label")):this.dummyDOM.querySelector("#".concat(a))).insertAdjacentHTML("afterend",'
    '))),this._accessibleOutputs[p]={},c==="textOutput"?(h="#".concat(a,"gridOutput").concat(h),i='
    Text Output

      '),this.dummyDOM.querySelector(h)?this.dummyDOM.querySelector(h).insertAdjacentHTML("beforebegin",i):this.dummyDOM.querySelector("#".concat(n)).innerHTML=i,this._accessibleOutputs[p].list=this.dummyDOM.querySelector("#".concat(p,"_list"))):c==="gridOutput"&&(h="#".concat(a,"textOutput").concat(h),i='
      Grid Output

        '),this.dummyDOM.querySelector(h)?this.dummyDOM.querySelector(h).insertAdjacentHTML("afterend",i):this.dummyDOM.querySelector("#".concat(n)).innerHTML=i,this._accessibleOutputs[p].map=this.dummyDOM.querySelector("#".concat(p,"_map"))),this._accessibleOutputs[p].shapeDetails=this.dummyDOM.querySelector("#".concat(p,"_shapeDetails")),this._accessibleOutputs[p].summary=this.dummyDOM.querySelector("#".concat(p,"_summary"))},s.default.prototype._updateAccsOutput=function(){var c=this.canvas.id;JSON.stringify(this.ingredients.shapes)===this.ingredients.pShapes&&this.ingredients.colors.background===this.ingredients.pBackground||(this.ingredients.pShapes=JSON.stringify(this.ingredients.shapes),this._accessibleOutputs.text&&this._updateTextOutput(c+"textOutput"),this._accessibleOutputs.grid&&this._updateGridOutput(c+"gridOutput"),this._accessibleOutputs.textLabel&&this._updateTextOutput(c+"textOutputLabel"),this._accessibleOutputs.gridLabel&&this._updateGridOutput(c+"gridOutputLabel"))},s.default.prototype._accsBackground=function(c){this.ingredients.pShapes=JSON.stringify(this.ingredients.shapes),this.ingredients.pBackground=this.ingredients.colors.background,this.ingredients.shapes={},this.ingredients.colors.backgroundRGBA!==c&&(this.ingredients.colors.backgroundRGBA=c,this.ingredients.colors.background=this._rgbColorName(c))},s.default.prototype._accsCanvasColors=function(c,g){c==="fill"?this.ingredients.colors.fillRGBA!==g&&(this.ingredients.colors.fillRGBA=g,this.ingredients.colors.fill=this._rgbColorName(g)):c==="stroke"&&this.ingredients.colors.strokeRGBA!==g&&(this.ingredients.colors.strokeRGBA=g,this.ingredients.colors.stroke=this._rgbColorName(g))},s.default.prototype._accsOutput=function(c,g){c==="ellipse"&&g[2]===g[3]?c="circle":c==="rectangle"&&g[2]===g[3]&&(c="square");var p,n,i={},a=!0,h=function(l,f){var m;return l=l==="rectangle"||l==="ellipse"||l==="arc"||l==="circle"||l==="square"?(m=Math.round(f[0]+f[2]/2),Math.round(f[1]+f[3]/2)):l==="triangle"?(m=(f[0]+f[2]+f[4])/3,(f[1]+f[3]+f[5])/3):l==="quadrilateral"?(m=(f[0]+f[2]+f[4]+f[6])/4,(f[1]+f[3]+f[5]+f[7])/4):l==="line"?(m=(f[0]+f[2])/2,(f[1]+f[3])/2):(m=f[0],f[1]),[m,l]}(c,g);if(c==="line"?(i.color=this.ingredients.colors.stroke,i.length=Math.round(this.dist(g[0],g[1],g[2],g[3])),p=this._getPos(g[0],[1]),n=this._getPos(g[2],[3]),i.loc=o(h,this.width,this.height),i.pos=p===n?"at ".concat(p):"from ".concat(p," to ").concat(n)):(c==="point"?i.color=this.ingredients.colors.stroke:(i.color=this.ingredients.colors.fill,i.area=this._getArea(c,g)),i.pos=this._getPos.apply(this,u(h)),i.loc=o(h,this.width,this.height)),this.ingredients.shapes[c]){if(this.ingredients.shapes[c]!==[i]){for(var y in this.ingredients.shapes[c])JSON.stringify(this.ingredients.shapes[c][y])===JSON.stringify(i)&&(a=!1);a===!0&&this.ingredients.shapes[c].push(i)}}else this.ingredients.shapes[c]=[i]},s.default.prototype._getPos=function(n,p){var n=new DOMPointReadOnly(n,p),p=this._renderer.isP3D?new DOMMatrix(this._renderer.uMVMatrix.mat4):this.drawingContext.getTransform(),n=n.matrixTransform(p),p=n.x,n=n.y,i=this.width*this._pixelDensity,a=this.height*this._pixelDensity;return p<.4*i?n<.4*a?"top left":.6*aMath.PI?i+=n:i-=n)):c==="ellipse"||c==="circle"?i=3.14*g[2]/2*g[3]/2:c==="line"||c==="point"?i=0:c==="quadrilateral"?i=Math.abs((g[6]+g[0])*(g[7]-g[1])+(g[0]+g[2])*(g[1]-g[3])+(g[2]+g[4])*(g[3]-g[5])+(g[4]+g[6])*(g[5]-g[7]))/2:c==="rectangle"||c==="square"?i=g[2]*g[3]:c==="triangle"&&(i=Math.abs(g[0]*(g[3]-g[5])+g[2]*(g[5]-g[1])+g[4]*(g[1]-g[3]))/2),this.width*this._pixelDensity),h=this.height*this._pixelDensity,y=[new DOMPoint(0,0),new DOMPoint(a,0),new DOMPoint(a,h),new DOMPoint(0,h)],l=(this._renderer.isP3D?new DOMMatrix(this._renderer.uMVMatrix.mat4):this.drawingContext.getTransform()).inverse(),f=y.map(function(b){return b.matrixTransform(l)}),m=Math.abs((f[3].x+f[0].x)*(f[3].y-f[0].y)+(f[0].x+f[1].x)*(f[0].y-f[1].y)+(f[1].x+f[2].x)*(f[1].y-f[2].y)+(f[2].x+f[3].x)*(f[2].y-f[3].y))/2;return Math.round(100*i/m)},t=s.default,v.default=t},{"../core/main":280,"core-js/modules/es.array.concat":152,"core-js/modules/es.array.fill":155,"core-js/modules/es.array.from":161,"core-js/modules/es.array.iterator":164,"core-js/modules/es.array.map":167,"core-js/modules/es.number.to-fixed":180,"core-js/modules/es.object.to-string":187,"core-js/modules/es.regexp.to-string":193,"core-js/modules/es.string.iterator":197,"core-js/modules/es.symbol":209,"core-js/modules/es.symbol.description":207,"core-js/modules/es.symbol.iterator":208,"core-js/modules/web.dom-collections.iterator":243}],263:[function(t,x,v){t("core-js/modules/es.array.concat"),t("core-js/modules/es.array.concat"),Object.defineProperty(v,"__esModule",{value:!0}),v.default=void 0,t=(t=t("../core/main"))&&t.__esModule?t:{default:t},t.default.prototype._updateTextOutput=function(s){var u,o,c,g;this.dummyDOM.querySelector("#".concat(s,"_summary"))&&(u=this._accessibleOutputs[s],c=function(p,n,i,a){return i="Your output is a, ".concat(i," by ").concat(a," pixels, ").concat(n," canvas containing the following"),i=p===1?"".concat(i," shape:"):"".concat(i," ").concat(p," shapes:"),i}((o=function(p,n){var i,a="",h=0;for(i in n)for(var y in n[i]){var l='
      • ').concat(n[i][y].color," ").concat(i,"");i==="line"?l+=", ".concat(n[i][y].pos,", ").concat(n[i][y].length," pixels long.
      • "):(l+=", at ".concat(n[i][y].pos),i!=="point"&&(l+=", covering ".concat(n[i][y].area,"% of the canvas")),l+="."),a+=l,h++}return{numShapes:h,listShapes:a}}(s,this.ingredients.shapes)).numShapes,this.ingredients.colors.background,this.width,this.height),g=function(p,n){var i,a="",h=0;for(i in n)for(var y in n[i]){var l='').concat(n[i][y].color," ").concat(i,"");i==="line"?l+="location = ".concat(n[i][y].pos,"length = ").concat(n[i][y].length," pixels"):(l+="location = ".concat(n[i][y].pos,""),i!=="point"&&(l+=" area = ".concat(n[i][y].area,"%")),l+=""),a+=l,h++}return a}(s,this.ingredients.shapes),c!==u.summary.innerHTML&&(u.summary.innerHTML=c),o.listShapes!==u.list.innerHTML&&(u.list.innerHTML=o.listShapes),g!==u.shapeDetails.innerHTML&&(u.shapeDetails.innerHTML=g),this._accessibleOutputs[s]=u)},t=t.default,v.default=t},{"../core/main":280,"core-js/modules/es.array.concat":152}],264:[function(t,x,v){var s=(s=t("./core/main"))&&s.__esModule?s:{default:s};t("./core/constants"),t("./core/environment"),t("./core/friendly_errors/stacktrace"),t("./core/friendly_errors/validate_params"),t("./core/friendly_errors/file_errors"),t("./core/friendly_errors/fes_core"),t("./core/friendly_errors/sketch_reader"),t("./core/helpers"),t("./core/legacy"),t("./core/preload"),t("./core/p5.Element"),t("./core/p5.Graphics"),t("./core/p5.Renderer"),t("./core/p5.Renderer2D"),t("./core/rendering"),t("./core/shim"),t("./core/structure"),t("./core/transform"),t("./core/shape/2d_primitives"),t("./core/shape/attributes"),t("./core/shape/curves"),t("./core/shape/vertex"),t("./accessibility/outputs"),t("./accessibility/textOutput"),t("./accessibility/gridOutput"),t("./accessibility/color_namer"),t("./color/color_conversion"),t("./color/creating_reading"),t("./color/p5.Color"),t("./color/setting"),t("./data/p5.TypedDict"),t("./data/local_storage.js"),t("./dom/dom"),t("./accessibility/describe"),t("./events/acceleration"),t("./events/keyboard"),t("./events/mouse"),t("./events/touch"),t("./image/filters"),t("./image/image"),t("./image/loading_displaying"),t("./image/p5.Image"),t("./image/pixels"),t("./io/files"),t("./io/p5.Table"),t("./io/p5.TableRow"),t("./io/p5.XML"),t("./math/calculation"),t("./math/math"),t("./math/noise"),t("./math/p5.Vector"),t("./math/random"),t("./math/trigonometry"),t("./typography/attributes"),t("./typography/loading_displaying"),t("./typography/p5.Font"),t("./utilities/array_functions"),t("./utilities/conversion"),t("./utilities/string_functions"),t("./utilities/time_date"),t("./webgl/3d_primitives"),t("./webgl/interaction"),t("./webgl/light"),t("./webgl/loading"),t("./webgl/material"),t("./webgl/p5.Camera"),t("./webgl/p5.DataArray"),t("./webgl/p5.Geometry"),t("./webgl/p5.Matrix"),t("./webgl/p5.RendererGL.Immediate"),t("./webgl/p5.RendererGL"),t("./webgl/p5.RendererGL.Retained"),t("./webgl/p5.Framebuffer"),t("./webgl/p5.Shader"),t("./webgl/p5.RenderBuffer"),t("./webgl/p5.Texture"),t("./webgl/text"),t("./core/init"),x.exports=s.default},{"./accessibility/color_namer":259,"./accessibility/describe":260,"./accessibility/gridOutput":261,"./accessibility/outputs":262,"./accessibility/textOutput":263,"./color/color_conversion":265,"./color/creating_reading":266,"./color/p5.Color":267,"./color/setting":268,"./core/constants":269,"./core/environment":270,"./core/friendly_errors/fes_core":271,"./core/friendly_errors/file_errors":272,"./core/friendly_errors/sketch_reader":273,"./core/friendly_errors/stacktrace":274,"./core/friendly_errors/validate_params":275,"./core/helpers":276,"./core/init":277,"./core/legacy":279,"./core/main":280,"./core/p5.Element":281,"./core/p5.Graphics":282,"./core/p5.Renderer":283,"./core/p5.Renderer2D":284,"./core/preload":285,"./core/rendering":286,"./core/shape/2d_primitives":287,"./core/shape/attributes":288,"./core/shape/curves":289,"./core/shape/vertex":290,"./core/shim":291,"./core/structure":292,"./core/transform":293,"./data/local_storage.js":294,"./data/p5.TypedDict":295,"./dom/dom":296,"./events/acceleration":297,"./events/keyboard":298,"./events/mouse":299,"./events/touch":300,"./image/filters":301,"./image/image":302,"./image/loading_displaying":303,"./image/p5.Image":304,"./image/pixels":305,"./io/files":306,"./io/p5.Table":307,"./io/p5.TableRow":308,"./io/p5.XML":309,"./math/calculation":310,"./math/math":311,"./math/noise":312,"./math/p5.Vector":313,"./math/random":314,"./math/trigonometry":315,"./typography/attributes":316,"./typography/loading_displaying":317,"./typography/p5.Font":318,"./utilities/array_functions":319,"./utilities/conversion":320,"./utilities/string_functions":321,"./utilities/time_date":322,"./webgl/3d_primitives":323,"./webgl/interaction":325,"./webgl/light":326,"./webgl/loading":327,"./webgl/material":328,"./webgl/p5.Camera":329,"./webgl/p5.DataArray":330,"./webgl/p5.Framebuffer":331,"./webgl/p5.Geometry":332,"./webgl/p5.Matrix":333,"./webgl/p5.RenderBuffer":334,"./webgl/p5.RendererGL":337,"./webgl/p5.RendererGL.Immediate":335,"./webgl/p5.RendererGL.Retained":336,"./webgl/p5.Shader":338,"./webgl/p5.Texture":339,"./webgl/text":340}],265:[function(t,x,v){Object.defineProperty(v,"__esModule",{value:!0}),v.default=void 0,t=(t=t("../core/main"))&&t.__esModule?t:{default:t},t.default.ColorConversion={_hsbaToHSLA:function(s){var u=s[0],o=s[1],c=s[2],g=(2-o)*c/2;return g!=0&&(g==1?o=0:g<.5?o/=2-o:o=o*c/(2-2*g)),[u,o,g,s[3]]},_hsbaToRGBA:function(s){var u,o,c,g,p,n=6*s[0],i=s[1],a=s[2];return i===0?[a,a,a,s[3]]:(o=a*(1-i),c=a*(1-i*(n-(u=Math.floor(n)))),i=a*(1-i*(1+u-n)),n=u===1?(g=c,p=a,o):u===2?(g=o,p=a,i):u===3?(g=o,p=c,a):u===4?(g=i,p=o,a):u===5?(g=a,p=o,c):(g=a,p=i,o),[g,p,n,s[3]])},_hslaToHSBA:function(s){var u=s[0],o=s[1],c=s[2],g=c<.5?(1+o)*c:c+o-c*o;return[u,o=2*(g-c)/g,g,s[3]]},_hslaToRGBA:function(s){var u,o=6*s[0],c=s[1],g=s[2];return c===0?[g,g,g,s[3]]:[(u=function(p,n,i){return p<0?p+=6:6<=p&&(p-=6),p<1?n+(i-n)*p:p<3?i:p<4?n+(i-n)*(4-p):n})(2+o,c=2*g-(g=g<.5?(1+c)*g:g+c-g*c),g),u(o,c,g),u(o-2,c,g),s[3]]},_rgbaToHSBA:function(s){var u,o,c=s[0],g=s[1],p=s[2],n=Math.max(c,g,p),i=n-Math.min(c,g,p);return i==0?o=u=0:(o=i/n,c===n?u=(g-p)/i:g===n?u=2+(p-c)/i:p===n&&(u=4+(c-g)/i),u<0?u+=6:6<=u&&(u-=6)),[u/6,o,n,s[3]]},_rgbaToHSLA:function(s){var u,o,c=s[0],g=s[1],p=s[2],n=Math.max(c,g,p),a=Math.min(c,g,p),i=n+a,a=n-a;return a==0?o=u=0:(o=i<1?a/i:a/(2-i),c===n?u=(g-p)/a:g===n?u=2+(p-c)/a:p===n&&(u=4+(c-g)/a),u<0?u+=6:6<=u&&(u-=6)),[u/6,o,i/2,s[3]]}},t=t.default.ColorConversion,v.default=t},{"../core/main":280}],266:[function(t,x,v){function s(n){return(s=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(i){return typeof i}:function(i){return i&&typeof Symbol=="function"&&i.constructor===Symbol&&i!==Symbol.prototype?"symbol":typeof i})(n)}function u(n){return(u=typeof Symbol=="function"&&s(Symbol.iterator)==="symbol"?function(i){return s(i)}:function(i){return i&&typeof Symbol=="function"&&i.constructor===Symbol&&i!==Symbol.prototype?"symbol":s(i)})(n)}t("core-js/modules/es.symbol"),t("core-js/modules/es.symbol.description"),t("core-js/modules/es.symbol.iterator"),t("core-js/modules/es.array.iterator"),t("core-js/modules/es.array.map"),t("core-js/modules/es.object.get-own-property-descriptor"),t("core-js/modules/es.object.to-string"),t("core-js/modules/es.string.iterator"),t("core-js/modules/es.weak-map"),t("core-js/modules/web.dom-collections.iterator"),t("core-js/modules/es.array.map"),Object.defineProperty(v,"__esModule",{value:!0}),v.default=void 0;var o=(p=t("../core/main"))&&p.__esModule?p:{default:p},c=function(n){if(n&&n.__esModule)return n;if(n===null||u(n)!=="object"&&typeof n!="function")return{default:n};var i=g();if(i&&i.has(n))return i.get(n);var a,h={},y=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(a in n){var l;Object.prototype.hasOwnProperty.call(n,a)&&((l=y?Object.getOwnPropertyDescriptor(n,a):null)&&(l.get||l.set)?Object.defineProperty(h,a,l):h[a]=n[a])}return h.default=n,i&&i.set(n,h),h}(t("../core/constants"));function g(){var n;return typeof WeakMap!="function"?null:(n=new WeakMap,g=function(){return n},n)}t("./p5.Color"),t("../core/friendly_errors/validate_params"),t("../core/friendly_errors/file_errors"),t("../core/friendly_errors/fes_core"),o.default.prototype.alpha=function(n){return o.default._validateParameters("alpha",arguments),this.color(n)._getAlpha()},o.default.prototype.blue=function(n){return o.default._validateParameters("blue",arguments),this.color(n)._getBlue()},o.default.prototype.brightness=function(n){return o.default._validateParameters("brightness",arguments),this.color(n)._getBrightness()},o.default.prototype.color=function(){for(var n,i=arguments.length,a=new Array(i),h=0;hl[0]?l[0]+=1:y[0]+=1),1<=(h=this.lerp(y[0],l[0],a))&&--h),n=this.lerp(y[1],l[1],a),i=this.lerp(y[2],l[2],a),y=this.lerp(y[3],l[3],a),h*=m[f][0],n*=m[f][1],i*=m[f][2],y*=m[f][3],this.color(h,n,i,y)},o.default.prototype.lightness=function(n){return o.default._validateParameters("lightness",arguments),this.color(n)._getLightness()},o.default.prototype.red=function(n){return o.default._validateParameters("red",arguments),this.color(n)._getRed()},o.default.prototype.saturation=function(n){return o.default._validateParameters("saturation",arguments),this.color(n)._getSaturation()};var p=o.default;v.default=p},{"../core/constants":269,"../core/friendly_errors/fes_core":271,"../core/friendly_errors/file_errors":272,"../core/friendly_errors/validate_params":275,"../core/main":280,"./p5.Color":267,"core-js/modules/es.array.iterator":164,"core-js/modules/es.array.map":167,"core-js/modules/es.object.get-own-property-descriptor":183,"core-js/modules/es.object.to-string":187,"core-js/modules/es.string.iterator":197,"core-js/modules/es.symbol":209,"core-js/modules/es.symbol.description":207,"core-js/modules/es.symbol.iterator":208,"core-js/modules/es.weak-map":241,"core-js/modules/web.dom-collections.iterator":243}],267:[function(h,x,v){function s(b){return(s=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(j){return typeof j}:function(j){return j&&typeof Symbol=="function"&&j.constructor===Symbol&&j!==Symbol.prototype?"symbol":typeof j})(b)}function u(b){return(u=typeof Symbol=="function"&&s(Symbol.iterator)==="symbol"?function(j){return s(j)}:function(j){return j&&typeof Symbol=="function"&&j.constructor===Symbol&&j!==Symbol.prototype?"symbol":s(j)})(b)}h("core-js/modules/es.symbol"),h("core-js/modules/es.symbol.description"),h("core-js/modules/es.symbol.iterator"),h("core-js/modules/es.array.includes"),h("core-js/modules/es.array.iterator"),h("core-js/modules/es.array.join"),h("core-js/modules/es.array.map"),h("core-js/modules/es.array.slice"),h("core-js/modules/es.object.get-own-property-descriptor"),h("core-js/modules/es.object.to-string"),h("core-js/modules/es.regexp.constructor"),h("core-js/modules/es.regexp.exec"),h("core-js/modules/es.regexp.to-string"),h("core-js/modules/es.string.includes"),h("core-js/modules/es.string.iterator"),h("core-js/modules/es.string.trim"),h("core-js/modules/es.weak-map"),h("core-js/modules/web.dom-collections.iterator"),h("core-js/modules/es.array.includes"),h("core-js/modules/es.array.join"),h("core-js/modules/es.array.map"),h("core-js/modules/es.array.slice"),h("core-js/modules/es.object.to-string"),h("core-js/modules/es.regexp.constructor"),h("core-js/modules/es.regexp.exec"),h("core-js/modules/es.regexp.to-string"),h("core-js/modules/es.string.includes"),h("core-js/modules/es.string.trim"),Object.defineProperty(v,"__esModule",{value:!0}),v.default=void 0;var o=n(h("../core/main")),c=function(b){if(b&&b.__esModule)return b;if(b===null||u(b)!=="object"&&typeof b!="function")return{default:b};var j=p();if(j&&j.has(b))return j.get(b);var k,E={},M=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(k in b){var P;Object.prototype.hasOwnProperty.call(b,k)&&((P=M?Object.getOwnPropertyDescriptor(b,k):null)&&(P.get||P.set)?Object.defineProperty(E,k,P):E[k]=b[k])}return E.default=b,j&&j.set(b,E),E}(h("../core/constants")),g=n(h("./color_conversion"));function p(){var b;return typeof WeakMap!="function"?null:(b=new WeakMap,p=function(){return b},b)}function n(b){return b&&b.__esModule?b:{default:b}}function i(b,j){for(var k=0;k>7,127&xe,ae>>7,127&ae);for(var Se=0;Se>7,127&Pe,0,0)}}return{cellImageInfo:re,dimOffset:Le,dimImageInfo:we}}}}]),m}();c.default.RendererGL.prototype._renderText=function(m,b,j,k,E){if(this._textFont&&typeof this._textFont!="string"){if(!(E<=k)&&this._doFill){if(this._isOpenType()){m.push();var E=this._doStroke,M=this.drawMode,P=(this._doStroke=!1,this.drawMode=g.TEXTURE,this._textFont.font),L=(L=this._textFont._fontInfo)||(this._textFont._fontInfo=new f(P)),j=this._textFont._handleAlignment(this,b,j,k),k=this._textSize/P.unitsPerEm,C=(this.translate(j.x,j.y,0),this.scale(k,k,1),this.GL),j=!this._defaultFontShader,I=this._getFontShader(),A=(I.init(),I.bindShader(),j&&(I.setUniform("uGridImageSize",[64,64]),I.setUniform("uCellsImageSize",[64,64]),I.setUniform("uStrokeImageSize",[64,64]),I.setUniform("uGridSize",[9,9])),this._applyColorBlend(this.curFillColor),this.retainedMode.geometry.glyph),N=(A||((k=this._textGeom=new c.default.Geometry(1,1,function(){for(var pe=0;pe<=1;pe++)for(var K=0;K<=1;K++)this.vertices.push(new c.default.Vector(K,pe,0)),this.uvs.push(K,pe)})).computeFaces().computeNormals(),A=this.createBuffers("glyph",k)),!0),j=!1,k=void 0;try{for(var F,B=this.retainedMode.buffers.text[Symbol.iterator]();!(N=(F=B.next()).done);N=!0)F.value._prepareBuffer(A,I)}catch(pe){j=!0,k=pe}finally{try{N||B.return==null||B.return()}finally{if(j)throw k}}this._bindBuffer(A.indexBuffer,C.ELEMENT_ARRAY_BUFFER),I.setUniform("uMaterialColor",this.curFillColor),C.pixelStorei(C.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1);try{var q=0,V=null,H=P.stringToGlyphs(b),Z=!0,ee=!1,ue=void 0;try{for(var T,D=H[Symbol.iterator]();!(Z=(T=D.next()).done);Z=!0){var G,W,$=T.value,J=(V&&(q+=P.getKerningValue(V,$)),L.getGlyphInfo($));J.uGlyphRect&&(G=J.rowInfo,W=J.colInfo,I.setUniform("uSamplerStrokes",J.strokeImageInfo.imageData),I.setUniform("uSamplerRowStrokes",G.cellImageInfo.imageData),I.setUniform("uSamplerRows",G.dimImageInfo.imageData),I.setUniform("uSamplerColStrokes",W.cellImageInfo.imageData),I.setUniform("uSamplerCols",W.dimImageInfo.imageData),I.setUniform("uGridOffset",J.uGridOffset),I.setUniform("uGlyphRect",J.uGlyphRect),I.setUniform("uGlyphOffset",q),I.bindTextures(),C.drawElements(C.TRIANGLES,6,this.GL.UNSIGNED_SHORT,0)),q+=$.advanceWidth,V=$}}catch(pe){ee=!0,ue=pe}finally{try{Z||D.return==null||D.return()}finally{if(ee)throw ue}}}finally{I.unbindShader(),this._doStroke=E,this.drawMode=M,C.pixelStorei(C.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),m.pop()}}else console.log("WEBGL: only Opentype (.otf) and Truetype (.ttf) fonts are supported");return m}}else console.log("WEBGL: you must load and set a font before drawing text. See `loadFont` and `textFont` for more details.")}},{"../core/constants":269,"../core/main":280,"./p5.RendererGL.Retained":336,"./p5.Shader":338,"core-js/modules/es.array.iterator":164,"core-js/modules/es.object.get-own-property-descriptor":183,"core-js/modules/es.object.to-string":187,"core-js/modules/es.regexp.exec":192,"core-js/modules/es.string.iterator":197,"core-js/modules/es.string.split":203,"core-js/modules/es.string.sub":205,"core-js/modules/es.symbol":209,"core-js/modules/es.symbol.description":207,"core-js/modules/es.symbol.iterator":208,"core-js/modules/es.weak-map":241,"core-js/modules/web.dom-collections.iterator":243}]},{},[264])(264)})})(Zf);var Nb=Zf.exports;const Cc=Fb(Nb),Ub=yn(()=>({provide:{p5:Cc,p5:Cc}})),Bb=[Pv,Rv,q0,Y0,$0,Rb,Lb,Db,Ub],Gb=hr({props:{vnode:{type:Object,required:!0},route:{type:Object,required:!0},vnodeRef:Object,renderKey:String,trackRootNodes:Boolean},setup(r){const d=r.renderKey,w=r.route,t={};for(const x in r.route)Object.defineProperty(t,x,{get:()=>d===r.renderKey?r.route[x]:w[x]});return zr(fs,ss(t)),()=>tr(r.vnode,{ref:r.vnodeRef})}}),Vb=hr({name:"NuxtPage",inheritAttrs:!1,props:{name:{type:String},transition:{type:[Boolean,Object],default:void 0},keepalive:{type:[Boolean,Object],default:void 0},route:{type:Object},pageKey:{type:[Function,String],default:null}},setup(r,{attrs:d,expose:w}){const t=It(),x=mt(),v=Ht(fs,null);let s;w({pageRef:x});const u=Ht(_f,null);let o;const c=t.deferHydration();if(t.isHydrating){const g=t.hooks.hookOnce("app:error",c);Wr().beforeEach(g)}return r.pageKey&&Ln(()=>r.pageKey,(g,p)=>{g!==p&&t.callHook("page:loading:start")}),()=>tr($f,{name:r.name,route:r.route,...d},{default:g=>{const p=zb(v,g.route,g.Component),n=v&&v.matched.length===g.route.matched.length;if(!g.Component){if(o&&!n)return o;c();return}if(o&&u&&!u.isCurrent(g.route))return o;if(p&&v&&(!u||u!=null&&u.isCurrent(v)))return n?o:null;const i=Ra(g,r.pageKey);!t.isHydrating&&!Wb(v,g.route,g.Component)&&s===i&&t.callHook("page:loading:end"),s=i;const a=!!(r.transition??g.route.meta.pageTransition??Ca),h=a&&Hb([r.transition,g.route.meta.pageTransition,Ca,{onAfterLeave:()=>{t.callHook("page:transition:finish",g.Component)}}].filter(Boolean)),y=r.keepalive??g.route.meta.keepalive??xv;return o=Kf(cs,a&&h,N0(y,tr(el,{suspensible:!0,onPending:()=>t.callHook("page:start",g.Component),onResolve:()=>{Dr(()=>t.callHook("page:finish",g.Component).then(()=>t.callHook("page:loading:end")).finally(c))}},{default:()=>{const l=tr(Gb,{key:i||void 0,vnode:g.Component,route:g.route,renderKey:i||void 0,trackRootNodes:a,vnodeRef:x});return y&&(l.type.name=g.Component.type.name||g.Component.type.__name||"RouteProvider"),l}}))).default(),o}})}});function Hb(r){const d=r.map(w=>({...w,onAfterLeave:w.onAfterLeave?yl(w.onAfterLeave):void 0}));return vf(...d)}function zb(r,d,w){if(!r)return!1;const t=d.matched.findIndex(x=>{var v;return((v=x.components)==null?void 0:v.default)===(w==null?void 0:w.type)});return!t||t===-1?!1:d.matched.slice(0,t).some((x,v)=>{var s,u,o;return((s=x.components)==null?void 0:s.default)!==((o=(u=r.matched[v])==null?void 0:u.components)==null?void 0:o.default)})||w&&Ra({route:d,Component:w})!==Ra({route:r,Component:w})}function Wb(r,d,w){return r?d.matched.findIndex(x=>{var v;return((v=x.components)==null?void 0:v.default)===(w==null?void 0:w.type)})t.default||t);return()=>tr(w,r.layoutProps,d.slots)}}),Xb=hr({name:"NuxtLayout",inheritAttrs:!1,props:{name:{type:[String,Boolean,Object],default:null},fallback:{type:[String,Object],default:null}},setup(r,d){const w=It(),t=Ht(fs),x=t===fi()?D0():t,v=jt(()=>{let o=Bt(r.name)??x.meta.layout??"default";return o&&!(o in On)&&r.fallback&&(o=Bt(r.fallback)),o}),s=mt();d.expose({layoutRef:s});const u=w.deferHydration();if(w.isHydrating){const o=w.hooks.hookOnce("app:error",u);Wr().beforeEach(o)}return()=>{const o=v.value&&v.value in On,c=x.meta.layoutTransition??wv;return Kf(cs,o&&c,{default:()=>tr(el,{suspensible:!0,onResolve:()=>{Dr(u)}},{default:()=>tr(Yb,{layoutProps:$d(d.attrs,{ref:s}),key:v.value||void 0,name:v.value,shouldProvide:!r.name,hasTransition:!!c},d.slots)})}).default()}}}),Yb=hr({name:"NuxtLayoutProvider",inheritAttrs:!1,props:{name:{type:[String,Boolean]},layoutProps:{type:Object},hasTransition:{type:Boolean},shouldProvide:{type:Boolean}},setup(r,d){const w=r.name;return r.shouldProvide&&zr(_f,{isCurrent:t=>w===(t.meta.layout??"default")}),()=>{var t,x;return!w||typeof w=="string"&&!(w in On)?(x=(t=d.slots).default)==null?void 0:x.call(t):tr(qb,{key:w,layoutProps:r.layoutProps,name:w},d.slots)}}}),$b={class:"bg-background"},Kb=hr({__name:"app",setup(r){return vv({title:"Colton Padden",ogTitle:"Colton Padden",description:"This is where you can find the blog, portfolio, and experiments of Colton Padden.",ogDescription:"This is where you can find the blog, portfolio, and experiments of Colton Padden."}),(d,w)=>{const t=Vb,x=Xb;return Br(),ai("body",$b,[pt(x,null,{default:Nr(()=>[pt(t)]),_:1})])}}});async function Qf(r,d=Wr()){const{path:w,matched:t}=d.resolve(r);if(!t.length||(d._routePreloaded||(d._routePreloaded=new Set),d._routePreloaded.has(w)))return;const x=d._preloadPromises=d._preloadPromises||[];if(x.length>4)return Promise.all(x).then(()=>Qf(r,d));d._routePreloaded.add(w);const v=t.map(s=>{var u;return(u=s.components)==null?void 0:u.default}).filter(s=>typeof s=="function");for(const s of v){const u=Promise.resolve(s()).catch(()=>{}).finally(()=>x.splice(x.indexOf(u)));x.push(u)}await Promise.all(x)}const Zb=(...r)=>r.find(d=>d!==void 0);function Qb(r){const d=r.componentName||"NuxtLink";function w(t,x){if(!t||r.trailingSlash!=="append"&&r.trailingSlash!=="remove")return t;if(typeof t=="string")return Oc(t,r.trailingSlash);const v="path"in t&&t.path!==void 0?t.path:x(t).path;return{...t,name:void 0,path:Oc(v,r.trailingSlash)}}return hr({name:d,props:{to:{type:[String,Object],default:void 0,required:!1},href:{type:[String,Object],default:void 0,required:!1},target:{type:String,default:void 0,required:!1},rel:{type:String,default:void 0,required:!1},noRel:{type:Boolean,default:void 0,required:!1},prefetch:{type:Boolean,default:void 0,required:!1},noPrefetch:{type:Boolean,default:void 0,required:!1},activeClass:{type:String,default:void 0,required:!1},exactActiveClass:{type:String,default:void 0,required:!1},prefetchedClass:{type:String,default:void 0,required:!1},replace:{type:Boolean,default:void 0,required:!1},ariaCurrentValue:{type:String,default:void 0,required:!1},external:{type:Boolean,default:void 0,required:!1},custom:{type:Boolean,default:void 0,required:!1}},setup(t,{slots:x}){const v=Wr(),s=di(),u=jt(()=>{const a=t.to||t.href||"";return w(a,v.resolve)}),o=jt(()=>typeof u.value=="string"&&mn(u.value,{acceptRelative:!0})),c=jt(()=>t.target&&t.target!=="_self"),g=jt(()=>t.external||c.value?!0:typeof u.value=="object"?!1:u.value===""||o.value),p=mt(!1),n=mt(null),i=a=>{var h;n.value=t.custom?(h=a==null?void 0:a.$el)==null?void 0:h.nextElementSibling:a==null?void 0:a.$el};if(t.prefetch!==!1&&t.noPrefetch!==!0&&t.target!=="_blank"&&!t1()){const h=It();let y,l=null;Zr(()=>{const f=e1();gl(()=>{y=La(()=>{var m;(m=n==null?void 0:n.value)!=null&&m.tagName&&(l=f.observe(n.value,async()=>{l==null||l(),l=null;const b=typeof u.value=="string"?u.value:v.resolve(u.value).fullPath;await Promise.all([h.hooks.callHook("link:prefetch",b).catch(()=>{}),!g.value&&Qf(u.value,v).catch(()=>{})]),p.value=!0}))})})}),as(()=>{y&&X0(y),l==null||l(),l=null})}return()=>{var l,f;if(!g.value){const m={ref:i,to:u.value,activeClass:t.activeClass||r.activeClass,exactActiveClass:t.exactActiveClass||r.exactActiveClass,replace:t.replace,ariaCurrentValue:t.ariaCurrentValue,custom:t.custom};return t.custom||(p.value&&(m.class=t.prefetchedClass||r.prefetchedClass),m.rel=t.rel||void 0),tr(Mp("RouterLink"),m,x.default)}const a=typeof u.value=="object"?((l=v.resolve(u.value))==null?void 0:l.href)??null:u.value&&!t.external&&!o.value?w(ci(s.app.baseURL,u.value),v.resolve):u.value||null,h=t.target||null,y=Zb(t.noRel?"":t.rel,r.externalRelAttribute,o.value||c.value?"noopener noreferrer":"")||null;if(t.custom){if(!x.default)return null;const m=()=>_g(a,{replace:t.replace,external:t.external});return x.default({href:a,navigate:m,get route(){if(!a)return;const b=ds(a);return{path:b.pathname,fullPath:b.pathname,get query(){return of(b.search)},hash:b.hash,params:{},name:void 0,matched:[],redirectedFrom:void 0,meta:{},href:a}},rel:y,target:h,isExternal:g.value,isActive:!1,isExactActive:!1})}return tr("a",{ref:n,href:a,rel:y,target:h},(f=x.default)==null?void 0:f.call(x))}}})}const Jb=Qb(jv);function Oc(r,d){const w=d==="append"?$s:ui;return mn(r)&&!r.startsWith("http")?r:w(r,!0)}function e1(){const r=It();if(r._observer)return r._observer;let d=null;const w=new Map,t=(v,s)=>(d||(d=new IntersectionObserver(u=>{for(const o of u){const c=w.get(o.target);(o.isIntersecting||o.intersectionRatio>0)&&c&&c()}})),w.set(v,s),d.observe(v),()=>{w.delete(v),d.unobserve(v),w.size===0&&(d.disconnect(),d=null)});return r._observer={observe:t}}function t1(){const r=navigator.connection;return!!(r&&(r.saveData||/2g/.test(r.effectiveType)))}let r1=Symbol("headlessui.useid"),n1=0;function gi(){return Ht(r1,()=>`${++n1}`)()}function Ft(r){var d;if(r==null||r.value==null)return null;let w=(d=r.value.$el)!=null?d:r.value;return w instanceof Node?w:null}function Qn(r,d,...w){if(r in d){let x=d[r];return typeof x=="function"?x(...w):x}let t=new Error(`Tried to handle "${r}" but there is no handler defined. Only defined handlers are: ${Object.keys(d).map(x=>`"${x}"`).join(", ")}.`);throw Error.captureStackTrace&&Error.captureStackTrace(t,Qn),t}var o1=Object.defineProperty,s1=(r,d,w)=>d in r?o1(r,d,{enumerable:!0,configurable:!0,writable:!0,value:w}):r[d]=w,Pc=(r,d,w)=>(s1(r,typeof d!="symbol"?d+"":d,w),w);let i1=class{constructor(){Pc(this,"current",this.detect()),Pc(this,"currentId",0)}set(d){this.current!==d&&(this.currentId=0,this.current=d)}reset(){this.set(this.detect())}nextId(){return++this.currentId}get isServer(){return this.current==="server"}get isClient(){return this.current==="client"}detect(){return typeof window>"u"||typeof document>"u"?"server":"client"}},vi=new i1;function vl(r){if(vi.isServer)return null;if(r instanceof Node)return r.ownerDocument;if(r!=null&&r.hasOwnProperty("value")){let d=Ft(r);if(d)return d.ownerDocument}return document}let Ia=["[contentEditable=true]","[tabindex]","a[href]","area[href]","button:not([disabled])","iframe","input:not([disabled])","select:not([disabled])","textarea:not([disabled])"].map(r=>`${r}:not([tabindex='-1'])`).join(",");var Da=(r=>(r[r.First=1]="First",r[r.Previous=2]="Previous",r[r.Next=4]="Next",r[r.Last=8]="Last",r[r.WrapAround=16]="WrapAround",r[r.NoScroll=32]="NoScroll",r))(Da||{}),a1=(r=>(r[r.Error=0]="Error",r[r.Overflow=1]="Overflow",r[r.Success=2]="Success",r[r.Underflow=3]="Underflow",r))(a1||{}),l1=(r=>(r[r.Previous=-1]="Previous",r[r.Next=1]="Next",r))(l1||{});function Jf(r=document.body){return r==null?[]:Array.from(r.querySelectorAll(Ia)).sort((d,w)=>Math.sign((d.tabIndex||Number.MAX_SAFE_INTEGER)-(w.tabIndex||Number.MAX_SAFE_INTEGER)))}var bl=(r=>(r[r.Strict=0]="Strict",r[r.Loose=1]="Loose",r))(bl||{});function _l(r,d=0){var w;return r===((w=vl(r))==null?void 0:w.body)?!1:Qn(d,{0(){return r.matches(Ia)},1(){let t=r;for(;t!==null;){if(t.matches(Ia))return!0;t=t.parentElement}return!1}})}function eh(r){let d=vl(r);Dr(()=>{d&&!_l(d.activeElement,0)&&c1(r)})}var u1=(r=>(r[r.Keyboard=0]="Keyboard",r[r.Mouse=1]="Mouse",r))(u1||{});typeof window<"u"&&typeof document<"u"&&(document.addEventListener("keydown",r=>{r.metaKey||r.altKey||r.ctrlKey||(document.documentElement.dataset.headlessuiFocusVisible="")},!0),document.addEventListener("click",r=>{r.detail===1?delete document.documentElement.dataset.headlessuiFocusVisible:r.detail===0&&(document.documentElement.dataset.headlessuiFocusVisible="")},!0));function c1(r){r==null||r.focus({preventScroll:!0})}let d1=["textarea","input"].join(",");function f1(r){var d,w;return(w=(d=r==null?void 0:r.matches)==null?void 0:d.call(r,d1))!=null?w:!1}function th(r,d=w=>w){return r.slice().sort((w,t)=>{let x=d(w),v=d(t);if(x===null||v===null)return 0;let s=x.compareDocumentPosition(v);return s&Node.DOCUMENT_POSITION_FOLLOWING?-1:s&Node.DOCUMENT_POSITION_PRECEDING?1:0})}function h1(r,d){return p1(Jf(),d,{relativeTo:r})}function p1(r,d,{sorted:w=!0,relativeTo:t=null,skipElements:x=[]}={}){var v;let s=(v=Array.isArray(r)?r.length>0?r[0].ownerDocument:document:r==null?void 0:r.ownerDocument)!=null?v:document,u=Array.isArray(r)?w?th(r):r:Jf(r);x.length>0&&u.length>1&&(u=u.filter(a=>!x.includes(a))),t=t??s.activeElement;let o=(()=>{if(d&5)return 1;if(d&10)return-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),c=(()=>{if(d&1)return 0;if(d&2)return Math.max(0,u.indexOf(t))-1;if(d&4)return Math.max(0,u.indexOf(t))+1;if(d&8)return u.length-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),g=d&32?{preventScroll:!0}:{},p=0,n=u.length,i;do{if(p>=n||p+n<=0)return 0;let a=c+p;if(d&16)a=(a+n)%n;else{if(a<0)return 3;if(a>=n)return 1}i=u[a],i==null||i.focus(g),p+=o}while(i!==s.activeElement);return d&6&&f1(i)&&i.select(),2}function m1(){return/iPhone/gi.test(window.navigator.platform)||/Mac/gi.test(window.navigator.platform)&&window.navigator.maxTouchPoints>0}function y1(){return/Android/gi.test(window.navigator.userAgent)}function g1(){return m1()||y1()}function As(r,d,w){vi.isServer||an(t=>{document.addEventListener(r,d,w),t(()=>document.removeEventListener(r,d,w))})}function v1(r,d,w){vi.isServer||an(t=>{window.addEventListener(r,d,w),t(()=>window.removeEventListener(r,d,w))})}function b1(r,d,w=jt(()=>!0)){function t(v,s){if(!w.value||v.defaultPrevented)return;let u=s(v);if(u===null||!u.getRootNode().contains(u))return;let o=function c(g){return typeof g=="function"?c(g()):Array.isArray(g)||g instanceof Set?g:[g]}(r);for(let c of o){if(c===null)continue;let g=c instanceof HTMLElement?c:Ft(c);if(g!=null&&g.contains(u)||v.composed&&v.composedPath().includes(g))return}return!_l(u,bl.Loose)&&u.tabIndex!==-1&&v.preventDefault(),d(v,u)}let x=mt(null);As("pointerdown",v=>{var s,u;w.value&&(x.value=((u=(s=v.composedPath)==null?void 0:s.call(v))==null?void 0:u[0])||v.target)},!0),As("mousedown",v=>{var s,u;w.value&&(x.value=((u=(s=v.composedPath)==null?void 0:s.call(v))==null?void 0:u[0])||v.target)},!0),As("click",v=>{g1()||x.value&&(t(v,()=>x.value),x.value=null)},!0),As("touchend",v=>t(v,()=>v.target instanceof HTMLElement?v.target:null),!0),v1("blur",v=>t(v,()=>window.document.activeElement instanceof HTMLIFrameElement?window.document.activeElement:null),!0)}function Ac(r,d){if(r)return r;let w=d??"button";if(typeof w=="string"&&w.toLowerCase()==="button")return"button"}function _1(r,d){let w=mt(Ac(r.value.type,r.value.as));return Zr(()=>{w.value=Ac(r.value.type,r.value.as)}),an(()=>{var t;w.value||Ft(d)&&Ft(d)instanceof HTMLButtonElement&&!((t=Ft(d))!=null&&t.hasAttribute("type"))&&(w.value="button")}),w}let Rc=/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g;function Lc(r){var d,w;let t=(d=r.innerText)!=null?d:"",x=r.cloneNode(!0);if(!(x instanceof HTMLElement))return t;let v=!1;for(let u of x.querySelectorAll('[hidden],[aria-hidden],[role="img"]'))u.remove(),v=!0;let s=v?(w=x.innerText)!=null?w:"":t;return Rc.test(s)&&(s=s.replace(Rc,"")),s}function w1(r){let d=r.getAttribute("aria-label");if(typeof d=="string")return d.trim();let w=r.getAttribute("aria-labelledby");if(w){let t=w.split(" ").map(x=>{let v=document.getElementById(x);if(v){let s=v.getAttribute("aria-label");return typeof s=="string"?s.trim():Lc(v).trim()}return null}).filter(Boolean);if(t.length>0)return t.join(", ")}return Lc(r).trim()}function x1(r){let d=mt(""),w=mt("");return()=>{let t=Ft(r);if(!t)return"";let x=t.innerText;if(d.value===x)return w.value;let v=w1(t).trim().toLowerCase();return d.value=x,w.value=v,v}}function Ic(r){return[r.screenX,r.screenY]}function j1(){let r=mt([-1,-1]);return{wasMoved(d){let w=Ic(d);return r.value[0]===w[0]&&r.value[1]===w[1]?!1:(r.value=w,!0)},update(d){r.value=Ic(d)}}}function S1({container:r,accept:d,walk:w,enabled:t}){an(()=>{let x=r.value;if(!x||t!==void 0&&!t.value)return;let v=vl(r);if(!v)return;let s=Object.assign(o=>d(o),{acceptNode:d}),u=v.createTreeWalker(x,NodeFilter.SHOW_ELEMENT,s,!1);for(;u.nextNode();)w(u.currentNode)})}let rh=Symbol("Context");var Lr=(r=>(r[r.Open=1]="Open",r[r.Closed=2]="Closed",r[r.Closing=4]="Closing",r[r.Opening=8]="Opening",r))(Lr||{});function E1(){return wl()!==null}function wl(){return Ht(rh,null)}function nh(r){zr(rh,r)}var ir=(r=>(r.Space=" ",r.Enter="Enter",r.Escape="Escape",r.Backspace="Backspace",r.Delete="Delete",r.ArrowLeft="ArrowLeft",r.ArrowUp="ArrowUp",r.ArrowRight="ArrowRight",r.ArrowDown="ArrowDown",r.Home="Home",r.End="End",r.PageUp="PageUp",r.PageDown="PageDown",r.Tab="Tab",r))(ir||{});function T1(r){throw new Error("Unexpected object: "+r)}var Ir=(r=>(r[r.First=0]="First",r[r.Previous=1]="Previous",r[r.Next=2]="Next",r[r.Last=3]="Last",r[r.Specific=4]="Specific",r[r.Nothing=5]="Nothing",r))(Ir||{});function k1(r,d){let w=d.resolveItems();if(w.length<=0)return null;let t=d.resolveActiveIndex(),x=t??-1;switch(r.focus){case 0:{for(let v=0;v=0;--v)if(!d.resolveDisabled(w[v],v,w))return v;return t}case 2:{for(let v=x+1;v=0;--v)if(!d.resolveDisabled(w[v],v,w))return v;return t}case 4:{for(let v=0;v(r[r.None=0]="None",r[r.RenderStrategy=1]="RenderStrategy",r[r.Static=2]="Static",r))(ei||{}),Pn=(r=>(r[r.Unmount=0]="Unmount",r[r.Hidden=1]="Hidden",r))(Pn||{});function Eo({visible:r=!0,features:d=0,ourProps:w,theirProps:t,...x}){var v;let s=sh(t,w),u=Object.assign(x,{props:s});if(r||d&2&&s.static)return ea(u);if(d&1){let o=(v=s.unmount)==null||v?0:1;return Qn(o,{0(){return null},1(){return ea({...x,props:{...s,hidden:!0,style:{display:"none"}}})}})}return ea(u)}function ea({props:r,attrs:d,slots:w,slot:t,name:x}){var v,s;let{as:u,...o}=ih(r,["unmount","static"]),c=(v=w.default)==null?void 0:v.call(w,t),g={};if(t){let p=!1,n=[];for(let[i,a]of Object.entries(t))typeof a=="boolean"&&(p=!0),a===!0&&n.push(i);p&&(g["data-headlessui-state"]=n.join(" "))}if(u==="template"){if(c=oh(c??[]),Object.keys(o).length>0||Object.keys(d).length>0){let[p,...n]=c??[];if(!M1(p)||n.length>0)throw new Error(['Passing props on "template"!',"",`The current component <${x} /> is rendering a "template".`,"However we need to passthrough the following props:",Object.keys(o).concat(Object.keys(d)).map(h=>h.trim()).filter((h,y,l)=>l.indexOf(h)===y).sort((h,y)=>h.localeCompare(y)).map(h=>` - ${h}`).join(` `),"","You can apply a few solutions:",['Add an `as="..."` prop, to ensure that we render an actual element instead of a "template".',"Render a single element as the child so that we can forward the props onto that element."].map(h=>` - ${h}`).join(` `)].join(` -`));let i=sh((s=p.props)!=null?s:{},o,g),a=ln(p,i,!0);for(let h in i)h.startsWith("on")&&(a.props||(a.props={}),a.props[h]=i[h]);return a}return Array.isArray(c)&&c.length===1?c[0]:c}return tr(u,Object.assign({},o,g),{default:()=>c})}function oh(r){return r.flatMap(d=>d.type===yr?oh(d.children):[d])}function sh(...r){if(r.length===0)return{};if(r.length===1)return r[0];let d={},w={};for(let t of r)for(let x in t)x.startsWith("on")&&typeof t[x]=="function"?(w[x]!=null||(w[x]=[]),w[x].push(t[x])):d[x]=t[x];if(d.disabled||d["aria-disabled"])return Object.assign(d,Object.fromEntries(Object.keys(w).map(t=>[t,void 0])));for(let t in w)Object.assign(d,{[t](x,...v){let s=w[t];for(let u of s){if(x instanceof Event&&x.defaultPrevented)return;u(x,...v)}}});return d}function ih(r,d=[]){let w=Object.assign({},r);for(let t of d)t in w&&delete w[t];return w}function M1(r){return r==null?!1:typeof r.type=="string"||typeof r.type=="object"||typeof r.type=="function"}var C1=(r=>(r[r.Open=0]="Open",r[r.Closed=1]="Closed",r))(C1||{}),O1=(r=>(r[r.Pointer=0]="Pointer",r[r.Other=1]="Other",r))(O1||{});function P1(r){requestAnimationFrame(()=>requestAnimationFrame(r))}let ah=Symbol("MenuContext");function bi(r){let d=Ht(ah,null);if(d===null){let w=new Error(`<${r} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(w,bi),w}return d}let A1=hr({name:"Menu",props:{as:{type:[Object,String],default:"template"}},setup(r,{slots:d,attrs:w}){let t=mt(1),x=mt(null),v=mt(null),s=mt([]),u=mt(""),o=mt(null),c=mt(1);function g(n=i=>i){let i=o.value!==null?s.value[o.value]:null,a=th(n(s.value.slice()),y=>Ft(y.dataRef.domRef)),h=i?a.indexOf(i):null;return h===-1&&(h=null),{items:a,activeItemIndex:h}}let p={menuState:t,buttonRef:x,itemsRef:v,items:s,searchQuery:u,activeItemIndex:o,activationTrigger:c,closeMenu:()=>{t.value=1,o.value=null},openMenu:()=>t.value=0,goToItem(n,i,a){let h=g(),y=k1(n===Ir.Specific?{focus:Ir.Specific,id:i}:{focus:n},{resolveItems:()=>h.items,resolveActiveIndex:()=>h.activeItemIndex,resolveId:l=>l.id,resolveDisabled:l=>l.dataRef.disabled});u.value="",o.value=y,c.value=a??1,s.value=h.items},search(n){let i=u.value!==""?0:1;u.value+=n.toLowerCase();let a=(o.value!==null?s.value.slice(o.value+i).concat(s.value.slice(0,o.value+i)):s.value).find(y=>y.dataRef.textValue.startsWith(u.value)&&!y.dataRef.disabled),h=a?s.value.indexOf(a):-1;h===-1||h===o.value||(o.value=h,c.value=1)},clearSearch(){u.value=""},registerItem(n,i){let a=g(h=>[...h,{id:n,dataRef:i}]);s.value=a.items,o.value=a.activeItemIndex,c.value=1},unregisterItem(n){let i=g(a=>{let h=a.findIndex(y=>y.id===n);return h!==-1&&a.splice(h,1),a});s.value=i.items,o.value=i.activeItemIndex,c.value=1}};return b1([x,v],(n,i)=>{var a;p.closeMenu(),_l(i,bl.Loose)||(n.preventDefault(),(a=Ft(x))==null||a.focus())},jt(()=>t.value===0)),zr(ah,p),nh(jt(()=>Qn(t.value,{0:Lr.Open,1:Lr.Closed}))),()=>{let n={open:t.value===0,close:p.closeMenu};return Eo({ourProps:{},theirProps:r,slot:n,slots:d,attrs:w,name:"Menu"})}}}),R1=hr({name:"MenuButton",props:{disabled:{type:Boolean,default:!1},as:{type:[Object,String],default:"button"},id:{type:String,default:null}},setup(r,{attrs:d,slots:w,expose:t}){var x;let v=(x=r.id)!=null?x:`headlessui-menu-button-${gi()}`,s=bi("MenuButton");t({el:s.buttonRef,$el:s.buttonRef});function u(p){switch(p.key){case ir.Space:case ir.Enter:case ir.ArrowDown:p.preventDefault(),p.stopPropagation(),s.openMenu(),Dr(()=>{var n;(n=Ft(s.itemsRef))==null||n.focus({preventScroll:!0}),s.goToItem(Ir.First)});break;case ir.ArrowUp:p.preventDefault(),p.stopPropagation(),s.openMenu(),Dr(()=>{var n;(n=Ft(s.itemsRef))==null||n.focus({preventScroll:!0}),s.goToItem(Ir.Last)});break}}function o(p){switch(p.key){case ir.Space:p.preventDefault();break}}function c(p){r.disabled||(s.menuState.value===0?(s.closeMenu(),Dr(()=>{var n;return(n=Ft(s.buttonRef))==null?void 0:n.focus({preventScroll:!0})})):(p.preventDefault(),s.openMenu(),P1(()=>{var n;return(n=Ft(s.itemsRef))==null?void 0:n.focus({preventScroll:!0})})))}let g=_1(jt(()=>({as:r.as,type:d.type})),s.buttonRef);return()=>{var p;let n={open:s.menuState.value===0},{...i}=r,a={ref:s.buttonRef,id:v,type:g.value,"aria-haspopup":"menu","aria-controls":(p=Ft(s.itemsRef))==null?void 0:p.id,"aria-expanded":s.menuState.value===0,onKeydown:u,onKeyup:o,onClick:c};return Eo({ourProps:a,theirProps:i,slot:n,attrs:d,slots:w,name:"MenuButton"})}}}),L1=hr({name:"MenuItems",props:{as:{type:[Object,String],default:"div"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},id:{type:String,default:null}},setup(r,{attrs:d,slots:w,expose:t}){var x;let v=(x=r.id)!=null?x:`headlessui-menu-items-${gi()}`,s=bi("MenuItems"),u=mt(null);t({el:s.itemsRef,$el:s.itemsRef}),S1({container:jt(()=>Ft(s.itemsRef)),enabled:jt(()=>s.menuState.value===0),accept(n){return n.getAttribute("role")==="menuitem"?NodeFilter.FILTER_REJECT:n.hasAttribute("role")?NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT},walk(n){n.setAttribute("role","none")}});function o(n){var i;switch(u.value&&clearTimeout(u.value),n.key){case ir.Space:if(s.searchQuery.value!=="")return n.preventDefault(),n.stopPropagation(),s.search(n.key);case ir.Enter:if(n.preventDefault(),n.stopPropagation(),s.activeItemIndex.value!==null){let a=s.items.value[s.activeItemIndex.value];(i=Ft(a.dataRef.domRef))==null||i.click()}s.closeMenu(),eh(Ft(s.buttonRef));break;case ir.ArrowDown:return n.preventDefault(),n.stopPropagation(),s.goToItem(Ir.Next);case ir.ArrowUp:return n.preventDefault(),n.stopPropagation(),s.goToItem(Ir.Previous);case ir.Home:case ir.PageUp:return n.preventDefault(),n.stopPropagation(),s.goToItem(Ir.First);case ir.End:case ir.PageDown:return n.preventDefault(),n.stopPropagation(),s.goToItem(Ir.Last);case ir.Escape:n.preventDefault(),n.stopPropagation(),s.closeMenu(),Dr(()=>{var a;return(a=Ft(s.buttonRef))==null?void 0:a.focus({preventScroll:!0})});break;case ir.Tab:n.preventDefault(),n.stopPropagation(),s.closeMenu(),Dr(()=>h1(Ft(s.buttonRef),n.shiftKey?Da.Previous:Da.Next));break;default:n.key.length===1&&(s.search(n.key),u.value=setTimeout(()=>s.clearSearch(),350));break}}function c(n){switch(n.key){case ir.Space:n.preventDefault();break}}let g=wl(),p=jt(()=>g!==null?(g.value&Lr.Open)===Lr.Open:s.menuState.value===0);return()=>{var n,i;let a={open:s.menuState.value===0},{...h}=r,y={"aria-activedescendant":s.activeItemIndex.value===null||(n=s.items.value[s.activeItemIndex.value])==null?void 0:n.id,"aria-labelledby":(i=Ft(s.buttonRef))==null?void 0:i.id,id:v,onKeydown:o,onKeyup:c,role:"menu",tabIndex:0,ref:s.itemsRef};return Eo({ourProps:y,theirProps:h,slot:a,attrs:d,slots:w,features:ei.RenderStrategy|ei.Static,visible:p.value,name:"MenuItems"})}}}),I1=hr({name:"MenuItem",inheritAttrs:!1,props:{as:{type:[Object,String],default:"template"},disabled:{type:Boolean,default:!1},id:{type:String,default:null}},setup(r,{slots:d,attrs:w,expose:t}){var x;let v=(x=r.id)!=null?x:`headlessui-menu-item-${gi()}`,s=bi("MenuItem"),u=mt(null);t({el:u,$el:u});let o=jt(()=>s.activeItemIndex.value!==null?s.items.value[s.activeItemIndex.value].id===v:!1),c=x1(u),g=jt(()=>({disabled:r.disabled,get textValue(){return c()},domRef:u}));Zr(()=>s.registerItem(v,g)),ls(()=>s.unregisterItem(v)),an(()=>{s.menuState.value===0&&o.value&&s.activationTrigger.value!==0&&Dr(()=>{var l,f;return(f=(l=Ft(u))==null?void 0:l.scrollIntoView)==null?void 0:f.call(l,{block:"nearest"})})});function p(l){if(r.disabled)return l.preventDefault();s.closeMenu(),eh(Ft(s.buttonRef))}function n(){if(r.disabled)return s.goToItem(Ir.Nothing);s.goToItem(Ir.Specific,v)}let i=j1();function a(l){i.update(l)}function h(l){i.wasMoved(l)&&(r.disabled||o.value||s.goToItem(Ir.Specific,v,0))}function y(l){i.wasMoved(l)&&(r.disabled||o.value&&s.goToItem(Ir.Nothing))}return()=>{let{disabled:l,...f}=r,m={active:o.value,disabled:l,close:s.closeMenu};return Eo({ourProps:{id:v,ref:u,role:"menuitem",tabIndex:l===!0?void 0:-1,"aria-disabled":l===!0?!0:void 0,onClick:p,onFocus:n,onPointerenter:a,onMouseenter:a,onPointermove:h,onMousemove:h,onPointerleave:y,onMouseleave:y},theirProps:{...w,...f},slot:m,attrs:w,slots:d,name:"MenuItem"})}}});function D1(r,d){return Br(),ai("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[Lt("path",{"fill-rule":"evenodd",d:"M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z","clip-rule":"evenodd"})])}const F1={class:"container mx-auto py-6"},N1={class:"flex items-end justify-between text-gray-200"},U1={class:"px-1 py-1"},B1={href:"/articles"},G1=Lt("svg",{class:"mr-2 inline h-5 w-5",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor"},[Lt("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10"})],-1),V1={href:"/playground"},H1=Lt("svg",{class:"mr-2 inline h-5 w-5",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor"},[Lt("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M9.75 3.104v5.714a2.25 2.25 0 01-.659 1.591L5 14.5M9.75 3.104c-.251.023-.501.05-.75.082m.75-.082a24.301 24.301 0 014.5 0m0 0v5.714c0 .597.237 1.17.659 1.591L19.8 15.3M14.25 3.104c.251.023.501.05.75.082M19.8 15.3l-1.57.393A9.065 9.065 0 0112 15a9.065 9.065 0 00-6.23-.693L5 14.5m14.8.8l1.402 1.402c1.232 1.232.65 3.318-1.067 3.611A48.309 48.309 0 0112 21c-2.773 0-5.491-.235-8.135-.687-1.718-.293-2.3-2.379-1.067-3.61L5 14.5"})],-1),z1={href:"https://github.com/cmpadden"},W1=Lt("svg",{class:"mr-2 inline h-5 w-5",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor"},[Lt("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M6.75 7.5l3 2.25-3 2.25m4.5 0h3m-9 8.25h13.5A2.25 2.25 0 0021 18V6a2.25 2.25 0 00-2.25-2.25H5.25A2.25 2.25 0 003 6v12a2.25 2.25 0 002.25 2.25z"})],-1),q1={__name:"Header",setup(r){return fi(),(d,w)=>{const t=Jb,x=R1,v=I1,s=L1,u=A1;return Br(),ai("nav",F1,[Lt("div",N1,[pt(t,{to:"/",class:"font-mono text-3xl font-semibold text-white underline decoration-orange-500 underline-offset-4 hover:text-orange-500",as:"div"},{default:Nr(()=>[io(" who·am·i ")]),_:1}),Lt("div",null,[pt(u,{as:"div",class:"relative z-50 inline-block text-left"},{default:Nr(()=>[Lt("div",null,[pt(x,{class:"inline-flex w-full justify-center rounded-md bg-black bg-opacity-30 p-2 text-sm font-medium text-white hover:bg-opacity-30 focus:outline-none focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-opacity-75"},{default:Nr(()=>[pt(Bt(D1),{class:"h-5 w-5 text-white hover:text-blue-400","aria-hidden":"true"})]),_:1})]),pt(cs,{"enter-active-class":"transition duration-100 ease-out","enter-from-class":"transform scale-95 opacity-0","enter-to-class":"transform scale-100 opacity-100","leave-active-class":"transition duration-75 ease-in","leave-from-class":"transform scale-100 opacity-100","leave-to-class":"transform scale-95 opacity-0"},{default:Nr(()=>[pt(s,{class:"absolute right-0 mt-2 w-56 origin-top-right divide-y divide-gray-100 rounded-md bg-black/80 text-white shadow-lg ring-1 ring-black ring-opacity-5 backdrop-blur-sm focus:outline-none"},{default:Nr(()=>[Lt("div",U1,[pt(v,null,{default:Nr(({active:o})=>[Lt("a",B1,[Lt("button",{class:Xn([o?"bg-slate-700 text-white":"text-white","group flex w-full items-center rounded-md px-2 py-2 text-sm"])},[G1,io(" Blog ")],2)])]),_:1}),pt(v,null,{default:Nr(({active:o})=>[Lt("a",V1,[Lt("button",{class:Xn([o?"bg-slate-700 text-white":"text-white","group flex w-full items-center rounded-md px-2 py-2 text-sm"])},[H1,io(" Experiments ")],2)])]),_:1}),pt(v,null,{default:Nr(({active:o})=>[Lt("a",z1,[Lt("button",{class:Xn([o?"bg-slate-700":"","group flex w-full items-center rounded-md px-2 py-2 text-sm"])},[W1,io(" GitHub ")],2)])]),_:1})])]),_:1})]),_:1})]),_:1})])])])}}};function X1(r){typeof queueMicrotask=="function"?queueMicrotask(r):Promise.resolve().then(r).catch(d=>setTimeout(()=>{throw d}))}function xl(){let r=[],d={addEventListener(w,t,x,v){return w.addEventListener(t,x,v),d.add(()=>w.removeEventListener(t,x,v))},requestAnimationFrame(...w){let t=requestAnimationFrame(...w);d.add(()=>cancelAnimationFrame(t))},nextFrame(...w){d.requestAnimationFrame(()=>{d.requestAnimationFrame(...w)})},setTimeout(...w){let t=setTimeout(...w);d.add(()=>clearTimeout(t))},microTask(...w){let t={current:!0};return X1(()=>{t.current&&w[0]()}),d.add(()=>{t.current=!1})},style(w,t,x){let v=w.style.getPropertyValue(t);return Object.assign(w.style,{[t]:x}),this.add(()=>{Object.assign(w.style,{[t]:v})})},group(w){let t=xl();return w(t),this.add(()=>t.dispose())},add(w){return r.push(w),()=>{let t=r.indexOf(w);if(t>=0)for(let x of r.splice(t,1))x()}},dispose(){for(let w of r.splice(0))w()}};return d}function Y1(r){let d={called:!1};return(...w)=>{if(!d.called)return d.called=!0,r(...w)}}function ta(r,...d){r&&d.length>0&&r.classList.add(...d)}function Rs(r,...d){r&&d.length>0&&r.classList.remove(...d)}var Fa=(r=>(r.Finished="finished",r.Cancelled="cancelled",r))(Fa||{});function $1(r,d){let w=xl();if(!r)return w.dispose;let{transitionDuration:t,transitionDelay:x}=getComputedStyle(r),[v,s]=[t,x].map(u=>{let[o=0]=u.split(",").filter(Boolean).map(c=>c.includes("ms")?parseFloat(c):parseFloat(c)*1e3).sort((c,g)=>g-c);return o});return v!==0?w.setTimeout(()=>d("finished"),v+s):d("finished"),w.add(()=>d("cancelled")),w.dispose}function Dc(r,d,w,t,x,v){let s=xl(),u=v!==void 0?Y1(v):()=>{};return Rs(r,...x),ta(r,...d,...w),s.nextFrame(()=>{Rs(r,...w),ta(r,...t),s.add($1(r,o=>(Rs(r,...t,...d),ta(r,...x),u(o))))}),s.add(()=>Rs(r,...d,...w,...t,...x)),s.add(()=>u("cancelled")),s.dispose}function Vn(r=""){return r.split(/\s+/).filter(d=>d.length>1)}let jl=Symbol("TransitionContext");var K1=(r=>(r.Visible="visible",r.Hidden="hidden",r))(K1||{});function Z1(){return Ht(jl,null)!==null}function Q1(){let r=Ht(jl,null);if(r===null)throw new Error("A is used but it is missing a parent .");return r}function J1(){let r=Ht(Sl,null);if(r===null)throw new Error("A is used but it is missing a parent .");return r}let Sl=Symbol("NestingContext");function _i(r){return"children"in r?_i(r.children):r.value.filter(({state:d})=>d==="visible").length>0}function lh(r){let d=mt([]),w=mt(!1);Zr(()=>w.value=!0),ls(()=>w.value=!1);function t(v,s=Pn.Hidden){let u=d.value.findIndex(({id:o})=>o===v);u!==-1&&(Qn(s,{[Pn.Unmount](){d.value.splice(u,1)},[Pn.Hidden](){d.value[u].state="hidden"}}),!_i(d)&&w.value&&(r==null||r()))}function x(v){let s=d.value.find(({id:u})=>u===v);return s?s.state!=="visible"&&(s.state="visible"):d.value.push({id:v,state:"visible"}),()=>t(v,Pn.Unmount)}return{children:d,register:x,unregister:t}}let uh=ei.RenderStrategy,e_=hr({props:{as:{type:[Object,String],default:"div"},show:{type:[Boolean],default:null},unmount:{type:[Boolean],default:!0},appear:{type:[Boolean],default:!1},enter:{type:[String],default:""},enterFrom:{type:[String],default:""},enterTo:{type:[String],default:""},entered:{type:[String],default:""},leave:{type:[String],default:""},leaveFrom:{type:[String],default:""},leaveTo:{type:[String],default:""}},emits:{beforeEnter:()=>!0,afterEnter:()=>!0,beforeLeave:()=>!0,afterLeave:()=>!0},setup(r,{emit:d,attrs:w,slots:t,expose:x}){let v=mt(0);function s(){v.value|=Lr.Opening,d("beforeEnter")}function u(){v.value&=~Lr.Opening,d("afterEnter")}function o(){v.value|=Lr.Closing,d("beforeLeave")}function c(){v.value&=~Lr.Closing,d("afterLeave")}if(!Z1()&&E1())return()=>tr(ch,{...r,onBeforeEnter:s,onAfterEnter:u,onBeforeLeave:o,onAfterLeave:c},t);let g=mt(null),p=jt(()=>r.unmount?Pn.Unmount:Pn.Hidden);x({el:g,$el:g});let{show:n,appear:i}=Q1(),{register:a,unregister:h}=J1(),y=mt(n.value?"visible":"hidden"),l={value:!0},f=gi(),m={value:!1},b=lh(()=>{!m.value&&y.value!=="hidden"&&(y.value="hidden",h(f),c())});Zr(()=>{let A=a(f);ls(A)}),an(()=>{if(p.value===Pn.Hidden&&f){if(n.value&&y.value!=="visible"){y.value="visible";return}Qn(y.value,{hidden:()=>h(f),visible:()=>a(f)})}});let j=Vn(r.enter),k=Vn(r.enterFrom),E=Vn(r.enterTo),M=Vn(r.entered),P=Vn(r.leave),L=Vn(r.leaveFrom),C=Vn(r.leaveTo);Zr(()=>{an(()=>{if(y.value==="visible"){let A=Ft(g);if(A instanceof Comment&&A.data==="")throw new Error("Did you forget to passthrough the `ref` to the actual DOM node?")}})});function I(A){let N=l.value&&!i.value,F=Ft(g);!F||!(F instanceof HTMLElement)||N||(m.value=!0,n.value&&s(),n.value||o(),A(n.value?Dc(F,j,k,E,M,B=>{m.value=!1,B===Fa.Finished&&u()}):Dc(F,P,L,C,M,B=>{m.value=!1,B===Fa.Finished&&(_i(b)||(y.value="hidden",h(f),c()))})))}return Zr(()=>{Ln([n],(A,N,F)=>{I(F),l.value=!1},{immediate:!0})}),zr(Sl,b),nh(jt(()=>Qn(y.value,{visible:Lr.Open,hidden:Lr.Closed})|v.value)),()=>{let{appear:A,show:N,enter:F,enterFrom:B,enterTo:q,entered:V,leave:H,leaveFrom:Z,leaveTo:ee,...ue}=r,T={ref:g},D={...ue,...i.value&&n.value&&vi.isServer?{class:Xn([w.class,ue.class,...j,...k])}:{}};return Eo({theirProps:D,ourProps:T,slot:{},slots:t,attrs:w,features:uh,visible:y.value==="visible",name:"TransitionChild"})}}}),t_=e_,ch=hr({inheritAttrs:!1,props:{as:{type:[Object,String],default:"div"},show:{type:[Boolean],default:null},unmount:{type:[Boolean],default:!0},appear:{type:[Boolean],default:!1},enter:{type:[String],default:""},enterFrom:{type:[String],default:""},enterTo:{type:[String],default:""},entered:{type:[String],default:""},leave:{type:[String],default:""},leaveFrom:{type:[String],default:""},leaveTo:{type:[String],default:""}},emits:{beforeEnter:()=>!0,afterEnter:()=>!0,beforeLeave:()=>!0,afterLeave:()=>!0},setup(r,{emit:d,attrs:w,slots:t}){let x=wl(),v=jt(()=>r.show===null&&x!==null?(x.value&Lr.Open)===Lr.Open:r.show);an(()=>{if(![!0,!1].includes(v.value))throw new Error('A is used but it is missing a `:show="true | false"` prop.')});let s=mt(v.value?"visible":"hidden"),u=lh(()=>{s.value="hidden"}),o=mt(!0),c={show:v,appear:jt(()=>r.appear||!o.value)};return Zr(()=>{an(()=>{o.value=!1,v.value?s.value="visible":_i(u)||(s.value="hidden")})}),zr(Sl,u),zr(jl,c),()=>{let g=ih(r,["show","appear","unmount","onBeforeEnter","onBeforeLeave","onAfterEnter","onAfterLeave"]),p={unmount:r.unmount};return Eo({ourProps:{...p,as:"template"},theirProps:{},slot:{},slots:{...t,default:()=>[tr(t_,{onBeforeEnter:()=>d("beforeEnter"),onAfterEnter:()=>d("afterEnter"),onBeforeLeave:()=>d("beforeLeave"),onAfterLeave:()=>d("afterLeave"),...w,...p,...g},t.default)]},attrs:{},features:uh,visible:s.value==="visible",name:"Transition"})}}});const r_=(r,d)=>{const w=r.__vccOpts||r;for(const[t,x]of d)w[t]=x;return w},n_={},o_={class:"flex min-h-screen flex-col bg-background font-display"},s_={class:"mt-4 flex-1"},i_={class:"flex justify-center"},a_=Lt("div",{class:"rounded-xl bg-black/50 p-6 text-center shadow-lg"},[Lt("div",{class:"text-6xl font-extrabold tracking-widest text-white"}," Yikes! "),Lt("div",{class:"text-base text-gray-200"}," Either the page you're looking for doesn't exist, or something has gone terribly wrong. ")],-1);function l_(r,d){const w=q1,t=ch;return Br(),ai("body",o_,[pt(w),Lt("main",s_,[Lt("div",i_,[pt(t,{show:"",appear:"",as:"template",enter:"transition transform duration-300 ease-out","enter-from":"translate-x-8 opacity-0","enter-to":"translate-x-0 opacity-100",leave:"transition transform duration-300 ease-in","leave-from":"opacity-100","leave-to":"-translate-x-8 opacity-0"},{default:Nr(()=>[a_]),_:1})])])])}const u_=r_(n_,[["render",l_]]),Fc={__name:"nuxt-root",setup(r){const d=()=>null,w=It(),t=w.deferHydration();if(w.isHydrating){const u=w.hooks.hookOnce("app:error",t);Wr().beforeEach(u)}const x=!1;zr(fs,fi()),w.hooks.callHookWith(u=>u.map(o=>o()),"vue:setup");const v=hi();Cd((u,o,c)=>{if(w.hooks.callHook("vue:error",u,o,c).catch(g=>console.error("[nuxt] Error in `vue:error` hook",g)),xg(u)&&(u.fatal||u.unhandled))return w.runWithContext(()=>ao(u)),!1});const s=!1;return(u,o)=>(Br(),Wn(el,{onResolve:Bt(t)},{default:Nr(()=>[Bt(v)?(Br(),Wn(Bt(u_),{key:0,error:Bt(v)},null,8,["error"])):Bt(s)?(Br(),Wn(Bt(d),{key:1,context:Bt(s)},null,8,["context"])):Bt(x)?(Br(),Wn(Cp(Bt(x)),{key:2})):(Br(),Wn(Bt(Kb),{key:3}))]),_:1},8,["onResolve"]))}};let Nc;{let r;Nc=async function(){var s,u;if(r)return r;const t=!!((s=window.__NUXT__)!=null&&s.serverRendered||((u=document.getElementById("__NUXT_DATA__"))==null?void 0:u.dataset.ssr)==="true")?ty(Fc):ey(Fc),x=ig({vueApp:t});async function v(o){await x.callHook("app:error",o),x.payload.error=x.payload.error||pi(o)}t.config.errorHandler=v;try{await lg(x,Bb)}catch(o){v(o)}try{await x.hooks.callHook("app:created",t),await x.hooks.callHook("app:beforeMount",t),t.mount(Sv),await x.hooks.callHook("app:mounted",t),await Dr()}catch(o){v(o)}return t.config.errorHandler===v&&(t.config.errorHandler=void 0),t},r=Nc().catch(d=>{throw console.error("Error while mounting app:",d),d})}export{So as $,m_ as A,x_ as B,fr as C,Wn as D,Dr as E,yr as F,yv as G,di as H,v_ as I,$s as J,tr as K,rt as L,vp as M,It as N,p_ as O,My as P,Xu as Q,ci as R,ch as S,cs as T,ui as U,j_ as V,$o as W,Wp as X,d_ as Y,pi as Z,r_ as _,Bt as a,zh as a0,bt as a1,Mp as a2,go as a3,gr as a4,Xs as a5,h_ as a6,g_ as a7,Ha as a8,q1 as a9,Os as aa,Lt as b,ai as c,hr as d,w_ as e,pt as f,Nr as g,io as h,Jb as i,__ as j,mt as k,Zr as l,e_ as m,Xn as n,Br as o,jt as p,Ln as q,y_ as r,as as s,c_ as t,fi as u,ls as v,b_ as w,Nn as x,S_ as y,f_ as z}; +`));let i=sh((s=p.props)!=null?s:{},o,g),a=ln(p,i,!0);for(let h in i)h.startsWith("on")&&(a.props||(a.props={}),a.props[h]=i[h]);return a}return Array.isArray(c)&&c.length===1?c[0]:c}return tr(u,Object.assign({},o,g),{default:()=>c})}function oh(r){return r.flatMap(d=>d.type===yr?oh(d.children):[d])}function sh(...r){if(r.length===0)return{};if(r.length===1)return r[0];let d={},w={};for(let t of r)for(let x in t)x.startsWith("on")&&typeof t[x]=="function"?(w[x]!=null||(w[x]=[]),w[x].push(t[x])):d[x]=t[x];if(d.disabled||d["aria-disabled"])return Object.assign(d,Object.fromEntries(Object.keys(w).map(t=>[t,void 0])));for(let t in w)Object.assign(d,{[t](x,...v){let s=w[t];for(let u of s){if(x instanceof Event&&x.defaultPrevented)return;u(x,...v)}}});return d}function ih(r,d=[]){let w=Object.assign({},r);for(let t of d)t in w&&delete w[t];return w}function M1(r){return r==null?!1:typeof r.type=="string"||typeof r.type=="object"||typeof r.type=="function"}var C1=(r=>(r[r.Open=0]="Open",r[r.Closed=1]="Closed",r))(C1||{}),O1=(r=>(r[r.Pointer=0]="Pointer",r[r.Other=1]="Other",r))(O1||{});function P1(r){requestAnimationFrame(()=>requestAnimationFrame(r))}let ah=Symbol("MenuContext");function bi(r){let d=Ht(ah,null);if(d===null){let w=new Error(`<${r} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(w,bi),w}return d}let A1=hr({name:"Menu",props:{as:{type:[Object,String],default:"template"}},setup(r,{slots:d,attrs:w}){let t=mt(1),x=mt(null),v=mt(null),s=mt([]),u=mt(""),o=mt(null),c=mt(1);function g(n=i=>i){let i=o.value!==null?s.value[o.value]:null,a=th(n(s.value.slice()),y=>Ft(y.dataRef.domRef)),h=i?a.indexOf(i):null;return h===-1&&(h=null),{items:a,activeItemIndex:h}}let p={menuState:t,buttonRef:x,itemsRef:v,items:s,searchQuery:u,activeItemIndex:o,activationTrigger:c,closeMenu:()=>{t.value=1,o.value=null},openMenu:()=>t.value=0,goToItem(n,i,a){let h=g(),y=k1(n===Ir.Specific?{focus:Ir.Specific,id:i}:{focus:n},{resolveItems:()=>h.items,resolveActiveIndex:()=>h.activeItemIndex,resolveId:l=>l.id,resolveDisabled:l=>l.dataRef.disabled});u.value="",o.value=y,c.value=a??1,s.value=h.items},search(n){let i=u.value!==""?0:1;u.value+=n.toLowerCase();let a=(o.value!==null?s.value.slice(o.value+i).concat(s.value.slice(0,o.value+i)):s.value).find(y=>y.dataRef.textValue.startsWith(u.value)&&!y.dataRef.disabled),h=a?s.value.indexOf(a):-1;h===-1||h===o.value||(o.value=h,c.value=1)},clearSearch(){u.value=""},registerItem(n,i){let a=g(h=>[...h,{id:n,dataRef:i}]);s.value=a.items,o.value=a.activeItemIndex,c.value=1},unregisterItem(n){let i=g(a=>{let h=a.findIndex(y=>y.id===n);return h!==-1&&a.splice(h,1),a});s.value=i.items,o.value=i.activeItemIndex,c.value=1}};return b1([x,v],(n,i)=>{var a;p.closeMenu(),_l(i,bl.Loose)||(n.preventDefault(),(a=Ft(x))==null||a.focus())},jt(()=>t.value===0)),zr(ah,p),nh(jt(()=>Qn(t.value,{0:Lr.Open,1:Lr.Closed}))),()=>{let n={open:t.value===0,close:p.closeMenu};return Eo({ourProps:{},theirProps:r,slot:n,slots:d,attrs:w,name:"Menu"})}}}),R1=hr({name:"MenuButton",props:{disabled:{type:Boolean,default:!1},as:{type:[Object,String],default:"button"},id:{type:String,default:null}},setup(r,{attrs:d,slots:w,expose:t}){var x;let v=(x=r.id)!=null?x:`headlessui-menu-button-${gi()}`,s=bi("MenuButton");t({el:s.buttonRef,$el:s.buttonRef});function u(p){switch(p.key){case ir.Space:case ir.Enter:case ir.ArrowDown:p.preventDefault(),p.stopPropagation(),s.openMenu(),Dr(()=>{var n;(n=Ft(s.itemsRef))==null||n.focus({preventScroll:!0}),s.goToItem(Ir.First)});break;case ir.ArrowUp:p.preventDefault(),p.stopPropagation(),s.openMenu(),Dr(()=>{var n;(n=Ft(s.itemsRef))==null||n.focus({preventScroll:!0}),s.goToItem(Ir.Last)});break}}function o(p){switch(p.key){case ir.Space:p.preventDefault();break}}function c(p){r.disabled||(s.menuState.value===0?(s.closeMenu(),Dr(()=>{var n;return(n=Ft(s.buttonRef))==null?void 0:n.focus({preventScroll:!0})})):(p.preventDefault(),s.openMenu(),P1(()=>{var n;return(n=Ft(s.itemsRef))==null?void 0:n.focus({preventScroll:!0})})))}let g=_1(jt(()=>({as:r.as,type:d.type})),s.buttonRef);return()=>{var p;let n={open:s.menuState.value===0},{...i}=r,a={ref:s.buttonRef,id:v,type:g.value,"aria-haspopup":"menu","aria-controls":(p=Ft(s.itemsRef))==null?void 0:p.id,"aria-expanded":s.menuState.value===0,onKeydown:u,onKeyup:o,onClick:c};return Eo({ourProps:a,theirProps:i,slot:n,attrs:d,slots:w,name:"MenuButton"})}}}),L1=hr({name:"MenuItems",props:{as:{type:[Object,String],default:"div"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},id:{type:String,default:null}},setup(r,{attrs:d,slots:w,expose:t}){var x;let v=(x=r.id)!=null?x:`headlessui-menu-items-${gi()}`,s=bi("MenuItems"),u=mt(null);t({el:s.itemsRef,$el:s.itemsRef}),S1({container:jt(()=>Ft(s.itemsRef)),enabled:jt(()=>s.menuState.value===0),accept(n){return n.getAttribute("role")==="menuitem"?NodeFilter.FILTER_REJECT:n.hasAttribute("role")?NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT},walk(n){n.setAttribute("role","none")}});function o(n){var i;switch(u.value&&clearTimeout(u.value),n.key){case ir.Space:if(s.searchQuery.value!=="")return n.preventDefault(),n.stopPropagation(),s.search(n.key);case ir.Enter:if(n.preventDefault(),n.stopPropagation(),s.activeItemIndex.value!==null){let a=s.items.value[s.activeItemIndex.value];(i=Ft(a.dataRef.domRef))==null||i.click()}s.closeMenu(),eh(Ft(s.buttonRef));break;case ir.ArrowDown:return n.preventDefault(),n.stopPropagation(),s.goToItem(Ir.Next);case ir.ArrowUp:return n.preventDefault(),n.stopPropagation(),s.goToItem(Ir.Previous);case ir.Home:case ir.PageUp:return n.preventDefault(),n.stopPropagation(),s.goToItem(Ir.First);case ir.End:case ir.PageDown:return n.preventDefault(),n.stopPropagation(),s.goToItem(Ir.Last);case ir.Escape:n.preventDefault(),n.stopPropagation(),s.closeMenu(),Dr(()=>{var a;return(a=Ft(s.buttonRef))==null?void 0:a.focus({preventScroll:!0})});break;case ir.Tab:n.preventDefault(),n.stopPropagation(),s.closeMenu(),Dr(()=>h1(Ft(s.buttonRef),n.shiftKey?Da.Previous:Da.Next));break;default:n.key.length===1&&(s.search(n.key),u.value=setTimeout(()=>s.clearSearch(),350));break}}function c(n){switch(n.key){case ir.Space:n.preventDefault();break}}let g=wl(),p=jt(()=>g!==null?(g.value&Lr.Open)===Lr.Open:s.menuState.value===0);return()=>{var n,i;let a={open:s.menuState.value===0},{...h}=r,y={"aria-activedescendant":s.activeItemIndex.value===null||(n=s.items.value[s.activeItemIndex.value])==null?void 0:n.id,"aria-labelledby":(i=Ft(s.buttonRef))==null?void 0:i.id,id:v,onKeydown:o,onKeyup:c,role:"menu",tabIndex:0,ref:s.itemsRef};return Eo({ourProps:y,theirProps:h,slot:a,attrs:d,slots:w,features:ei.RenderStrategy|ei.Static,visible:p.value,name:"MenuItems"})}}}),I1=hr({name:"MenuItem",inheritAttrs:!1,props:{as:{type:[Object,String],default:"template"},disabled:{type:Boolean,default:!1},id:{type:String,default:null}},setup(r,{slots:d,attrs:w,expose:t}){var x;let v=(x=r.id)!=null?x:`headlessui-menu-item-${gi()}`,s=bi("MenuItem"),u=mt(null);t({el:u,$el:u});let o=jt(()=>s.activeItemIndex.value!==null?s.items.value[s.activeItemIndex.value].id===v:!1),c=x1(u),g=jt(()=>({disabled:r.disabled,get textValue(){return c()},domRef:u}));Zr(()=>s.registerItem(v,g)),ls(()=>s.unregisterItem(v)),an(()=>{s.menuState.value===0&&o.value&&s.activationTrigger.value!==0&&Dr(()=>{var l,f;return(f=(l=Ft(u))==null?void 0:l.scrollIntoView)==null?void 0:f.call(l,{block:"nearest"})})});function p(l){if(r.disabled)return l.preventDefault();s.closeMenu(),eh(Ft(s.buttonRef))}function n(){if(r.disabled)return s.goToItem(Ir.Nothing);s.goToItem(Ir.Specific,v)}let i=j1();function a(l){i.update(l)}function h(l){i.wasMoved(l)&&(r.disabled||o.value||s.goToItem(Ir.Specific,v,0))}function y(l){i.wasMoved(l)&&(r.disabled||o.value&&s.goToItem(Ir.Nothing))}return()=>{let{disabled:l,...f}=r,m={active:o.value,disabled:l,close:s.closeMenu};return Eo({ourProps:{id:v,ref:u,role:"menuitem",tabIndex:l===!0?void 0:-1,"aria-disabled":l===!0?!0:void 0,onClick:p,onFocus:n,onPointerenter:a,onMouseenter:a,onPointermove:h,onMousemove:h,onPointerleave:y,onMouseleave:y},theirProps:{...w,...f},slot:m,attrs:w,slots:d,name:"MenuItem"})}}});function D1(r,d){return Br(),ai("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true","data-slot":"icon"},[Lt("path",{"fill-rule":"evenodd",d:"M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z","clip-rule":"evenodd"})])}const F1={class:"container mx-auto py-6"},N1={class:"flex items-end justify-between text-gray-200"},U1={class:"px-1 py-1"},B1={href:"/articles"},G1=Lt("svg",{class:"mr-2 inline h-5 w-5",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor"},[Lt("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10"})],-1),V1={href:"/playground"},H1=Lt("svg",{class:"mr-2 inline h-5 w-5",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor"},[Lt("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M9.75 3.104v5.714a2.25 2.25 0 01-.659 1.591L5 14.5M9.75 3.104c-.251.023-.501.05-.75.082m.75-.082a24.301 24.301 0 014.5 0m0 0v5.714c0 .597.237 1.17.659 1.591L19.8 15.3M14.25 3.104c.251.023.501.05.75.082M19.8 15.3l-1.57.393A9.065 9.065 0 0112 15a9.065 9.065 0 00-6.23-.693L5 14.5m14.8.8l1.402 1.402c1.232 1.232.65 3.318-1.067 3.611A48.309 48.309 0 0112 21c-2.773 0-5.491-.235-8.135-.687-1.718-.293-2.3-2.379-1.067-3.61L5 14.5"})],-1),z1={href:"https://github.com/cmpadden"},W1=Lt("svg",{class:"mr-2 inline h-5 w-5",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor"},[Lt("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M6.75 7.5l3 2.25-3 2.25m4.5 0h3m-9 8.25h13.5A2.25 2.25 0 0021 18V6a2.25 2.25 0 00-2.25-2.25H5.25A2.25 2.25 0 003 6v12a2.25 2.25 0 002.25 2.25z"})],-1),q1={__name:"Header",setup(r){return fi(),(d,w)=>{const t=Jb,x=R1,v=I1,s=L1,u=A1;return Br(),ai("nav",F1,[Lt("div",N1,[pt(t,{to:"/",class:"font-mono text-3xl font-semibold text-white underline decoration-orange-500 underline-offset-4 hover:text-orange-500",as:"div"},{default:Nr(()=>[io(" who·am·i ")]),_:1}),Lt("div",null,[pt(u,{as:"div",class:"relative z-50 inline-block text-left"},{default:Nr(()=>[Lt("div",null,[pt(x,{class:"inline-flex w-full justify-center rounded-md bg-black bg-opacity-30 p-2 text-sm font-medium text-white hover:bg-opacity-30 focus:outline-none focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-opacity-75"},{default:Nr(()=>[pt(Bt(D1),{class:"h-5 w-5 text-white hover:text-blue-400","aria-hidden":"true"})]),_:1})]),pt(cs,{"enter-active-class":"transition duration-100 ease-out","enter-from-class":"transform scale-95 opacity-0","enter-to-class":"transform scale-100 opacity-100","leave-active-class":"transition duration-75 ease-in","leave-from-class":"transform scale-100 opacity-100","leave-to-class":"transform scale-95 opacity-0"},{default:Nr(()=>[pt(s,{class:"absolute right-0 mt-2 w-56 origin-top-right divide-y divide-gray-100 rounded-md bg-black/80 text-white shadow-lg ring-1 ring-black ring-opacity-5 backdrop-blur-sm focus:outline-none"},{default:Nr(()=>[Lt("div",U1,[pt(v,null,{default:Nr(({active:o})=>[Lt("a",B1,[Lt("button",{class:Xn([o?"bg-slate-700 text-white":"text-white","group flex w-full items-center rounded-md px-2 py-2 text-sm"])},[G1,io(" Blog ")],2)])]),_:1}),pt(v,null,{default:Nr(({active:o})=>[Lt("a",V1,[Lt("button",{class:Xn([o?"bg-slate-700 text-white":"text-white","group flex w-full items-center rounded-md px-2 py-2 text-sm"])},[H1,io(" Experiments ")],2)])]),_:1}),pt(v,null,{default:Nr(({active:o})=>[Lt("a",z1,[Lt("button",{class:Xn([o?"bg-slate-700":"","group flex w-full items-center rounded-md px-2 py-2 text-sm"])},[W1,io(" GitHub ")],2)])]),_:1})])]),_:1})]),_:1})]),_:1})])])])}}};function X1(r){typeof queueMicrotask=="function"?queueMicrotask(r):Promise.resolve().then(r).catch(d=>setTimeout(()=>{throw d}))}function xl(){let r=[],d={addEventListener(w,t,x,v){return w.addEventListener(t,x,v),d.add(()=>w.removeEventListener(t,x,v))},requestAnimationFrame(...w){let t=requestAnimationFrame(...w);d.add(()=>cancelAnimationFrame(t))},nextFrame(...w){d.requestAnimationFrame(()=>{d.requestAnimationFrame(...w)})},setTimeout(...w){let t=setTimeout(...w);d.add(()=>clearTimeout(t))},microTask(...w){let t={current:!0};return X1(()=>{t.current&&w[0]()}),d.add(()=>{t.current=!1})},style(w,t,x){let v=w.style.getPropertyValue(t);return Object.assign(w.style,{[t]:x}),this.add(()=>{Object.assign(w.style,{[t]:v})})},group(w){let t=xl();return w(t),this.add(()=>t.dispose())},add(w){return r.push(w),()=>{let t=r.indexOf(w);if(t>=0)for(let x of r.splice(t,1))x()}},dispose(){for(let w of r.splice(0))w()}};return d}function Y1(r){let d={called:!1};return(...w)=>{if(!d.called)return d.called=!0,r(...w)}}function ta(r,...d){r&&d.length>0&&r.classList.add(...d)}function Rs(r,...d){r&&d.length>0&&r.classList.remove(...d)}var Fa=(r=>(r.Finished="finished",r.Cancelled="cancelled",r))(Fa||{});function $1(r,d){let w=xl();if(!r)return w.dispose;let{transitionDuration:t,transitionDelay:x}=getComputedStyle(r),[v,s]=[t,x].map(u=>{let[o=0]=u.split(",").filter(Boolean).map(c=>c.includes("ms")?parseFloat(c):parseFloat(c)*1e3).sort((c,g)=>g-c);return o});return v!==0?w.setTimeout(()=>d("finished"),v+s):d("finished"),w.add(()=>d("cancelled")),w.dispose}function Dc(r,d,w,t,x,v){let s=xl(),u=v!==void 0?Y1(v):()=>{};return Rs(r,...x),ta(r,...d,...w),s.nextFrame(()=>{Rs(r,...w),ta(r,...t),s.add($1(r,o=>(Rs(r,...t,...d),ta(r,...x),u(o))))}),s.add(()=>Rs(r,...d,...w,...t,...x)),s.add(()=>u("cancelled")),s.dispose}function Vn(r=""){return r.split(/\s+/).filter(d=>d.length>1)}let jl=Symbol("TransitionContext");var K1=(r=>(r.Visible="visible",r.Hidden="hidden",r))(K1||{});function Z1(){return Ht(jl,null)!==null}function Q1(){let r=Ht(jl,null);if(r===null)throw new Error("A is used but it is missing a parent .");return r}function J1(){let r=Ht(Sl,null);if(r===null)throw new Error("A is used but it is missing a parent .");return r}let Sl=Symbol("NestingContext");function _i(r){return"children"in r?_i(r.children):r.value.filter(({state:d})=>d==="visible").length>0}function lh(r){let d=mt([]),w=mt(!1);Zr(()=>w.value=!0),ls(()=>w.value=!1);function t(v,s=Pn.Hidden){let u=d.value.findIndex(({id:o})=>o===v);u!==-1&&(Qn(s,{[Pn.Unmount](){d.value.splice(u,1)},[Pn.Hidden](){d.value[u].state="hidden"}}),!_i(d)&&w.value&&(r==null||r()))}function x(v){let s=d.value.find(({id:u})=>u===v);return s?s.state!=="visible"&&(s.state="visible"):d.value.push({id:v,state:"visible"}),()=>t(v,Pn.Unmount)}return{children:d,register:x,unregister:t}}let uh=ei.RenderStrategy,e_=hr({props:{as:{type:[Object,String],default:"div"},show:{type:[Boolean],default:null},unmount:{type:[Boolean],default:!0},appear:{type:[Boolean],default:!1},enter:{type:[String],default:""},enterFrom:{type:[String],default:""},enterTo:{type:[String],default:""},entered:{type:[String],default:""},leave:{type:[String],default:""},leaveFrom:{type:[String],default:""},leaveTo:{type:[String],default:""}},emits:{beforeEnter:()=>!0,afterEnter:()=>!0,beforeLeave:()=>!0,afterLeave:()=>!0},setup(r,{emit:d,attrs:w,slots:t,expose:x}){let v=mt(0);function s(){v.value|=Lr.Opening,d("beforeEnter")}function u(){v.value&=~Lr.Opening,d("afterEnter")}function o(){v.value|=Lr.Closing,d("beforeLeave")}function c(){v.value&=~Lr.Closing,d("afterLeave")}if(!Z1()&&E1())return()=>tr(ch,{...r,onBeforeEnter:s,onAfterEnter:u,onBeforeLeave:o,onAfterLeave:c},t);let g=mt(null),p=jt(()=>r.unmount?Pn.Unmount:Pn.Hidden);x({el:g,$el:g});let{show:n,appear:i}=Q1(),{register:a,unregister:h}=J1(),y=mt(n.value?"visible":"hidden"),l={value:!0},f=gi(),m={value:!1},b=lh(()=>{!m.value&&y.value!=="hidden"&&(y.value="hidden",h(f),c())});Zr(()=>{let A=a(f);ls(A)}),an(()=>{if(p.value===Pn.Hidden&&f){if(n.value&&y.value!=="visible"){y.value="visible";return}Qn(y.value,{hidden:()=>h(f),visible:()=>a(f)})}});let j=Vn(r.enter),k=Vn(r.enterFrom),E=Vn(r.enterTo),M=Vn(r.entered),P=Vn(r.leave),L=Vn(r.leaveFrom),C=Vn(r.leaveTo);Zr(()=>{an(()=>{if(y.value==="visible"){let A=Ft(g);if(A instanceof Comment&&A.data==="")throw new Error("Did you forget to passthrough the `ref` to the actual DOM node?")}})});function I(A){let N=l.value&&!i.value,F=Ft(g);!F||!(F instanceof HTMLElement)||N||(m.value=!0,n.value&&s(),n.value||o(),A(n.value?Dc(F,j,k,E,M,B=>{m.value=!1,B===Fa.Finished&&u()}):Dc(F,P,L,C,M,B=>{m.value=!1,B===Fa.Finished&&(_i(b)||(y.value="hidden",h(f),c()))})))}return Zr(()=>{Ln([n],(A,N,F)=>{I(F),l.value=!1},{immediate:!0})}),zr(Sl,b),nh(jt(()=>Qn(y.value,{visible:Lr.Open,hidden:Lr.Closed})|v.value)),()=>{let{appear:A,show:N,enter:F,enterFrom:B,enterTo:q,entered:V,leave:H,leaveFrom:Z,leaveTo:ee,...ue}=r,T={ref:g},D={...ue,...i.value&&n.value&&vi.isServer?{class:Xn([w.class,ue.class,...j,...k])}:{}};return Eo({theirProps:D,ourProps:T,slot:{},slots:t,attrs:w,features:uh,visible:y.value==="visible",name:"TransitionChild"})}}}),t_=e_,ch=hr({inheritAttrs:!1,props:{as:{type:[Object,String],default:"div"},show:{type:[Boolean],default:null},unmount:{type:[Boolean],default:!0},appear:{type:[Boolean],default:!1},enter:{type:[String],default:""},enterFrom:{type:[String],default:""},enterTo:{type:[String],default:""},entered:{type:[String],default:""},leave:{type:[String],default:""},leaveFrom:{type:[String],default:""},leaveTo:{type:[String],default:""}},emits:{beforeEnter:()=>!0,afterEnter:()=>!0,beforeLeave:()=>!0,afterLeave:()=>!0},setup(r,{emit:d,attrs:w,slots:t}){let x=wl(),v=jt(()=>r.show===null&&x!==null?(x.value&Lr.Open)===Lr.Open:r.show);an(()=>{if(![!0,!1].includes(v.value))throw new Error('A is used but it is missing a `:show="true | false"` prop.')});let s=mt(v.value?"visible":"hidden"),u=lh(()=>{s.value="hidden"}),o=mt(!0),c={show:v,appear:jt(()=>r.appear||!o.value)};return Zr(()=>{an(()=>{o.value=!1,v.value?s.value="visible":_i(u)||(s.value="hidden")})}),zr(Sl,u),zr(jl,c),()=>{let g=ih(r,["show","appear","unmount","onBeforeEnter","onBeforeLeave","onAfterEnter","onAfterLeave"]),p={unmount:r.unmount};return Eo({ourProps:{...p,as:"template"},theirProps:{},slot:{},slots:{...t,default:()=>[tr(t_,{onBeforeEnter:()=>d("beforeEnter"),onAfterEnter:()=>d("afterEnter"),onBeforeLeave:()=>d("beforeLeave"),onAfterLeave:()=>d("afterLeave"),...w,...p,...g},t.default)]},attrs:{},features:uh,visible:s.value==="visible",name:"Transition"})}}});const r_=(r,d)=>{const w=r.__vccOpts||r;for(const[t,x]of d)w[t]=x;return w},n_={},o_={class:"flex min-h-screen flex-col bg-background font-display"},s_={class:"mt-4 flex-1"},i_={class:"flex justify-center"},a_=Lt("div",{class:"rounded-xl bg-black/50 p-6 text-center shadow-lg"},[Lt("div",{class:"text-6xl font-extrabold tracking-widest text-white"}," Yikes! "),Lt("div",{class:"text-base text-gray-200"}," Either the page you're looking for doesn't exist, or something has gone terribly wrong. ")],-1);function l_(r,d){const w=q1,t=ch;return Br(),ai("body",o_,[pt(w),Lt("main",s_,[Lt("div",i_,[pt(t,{show:"",appear:"",as:"template",enter:"transition transform duration-300 ease-out","enter-from":"translate-x-8 opacity-0","enter-to":"translate-x-0 opacity-100",leave:"transition transform duration-300 ease-in","leave-from":"opacity-100","leave-to":"-translate-x-8 opacity-0"},{default:Nr(()=>[a_]),_:1})])])])}const u_=r_(n_,[["render",l_]]),Fc={__name:"nuxt-root",setup(r){const d=()=>null,w=It(),t=w.deferHydration();if(w.isHydrating){const u=w.hooks.hookOnce("app:error",t);Wr().beforeEach(u)}const x=!1;zr(fs,fi()),w.hooks.callHookWith(u=>u.map(o=>o()),"vue:setup");const v=hi();Cd((u,o,c)=>{if(w.hooks.callHook("vue:error",u,o,c).catch(g=>console.error("[nuxt] Error in `vue:error` hook",g)),xg(u)&&(u.fatal||u.unhandled))return w.runWithContext(()=>ao(u)),!1});const s=!1;return(u,o)=>(Br(),Wn(el,{onResolve:Bt(t)},{default:Nr(()=>[Bt(v)?(Br(),Wn(Bt(u_),{key:0,error:Bt(v)},null,8,["error"])):Bt(s)?(Br(),Wn(Bt(d),{key:1,context:Bt(s)},null,8,["context"])):Bt(x)?(Br(),Wn(Cp(Bt(x)),{key:2})):(Br(),Wn(Bt(Kb),{key:3}))]),_:1},8,["onResolve"]))}};let Nc;{let r;Nc=async function(){var s,u;if(r)return r;const t=!!((s=window.__NUXT__)!=null&&s.serverRendered||((u=document.getElementById("__NUXT_DATA__"))==null?void 0:u.dataset.ssr)==="true")?ty(Fc):ey(Fc),x=ig({vueApp:t});async function v(o){await x.callHook("app:error",o),x.payload.error=x.payload.error||pi(o)}t.config.errorHandler=v;try{await lg(x,Bb)}catch(o){v(o)}try{await x.hooks.callHook("app:created",t),await x.hooks.callHook("app:beforeMount",t),t.mount(Sv),await x.hooks.callHook("app:mounted",t),await Dr()}catch(o){v(o)}return t.config.errorHandler===v&&(t.config.errorHandler=void 0),t},r=Nc().catch(d=>{throw console.error("Error while mounting app:",d),d})}export{So as $,m_ as A,x_ as B,fr as C,Wn as D,Dr as E,yr as F,yv as G,di as H,v_ as I,$s as J,tr as K,rt as L,vp as M,It as N,p_ as O,My as P,Xu as Q,ci as R,ch as S,cs as T,ui as U,j_ as V,$o as W,Wp as X,d_ as Y,pi as Z,r_ as _,Bt as a,zh as a0,bt as a1,Mp as a2,go as a3,gr as a4,Xs as a5,h_ as a6,g_ as a7,Ha as a8,q1 as a9,Os as aa,Lt as b,ai as c,hr as d,w_ as e,pt as f,Nr as g,io as h,Jb as i,__ as j,mt as k,Zr as l,e_ as m,Xn as n,Br as o,Ln as p,as as q,y_ as r,ls as s,c_ as t,fi as u,jt as v,b_ as w,Nn as x,S_ as y,f_ as z}; diff --git a/_nuxt/D_k-9tiD.js b/_nuxt/gtS2INEI.js similarity index 89% rename from _nuxt/D_k-9tiD.js rename to _nuxt/gtS2INEI.js index 5a4e5aaa..8bf634f5 100644 --- a/_nuxt/D_k-9tiD.js +++ b/_nuxt/gtS2INEI.js @@ -1 +1 @@ -import{_ as f}from"./DnPT5WRD.js";import{d as l,q as s,I as d,K as c}from"./DXsCzSxj.js";import"./C-v3KzvZ.js";import"./BDqtaPAc.js";import"./DvDH6DOc.js";const _=l({name:"ContentRenderer",props:{value:{type:Object,required:!1,default:()=>({})},excerpt:{type:Boolean,default:!1},tag:{type:String,default:"div"}},setup(t){s(()=>t.excerpt,n=>{var e,a,i;n&&!((e=t.value)!=null&&e.excerpt)&&(console.warn(`No excerpt found for document content/${(a=t==null?void 0:t.value)==null?void 0:a._path}.${(i=t==null?void 0:t.value)==null?void 0:i._extension}!`),console.warn("Make sure to use in your content if you want to use excerpt feature."))},{immediate:!0})},render(t){var u,o;const n=d(),{value:e,excerpt:a,tag:i}=t,r=a?e==null?void 0:e.excerpt:e==null?void 0:e.body;return!((u=r==null?void 0:r.children)!=null&&u.length)&&(n!=null&&n.empty)?n.empty({value:e,excerpt:a,tag:i,...this.$attrs}):n!=null&&n.default?n.default({value:e,excerpt:a,tag:i,...this.$attrs}):(r==null?void 0:r.type)==="root"&&((o=r==null?void 0:r.children)!=null&&o.length)?c(f,{value:e,excerpt:a,tag:i,...this.$attrs}):c("pre",null,JSON.stringify({message:"You should use slots with ",value:e,excerpt:a,tag:i},null,2))}});export{_ as default}; +import{_ as f}from"./B519It_T.js";import{d as l,p as s,I as d,K as c}from"./gOhWOHN0.js";import"./C-v3KzvZ.js";import"./CRsxnQ9b.js";import"./DvDH6DOc.js";const _=l({name:"ContentRenderer",props:{value:{type:Object,required:!1,default:()=>({})},excerpt:{type:Boolean,default:!1},tag:{type:String,default:"div"}},setup(t){s(()=>t.excerpt,n=>{var e,a,i;n&&!((e=t.value)!=null&&e.excerpt)&&(console.warn(`No excerpt found for document content/${(a=t==null?void 0:t.value)==null?void 0:a._path}.${(i=t==null?void 0:t.value)==null?void 0:i._extension}!`),console.warn("Make sure to use in your content if you want to use excerpt feature."))},{immediate:!0})},render(t){var u,o;const n=d(),{value:e,excerpt:a,tag:i}=t,r=a?e==null?void 0:e.excerpt:e==null?void 0:e.body;return!((u=r==null?void 0:r.children)!=null&&u.length)&&(n!=null&&n.empty)?n.empty({value:e,excerpt:a,tag:i,...this.$attrs}):n!=null&&n.default?n.default({value:e,excerpt:a,tag:i,...this.$attrs}):(r==null?void 0:r.type)==="root"&&((o=r==null?void 0:r.children)!=null&&o.length)?c(f,{value:e,excerpt:a,tag:i,...this.$attrs}):c("pre",null,JSON.stringify({message:"You should use slots with ",value:e,excerpt:a,tag:i},null,2))}});export{_ as default}; diff --git a/_nuxt/jWTPnbSg.js b/_nuxt/jWTPnbSg.js new file mode 100644 index 00000000..12f60eee --- /dev/null +++ b/_nuxt/jWTPnbSg.js @@ -0,0 +1 @@ +import{d as c,H as i,v as p,o as s,c as t,a as u,a7 as n}from"./gOhWOHN0.js";const f=["id"],l=["href"],_=c({__name:"ProseH1",props:{id:{}},setup(a){const r=a,{headings:o}=i().public.mdc,d=p(()=>{var e;return r.id&&((e=o==null?void 0:o.anchorLinks)==null?void 0:e.h1)});return(e,m)=>(s(),t("h1",{id:e.id},[u(d)?(s(),t("a",{key:0,href:`#${e.id}`},[n(e.$slots,"default")],8,l)):n(e.$slots,"default",{key:1})],8,f))}});export{_ as default}; diff --git a/_nuxt/CgyoODLv.js b/_nuxt/nX1iBwjm.js similarity index 82% rename from _nuxt/CgyoODLv.js rename to _nuxt/nX1iBwjm.js index e48b09bd..f92aa931 100644 --- a/_nuxt/CgyoODLv.js +++ b/_nuxt/nX1iBwjm.js @@ -1 +1 @@ -import{_ as l}from"./DcN9AMIU.js";import{d as n,o as s,D as i,g as o,b as r,n as g,a8 as u,a7 as d}from"./DXsCzSxj.js";const h=n({__name:"ProsePre",props:{code:{type:String,default:""},language:{type:String,default:null},filename:{type:String,default:null},highlights:{type:Array,default:()=>[]},meta:{type:String,default:null},class:{type:String,default:null},style:{type:[String,Object],default:null}},setup(e){return(a,f)=>{const t=l;return s(),i(t,{code:e.code,language:e.language,filename:e.filename,highlights:e.highlights,meta:e.meta},{default:o(()=>[r("pre",{class:g(a.$props.class),style:u(e.style)},[d(a.$slots,"default")],6)]),_:3},8,["code","language","filename","highlights","meta"])}}});export{h as default}; +import{_ as l}from"./Baum9BnE.js";import{d as n,o as s,D as i,g as o,b as r,n as g,a8 as u,a7 as d}from"./gOhWOHN0.js";const h=n({__name:"ProsePre",props:{code:{type:String,default:""},language:{type:String,default:null},filename:{type:String,default:null},highlights:{type:Array,default:()=>[]},meta:{type:String,default:null},class:{type:String,default:null},style:{type:[String,Object],default:null}},setup(e){return(a,f)=>{const t=l;return s(),i(t,{code:e.code,language:e.language,filename:e.filename,highlights:e.highlights,meta:e.meta},{default:o(()=>[r("pre",{class:g(a.$props.class),style:u(e.style)},[d(a.$slots,"default")],6)]),_:3},8,["code","language","filename","highlights","meta"])}}});export{h as default}; diff --git a/_nuxt/qyNTjY-r.js b/_nuxt/qyNTjY-r.js deleted file mode 100644 index 2a5a2395..00000000 --- a/_nuxt/qyNTjY-r.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as o}from"./DnPT5WRD.js";import"./DXsCzSxj.js";import"./C-v3KzvZ.js";import"./BDqtaPAc.js";import"./DvDH6DOc.js";export{o as default}; diff --git a/_nuxt/CKgGom8U.js b/_nuxt/tFc0TBNA.js similarity index 93% rename from _nuxt/CKgGom8U.js rename to _nuxt/tFc0TBNA.js index 258950b0..c7b86025 100644 --- a/_nuxt/CKgGom8U.js +++ b/_nuxt/tFc0TBNA.js @@ -1 +1 @@ -import{_ as s,c as n,b as t,a7 as a,f as l,g as c,i as r,o as i}from"./DXsCzSxj.js";const d={},_={class:"container mx-auto my-12 h-screen bg-background font-display lg:my-16"},h={class:"flex flex-col border-2 bg-white"},u={class:"absolute left-2 top-2"},f=t("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor",class:"mr-2 h-6 w-6"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15M12 9l-3 3m0 0l3 3m-3-3h12.75"})],-1),m=t("span",null,"Back",-1);function p(e,x){const o=r;return i(),n("main",null,[t("div",_,[t("div",h,[a(e.$slots,"default")])]),t("div",u,[l(o,{as:"button",to:"/playground",class:"inline-flex items-center rounded px-4 py-2 font-bold text-white hover:text-cyan"},{default:c(()=>[f,m]),_:1})])])}const w=s(d,[["render",p]]);export{w as default}; +import{_ as s,c as n,b as t,a7 as a,f as l,g as c,i as r,o as i}from"./gOhWOHN0.js";const d={},_={class:"container mx-auto my-12 h-screen bg-background font-display lg:my-16"},h={class:"flex flex-col border-2 bg-white"},u={class:"absolute left-2 top-2"},f=t("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor",class:"mr-2 h-6 w-6"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15M12 9l-3 3m0 0l3 3m-3-3h12.75"})],-1),m=t("span",null,"Back",-1);function p(e,x){const o=r;return i(),n("main",null,[t("div",_,[t("div",h,[a(e.$slots,"default")])]),t("div",u,[l(o,{as:"button",to:"/playground",class:"inline-flex items-center rounded px-4 py-2 font-bold text-white hover:text-cyan"},{default:c(()=>[f,m]),_:1})])])}const w=s(d,[["render",p]]);export{w as default}; diff --git a/_nuxt/uM6gdZzG.js b/_nuxt/uM6gdZzG.js new file mode 100644 index 00000000..cfe45eb5 --- /dev/null +++ b/_nuxt/uM6gdZzG.js @@ -0,0 +1 @@ +import{d as f,o,c as s,b as e,e as g,h as n,f as a,g as u,F as b,r as x,t as _,i as v,w,a as y}from"./gOhWOHN0.js";import{_ as k,a as $}from"./CnVOBpLY.js";import{q as C}from"./Bs6eKMw6.js";import"./DvDH6DOc.js";import"./CRsxnQ9b.js";const D={class:"container mx-auto pb-8"},S={class:"flex flex-wrap"},A={class:"w-full"},B={class:"lg:text-normal space-y-4 font-medium tracking-wide text-white sm:text-base"},I=e("div",null,[n(" Currently, I am helping educate engineers and building the future of data orchestration at "),e("a",{class:"border-b-2 border-orange-500",target:"_blank",rel:"noopener noreferrer",href:"https://dagster.io/"},"Dagster"),n(". ")],-1),N=e("div",null,[n(" Previously, I worked at "),e("a",{class:"border-b-2 border-orange-500",target:"_blank",rel:"noopener noreferrer",href:"https://www.gemini.com/"},"Gemini"),n(" building the data platform that provided company-wide insights into the exchange and business. At Georgetown University's "),e("a",{class:"border-b-2 border-orange-500",target:"_blank",rel:"noopener noreferrer",href:"https://mccourt.georgetown.edu/research/the-massive-data-institute/"},"Massive Data Institute"),n(" building data warehousing, processing solutions, and portals to aid social scientists and researchers to leverage large-scale organic data. And previously I provided consulting for financial institutions and government agencies in the D.C. area around data practices, and identity and access management. ")],-1),P=f({__name:"AboutMe",setup(i){return(t,c)=>(o(),s("section",D,[e("div",S,[e("div",A,[e("div",B,[g("",!0),I,N])])])]))}}),L={class:"bg-gradient-to-b from-background to-transparent"},M={class:"container mx-auto space-y-4"},V={class:"mb-4 grid grid-cols-1 gap-4 md:grid-cols-2"},q={class:"space-y-4 rounded-xl bg-black bg-opacity-70 p-4 text-white drop-shadow-lg hover:ring-1 hover:ring-white"},F={class:""},G={class:"flex-1 text-lg font-bold md:text-xl"},T={key:0,class:"text-sm font-light text-gray-400"},U={class:"line-clamp-3 text-sm"},E={__name:"BlogPosts",props:{articles:[],show_dates:!1},setup(i){return(t,c)=>{const d=v,m=k;return o(),s("section",L,[e("div",M,[a(d,{to:"/articles",class:"font-mono text-3xl font-semibold text-white underline decoration-orange-500 underline-offset-4 hover:text-orange-500"},{default:u(()=>[n(" blog posts ")]),_:1}),e("div",V,[(o(!0),s(b,null,x(i.articles,(r,l)=>(o(),s("div",{key:l},[a(d,{to:r._path,external:""},{default:u(()=>[e("div",q,[e("div",F,[e("div",G,_(r.title),1),i.show_dates?(o(),s("div",T,_(new Date(r.date).toLocaleDateString("en-US",{month:"long",day:"numeric",year:"numeric"})),1)):g("",!0)]),e("div",U,_(r.description),1)])]),_:2},1032,["to"])]))),128))]),e("div",null,[a(m,{to:"/articles"})])])])}}},j={class:"bg-emerald-950 bg-[url('/images/noise.svg')]"},Q={__name:"index",async setup(i){let t,c;const d=([t,c]=w(()=>C().only(["_id","_path","title","description","date","img","author","tags"]).sort({date:-1}).limit(4).find()),t=await t,c(),t);return(m,r)=>{const l=P,h=E,p=$;return o(),s("div",null,[a(l),e("div",j,[g("",!0),a(h,{articles:y(d),show_dates:!0},null,8,["articles"]),a(p,{limit:8,showImages:"",linkToPlayground:""})])])}}};export{Q as default}; diff --git a/_payload.json b/_payload.json index 40baef75..967c5f9e 100644 --- a/_payload.json +++ b/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718428847846] \ No newline at end of file +[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718681823579] \ No newline at end of file diff --git a/api/_content/cache.1718428834464.json b/api/_content/cache.1718681810623.json similarity index 99% rename from api/_content/cache.1718428834464.json rename to api/_content/cache.1718681810623.json index f32736e8..c848359c 100644 --- a/api/_content/cache.1718428834464.json +++ b/api/_content/cache.1718681810623.json @@ -1 +1 @@ -{"generatedAt":1718428848327,"generateTime":516,"contents":[{"_path":"/articles/apu2-firmware-upgrade","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Upgrading the Firmware on the PCEngines APU2","description":"I've had a PCEngines APU2 gathering dust for a\nfew years, and have recently decided to dust it off.","date":"2019-12-21","draft":false,"tags":["pcengine","apu"],"categories":["linux"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I've had a "},{"type":"element","tag":"a","props":{"href":"https://pcengines.ch/apu2.htm","rel":["nofollow"]},"children":[{"type":"text","value":"PCEngines APU2"}]},{"type":"text","value":" gathering dust for a\nfew years, and have recently decided to dust it off."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Since the last time the device has been powered on, there have been many great\nimprovements to the firmware, and it was very-much due for an upgrade. The\nfollowing steps outline how the firmware was upgraded on the APU from the\nalready-installed operating system -- CentOS."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I've had a "},{"type":"element","tag":"a","props":{"href":"https://pcengines.ch/apu2.htm","rel":["nofollow"]},"children":[{"type":"text","value":"PCEngines APU2"}]},{"type":"text","value":" gathering dust for a\nfew years, and have recently decided to dust it off."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Since the last time the device has been powered on, there have been many great\nimprovements to the firmware, and it was very-much due for an upgrade. The\nfollowing steps outline how the firmware was upgraded on the APU from the\nalready-installed operating system -- CentOS."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"First, we will connect to the device over the serial port"}]},{"type":"element","tag":"pre","props":{"code":"screen /dev/tty.usbserial 115200\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"screen /dev/tty.usbserial 115200\n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Then, we will install the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"flashrom"}]},{"type":"text","value":" utility that is needed to update the\nfirmware. Because it is not available in the default "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"yum"}]},{"type":"text","value":" repositories, we\nwill enable the "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"Extra Packages for Enterprise Linux"}]},{"type":"text","value":" (EPEL) repository before\ninstallation."}]},{"type":"element","tag":"pre","props":{"code":"sudo yum install epel-release\nsudo yum install flashrom\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"sudo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" yum"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" install"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" epel-release\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"sudo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" yum"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" install"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" flashrom\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Next, we will download the latest version of the firmware that is compatible\nwith the APU2 device from the PC Engines release website:\n"},{"type":"element","tag":"a","props":{"href":"https://pcengines.github.io/","rel":["nofollow"]},"children":[{"type":"text","value":"https://pcengines.github.io/"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"code":"curl -O https://3mdeb.com/open-source-firmware/pcengines/apu2/apu2_v4.11.0.1.rom\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"curl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -O"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" https://3mdeb.com/open-source-firmware/pcengines/apu2/apu2_v4.11.0.1.rom\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And finally, we will flash the firmware..."}]},{"type":"element","tag":"pre","props":{"code":"sudo flashrom -w apu2_v4.11.0.1.rom -p internal:boardmismatch=force\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"sudo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" flashrom"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -w"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" apu2_v4.11.0.1.rom"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -p"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" internal:boardmismatch=force\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"References:"}]}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://pcengines.ch/apu2.htm","rel":["nofollow"]},"children":[{"type":"text","value":"https://pcengines.ch/apu2.htm"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://pcengines.github.io/","rel":["nofollow"]},"children":[{"type":"text","value":"https://pcengines.github.io/"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/pcengines/apu2-documentation/blob/master/docs/firmware_flashing.md","rel":["nofollow"]},"children":[{"type":"text","value":"https://github.com/pcengines/apu2-documentation/blob/master/docs/firmware_flashing.md"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/pcengines/apu2-documentation/blob/master/docs/cold_reset.md","rel":["nofollow"]},"children":[{"type":"text","value":"https://github.com/pcengines/apu2-documentation/blob/master/docs/cold_reset.md"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/elad/openbsd-apu2","rel":["nofollow"]},"children":[{"type":"text","value":"https://github.com/elad/openbsd-apu2"}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:articles:apu2-firmware-upgrade.md","_source":"content","_file":"articles/apu2-firmware-upgrade.md","_extension":"md"},{"_path":"/articles/docker-selinux-volumes","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Docker Volume Permissions with SELinux","description":"Unfamiliar with running Docker on a SELinux enabled system, I found myself\nrunning into a bunch of file permission errors while creating volumes.","date":"2019-12-26","draft":false,"tags":["docker","selinux"],"categories":["linux"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Unfamiliar with running Docker on a SELinux enabled system, I found myself\nrunning into a bunch of file permission errors while creating volumes."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Unfamiliar with running Docker on a SELinux enabled system, I found myself\nrunning into a bunch of file permission errors while creating volumes."}]},{"type":"element","tag":"pre","props":{"code":"mkdir: can't create directory '/data': Permission denied\n","language":"txt","meta":"","className":"language-txt shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"mkdir: can't create directory '/data': Permission denied\n"}]}]}]}]},{"type":"element","tag":"hr","props":{},"children":[]},{"type":"element","tag":"pre","props":{"code":"$ docker info --format '{{json .SecurityOptions}}'\n[\n \"name=seccomp,profile=/etc/docker/seccomp.json\",\n \"name=selinux\"\n]\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" docker"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" info"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --format"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" '{{json .SecurityOptions}}'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"name=seccomp,profile=/etc/docker/seccomp.json\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"name=selinux\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"It turns out that this can be resolved by appending the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":":z"}]},{"type":"text","value":" flag to the volume\nmappings in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"docker-compose.yml"}]},{"type":"text","value":" file, indicating that the volume content\nis shared."}]},{"type":"element","tag":"pre","props":{"code":"services:\n server:\n volumes:\n - ./data:/data:z\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"services:\n server:\n volumes:\n - ./data:/data:z\n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"From the Docker documentation:"}]},{"type":"element","tag":"blockquote","props":{},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"z"}]},{"type":"text","value":" option tells Docker that two containers share the volume content. As\na result, Docker labels the content with a shared content label. Shared\nvolume labels allow all containers to read/write content."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"References"}]}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://docs.docker.com/engine/reference/commandline/info/","rel":["nofollow"]},"children":[{"type":"text","value":"Docker Docs: Docker Info"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container---volumes-from","rel":["nofollow"]},"children":[{"type":"text","value":"Docker Docs: Mounting Volumes"}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:articles:docker-selinux-volumes.md","_source":"content","_file":"articles/docker-selinux-volumes.md","_extension":"md"},{"_path":"/articles/doctl","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Exploring the Digital Ocean `doctl` Utility","description":"I recently had the need to spool up a small ephemeral Linux instance, and wanted to try something new by exploring the Digital Ocean doctl command line utility.\nThis proved to be an extremely easy way to configure, create, connect, and destroy a Linux box, and I foresee myself using this service even more in the future.","date":"2023-01-01","tags":["linux","digital-ocean"],"categories":["linux"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I recently had the need to spool up a small ephemeral Linux instance, and wanted to try something new by exploring the Digital Ocean "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"doctl"}]},{"type":"text","value":" command line utility.\nThis proved to be an "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"extremely"}]},{"type":"text","value":" easy way to configure, create, connect, and destroy a Linux box, and I foresee myself using this service even more in the future."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I recently had the need to spool up a small ephemeral Linux instance, and wanted to try something new by exploring the Digital Ocean "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"doctl"}]},{"type":"text","value":" command line utility.\nThis proved to be an "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"extremely"}]},{"type":"text","value":" easy way to configure, create, connect, and destroy a Linux box, and I foresee myself using this service even more in the future."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To start things off, I had to install and setup authentication to Digital Ocean. Doing\nthis on my Mac machine, I opted to use "},{"type":"element","tag":"a","props":{"href":"https://brew.sh/","rel":["nofollow"]},"children":[{"type":"text","value":"Homebrew"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"# install `doctl`\nbrew install doctl\n\n# setup authentication\ndoctl auth init\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# install `doctl`\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"brew"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" install"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" doctl\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# setup authentication\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"doctl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" auth"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" init\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"While the online "},{"type":"element","tag":"a","props":{"href":"https://docs.digitalocean.com/reference/doctl/reference/compute/droplet/create/","rel":["nofollow"]},"children":[{"type":"text","value":"documentation"}]},{"type":"text","value":" is fantastic, I instead found myself mostly referencing the outputs of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--help"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"doctl compute droplet create --help\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"doctl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" compute"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" droplet"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" create"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --help\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I had to find the image name of the version of Ubuntu I wanted to install:"}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"doctl compute image list --public | grep ubuntu-22\n\n# 118857366 22.04 (LTS) x64 snapshot Ubuntu ubuntu-22-04-x64 true 7\n# 119383150 22.10 x64 snapshot Ubuntu ubuntu-22-10-x64 true 7\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"doctl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" compute"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" image"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" list"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" |"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" grep"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ubuntu-22\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# 118857366 22.04 (LTS) x64 snapshot Ubuntu ubuntu-22-04-x64 true 7\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# 119383150 22.10 x64 snapshot Ubuntu ubuntu-22-10-x64 true 7\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And also the slug of the compute size:"}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"doctl compute size list\n\n# Slug Description Memory VCPUs Disk Price Monthly Price Hourly\n# s-1vcpu-512mb-10gb Basic 512 1 10 4.00 0.005950\n# s-1vcpu-1gb Basic 1024 1 25 6.00 0.008930\n# s-1vcpu-1gb-amd Basic AMD 1024 1 25 7.00 0.010420\n# s-1vcpu-1gb-intel Basic Intel 1024 1 25 7.00 0.010420\n# s-1vcpu-2gb Basic 2048 1 50 12.00 0.017860\n# s-1vcpu-2gb-amd Basic AMD 2048 1 50 14.00 0.020830\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"doctl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" compute"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" size"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" list\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# Slug Description Memory VCPUs Disk Price Monthly Price Hourly\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# s-1vcpu-512mb-10gb Basic 512 1 10 4.00 0.005950\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# s-1vcpu-1gb Basic 1024 1 25 6.00 0.008930\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# s-1vcpu-1gb-amd Basic AMD 1024 1 25 7.00 0.010420\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# s-1vcpu-1gb-intel Basic Intel 1024 1 25 7.00 0.010420\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# s-1vcpu-2gb Basic 2048 1 50 12.00 0.017860\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# s-1vcpu-2gb-amd Basic AMD 2048 1 50 14.00 0.020830\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I've also configured a few SSH keys with Digital Ocean, and I can have the key (specified by ID) provisioned to the machine using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--ssh-keys"}]},{"type":"text","value":" flag."}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"doctl compute ssh-key list\n\n# ID Name FingerPrint\n# 1234 mini \n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"doctl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" compute"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ssh-key"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" list\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# ID Name FingerPrint\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# 1234 mini \n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Also, I wanted to install a few packages to the box upon creation, this can be done easily with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--user-data-file"}]},{"type":"text","value":" flag to run an initialization script."}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"echo 'apt install -y imagemagick zip' > bootstrap.sh\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"echo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 'apt install -y imagemagick zip'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" >"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" bootstrap.sh\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Putting it all together, here is the simple command for creating a small compute instance!"}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"doctl compute droplet create \\\n --image ubuntu-22-10-x64 \\\n --size s-1vcpu-512mb-10gb \\\n --region nyc1 \\\n --ssh-keys 1234 \\\n --user-data-file boostrap.sh \\\n ephemeral\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"doctl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" compute"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" droplet"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" create"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --image"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ubuntu-22-10-x64"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --size"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" s-1vcpu-512mb-10gb"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --region"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" nyc1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --ssh-keys"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 1234"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --user-data-file"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" boostrap.sh"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ephemeral\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Finally, I can connect, do my thing, and destroy the instance."}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"doctl compute ssh ephemeral\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"doctl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" compute"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ssh"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ephemeral\n"}]}]}]}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"doctl compute droplet delete --force ephemeral\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"doctl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" compute"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" droplet"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" delete"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --force"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ephemeral\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"All-in-all, I was up and running in about 20 minutes. What a handy utility!"}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:articles:doctl.md","_source":"content","_file":"articles/doctl.md","_extension":"md"},{"_path":"/articles/fennel-initial-exploration","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Impressions of Fennel with Hammerspoon","description":"A while back I read an introductory book on Lisp programming titled, \"The Little\nSchemer\". This book opened my mind to new (to me) programming paradigms, and left me\nwith a strong desire to find a way to incorporate Lisp programming into my every day\nlife. It took some time, but I believe I've found what I've been looking for: Fennel.","draft":false,"date":"2023-10-22","tags":["lisp","hammerspoon","fennel"],"categories":["lisp"],"cover_image":"/images/dall-e-fennel-hammer.jpeg","excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"A while back I read an introductory book on Lisp programming titled, \"The Little\nSchemer\". This book opened my mind to new (to me) programming paradigms, and left me\nwith a strong desire to find a way to incorporate Lisp programming into my every day\nlife. It took some time, but I believe I've found what I've been looking for: Fennel."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"A while back I read an introductory book on Lisp programming titled, \"The Little\nSchemer\". This book opened my mind to new (to me) programming paradigms, and left me\nwith a strong desire to find a way to incorporate Lisp programming into my every day\nlife. It took some time, but I believe I've found what I've been looking for: Fennel."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"a","props":{"href":"https://fennel-lang.org/","rel":["nofollow"]},"children":[{"type":"text","value":"Fennel"}]},{"type":"text","value":" programming language is a dialect of Lisp that boasts compatibility with\nLua, and it just so happens that two of my favorite applications are configured with\nexactly that language: "},{"type":"element","tag":"a","props":{"href":"https://www.hammerspoon.org/","rel":["nofollow"]},"children":[{"type":"text","value":"Hammerspoon"}]},{"type":"text","value":", and "},{"type":"element","tag":"a","props":{"href":"https://neovim.io/","rel":["nofollow"]},"children":[{"type":"text","value":"Neovim"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"initial-observations"},"children":[{"type":"text","value":"Initial Observations"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To initially explore Fennel, I wanted to start small. My Hammerspoon configuration\nconsists of 7 "},{"type":"element","tag":"a","props":{"href":"https://github.com/cmpadden/dotfiles/tree/795749fa17e1310bb001bb7deaa22be8689f0027/hammerspoon/.hammerspoon/modules","rel":["nofollow"]},"children":[{"type":"text","value":"modules"}]},{"type":"text","value":" that I use for operations such as: launching applications,\nmanaging windows, keeping my computer from going to sleep, and general operating system\nautomation. So the plan is to translate these modules into Fennel, while maintaining\nwithout breaking the existing functionality. However, at this point, I wasn't even sure\nhow to embed Fennel into my project..."}]},{"type":"element","tag":"h2","props":{"id":"integrating-fennel-with-hammerspoon"},"children":[{"type":"text","value":"Integrating Fennel with Hammerspoon"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"While official documentation exists describing how to "},{"type":"element","tag":"a","props":{"href":"https://fennel-lang.org/setup#embedding-fennel","rel":["nofollow"]},"children":[{"type":"text","value":"embed fennel"}]},{"type":"text","value":" into your\nproject; it didn't provide me with enough clarity to know my next steps on integrating\nit with Hammerspoon. I found a few resources online demonstrating how to extend the\n"},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"package.path"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"package.cpath"}]},{"type":"text","value":" properties in Lua, but I was unable to get this to\nwork."}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://blog.exupero.org/hammerspoon-with-fennel/","rel":["nofollow"]},"children":[{"type":"text","value":"https://blog.exupero.org/hammerspoon-with-fennel/"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/Hammerspoon/hammerspoon/issues/2377#issuecomment-636331435","rel":["nofollow"]},"children":[{"type":"text","value":"https://github.com/Hammerspoon/hammerspoon/issues/2377#issuecomment-636331435"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/agzam/spacehammer/blob/master/init.lua","rel":["nofollow"]},"children":[{"type":"text","value":"https://github.com/agzam/spacehammer/blob/master/init.lua"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Ultimately, I opted to include the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fennel.lua"}]},{"type":"text","value":" file to my Hammerspoon configuration,\nand while not ideal, it does make the configuration nicely self-contained. I'll leave it\nas a future task to include the module installed with LuaRocks."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"With Fennel now included in my Hammerspoon configuration, all I need to do is configure\nthe "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fennel.path"}]},{"type":"text","value":" to point to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"*.fnl"}]},{"type":"text","value":" files in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":".hammerspoon/"}]},{"type":"text","value":" directory, and\nttranslating these modules can begin!"}]},{"type":"element","tag":"pre","props":{"className":"language-lua shiki shiki-themes github-light","code":"-- init.lua\n\nlocal fennel = require('fennel')\n\nfennel.path = package.path .. \";\" .. os.getenv(\"HOME\") .. \"/.hammerspoon/?.fnl\"\n\ntable.insert(package.loaders or package.searchers, fennel.searcher)\n\nrequire 'main'\n","language":"lua","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"-- init.lua\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"local"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" fennel "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" require"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"'fennel'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"fennel."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"path"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" package.path"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" .."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \";\" "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":".."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" os.getenv"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"HOME\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":".."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"/.hammerspoon/?.fnl\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"table.insert"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"package.loaders"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" or"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" package.searchers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", fennel."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"searcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"require"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 'main'\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"translating-lua-to-fennel"},"children":[{"type":"text","value":"Translating Lua to Fennel"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As a Fennel novice, I was happy to see that the Fennel project provides an online\ncross-compiler for Lua and Fennel called "},{"type":"element","tag":"a","props":{"href":"https://fennel-lang.org/see","rel":["nofollow"]},"children":[{"type":"text","value":"anti-fennel"}]},{"type":"text","value":", and while it can generate some\nstrange-looking Fennel code, it was an extremely useful tool for me to get\nup-and-running right away. For example, by pasting the simple "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sleep"}]},{"type":"text","value":" function\nfrom the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"helpers"}]},{"type":"text","value":" module into the compiler:"}]},{"type":"element","tag":"pre","props":{"className":"language-lua shiki shiki-themes github-light","code":"function sleep(ms)\n os.execute(\"sleep \" .. tonumber(ms) / 1000)\nend\n","language":"lua","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" sleep"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(ms)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" os.execute"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"sleep \" "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":".."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" tonumber"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(ms) "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"/"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 1000"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"end\n"}]}]}]}]},{"type":"element","tag":"pre","props":{"className":"language-lisp shiki shiki-themes github-light","code":"(fn sleep [ms]\n (os.execute (.. \"sleep \" (/ (tonumber ms) 1000))))\n","language":"lisp","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(fn sleep [ms]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" (os.execute (.. "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"sleep \""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"/"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" (tonumber ms) "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"1000"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"))))\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As another example, here is the output for my "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"caffeine"}]},{"type":"text","value":" toggle:"}]},{"type":"element","tag":"pre","props":{"className":"language-lua shiki shiki-themes github-light","code":"hs.hotkey.bind(HYPER, \"0\", function()\n hs.caffeinate.toggle(\"displayIdle\")\n if hs.caffeinate.get(\"displayIdle\") then\n helpers:show(\"Caffeine Enabled\", nil, helpers.styles.success, helpers.assets.check)\n else\n helpers:show(\"Caffeine Disabled\", nil, helpers.styles.error, helpers.assets.ban)\n end\nend)\n","language":"lua","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"hs."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"hotkey"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"bind"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(HYPER, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"0\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" hs."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"caffeinate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"toggle"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"displayIdle\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" hs."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"caffeinate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"displayIdle\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"then\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" helpers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"show"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"Caffeine Enabled\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"nil"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", helpers."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"styles"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"success"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", helpers."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"assets"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"check"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" else\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" helpers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"show"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"Caffeine Disabled\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"nil"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", helpers."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"styles"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"error"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", helpers."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"assets"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"ban"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" end\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"end"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":")\n"}]}]}]}]},{"type":"element","tag":"pre","props":{"className":"language-lisp shiki shiki-themes github-light","code":"(hs.hotkey.bind HYPER :0\n (fn [] (hs.caffeinate.toggle :displayIdle)\n (if (hs.caffeinate.get :displayIdle)\n (helpers:show \"Caffeine Enabled\" nil helpers.styles.success helpers.assets.check)\n (helpers:show \"Caffeine Disabled\" nil helpers.styles.error helpers.assets.ban)))) \n","language":"lisp","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(hs.hotkey.bind HYPER "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":":0\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" (fn [] (hs.caffeinate.toggle "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":":displayIdle"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" (hs.caffeinate.get "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":":displayIdle"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" (helpers:show "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"Caffeine Enabled\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" nil"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" helpers.styles.success helpers.assets.check)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" (helpers:show "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"Caffeine Disabled\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" nil"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" helpers.styles.error helpers.assets.ban))))\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This was especially helpful for more gnarly modules like the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"window"}]},{"type":"text","value":" module used for\nwindow management, and seeing the Lua and Fennel code side-by-side was a kick starter in\nlearning the language!"}]},{"type":"element","tag":"h2","props":{"id":"next-steps"},"children":[{"type":"text","value":"Next Steps"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"While my Fennel Hammerspoon configuration now works with parity to its Lua counterpart,\nI have not yet added new features or modules. I look forward to writing new Fennel code,\nand deepen my understanding of Lisp and the Fennel programming language."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Additionally, before beginning this endeavor, I was already aware of projects like\n"},{"type":"element","tag":"a","props":{"href":"https://github.com/agzam/spacehammer","rel":["nofollow"]},"children":[{"type":"text","value":"spacehammer"}]},{"type":"text","value":"; a wildly impressive Hammerspoon configuration written in Fennel, but,\nI wanted to start small and learn the integration myself. However, with the basics out\nof the way, I hope to explore this project further, and seek lessons-learned for the\nconfiguration of my own."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The full pull-request for translating my Lua Hammerspoon configuration to Fennel can be\nfound here: "},{"type":"element","tag":"a","props":{"href":"https://github.com/cmpadden/dotfiles/pull/19/files","rel":["nofollow"]},"children":[{"type":"text","value":"https://github.com/cmpadden/dotfiles/pull/19/files"}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"initial-observations","depth":2,"text":"Initial Observations"},{"id":"integrating-fennel-with-hammerspoon","depth":2,"text":"Integrating Fennel with Hammerspoon"},{"id":"translating-lua-to-fennel","depth":2,"text":"Translating Lua to Fennel"},{"id":"next-steps","depth":2,"text":"Next Steps"}]}},"_type":"markdown","_id":"content:articles:fennel-initial-exploration.md","_source":"content","_file":"articles/fennel-initial-exploration.md","_extension":"md"},{"_path":"/articles/migrate-truenas-from-core-to-scale","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Migrate to TrueNAS Scale from TrueNAS Core","description":"TrueNAS Scale offers a variety of interesting features that are not supported in its TrueNAS Core counterpart. Most notably, because the base operating system is Debian Linux, opposed to FreeBSD, there is native support for Linux containers via Docker, and Kubernetes Pods! This post walks through the steps required to upgrade from TrueNAS Core to TrueNAS Scale.","date":"2021-12-28","tags":["homelab","supermicro","truenas"],"categories":["homelab"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"TrueNAS Scale offers a variety of interesting features that are not supported in its TrueNAS Core counterpart. Most notably, because the base operating system is Debian Linux, opposed to FreeBSD, there is native support for Linux containers via Docker, and Kubernetes Pods! This post walks through the steps required to upgrade from TrueNAS Core to TrueNAS Scale."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"TrueNAS Scale offers a variety of interesting features that are not supported in its TrueNAS Core counterpart. Most notably, because the base operating system is Debian Linux, opposed to FreeBSD, there is native support for Linux containers via Docker, and Kubernetes Pods! This post walks through the steps required to upgrade from TrueNAS Core to TrueNAS Scale."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Thankfully, the upgrade procedure to migrate from TrueNAS Core to TrueNAS Scale is relatively straight forward. All it requires is to create a bootable USB of the TrueNAS Scale image, boot the USB, and select "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"Install/Upgrade"}]},{"type":"text","value":" in the installation wizard. But for the sake of being thorough, you can find instructions on how to backup system configurations and install the OS below."}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Make a backup of your system’s configuration\n"},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Navigate to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"System > General"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Click "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Save Config"}]},{"type":"text","value":", check the "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"Export Secret Seed"}]},{"type":"text","value":" box, and click "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Save"}]}]}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Export dataset keys for the encrypted pools\n"},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Navigate to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Storage > Pools"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Click the cog icon, and select "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Export Dataset Keys"}]}]}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Insert the TrueNAS Core bootable USB into the NAS"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"From the Supermicro IPMI interface select "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"Remote Control"}]},{"type":"text","value":" and "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"iKVM/HTML5"}]},{"type":"text","value":" and select "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"Reboot"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Select the bootable USB as the boot device"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"From the TrueNAS installation wizard, select "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"Install/Upgrade"}]},{"type":"text","value":", select the drive that contains the TrueNAS installation, and select "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"Upgrade Install"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Reboot the device, and voila — you should be up-and-running! Give the system a quick rundown to validate that your settings and pools have transferred correctly, and then enjoy all the container goodness!"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For a breakdown of the differences between TrueNAS Core, Enterprise, and Scale, you can reference "},{"type":"element","tag":"a","props":{"href":"https://www.truenas.com/help-me-choose/","rel":["nofollow"]},"children":[{"type":"text","value":"this table"}]},{"type":"text","value":"."}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:articles:migrate-truenas-from-core-to-scale.md","_source":"content","_file":"articles/migrate-truenas-from-core-to-scale.md","_extension":"md"},{"_path":"/articles/nuxt-content-rss-feed","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"How To Add an RSS Feed to a Nuxt Website","description":"If you are a user of Nuxt Content and you wish to configure an RSS feed for your website, it's a surprisingly straight forward process! In this article, we will walk through the code changes required to host an RSS feed for both a statically generated, and Universal Nuxt application.","draft":false,"date":"2024-01-06","tags":["nuxt","rss"],"categories":["programming"],"cover_image":"/images/nuxt-content-rss-feed.jpg","excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you are a user of "},{"type":"element","tag":"a","props":{"href":"https://content.nuxt.com/","rel":["nofollow"]},"children":[{"type":"text","value":"Nuxt Content"}]},{"type":"text","value":" and you wish to configure an RSS feed for your website, it's a surprisingly straight forward process! In this article, we will walk through the code changes required to host an RSS feed for both a statically generated, and Universal Nuxt application."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you are a user of "},{"type":"element","tag":"a","props":{"href":"https://content.nuxt.com/","rel":["nofollow"]},"children":[{"type":"text","value":"Nuxt Content"}]},{"type":"text","value":" and you wish to configure an RSS feed for your website, it's a surprisingly straight forward process! In this article, we will walk through the code changes required to host an RSS feed for both a statically generated, and Universal Nuxt application."}]},{"type":"element","tag":"h2","props":{"id":"preface"},"children":[{"type":"text","value":"Preface"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In version 2 of Nuxt, the community module, "},{"type":"element","tag":"a","props":{"href":"https://github.com/nuxt-community/feed-module","rel":["nofollow"]},"children":[{"type":"text","value":"nuxt-community/feed-module"}]},{"type":"text","value":" was a popular choice for adding an RSS feed to your website. However, there has been an unresolved "},{"type":"element","tag":"a","props":{"href":"https://github.com/nuxt-community/feed-module/issues/106","rel":["nofollow"]},"children":[{"type":"text","value":"open issue"}]},{"type":"text","value":" since April 1st, 2022 to add support for Nuxt v3. Thankfully, implementing this feature without a module is relatively straight forward."}]},{"type":"element","tag":"h2","props":{"id":"instructions"},"children":[{"type":"text","value":"Instructions"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"First, install the "},{"type":"element","tag":"a","props":{"href":"https://www.npmjs.com/package/feed","rel":["nofollow"]},"children":[{"type":"text","value":"feed"}]},{"type":"text","value":" library into your project:"}]},{"type":"element","tag":"pre","props":{"className":"language-shell shiki shiki-themes github-light","code":"npm i -D feed\n","language":"shell","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"npm"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" i"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -D"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" feed\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Then, create a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server/"}]},{"type":"text","value":" folder in your project if it does not already exist, and create a file named "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server/routes/atom.ts"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Here, we will leverage the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"feed"}]},{"type":"text","value":" library and construct an XML representation of our Nuxt content. As you can see, we first define our "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"feed"}]},{"type":"text","value":" with metadata associated with our RSS feed. This will be used by RSS readers to provide context to the end user. Then, we query our Nuxt content with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"serverQueryContent"}]},{"type":"text","value":" and append a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"feed.addItem"}]},{"type":"text","value":" for each article."}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-light","code":"import { serverQueryContent } from '#content/server';\nimport { Feed } from 'feed';\n\nconst BASE_URL = \"https://mywebsite.com\"\nconst AUTHOR_NAME = \"Firstname Lastname\"\n\nexport default defineEventHandler(async (event) => {\n\n const feed = new Feed({\n title: \"My Title\",\n description: \"My Description\",\n id: BASE_URL,\n link: BASE_URL,\n language: \"en\",\n image: `${BASE_URL}/images/placeholder.png`,\n favicon: `${BASE_URL}/favicon.ico`,\n copyright: `All rights reserved ${new Date().getFullYear()}, ${AUTHOR_NAME}`,\n updated: new Date(),\n generator: \"Nuxt static site generation + Feed for Node.js\",\n feedLinks: {\n atom: `${BASE_URL}/atom`\n },\n author: {\n name: AUTHOR_NAME,\n }\n });\n\n const articles = await serverQueryContent(event).find();\n\n articles.forEach((article) => {\n feed.addItem({\n title: article.title ? article.title : \"Missing Title\",\n id: article._path,\n link: `${BASE_URL}${article._path}`,\n description: article.description,\n author: [\n {\n name: AUTHOR_NAME,\n },\n ],\n date: new Date(article.date),\n image: article.cover_image ? `${BASE_URL}/${article.cover_image}` : undefined\n });\n });\n\n return feed.atom1();\n});\n","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" { serverQueryContent } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" '#content/server'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" { Feed } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 'feed'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" BASE_URL"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"https://mywebsite.com\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" AUTHOR_NAME"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"Firstname Lastname\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"export"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" default"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" defineEventHandler"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"async"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E36209"},"children":[{"type":"text","value":"event"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" feed"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" Feed"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"({\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" title: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"My Title\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" description: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"My Description\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" id: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"BASE_URL"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" link: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"BASE_URL"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" language: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"en\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" image: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"`${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"BASE_URL"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"}/images/placeholder.png`"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" favicon: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"`${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"BASE_URL"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"}/favicon.ico`"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" copyright: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"`All rights reserved ${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" Date"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"()."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"getFullYear"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"}, ${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"AUTHOR_NAME"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"}`"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" updated: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" Date"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" generator: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"Nuxt static site generation + Feed for Node.js\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" feedLinks: {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" atom: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"`${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"BASE_URL"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"}/atom`\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" author: {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" name: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"AUTHOR_NAME"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" articles"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" serverQueryContent"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(event)."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"find"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" articles."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"forEach"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E36209"},"children":[{"type":"text","value":"article"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" feed."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"addItem"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"({\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" title: article.title "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" article.title "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"Missing Title\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" id: article._path,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" link: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"`${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"BASE_URL"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"}${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"article"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"_path"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"}`"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" description: article.description,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":36},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" author: [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":37},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":38},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" name: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"AUTHOR_NAME"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":39},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":40},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" ],\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":41},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" date: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" Date"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(article.date),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":42},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" image: article.cover_image "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" `${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"BASE_URL"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"}/${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"article"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"cover_image"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"}`"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" :"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" undefined\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":43},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":44},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":45},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":46},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" feed."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"atom1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":47},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"});\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And that's just about it! Except, if you are statically generating your website with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"nuxt generate"}]},{"type":"text","value":" command, you will need to configure this server-side route to be pre-rendered on site generation. This is as simple as adding a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"nitro"}]},{"type":"text","value":" "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"prerender"}]},{"type":"text","value":" definition in your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"nuxt.config.ts"}]},{"type":"text","value":" file, like so:"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-light","code":"nitro: {\n prerender: {\n routes: ['/atom']\n }\n}\n","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"nitro"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" prerender"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" routes"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":": ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"'/atom'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"bonus"},"children":[{"type":"text","value":"Bonus"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You may also be interested in adding a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sitemap.xml"}]},{"type":"text","value":" to your website. This can be done in almost an identical fashion!"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Install the dependency:"}]},{"type":"element","tag":"pre","props":{"className":"language-shell shiki shiki-themes github-light","code":"npm i -D sitemap\n","language":"shell","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"npm"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" i"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -D"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" sitemap\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Create a route at "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server/routes/sitemap.xml.ts"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-light","code":"import { serverQueryContent } from '#content/server';\nimport { SitemapStream, streamToPromise } from 'sitemap';\n\nexport default defineEventHandler(async (event) => {\n const articles = await serverQueryContent(event).find();\n\n const sitemap = new SitemapStream({ hostname: 'https://my-website.com/' });\n\n // Add non nuxt content endpoints here\n sitemap.write({ url: '/' });\n sitemap.write({ url: '/articles' });\n\n // Dynamically generate routes for Nuxt markdown content\n articles.forEach((article) => sitemap.write({ url: article._path, changefreq: 'monthly' }));\n sitemap.end();\n\n return (await streamToPromise(sitemap));\n});\n","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" { serverQueryContent } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" '#content/server'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" { SitemapStream, streamToPromise } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 'sitemap'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"export"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" default"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" defineEventHandler"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"async"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E36209"},"children":[{"type":"text","value":"event"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" articles"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" serverQueryContent"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(event)."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"find"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" sitemap"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" SitemapStream"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"({ hostname: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"'https://my-website.com/'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // Add non nuxt content endpoints here\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" sitemap."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"write"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"({ url: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"'/'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" sitemap."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"write"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"({ url: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"'/articles'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // Dynamically generate routes for Nuxt markdown content\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" articles."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"forEach"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E36209"},"children":[{"type":"text","value":"article"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" sitemap."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"write"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"({ url: article._path, changefreq: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"'monthly'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" }));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" sitemap."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"end"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" streamToPromise"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(sitemap));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"});\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And add the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"prerender"}]},{"type":"text","value":" entry in your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"nuxt.config.ts"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-light","code":"nitro: {\n prerender: {\n routes: ['/sitemap.xml', '/atom']\n }\n}\n","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"nitro"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" prerender"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" routes"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":": ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"'/sitemap.xml'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"'/atom'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"preface","depth":2,"text":"Preface"},{"id":"instructions","depth":2,"text":"Instructions"},{"id":"bonus","depth":2,"text":"Bonus"}]}},"_type":"markdown","_id":"content:articles:nuxt-content-rss-feed.md","_source":"content","_file":"articles/nuxt-content-rss-feed.md","_extension":"md"},{"_path":"/articles/nuxt-v3-migration","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"This Website Has Been Migrated to Nuxt 3 🎉","description":"This website has been migrated to the latest version of the Nuxt web framework, and with it comes all of the exciting goodies that the Vue and Nuxt teams have been concocting over the past few years.\nNot to mention, all of the great plugins in the Vue ecosystem!","date":"2022-12-31","tags":["nuxt"],"categories":["web"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This website has been migrated to the latest version of the Nuxt web framework, and with it comes all of the exciting goodies that the Vue and Nuxt teams have been concocting over the past few years.\nNot to mention, all of the great plugins in the Vue ecosystem!"}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This website has been migrated to the latest version of the Nuxt web framework, and with it comes all of the exciting goodies that the Vue and Nuxt teams have been concocting over the past few years.\nNot to mention, all of the great plugins in the Vue ecosystem!"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you're curious what changes were required to make the migration, you can check out "},{"type":"element","tag":"a","props":{"href":"https://github.com/cmpadden/cmpadden.github.io/pull/3","rel":["nofollow"]},"children":[{"type":"text","value":"pull request #3"}]},{"type":"text","value":" in the GitHub repository."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"Screenshot of Nuxt Migration Pull Request","src":"/images/nuxt-migration-pr.png"},"children":[]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"While the documentation for making this migration is great, there were many breaking changes, and the overall process was quite tedious.\nFor this reason, I opted to generate a new project entirely, and port existing code to this clean slate.\nI believe that this resulted in a project with a bit less cruft."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The most valuable resources for making these changes include:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://nuxt.com/docs/migration/overview","rel":["nofollow"]},"children":[{"type":"text","value":"The Nuxt Migration Guide"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://nuxt.com/docs/getting-started/introduction","rel":["nofollow"]},"children":[{"type":"text","value":"The Nuxt Framework Guide"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://tailwindcss.nuxt.dev/","rel":["nofollow"]},"children":[{"type":"text","value":"Nuxt Tailwind Module Documentation"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://content.nuxtjs.org/","rel":["nofollow"]},"children":[{"type":"text","value":"Nuxt Content Module Documentation"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Part of the delay for doing this upgrade was in waiting for module developers to support this major release.\nI'm super thankful for all of the hard work they've don, and I'm excited to explore all of the new features available!\nI just hope that the breaking changes in this release don't cause too much fracturing of the community, as it does feel like déjà vu of Python 2 and 3."}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:articles:nuxt-v3-migration.md","_source":"content","_file":"articles/nuxt-v3-migration.md","_extension":"md"},{"_path":"/articles/persistent-archlinux-usb","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Create a Persistent Arch Linux Bootable USB with Vagrant","description":"When installing a linux distribution, it is common for the instructions to have\nthe user create a bootable USB, boot from the device, and proceed with the\ninstallation procedure from that live medium. However, this blog post will\noutline an alternative approach where a virtual machine created with Vagrant\nwill be used in favor of the live medium.","date":"2020-01-09","draft":false,"tags":["vagrant","archlinux"],"categories":["linux"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When installing a linux distribution, it is common for the instructions to have\nthe user create a bootable USB, boot from the device, and proceed with the\ninstallation procedure from that live medium. However, this blog post will\noutline an alternative approach where a virtual machine created with Vagrant\nwill be used in favor of the live medium."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When installing a linux distribution, it is common for the instructions to have\nthe user create a bootable USB, boot from the device, and proceed with the\ninstallation procedure from that live medium. However, this blog post will\noutline an alternative approach where a virtual machine created with Vagrant\nwill be used in favor of the live medium."}]},{"type":"element","tag":"h1","props":{"id":"preface"},"children":[{"type":"text","value":"Preface"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The original intention was to use Docker for this process -- leveraging the\n"},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--device"}]},{"type":"text","value":" flag and mounting the target USB device in the Docker container,\nbut the underlying hypervisor in Docker Desktop for Mac does not support this.\n"},{"type":"element","tag":"sup","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://docs.docker.com/docker-for-mac/docker-toolbox/","rel":["nofollow"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tag":"a","props":{"href":"https://github.com/moby/hyperkit","rel":["nofollow"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tag":"a","props":{"href":"https://github.com/docker/for-mac/issues/900","rel":["nofollow"]},"children":[{"type":"text","value":"3"}]}]},{"type":"text","value":" While there are workarounds using Docker\nMachine, Vagrant felt like the path of least resistance."}]},{"type":"element","tag":"h1","props":{"id":"instructions"},"children":[{"type":"text","value":"Instructions"}]},{"type":"element","tag":"h2","props":{"id":"create-an-arch-linux-virtual-machine-with-vagrant"},"children":[{"type":"text","value":"Create an Arch Linux Virtual Machine with Vagrant"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Get the latest Arch Linux image "},{"type":"element","tag":"sup","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://app.vagrantup.com/archlinux/boxes/archlinux","rel":["nofollow"]},"children":[{"type":"text","value":"4"}]}]},{"type":"text","value":" from the Vagrant Cloud Box\nCatalog."}]},{"type":"element","tag":"pre","props":{"code":"vagrant box add archlinux/archlinux\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"vagrant"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" box"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" add"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" archlinux/archlinux\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Determine the USB vendor information for the thumb-drive that we will\npass-through to the virtual machine. Using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"VBoxManage"}]},{"type":"text","value":" utility that comes\nwith Virtual Box, list the devices, and make note of the Vendor and Product ID."}]},{"type":"element","tag":"pre","props":{"code":" VBoxManage list usbhost\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" VBoxManage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" list"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" usbhost\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Create a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Vagrantfile"}]},{"type":"text","value":" with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"archlinx/archlinux"}]},{"type":"text","value":" as the target box, and the USB\ndevice information that is passed through. "},{"type":"element","tag":"sup","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://antonyjepson.wordpress.com/2012/01/26/quickly-attaching-usb-devices-to-virtualbox-guests-using-vboxmanage/","rel":["nofollow"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":" "},{"type":"element","tag":"a","props":{"href":"https://gist.github.com/dscape/7d829c0c116ef419f963","rel":["nofollow"]},"children":[{"type":"text","value":"6"}]}]},{"type":"text","value":" Vagrant\noffers a handy customization parameter "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"vb.customize"}]},{"type":"text","value":" that calls the\n"},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"VBoxManage"}]},{"type":"text","value":" command under-the-hood, allowing one to enable the guest machine\nto access the host machine's USB devices."}]},{"type":"element","tag":"pre","props":{"code":"# -*- mode: ruby -*-\n# vi: set ft=ruby :\n\nVagrant.configure(\"2\") do |config|\n config.vm.box = \"archlinux/archlinux\"\n config.vm.provider \"virtualbox\" do |vb|\n vb.name = \"archlinux\"\n vb.customize ['modifyvm', :id, '--usb', 'on']\n vb.customize ['usbfilter', 'add', '1', '--target', :id, '--name', 'SanDisk Ultra Fit', '--vendorid', '0x0781', '--productid', '0x5583']\n end\nend\n","language":"txt","meta":"","className":"language-txt shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"# -*- mode: ruby -*-\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"# vi: set ft=ruby :\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Vagrant.configure(\"2\") do |config|\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" config.vm.box = \"archlinux/archlinux\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" config.vm.provider \"virtualbox\" do |vb|\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" vb.name = \"archlinux\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" vb.customize ['modifyvm', :id, '--usb', 'on']\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" vb.customize ['usbfilter', 'add', '1', '--target', :id, '--name', 'SanDisk Ultra Fit', '--vendorid', '0x0781', '--productid', '0x5583']\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" end\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"end\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When virtual machine is brought up, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"usbfilter"}]},{"type":"text","value":" is applied, and the guest\nis able to access to the host machine's USB device that was specified in the\nfilter."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Start the machine, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ssh"}]},{"type":"text","value":" into the guest, and list the devices to confirm that\nthe USB device is available (see: "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/dev/sdb"}]},{"type":"text","value":")."}]},{"type":"element","tag":"pre","props":{"code":"$ vagrant up\n$ vagrant ssh\n[vagrant@archlinux ~]$ lsblk\nNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nsda 8:0 0 20G 0 disk\n├─sda1 8:1 0 1.9G 0 part [SWAP]\n└─sda2 8:2 0 18.1G 0 part /\nsdb 8:16 1 28.7G 0 disk\n└─sdb1 8:17 1 8G 0 part\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" vagrant"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" up\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" vagrant"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ssh\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[vagrant@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]$ lsblk\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"NAME"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" MAJ:MIN"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" RM"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" SIZE"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" RO"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" TYPE"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" MOUNTPOINT\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"sda"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 8:0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 20G"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" disk\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"├─sda1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 8:1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 1.9G"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" part"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" [SWAP]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"└─sda2"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 8:2"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 18.1G"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" part"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" /\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"sdb"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 8:16"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 28.7G"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" disk\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"└─sdb1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 8:17"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 8G"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" part\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"install-arch-linux-on-the-usb-drive"},"children":[{"type":"text","value":"Install Arch Linux on the USB Drive"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"a","props":{"href":"https://wiki.archlinux.org/index.php/Installation_guide","rel":["nofollow"]},"children":[{"type":"text","value":"Arch Linux Installation Guide"}]},{"type":"text","value":" outlines the installation procedure in\ngreat detail -- the following steps follow this closely with a few alteration\ndue to installing onto removable media."}]},{"type":"element","tag":"h3","props":{"id":"partition-the-disk-uefi-with-gpt"},"children":[{"type":"text","value":"Partition the Disk (UEFI with GPT)"}]},{"type":"element","tag":"pre","props":{"code":"[root@archlinux ~]# fdisk /dev/sdb\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[root@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]# fdisk /dev/sdb\n"}]}]}]}]},{"type":"element","tag":"pre","props":{"code":"Command (m for help): p\nDisk /dev/sdb: 28.66 GiB, 30752636928 bytes, 60063744 sectors\nDisk model: Ultra Fit\nUnits: sectors of 1 * 512 = 512 bytes\nSector size (logical/physical): 512 bytes / 512 bytes\nI/O size (minimum/optimal): 512 bytes / 512 bytes\nDisklabel type: gpt\nDisk identifier: E1D6C445-1B79-AB4D-A442-FA4AD6DF4ECC\n\nDevice Start End Sectors Size Type\n/dev/sdb1 2048 1050623 1048576 512M EFI System\n/dev/sdb2 1050624 60063710 59013087 28.1G Linux filesystem\n\nFilesystem/RAID signature on partition 1 will be wiped.\n","language":"txt","meta":"","className":"language-txt shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Command (m for help): p\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Disk /dev/sdb: 28.66 GiB, 30752636928 bytes, 60063744 sectors\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Disk model: Ultra Fit\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Units: sectors of 1 * 512 = 512 bytes\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Sector size (logical/physical): 512 bytes / 512 bytes\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"I/O size (minimum/optimal): 512 bytes / 512 bytes\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Disklabel type: gpt\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Disk identifier: E1D6C445-1B79-AB4D-A442-FA4AD6DF4ECC\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Device Start End Sectors Size Type\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"/dev/sdb1 2048 1050623 1048576 512M EFI System\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"/dev/sdb2 1050624 60063710 59013087 28.1G Linux filesystem\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Filesystem/RAID signature on partition 1 will be wiped.\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"format-the-partitions"},"children":[{"type":"text","value":"Format the Partitions"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The UEFI specification mandates support for FAT file-systems, and FAT32 is\nrecommended for removable media. "},{"type":"element","tag":"sup","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://wiki.archlinux.org/index.php/EFI_system_partition#Format_the_partition","rel":["nofollow"]},"children":[{"type":"text","value":"7"}]}]}]},{"type":"element","tag":"pre","props":{"code":"[root@archlinux ~]# pacman -Sy dosfstools\n[root@archlinux ~]# mkfs.fat -F32 /dev/sdb1\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[root@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]# pacman -Sy dosfstools\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[root@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]# mkfs.fat -F32 /dev/sdb1\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As for the root partition, it is recommended to use "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ext4"}]},{"type":"text","value":" without a journal to\nreduce the reads and writes to the file-system as this is detrimental to the\nflash-based USB drive. "},{"type":"element","tag":"sup","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://wiki.archlinux.org/index.php/Install_Arch_Linux_on_a_USB_key#Installation_tweaks","rel":["nofollow"]},"children":[{"type":"text","value":"8"}]}]}]},{"type":"element","tag":"pre","props":{"code":"[root@archlinux ~]# mkfs.ext4 -O \"^has_journal\" /dev/sdb2\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[root@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]# mkfs.ext4 -O "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"^has_journal\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" /dev/sdb2\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"mount-the-partitions-and-bootstrap-the-environment"},"children":[{"type":"text","value":"Mount the Partitions and Bootstrap the Environment"}]},{"type":"element","tag":"pre","props":{"code":"[root@archlinux ~]# mount /dev/sdb2 /mnt\n[root@archlinux ~]# mkdir -p /mnt/boot/efi\n[root@archlinux ~]# mount /dev/sdb1 /mnt/boot/efi\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[root@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]# mount /dev/sdb2 /mnt\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[root@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]# mkdir -p /mnt/boot/efi\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[root@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]# mount /dev/sdb1 /mnt/boot/efi\n"}]}]}]}]},{"type":"element","tag":"pre","props":{"code":"[root@archlinux ~]# pacman -S arch-install-scripts\n[root@archlinux ~]# pacstrap /mnt base linux linux-firmware\n[root@archlinux ~]# genfstab -U /mnt >> /mnt/etc/fstab\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[root@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]# pacman -S arch-install-scripts\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[root@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]# pacstrap /mnt base linux linux-firmware\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[root@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]# genfstab -U /mnt "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":">>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" /mnt/etc/fstab\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"configure-the-new-environment"},"children":[{"type":"text","value":"Configure the New Environment"}]},{"type":"element","tag":"pre","props":{"code":"[root@archlinux ~]# arch-chroot /mnt\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"[root@archlinux ~]# arch-chroot /mnt\n"}]}]},{"type":"element","tag":"pre","props":{"code":"[root@archlinux /]# ln -sf /usr/share/zoneinfo/US/Eastern /etc/localtime\n[root@archlinux /]# hwclock --systohc\n[root@archlinux /]# sed -i 's/#en_US.UTF-8/en_US.UTF-8/' /etc/locale.gen\n[root@archlinux /]# locale-gen\n[root@archlinux /]# echo \"LANG=en_US.UTF-8\" > /etc/locale.conf\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"[root@archlinux /]# ln -sf /usr/share/zoneinfo/US/Eastern /etc/localtime\n[root@archlinux /]# hwclock --systohc\n[root@archlinux /]# sed -i 's/#en_US.UTF-8/en_US.UTF-8/' /etc/locale.gen\n[root@archlinux /]# locale-gen\n[root@archlinux /]# echo \"LANG=en_US.UTF-8\" > /etc/locale.conf\n"}]}]},{"type":"element","tag":"pre","props":{"code":"[root@archlinux /]# hostnamectl set-hostname usb\n[root@archlinux /]# echo \"127.0.0.1 localhost\" >> /etc/hosts\n[root@archlinux /]# echo \"::1 localhost\" >> /etc/hosts\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"[root@archlinux /]# hostnamectl set-hostname usb\n[root@archlinux /]# echo \"127.0.0.1 localhost\" >> /etc/hosts\n[root@archlinux /]# echo \"::1 localhost\" >> /etc/hosts\n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Note, one difference here from a standard installation is that the\n"},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--removable"}]},{"type":"text","value":" flag is specified when installing the GRUB bootloader.\n"},{"type":"element","tag":"sup","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://wiki.archlinux.org/index.php/GRUB#UEFI_systems","rel":["nofollow"]},"children":[{"type":"text","value":"10"}]}]}]},{"type":"element","tag":"pre","props":{"code":"[root@archlinux /]# pacman -S grub\n[root@archlinux /]# grub-install --target=x86_64-efi --efi-directory=/boot/efi --removable --recheck\n[root@usb /]# grub-mkconfig -o /boot/grub/grub.cfg\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"[root@archlinux /]# pacman -S grub\n[root@archlinux /]# grub-install --target=x86_64-efi --efi-directory=/boot/efi --removable --recheck\n[root@usb /]# grub-mkconfig -o /boot/grub/grub.cfg\n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Shutdown the virtual machine, restart the host machine, and boot the newly\ncreated Arch Linux thumb-drive!"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"🎉"}]},{"type":"element","tag":"h2","props":{"id":"side-note"},"children":[{"type":"text","value":"Side-note"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"It was attempted to use the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"controlvm usbattach"}]},{"type":"text","value":" command to pass the USB\ndevice to the guest machine, but this did not work as it expects the virtual\nmachine to already be running, and the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"vb.customize"}]},{"type":"text","value":" option runs prior to\nbooting the machine. "},{"type":"element","tag":"sup","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://www.vagrantup.com/docs/virtualbox/configuration.html#vboxmanage-customizations","rel":["nofollow"]},"children":[{"type":"text","value":"11"}]}]}]},{"type":"element","tag":"pre","props":{"code":"Command: [\"controlvm\", \"060a716b-1965-49e2-bc56-12beed5df716\", \"usbattach36fc9e60-c465-11cf-8056-444553540000\"]\n\nStderr: VBoxManage.exe: error: Machine '060a716b-1965-49e2-bc56-12beed5df716' is not currently running.\n","language":"txt","meta":"","className":"language-txt shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Command: [\"controlvm\", \"060a716b-1965-49e2-bc56-12beed5df716\", \"usbattach36fc9e60-c465-11cf-8056-444553540000\"]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Stderr: VBoxManage.exe: error: Machine '060a716b-1965-49e2-bc56-12beed5df716' is not currently running.\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"references"},"children":[{"type":"text","value":"References"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://docs.docker.com/docker-for-mac/docker-toolbox/","rel":["nofollow"]},"children":[{"type":"text","value":"Docker Desktop on Mac vs. Docker Toolbox"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/moby/hyperkit","rel":["nofollow"]},"children":[{"type":"text","value":"GitHub - HyperKit"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/docker/for-mac/issues/900","rel":["nofollow"]},"children":[{"type":"text","value":"GitHub - Docker for Mac - Issue #900"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://app.vagrantup.com/archlinux/boxes/archlinux","rel":["nofollow"]},"children":[{"type":"text","value":"Vagrant Cloud - Arch Linux"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://antonyjepson.wordpress.com/2012/01/26/quickly-attaching-usb-devices-to-virtualbox-guests-using-vboxmanage/","rel":["nofollow"]},"children":[{"type":"text","value":"Attaching USB Devices to VirtualBox Guests using VBoxManage"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://gist.github.com/dscape/7d829c0c116ef419f963","rel":["nofollow"]},"children":[{"type":"text","value":"GitHub Gist - Vagrant USB Filter"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://wiki.archlinux.org/index.php/EFI_system_partition#Format_the_partition","rel":["nofollow"]},"children":[{"type":"text","value":"Arch Linux Wiki - EFI System Partition - Format Partitions"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://wiki.archlinux.org/index.php/Install_Arch_Linux_on_a_USB_key#Installation_tweaks","rel":["nofollow"]},"children":[{"type":"text","value":"Arch Linux Wiki - Arch Linux on USB - Installation Tweaks"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://wiki.archlinux.org/index.php/Installation_guide","rel":["nofollow"]},"children":[{"type":"text","value":"Arch Linux Wiki - Installation Guide"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://wiki.archlinux.org/index.php/GRUB#UEFI_systems","rel":["nofollow"]},"children":[{"type":"text","value":"Arch Linux Wiki - GRUB - UEFI Systems"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://www.vagrantup.com/docs/virtualbox/configuration.html#vboxmanage-customizations","rel":["nofollow"]},"children":[{"type":"text","value":"Vagrant VBoxManage Customizations "}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"create-an-arch-linux-virtual-machine-with-vagrant","depth":2,"text":"Create an Arch Linux Virtual Machine with Vagrant"},{"id":"install-arch-linux-on-the-usb-drive","depth":2,"text":"Install Arch Linux on the USB Drive","children":[{"id":"partition-the-disk-uefi-with-gpt","depth":3,"text":"Partition the Disk (UEFI with GPT)"},{"id":"format-the-partitions","depth":3,"text":"Format the Partitions"},{"id":"mount-the-partitions-and-bootstrap-the-environment","depth":3,"text":"Mount the Partitions and Bootstrap the Environment"},{"id":"configure-the-new-environment","depth":3,"text":"Configure the New Environment"}]},{"id":"side-note","depth":2,"text":"Side-note"},{"id":"references","depth":2,"text":"References"}]}},"_type":"markdown","_id":"content:articles:persistent-archlinux-usb.md","_source":"content","_file":"articles/persistent-archlinux-usb.md","_extension":"md"},{"_path":"/articles/podcast-transcription-whispercpp","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Easily Transcribe Podcasts with Whisper.cpp","description":"If you've ever had the need to transcribe a podcast, lecture, or some other audio recording, it turns out it's surprisingly easy with the extremely impressive whisper.cpp project. This high-performance fork of OpenAI's Whisper can run on all sorts of hardware -- including my M1 Mac Mini. Let's walk through an example from start-to-finish of transcribing an episode of the Alter Everything podcast.","draft":false,"date":"2024-01-08","tags":["whisper.cpp","ml"],"categories":["programming"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you've ever had the need to transcribe a podcast, lecture, or some other audio recording, it turns out it's surprisingly easy with the extremely impressive "},{"type":"element","tag":"a","props":{"href":"https://github.com/ggerganov/whisper.cpp","rel":["nofollow"]},"children":[{"type":"text","value":"whisper.cpp"}]},{"type":"text","value":" project. This high-performance fork of "},{"type":"element","tag":"a","props":{"href":"https://github.com/openai/whisper","rel":["nofollow"]},"children":[{"type":"text","value":"OpenAI's Whisper"}]},{"type":"text","value":" can run on all sorts of hardware -- including my M1 Mac Mini. Let's walk through an example from start-to-finish of transcribing an episode of the "},{"type":"element","tag":"a","props":{"href":"https://podcasts.apple.com/us/podcast/alter-everything/id1356137854","rel":["nofollow"]},"children":[{"type":"text","value":"Alter Everything"}]},{"type":"text","value":" podcast."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you've ever had the need to transcribe a podcast, lecture, or some other audio recording, it turns out it's surprisingly easy with the extremely impressive "},{"type":"element","tag":"a","props":{"href":"https://github.com/ggerganov/whisper.cpp","rel":["nofollow"]},"children":[{"type":"text","value":"whisper.cpp"}]},{"type":"text","value":" project. This high-performance fork of "},{"type":"element","tag":"a","props":{"href":"https://github.com/openai/whisper","rel":["nofollow"]},"children":[{"type":"text","value":"OpenAI's Whisper"}]},{"type":"text","value":" can run on all sorts of hardware -- including my M1 Mac Mini. Let's walk through an example from start-to-finish of transcribing an episode of the "},{"type":"element","tag":"a","props":{"href":"https://podcasts.apple.com/us/podcast/alter-everything/id1356137854","rel":["nofollow"]},"children":[{"type":"text","value":"Alter Everything"}]},{"type":"text","value":" podcast."}]},{"type":"element","tag":"h2","props":{"id":"obtain-audio-files"},"children":[{"type":"text","value":"Obtain Audio File(s)"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"First, let's get the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"wav"}]},{"type":"text","value":" file from YouTube using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"youtube-dl"}]},{"type":"text","value":" utility. It should be noted that "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"whisper.cpp"}]},{"type":"text","value":" expects "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"wav"}]},{"type":"text","value":" filetypes, and this utility defaults to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"mp3"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"code":" $ youtube-dl \\\n --extract-audio \\\n --audio-format wav \\\n --output podcast.wav \\\n \"https://www.youtube.com/watch?v=CoUN690wSYQ\"\n","language":"sh","meta":"","className":"language-sh shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" $"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" youtube-dl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --extract-audio"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --audio-format"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" wav"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --output"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" podcast.wav"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"https://www.youtube.com/watch?v=CoUN690wSYQ\"\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This file has a 44.1 kHz sample rate, and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"whisper.cpp"}]},{"type":"text","value":" expects 16 kHz, so let's go ahead and convert that."}]},{"type":"element","tag":"pre","props":{"code":" $ file podcast.wav\npodcast.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 44100 Hz\n\n $ ffmpeg -i podcast.wav -ar 16000 podcast-16khz.wav\n\n $ file podcast-16khz.wav\npodcast-16khz.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 16000 Hz\n\n# NOTE: it looks like it's possible to specify this conversion as a post-process as a\n# flag to the `youtube-dl` command -- I will explore this further next time...\n# youtube-dl --extract-audio --audio-quality 0 --audio-format mp3 --postprocessor-args \"-ar 44100\" %dl%\n","language":"sh","meta":"","className":"language-sh shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" $"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" file"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" podcast.wav\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"podcast.wav:"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" RIFF"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 44100 Hz\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" $"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ffmpeg"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -i"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" podcast.wav"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -ar"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 16000"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" podcast-16khz.wav\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" $"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" file"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" podcast-16khz.wav\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"podcast-16khz.wav:"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" RIFF"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 16000 Hz\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# NOTE: it looks like it's possible to specify this conversion as a post-process as a\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# flag to the `youtube-dl` command -- I will explore this further next time...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# youtube-dl --extract-audio --audio-quality 0 --audio-format mp3 --postprocessor-args \"-ar 44100\" %dl%\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"build-whispercpp-transcribe-audio"},"children":[{"type":"text","value":"Build "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"whisper.cpp"}]},{"type":"text","value":" & Transcribe Audio"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Then, let's get the latest version of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"whisper.cpp"}]},{"type":"text","value":", download the English Whisper model, and build the example."}]},{"type":"element","tag":"pre","props":{"code":"# Clone the `whisper.cpp` repository\n $ git clone --depth 1 git@github.com:ggerganov/whisper.cpp && cd whisper.cpp\n\n# Download the English Whisper model in `ggml` format\n $ bash ./models/download-ggml-model.sh base.en\n\n# Build the main example\n $ make\n","language":"sh","meta":"","className":"language-sh shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# Clone the `whisper.cpp` repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" $"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" git"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" clone"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --depth"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" git@github.com:ggerganov/whisper.cpp"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" && "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"cd"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" whisper.cpp\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# Download the English Whisper model in `ggml` format\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" $"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" bash"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ./models/download-ggml-model.sh"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" base.en\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# Build the main example\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" $"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" make\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And finally, let's transcribe that podcast!"}]},{"type":"element","tag":"pre","props":{"code":" $ ./main \\\n -m ~/workspace/whisper.cpp/models/ggml-base.en.bin \\\n -f ~/Downloads/podcast-16khz.wav \\\n --output-vtt \\\n --output-file out\n\n# whisper_print_timings: load time = 114.71 ms\n# whisper_print_timings: fallbacks = 0 p / 0 h\n# whisper_print_timings: mel time = 692.20 ms\n# whisper_print_timings: sample time = 22278.10 ms / 27893 runs ( 0.80 ms per run)\n# whisper_print_timings: encode time = 10000.75 ms / 55 runs ( 181.83 ms per run)\n# whisper_print_timings: decode time = 331.77 ms / 54 runs ( 6.14 ms per run)\n# whisper_print_timings: batchd time = 45236.73 ms / 27566 runs ( 1.64 ms per run)\n# whisper_print_timings: prompt time = 1921.90 ms / 11832 runs ( 0.16 ms per run)\n# whisper_print_timings: total time = 80709.54 ms\n","language":"sh","meta":"","className":"language-sh shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" $"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ./main"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -m"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ~/workspace/whisper.cpp/models/ggml-base.en.bin"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -f"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ~/Downloads/podcast-16khz.wav"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --output-vtt"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --output-file"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" out\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# whisper_print_timings: load time = 114.71 ms\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# whisper_print_timings: fallbacks = 0 p / 0 h\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# whisper_print_timings: mel time = 692.20 ms\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# whisper_print_timings: sample time = 22278.10 ms / 27893 runs ( 0.80 ms per run)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# whisper_print_timings: encode time = 10000.75 ms / 55 runs ( 181.83 ms per run)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# whisper_print_timings: decode time = 331.77 ms / 54 runs ( 6.14 ms per run)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# whisper_print_timings: batchd time = 45236.73 ms / 27566 runs ( 1.64 ms per run)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# whisper_print_timings: prompt time = 1921.90 ms / 11832 runs ( 0.16 ms per run)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# whisper_print_timings: total time = 80709.54 ms\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"A full podcast transcribed in ~80 seconds on an M1 Mac Mini -- not too bad!"}]},{"type":"element","tag":"pre","props":{"code":"# out.vtt\n\n00:00:00.000 --> 00:00:06.480\n >> Hi everyone. We recently launched a short engagement feedback survey for the Alter Everything\n\n00:00:06.480 --> 00:00:11.360\n podcast. Click the link in the episode description wherever you're listening to let us know what\n\n00:00:11.360 --> 00:00:16.320\n you think and help us improve our show.\n\n00:00:16.320 --> 00:00:21.200\n Welcome to Alter Everything, a podcast about data science and analytics culture. I'm Megan\n\n00:00:21.200 --> 00:00:26.440\n Dibble and today I'm talking with Nick Schrock, CTO and founder of Dagster Labs. We discussed\n\n00:00:26.440 --> 00:00:31.560\n data engineering trends, challenges in the field, why he started his company, and what\n\n00:00:31.560 --> 00:00:38.960\n makes him excited about the future of data engineering. Let's get started.\n\n00:00:38.960 --> 00:00:42.720\n >> Hi, Nick. It's great to have you on our show today. Thanks for being here.\n\n00:00:42.720 --> 00:00:43.920\n >> Thanks for having me.\n\n00:00:43.920 --> 00:00:48.280\n >> Yeah. Could you start off by giving an introduction to yourself for our listeners?\n\n00:00:48.280 --> 00:00:52.920\n >> Sure. My name is Nick Schrock. I'm the CTO and founder of Dagster Labs. There's the\n\n00:00:52.920 --> 00:00:59.520\n company behind Dagster, which is a data orchestration framework. Prior to doing this, I was an engineer\n\n00:00:59.520 --> 00:01:05.960\n at Facebook from 2009, 2017. While I was there, I found a team called product infrastructure\n\n00:01:05.960 --> 00:01:09.800\n whose goal was to make our application developers more efficient and productive, and a bunch\n\n00:01:09.800 --> 00:01:13.840\n of open source work came out of that actually, one of which was React, which I had nothing\n\n00:01:13.840 --> 00:01:18.040\n to do with, but actually the CEO of Dagster Labs co-created and I personally co-created\n\n00:01:18.040 --> 00:01:22.640\n GraphQL. So as I like to say, Pete and I were present at the creation of the full hipster\n\n00:01:22.640 --> 00:01:28.680\n stack. I moved on to Facebook in 2017, figuring out what to do next, and this data engineering\n\n00:01:28.680 --> 00:01:32.960\n and data orchestration problem really got me hooked actually quite soon after I left,\n\n00:01:32.960 --> 00:01:36.280\n and the rest is history. I'm sure we'll get into that more.\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"# out.vtt\n\n00:00:00.000 --> 00:00:06.480\n >> Hi everyone. We recently launched a short engagement feedback survey for the Alter Everything\n\n00:00:06.480 --> 00:00:11.360\n podcast. Click the link in the episode description wherever you're listening to let us know what\n\n00:00:11.360 --> 00:00:16.320\n you think and help us improve our show.\n\n00:00:16.320 --> 00:00:21.200\n Welcome to Alter Everything, a podcast about data science and analytics culture. I'm Megan\n\n00:00:21.200 --> 00:00:26.440\n Dibble and today I'm talking with Nick Schrock, CTO and founder of Dagster Labs. We discussed\n\n00:00:26.440 --> 00:00:31.560\n data engineering trends, challenges in the field, why he started his company, and what\n\n00:00:31.560 --> 00:00:38.960\n makes him excited about the future of data engineering. Let's get started.\n\n00:00:38.960 --> 00:00:42.720\n >> Hi, Nick. It's great to have you on our show today. Thanks for being here.\n\n00:00:42.720 --> 00:00:43.920\n >> Thanks for having me.\n\n00:00:43.920 --> 00:00:48.280\n >> Yeah. Could you start off by giving an introduction to yourself for our listeners?\n\n00:00:48.280 --> 00:00:52.920\n >> Sure. My name is Nick Schrock. I'm the CTO and founder of Dagster Labs. There's the\n\n00:00:52.920 --> 00:00:59.520\n company behind Dagster, which is a data orchestration framework. Prior to doing this, I was an engineer\n\n00:00:59.520 --> 00:01:05.960\n at Facebook from 2009, 2017. While I was there, I found a team called product infrastructure\n\n00:01:05.960 --> 00:01:09.800\n whose goal was to make our application developers more efficient and productive, and a bunch\n\n00:01:09.800 --> 00:01:13.840\n of open source work came out of that actually, one of which was React, which I had nothing\n\n00:01:13.840 --> 00:01:18.040\n to do with, but actually the CEO of Dagster Labs co-created and I personally co-created\n\n00:01:18.040 --> 00:01:22.640\n GraphQL. So as I like to say, Pete and I were present at the creation of the full hipster\n\n00:01:22.640 --> 00:01:28.680\n stack. I moved on to Facebook in 2017, figuring out what to do next, and this data engineering\n\n00:01:28.680 --> 00:01:32.960\n and data orchestration problem really got me hooked actually quite soon after I left,\n\n00:01:32.960 --> 00:01:36.280\n and the rest is history. I'm sure we'll get into that more.\n"}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"obtain-audio-files","depth":2,"text":"Obtain Audio File(s)"},{"id":"build-whispercpp-transcribe-audio","depth":2,"text":"Build whisper.cpp & Transcribe Audio"}]}},"_type":"markdown","_id":"content:articles:podcast-transcription-whispercpp.md","_source":"content","_file":"articles/podcast-transcription-whispercpp.md","_extension":"md"},{"_path":"/articles/quick-tip-rerunning-bash-commands","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Tip: Re-running Bash Commands","description":"Do you ever find yourself having to re-run a Bash command? I often find this\nhappening to myself when I neglect to use sudo for a command that requires\nroot privileges.","date":"2021-09-22","draft":false,"tags":["tip","bash"],"categories":["tips"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Do you ever find yourself having to re-run a Bash command? I often find this\nhappening to myself when I neglect to use "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sudo"}]},{"type":"text","value":" for a command that requires\nroot privileges."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Do you ever find yourself having to re-run a Bash command? I often find this\nhappening to myself when I neglect to use "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sudo"}]},{"type":"text","value":" for a command that requires\nroot privileges."}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light","code":"$ pacman -Syu\nerror: you cannot perform this operation unless you are root.\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" pacman"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -Syu\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"error:"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" you"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" cannot"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" perform"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" operation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" unless"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" you"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" are"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" root.\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Well, I have good news for you -- you can easily re-issue a command with the\n"},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"!!"}]},{"type":"text","value":" designator! Simply type "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sudo"}]},{"type":"text","value":" followed by "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"!!"}]},{"type":"text","value":" and you're good to go."}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light","code":"$ sudo !!\nsudo pacman -Syu\n[sudo] password for colton:\n:: Synchronizing package databases...\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" sudo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" !!\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"sudo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" pacman"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -Syu\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[sudo] password "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"for"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" colton:\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" Synchronizing"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" package"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" databases...\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"--"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Commands that are prefixed with a bang, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"!"}]},{"type":"text","value":", are considered "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"Event\nDesignators,"}]},{"type":"text","value":" and are references to your command-line history. You can take a\nlook at your history with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"history"}]},{"type":"text","value":" command."}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light","code":"$ history\n 1021 touch hello_world.txt\n 1022 ls\n 1023 echo \"Here we go again!\"\n 1024 find . -name *.py\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" history\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" 1021"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" touch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" hello_world.txt\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" 1022"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ls\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" 1023"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" echo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"Here we go again!\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" 1024"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" find"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -name"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" *"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":".py\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"There are many ways to use "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"!"}]},{"type":"text","value":" in your shell. For example, if you wanted to\nre-issue a specific command in your history, you could use "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"!n"}]},{"type":"text","value":" where "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"n"}]},{"type":"text","value":" is\nthe number next to the command in your history."}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light","code":"$ !1023\necho \"Here we go again!\"\nHere we go again!\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" !1023\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"echo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"Here we go again!\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"Here"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" we"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" go"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" again!\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Or... if you wanted to run the command you issued 4-commands ago, you can use\n"},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"!-4"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light","code":"$ !-4\nls\nhello_world.txt\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" !-4\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"ls\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"hello_world.txt\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Or... if you wanted to run the last command that started with the string\n"},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"find"}]},{"type":"text","value":", you can use "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"!find"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light","code":"$ !find\nfind . -name *.py\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" !find\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"find"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -name"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" *"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":".py\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Be sure to check out the "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"Event Designators"}]},{"type":"text","value":" section of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"bash"}]},{"type":"text","value":" "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"man"}]},{"type":"text","value":" pages\nfor more information!"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"--"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As an aside, for even faster command-line history navigation, be sure to check\nout the excellent "},{"type":"element","tag":"a","props":{"href":"https://github.com/junegunn/fzf","rel":["nofollow"]},"children":[{"type":"text","value":"fzf"}]},{"type":"text","value":" utility by "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"junegunn."}]},{"type":"text","value":"\nOne of the many features of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fzf"}]},{"type":"text","value":" is browsing and re-issuing commands from your\ncommand-line history with a fuzzy-finder!"}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:articles:quick-tip-rerunning-bash-commands.md","_source":"content","_file":"articles/quick-tip-rerunning-bash-commands.md","_extension":"md"},{"_path":"/articles/reset-ipmi-password-from-host-os","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Reset IPMI Credentials from the Host OS","description":"If you ever find yourself locked out of the Intelligent Platform Management Interface (IPMI) of a server, these\ninstructions will guide your through the process of resetting the credentials to their default values from the host\noperating system.","date":"2021-12-27","tags":["homelab","supermicro","truenas"],"categories":["homelab"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you ever find yourself locked out of the Intelligent Platform Management Interface (IPMI) of a server, these\ninstructions will guide your through the process of resetting the credentials to their default values from the host\noperating system."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you ever find yourself locked out of the Intelligent Platform Management Interface (IPMI) of a server, these\ninstructions will guide your through the process of resetting the credentials to their default values from the host\noperating system."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you are using an operating system like TrueNAS -- good news! It's possible to reset the IPMI password directly from\nthe web interface. This is done by navigating to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Network > IPMI"}]},{"type":"text","value":", and simply entering a new value in the "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"IPMI\nPassword Reset"}]},{"type":"text","value":" field."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you are using some other OS that doesn't have this feature, you can achieve similar results by using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ipmitool"}]},{"type":"text","value":"\ncommand-line utility."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"First, you'll want to determine the user ID associated with the user for whom you'd like to reset the password."}]},{"type":"element","tag":"pre","props":{"code":"# ipmitool user list\nID Name Callin Link Auth IPMI Msg Channel Priv Limit\n1 true false false Unknown (0x00)\n2 ADMIN true false false Unknown (0x00)\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"# ipmitool user list\nID Name Callin Link Auth IPMI Msg Channel Priv Limit\n1 true false false Unknown (0x00)\n2 ADMIN true false false Unknown (0x00)\n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In this case, we will be resetting the password for "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"ADMIN"}]},{"type":"text","value":" who has a user ID of "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":". Then we'll assign the new\npassword like so:"}]},{"type":"element","tag":"pre","props":{"code":"# ipmitool user set password 2 \n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"# ipmitool user set password 2 \n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And you should be good to go!"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"..."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Alternatively, if you'd like to factory reset the baseboard management controller (BMC), which will reset the IPMI\ncredentials to their default value, you can issue the following command."}]},{"type":"element","tag":"pre","props":{"code":"# ipmitool raw 0x3c 0x40\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"# ipmitool raw 0x3c 0x40\n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Where "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"0x3c"}]},{"type":"text","value":" is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":""}]},{"type":"text","value":" argument, a.k.a. the network function code that defines the functional routing for\nmessages, and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"0x40"}]},{"type":"text","value":" is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":""}]},{"type":"text","value":". According to section 5.1 of the "},{"type":"element","tag":"a","props":{"href":"https://www.intel.com/content/dam/www/public/us/en/documents/product-briefs/ipmi-second-gen-interface-spec-v2-rev1-1.pdf","rel":["nofollow"]},"children":[{"type":"text","value":"IPMI interface\nspecification"}]},{"type":"text","value":",\n"},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"netfn"}]},{"type":"text","value":" codes ranging from 0x30 to 0x3F are reserved for vendor specific functions. I searched around for some\nSupermicro references on these vendor specific network functions without much luck other than various "},{"type":"element","tag":"a","props":{"href":"https://www.supermicro.com/support/faqs/faq.cfm?faq=15448","rel":["nofollow"]},"children":[{"type":"text","value":"support\nresponses"}]},{"type":"text","value":" on how to reset a device. Bummer!"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:articles:reset-ipmi-password-from-host-os.md","_source":"content","_file":"articles/reset-ipmi-password-from-host-os.md","_extension":"md"},{"_path":"/articles/ssh-ed25519-sk-yubikey","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Configuring a YubiKey for use with OpenSSH","description":"YubiKey's are a convenient way to introduce a physical form of two factor authentication into ones workflow. They support a variety of protocols, but in this guide we will walk through how to configure a YubiKey for use with OpenSSH via the \"new\" ed25519-sk key type that supports FIDO compliant hardware keys.","draft":false,"date":"2024-06-09","tags":["unix","configurations"],"categories":["tooling","tips"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://www.yubico.com/","rel":["nofollow"]},"children":[{"type":"text","value":"YubiKey's"}]},{"type":"text","value":" are a convenient way to introduce a physical form of two factor authentication into ones workflow. They support a variety of protocols, but in this guide we will walk through how to configure a YubiKey for use with OpenSSH via the \"new\" "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ed25519-sk"}]},{"type":"text","value":" key type that supports FIDO compliant hardware keys."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://www.yubico.com/","rel":["nofollow"]},"children":[{"type":"text","value":"YubiKey's"}]},{"type":"text","value":" are a convenient way to introduce a physical form of two factor authentication into ones workflow. They support a variety of protocols, but in this guide we will walk through how to configure a YubiKey for use with OpenSSH via the \"new\" "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ed25519-sk"}]},{"type":"text","value":" key type that supports FIDO compliant hardware keys."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In "},{"type":"element","tag":"a","props":{"href":"https://www.openssh.com/txt/release-8.2","rel":["nofollow"]},"children":[{"type":"text","value":"release 8.2 of OpenSSH"}]},{"type":"text","value":" support for FIDO devices was added with public key types \"ecdsa-sk\" and \"ed25519-sk\" (-sk standing for \"security key\"). This key type is supported by YubiKey's with firmware version 5.2.3 or higher."}]},{"type":"element","tag":"blockquote","props":{},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This release adds support for FIDO/U2F hardware authenticators to OpenSSH. U2F/FIDO are open standards for inexpensive two-factor authentication hardware that are widely used for website authentication. In OpenSSH FIDO devices are supported by new public key types \"ecdsa-sk\" and \"ed25519-sk\", along with corresponding certificate types."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's get started by installing the latest version of OpenSSH via "},{"type":"element","tag":"a","props":{"href":"https://brew.sh/","rel":["nofollow"]},"children":[{"type":"text","value":"Homebrew"}]},{"type":"text","value":", along with the YubiKey Manager (ykman) CLI. The version of OpenSSH included with macOS is not compatible."}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"$ brew install openssh ykman\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" brew"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" install"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" openssh"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ykman\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Then, let's confirm that our YubiKey has a firmware that is greater than 5.2.3:"}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"$ ykman list\nYubiKey 5Ci (5.4.3) [OTP+FIDO+CCID]\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ykman"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" list\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"YubiKey"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 5Ci"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" (5.4.3) [OTP+FIDO+CCID]\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Next, we'll go ahead and enable a pin on our device via the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"change-pin"}]},{"type":"text","value":" command, as this a requirement for our use."}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"$ ykman fido access change-pin\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ykman"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" fido"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" access"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" change-pin\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And last, we'll generate the key on our device!"}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"$ ssh-keygen -t ed25519-sk -O resident\nGenerating public/private ed25519-sk key pair.\nYou may need to touch your authenticator to authorize key generation.\n...\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ssh-keygen"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -t"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ed25519-sk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -O"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" resident\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"Generating"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" public/private"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ed25519-sk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" key"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" pair.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"You"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" may"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" need"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" to"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" touch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" your"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" authenticator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" to"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" authorize"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" key"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" generation.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"...\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We specify "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"resident"}]},{"type":"text","value":" to indicate that the key handle is to be stored on the YubiKey itself, since we will be using this device with multiple computers."}]},{"type":"element","tag":"pre","props":{"className":"language-txt shiki shiki-themes github-light","code":"resident\n Indicate that the key handle should be stored on the FIDO\n authenticator itself. This makes it easier to use the\n authenticator on multiple computers. Resident keys may be\n supported on FIDO2 authenticators and typically require that a PIN\n be set on the authenticator prior to generation. Resident keys\n may be loaded off the authenticator using ssh-add(1). Storing\n both parts of a key on a FIDO authenticator increases the\n likelihood of an attacker being able to use a stolen authenticator\n device.\n","language":"txt","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"resident\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" Indicate that the key handle should be stored on the FIDO\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" authenticator itself. This makes it easier to use the\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" authenticator on multiple computers. Resident keys may be\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" supported on FIDO2 authenticators and typically require that a PIN\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" be set on the authenticator prior to generation. Resident keys\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" may be loaded off the authenticator using ssh-add(1). Storing\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" both parts of a key on a FIDO authenticator increases the\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" likelihood of an attacker being able to use a stolen authenticator\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" device.\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And that's all it takes -- simple enough. Now, when interacting with "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"ssh"}]},{"type":"text","value":" or "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"git"}]},{"type":"text","value":" you will be prompted to touch the YubiKey to bring that little bit of physical 2FA."}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:articles:ssh-ed25519-sk-yubikey.md","_source":"content","_file":"articles/ssh-ed25519-sk-yubikey.md","_extension":"md"},{"_path":"/articles/unit-testing-micropython-with-mocks","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Unit Testing in MicroPython with Mocks","description":"Unit testing code for embedded systems can be challenging. While it's possible\nto leverage emulators, write side-effect free code, or run tests on the\nhardware itself, it's often easiest to unit test the code on your personal\ncomputer with mocked hardware functionality.","date":"2020-02-07","draft":false,"tags":["micropython","testing","mocks","tutorial"],"categories":["python","embedded"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Unit testing code for embedded systems can be challenging. While it's possible\nto leverage emulators, write side-effect free code, or run tests on the\nhardware itself, it's often easiest to unit test the code on your personal\ncomputer with mocked hardware functionality."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Unit testing code for embedded systems can be challenging. While it's possible\nto leverage emulators, write side-effect free code, or run tests on the\nhardware itself, it's often easiest to unit test the code on your personal\ncomputer with mocked hardware functionality."}]},{"type":"element","tag":"h1","props":{"id":"mocking"},"children":[{"type":"text","value":"Mocking"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Mocks allow us to replace the hardware interfacing functionality under-the-hood\nwith predefined results and side-effects. For example, if there is a piece of\nlogic that retrieves values from an accelerometer to get a device's\norientation, it would be possible to mock the returned values of the\naccelerometer -- allowing us to run the unit tests on a device that does not\nhave an accelerometer sensor installed."}]},{"type":"element","tag":"h1","props":{"id":"a-micropython-mocking-example"},"children":[{"type":"text","value":"A MicroPython Mocking Example"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In this example, we will be unit testing a module named "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"time_logger"}]},{"type":"text","value":", that\ndepends on the MicroPython library "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"utime"}]},{"type":"text","value":" to log the most recent Epoch time to\na file."}]},{"type":"element","tag":"pre","props":{"className":"language-python shiki shiki-themes github-light","code":"# time_logger.py\n\nclass TimeLogger(object):\n\n def save_time(self):\n \"\"\" Overwrite a file with the most recent Epoch timestamp from `utime`\n \"\"\"\n with open(\"LAST_KNOWN_TIME\", \"w+\") as f:\n f.write(str(utime.time()))\n","language":"python","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# time_logger.py\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" TimeLogger"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"object"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"):\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" def"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" save_time"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(self):\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"\"\" Overwrite a file with the most recent Epoch timestamp from `utime`\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"\"\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" with"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" open"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"LAST_KNOWN_TIME\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"w+\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" f:\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" f.write("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"str"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(utime.time()))\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"First, because the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"utime"}]},{"type":"text","value":" module is not installed on the machine that the unit\ntests on, we must mock "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"utime"}]},{"type":"text","value":" module before importing "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"time_logger"}]},{"type":"text","value":" in our\nunit test file."}]},{"type":"element","tag":"pre","props":{"className":"language-python shiki shiki-themes github-light","code":"# test_time_logger.py\n\nimport unittest\n\nfrom unittest.mock import MagicMock\n\nsys.modules['utime'] = MagicMock()\nfrom time_logger import TimeLogger\n","language":"python","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# test_time_logger.py\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" unittest\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" unittest.mock "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" MagicMock\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"sys.modules["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"'utime'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"] "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" MagicMock()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" time_logger "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" TimeLogger\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Then, we can write a test that patches the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"utime.time"}]},{"type":"text","value":" functionality so that\nit returns a value of our choosing -- in this case, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"1234"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"className":"language-python shiki shiki-themes github-light","code":"class TestTimeLogger(unittest.TestCase):\n\n def test_save_time(self):\n \"\"\" Verify that the Epoch time is written to file\n \"\"\"\n with unittest.mock.patch(\"utime.time\", return_value=1234):\n t = TimeLogger()\n t.save_time()\n with open(\"LAST_KNOWN_TIME\") as f:\n self.assertEqual(\"1234\", f.read())\n","language":"python","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" TestTimeLogger"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"unittest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"TestCase"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"):\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" def"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" test_save_time"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(self):\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"\"\" Verify that the Epoch time is written to file\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"\"\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" with"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" unittest.mock.patch("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"utime.time\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E36209"},"children":[{"type":"text","value":"return_value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"1234"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"):\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" t "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" TimeLogger()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" t.save_time()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" with"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" open"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"LAST_KNOWN_TIME\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" f:\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" self"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":".assertEqual("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"1234\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", f.read())\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now, when the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"save_time"}]},{"type":"text","value":" method gets the latest time from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"utime.time()"}]},{"type":"text","value":", the\nvalue will be patched to return "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"1234"}]},{"type":"text","value":". That value will be written to a file,\nand our unit test will pass!"}]},{"type":"element","tag":"h2","props":{"id":"references"},"children":[{"type":"text","value":"References"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://docs.python.org/3/library/unittest.html","rel":["nofollow"]},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"unittest"}]},{"type":"text","value":" — Unit testing framework"}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"references","depth":2,"text":"References"}]}},"_type":"markdown","_id":"content:articles:unit-testing-micropython-with-mocks.md","_source":"content","_file":"articles/unit-testing-micropython-with-mocks.md","_extension":"md"},{"_path":"/articles/vim-fugitive-gpg-pinentry","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Using pinentry-mac to sign commits from vim-fugitive","description":"In order to sign git commits from within Vim using a plugin like tpope/vim-fugitive, it is necessary to configure the gpg-agent to use a GUI based pinentry-program.","draft":false,"date":"2024-05-11","tags":["vim","tip"],"categories":["tooling","tips"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In order to sign git commits from within Vim using a plugin like "},{"type":"element","tag":"a","props":{"href":"https://github.com/tpope/vim-fugitive","rel":["nofollow"]},"children":[{"type":"text","value":"tpope/vim-fugitive"}]},{"type":"text","value":", it is necessary to configure the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"gpg-agent"}]},{"type":"text","value":" to use a GUI based "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"pinentry-program"}]},{"type":"text","value":"."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In order to sign git commits from within Vim using a plugin like "},{"type":"element","tag":"a","props":{"href":"https://github.com/tpope/vim-fugitive","rel":["nofollow"]},"children":[{"type":"text","value":"tpope/vim-fugitive"}]},{"type":"text","value":", it is necessary to configure the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"gpg-agent"}]},{"type":"text","value":" to use a GUI based "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"pinentry-program"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"preface"},"children":[{"type":"text","value":"Preface"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The man, the myth, the legend, Timothy Popallopollis himself "},{"type":"element","tag":"a","props":{"href":"https://github.com/tpope/vim-fugitive/issues/846#issuecomment-253816577","rel":["nofollow"]},"children":[{"type":"text","value":"recommends"}]},{"type":"text","value":" configuring your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"gpg-agent"}]},{"type":"text","value":" to use a GUI based "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"pinentry-program"}]},{"type":"text","value":". On macOS this can be done quite by simply installing "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"pinentry-mac"}]},{"type":"text","value":", and updating your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"gpg-agent.conf"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"configuration"},"children":[{"type":"text","value":"Configuration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"First things first, let's install the pinentry program."}]},{"type":"element","tag":"pre","props":{"code":"$ brew install pinentry-mac\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" brew"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" install"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" pinentry-mac\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Then, all we need to do is set the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"pinentry-program"}]},{"type":"text","value":" option in your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"~/.gnupg/gpg-agent.conf"}]},{"type":"text","value":" file."}]},{"type":"element","tag":"pre","props":{"code":"default-cache-ttl 600\nmax-cache-ttl 7200\npinentry-program /opt/homebrew/bin/pinentry-mac\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"default-cache-ttl 600\nmax-cache-ttl 7200\npinentry-program /opt/homebrew/bin/pinentry-mac\n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If your don't know the path to your pinentry program, you can throw down a quick "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"which"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"code":"$ which pinentry-mac\n/opt/homebrew/bin/pinentry-mac\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" which"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" pinentry-mac\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"/opt/homebrew/bin/pinentry-mac\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Or use your Homebrew prefix."}]},{"type":"element","tag":"pre","props":{"code":"$ echo $(brew --prefix)/bin/pinentry-mac\n/opt/homebrew/bin/pinentry-mac\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" echo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" $("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"brew"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --prefix"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":")/bin/pinentry-mac\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"/opt/homebrew/bin/pinentry-mac\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"But that's all it takes. Now, you should be prompted to enter your gpg pin in an external window when signing commits from vim."}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"preface","depth":2,"text":"Preface"},{"id":"configuration","depth":2,"text":"Configuration"}]}},"_type":"markdown","_id":"content:articles:vim-fugitive-gpg-pinentry.md","_source":"content","_file":"articles/vim-fugitive-gpg-pinentry.md","_extension":"md"}],"navigation":[{"title":"Articles","_path":"/articles","children":[{"title":"Upgrading the Firmware on the PCEngines APU2","_path":"/articles/apu2-firmware-upgrade"},{"title":"Docker Volume Permissions with SELinux","_path":"/articles/docker-selinux-volumes"},{"title":"Exploring the Digital Ocean `doctl` Utility","_path":"/articles/doctl"},{"title":"Impressions of Fennel with Hammerspoon","_path":"/articles/fennel-initial-exploration"},{"title":"Migrate to TrueNAS Scale from TrueNAS Core","_path":"/articles/migrate-truenas-from-core-to-scale"},{"title":"How To Add an RSS Feed to a Nuxt Website","_path":"/articles/nuxt-content-rss-feed"},{"title":"This Website Has Been Migrated to Nuxt 3 🎉","_path":"/articles/nuxt-v3-migration"},{"title":"Create a Persistent Arch Linux Bootable USB with Vagrant","_path":"/articles/persistent-archlinux-usb"},{"title":"Easily Transcribe Podcasts with Whisper.cpp","_path":"/articles/podcast-transcription-whispercpp"},{"title":"Tip: Re-running Bash Commands","_path":"/articles/quick-tip-rerunning-bash-commands"},{"title":"Reset IPMI Credentials from the Host OS","_path":"/articles/reset-ipmi-password-from-host-os"},{"title":"Configuring a YubiKey for use with OpenSSH","_path":"/articles/ssh-ed25519-sk-yubikey"},{"title":"Unit Testing in MicroPython with Mocks","_path":"/articles/unit-testing-micropython-with-mocks"},{"title":"Using pinentry-mac to sign commits from vim-fugitive","_path":"/articles/vim-fugitive-gpg-pinentry"}]}]} \ No newline at end of file +{"generatedAt":1718681824078,"generateTime":548,"contents":[{"_path":"/articles/apu2-firmware-upgrade","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Upgrading the Firmware on the PCEngines APU2","description":"I've had a PCEngines APU2 gathering dust for a\nfew years, and have recently decided to dust it off.","date":"2019-12-21","draft":false,"tags":["pcengine","apu"],"categories":["linux"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I've had a "},{"type":"element","tag":"a","props":{"href":"https://pcengines.ch/apu2.htm","rel":["nofollow"]},"children":[{"type":"text","value":"PCEngines APU2"}]},{"type":"text","value":" gathering dust for a\nfew years, and have recently decided to dust it off."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Since the last time the device has been powered on, there have been many great\nimprovements to the firmware, and it was very-much due for an upgrade. The\nfollowing steps outline how the firmware was upgraded on the APU from the\nalready-installed operating system -- CentOS."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I've had a "},{"type":"element","tag":"a","props":{"href":"https://pcengines.ch/apu2.htm","rel":["nofollow"]},"children":[{"type":"text","value":"PCEngines APU2"}]},{"type":"text","value":" gathering dust for a\nfew years, and have recently decided to dust it off."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Since the last time the device has been powered on, there have been many great\nimprovements to the firmware, and it was very-much due for an upgrade. The\nfollowing steps outline how the firmware was upgraded on the APU from the\nalready-installed operating system -- CentOS."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"First, we will connect to the device over the serial port"}]},{"type":"element","tag":"pre","props":{"code":"screen /dev/tty.usbserial 115200\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"screen /dev/tty.usbserial 115200\n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Then, we will install the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"flashrom"}]},{"type":"text","value":" utility that is needed to update the\nfirmware. Because it is not available in the default "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"yum"}]},{"type":"text","value":" repositories, we\nwill enable the "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"Extra Packages for Enterprise Linux"}]},{"type":"text","value":" (EPEL) repository before\ninstallation."}]},{"type":"element","tag":"pre","props":{"code":"sudo yum install epel-release\nsudo yum install flashrom\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"sudo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" yum"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" install"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" epel-release\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"sudo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" yum"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" install"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" flashrom\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Next, we will download the latest version of the firmware that is compatible\nwith the APU2 device from the PC Engines release website:\n"},{"type":"element","tag":"a","props":{"href":"https://pcengines.github.io/","rel":["nofollow"]},"children":[{"type":"text","value":"https://pcengines.github.io/"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"code":"curl -O https://3mdeb.com/open-source-firmware/pcengines/apu2/apu2_v4.11.0.1.rom\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"curl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -O"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" https://3mdeb.com/open-source-firmware/pcengines/apu2/apu2_v4.11.0.1.rom\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And finally, we will flash the firmware..."}]},{"type":"element","tag":"pre","props":{"code":"sudo flashrom -w apu2_v4.11.0.1.rom -p internal:boardmismatch=force\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"sudo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" flashrom"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -w"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" apu2_v4.11.0.1.rom"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -p"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" internal:boardmismatch=force\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"References:"}]}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://pcengines.ch/apu2.htm","rel":["nofollow"]},"children":[{"type":"text","value":"https://pcengines.ch/apu2.htm"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://pcengines.github.io/","rel":["nofollow"]},"children":[{"type":"text","value":"https://pcengines.github.io/"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/pcengines/apu2-documentation/blob/master/docs/firmware_flashing.md","rel":["nofollow"]},"children":[{"type":"text","value":"https://github.com/pcengines/apu2-documentation/blob/master/docs/firmware_flashing.md"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/pcengines/apu2-documentation/blob/master/docs/cold_reset.md","rel":["nofollow"]},"children":[{"type":"text","value":"https://github.com/pcengines/apu2-documentation/blob/master/docs/cold_reset.md"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/elad/openbsd-apu2","rel":["nofollow"]},"children":[{"type":"text","value":"https://github.com/elad/openbsd-apu2"}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:articles:apu2-firmware-upgrade.md","_source":"content","_file":"articles/apu2-firmware-upgrade.md","_extension":"md"},{"_path":"/articles/docker-selinux-volumes","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Docker Volume Permissions with SELinux","description":"Unfamiliar with running Docker on a SELinux enabled system, I found myself\nrunning into a bunch of file permission errors while creating volumes.","date":"2019-12-26","draft":false,"tags":["docker","selinux"],"categories":["linux"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Unfamiliar with running Docker on a SELinux enabled system, I found myself\nrunning into a bunch of file permission errors while creating volumes."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Unfamiliar with running Docker on a SELinux enabled system, I found myself\nrunning into a bunch of file permission errors while creating volumes."}]},{"type":"element","tag":"pre","props":{"code":"mkdir: can't create directory '/data': Permission denied\n","language":"txt","meta":"","className":"language-txt shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"mkdir: can't create directory '/data': Permission denied\n"}]}]}]}]},{"type":"element","tag":"hr","props":{},"children":[]},{"type":"element","tag":"pre","props":{"code":"$ docker info --format '{{json .SecurityOptions}}'\n[\n \"name=seccomp,profile=/etc/docker/seccomp.json\",\n \"name=selinux\"\n]\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" docker"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" info"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --format"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" '{{json .SecurityOptions}}'\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"name=seccomp,profile=/etc/docker/seccomp.json\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"name=selinux\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"It turns out that this can be resolved by appending the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":":z"}]},{"type":"text","value":" flag to the volume\nmappings in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"docker-compose.yml"}]},{"type":"text","value":" file, indicating that the volume content\nis shared."}]},{"type":"element","tag":"pre","props":{"code":"services:\n server:\n volumes:\n - ./data:/data:z\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"services:\n server:\n volumes:\n - ./data:/data:z\n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"From the Docker documentation:"}]},{"type":"element","tag":"blockquote","props":{},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"z"}]},{"type":"text","value":" option tells Docker that two containers share the volume content. As\na result, Docker labels the content with a shared content label. Shared\nvolume labels allow all containers to read/write content."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"strong","props":{},"children":[{"type":"text","value":"References"}]}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://docs.docker.com/engine/reference/commandline/info/","rel":["nofollow"]},"children":[{"type":"text","value":"Docker Docs: Docker Info"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container---volumes-from","rel":["nofollow"]},"children":[{"type":"text","value":"Docker Docs: Mounting Volumes"}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:articles:docker-selinux-volumes.md","_source":"content","_file":"articles/docker-selinux-volumes.md","_extension":"md"},{"_path":"/articles/doctl","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Exploring the Digital Ocean `doctl` Utility","description":"I recently had the need to spool up a small ephemeral Linux instance, and wanted to try something new by exploring the Digital Ocean doctl command line utility.\nThis proved to be an extremely easy way to configure, create, connect, and destroy a Linux box, and I foresee myself using this service even more in the future.","date":"2023-01-01","tags":["linux","digital-ocean"],"categories":["linux"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I recently had the need to spool up a small ephemeral Linux instance, and wanted to try something new by exploring the Digital Ocean "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"doctl"}]},{"type":"text","value":" command line utility.\nThis proved to be an "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"extremely"}]},{"type":"text","value":" easy way to configure, create, connect, and destroy a Linux box, and I foresee myself using this service even more in the future."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I recently had the need to spool up a small ephemeral Linux instance, and wanted to try something new by exploring the Digital Ocean "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"doctl"}]},{"type":"text","value":" command line utility.\nThis proved to be an "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"extremely"}]},{"type":"text","value":" easy way to configure, create, connect, and destroy a Linux box, and I foresee myself using this service even more in the future."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To start things off, I had to install and setup authentication to Digital Ocean. Doing\nthis on my Mac machine, I opted to use "},{"type":"element","tag":"a","props":{"href":"https://brew.sh/","rel":["nofollow"]},"children":[{"type":"text","value":"Homebrew"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"# install `doctl`\nbrew install doctl\n\n# setup authentication\ndoctl auth init\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# install `doctl`\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"brew"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" install"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" doctl\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# setup authentication\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"doctl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" auth"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" init\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"While the online "},{"type":"element","tag":"a","props":{"href":"https://docs.digitalocean.com/reference/doctl/reference/compute/droplet/create/","rel":["nofollow"]},"children":[{"type":"text","value":"documentation"}]},{"type":"text","value":" is fantastic, I instead found myself mostly referencing the outputs of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--help"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"doctl compute droplet create --help\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"doctl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" compute"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" droplet"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" create"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --help\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I had to find the image name of the version of Ubuntu I wanted to install:"}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"doctl compute image list --public | grep ubuntu-22\n\n# 118857366 22.04 (LTS) x64 snapshot Ubuntu ubuntu-22-04-x64 true 7\n# 119383150 22.10 x64 snapshot Ubuntu ubuntu-22-10-x64 true 7\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"doctl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" compute"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" image"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" list"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --public"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" |"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" grep"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ubuntu-22\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# 118857366 22.04 (LTS) x64 snapshot Ubuntu ubuntu-22-04-x64 true 7\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# 119383150 22.10 x64 snapshot Ubuntu ubuntu-22-10-x64 true 7\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And also the slug of the compute size:"}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"doctl compute size list\n\n# Slug Description Memory VCPUs Disk Price Monthly Price Hourly\n# s-1vcpu-512mb-10gb Basic 512 1 10 4.00 0.005950\n# s-1vcpu-1gb Basic 1024 1 25 6.00 0.008930\n# s-1vcpu-1gb-amd Basic AMD 1024 1 25 7.00 0.010420\n# s-1vcpu-1gb-intel Basic Intel 1024 1 25 7.00 0.010420\n# s-1vcpu-2gb Basic 2048 1 50 12.00 0.017860\n# s-1vcpu-2gb-amd Basic AMD 2048 1 50 14.00 0.020830\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"doctl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" compute"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" size"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" list\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# Slug Description Memory VCPUs Disk Price Monthly Price Hourly\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# s-1vcpu-512mb-10gb Basic 512 1 10 4.00 0.005950\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# s-1vcpu-1gb Basic 1024 1 25 6.00 0.008930\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# s-1vcpu-1gb-amd Basic AMD 1024 1 25 7.00 0.010420\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# s-1vcpu-1gb-intel Basic Intel 1024 1 25 7.00 0.010420\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# s-1vcpu-2gb Basic 2048 1 50 12.00 0.017860\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# s-1vcpu-2gb-amd Basic AMD 2048 1 50 14.00 0.020830\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"I've also configured a few SSH keys with Digital Ocean, and I can have the key (specified by ID) provisioned to the machine using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--ssh-keys"}]},{"type":"text","value":" flag."}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"doctl compute ssh-key list\n\n# ID Name FingerPrint\n# 1234 mini \n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"doctl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" compute"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ssh-key"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" list\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# ID Name FingerPrint\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# 1234 mini \n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Also, I wanted to install a few packages to the box upon creation, this can be done easily with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--user-data-file"}]},{"type":"text","value":" flag to run an initialization script."}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"echo 'apt install -y imagemagick zip' > bootstrap.sh\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"echo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 'apt install -y imagemagick zip'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" >"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" bootstrap.sh\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Putting it all together, here is the simple command for creating a small compute instance!"}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"doctl compute droplet create \\\n --image ubuntu-22-10-x64 \\\n --size s-1vcpu-512mb-10gb \\\n --region nyc1 \\\n --ssh-keys 1234 \\\n --user-data-file boostrap.sh \\\n ephemeral\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"doctl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" compute"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" droplet"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" create"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --image"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ubuntu-22-10-x64"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --size"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" s-1vcpu-512mb-10gb"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --region"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" nyc1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --ssh-keys"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 1234"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --user-data-file"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" boostrap.sh"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ephemeral\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Finally, I can connect, do my thing, and destroy the instance."}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"doctl compute ssh ephemeral\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"doctl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" compute"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ssh"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ephemeral\n"}]}]}]}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"doctl compute droplet delete --force ephemeral\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"doctl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" compute"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" droplet"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" delete"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --force"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ephemeral\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"All-in-all, I was up and running in about 20 minutes. What a handy utility!"}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:articles:doctl.md","_source":"content","_file":"articles/doctl.md","_extension":"md"},{"_path":"/articles/fennel-initial-exploration","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Impressions of Fennel with Hammerspoon","description":"A while back I read an introductory book on Lisp programming titled, \"The Little\nSchemer\". This book opened my mind to new (to me) programming paradigms, and left me\nwith a strong desire to find a way to incorporate Lisp programming into my every day\nlife. It took some time, but I believe I've found what I've been looking for: Fennel.","draft":false,"date":"2023-10-22","tags":["lisp","hammerspoon","fennel"],"categories":["lisp"],"cover_image":"/images/dall-e-fennel-hammer.jpeg","excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"A while back I read an introductory book on Lisp programming titled, \"The Little\nSchemer\". This book opened my mind to new (to me) programming paradigms, and left me\nwith a strong desire to find a way to incorporate Lisp programming into my every day\nlife. It took some time, but I believe I've found what I've been looking for: Fennel."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"A while back I read an introductory book on Lisp programming titled, \"The Little\nSchemer\". This book opened my mind to new (to me) programming paradigms, and left me\nwith a strong desire to find a way to incorporate Lisp programming into my every day\nlife. It took some time, but I believe I've found what I've been looking for: Fennel."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"a","props":{"href":"https://fennel-lang.org/","rel":["nofollow"]},"children":[{"type":"text","value":"Fennel"}]},{"type":"text","value":" programming language is a dialect of Lisp that boasts compatibility with\nLua, and it just so happens that two of my favorite applications are configured with\nexactly that language: "},{"type":"element","tag":"a","props":{"href":"https://www.hammerspoon.org/","rel":["nofollow"]},"children":[{"type":"text","value":"Hammerspoon"}]},{"type":"text","value":", and "},{"type":"element","tag":"a","props":{"href":"https://neovim.io/","rel":["nofollow"]},"children":[{"type":"text","value":"Neovim"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"initial-observations"},"children":[{"type":"text","value":"Initial Observations"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"To initially explore Fennel, I wanted to start small. My Hammerspoon configuration\nconsists of 7 "},{"type":"element","tag":"a","props":{"href":"https://github.com/cmpadden/dotfiles/tree/795749fa17e1310bb001bb7deaa22be8689f0027/hammerspoon/.hammerspoon/modules","rel":["nofollow"]},"children":[{"type":"text","value":"modules"}]},{"type":"text","value":" that I use for operations such as: launching applications,\nmanaging windows, keeping my computer from going to sleep, and general operating system\nautomation. So the plan is to translate these modules into Fennel, while maintaining\nwithout breaking the existing functionality. However, at this point, I wasn't even sure\nhow to embed Fennel into my project..."}]},{"type":"element","tag":"h2","props":{"id":"integrating-fennel-with-hammerspoon"},"children":[{"type":"text","value":"Integrating Fennel with Hammerspoon"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"While official documentation exists describing how to "},{"type":"element","tag":"a","props":{"href":"https://fennel-lang.org/setup#embedding-fennel","rel":["nofollow"]},"children":[{"type":"text","value":"embed fennel"}]},{"type":"text","value":" into your\nproject; it didn't provide me with enough clarity to know my next steps on integrating\nit with Hammerspoon. I found a few resources online demonstrating how to extend the\n"},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"package.path"}]},{"type":"text","value":" and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"package.cpath"}]},{"type":"text","value":" properties in Lua, but I was unable to get this to\nwork."}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://blog.exupero.org/hammerspoon-with-fennel/","rel":["nofollow"]},"children":[{"type":"text","value":"https://blog.exupero.org/hammerspoon-with-fennel/"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/Hammerspoon/hammerspoon/issues/2377#issuecomment-636331435","rel":["nofollow"]},"children":[{"type":"text","value":"https://github.com/Hammerspoon/hammerspoon/issues/2377#issuecomment-636331435"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/agzam/spacehammer/blob/master/init.lua","rel":["nofollow"]},"children":[{"type":"text","value":"https://github.com/agzam/spacehammer/blob/master/init.lua"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Ultimately, I opted to include the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fennel.lua"}]},{"type":"text","value":" file to my Hammerspoon configuration,\nand while not ideal, it does make the configuration nicely self-contained. I'll leave it\nas a future task to include the module installed with LuaRocks."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"With Fennel now included in my Hammerspoon configuration, all I need to do is configure\nthe "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fennel.path"}]},{"type":"text","value":" to point to the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"*.fnl"}]},{"type":"text","value":" files in the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":".hammerspoon/"}]},{"type":"text","value":" directory, and\nttranslating these modules can begin!"}]},{"type":"element","tag":"pre","props":{"className":"language-lua shiki shiki-themes github-light","code":"-- init.lua\n\nlocal fennel = require('fennel')\n\nfennel.path = package.path .. \";\" .. os.getenv(\"HOME\") .. \"/.hammerspoon/?.fnl\"\n\ntable.insert(package.loaders or package.searchers, fennel.searcher)\n\nrequire 'main'\n","language":"lua","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"-- init.lua\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"local"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" fennel "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" require"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"'fennel'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"fennel."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"path"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" package.path"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" .."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \";\" "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":".."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" os.getenv"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"HOME\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":".."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"/.hammerspoon/?.fnl\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"table.insert"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"package.loaders"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" or"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" package.searchers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", fennel."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"searcher"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"require"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 'main'\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"translating-lua-to-fennel"},"children":[{"type":"text","value":"Translating Lua to Fennel"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As a Fennel novice, I was happy to see that the Fennel project provides an online\ncross-compiler for Lua and Fennel called "},{"type":"element","tag":"a","props":{"href":"https://fennel-lang.org/see","rel":["nofollow"]},"children":[{"type":"text","value":"anti-fennel"}]},{"type":"text","value":", and while it can generate some\nstrange-looking Fennel code, it was an extremely useful tool for me to get\nup-and-running right away. For example, by pasting the simple "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sleep"}]},{"type":"text","value":" function\nfrom the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"helpers"}]},{"type":"text","value":" module into the compiler:"}]},{"type":"element","tag":"pre","props":{"className":"language-lua shiki shiki-themes github-light","code":"function sleep(ms)\n os.execute(\"sleep \" .. tonumber(ms) / 1000)\nend\n","language":"lua","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" sleep"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(ms)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" os.execute"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"sleep \" "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":".."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" tonumber"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(ms) "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"/"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 1000"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"end\n"}]}]}]}]},{"type":"element","tag":"pre","props":{"className":"language-lisp shiki shiki-themes github-light","code":"(fn sleep [ms]\n (os.execute (.. \"sleep \" (/ (tonumber ms) 1000))))\n","language":"lisp","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(fn sleep [ms]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" (os.execute (.. "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"sleep \""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"/"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" (tonumber ms) "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"1000"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"))))\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As another example, here is the output for my "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"caffeine"}]},{"type":"text","value":" toggle:"}]},{"type":"element","tag":"pre","props":{"className":"language-lua shiki shiki-themes github-light","code":"hs.hotkey.bind(HYPER, \"0\", function()\n hs.caffeinate.toggle(\"displayIdle\")\n if hs.caffeinate.get(\"displayIdle\") then\n helpers:show(\"Caffeine Enabled\", nil, helpers.styles.success, helpers.assets.check)\n else\n helpers:show(\"Caffeine Disabled\", nil, helpers.styles.error, helpers.assets.ban)\n end\nend)\n","language":"lua","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"hs."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"hotkey"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"bind"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(HYPER, "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"0\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"function"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" hs."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"caffeinate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"toggle"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"displayIdle\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" hs."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"caffeinate"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"get"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"displayIdle\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"then\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" helpers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"show"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"Caffeine Enabled\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"nil"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", helpers."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"styles"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"success"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", helpers."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"assets"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"check"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" else\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" helpers"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"show"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"Caffeine Disabled\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"nil"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", helpers."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"styles"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"error"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", helpers."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"assets"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"ban"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" end\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"end"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":")\n"}]}]}]}]},{"type":"element","tag":"pre","props":{"className":"language-lisp shiki shiki-themes github-light","code":"(hs.hotkey.bind HYPER :0\n (fn [] (hs.caffeinate.toggle :displayIdle)\n (if (hs.caffeinate.get :displayIdle)\n (helpers:show \"Caffeine Enabled\" nil helpers.styles.success helpers.assets.check)\n (helpers:show \"Caffeine Disabled\" nil helpers.styles.error helpers.assets.ban)))) \n","language":"lisp","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(hs.hotkey.bind HYPER "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":":0\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" (fn [] (hs.caffeinate.toggle "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":":displayIdle"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"if"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" (hs.caffeinate.get "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":":displayIdle"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":")\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" (helpers:show "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"Caffeine Enabled\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" nil"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" helpers.styles.success helpers.assets.check)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" (helpers:show "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"Caffeine Disabled\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" nil"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" helpers.styles.error helpers.assets.ban))))\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This was especially helpful for more gnarly modules like the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"window"}]},{"type":"text","value":" module used for\nwindow management, and seeing the Lua and Fennel code side-by-side was a kick starter in\nlearning the language!"}]},{"type":"element","tag":"h2","props":{"id":"next-steps"},"children":[{"type":"text","value":"Next Steps"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"While my Fennel Hammerspoon configuration now works with parity to its Lua counterpart,\nI have not yet added new features or modules. I look forward to writing new Fennel code,\nand deepen my understanding of Lisp and the Fennel programming language."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Additionally, before beginning this endeavor, I was already aware of projects like\n"},{"type":"element","tag":"a","props":{"href":"https://github.com/agzam/spacehammer","rel":["nofollow"]},"children":[{"type":"text","value":"spacehammer"}]},{"type":"text","value":"; a wildly impressive Hammerspoon configuration written in Fennel, but,\nI wanted to start small and learn the integration myself. However, with the basics out\nof the way, I hope to explore this project further, and seek lessons-learned for the\nconfiguration of my own."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The full pull-request for translating my Lua Hammerspoon configuration to Fennel can be\nfound here: "},{"type":"element","tag":"a","props":{"href":"https://github.com/cmpadden/dotfiles/pull/19/files","rel":["nofollow"]},"children":[{"type":"text","value":"https://github.com/cmpadden/dotfiles/pull/19/files"}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"initial-observations","depth":2,"text":"Initial Observations"},{"id":"integrating-fennel-with-hammerspoon","depth":2,"text":"Integrating Fennel with Hammerspoon"},{"id":"translating-lua-to-fennel","depth":2,"text":"Translating Lua to Fennel"},{"id":"next-steps","depth":2,"text":"Next Steps"}]}},"_type":"markdown","_id":"content:articles:fennel-initial-exploration.md","_source":"content","_file":"articles/fennel-initial-exploration.md","_extension":"md"},{"_path":"/articles/migrate-truenas-from-core-to-scale","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Migrate to TrueNAS Scale from TrueNAS Core","description":"TrueNAS Scale offers a variety of interesting features that are not supported in its TrueNAS Core counterpart. Most notably, because the base operating system is Debian Linux, opposed to FreeBSD, there is native support for Linux containers via Docker, and Kubernetes Pods! This post walks through the steps required to upgrade from TrueNAS Core to TrueNAS Scale.","date":"2021-12-28","tags":["homelab","supermicro","truenas"],"categories":["homelab"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"TrueNAS Scale offers a variety of interesting features that are not supported in its TrueNAS Core counterpart. Most notably, because the base operating system is Debian Linux, opposed to FreeBSD, there is native support for Linux containers via Docker, and Kubernetes Pods! This post walks through the steps required to upgrade from TrueNAS Core to TrueNAS Scale."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"TrueNAS Scale offers a variety of interesting features that are not supported in its TrueNAS Core counterpart. Most notably, because the base operating system is Debian Linux, opposed to FreeBSD, there is native support for Linux containers via Docker, and Kubernetes Pods! This post walks through the steps required to upgrade from TrueNAS Core to TrueNAS Scale."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Thankfully, the upgrade procedure to migrate from TrueNAS Core to TrueNAS Scale is relatively straight forward. All it requires is to create a bootable USB of the TrueNAS Scale image, boot the USB, and select "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"Install/Upgrade"}]},{"type":"text","value":" in the installation wizard. But for the sake of being thorough, you can find instructions on how to backup system configurations and install the OS below."}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Make a backup of your system’s configuration\n"},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Navigate to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"System > General"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Click "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Save Config"}]},{"type":"text","value":", check the "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"Export Secret Seed"}]},{"type":"text","value":" box, and click "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Save"}]}]}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Export dataset keys for the encrypted pools\n"},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Navigate to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Storage > Pools"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Click the cog icon, and select "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Export Dataset Keys"}]}]}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Insert the TrueNAS Core bootable USB into the NAS"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"From the Supermicro IPMI interface select "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"Remote Control"}]},{"type":"text","value":" and "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"iKVM/HTML5"}]},{"type":"text","value":" and select "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"Reboot"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"Select the bootable USB as the boot device"}]},{"type":"element","tag":"li","props":{},"children":[{"type":"text","value":"From the TrueNAS installation wizard, select "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"Install/Upgrade"}]},{"type":"text","value":", select the drive that contains the TrueNAS installation, and select "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"Upgrade Install"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Reboot the device, and voila — you should be up-and-running! Give the system a quick rundown to validate that your settings and pools have transferred correctly, and then enjoy all the container goodness!"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"For a breakdown of the differences between TrueNAS Core, Enterprise, and Scale, you can reference "},{"type":"element","tag":"a","props":{"href":"https://www.truenas.com/help-me-choose/","rel":["nofollow"]},"children":[{"type":"text","value":"this table"}]},{"type":"text","value":"."}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:articles:migrate-truenas-from-core-to-scale.md","_source":"content","_file":"articles/migrate-truenas-from-core-to-scale.md","_extension":"md"},{"_path":"/articles/nuxt-content-rss-feed","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"How To Add an RSS Feed to a Nuxt Website","description":"If you are a user of Nuxt Content and you wish to configure an RSS feed for your website, it's a surprisingly straight forward process! In this article, we will walk through the code changes required to host an RSS feed for both a statically generated, and Universal Nuxt application.","draft":false,"date":"2024-01-06","tags":["nuxt","rss"],"categories":["programming"],"cover_image":"/images/nuxt-content-rss-feed.jpg","excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you are a user of "},{"type":"element","tag":"a","props":{"href":"https://content.nuxt.com/","rel":["nofollow"]},"children":[{"type":"text","value":"Nuxt Content"}]},{"type":"text","value":" and you wish to configure an RSS feed for your website, it's a surprisingly straight forward process! In this article, we will walk through the code changes required to host an RSS feed for both a statically generated, and Universal Nuxt application."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you are a user of "},{"type":"element","tag":"a","props":{"href":"https://content.nuxt.com/","rel":["nofollow"]},"children":[{"type":"text","value":"Nuxt Content"}]},{"type":"text","value":" and you wish to configure an RSS feed for your website, it's a surprisingly straight forward process! In this article, we will walk through the code changes required to host an RSS feed for both a statically generated, and Universal Nuxt application."}]},{"type":"element","tag":"h2","props":{"id":"preface"},"children":[{"type":"text","value":"Preface"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In version 2 of Nuxt, the community module, "},{"type":"element","tag":"a","props":{"href":"https://github.com/nuxt-community/feed-module","rel":["nofollow"]},"children":[{"type":"text","value":"nuxt-community/feed-module"}]},{"type":"text","value":" was a popular choice for adding an RSS feed to your website. However, there has been an unresolved "},{"type":"element","tag":"a","props":{"href":"https://github.com/nuxt-community/feed-module/issues/106","rel":["nofollow"]},"children":[{"type":"text","value":"open issue"}]},{"type":"text","value":" since April 1st, 2022 to add support for Nuxt v3. Thankfully, implementing this feature without a module is relatively straight forward."}]},{"type":"element","tag":"h2","props":{"id":"instructions"},"children":[{"type":"text","value":"Instructions"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"First, install the "},{"type":"element","tag":"a","props":{"href":"https://www.npmjs.com/package/feed","rel":["nofollow"]},"children":[{"type":"text","value":"feed"}]},{"type":"text","value":" library into your project:"}]},{"type":"element","tag":"pre","props":{"className":"language-shell shiki shiki-themes github-light","code":"npm i -D feed\n","language":"shell","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"npm"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" i"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -D"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" feed\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Then, create a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server/"}]},{"type":"text","value":" folder in your project if it does not already exist, and create a file named "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server/routes/atom.ts"}]},{"type":"text","value":"."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Here, we will leverage the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"feed"}]},{"type":"text","value":" library and construct an XML representation of our Nuxt content. As you can see, we first define our "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"feed"}]},{"type":"text","value":" with metadata associated with our RSS feed. This will be used by RSS readers to provide context to the end user. Then, we query our Nuxt content with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"serverQueryContent"}]},{"type":"text","value":" and append a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"feed.addItem"}]},{"type":"text","value":" for each article."}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-light","code":"import { serverQueryContent } from '#content/server';\nimport { Feed } from 'feed';\n\nconst BASE_URL = \"https://mywebsite.com\"\nconst AUTHOR_NAME = \"Firstname Lastname\"\n\nexport default defineEventHandler(async (event) => {\n\n const feed = new Feed({\n title: \"My Title\",\n description: \"My Description\",\n id: BASE_URL,\n link: BASE_URL,\n language: \"en\",\n image: `${BASE_URL}/images/placeholder.png`,\n favicon: `${BASE_URL}/favicon.ico`,\n copyright: `All rights reserved ${new Date().getFullYear()}, ${AUTHOR_NAME}`,\n updated: new Date(),\n generator: \"Nuxt static site generation + Feed for Node.js\",\n feedLinks: {\n atom: `${BASE_URL}/atom`\n },\n author: {\n name: AUTHOR_NAME,\n }\n });\n\n const articles = await serverQueryContent(event).find();\n\n articles.forEach((article) => {\n feed.addItem({\n title: article.title ? article.title : \"Missing Title\",\n id: article._path,\n link: `${BASE_URL}${article._path}`,\n description: article.description,\n author: [\n {\n name: AUTHOR_NAME,\n },\n ],\n date: new Date(article.date),\n image: article.cover_image ? `${BASE_URL}/${article.cover_image}` : undefined\n });\n });\n\n return feed.atom1();\n});\n","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" { serverQueryContent } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" '#content/server'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" { Feed } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 'feed'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" BASE_URL"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"https://mywebsite.com\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" AUTHOR_NAME"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"Firstname Lastname\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"export"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" default"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" defineEventHandler"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"async"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E36209"},"children":[{"type":"text","value":"event"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" feed"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" Feed"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"({\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" title: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"My Title\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" description: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"My Description\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" id: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"BASE_URL"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" link: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"BASE_URL"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" language: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"en\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" image: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"`${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"BASE_URL"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"}/images/placeholder.png`"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" favicon: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"`${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"BASE_URL"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"}/favicon.ico`"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" copyright: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"`All rights reserved ${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" Date"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"()."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"getFullYear"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"()"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"}, ${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"AUTHOR_NAME"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"}`"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" updated: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" Date"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":19},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" generator: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"Nuxt static site generation + Feed for Node.js\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":20},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" feedLinks: {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":21},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" atom: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"`${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"BASE_URL"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"}/atom`\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":22},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":23},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" author: {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":24},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" name: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"AUTHOR_NAME"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":25},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":26},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":27},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":28},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" articles"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" serverQueryContent"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(event)."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"find"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":29},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":30},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" articles."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"forEach"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E36209"},"children":[{"type":"text","value":"article"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":31},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" feed."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"addItem"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"({\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":32},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" title: article.title "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" article.title "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":":"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"Missing Title\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":33},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" id: article._path,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":34},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" link: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"`${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"BASE_URL"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"}${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"article"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"_path"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"}`"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":35},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" description: article.description,\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":36},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" author: [\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":37},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":38},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" name: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"AUTHOR_NAME"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":",\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":39},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" },\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":40},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" ],\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":41},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" date: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" Date"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(article.date),\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":42},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" image: article.cover_image "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"?"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" `${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"BASE_URL"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"}/${"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"article"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"cover_image"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"}`"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" :"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" undefined\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":43},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":44},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":45},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":46},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" feed."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"atom1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":47},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"});\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And that's just about it! Except, if you are statically generating your website with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"nuxt generate"}]},{"type":"text","value":" command, you will need to configure this server-side route to be pre-rendered on site generation. This is as simple as adding a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"nitro"}]},{"type":"text","value":" "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"prerender"}]},{"type":"text","value":" definition in your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"nuxt.config.ts"}]},{"type":"text","value":" file, like so:"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-light","code":"nitro: {\n prerender: {\n routes: ['/atom']\n }\n}\n","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"nitro"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" prerender"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" routes"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":": ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"'/atom'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"bonus"},"children":[{"type":"text","value":"Bonus"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"You may also be interested in adding a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sitemap.xml"}]},{"type":"text","value":" to your website. This can be done in almost an identical fashion!"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Install the dependency:"}]},{"type":"element","tag":"pre","props":{"className":"language-shell shiki shiki-themes github-light","code":"npm i -D sitemap\n","language":"shell","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"npm"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" i"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -D"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" sitemap\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Create a route at "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"server/routes/sitemap.xml.ts"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-light","code":"import { serverQueryContent } from '#content/server';\nimport { SitemapStream, streamToPromise } from 'sitemap';\n\nexport default defineEventHandler(async (event) => {\n const articles = await serverQueryContent(event).find();\n\n const sitemap = new SitemapStream({ hostname: 'https://my-website.com/' });\n\n // Add non nuxt content endpoints here\n sitemap.write({ url: '/' });\n sitemap.write({ url: '/articles' });\n\n // Dynamically generate routes for Nuxt markdown content\n articles.forEach((article) => sitemap.write({ url: article._path, changefreq: 'monthly' }));\n sitemap.end();\n\n return (await streamToPromise(sitemap));\n});\n","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" { serverQueryContent } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" '#content/server'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" { SitemapStream, streamToPromise } "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 'sitemap'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":";\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"export"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" default"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" defineEventHandler"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"async"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E36209"},"children":[{"type":"text","value":"event"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" articles"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" serverQueryContent"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(event)."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"find"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" const"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" sitemap"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" ="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" new"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" SitemapStream"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"({ hostname: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"'https://my-website.com/'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // Add non nuxt content endpoints here\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" sitemap."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"write"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"({ url: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"'/'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" sitemap."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"write"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"({ url: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"'/articles'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" });\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":" // Dynamically generate routes for Nuxt markdown content\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" articles."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"forEach"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E36209"},"children":[{"type":"text","value":"article"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"=>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" sitemap."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"write"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"({ url: article._path, changefreq: "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"'monthly'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" }));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" sitemap."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"end"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"();\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":16},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":17},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" return"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" ("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"await"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" streamToPromise"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(sitemap));\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":18},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"});\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And add the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"prerender"}]},{"type":"text","value":" entry in your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"nuxt.config.ts"}]},{"type":"text","value":":"}]},{"type":"element","tag":"pre","props":{"className":"language-ts shiki shiki-themes github-light","code":"nitro: {\n prerender: {\n routes: ['/sitemap.xml', '/atom']\n }\n}\n","language":"ts","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"nitro"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" prerender"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":": {\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" routes"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":": ["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"'/sitemap.xml'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"'/atom'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" }\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"}\n"}]}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"preface","depth":2,"text":"Preface"},{"id":"instructions","depth":2,"text":"Instructions"},{"id":"bonus","depth":2,"text":"Bonus"}]}},"_type":"markdown","_id":"content:articles:nuxt-content-rss-feed.md","_source":"content","_file":"articles/nuxt-content-rss-feed.md","_extension":"md"},{"_path":"/articles/nuxt-v3-migration","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"This Website Has Been Migrated to Nuxt 3 🎉","description":"This website has been migrated to the latest version of the Nuxt web framework, and with it comes all of the exciting goodies that the Vue and Nuxt teams have been concocting over the past few years.\nNot to mention, all of the great plugins in the Vue ecosystem!","date":"2022-12-31","tags":["nuxt"],"categories":["web"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This website has been migrated to the latest version of the Nuxt web framework, and with it comes all of the exciting goodies that the Vue and Nuxt teams have been concocting over the past few years.\nNot to mention, all of the great plugins in the Vue ecosystem!"}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This website has been migrated to the latest version of the Nuxt web framework, and with it comes all of the exciting goodies that the Vue and Nuxt teams have been concocting over the past few years.\nNot to mention, all of the great plugins in the Vue ecosystem!"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you're curious what changes were required to make the migration, you can check out "},{"type":"element","tag":"a","props":{"href":"https://github.com/cmpadden/cmpadden.github.io/pull/3","rel":["nofollow"]},"children":[{"type":"text","value":"pull request #3"}]},{"type":"text","value":" in the GitHub repository."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"img","props":{"alt":"Screenshot of Nuxt Migration Pull Request","src":"/images/nuxt-migration-pr.png"},"children":[]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"While the documentation for making this migration is great, there were many breaking changes, and the overall process was quite tedious.\nFor this reason, I opted to generate a new project entirely, and port existing code to this clean slate.\nI believe that this resulted in a project with a bit less cruft."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The most valuable resources for making these changes include:"}]},{"type":"element","tag":"ul","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://nuxt.com/docs/migration/overview","rel":["nofollow"]},"children":[{"type":"text","value":"The Nuxt Migration Guide"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://nuxt.com/docs/getting-started/introduction","rel":["nofollow"]},"children":[{"type":"text","value":"The Nuxt Framework Guide"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://tailwindcss.nuxt.dev/","rel":["nofollow"]},"children":[{"type":"text","value":"Nuxt Tailwind Module Documentation"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://content.nuxtjs.org/","rel":["nofollow"]},"children":[{"type":"text","value":"Nuxt Content Module Documentation"}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Part of the delay for doing this upgrade was in waiting for module developers to support this major release.\nI'm super thankful for all of the hard work they've don, and I'm excited to explore all of the new features available!\nI just hope that the breaking changes in this release don't cause too much fracturing of the community, as it does feel like déjà vu of Python 2 and 3."}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:articles:nuxt-v3-migration.md","_source":"content","_file":"articles/nuxt-v3-migration.md","_extension":"md"},{"_path":"/articles/persistent-archlinux-usb","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Create a Persistent Arch Linux Bootable USB with Vagrant","description":"When installing a linux distribution, it is common for the instructions to have\nthe user create a bootable USB, boot from the device, and proceed with the\ninstallation procedure from that live medium. However, this blog post will\noutline an alternative approach where a virtual machine created with Vagrant\nwill be used in favor of the live medium.","date":"2020-01-09","draft":false,"tags":["vagrant","archlinux"],"categories":["linux"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When installing a linux distribution, it is common for the instructions to have\nthe user create a bootable USB, boot from the device, and proceed with the\ninstallation procedure from that live medium. However, this blog post will\noutline an alternative approach where a virtual machine created with Vagrant\nwill be used in favor of the live medium."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When installing a linux distribution, it is common for the instructions to have\nthe user create a bootable USB, boot from the device, and proceed with the\ninstallation procedure from that live medium. However, this blog post will\noutline an alternative approach where a virtual machine created with Vagrant\nwill be used in favor of the live medium."}]},{"type":"element","tag":"h1","props":{"id":"preface"},"children":[{"type":"text","value":"Preface"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The original intention was to use Docker for this process -- leveraging the\n"},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--device"}]},{"type":"text","value":" flag and mounting the target USB device in the Docker container,\nbut the underlying hypervisor in Docker Desktop for Mac does not support this.\n"},{"type":"element","tag":"sup","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://docs.docker.com/docker-for-mac/docker-toolbox/","rel":["nofollow"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tag":"a","props":{"href":"https://github.com/moby/hyperkit","rel":["nofollow"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tag":"a","props":{"href":"https://github.com/docker/for-mac/issues/900","rel":["nofollow"]},"children":[{"type":"text","value":"3"}]}]},{"type":"text","value":" While there are workarounds using Docker\nMachine, Vagrant felt like the path of least resistance."}]},{"type":"element","tag":"h1","props":{"id":"instructions"},"children":[{"type":"text","value":"Instructions"}]},{"type":"element","tag":"h2","props":{"id":"create-an-arch-linux-virtual-machine-with-vagrant"},"children":[{"type":"text","value":"Create an Arch Linux Virtual Machine with Vagrant"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Get the latest Arch Linux image "},{"type":"element","tag":"sup","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://app.vagrantup.com/archlinux/boxes/archlinux","rel":["nofollow"]},"children":[{"type":"text","value":"4"}]}]},{"type":"text","value":" from the Vagrant Cloud Box\nCatalog."}]},{"type":"element","tag":"pre","props":{"code":"vagrant box add archlinux/archlinux\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"vagrant"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" box"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" add"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" archlinux/archlinux\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Determine the USB vendor information for the thumb-drive that we will\npass-through to the virtual machine. Using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"VBoxManage"}]},{"type":"text","value":" utility that comes\nwith Virtual Box, list the devices, and make note of the Vendor and Product ID."}]},{"type":"element","tag":"pre","props":{"code":" VBoxManage list usbhost\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" VBoxManage"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" list"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" usbhost\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Create a "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Vagrantfile"}]},{"type":"text","value":" with "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"archlinx/archlinux"}]},{"type":"text","value":" as the target box, and the USB\ndevice information that is passed through. "},{"type":"element","tag":"sup","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://antonyjepson.wordpress.com/2012/01/26/quickly-attaching-usb-devices-to-virtualbox-guests-using-vboxmanage/","rel":["nofollow"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":" "},{"type":"element","tag":"a","props":{"href":"https://gist.github.com/dscape/7d829c0c116ef419f963","rel":["nofollow"]},"children":[{"type":"text","value":"6"}]}]},{"type":"text","value":" Vagrant\noffers a handy customization parameter "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"vb.customize"}]},{"type":"text","value":" that calls the\n"},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"VBoxManage"}]},{"type":"text","value":" command under-the-hood, allowing one to enable the guest machine\nto access the host machine's USB devices."}]},{"type":"element","tag":"pre","props":{"code":"# -*- mode: ruby -*-\n# vi: set ft=ruby :\n\nVagrant.configure(\"2\") do |config|\n config.vm.box = \"archlinux/archlinux\"\n config.vm.provider \"virtualbox\" do |vb|\n vb.name = \"archlinux\"\n vb.customize ['modifyvm', :id, '--usb', 'on']\n vb.customize ['usbfilter', 'add', '1', '--target', :id, '--name', 'SanDisk Ultra Fit', '--vendorid', '0x0781', '--productid', '0x5583']\n end\nend\n","language":"txt","meta":"","className":"language-txt shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"# -*- mode: ruby -*-\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"# vi: set ft=ruby :\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Vagrant.configure(\"2\") do |config|\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" config.vm.box = \"archlinux/archlinux\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" config.vm.provider \"virtualbox\" do |vb|\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" vb.name = \"archlinux\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" vb.customize ['modifyvm', :id, '--usb', 'on']\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" vb.customize ['usbfilter', 'add', '1', '--target', :id, '--name', 'SanDisk Ultra Fit', '--vendorid', '0x0781', '--productid', '0x5583']\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" end\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"end\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"When virtual machine is brought up, the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"usbfilter"}]},{"type":"text","value":" is applied, and the guest\nis able to access to the host machine's USB device that was specified in the\nfilter."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Start the machine, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ssh"}]},{"type":"text","value":" into the guest, and list the devices to confirm that\nthe USB device is available (see: "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"/dev/sdb"}]},{"type":"text","value":")."}]},{"type":"element","tag":"pre","props":{"code":"$ vagrant up\n$ vagrant ssh\n[vagrant@archlinux ~]$ lsblk\nNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nsda 8:0 0 20G 0 disk\n├─sda1 8:1 0 1.9G 0 part [SWAP]\n└─sda2 8:2 0 18.1G 0 part /\nsdb 8:16 1 28.7G 0 disk\n└─sdb1 8:17 1 8G 0 part\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" vagrant"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" up\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" vagrant"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ssh\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[vagrant@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]$ lsblk\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"NAME"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" MAJ:MIN"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" RM"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" SIZE"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" RO"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" TYPE"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" MOUNTPOINT\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"sda"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 8:0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 20G"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" disk\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"├─sda1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 8:1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 1.9G"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" part"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" [SWAP]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"└─sda2"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 8:2"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 18.1G"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" part"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" /\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"sdb"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 8:16"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 28.7G"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" disk\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"└─sdb1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 8:17"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 8G"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 0"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" part\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"install-arch-linux-on-the-usb-drive"},"children":[{"type":"text","value":"Install Arch Linux on the USB Drive"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The "},{"type":"element","tag":"a","props":{"href":"https://wiki.archlinux.org/index.php/Installation_guide","rel":["nofollow"]},"children":[{"type":"text","value":"Arch Linux Installation Guide"}]},{"type":"text","value":" outlines the installation procedure in\ngreat detail -- the following steps follow this closely with a few alteration\ndue to installing onto removable media."}]},{"type":"element","tag":"h3","props":{"id":"partition-the-disk-uefi-with-gpt"},"children":[{"type":"text","value":"Partition the Disk (UEFI with GPT)"}]},{"type":"element","tag":"pre","props":{"code":"[root@archlinux ~]# fdisk /dev/sdb\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[root@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]# fdisk /dev/sdb\n"}]}]}]}]},{"type":"element","tag":"pre","props":{"code":"Command (m for help): p\nDisk /dev/sdb: 28.66 GiB, 30752636928 bytes, 60063744 sectors\nDisk model: Ultra Fit\nUnits: sectors of 1 * 512 = 512 bytes\nSector size (logical/physical): 512 bytes / 512 bytes\nI/O size (minimum/optimal): 512 bytes / 512 bytes\nDisklabel type: gpt\nDisk identifier: E1D6C445-1B79-AB4D-A442-FA4AD6DF4ECC\n\nDevice Start End Sectors Size Type\n/dev/sdb1 2048 1050623 1048576 512M EFI System\n/dev/sdb2 1050624 60063710 59013087 28.1G Linux filesystem\n\nFilesystem/RAID signature on partition 1 will be wiped.\n","language":"txt","meta":"","className":"language-txt shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Command (m for help): p\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Disk /dev/sdb: 28.66 GiB, 30752636928 bytes, 60063744 sectors\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Disk model: Ultra Fit\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Units: sectors of 1 * 512 = 512 bytes\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Sector size (logical/physical): 512 bytes / 512 bytes\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"I/O size (minimum/optimal): 512 bytes / 512 bytes\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Disklabel type: gpt\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Disk identifier: E1D6C445-1B79-AB4D-A442-FA4AD6DF4ECC\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Device Start End Sectors Size Type\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"/dev/sdb1 2048 1050623 1048576 512M EFI System\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"/dev/sdb2 1050624 60063710 59013087 28.1G Linux filesystem\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Filesystem/RAID signature on partition 1 will be wiped.\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"format-the-partitions"},"children":[{"type":"text","value":"Format the Partitions"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The UEFI specification mandates support for FAT file-systems, and FAT32 is\nrecommended for removable media. "},{"type":"element","tag":"sup","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://wiki.archlinux.org/index.php/EFI_system_partition#Format_the_partition","rel":["nofollow"]},"children":[{"type":"text","value":"7"}]}]}]},{"type":"element","tag":"pre","props":{"code":"[root@archlinux ~]# pacman -Sy dosfstools\n[root@archlinux ~]# mkfs.fat -F32 /dev/sdb1\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[root@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]# pacman -Sy dosfstools\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[root@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]# mkfs.fat -F32 /dev/sdb1\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As for the root partition, it is recommended to use "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ext4"}]},{"type":"text","value":" without a journal to\nreduce the reads and writes to the file-system as this is detrimental to the\nflash-based USB drive. "},{"type":"element","tag":"sup","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://wiki.archlinux.org/index.php/Install_Arch_Linux_on_a_USB_key#Installation_tweaks","rel":["nofollow"]},"children":[{"type":"text","value":"8"}]}]}]},{"type":"element","tag":"pre","props":{"code":"[root@archlinux ~]# mkfs.ext4 -O \"^has_journal\" /dev/sdb2\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[root@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]# mkfs.ext4 -O "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"^has_journal\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" /dev/sdb2\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"mount-the-partitions-and-bootstrap-the-environment"},"children":[{"type":"text","value":"Mount the Partitions and Bootstrap the Environment"}]},{"type":"element","tag":"pre","props":{"code":"[root@archlinux ~]# mount /dev/sdb2 /mnt\n[root@archlinux ~]# mkdir -p /mnt/boot/efi\n[root@archlinux ~]# mount /dev/sdb1 /mnt/boot/efi\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[root@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]# mount /dev/sdb2 /mnt\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[root@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]# mkdir -p /mnt/boot/efi\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[root@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]# mount /dev/sdb1 /mnt/boot/efi\n"}]}]}]}]},{"type":"element","tag":"pre","props":{"code":"[root@archlinux ~]# pacman -S arch-install-scripts\n[root@archlinux ~]# pacstrap /mnt base linux linux-firmware\n[root@archlinux ~]# genfstab -U /mnt >> /mnt/etc/fstab\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[root@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]# pacman -S arch-install-scripts\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[root@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]# pacstrap /mnt base linux linux-firmware\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[root@archlinux "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"~"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"]# genfstab -U /mnt "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":">>"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" /mnt/etc/fstab\n"}]}]}]}]},{"type":"element","tag":"h3","props":{"id":"configure-the-new-environment"},"children":[{"type":"text","value":"Configure the New Environment"}]},{"type":"element","tag":"pre","props":{"code":"[root@archlinux ~]# arch-chroot /mnt\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"[root@archlinux ~]# arch-chroot /mnt\n"}]}]},{"type":"element","tag":"pre","props":{"code":"[root@archlinux /]# ln -sf /usr/share/zoneinfo/US/Eastern /etc/localtime\n[root@archlinux /]# hwclock --systohc\n[root@archlinux /]# sed -i 's/#en_US.UTF-8/en_US.UTF-8/' /etc/locale.gen\n[root@archlinux /]# locale-gen\n[root@archlinux /]# echo \"LANG=en_US.UTF-8\" > /etc/locale.conf\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"[root@archlinux /]# ln -sf /usr/share/zoneinfo/US/Eastern /etc/localtime\n[root@archlinux /]# hwclock --systohc\n[root@archlinux /]# sed -i 's/#en_US.UTF-8/en_US.UTF-8/' /etc/locale.gen\n[root@archlinux /]# locale-gen\n[root@archlinux /]# echo \"LANG=en_US.UTF-8\" > /etc/locale.conf\n"}]}]},{"type":"element","tag":"pre","props":{"code":"[root@archlinux /]# hostnamectl set-hostname usb\n[root@archlinux /]# echo \"127.0.0.1 localhost\" >> /etc/hosts\n[root@archlinux /]# echo \"::1 localhost\" >> /etc/hosts\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"[root@archlinux /]# hostnamectl set-hostname usb\n[root@archlinux /]# echo \"127.0.0.1 localhost\" >> /etc/hosts\n[root@archlinux /]# echo \"::1 localhost\" >> /etc/hosts\n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Note, one difference here from a standard installation is that the\n"},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"--removable"}]},{"type":"text","value":" flag is specified when installing the GRUB bootloader.\n"},{"type":"element","tag":"sup","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://wiki.archlinux.org/index.php/GRUB#UEFI_systems","rel":["nofollow"]},"children":[{"type":"text","value":"10"}]}]}]},{"type":"element","tag":"pre","props":{"code":"[root@archlinux /]# pacman -S grub\n[root@archlinux /]# grub-install --target=x86_64-efi --efi-directory=/boot/efi --removable --recheck\n[root@usb /]# grub-mkconfig -o /boot/grub/grub.cfg\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"[root@archlinux /]# pacman -S grub\n[root@archlinux /]# grub-install --target=x86_64-efi --efi-directory=/boot/efi --removable --recheck\n[root@usb /]# grub-mkconfig -o /boot/grub/grub.cfg\n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Shutdown the virtual machine, restart the host machine, and boot the newly\ncreated Arch Linux thumb-drive!"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"🎉"}]},{"type":"element","tag":"h2","props":{"id":"side-note"},"children":[{"type":"text","value":"Side-note"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"It was attempted to use the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"controlvm usbattach"}]},{"type":"text","value":" command to pass the USB\ndevice to the guest machine, but this did not work as it expects the virtual\nmachine to already be running, and the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"vb.customize"}]},{"type":"text","value":" option runs prior to\nbooting the machine. "},{"type":"element","tag":"sup","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://www.vagrantup.com/docs/virtualbox/configuration.html#vboxmanage-customizations","rel":["nofollow"]},"children":[{"type":"text","value":"11"}]}]}]},{"type":"element","tag":"pre","props":{"code":"Command: [\"controlvm\", \"060a716b-1965-49e2-bc56-12beed5df716\", \"usbattach36fc9e60-c465-11cf-8056-444553540000\"]\n\nStderr: VBoxManage.exe: error: Machine '060a716b-1965-49e2-bc56-12beed5df716' is not currently running.\n","language":"txt","meta":"","className":"language-txt shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Command: [\"controlvm\", \"060a716b-1965-49e2-bc56-12beed5df716\", \"usbattach36fc9e60-c465-11cf-8056-444553540000\"]\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"Stderr: VBoxManage.exe: error: Machine '060a716b-1965-49e2-bc56-12beed5df716' is not currently running.\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"references"},"children":[{"type":"text","value":"References"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://docs.docker.com/docker-for-mac/docker-toolbox/","rel":["nofollow"]},"children":[{"type":"text","value":"Docker Desktop on Mac vs. Docker Toolbox"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/moby/hyperkit","rel":["nofollow"]},"children":[{"type":"text","value":"GitHub - HyperKit"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://github.com/docker/for-mac/issues/900","rel":["nofollow"]},"children":[{"type":"text","value":"GitHub - Docker for Mac - Issue #900"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://app.vagrantup.com/archlinux/boxes/archlinux","rel":["nofollow"]},"children":[{"type":"text","value":"Vagrant Cloud - Arch Linux"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://antonyjepson.wordpress.com/2012/01/26/quickly-attaching-usb-devices-to-virtualbox-guests-using-vboxmanage/","rel":["nofollow"]},"children":[{"type":"text","value":"Attaching USB Devices to VirtualBox Guests using VBoxManage"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://gist.github.com/dscape/7d829c0c116ef419f963","rel":["nofollow"]},"children":[{"type":"text","value":"GitHub Gist - Vagrant USB Filter"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://wiki.archlinux.org/index.php/EFI_system_partition#Format_the_partition","rel":["nofollow"]},"children":[{"type":"text","value":"Arch Linux Wiki - EFI System Partition - Format Partitions"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://wiki.archlinux.org/index.php/Install_Arch_Linux_on_a_USB_key#Installation_tweaks","rel":["nofollow"]},"children":[{"type":"text","value":"Arch Linux Wiki - Arch Linux on USB - Installation Tweaks"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://wiki.archlinux.org/index.php/Installation_guide","rel":["nofollow"]},"children":[{"type":"text","value":"Arch Linux Wiki - Installation Guide"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://wiki.archlinux.org/index.php/GRUB#UEFI_systems","rel":["nofollow"]},"children":[{"type":"text","value":"Arch Linux Wiki - GRUB - UEFI Systems"}]}]},{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://www.vagrantup.com/docs/virtualbox/configuration.html#vboxmanage-customizations","rel":["nofollow"]},"children":[{"type":"text","value":"Vagrant VBoxManage Customizations "}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"create-an-arch-linux-virtual-machine-with-vagrant","depth":2,"text":"Create an Arch Linux Virtual Machine with Vagrant"},{"id":"install-arch-linux-on-the-usb-drive","depth":2,"text":"Install Arch Linux on the USB Drive","children":[{"id":"partition-the-disk-uefi-with-gpt","depth":3,"text":"Partition the Disk (UEFI with GPT)"},{"id":"format-the-partitions","depth":3,"text":"Format the Partitions"},{"id":"mount-the-partitions-and-bootstrap-the-environment","depth":3,"text":"Mount the Partitions and Bootstrap the Environment"},{"id":"configure-the-new-environment","depth":3,"text":"Configure the New Environment"}]},{"id":"side-note","depth":2,"text":"Side-note"},{"id":"references","depth":2,"text":"References"}]}},"_type":"markdown","_id":"content:articles:persistent-archlinux-usb.md","_source":"content","_file":"articles/persistent-archlinux-usb.md","_extension":"md"},{"_path":"/articles/podcast-transcription-whispercpp","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Easily Transcribe Podcasts with Whisper.cpp","description":"If you've ever had the need to transcribe a podcast, lecture, or some other audio recording, it turns out it's surprisingly easy with the extremely impressive whisper.cpp project. This high-performance fork of OpenAI's Whisper can run on all sorts of hardware -- including my M1 Mac Mini. Let's walk through an example from start-to-finish of transcribing an episode of the Alter Everything podcast.","draft":false,"date":"2024-01-08","tags":["whisper.cpp","ml"],"categories":["programming"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you've ever had the need to transcribe a podcast, lecture, or some other audio recording, it turns out it's surprisingly easy with the extremely impressive "},{"type":"element","tag":"a","props":{"href":"https://github.com/ggerganov/whisper.cpp","rel":["nofollow"]},"children":[{"type":"text","value":"whisper.cpp"}]},{"type":"text","value":" project. This high-performance fork of "},{"type":"element","tag":"a","props":{"href":"https://github.com/openai/whisper","rel":["nofollow"]},"children":[{"type":"text","value":"OpenAI's Whisper"}]},{"type":"text","value":" can run on all sorts of hardware -- including my M1 Mac Mini. Let's walk through an example from start-to-finish of transcribing an episode of the "},{"type":"element","tag":"a","props":{"href":"https://podcasts.apple.com/us/podcast/alter-everything/id1356137854","rel":["nofollow"]},"children":[{"type":"text","value":"Alter Everything"}]},{"type":"text","value":" podcast."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you've ever had the need to transcribe a podcast, lecture, or some other audio recording, it turns out it's surprisingly easy with the extremely impressive "},{"type":"element","tag":"a","props":{"href":"https://github.com/ggerganov/whisper.cpp","rel":["nofollow"]},"children":[{"type":"text","value":"whisper.cpp"}]},{"type":"text","value":" project. This high-performance fork of "},{"type":"element","tag":"a","props":{"href":"https://github.com/openai/whisper","rel":["nofollow"]},"children":[{"type":"text","value":"OpenAI's Whisper"}]},{"type":"text","value":" can run on all sorts of hardware -- including my M1 Mac Mini. Let's walk through an example from start-to-finish of transcribing an episode of the "},{"type":"element","tag":"a","props":{"href":"https://podcasts.apple.com/us/podcast/alter-everything/id1356137854","rel":["nofollow"]},"children":[{"type":"text","value":"Alter Everything"}]},{"type":"text","value":" podcast."}]},{"type":"element","tag":"h2","props":{"id":"obtain-audio-files"},"children":[{"type":"text","value":"Obtain Audio File(s)"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"First, let's get the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"wav"}]},{"type":"text","value":" file from YouTube using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"youtube-dl"}]},{"type":"text","value":" utility. It should be noted that "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"whisper.cpp"}]},{"type":"text","value":" expects "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"wav"}]},{"type":"text","value":" filetypes, and this utility defaults to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"mp3"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"code":" $ youtube-dl \\\n --extract-audio \\\n --audio-format wav \\\n --output podcast.wav \\\n \"https://www.youtube.com/watch?v=CoUN690wSYQ\"\n","language":"sh","meta":"","className":"language-sh shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" $"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" youtube-dl"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --extract-audio"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --audio-format"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" wav"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --output"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" podcast.wav"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"https://www.youtube.com/watch?v=CoUN690wSYQ\"\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This file has a 44.1 kHz sample rate, and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"whisper.cpp"}]},{"type":"text","value":" expects 16 kHz, so let's go ahead and convert that."}]},{"type":"element","tag":"pre","props":{"code":" $ file podcast.wav\npodcast.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 44100 Hz\n\n $ ffmpeg -i podcast.wav -ar 16000 podcast-16khz.wav\n\n $ file podcast-16khz.wav\npodcast-16khz.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 16000 Hz\n\n# NOTE: it looks like it's possible to specify this conversion as a post-process as a\n# flag to the `youtube-dl` command -- I will explore this further next time...\n# youtube-dl --extract-audio --audio-quality 0 --audio-format mp3 --postprocessor-args \"-ar 44100\" %dl%\n","language":"sh","meta":"","className":"language-sh shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" $"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" file"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" podcast.wav\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"podcast.wav:"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" RIFF"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 44100 Hz\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" $"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ffmpeg"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -i"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" podcast.wav"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -ar"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 16000"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" podcast-16khz.wav\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" $"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" file"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" podcast-16khz.wav\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"podcast-16khz.wav:"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" RIFF"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 16000 Hz\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# NOTE: it looks like it's possible to specify this conversion as a post-process as a\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# flag to the `youtube-dl` command -- I will explore this further next time...\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# youtube-dl --extract-audio --audio-quality 0 --audio-format mp3 --postprocessor-args \"-ar 44100\" %dl%\n"}]}]}]}]},{"type":"element","tag":"h2","props":{"id":"build-whispercpp-transcribe-audio"},"children":[{"type":"text","value":"Build "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"whisper.cpp"}]},{"type":"text","value":" & Transcribe Audio"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Then, let's get the latest version of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"whisper.cpp"}]},{"type":"text","value":", download the English Whisper model, and build the example."}]},{"type":"element","tag":"pre","props":{"code":"# Clone the `whisper.cpp` repository\n $ git clone --depth 1 git@github.com:ggerganov/whisper.cpp && cd whisper.cpp\n\n# Download the English Whisper model in `ggml` format\n $ bash ./models/download-ggml-model.sh base.en\n\n# Build the main example\n $ make\n","language":"sh","meta":"","className":"language-sh shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# Clone the `whisper.cpp` repository\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" $"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" git"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" clone"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --depth"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" 1"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" git@github.com:ggerganov/whisper.cpp"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" && "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"cd"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" whisper.cpp\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# Download the English Whisper model in `ggml` format\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" $"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" bash"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ./models/download-ggml-model.sh"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" base.en\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# Build the main example\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" $"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" make\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And finally, let's transcribe that podcast!"}]},{"type":"element","tag":"pre","props":{"code":" $ ./main \\\n -m ~/workspace/whisper.cpp/models/ggml-base.en.bin \\\n -f ~/Downloads/podcast-16khz.wav \\\n --output-vtt \\\n --output-file out\n\n# whisper_print_timings: load time = 114.71 ms\n# whisper_print_timings: fallbacks = 0 p / 0 h\n# whisper_print_timings: mel time = 692.20 ms\n# whisper_print_timings: sample time = 22278.10 ms / 27893 runs ( 0.80 ms per run)\n# whisper_print_timings: encode time = 10000.75 ms / 55 runs ( 181.83 ms per run)\n# whisper_print_timings: decode time = 331.77 ms / 54 runs ( 6.14 ms per run)\n# whisper_print_timings: batchd time = 45236.73 ms / 27566 runs ( 1.64 ms per run)\n# whisper_print_timings: prompt time = 1921.90 ms / 11832 runs ( 0.16 ms per run)\n# whisper_print_timings: total time = 80709.54 ms\n","language":"sh","meta":"","className":"language-sh shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" $"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ./main"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -m"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ~/workspace/whisper.cpp/models/ggml-base.en.bin"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -f"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ~/Downloads/podcast-16khz.wav"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --output-vtt"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" \\\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --output-file"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" out\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# whisper_print_timings: load time = 114.71 ms\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# whisper_print_timings: fallbacks = 0 p / 0 h\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# whisper_print_timings: mel time = 692.20 ms\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# whisper_print_timings: sample time = 22278.10 ms / 27893 runs ( 0.80 ms per run)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":11},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# whisper_print_timings: encode time = 10000.75 ms / 55 runs ( 181.83 ms per run)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":12},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# whisper_print_timings: decode time = 331.77 ms / 54 runs ( 6.14 ms per run)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":13},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# whisper_print_timings: batchd time = 45236.73 ms / 27566 runs ( 1.64 ms per run)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":14},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# whisper_print_timings: prompt time = 1921.90 ms / 11832 runs ( 0.16 ms per run)\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":15},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# whisper_print_timings: total time = 80709.54 ms\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"A full podcast transcribed in ~80 seconds on an M1 Mac Mini -- not too bad!"}]},{"type":"element","tag":"pre","props":{"code":"# out.vtt\n\n00:00:00.000 --> 00:00:06.480\n >> Hi everyone. We recently launched a short engagement feedback survey for the Alter Everything\n\n00:00:06.480 --> 00:00:11.360\n podcast. Click the link in the episode description wherever you're listening to let us know what\n\n00:00:11.360 --> 00:00:16.320\n you think and help us improve our show.\n\n00:00:16.320 --> 00:00:21.200\n Welcome to Alter Everything, a podcast about data science and analytics culture. I'm Megan\n\n00:00:21.200 --> 00:00:26.440\n Dibble and today I'm talking with Nick Schrock, CTO and founder of Dagster Labs. We discussed\n\n00:00:26.440 --> 00:00:31.560\n data engineering trends, challenges in the field, why he started his company, and what\n\n00:00:31.560 --> 00:00:38.960\n makes him excited about the future of data engineering. Let's get started.\n\n00:00:38.960 --> 00:00:42.720\n >> Hi, Nick. It's great to have you on our show today. Thanks for being here.\n\n00:00:42.720 --> 00:00:43.920\n >> Thanks for having me.\n\n00:00:43.920 --> 00:00:48.280\n >> Yeah. Could you start off by giving an introduction to yourself for our listeners?\n\n00:00:48.280 --> 00:00:52.920\n >> Sure. My name is Nick Schrock. I'm the CTO and founder of Dagster Labs. There's the\n\n00:00:52.920 --> 00:00:59.520\n company behind Dagster, which is a data orchestration framework. Prior to doing this, I was an engineer\n\n00:00:59.520 --> 00:01:05.960\n at Facebook from 2009, 2017. While I was there, I found a team called product infrastructure\n\n00:01:05.960 --> 00:01:09.800\n whose goal was to make our application developers more efficient and productive, and a bunch\n\n00:01:09.800 --> 00:01:13.840\n of open source work came out of that actually, one of which was React, which I had nothing\n\n00:01:13.840 --> 00:01:18.040\n to do with, but actually the CEO of Dagster Labs co-created and I personally co-created\n\n00:01:18.040 --> 00:01:22.640\n GraphQL. So as I like to say, Pete and I were present at the creation of the full hipster\n\n00:01:22.640 --> 00:01:28.680\n stack. I moved on to Facebook in 2017, figuring out what to do next, and this data engineering\n\n00:01:28.680 --> 00:01:32.960\n and data orchestration problem really got me hooked actually quite soon after I left,\n\n00:01:32.960 --> 00:01:36.280\n and the rest is history. I'm sure we'll get into that more.\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"# out.vtt\n\n00:00:00.000 --> 00:00:06.480\n >> Hi everyone. We recently launched a short engagement feedback survey for the Alter Everything\n\n00:00:06.480 --> 00:00:11.360\n podcast. Click the link in the episode description wherever you're listening to let us know what\n\n00:00:11.360 --> 00:00:16.320\n you think and help us improve our show.\n\n00:00:16.320 --> 00:00:21.200\n Welcome to Alter Everything, a podcast about data science and analytics culture. I'm Megan\n\n00:00:21.200 --> 00:00:26.440\n Dibble and today I'm talking with Nick Schrock, CTO and founder of Dagster Labs. We discussed\n\n00:00:26.440 --> 00:00:31.560\n data engineering trends, challenges in the field, why he started his company, and what\n\n00:00:31.560 --> 00:00:38.960\n makes him excited about the future of data engineering. Let's get started.\n\n00:00:38.960 --> 00:00:42.720\n >> Hi, Nick. It's great to have you on our show today. Thanks for being here.\n\n00:00:42.720 --> 00:00:43.920\n >> Thanks for having me.\n\n00:00:43.920 --> 00:00:48.280\n >> Yeah. Could you start off by giving an introduction to yourself for our listeners?\n\n00:00:48.280 --> 00:00:52.920\n >> Sure. My name is Nick Schrock. I'm the CTO and founder of Dagster Labs. There's the\n\n00:00:52.920 --> 00:00:59.520\n company behind Dagster, which is a data orchestration framework. Prior to doing this, I was an engineer\n\n00:00:59.520 --> 00:01:05.960\n at Facebook from 2009, 2017. While I was there, I found a team called product infrastructure\n\n00:01:05.960 --> 00:01:09.800\n whose goal was to make our application developers more efficient and productive, and a bunch\n\n00:01:09.800 --> 00:01:13.840\n of open source work came out of that actually, one of which was React, which I had nothing\n\n00:01:13.840 --> 00:01:18.040\n to do with, but actually the CEO of Dagster Labs co-created and I personally co-created\n\n00:01:18.040 --> 00:01:22.640\n GraphQL. So as I like to say, Pete and I were present at the creation of the full hipster\n\n00:01:22.640 --> 00:01:28.680\n stack. I moved on to Facebook in 2017, figuring out what to do next, and this data engineering\n\n00:01:28.680 --> 00:01:32.960\n and data orchestration problem really got me hooked actually quite soon after I left,\n\n00:01:32.960 --> 00:01:36.280\n and the rest is history. I'm sure we'll get into that more.\n"}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"obtain-audio-files","depth":2,"text":"Obtain Audio File(s)"},{"id":"build-whispercpp-transcribe-audio","depth":2,"text":"Build whisper.cpp & Transcribe Audio"}]}},"_type":"markdown","_id":"content:articles:podcast-transcription-whispercpp.md","_source":"content","_file":"articles/podcast-transcription-whispercpp.md","_extension":"md"},{"_path":"/articles/quick-tip-rerunning-bash-commands","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Tip: Re-running Bash Commands","description":"Do you ever find yourself having to re-run a Bash command? I often find this\nhappening to myself when I neglect to use sudo for a command that requires\nroot privileges.","date":"2021-09-22","draft":false,"tags":["tip","bash"],"categories":["tips"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Do you ever find yourself having to re-run a Bash command? I often find this\nhappening to myself when I neglect to use "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sudo"}]},{"type":"text","value":" for a command that requires\nroot privileges."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Do you ever find yourself having to re-run a Bash command? I often find this\nhappening to myself when I neglect to use "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sudo"}]},{"type":"text","value":" for a command that requires\nroot privileges."}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light","code":"$ pacman -Syu\nerror: you cannot perform this operation unless you are root.\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" pacman"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -Syu\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"error:"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" you"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" cannot"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" perform"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" this"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" operation"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" unless"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" you"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" are"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" root.\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Well, I have good news for you -- you can easily re-issue a command with the\n"},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"!!"}]},{"type":"text","value":" designator! Simply type "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"sudo"}]},{"type":"text","value":" followed by "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"!!"}]},{"type":"text","value":" and you're good to go."}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light","code":"$ sudo !!\nsudo pacman -Syu\n[sudo] password for colton:\n:: Synchronizing package databases...\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" sudo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" !!\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"sudo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" pacman"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -Syu\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"[sudo] password "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"for"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" colton:\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"::"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" Synchronizing"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" package"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" databases...\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"--"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Commands that are prefixed with a bang, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"!"}]},{"type":"text","value":", are considered "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"Event\nDesignators,"}]},{"type":"text","value":" and are references to your command-line history. You can take a\nlook at your history with the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"history"}]},{"type":"text","value":" command."}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light","code":"$ history\n 1021 touch hello_world.txt\n 1022 ls\n 1023 echo \"Here we go again!\"\n 1024 find . -name *.py\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" history\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" 1021"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" touch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" hello_world.txt\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" 1022"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ls\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" 1023"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" echo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"Here we go again!\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" 1024"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" find"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -name"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" *"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":".py\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"There are many ways to use "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"!"}]},{"type":"text","value":" in your shell. For example, if you wanted to\nre-issue a specific command in your history, you could use "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"!n"}]},{"type":"text","value":" where "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"n"}]},{"type":"text","value":" is\nthe number next to the command in your history."}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light","code":"$ !1023\necho \"Here we go again!\"\nHere we go again!\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" !1023\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"echo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"Here we go again!\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"Here"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" we"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" go"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" again!\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Or... if you wanted to run the command you issued 4-commands ago, you can use\n"},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"!-4"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light","code":"$ !-4\nls\nhello_world.txt\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" !-4\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"ls\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"hello_world.txt\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Or... if you wanted to run the last command that started with the string\n"},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"find"}]},{"type":"text","value":", you can use "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"!find"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"className":"language-bash shiki shiki-themes github-light","code":"$ !find\nfind . -name *.py\n","language":"bash","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" !find\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"find"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -name"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" *"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":".py\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Be sure to check out the "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"Event Designators"}]},{"type":"text","value":" section of the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"bash"}]},{"type":"text","value":" "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"man"}]},{"type":"text","value":" pages\nfor more information!"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"--"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"As an aside, for even faster command-line history navigation, be sure to check\nout the excellent "},{"type":"element","tag":"a","props":{"href":"https://github.com/junegunn/fzf","rel":["nofollow"]},"children":[{"type":"text","value":"fzf"}]},{"type":"text","value":" utility by "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"junegunn."}]},{"type":"text","value":"\nOne of the many features of "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"fzf"}]},{"type":"text","value":" is browsing and re-issuing commands from your\ncommand-line history with a fuzzy-finder!"}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:articles:quick-tip-rerunning-bash-commands.md","_source":"content","_file":"articles/quick-tip-rerunning-bash-commands.md","_extension":"md"},{"_path":"/articles/reset-ipmi-password-from-host-os","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Reset IPMI Credentials from the Host OS","description":"If you ever find yourself locked out of the Intelligent Platform Management Interface (IPMI) of a server, these\ninstructions will guide your through the process of resetting the credentials to their default values from the host\noperating system.","date":"2021-12-27","tags":["homelab","supermicro","truenas"],"categories":["homelab"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you ever find yourself locked out of the Intelligent Platform Management Interface (IPMI) of a server, these\ninstructions will guide your through the process of resetting the credentials to their default values from the host\noperating system."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you ever find yourself locked out of the Intelligent Platform Management Interface (IPMI) of a server, these\ninstructions will guide your through the process of resetting the credentials to their default values from the host\noperating system."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you are using an operating system like TrueNAS -- good news! It's possible to reset the IPMI password directly from\nthe web interface. This is done by navigating to "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"Network > IPMI"}]},{"type":"text","value":", and simply entering a new value in the "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"IPMI\nPassword Reset"}]},{"type":"text","value":" field."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If you are using some other OS that doesn't have this feature, you can achieve similar results by using the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ipmitool"}]},{"type":"text","value":"\ncommand-line utility."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"First, you'll want to determine the user ID associated with the user for whom you'd like to reset the password."}]},{"type":"element","tag":"pre","props":{"code":"# ipmitool user list\nID Name Callin Link Auth IPMI Msg Channel Priv Limit\n1 true false false Unknown (0x00)\n2 ADMIN true false false Unknown (0x00)\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"# ipmitool user list\nID Name Callin Link Auth IPMI Msg Channel Priv Limit\n1 true false false Unknown (0x00)\n2 ADMIN true false false Unknown (0x00)\n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In this case, we will be resetting the password for "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"ADMIN"}]},{"type":"text","value":" who has a user ID of "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":". Then we'll assign the new\npassword like so:"}]},{"type":"element","tag":"pre","props":{"code":"# ipmitool user set password 2 \n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"# ipmitool user set password 2 \n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And you should be good to go!"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"..."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Alternatively, if you'd like to factory reset the baseboard management controller (BMC), which will reset the IPMI\ncredentials to their default value, you can issue the following command."}]},{"type":"element","tag":"pre","props":{"code":"# ipmitool raw 0x3c 0x40\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"# ipmitool raw 0x3c 0x40\n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Where "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"0x3c"}]},{"type":"text","value":" is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":""}]},{"type":"text","value":" argument, a.k.a. the network function code that defines the functional routing for\nmessages, and "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"0x40"}]},{"type":"text","value":" is the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":""}]},{"type":"text","value":". According to section 5.1 of the "},{"type":"element","tag":"a","props":{"href":"https://www.intel.com/content/dam/www/public/us/en/documents/product-briefs/ipmi-second-gen-interface-spec-v2-rev1-1.pdf","rel":["nofollow"]},"children":[{"type":"text","value":"IPMI interface\nspecification"}]},{"type":"text","value":",\n"},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"netfn"}]},{"type":"text","value":" codes ranging from 0x30 to 0x3F are reserved for vendor specific functions. I searched around for some\nSupermicro references on these vendor specific network functions without much luck other than various "},{"type":"element","tag":"a","props":{"href":"https://www.supermicro.com/support/faqs/faq.cfm?faq=15448","rel":["nofollow"]},"children":[{"type":"text","value":"support\nresponses"}]},{"type":"text","value":" on how to reset a device. Bummer!"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:articles:reset-ipmi-password-from-host-os.md","_source":"content","_file":"articles/reset-ipmi-password-from-host-os.md","_extension":"md"},{"_path":"/articles/ssh-ed25519-sk-yubikey","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Configuring a YubiKey for use with OpenSSH","description":"YubiKey's are a convenient way to introduce a physical form of two factor authentication into ones workflow. They support a variety of protocols, but in this guide we will walk through how to configure a YubiKey for use with OpenSSH via the \"new\" ed25519-sk key type that supports FIDO compliant hardware keys.","draft":false,"date":"2024-06-09","tags":["unix","configurations"],"categories":["tooling","tips"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://www.yubico.com/","rel":["nofollow"]},"children":[{"type":"text","value":"YubiKey's"}]},{"type":"text","value":" are a convenient way to introduce a physical form of two factor authentication into ones workflow. They support a variety of protocols, but in this guide we will walk through how to configure a YubiKey for use with OpenSSH via the \"new\" "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ed25519-sk"}]},{"type":"text","value":" key type that supports FIDO compliant hardware keys."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://www.yubico.com/","rel":["nofollow"]},"children":[{"type":"text","value":"YubiKey's"}]},{"type":"text","value":" are a convenient way to introduce a physical form of two factor authentication into ones workflow. They support a variety of protocols, but in this guide we will walk through how to configure a YubiKey for use with OpenSSH via the \"new\" "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"ed25519-sk"}]},{"type":"text","value":" key type that supports FIDO compliant hardware keys."}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In "},{"type":"element","tag":"a","props":{"href":"https://www.openssh.com/txt/release-8.2","rel":["nofollow"]},"children":[{"type":"text","value":"release 8.2 of OpenSSH"}]},{"type":"text","value":" support for FIDO devices was added with public key types \"ecdsa-sk\" and \"ed25519-sk\" (-sk standing for \"security key\"). This key type is supported by YubiKey's with firmware version 5.2.3 or higher."}]},{"type":"element","tag":"blockquote","props":{},"children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"This release adds support for FIDO/U2F hardware authenticators to OpenSSH. U2F/FIDO are open standards for inexpensive two-factor authentication hardware that are widely used for website authentication. In OpenSSH FIDO devices are supported by new public key types \"ecdsa-sk\" and \"ed25519-sk\", along with corresponding certificate types."}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Let's get started by installing the latest version of OpenSSH via "},{"type":"element","tag":"a","props":{"href":"https://brew.sh/","rel":["nofollow"]},"children":[{"type":"text","value":"Homebrew"}]},{"type":"text","value":", along with the YubiKey Manager (ykman) CLI. The version of OpenSSH included with macOS is not compatible."}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"$ brew install openssh ykman\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" brew"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" install"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" openssh"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ykman\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Then, let's confirm that our YubiKey has a firmware that is greater than 5.2.3:"}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"$ ykman list\nYubiKey 5Ci (5.4.3) [OTP+FIDO+CCID]\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ykman"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" list\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"YubiKey"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" 5Ci"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" (5.4.3) [OTP+FIDO+CCID]\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Next, we'll go ahead and enable a pin on our device via the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"change-pin"}]},{"type":"text","value":" command, as this a requirement for our use."}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"$ ykman fido access change-pin\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ykman"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" fido"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" access"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" change-pin\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And last, we'll generate the key on our device!"}]},{"type":"element","tag":"pre","props":{"className":"language-sh shiki shiki-themes github-light","code":"$ ssh-keygen -t ed25519-sk -O resident\nGenerating public/private ed25519-sk key pair.\nYou may need to touch your authenticator to authorize key generation.\n...\n","language":"sh","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ssh-keygen"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -t"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ed25519-sk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" -O"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" resident\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"Generating"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" public/private"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" ed25519-sk"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" key"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" pair.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"You"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" may"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" need"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" to"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" touch"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" your"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" authenticator"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" to"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" authorize"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" key"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" generation.\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"...\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"We specify "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"resident"}]},{"type":"text","value":" to indicate that the key handle is to be stored on the YubiKey itself, since we will be using this device with multiple computers."}]},{"type":"element","tag":"pre","props":{"className":"language-txt shiki shiki-themes github-light","code":"resident\n Indicate that the key handle should be stored on the FIDO\n authenticator itself. This makes it easier to use the\n authenticator on multiple computers. Resident keys may be\n supported on FIDO2 authenticators and typically require that a PIN\n be set on the authenticator prior to generation. Resident keys\n may be loaded off the authenticator using ssh-add(1). Storing\n both parts of a key on a FIDO authenticator increases the\n likelihood of an attacker being able to use a stolen authenticator\n device.\n","language":"txt","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":"resident\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" Indicate that the key handle should be stored on the FIDO\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" authenticator itself. This makes it easier to use the\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" authenticator on multiple computers. Resident keys may be\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" supported on FIDO2 authenticators and typically require that a PIN\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" be set on the authenticator prior to generation. Resident keys\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" may be loaded off the authenticator using ssh-add(1). Storing\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" both parts of a key on a FIDO authenticator increases the\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" likelihood of an attacker being able to use a stolen authenticator\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{},"children":[{"type":"text","value":" device.\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"And that's all it takes -- simple enough. Now, when interacting with "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"ssh"}]},{"type":"text","value":" or "},{"type":"element","tag":"em","props":{},"children":[{"type":"text","value":"git"}]},{"type":"text","value":" you will be prompted to touch the YubiKey to bring that little bit of physical 2FA."}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[]}},"_type":"markdown","_id":"content:articles:ssh-ed25519-sk-yubikey.md","_source":"content","_file":"articles/ssh-ed25519-sk-yubikey.md","_extension":"md"},{"_path":"/articles/unit-testing-micropython-with-mocks","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Unit Testing in MicroPython with Mocks","description":"Unit testing code for embedded systems can be challenging. While it's possible\nto leverage emulators, write side-effect free code, or run tests on the\nhardware itself, it's often easiest to unit test the code on your personal\ncomputer with mocked hardware functionality.","date":"2020-02-07","draft":false,"tags":["micropython","testing","mocks","tutorial"],"categories":["python","embedded"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Unit testing code for embedded systems can be challenging. While it's possible\nto leverage emulators, write side-effect free code, or run tests on the\nhardware itself, it's often easiest to unit test the code on your personal\ncomputer with mocked hardware functionality."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Unit testing code for embedded systems can be challenging. While it's possible\nto leverage emulators, write side-effect free code, or run tests on the\nhardware itself, it's often easiest to unit test the code on your personal\ncomputer with mocked hardware functionality."}]},{"type":"element","tag":"h1","props":{"id":"mocking"},"children":[{"type":"text","value":"Mocking"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Mocks allow us to replace the hardware interfacing functionality under-the-hood\nwith predefined results and side-effects. For example, if there is a piece of\nlogic that retrieves values from an accelerometer to get a device's\norientation, it would be possible to mock the returned values of the\naccelerometer -- allowing us to run the unit tests on a device that does not\nhave an accelerometer sensor installed."}]},{"type":"element","tag":"h1","props":{"id":"a-micropython-mocking-example"},"children":[{"type":"text","value":"A MicroPython Mocking Example"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In this example, we will be unit testing a module named "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"time_logger"}]},{"type":"text","value":", that\ndepends on the MicroPython library "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"utime"}]},{"type":"text","value":" to log the most recent Epoch time to\na file."}]},{"type":"element","tag":"pre","props":{"className":"language-python shiki shiki-themes github-light","code":"# time_logger.py\n\nclass TimeLogger(object):\n\n def save_time(self):\n \"\"\" Overwrite a file with the most recent Epoch timestamp from `utime`\n \"\"\"\n with open(\"LAST_KNOWN_TIME\", \"w+\") as f:\n f.write(str(utime.time()))\n","language":"python","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# time_logger.py\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" TimeLogger"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"object"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"):\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" def"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" save_time"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(self):\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"\"\" Overwrite a file with the most recent Epoch timestamp from `utime`\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"\"\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" with"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" open"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"LAST_KNOWN_TIME\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"w+\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" f:\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" f.write("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"str"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(utime.time()))\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"First, because the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"utime"}]},{"type":"text","value":" module is not installed on the machine that the unit\ntests on, we must mock "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"utime"}]},{"type":"text","value":" module before importing "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"time_logger"}]},{"type":"text","value":" in our\nunit test file."}]},{"type":"element","tag":"pre","props":{"className":"language-python shiki shiki-themes github-light","code":"# test_time_logger.py\n\nimport unittest\n\nfrom unittest.mock import MagicMock\n\nsys.modules['utime'] = MagicMock()\nfrom time_logger import TimeLogger\n","language":"python","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6A737D"},"children":[{"type":"text","value":"# test_time_logger.py\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" unittest\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" unittest.mock "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" MagicMock\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"sys.modules["}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"'utime'"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"] "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" MagicMock()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"from"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" time_logger "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"import"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" TimeLogger\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Then, we can write a test that patches the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"utime.time"}]},{"type":"text","value":" functionality so that\nit returns a value of our choosing -- in this case, "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"1234"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"className":"language-python shiki shiki-themes github-light","code":"class TestTimeLogger(unittest.TestCase):\n\n def test_save_time(self):\n \"\"\" Verify that the Epoch time is written to file\n \"\"\"\n with unittest.mock.patch(\"utime.time\", return_value=1234):\n t = TimeLogger()\n t.save_time()\n with open(\"LAST_KNOWN_TIME\") as f:\n self.assertEqual(\"1234\", f.read())\n","language":"python","meta":"","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"class"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" TestTimeLogger"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"unittest"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"."}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"TestCase"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"):\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"emptyLinePlaceholder":true},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":3},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" def"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":" test_save_time"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"(self):\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":4},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"\"\" Verify that the Epoch time is written to file\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":5},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" \"\"\"\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":6},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" with"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" unittest.mock.patch("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"utime.time\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#E36209"},"children":[{"type":"text","value":"return_value"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":"1234"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"):\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":7},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" t "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"="}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" TimeLogger()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":8},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" t.save_time()\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":9},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":" with"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" open"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":"("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"LAST_KNOWN_TIME\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":") "}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#D73A49"},"children":[{"type":"text","value":"as"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":" f:\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":10},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" self"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":".assertEqual("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":"\"1234\""}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#24292E"},"children":[{"type":"text","value":", f.read())\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Now, when the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"save_time"}]},{"type":"text","value":" method gets the latest time from "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"utime.time()"}]},{"type":"text","value":", the\nvalue will be patched to return "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"1234"}]},{"type":"text","value":". That value will be written to a file,\nand our unit test will pass!"}]},{"type":"element","tag":"h2","props":{"id":"references"},"children":[{"type":"text","value":"References"}]},{"type":"element","tag":"ol","props":{},"children":[{"type":"element","tag":"li","props":{},"children":[{"type":"element","tag":"a","props":{"href":"https://docs.python.org/3/library/unittest.html","rel":["nofollow"]},"children":[{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"unittest"}]},{"type":"text","value":" — Unit testing framework"}]}]}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"references","depth":2,"text":"References"}]}},"_type":"markdown","_id":"content:articles:unit-testing-micropython-with-mocks.md","_source":"content","_file":"articles/unit-testing-micropython-with-mocks.md","_extension":"md"},{"_path":"/articles/vim-fugitive-gpg-pinentry","_dir":"articles","_draft":false,"_partial":false,"_locale":"","title":"Using pinentry-mac to sign commits from vim-fugitive","description":"In order to sign git commits from within Vim using a plugin like tpope/vim-fugitive, it is necessary to configure the gpg-agent to use a GUI based pinentry-program.","draft":false,"date":"2024-05-11","tags":["vim","tip"],"categories":["tooling","tips"],"excerpt":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In order to sign git commits from within Vim using a plugin like "},{"type":"element","tag":"a","props":{"href":"https://github.com/tpope/vim-fugitive","rel":["nofollow"]},"children":[{"type":"text","value":"tpope/vim-fugitive"}]},{"type":"text","value":", it is necessary to configure the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"gpg-agent"}]},{"type":"text","value":" to use a GUI based "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"pinentry-program"}]},{"type":"text","value":"."}]}]},"body":{"type":"root","children":[{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"In order to sign git commits from within Vim using a plugin like "},{"type":"element","tag":"a","props":{"href":"https://github.com/tpope/vim-fugitive","rel":["nofollow"]},"children":[{"type":"text","value":"tpope/vim-fugitive"}]},{"type":"text","value":", it is necessary to configure the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"gpg-agent"}]},{"type":"text","value":" to use a GUI based "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"pinentry-program"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"preface"},"children":[{"type":"text","value":"Preface"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"The man, the myth, the legend, Timothy Popallopollis himself "},{"type":"element","tag":"a","props":{"href":"https://github.com/tpope/vim-fugitive/issues/846#issuecomment-253816577","rel":["nofollow"]},"children":[{"type":"text","value":"recommends"}]},{"type":"text","value":" configuring your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"gpg-agent"}]},{"type":"text","value":" to use a GUI based "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"pinentry-program"}]},{"type":"text","value":". On macOS this can be done quite by simply installing "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"pinentry-mac"}]},{"type":"text","value":", and updating your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"gpg-agent.conf"}]},{"type":"text","value":"."}]},{"type":"element","tag":"h2","props":{"id":"configuration"},"children":[{"type":"text","value":"Configuration"}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"First things first, let's install the pinentry program."}]},{"type":"element","tag":"pre","props":{"code":"$ brew install pinentry-mac\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" brew"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" install"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" pinentry-mac\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Then, all we need to do is set the "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"pinentry-program"}]},{"type":"text","value":" option in your "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"~/.gnupg/gpg-agent.conf"}]},{"type":"text","value":" file."}]},{"type":"element","tag":"pre","props":{"code":"default-cache-ttl 600\nmax-cache-ttl 7200\npinentry-program /opt/homebrew/bin/pinentry-mac\n"},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"text","value":"default-cache-ttl 600\nmax-cache-ttl 7200\npinentry-program /opt/homebrew/bin/pinentry-mac\n"}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"If your don't know the path to your pinentry program, you can throw down a quick "},{"type":"element","tag":"code","props":{"className":[]},"children":[{"type":"text","value":"which"}]},{"type":"text","value":"."}]},{"type":"element","tag":"pre","props":{"code":"$ which pinentry-mac\n/opt/homebrew/bin/pinentry-mac\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" which"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" pinentry-mac\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"/opt/homebrew/bin/pinentry-mac\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"Or use your Homebrew prefix."}]},{"type":"element","tag":"pre","props":{"code":"$ echo $(brew --prefix)/bin/pinentry-mac\n/opt/homebrew/bin/pinentry-mac\n","language":"bash","meta":"","className":"language-bash shiki shiki-themes github-light","style":""},"children":[{"type":"element","tag":"code","props":{"__ignoreMap":""},"children":[{"type":"element","tag":"span","props":{"class":"line","line":1},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"$"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" echo"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":" $("}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"brew"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#005CC5"},"children":[{"type":"text","value":" --prefix"}]},{"type":"element","tag":"span","props":{"style":"--shiki-default:#032F62"},"children":[{"type":"text","value":")/bin/pinentry-mac\n"}]}]},{"type":"element","tag":"span","props":{"class":"line","line":2},"children":[{"type":"element","tag":"span","props":{"style":"--shiki-default:#6F42C1"},"children":[{"type":"text","value":"/opt/homebrew/bin/pinentry-mac\n"}]}]}]}]},{"type":"element","tag":"p","props":{},"children":[{"type":"text","value":"But that's all it takes. Now, you should be prompted to enter your gpg pin in an external window when signing commits from vim."}]},{"type":"element","tag":"style","props":{},"children":[{"type":"text","value":"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}"}]}],"toc":{"title":"","searchDepth":2,"depth":2,"links":[{"id":"preface","depth":2,"text":"Preface"},{"id":"configuration","depth":2,"text":"Configuration"}]}},"_type":"markdown","_id":"content:articles:vim-fugitive-gpg-pinentry.md","_source":"content","_file":"articles/vim-fugitive-gpg-pinentry.md","_extension":"md"}],"navigation":[{"title":"Articles","_path":"/articles","children":[{"title":"Upgrading the Firmware on the PCEngines APU2","_path":"/articles/apu2-firmware-upgrade"},{"title":"Docker Volume Permissions with SELinux","_path":"/articles/docker-selinux-volumes"},{"title":"Exploring the Digital Ocean `doctl` Utility","_path":"/articles/doctl"},{"title":"Impressions of Fennel with Hammerspoon","_path":"/articles/fennel-initial-exploration"},{"title":"Migrate to TrueNAS Scale from TrueNAS Core","_path":"/articles/migrate-truenas-from-core-to-scale"},{"title":"How To Add an RSS Feed to a Nuxt Website","_path":"/articles/nuxt-content-rss-feed"},{"title":"This Website Has Been Migrated to Nuxt 3 🎉","_path":"/articles/nuxt-v3-migration"},{"title":"Create a Persistent Arch Linux Bootable USB with Vagrant","_path":"/articles/persistent-archlinux-usb"},{"title":"Easily Transcribe Podcasts with Whisper.cpp","_path":"/articles/podcast-transcription-whispercpp"},{"title":"Tip: Re-running Bash Commands","_path":"/articles/quick-tip-rerunning-bash-commands"},{"title":"Reset IPMI Credentials from the Host OS","_path":"/articles/reset-ipmi-password-from-host-os"},{"title":"Configuring a YubiKey for use with OpenSSH","_path":"/articles/ssh-ed25519-sk-yubikey"},{"title":"Unit Testing in MicroPython with Mocks","_path":"/articles/unit-testing-micropython-with-mocks"},{"title":"Using pinentry-mac to sign commits from vim-fugitive","_path":"/articles/vim-fugitive-gpg-pinentry"}]}]} \ No newline at end of file diff --git a/api/_content/query/0ikQYfLQVZ.1718428834464.json b/api/_content/query/0ikQYfLQVZ.1718681810623.json similarity index 100% rename from api/_content/query/0ikQYfLQVZ.1718428834464.json rename to api/_content/query/0ikQYfLQVZ.1718681810623.json diff --git a/api/_content/query/0vuDGaHulu.1718428834464.json b/api/_content/query/0vuDGaHulu.1718681810623.json similarity index 100% rename from api/_content/query/0vuDGaHulu.1718428834464.json rename to api/_content/query/0vuDGaHulu.1718681810623.json diff --git a/api/_content/query/1BkkvizQw8.1718428834464.json b/api/_content/query/1BkkvizQw8.1718681810623.json similarity index 100% rename from api/_content/query/1BkkvizQw8.1718428834464.json rename to api/_content/query/1BkkvizQw8.1718681810623.json diff --git a/api/_content/query/AwYZnKuAHr.1718428834464.json b/api/_content/query/AwYZnKuAHr.1718681810623.json similarity index 100% rename from api/_content/query/AwYZnKuAHr.1718428834464.json rename to api/_content/query/AwYZnKuAHr.1718681810623.json diff --git a/api/_content/query/C0SimRluqy.1718428834464.json b/api/_content/query/C0SimRluqy.1718681810623.json similarity index 100% rename from api/_content/query/C0SimRluqy.1718428834464.json rename to api/_content/query/C0SimRluqy.1718681810623.json diff --git a/api/_content/query/DIau8q3IMV.1718428834464.json b/api/_content/query/DIau8q3IMV.1718681810623.json similarity index 100% rename from api/_content/query/DIau8q3IMV.1718428834464.json rename to api/_content/query/DIau8q3IMV.1718681810623.json diff --git a/api/_content/query/PYi9meWOqm.1718428834464.json b/api/_content/query/PYi9meWOqm.1718681810623.json similarity index 100% rename from api/_content/query/PYi9meWOqm.1718428834464.json rename to api/_content/query/PYi9meWOqm.1718681810623.json diff --git a/api/_content/query/QB64GpMlA8.1718428834464.json b/api/_content/query/QB64GpMlA8.1718681810623.json similarity index 100% rename from api/_content/query/QB64GpMlA8.1718428834464.json rename to api/_content/query/QB64GpMlA8.1718681810623.json diff --git a/api/_content/query/SFFy74pu72.1718428834464.json b/api/_content/query/SFFy74pu72.1718681810623.json similarity index 100% rename from api/_content/query/SFFy74pu72.1718428834464.json rename to api/_content/query/SFFy74pu72.1718681810623.json diff --git a/api/_content/query/TxpJ5sv0HY.1718428834464.json b/api/_content/query/TxpJ5sv0HY.1718681810623.json similarity index 100% rename from api/_content/query/TxpJ5sv0HY.1718428834464.json rename to api/_content/query/TxpJ5sv0HY.1718681810623.json diff --git a/api/_content/query/bXj5vj6Ts0.1718428834464.json b/api/_content/query/bXj5vj6Ts0.1718681810623.json similarity index 100% rename from api/_content/query/bXj5vj6Ts0.1718428834464.json rename to api/_content/query/bXj5vj6Ts0.1718681810623.json diff --git a/api/_content/query/cOxeB6k0CX.1718428834464.json b/api/_content/query/cOxeB6k0CX.1718681810623.json similarity index 100% rename from api/_content/query/cOxeB6k0CX.1718428834464.json rename to api/_content/query/cOxeB6k0CX.1718681810623.json diff --git a/api/_content/query/lIKyXFs9L8.1718428834464.json b/api/_content/query/lIKyXFs9L8.1718681810623.json similarity index 100% rename from api/_content/query/lIKyXFs9L8.1718428834464.json rename to api/_content/query/lIKyXFs9L8.1718681810623.json diff --git a/api/_content/query/ph6vNEpVOi.1718428834464.json b/api/_content/query/ph6vNEpVOi.1718681810623.json similarity index 100% rename from api/_content/query/ph6vNEpVOi.1718428834464.json rename to api/_content/query/ph6vNEpVOi.1718681810623.json diff --git a/api/_content/query/wVY7dvWXwt.1718428834464.json b/api/_content/query/wVY7dvWXwt.1718681810623.json similarity index 100% rename from api/_content/query/wVY7dvWXwt.1718428834464.json rename to api/_content/query/wVY7dvWXwt.1718681810623.json diff --git a/api/_content/query/x8mzqct7Ta.1718428834464.json b/api/_content/query/x8mzqct7Ta.1718681810623.json similarity index 100% rename from api/_content/query/x8mzqct7Ta.1718428834464.json rename to api/_content/query/x8mzqct7Ta.1718681810623.json diff --git a/articles/_payload.json b/articles/_payload.json index 8db5a319..481d844c 100644 --- a/articles/_payload.json +++ b/articles/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718428847843] \ No newline at end of file +[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718681823577] \ No newline at end of file diff --git a/articles/apu2-firmware-upgrade/_payload.json b/articles/apu2-firmware-upgrade/_payload.json index e8959086..53e09675 100644 --- a/articles/apu2-firmware-upgrade/_payload.json +++ b/articles/apu2-firmware-upgrade/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":314},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"draft":6,"tags":11,"categories":14,"excerpt":16,"body":43,"_type":309,"_id":310,"_source":311,"_file":312,"_extension":313},"/articles/apu2-firmware-upgrade","articles",false,"","Upgrading the Firmware on the PCEngines APU2","I've had a PCEngines APU2 gathering dust for a\nfew years, and have recently decided to dust it off.","2019-12-21",[12,13],"pcengine","apu",[15],"linux",{"type":17,"children":18},"root",[19,38],{"type":20,"tag":21,"props":22,"children":23},"element","p",{},[24,27,36],{"type":25,"value":26},"text","I've had a ",{"type":20,"tag":28,"props":29,"children":33},"a",{"href":30,"rel":31},"https://pcengines.ch/apu2.htm",[32],"nofollow",[34],{"type":25,"value":35},"PCEngines APU2",{"type":25,"value":37}," gathering dust for a\nfew years, and have recently decided to dust it off.",{"type":20,"tag":21,"props":39,"children":40},{},[41],{"type":25,"value":42},"Since the last time the device has been powered on, there have been many great\nimprovements to the firmware, and it was very-much due for an upgrade. The\nfollowing steps outline how the firmware was upgraded on the APU from the\nalready-installed operating system -- CentOS.",{"type":17,"children":44,"toc":307},[45,55,59,64,74,103,161,174,200,205,244,253,301],{"type":20,"tag":21,"props":46,"children":47},{},[48,49,54],{"type":25,"value":26},{"type":20,"tag":28,"props":50,"children":52},{"href":30,"rel":51},[32],[53],{"type":25,"value":35},{"type":25,"value":37},{"type":20,"tag":21,"props":56,"children":57},{},[58],{"type":25,"value":42},{"type":20,"tag":21,"props":60,"children":61},{},[62],{"type":25,"value":63},"First, we will connect to the device over the serial port",{"type":20,"tag":65,"props":66,"children":68},"pre",{"code":67},"screen /dev/tty.usbserial 115200\n",[69],{"type":20,"tag":70,"props":71,"children":72},"code",{"__ignoreMap":7},[73],{"type":25,"value":67},{"type":20,"tag":21,"props":75,"children":76},{},[77,79,85,87,93,95,101],{"type":25,"value":78},"Then, we will install the ",{"type":20,"tag":70,"props":80,"children":82},{"className":81},[],[83],{"type":25,"value":84},"flashrom",{"type":25,"value":86}," utility that is needed to update the\nfirmware. Because it is not available in the default ",{"type":20,"tag":70,"props":88,"children":90},{"className":89},[],[91],{"type":25,"value":92},"yum",{"type":25,"value":94}," repositories, we\nwill enable the ",{"type":20,"tag":96,"props":97,"children":98},"em",{},[99],{"type":25,"value":100},"Extra Packages for Enterprise Linux",{"type":25,"value":102}," (EPEL) repository before\ninstallation.",{"type":20,"tag":65,"props":104,"children":108},{"code":105,"language":106,"meta":7,"className":107,"style":7},"sudo yum install epel-release\nsudo yum install flashrom\n","bash","language-bash shiki shiki-themes github-light",[109],{"type":20,"tag":70,"props":110,"children":111},{"__ignoreMap":7},[112,140],{"type":20,"tag":113,"props":114,"children":117},"span",{"class":115,"line":116},"line",1,[118,124,130,135],{"type":20,"tag":113,"props":119,"children":121},{"style":120},"--shiki-default:#6F42C1",[122],{"type":25,"value":123},"sudo",{"type":20,"tag":113,"props":125,"children":127},{"style":126},"--shiki-default:#032F62",[128],{"type":25,"value":129}," yum",{"type":20,"tag":113,"props":131,"children":132},{"style":126},[133],{"type":25,"value":134}," install",{"type":20,"tag":113,"props":136,"children":137},{"style":126},[138],{"type":25,"value":139}," epel-release\n",{"type":20,"tag":113,"props":141,"children":143},{"class":115,"line":142},2,[144,148,152,156],{"type":20,"tag":113,"props":145,"children":146},{"style":120},[147],{"type":25,"value":123},{"type":20,"tag":113,"props":149,"children":150},{"style":126},[151],{"type":25,"value":129},{"type":20,"tag":113,"props":153,"children":154},{"style":126},[155],{"type":25,"value":134},{"type":20,"tag":113,"props":157,"children":158},{"style":126},[159],{"type":25,"value":160}," flashrom\n",{"type":20,"tag":21,"props":162,"children":163},{},[164,166,172],{"type":25,"value":165},"Next, we will download the latest version of the firmware that is compatible\nwith the APU2 device from the PC Engines release website:\n",{"type":20,"tag":28,"props":167,"children":170},{"href":168,"rel":169},"https://pcengines.github.io/",[32],[171],{"type":25,"value":168},{"type":25,"value":173},".",{"type":20,"tag":65,"props":175,"children":177},{"code":176,"language":106,"meta":7,"className":107,"style":7},"curl -O https://3mdeb.com/open-source-firmware/pcengines/apu2/apu2_v4.11.0.1.rom\n",[178],{"type":20,"tag":70,"props":179,"children":180},{"__ignoreMap":7},[181],{"type":20,"tag":113,"props":182,"children":183},{"class":115,"line":116},[184,189,195],{"type":20,"tag":113,"props":185,"children":186},{"style":120},[187],{"type":25,"value":188},"curl",{"type":20,"tag":113,"props":190,"children":192},{"style":191},"--shiki-default:#005CC5",[193],{"type":25,"value":194}," -O",{"type":20,"tag":113,"props":196,"children":197},{"style":126},[198],{"type":25,"value":199}," https://3mdeb.com/open-source-firmware/pcengines/apu2/apu2_v4.11.0.1.rom\n",{"type":20,"tag":21,"props":201,"children":202},{},[203],{"type":25,"value":204},"And finally, we will flash the firmware...",{"type":20,"tag":65,"props":206,"children":208},{"code":207,"language":106,"meta":7,"className":107,"style":7},"sudo flashrom -w apu2_v4.11.0.1.rom -p internal:boardmismatch=force\n",[209],{"type":20,"tag":70,"props":210,"children":211},{"__ignoreMap":7},[212],{"type":20,"tag":113,"props":213,"children":214},{"class":115,"line":116},[215,219,224,229,234,239],{"type":20,"tag":113,"props":216,"children":217},{"style":120},[218],{"type":25,"value":123},{"type":20,"tag":113,"props":220,"children":221},{"style":126},[222],{"type":25,"value":223}," flashrom",{"type":20,"tag":113,"props":225,"children":226},{"style":191},[227],{"type":25,"value":228}," -w",{"type":20,"tag":113,"props":230,"children":231},{"style":126},[232],{"type":25,"value":233}," apu2_v4.11.0.1.rom",{"type":20,"tag":113,"props":235,"children":236},{"style":191},[237],{"type":25,"value":238}," -p",{"type":20,"tag":113,"props":240,"children":241},{"style":126},[242],{"type":25,"value":243}," internal:boardmismatch=force\n",{"type":20,"tag":21,"props":245,"children":246},{},[247],{"type":20,"tag":248,"props":249,"children":250},"strong",{},[251],{"type":25,"value":252},"References:",{"type":20,"tag":254,"props":255,"children":256},"ul",{},[257,266,274,283,292],{"type":20,"tag":258,"props":259,"children":260},"li",{},[261],{"type":20,"tag":28,"props":262,"children":264},{"href":30,"rel":263},[32],[265],{"type":25,"value":30},{"type":20,"tag":258,"props":267,"children":268},{},[269],{"type":20,"tag":28,"props":270,"children":272},{"href":168,"rel":271},[32],[273],{"type":25,"value":168},{"type":20,"tag":258,"props":275,"children":276},{},[277],{"type":20,"tag":28,"props":278,"children":281},{"href":279,"rel":280},"https://github.com/pcengines/apu2-documentation/blob/master/docs/firmware_flashing.md",[32],[282],{"type":25,"value":279},{"type":20,"tag":258,"props":284,"children":285},{},[286],{"type":20,"tag":28,"props":287,"children":290},{"href":288,"rel":289},"https://github.com/pcengines/apu2-documentation/blob/master/docs/cold_reset.md",[32],[291],{"type":25,"value":288},{"type":20,"tag":258,"props":293,"children":294},{},[295],{"type":20,"tag":28,"props":296,"children":299},{"href":297,"rel":298},"https://github.com/elad/openbsd-apu2",[32],[300],{"type":25,"value":297},{"type":20,"tag":302,"props":303,"children":304},"style",{},[305],{"type":25,"value":306},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":142,"depth":142,"links":308},[],"markdown","content:articles:apu2-firmware-upgrade.md","content","articles/apu2-firmware-upgrade.md","md",1718428848930] \ No newline at end of file +[{"data":1,"prerenderedAt":314},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"draft":6,"tags":11,"categories":14,"excerpt":16,"body":43,"_type":309,"_id":310,"_source":311,"_file":312,"_extension":313},"/articles/apu2-firmware-upgrade","articles",false,"","Upgrading the Firmware on the PCEngines APU2","I've had a PCEngines APU2 gathering dust for a\nfew years, and have recently decided to dust it off.","2019-12-21",[12,13],"pcengine","apu",[15],"linux",{"type":17,"children":18},"root",[19,38],{"type":20,"tag":21,"props":22,"children":23},"element","p",{},[24,27,36],{"type":25,"value":26},"text","I've had a ",{"type":20,"tag":28,"props":29,"children":33},"a",{"href":30,"rel":31},"https://pcengines.ch/apu2.htm",[32],"nofollow",[34],{"type":25,"value":35},"PCEngines APU2",{"type":25,"value":37}," gathering dust for a\nfew years, and have recently decided to dust it off.",{"type":20,"tag":21,"props":39,"children":40},{},[41],{"type":25,"value":42},"Since the last time the device has been powered on, there have been many great\nimprovements to the firmware, and it was very-much due for an upgrade. The\nfollowing steps outline how the firmware was upgraded on the APU from the\nalready-installed operating system -- CentOS.",{"type":17,"children":44,"toc":307},[45,55,59,64,74,103,161,174,200,205,244,253,301],{"type":20,"tag":21,"props":46,"children":47},{},[48,49,54],{"type":25,"value":26},{"type":20,"tag":28,"props":50,"children":52},{"href":30,"rel":51},[32],[53],{"type":25,"value":35},{"type":25,"value":37},{"type":20,"tag":21,"props":56,"children":57},{},[58],{"type":25,"value":42},{"type":20,"tag":21,"props":60,"children":61},{},[62],{"type":25,"value":63},"First, we will connect to the device over the serial port",{"type":20,"tag":65,"props":66,"children":68},"pre",{"code":67},"screen /dev/tty.usbserial 115200\n",[69],{"type":20,"tag":70,"props":71,"children":72},"code",{"__ignoreMap":7},[73],{"type":25,"value":67},{"type":20,"tag":21,"props":75,"children":76},{},[77,79,85,87,93,95,101],{"type":25,"value":78},"Then, we will install the ",{"type":20,"tag":70,"props":80,"children":82},{"className":81},[],[83],{"type":25,"value":84},"flashrom",{"type":25,"value":86}," utility that is needed to update the\nfirmware. Because it is not available in the default ",{"type":20,"tag":70,"props":88,"children":90},{"className":89},[],[91],{"type":25,"value":92},"yum",{"type":25,"value":94}," repositories, we\nwill enable the ",{"type":20,"tag":96,"props":97,"children":98},"em",{},[99],{"type":25,"value":100},"Extra Packages for Enterprise Linux",{"type":25,"value":102}," (EPEL) repository before\ninstallation.",{"type":20,"tag":65,"props":104,"children":108},{"code":105,"language":106,"meta":7,"className":107,"style":7},"sudo yum install epel-release\nsudo yum install flashrom\n","bash","language-bash shiki shiki-themes github-light",[109],{"type":20,"tag":70,"props":110,"children":111},{"__ignoreMap":7},[112,140],{"type":20,"tag":113,"props":114,"children":117},"span",{"class":115,"line":116},"line",1,[118,124,130,135],{"type":20,"tag":113,"props":119,"children":121},{"style":120},"--shiki-default:#6F42C1",[122],{"type":25,"value":123},"sudo",{"type":20,"tag":113,"props":125,"children":127},{"style":126},"--shiki-default:#032F62",[128],{"type":25,"value":129}," yum",{"type":20,"tag":113,"props":131,"children":132},{"style":126},[133],{"type":25,"value":134}," install",{"type":20,"tag":113,"props":136,"children":137},{"style":126},[138],{"type":25,"value":139}," epel-release\n",{"type":20,"tag":113,"props":141,"children":143},{"class":115,"line":142},2,[144,148,152,156],{"type":20,"tag":113,"props":145,"children":146},{"style":120},[147],{"type":25,"value":123},{"type":20,"tag":113,"props":149,"children":150},{"style":126},[151],{"type":25,"value":129},{"type":20,"tag":113,"props":153,"children":154},{"style":126},[155],{"type":25,"value":134},{"type":20,"tag":113,"props":157,"children":158},{"style":126},[159],{"type":25,"value":160}," flashrom\n",{"type":20,"tag":21,"props":162,"children":163},{},[164,166,172],{"type":25,"value":165},"Next, we will download the latest version of the firmware that is compatible\nwith the APU2 device from the PC Engines release website:\n",{"type":20,"tag":28,"props":167,"children":170},{"href":168,"rel":169},"https://pcengines.github.io/",[32],[171],{"type":25,"value":168},{"type":25,"value":173},".",{"type":20,"tag":65,"props":175,"children":177},{"code":176,"language":106,"meta":7,"className":107,"style":7},"curl -O https://3mdeb.com/open-source-firmware/pcengines/apu2/apu2_v4.11.0.1.rom\n",[178],{"type":20,"tag":70,"props":179,"children":180},{"__ignoreMap":7},[181],{"type":20,"tag":113,"props":182,"children":183},{"class":115,"line":116},[184,189,195],{"type":20,"tag":113,"props":185,"children":186},{"style":120},[187],{"type":25,"value":188},"curl",{"type":20,"tag":113,"props":190,"children":192},{"style":191},"--shiki-default:#005CC5",[193],{"type":25,"value":194}," -O",{"type":20,"tag":113,"props":196,"children":197},{"style":126},[198],{"type":25,"value":199}," https://3mdeb.com/open-source-firmware/pcengines/apu2/apu2_v4.11.0.1.rom\n",{"type":20,"tag":21,"props":201,"children":202},{},[203],{"type":25,"value":204},"And finally, we will flash the firmware...",{"type":20,"tag":65,"props":206,"children":208},{"code":207,"language":106,"meta":7,"className":107,"style":7},"sudo flashrom -w apu2_v4.11.0.1.rom -p internal:boardmismatch=force\n",[209],{"type":20,"tag":70,"props":210,"children":211},{"__ignoreMap":7},[212],{"type":20,"tag":113,"props":213,"children":214},{"class":115,"line":116},[215,219,224,229,234,239],{"type":20,"tag":113,"props":216,"children":217},{"style":120},[218],{"type":25,"value":123},{"type":20,"tag":113,"props":220,"children":221},{"style":126},[222],{"type":25,"value":223}," flashrom",{"type":20,"tag":113,"props":225,"children":226},{"style":191},[227],{"type":25,"value":228}," -w",{"type":20,"tag":113,"props":230,"children":231},{"style":126},[232],{"type":25,"value":233}," apu2_v4.11.0.1.rom",{"type":20,"tag":113,"props":235,"children":236},{"style":191},[237],{"type":25,"value":238}," -p",{"type":20,"tag":113,"props":240,"children":241},{"style":126},[242],{"type":25,"value":243}," internal:boardmismatch=force\n",{"type":20,"tag":21,"props":245,"children":246},{},[247],{"type":20,"tag":248,"props":249,"children":250},"strong",{},[251],{"type":25,"value":252},"References:",{"type":20,"tag":254,"props":255,"children":256},"ul",{},[257,266,274,283,292],{"type":20,"tag":258,"props":259,"children":260},"li",{},[261],{"type":20,"tag":28,"props":262,"children":264},{"href":30,"rel":263},[32],[265],{"type":25,"value":30},{"type":20,"tag":258,"props":267,"children":268},{},[269],{"type":20,"tag":28,"props":270,"children":272},{"href":168,"rel":271},[32],[273],{"type":25,"value":168},{"type":20,"tag":258,"props":275,"children":276},{},[277],{"type":20,"tag":28,"props":278,"children":281},{"href":279,"rel":280},"https://github.com/pcengines/apu2-documentation/blob/master/docs/firmware_flashing.md",[32],[282],{"type":25,"value":279},{"type":20,"tag":258,"props":284,"children":285},{},[286],{"type":20,"tag":28,"props":287,"children":290},{"href":288,"rel":289},"https://github.com/pcengines/apu2-documentation/blob/master/docs/cold_reset.md",[32],[291],{"type":25,"value":288},{"type":20,"tag":258,"props":293,"children":294},{},[295],{"type":20,"tag":28,"props":296,"children":299},{"href":297,"rel":298},"https://github.com/elad/openbsd-apu2",[32],[300],{"type":25,"value":297},{"type":20,"tag":302,"props":303,"children":304},"style",{},[305],{"type":25,"value":306},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":142,"depth":142,"links":308},[],"markdown","content:articles:apu2-firmware-upgrade.md","content","articles/apu2-firmware-upgrade.md","md",1718681824708] \ No newline at end of file diff --git a/articles/apu2-firmware-upgrade/index.html b/articles/apu2-firmware-upgrade/index.html index 01e8e70c..c70ff49d 100644 --- a/articles/apu2-firmware-upgrade/index.html +++ b/articles/apu2-firmware-upgrade/index.html @@ -4,35 +4,35 @@ - - + + - - - - + + + + - + - - - - - - - - - - - - - - - - -

        Upgrading the Firmware on the PCEngines APU2

        2019-12-21

        I've had a PCEngines APU2 gathering dust for a + + + + + + + + + + + + + + + + +

        Upgrading the Firmware on the PCEngines APU2

        2019-12-21

        I've had a PCEngines APU2 gathering dust for a few years, and have recently decided to dust it off.

        Since the last time the device has been powered on, there have been many great improvements to the firmware, and it was very-much due for an upgrade. The following steps outline how the firmware was upgraded on the APU from the @@ -46,5 +46,5 @@ with the APU2 device from the PC Engines release website: https://pcengines.github.io/.

        curl -O https://3mdeb.com/open-source-firmware/pcengines/apu2/apu2_v4.11.0.1.rom
         

        And finally, we will flash the firmware...

        sudo flashrom -w apu2_v4.11.0.1.rom -p internal:boardmismatch=force
        -

        References:

        - \ No newline at end of file +

        References:

        + \ No newline at end of file diff --git a/articles/docker-selinux-volumes/_payload.json b/articles/docker-selinux-volumes/_payload.json index b67ec4a1..1b40acde 100644 --- a/articles/docker-selinux-volumes/_payload.json +++ b/articles/docker-selinux-volumes/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":239},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"draft":6,"tags":11,"categories":14,"excerpt":16,"body":26,"_type":234,"_id":235,"_source":236,"_file":237,"_extension":238},"/articles/docker-selinux-volumes","articles",false,"","Docker Volume Permissions with SELinux","Unfamiliar with running Docker on a SELinux enabled system, I found myself\nrunning into a bunch of file permission errors while creating volumes.","2019-12-26",[12,13],"docker","selinux",[15],"linux",{"type":17,"children":18},"root",[19],{"type":20,"tag":21,"props":22,"children":23},"element","p",{},[24],{"type":25,"value":9},"text",{"type":17,"children":27,"toc":232},[28,32,53,57,139,160,168,173,190,199,226],{"type":20,"tag":21,"props":29,"children":30},{},[31],{"type":25,"value":9},{"type":20,"tag":33,"props":34,"children":38},"pre",{"code":35,"language":36,"meta":7,"className":37,"style":7},"mkdir: can't create directory '/data': Permission denied\n","txt","language-txt shiki shiki-themes github-light",[39],{"type":20,"tag":40,"props":41,"children":42},"code",{"__ignoreMap":7},[43],{"type":20,"tag":44,"props":45,"children":48},"span",{"class":46,"line":47},"line",1,[49],{"type":20,"tag":44,"props":50,"children":51},{},[52],{"type":25,"value":35},{"type":20,"tag":54,"props":55,"children":56},"hr",{},[],{"type":20,"tag":33,"props":58,"children":62},{"code":59,"language":60,"meta":7,"className":61,"style":7},"$ docker info --format '{{json .SecurityOptions}}'\n[\n \"name=seccomp,profile=/etc/docker/seccomp.json\",\n \"name=selinux\"\n]\n","bash","language-bash shiki shiki-themes github-light",[63],{"type":20,"tag":40,"props":64,"children":65},{"__ignoreMap":7},[66,97,107,121,130],{"type":20,"tag":44,"props":67,"children":68},{"class":46,"line":47},[69,75,81,86,92],{"type":20,"tag":44,"props":70,"children":72},{"style":71},"--shiki-default:#6F42C1",[73],{"type":25,"value":74},"$",{"type":20,"tag":44,"props":76,"children":78},{"style":77},"--shiki-default:#032F62",[79],{"type":25,"value":80}," docker",{"type":20,"tag":44,"props":82,"children":83},{"style":77},[84],{"type":25,"value":85}," info",{"type":20,"tag":44,"props":87,"children":89},{"style":88},"--shiki-default:#005CC5",[90],{"type":25,"value":91}," --format",{"type":20,"tag":44,"props":93,"children":94},{"style":77},[95],{"type":25,"value":96}," '{{json .SecurityOptions}}'\n",{"type":20,"tag":44,"props":98,"children":100},{"class":46,"line":99},2,[101],{"type":20,"tag":44,"props":102,"children":104},{"style":103},"--shiki-default:#24292E",[105],{"type":25,"value":106},"[\n",{"type":20,"tag":44,"props":108,"children":110},{"class":46,"line":109},3,[111,116],{"type":20,"tag":44,"props":112,"children":113},{"style":77},[114],{"type":25,"value":115}," \"name=seccomp,profile=/etc/docker/seccomp.json\"",{"type":20,"tag":44,"props":117,"children":118},{"style":103},[119],{"type":25,"value":120},",\n",{"type":20,"tag":44,"props":122,"children":124},{"class":46,"line":123},4,[125],{"type":20,"tag":44,"props":126,"children":127},{"style":77},[128],{"type":25,"value":129}," \"name=selinux\"\n",{"type":20,"tag":44,"props":131,"children":133},{"class":46,"line":132},5,[134],{"type":20,"tag":44,"props":135,"children":136},{"style":103},[137],{"type":25,"value":138},"]\n",{"type":20,"tag":21,"props":140,"children":141},{},[142,144,150,152,158],{"type":25,"value":143},"It turns out that this can be resolved by appending the ",{"type":20,"tag":40,"props":145,"children":147},{"className":146},[],[148],{"type":25,"value":149},":z",{"type":25,"value":151}," flag to the volume\nmappings in the ",{"type":20,"tag":40,"props":153,"children":155},{"className":154},[],[156],{"type":25,"value":157},"docker-compose.yml",{"type":25,"value":159}," file, indicating that the volume content\nis shared.",{"type":20,"tag":33,"props":161,"children":163},{"code":162},"services:\n server:\n volumes:\n - ./data:/data:z\n",[164],{"type":20,"tag":40,"props":165,"children":166},{"__ignoreMap":7},[167],{"type":25,"value":162},{"type":20,"tag":21,"props":169,"children":170},{},[171],{"type":25,"value":172},"From the Docker documentation:",{"type":20,"tag":174,"props":175,"children":176},"blockquote",{},[177],{"type":20,"tag":21,"props":178,"children":179},{},[180,182,188],{"type":25,"value":181},"The ",{"type":20,"tag":40,"props":183,"children":185},{"className":184},[],[186],{"type":25,"value":187},"z",{"type":25,"value":189}," option tells Docker that two containers share the volume content. As\na result, Docker labels the content with a shared content label. Shared\nvolume labels allow all containers to read/write content.",{"type":20,"tag":21,"props":191,"children":192},{},[193],{"type":20,"tag":194,"props":195,"children":196},"strong",{},[197],{"type":25,"value":198},"References",{"type":20,"tag":200,"props":201,"children":202},"ul",{},[203,216],{"type":20,"tag":204,"props":205,"children":206},"li",{},[207],{"type":20,"tag":208,"props":209,"children":213},"a",{"href":210,"rel":211},"https://docs.docker.com/engine/reference/commandline/info/",[212],"nofollow",[214],{"type":25,"value":215},"Docker Docs: Docker Info",{"type":20,"tag":204,"props":217,"children":218},{},[219],{"type":20,"tag":208,"props":220,"children":223},{"href":221,"rel":222},"https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container---volumes-from",[212],[224],{"type":25,"value":225},"Docker Docs: Mounting Volumes",{"type":20,"tag":227,"props":228,"children":229},"style",{},[230],{"type":25,"value":231},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":99,"depth":99,"links":233},[],"markdown","content:articles:docker-selinux-volumes.md","content","articles/docker-selinux-volumes.md","md",1718428848914] \ No newline at end of file +[{"data":1,"prerenderedAt":239},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"draft":6,"tags":11,"categories":14,"excerpt":16,"body":26,"_type":234,"_id":235,"_source":236,"_file":237,"_extension":238},"/articles/docker-selinux-volumes","articles",false,"","Docker Volume Permissions with SELinux","Unfamiliar with running Docker on a SELinux enabled system, I found myself\nrunning into a bunch of file permission errors while creating volumes.","2019-12-26",[12,13],"docker","selinux",[15],"linux",{"type":17,"children":18},"root",[19],{"type":20,"tag":21,"props":22,"children":23},"element","p",{},[24],{"type":25,"value":9},"text",{"type":17,"children":27,"toc":232},[28,32,53,57,139,160,168,173,190,199,226],{"type":20,"tag":21,"props":29,"children":30},{},[31],{"type":25,"value":9},{"type":20,"tag":33,"props":34,"children":38},"pre",{"code":35,"language":36,"meta":7,"className":37,"style":7},"mkdir: can't create directory '/data': Permission denied\n","txt","language-txt shiki shiki-themes github-light",[39],{"type":20,"tag":40,"props":41,"children":42},"code",{"__ignoreMap":7},[43],{"type":20,"tag":44,"props":45,"children":48},"span",{"class":46,"line":47},"line",1,[49],{"type":20,"tag":44,"props":50,"children":51},{},[52],{"type":25,"value":35},{"type":20,"tag":54,"props":55,"children":56},"hr",{},[],{"type":20,"tag":33,"props":58,"children":62},{"code":59,"language":60,"meta":7,"className":61,"style":7},"$ docker info --format '{{json .SecurityOptions}}'\n[\n \"name=seccomp,profile=/etc/docker/seccomp.json\",\n \"name=selinux\"\n]\n","bash","language-bash shiki shiki-themes github-light",[63],{"type":20,"tag":40,"props":64,"children":65},{"__ignoreMap":7},[66,97,107,121,130],{"type":20,"tag":44,"props":67,"children":68},{"class":46,"line":47},[69,75,81,86,92],{"type":20,"tag":44,"props":70,"children":72},{"style":71},"--shiki-default:#6F42C1",[73],{"type":25,"value":74},"$",{"type":20,"tag":44,"props":76,"children":78},{"style":77},"--shiki-default:#032F62",[79],{"type":25,"value":80}," docker",{"type":20,"tag":44,"props":82,"children":83},{"style":77},[84],{"type":25,"value":85}," info",{"type":20,"tag":44,"props":87,"children":89},{"style":88},"--shiki-default:#005CC5",[90],{"type":25,"value":91}," --format",{"type":20,"tag":44,"props":93,"children":94},{"style":77},[95],{"type":25,"value":96}," '{{json .SecurityOptions}}'\n",{"type":20,"tag":44,"props":98,"children":100},{"class":46,"line":99},2,[101],{"type":20,"tag":44,"props":102,"children":104},{"style":103},"--shiki-default:#24292E",[105],{"type":25,"value":106},"[\n",{"type":20,"tag":44,"props":108,"children":110},{"class":46,"line":109},3,[111,116],{"type":20,"tag":44,"props":112,"children":113},{"style":77},[114],{"type":25,"value":115}," \"name=seccomp,profile=/etc/docker/seccomp.json\"",{"type":20,"tag":44,"props":117,"children":118},{"style":103},[119],{"type":25,"value":120},",\n",{"type":20,"tag":44,"props":122,"children":124},{"class":46,"line":123},4,[125],{"type":20,"tag":44,"props":126,"children":127},{"style":77},[128],{"type":25,"value":129}," \"name=selinux\"\n",{"type":20,"tag":44,"props":131,"children":133},{"class":46,"line":132},5,[134],{"type":20,"tag":44,"props":135,"children":136},{"style":103},[137],{"type":25,"value":138},"]\n",{"type":20,"tag":21,"props":140,"children":141},{},[142,144,150,152,158],{"type":25,"value":143},"It turns out that this can be resolved by appending the ",{"type":20,"tag":40,"props":145,"children":147},{"className":146},[],[148],{"type":25,"value":149},":z",{"type":25,"value":151}," flag to the volume\nmappings in the ",{"type":20,"tag":40,"props":153,"children":155},{"className":154},[],[156],{"type":25,"value":157},"docker-compose.yml",{"type":25,"value":159}," file, indicating that the volume content\nis shared.",{"type":20,"tag":33,"props":161,"children":163},{"code":162},"services:\n server:\n volumes:\n - ./data:/data:z\n",[164],{"type":20,"tag":40,"props":165,"children":166},{"__ignoreMap":7},[167],{"type":25,"value":162},{"type":20,"tag":21,"props":169,"children":170},{},[171],{"type":25,"value":172},"From the Docker documentation:",{"type":20,"tag":174,"props":175,"children":176},"blockquote",{},[177],{"type":20,"tag":21,"props":178,"children":179},{},[180,182,188],{"type":25,"value":181},"The ",{"type":20,"tag":40,"props":183,"children":185},{"className":184},[],[186],{"type":25,"value":187},"z",{"type":25,"value":189}," option tells Docker that two containers share the volume content. As\na result, Docker labels the content with a shared content label. Shared\nvolume labels allow all containers to read/write content.",{"type":20,"tag":21,"props":191,"children":192},{},[193],{"type":20,"tag":194,"props":195,"children":196},"strong",{},[197],{"type":25,"value":198},"References",{"type":20,"tag":200,"props":201,"children":202},"ul",{},[203,216],{"type":20,"tag":204,"props":205,"children":206},"li",{},[207],{"type":20,"tag":208,"props":209,"children":213},"a",{"href":210,"rel":211},"https://docs.docker.com/engine/reference/commandline/info/",[212],"nofollow",[214],{"type":25,"value":215},"Docker Docs: Docker Info",{"type":20,"tag":204,"props":217,"children":218},{},[219],{"type":20,"tag":208,"props":220,"children":223},{"href":221,"rel":222},"https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container---volumes-from",[212],[224],{"type":25,"value":225},"Docker Docs: Mounting Volumes",{"type":20,"tag":227,"props":228,"children":229},"style",{},[230],{"type":25,"value":231},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":99,"depth":99,"links":233},[],"markdown","content:articles:docker-selinux-volumes.md","content","articles/docker-selinux-volumes.md","md",1718681824704] \ No newline at end of file diff --git a/articles/docker-selinux-volumes/index.html b/articles/docker-selinux-volumes/index.html index 664725ad..d3f15670 100644 --- a/articles/docker-selinux-volumes/index.html +++ b/articles/docker-selinux-volumes/index.html @@ -4,36 +4,36 @@ - - + + - - - - + + + + - + - - - - - - - - - - - - - - - - - -

        Docker Volume Permissions with SELinux

        2019-12-26

        Unfamiliar with running Docker on a SELinux enabled system, I found myself + + + + + + + + + + + + + + + + + +

        Docker Volume Permissions with SELinux

        2019-12-26

        Unfamiliar with running Docker on a SELinux enabled system, I found myself running into a bunch of file permission errors while creating volumes.

        mkdir: can't create directory '/data': Permission denied
         

        $ docker info --format '{{json .SecurityOptions}}'
         [
        @@ -48,5 +48,5 @@
               - ./data:/data:z
         

        From the Docker documentation:

        The z option tells Docker that two containers share the volume content. As a result, Docker labels the content with a shared content label. Shared -volume labels allow all containers to read/write content.

        References

        - \ No newline at end of file +volume labels allow all containers to read/write content.

        References

        + \ No newline at end of file diff --git a/articles/doctl/_payload.json b/articles/doctl/_payload.json index 596d3df7..58ef8897 100644 --- a/articles/doctl/_payload.json +++ b/articles/doctl/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":711},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"tags":11,"categories":14,"excerpt":15,"body":43,"_type":706,"_id":707,"_source":708,"_file":709,"_extension":710},"/articles/doctl","articles",false,"","Exploring the Digital Ocean `doctl` Utility","I recently had the need to spool up a small ephemeral Linux instance, and wanted to try something new by exploring the Digital Ocean doctl command line utility.\nThis proved to be an extremely easy way to configure, create, connect, and destroy a Linux box, and I foresee myself using this service even more in the future.","2023-01-01",[12,13],"linux","digital-ocean",[12],{"type":16,"children":17},"root",[18],{"type":19,"tag":20,"props":21,"children":22},"element","p",{},[23,26,33,35,41],{"type":24,"value":25},"text","I recently had the need to spool up a small ephemeral Linux instance, and wanted to try something new by exploring the Digital Ocean ",{"type":19,"tag":27,"props":28,"children":30},"code",{"className":29},[],[31],{"type":24,"value":32},"doctl",{"type":24,"value":34}," command line utility.\nThis proved to be an ",{"type":19,"tag":36,"props":37,"children":38},"em",{},[39],{"type":24,"value":40},"extremely",{"type":24,"value":42}," easy way to configure, create, connect, and destroy a Linux box, and I foresee myself using this service even more in the future.",{"type":16,"children":44,"toc":704},[45,60,76,156,177,212,217,289,294,389,402,452,465,495,500,624,629,657,693,698],{"type":19,"tag":20,"props":46,"children":47},{},[48,49,54,55,59],{"type":24,"value":25},{"type":19,"tag":27,"props":50,"children":52},{"className":51},[],[53],{"type":24,"value":32},{"type":24,"value":34},{"type":19,"tag":36,"props":56,"children":57},{},[58],{"type":24,"value":40},{"type":24,"value":42},{"type":19,"tag":20,"props":61,"children":62},{},[63,65,74],{"type":24,"value":64},"To start things off, I had to install and setup authentication to Digital Ocean. Doing\nthis on my Mac machine, I opted to use ",{"type":19,"tag":66,"props":67,"children":71},"a",{"href":68,"rel":69},"https://brew.sh/",[70],"nofollow",[72],{"type":24,"value":73},"Homebrew",{"type":24,"value":75},".",{"type":19,"tag":77,"props":78,"children":82},"pre",{"className":79,"code":80,"language":81,"meta":7,"style":7},"language-sh shiki shiki-themes github-light","# install `doctl`\nbrew install doctl\n\n# setup authentication\ndoctl auth init\n","sh",[83],{"type":19,"tag":27,"props":84,"children":85},{"__ignoreMap":7},[86,98,119,129,138],{"type":19,"tag":87,"props":88,"children":91},"span",{"class":89,"line":90},"line",1,[92],{"type":19,"tag":87,"props":93,"children":95},{"style":94},"--shiki-default:#6A737D",[96],{"type":24,"value":97},"# install `doctl`\n",{"type":19,"tag":87,"props":99,"children":101},{"class":89,"line":100},2,[102,108,114],{"type":19,"tag":87,"props":103,"children":105},{"style":104},"--shiki-default:#6F42C1",[106],{"type":24,"value":107},"brew",{"type":19,"tag":87,"props":109,"children":111},{"style":110},"--shiki-default:#032F62",[112],{"type":24,"value":113}," install",{"type":19,"tag":87,"props":115,"children":116},{"style":110},[117],{"type":24,"value":118}," doctl\n",{"type":19,"tag":87,"props":120,"children":122},{"class":89,"line":121},3,[123],{"type":19,"tag":87,"props":124,"children":126},{"emptyLinePlaceholder":125},true,[127],{"type":24,"value":128},"\n",{"type":19,"tag":87,"props":130,"children":132},{"class":89,"line":131},4,[133],{"type":19,"tag":87,"props":134,"children":135},{"style":94},[136],{"type":24,"value":137},"# setup authentication\n",{"type":19,"tag":87,"props":139,"children":141},{"class":89,"line":140},5,[142,146,151],{"type":19,"tag":87,"props":143,"children":144},{"style":104},[145],{"type":24,"value":32},{"type":19,"tag":87,"props":147,"children":148},{"style":110},[149],{"type":24,"value":150}," auth",{"type":19,"tag":87,"props":152,"children":153},{"style":110},[154],{"type":24,"value":155}," init\n",{"type":19,"tag":20,"props":157,"children":158},{},[159,161,168,170,176],{"type":24,"value":160},"While the online ",{"type":19,"tag":66,"props":162,"children":165},{"href":163,"rel":164},"https://docs.digitalocean.com/reference/doctl/reference/compute/droplet/create/",[70],[166],{"type":24,"value":167},"documentation",{"type":24,"value":169}," is fantastic, I instead found myself mostly referencing the outputs of ",{"type":19,"tag":27,"props":171,"children":173},{"className":172},[],[174],{"type":24,"value":175},"--help",{"type":24,"value":75},{"type":19,"tag":77,"props":178,"children":180},{"className":79,"code":179,"language":81,"meta":7,"style":7},"doctl compute droplet create --help\n",[181],{"type":19,"tag":27,"props":182,"children":183},{"__ignoreMap":7},[184],{"type":19,"tag":87,"props":185,"children":186},{"class":89,"line":90},[187,191,196,201,206],{"type":19,"tag":87,"props":188,"children":189},{"style":104},[190],{"type":24,"value":32},{"type":19,"tag":87,"props":192,"children":193},{"style":110},[194],{"type":24,"value":195}," compute",{"type":19,"tag":87,"props":197,"children":198},{"style":110},[199],{"type":24,"value":200}," droplet",{"type":19,"tag":87,"props":202,"children":203},{"style":110},[204],{"type":24,"value":205}," create",{"type":19,"tag":87,"props":207,"children":209},{"style":208},"--shiki-default:#005CC5",[210],{"type":24,"value":211}," --help\n",{"type":19,"tag":20,"props":213,"children":214},{},[215],{"type":24,"value":216},"I had to find the image name of the version of Ubuntu I wanted to install:",{"type":19,"tag":77,"props":218,"children":220},{"className":79,"code":219,"language":81,"meta":7,"style":7},"doctl compute image list --public | grep ubuntu-22\n\n# 118857366 22.04 (LTS) x64 snapshot Ubuntu ubuntu-22-04-x64 true 7\n# 119383150 22.10 x64 snapshot Ubuntu ubuntu-22-10-x64 true 7\n",[221],{"type":19,"tag":27,"props":222,"children":223},{"__ignoreMap":7},[224,266,273,281],{"type":19,"tag":87,"props":225,"children":226},{"class":89,"line":90},[227,231,235,240,245,250,256,261],{"type":19,"tag":87,"props":228,"children":229},{"style":104},[230],{"type":24,"value":32},{"type":19,"tag":87,"props":232,"children":233},{"style":110},[234],{"type":24,"value":195},{"type":19,"tag":87,"props":236,"children":237},{"style":110},[238],{"type":24,"value":239}," image",{"type":19,"tag":87,"props":241,"children":242},{"style":110},[243],{"type":24,"value":244}," list",{"type":19,"tag":87,"props":246,"children":247},{"style":208},[248],{"type":24,"value":249}," --public",{"type":19,"tag":87,"props":251,"children":253},{"style":252},"--shiki-default:#D73A49",[254],{"type":24,"value":255}," |",{"type":19,"tag":87,"props":257,"children":258},{"style":104},[259],{"type":24,"value":260}," grep",{"type":19,"tag":87,"props":262,"children":263},{"style":110},[264],{"type":24,"value":265}," ubuntu-22\n",{"type":19,"tag":87,"props":267,"children":268},{"class":89,"line":100},[269],{"type":19,"tag":87,"props":270,"children":271},{"emptyLinePlaceholder":125},[272],{"type":24,"value":128},{"type":19,"tag":87,"props":274,"children":275},{"class":89,"line":121},[276],{"type":19,"tag":87,"props":277,"children":278},{"style":94},[279],{"type":24,"value":280},"# 118857366 22.04 (LTS) x64 snapshot Ubuntu ubuntu-22-04-x64 true 7\n",{"type":19,"tag":87,"props":282,"children":283},{"class":89,"line":131},[284],{"type":19,"tag":87,"props":285,"children":286},{"style":94},[287],{"type":24,"value":288},"# 119383150 22.10 x64 snapshot Ubuntu ubuntu-22-10-x64 true 7\n",{"type":19,"tag":20,"props":290,"children":291},{},[292],{"type":24,"value":293},"And also the slug of the compute size:",{"type":19,"tag":77,"props":295,"children":297},{"className":79,"code":296,"language":81,"meta":7,"style":7},"doctl compute size list\n\n# Slug Description Memory VCPUs Disk Price Monthly Price Hourly\n# s-1vcpu-512mb-10gb Basic 512 1 10 4.00 0.005950\n# s-1vcpu-1gb Basic 1024 1 25 6.00 0.008930\n# s-1vcpu-1gb-amd Basic AMD 1024 1 25 7.00 0.010420\n# s-1vcpu-1gb-intel Basic Intel 1024 1 25 7.00 0.010420\n# s-1vcpu-2gb Basic 2048 1 50 12.00 0.017860\n# s-1vcpu-2gb-amd Basic AMD 2048 1 50 14.00 0.020830\n",[298],{"type":19,"tag":27,"props":299,"children":300},{"__ignoreMap":7},[301,322,329,337,345,353,362,371,380],{"type":19,"tag":87,"props":302,"children":303},{"class":89,"line":90},[304,308,312,317],{"type":19,"tag":87,"props":305,"children":306},{"style":104},[307],{"type":24,"value":32},{"type":19,"tag":87,"props":309,"children":310},{"style":110},[311],{"type":24,"value":195},{"type":19,"tag":87,"props":313,"children":314},{"style":110},[315],{"type":24,"value":316}," size",{"type":19,"tag":87,"props":318,"children":319},{"style":110},[320],{"type":24,"value":321}," list\n",{"type":19,"tag":87,"props":323,"children":324},{"class":89,"line":100},[325],{"type":19,"tag":87,"props":326,"children":327},{"emptyLinePlaceholder":125},[328],{"type":24,"value":128},{"type":19,"tag":87,"props":330,"children":331},{"class":89,"line":121},[332],{"type":19,"tag":87,"props":333,"children":334},{"style":94},[335],{"type":24,"value":336},"# Slug Description Memory VCPUs Disk Price Monthly Price Hourly\n",{"type":19,"tag":87,"props":338,"children":339},{"class":89,"line":131},[340],{"type":19,"tag":87,"props":341,"children":342},{"style":94},[343],{"type":24,"value":344},"# s-1vcpu-512mb-10gb Basic 512 1 10 4.00 0.005950\n",{"type":19,"tag":87,"props":346,"children":347},{"class":89,"line":140},[348],{"type":19,"tag":87,"props":349,"children":350},{"style":94},[351],{"type":24,"value":352},"# s-1vcpu-1gb Basic 1024 1 25 6.00 0.008930\n",{"type":19,"tag":87,"props":354,"children":356},{"class":89,"line":355},6,[357],{"type":19,"tag":87,"props":358,"children":359},{"style":94},[360],{"type":24,"value":361},"# s-1vcpu-1gb-amd Basic AMD 1024 1 25 7.00 0.010420\n",{"type":19,"tag":87,"props":363,"children":365},{"class":89,"line":364},7,[366],{"type":19,"tag":87,"props":367,"children":368},{"style":94},[369],{"type":24,"value":370},"# s-1vcpu-1gb-intel Basic Intel 1024 1 25 7.00 0.010420\n",{"type":19,"tag":87,"props":372,"children":374},{"class":89,"line":373},8,[375],{"type":19,"tag":87,"props":376,"children":377},{"style":94},[378],{"type":24,"value":379},"# s-1vcpu-2gb Basic 2048 1 50 12.00 0.017860\n",{"type":19,"tag":87,"props":381,"children":383},{"class":89,"line":382},9,[384],{"type":19,"tag":87,"props":385,"children":386},{"style":94},[387],{"type":24,"value":388},"# s-1vcpu-2gb-amd Basic AMD 2048 1 50 14.00 0.020830\n",{"type":19,"tag":20,"props":390,"children":391},{},[392,394,400],{"type":24,"value":393},"I've also configured a few SSH keys with Digital Ocean, and I can have the key (specified by ID) provisioned to the machine using the ",{"type":19,"tag":27,"props":395,"children":397},{"className":396},[],[398],{"type":24,"value":399},"--ssh-keys",{"type":24,"value":401}," flag.",{"type":19,"tag":77,"props":403,"children":405},{"className":79,"code":404,"language":81,"meta":7,"style":7},"doctl compute ssh-key list\n\n# ID Name FingerPrint\n# 1234 mini \u003Credacted>\n",[406],{"type":19,"tag":27,"props":407,"children":408},{"__ignoreMap":7},[409,429,436,444],{"type":19,"tag":87,"props":410,"children":411},{"class":89,"line":90},[412,416,420,425],{"type":19,"tag":87,"props":413,"children":414},{"style":104},[415],{"type":24,"value":32},{"type":19,"tag":87,"props":417,"children":418},{"style":110},[419],{"type":24,"value":195},{"type":19,"tag":87,"props":421,"children":422},{"style":110},[423],{"type":24,"value":424}," ssh-key",{"type":19,"tag":87,"props":426,"children":427},{"style":110},[428],{"type":24,"value":321},{"type":19,"tag":87,"props":430,"children":431},{"class":89,"line":100},[432],{"type":19,"tag":87,"props":433,"children":434},{"emptyLinePlaceholder":125},[435],{"type":24,"value":128},{"type":19,"tag":87,"props":437,"children":438},{"class":89,"line":121},[439],{"type":19,"tag":87,"props":440,"children":441},{"style":94},[442],{"type":24,"value":443},"# ID Name FingerPrint\n",{"type":19,"tag":87,"props":445,"children":446},{"class":89,"line":131},[447],{"type":19,"tag":87,"props":448,"children":449},{"style":94},[450],{"type":24,"value":451},"# 1234 mini \u003Credacted>\n",{"type":19,"tag":20,"props":453,"children":454},{},[455,457,463],{"type":24,"value":456},"Also, I wanted to install a few packages to the box upon creation, this can be done easily with the ",{"type":19,"tag":27,"props":458,"children":460},{"className":459},[],[461],{"type":24,"value":462},"--user-data-file",{"type":24,"value":464}," flag to run an initialization script.",{"type":19,"tag":77,"props":466,"children":468},{"className":79,"code":467,"language":81,"meta":7,"style":7},"echo 'apt install -y imagemagick zip' > bootstrap.sh\n",[469],{"type":19,"tag":27,"props":470,"children":471},{"__ignoreMap":7},[472],{"type":19,"tag":87,"props":473,"children":474},{"class":89,"line":90},[475,480,485,490],{"type":19,"tag":87,"props":476,"children":477},{"style":208},[478],{"type":24,"value":479},"echo",{"type":19,"tag":87,"props":481,"children":482},{"style":110},[483],{"type":24,"value":484}," 'apt install -y imagemagick zip'",{"type":19,"tag":87,"props":486,"children":487},{"style":252},[488],{"type":24,"value":489}," >",{"type":19,"tag":87,"props":491,"children":492},{"style":110},[493],{"type":24,"value":494}," bootstrap.sh\n",{"type":19,"tag":20,"props":496,"children":497},{},[498],{"type":24,"value":499},"Putting it all together, here is the simple command for creating a small compute instance!",{"type":19,"tag":77,"props":501,"children":503},{"className":79,"code":502,"language":81,"meta":7,"style":7},"doctl compute droplet create \\\n --image ubuntu-22-10-x64 \\\n --size s-1vcpu-512mb-10gb \\\n --region nyc1 \\\n --ssh-keys 1234 \\\n --user-data-file boostrap.sh \\\n ephemeral\n",[504],{"type":19,"tag":27,"props":505,"children":506},{"__ignoreMap":7},[507,531,548,565,582,599,616],{"type":19,"tag":87,"props":508,"children":509},{"class":89,"line":90},[510,514,518,522,526],{"type":19,"tag":87,"props":511,"children":512},{"style":104},[513],{"type":24,"value":32},{"type":19,"tag":87,"props":515,"children":516},{"style":110},[517],{"type":24,"value":195},{"type":19,"tag":87,"props":519,"children":520},{"style":110},[521],{"type":24,"value":200},{"type":19,"tag":87,"props":523,"children":524},{"style":110},[525],{"type":24,"value":205},{"type":19,"tag":87,"props":527,"children":528},{"style":208},[529],{"type":24,"value":530}," \\\n",{"type":19,"tag":87,"props":532,"children":533},{"class":89,"line":100},[534,539,544],{"type":19,"tag":87,"props":535,"children":536},{"style":208},[537],{"type":24,"value":538}," --image",{"type":19,"tag":87,"props":540,"children":541},{"style":110},[542],{"type":24,"value":543}," ubuntu-22-10-x64",{"type":19,"tag":87,"props":545,"children":546},{"style":208},[547],{"type":24,"value":530},{"type":19,"tag":87,"props":549,"children":550},{"class":89,"line":121},[551,556,561],{"type":19,"tag":87,"props":552,"children":553},{"style":208},[554],{"type":24,"value":555}," --size",{"type":19,"tag":87,"props":557,"children":558},{"style":110},[559],{"type":24,"value":560}," s-1vcpu-512mb-10gb",{"type":19,"tag":87,"props":562,"children":563},{"style":208},[564],{"type":24,"value":530},{"type":19,"tag":87,"props":566,"children":567},{"class":89,"line":131},[568,573,578],{"type":19,"tag":87,"props":569,"children":570},{"style":208},[571],{"type":24,"value":572}," --region",{"type":19,"tag":87,"props":574,"children":575},{"style":110},[576],{"type":24,"value":577}," nyc1",{"type":19,"tag":87,"props":579,"children":580},{"style":208},[581],{"type":24,"value":530},{"type":19,"tag":87,"props":583,"children":584},{"class":89,"line":140},[585,590,595],{"type":19,"tag":87,"props":586,"children":587},{"style":208},[588],{"type":24,"value":589}," --ssh-keys",{"type":19,"tag":87,"props":591,"children":592},{"style":208},[593],{"type":24,"value":594}," 1234",{"type":19,"tag":87,"props":596,"children":597},{"style":208},[598],{"type":24,"value":530},{"type":19,"tag":87,"props":600,"children":601},{"class":89,"line":355},[602,607,612],{"type":19,"tag":87,"props":603,"children":604},{"style":208},[605],{"type":24,"value":606}," --user-data-file",{"type":19,"tag":87,"props":608,"children":609},{"style":110},[610],{"type":24,"value":611}," boostrap.sh",{"type":19,"tag":87,"props":613,"children":614},{"style":208},[615],{"type":24,"value":530},{"type":19,"tag":87,"props":617,"children":618},{"class":89,"line":364},[619],{"type":19,"tag":87,"props":620,"children":621},{"style":110},[622],{"type":24,"value":623}," ephemeral\n",{"type":19,"tag":20,"props":625,"children":626},{},[627],{"type":24,"value":628},"Finally, I can connect, do my thing, and destroy the instance.",{"type":19,"tag":77,"props":630,"children":632},{"className":79,"code":631,"language":81,"meta":7,"style":7},"doctl compute ssh ephemeral\n",[633],{"type":19,"tag":27,"props":634,"children":635},{"__ignoreMap":7},[636],{"type":19,"tag":87,"props":637,"children":638},{"class":89,"line":90},[639,643,647,652],{"type":19,"tag":87,"props":640,"children":641},{"style":104},[642],{"type":24,"value":32},{"type":19,"tag":87,"props":644,"children":645},{"style":110},[646],{"type":24,"value":195},{"type":19,"tag":87,"props":648,"children":649},{"style":110},[650],{"type":24,"value":651}," ssh",{"type":19,"tag":87,"props":653,"children":654},{"style":110},[655],{"type":24,"value":656}," ephemeral\n",{"type":19,"tag":77,"props":658,"children":660},{"className":79,"code":659,"language":81,"meta":7,"style":7},"doctl compute droplet delete --force ephemeral\n",[661],{"type":19,"tag":27,"props":662,"children":663},{"__ignoreMap":7},[664],{"type":19,"tag":87,"props":665,"children":666},{"class":89,"line":90},[667,671,675,679,684,689],{"type":19,"tag":87,"props":668,"children":669},{"style":104},[670],{"type":24,"value":32},{"type":19,"tag":87,"props":672,"children":673},{"style":110},[674],{"type":24,"value":195},{"type":19,"tag":87,"props":676,"children":677},{"style":110},[678],{"type":24,"value":200},{"type":19,"tag":87,"props":680,"children":681},{"style":110},[682],{"type":24,"value":683}," delete",{"type":19,"tag":87,"props":685,"children":686},{"style":208},[687],{"type":24,"value":688}," --force",{"type":19,"tag":87,"props":690,"children":691},{"style":110},[692],{"type":24,"value":656},{"type":19,"tag":20,"props":694,"children":695},{},[696],{"type":24,"value":697},"All-in-all, I was up and running in about 20 minutes. What a handy utility!",{"type":19,"tag":699,"props":700,"children":701},"style",{},[702],{"type":24,"value":703},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":100,"depth":100,"links":705},[],"markdown","content:articles:doctl.md","content","articles/doctl.md","md",1718428848850] \ No newline at end of file +[{"data":1,"prerenderedAt":711},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"tags":11,"categories":14,"excerpt":15,"body":43,"_type":706,"_id":707,"_source":708,"_file":709,"_extension":710},"/articles/doctl","articles",false,"","Exploring the Digital Ocean `doctl` Utility","I recently had the need to spool up a small ephemeral Linux instance, and wanted to try something new by exploring the Digital Ocean doctl command line utility.\nThis proved to be an extremely easy way to configure, create, connect, and destroy a Linux box, and I foresee myself using this service even more in the future.","2023-01-01",[12,13],"linux","digital-ocean",[12],{"type":16,"children":17},"root",[18],{"type":19,"tag":20,"props":21,"children":22},"element","p",{},[23,26,33,35,41],{"type":24,"value":25},"text","I recently had the need to spool up a small ephemeral Linux instance, and wanted to try something new by exploring the Digital Ocean ",{"type":19,"tag":27,"props":28,"children":30},"code",{"className":29},[],[31],{"type":24,"value":32},"doctl",{"type":24,"value":34}," command line utility.\nThis proved to be an ",{"type":19,"tag":36,"props":37,"children":38},"em",{},[39],{"type":24,"value":40},"extremely",{"type":24,"value":42}," easy way to configure, create, connect, and destroy a Linux box, and I foresee myself using this service even more in the future.",{"type":16,"children":44,"toc":704},[45,60,76,156,177,212,217,289,294,389,402,452,465,495,500,624,629,657,693,698],{"type":19,"tag":20,"props":46,"children":47},{},[48,49,54,55,59],{"type":24,"value":25},{"type":19,"tag":27,"props":50,"children":52},{"className":51},[],[53],{"type":24,"value":32},{"type":24,"value":34},{"type":19,"tag":36,"props":56,"children":57},{},[58],{"type":24,"value":40},{"type":24,"value":42},{"type":19,"tag":20,"props":61,"children":62},{},[63,65,74],{"type":24,"value":64},"To start things off, I had to install and setup authentication to Digital Ocean. Doing\nthis on my Mac machine, I opted to use ",{"type":19,"tag":66,"props":67,"children":71},"a",{"href":68,"rel":69},"https://brew.sh/",[70],"nofollow",[72],{"type":24,"value":73},"Homebrew",{"type":24,"value":75},".",{"type":19,"tag":77,"props":78,"children":82},"pre",{"className":79,"code":80,"language":81,"meta":7,"style":7},"language-sh shiki shiki-themes github-light","# install `doctl`\nbrew install doctl\n\n# setup authentication\ndoctl auth init\n","sh",[83],{"type":19,"tag":27,"props":84,"children":85},{"__ignoreMap":7},[86,98,119,129,138],{"type":19,"tag":87,"props":88,"children":91},"span",{"class":89,"line":90},"line",1,[92],{"type":19,"tag":87,"props":93,"children":95},{"style":94},"--shiki-default:#6A737D",[96],{"type":24,"value":97},"# install `doctl`\n",{"type":19,"tag":87,"props":99,"children":101},{"class":89,"line":100},2,[102,108,114],{"type":19,"tag":87,"props":103,"children":105},{"style":104},"--shiki-default:#6F42C1",[106],{"type":24,"value":107},"brew",{"type":19,"tag":87,"props":109,"children":111},{"style":110},"--shiki-default:#032F62",[112],{"type":24,"value":113}," install",{"type":19,"tag":87,"props":115,"children":116},{"style":110},[117],{"type":24,"value":118}," doctl\n",{"type":19,"tag":87,"props":120,"children":122},{"class":89,"line":121},3,[123],{"type":19,"tag":87,"props":124,"children":126},{"emptyLinePlaceholder":125},true,[127],{"type":24,"value":128},"\n",{"type":19,"tag":87,"props":130,"children":132},{"class":89,"line":131},4,[133],{"type":19,"tag":87,"props":134,"children":135},{"style":94},[136],{"type":24,"value":137},"# setup authentication\n",{"type":19,"tag":87,"props":139,"children":141},{"class":89,"line":140},5,[142,146,151],{"type":19,"tag":87,"props":143,"children":144},{"style":104},[145],{"type":24,"value":32},{"type":19,"tag":87,"props":147,"children":148},{"style":110},[149],{"type":24,"value":150}," auth",{"type":19,"tag":87,"props":152,"children":153},{"style":110},[154],{"type":24,"value":155}," init\n",{"type":19,"tag":20,"props":157,"children":158},{},[159,161,168,170,176],{"type":24,"value":160},"While the online ",{"type":19,"tag":66,"props":162,"children":165},{"href":163,"rel":164},"https://docs.digitalocean.com/reference/doctl/reference/compute/droplet/create/",[70],[166],{"type":24,"value":167},"documentation",{"type":24,"value":169}," is fantastic, I instead found myself mostly referencing the outputs of ",{"type":19,"tag":27,"props":171,"children":173},{"className":172},[],[174],{"type":24,"value":175},"--help",{"type":24,"value":75},{"type":19,"tag":77,"props":178,"children":180},{"className":79,"code":179,"language":81,"meta":7,"style":7},"doctl compute droplet create --help\n",[181],{"type":19,"tag":27,"props":182,"children":183},{"__ignoreMap":7},[184],{"type":19,"tag":87,"props":185,"children":186},{"class":89,"line":90},[187,191,196,201,206],{"type":19,"tag":87,"props":188,"children":189},{"style":104},[190],{"type":24,"value":32},{"type":19,"tag":87,"props":192,"children":193},{"style":110},[194],{"type":24,"value":195}," compute",{"type":19,"tag":87,"props":197,"children":198},{"style":110},[199],{"type":24,"value":200}," droplet",{"type":19,"tag":87,"props":202,"children":203},{"style":110},[204],{"type":24,"value":205}," create",{"type":19,"tag":87,"props":207,"children":209},{"style":208},"--shiki-default:#005CC5",[210],{"type":24,"value":211}," --help\n",{"type":19,"tag":20,"props":213,"children":214},{},[215],{"type":24,"value":216},"I had to find the image name of the version of Ubuntu I wanted to install:",{"type":19,"tag":77,"props":218,"children":220},{"className":79,"code":219,"language":81,"meta":7,"style":7},"doctl compute image list --public | grep ubuntu-22\n\n# 118857366 22.04 (LTS) x64 snapshot Ubuntu ubuntu-22-04-x64 true 7\n# 119383150 22.10 x64 snapshot Ubuntu ubuntu-22-10-x64 true 7\n",[221],{"type":19,"tag":27,"props":222,"children":223},{"__ignoreMap":7},[224,266,273,281],{"type":19,"tag":87,"props":225,"children":226},{"class":89,"line":90},[227,231,235,240,245,250,256,261],{"type":19,"tag":87,"props":228,"children":229},{"style":104},[230],{"type":24,"value":32},{"type":19,"tag":87,"props":232,"children":233},{"style":110},[234],{"type":24,"value":195},{"type":19,"tag":87,"props":236,"children":237},{"style":110},[238],{"type":24,"value":239}," image",{"type":19,"tag":87,"props":241,"children":242},{"style":110},[243],{"type":24,"value":244}," list",{"type":19,"tag":87,"props":246,"children":247},{"style":208},[248],{"type":24,"value":249}," --public",{"type":19,"tag":87,"props":251,"children":253},{"style":252},"--shiki-default:#D73A49",[254],{"type":24,"value":255}," |",{"type":19,"tag":87,"props":257,"children":258},{"style":104},[259],{"type":24,"value":260}," grep",{"type":19,"tag":87,"props":262,"children":263},{"style":110},[264],{"type":24,"value":265}," ubuntu-22\n",{"type":19,"tag":87,"props":267,"children":268},{"class":89,"line":100},[269],{"type":19,"tag":87,"props":270,"children":271},{"emptyLinePlaceholder":125},[272],{"type":24,"value":128},{"type":19,"tag":87,"props":274,"children":275},{"class":89,"line":121},[276],{"type":19,"tag":87,"props":277,"children":278},{"style":94},[279],{"type":24,"value":280},"# 118857366 22.04 (LTS) x64 snapshot Ubuntu ubuntu-22-04-x64 true 7\n",{"type":19,"tag":87,"props":282,"children":283},{"class":89,"line":131},[284],{"type":19,"tag":87,"props":285,"children":286},{"style":94},[287],{"type":24,"value":288},"# 119383150 22.10 x64 snapshot Ubuntu ubuntu-22-10-x64 true 7\n",{"type":19,"tag":20,"props":290,"children":291},{},[292],{"type":24,"value":293},"And also the slug of the compute size:",{"type":19,"tag":77,"props":295,"children":297},{"className":79,"code":296,"language":81,"meta":7,"style":7},"doctl compute size list\n\n# Slug Description Memory VCPUs Disk Price Monthly Price Hourly\n# s-1vcpu-512mb-10gb Basic 512 1 10 4.00 0.005950\n# s-1vcpu-1gb Basic 1024 1 25 6.00 0.008930\n# s-1vcpu-1gb-amd Basic AMD 1024 1 25 7.00 0.010420\n# s-1vcpu-1gb-intel Basic Intel 1024 1 25 7.00 0.010420\n# s-1vcpu-2gb Basic 2048 1 50 12.00 0.017860\n# s-1vcpu-2gb-amd Basic AMD 2048 1 50 14.00 0.020830\n",[298],{"type":19,"tag":27,"props":299,"children":300},{"__ignoreMap":7},[301,322,329,337,345,353,362,371,380],{"type":19,"tag":87,"props":302,"children":303},{"class":89,"line":90},[304,308,312,317],{"type":19,"tag":87,"props":305,"children":306},{"style":104},[307],{"type":24,"value":32},{"type":19,"tag":87,"props":309,"children":310},{"style":110},[311],{"type":24,"value":195},{"type":19,"tag":87,"props":313,"children":314},{"style":110},[315],{"type":24,"value":316}," size",{"type":19,"tag":87,"props":318,"children":319},{"style":110},[320],{"type":24,"value":321}," list\n",{"type":19,"tag":87,"props":323,"children":324},{"class":89,"line":100},[325],{"type":19,"tag":87,"props":326,"children":327},{"emptyLinePlaceholder":125},[328],{"type":24,"value":128},{"type":19,"tag":87,"props":330,"children":331},{"class":89,"line":121},[332],{"type":19,"tag":87,"props":333,"children":334},{"style":94},[335],{"type":24,"value":336},"# Slug Description Memory VCPUs Disk Price Monthly Price Hourly\n",{"type":19,"tag":87,"props":338,"children":339},{"class":89,"line":131},[340],{"type":19,"tag":87,"props":341,"children":342},{"style":94},[343],{"type":24,"value":344},"# s-1vcpu-512mb-10gb Basic 512 1 10 4.00 0.005950\n",{"type":19,"tag":87,"props":346,"children":347},{"class":89,"line":140},[348],{"type":19,"tag":87,"props":349,"children":350},{"style":94},[351],{"type":24,"value":352},"# s-1vcpu-1gb Basic 1024 1 25 6.00 0.008930\n",{"type":19,"tag":87,"props":354,"children":356},{"class":89,"line":355},6,[357],{"type":19,"tag":87,"props":358,"children":359},{"style":94},[360],{"type":24,"value":361},"# s-1vcpu-1gb-amd Basic AMD 1024 1 25 7.00 0.010420\n",{"type":19,"tag":87,"props":363,"children":365},{"class":89,"line":364},7,[366],{"type":19,"tag":87,"props":367,"children":368},{"style":94},[369],{"type":24,"value":370},"# s-1vcpu-1gb-intel Basic Intel 1024 1 25 7.00 0.010420\n",{"type":19,"tag":87,"props":372,"children":374},{"class":89,"line":373},8,[375],{"type":19,"tag":87,"props":376,"children":377},{"style":94},[378],{"type":24,"value":379},"# s-1vcpu-2gb Basic 2048 1 50 12.00 0.017860\n",{"type":19,"tag":87,"props":381,"children":383},{"class":89,"line":382},9,[384],{"type":19,"tag":87,"props":385,"children":386},{"style":94},[387],{"type":24,"value":388},"# s-1vcpu-2gb-amd Basic AMD 2048 1 50 14.00 0.020830\n",{"type":19,"tag":20,"props":390,"children":391},{},[392,394,400],{"type":24,"value":393},"I've also configured a few SSH keys with Digital Ocean, and I can have the key (specified by ID) provisioned to the machine using the ",{"type":19,"tag":27,"props":395,"children":397},{"className":396},[],[398],{"type":24,"value":399},"--ssh-keys",{"type":24,"value":401}," flag.",{"type":19,"tag":77,"props":403,"children":405},{"className":79,"code":404,"language":81,"meta":7,"style":7},"doctl compute ssh-key list\n\n# ID Name FingerPrint\n# 1234 mini \u003Credacted>\n",[406],{"type":19,"tag":27,"props":407,"children":408},{"__ignoreMap":7},[409,429,436,444],{"type":19,"tag":87,"props":410,"children":411},{"class":89,"line":90},[412,416,420,425],{"type":19,"tag":87,"props":413,"children":414},{"style":104},[415],{"type":24,"value":32},{"type":19,"tag":87,"props":417,"children":418},{"style":110},[419],{"type":24,"value":195},{"type":19,"tag":87,"props":421,"children":422},{"style":110},[423],{"type":24,"value":424}," ssh-key",{"type":19,"tag":87,"props":426,"children":427},{"style":110},[428],{"type":24,"value":321},{"type":19,"tag":87,"props":430,"children":431},{"class":89,"line":100},[432],{"type":19,"tag":87,"props":433,"children":434},{"emptyLinePlaceholder":125},[435],{"type":24,"value":128},{"type":19,"tag":87,"props":437,"children":438},{"class":89,"line":121},[439],{"type":19,"tag":87,"props":440,"children":441},{"style":94},[442],{"type":24,"value":443},"# ID Name FingerPrint\n",{"type":19,"tag":87,"props":445,"children":446},{"class":89,"line":131},[447],{"type":19,"tag":87,"props":448,"children":449},{"style":94},[450],{"type":24,"value":451},"# 1234 mini \u003Credacted>\n",{"type":19,"tag":20,"props":453,"children":454},{},[455,457,463],{"type":24,"value":456},"Also, I wanted to install a few packages to the box upon creation, this can be done easily with the ",{"type":19,"tag":27,"props":458,"children":460},{"className":459},[],[461],{"type":24,"value":462},"--user-data-file",{"type":24,"value":464}," flag to run an initialization script.",{"type":19,"tag":77,"props":466,"children":468},{"className":79,"code":467,"language":81,"meta":7,"style":7},"echo 'apt install -y imagemagick zip' > bootstrap.sh\n",[469],{"type":19,"tag":27,"props":470,"children":471},{"__ignoreMap":7},[472],{"type":19,"tag":87,"props":473,"children":474},{"class":89,"line":90},[475,480,485,490],{"type":19,"tag":87,"props":476,"children":477},{"style":208},[478],{"type":24,"value":479},"echo",{"type":19,"tag":87,"props":481,"children":482},{"style":110},[483],{"type":24,"value":484}," 'apt install -y imagemagick zip'",{"type":19,"tag":87,"props":486,"children":487},{"style":252},[488],{"type":24,"value":489}," >",{"type":19,"tag":87,"props":491,"children":492},{"style":110},[493],{"type":24,"value":494}," bootstrap.sh\n",{"type":19,"tag":20,"props":496,"children":497},{},[498],{"type":24,"value":499},"Putting it all together, here is the simple command for creating a small compute instance!",{"type":19,"tag":77,"props":501,"children":503},{"className":79,"code":502,"language":81,"meta":7,"style":7},"doctl compute droplet create \\\n --image ubuntu-22-10-x64 \\\n --size s-1vcpu-512mb-10gb \\\n --region nyc1 \\\n --ssh-keys 1234 \\\n --user-data-file boostrap.sh \\\n ephemeral\n",[504],{"type":19,"tag":27,"props":505,"children":506},{"__ignoreMap":7},[507,531,548,565,582,599,616],{"type":19,"tag":87,"props":508,"children":509},{"class":89,"line":90},[510,514,518,522,526],{"type":19,"tag":87,"props":511,"children":512},{"style":104},[513],{"type":24,"value":32},{"type":19,"tag":87,"props":515,"children":516},{"style":110},[517],{"type":24,"value":195},{"type":19,"tag":87,"props":519,"children":520},{"style":110},[521],{"type":24,"value":200},{"type":19,"tag":87,"props":523,"children":524},{"style":110},[525],{"type":24,"value":205},{"type":19,"tag":87,"props":527,"children":528},{"style":208},[529],{"type":24,"value":530}," \\\n",{"type":19,"tag":87,"props":532,"children":533},{"class":89,"line":100},[534,539,544],{"type":19,"tag":87,"props":535,"children":536},{"style":208},[537],{"type":24,"value":538}," --image",{"type":19,"tag":87,"props":540,"children":541},{"style":110},[542],{"type":24,"value":543}," ubuntu-22-10-x64",{"type":19,"tag":87,"props":545,"children":546},{"style":208},[547],{"type":24,"value":530},{"type":19,"tag":87,"props":549,"children":550},{"class":89,"line":121},[551,556,561],{"type":19,"tag":87,"props":552,"children":553},{"style":208},[554],{"type":24,"value":555}," --size",{"type":19,"tag":87,"props":557,"children":558},{"style":110},[559],{"type":24,"value":560}," s-1vcpu-512mb-10gb",{"type":19,"tag":87,"props":562,"children":563},{"style":208},[564],{"type":24,"value":530},{"type":19,"tag":87,"props":566,"children":567},{"class":89,"line":131},[568,573,578],{"type":19,"tag":87,"props":569,"children":570},{"style":208},[571],{"type":24,"value":572}," --region",{"type":19,"tag":87,"props":574,"children":575},{"style":110},[576],{"type":24,"value":577}," nyc1",{"type":19,"tag":87,"props":579,"children":580},{"style":208},[581],{"type":24,"value":530},{"type":19,"tag":87,"props":583,"children":584},{"class":89,"line":140},[585,590,595],{"type":19,"tag":87,"props":586,"children":587},{"style":208},[588],{"type":24,"value":589}," --ssh-keys",{"type":19,"tag":87,"props":591,"children":592},{"style":208},[593],{"type":24,"value":594}," 1234",{"type":19,"tag":87,"props":596,"children":597},{"style":208},[598],{"type":24,"value":530},{"type":19,"tag":87,"props":600,"children":601},{"class":89,"line":355},[602,607,612],{"type":19,"tag":87,"props":603,"children":604},{"style":208},[605],{"type":24,"value":606}," --user-data-file",{"type":19,"tag":87,"props":608,"children":609},{"style":110},[610],{"type":24,"value":611}," boostrap.sh",{"type":19,"tag":87,"props":613,"children":614},{"style":208},[615],{"type":24,"value":530},{"type":19,"tag":87,"props":617,"children":618},{"class":89,"line":364},[619],{"type":19,"tag":87,"props":620,"children":621},{"style":110},[622],{"type":24,"value":623}," ephemeral\n",{"type":19,"tag":20,"props":625,"children":626},{},[627],{"type":24,"value":628},"Finally, I can connect, do my thing, and destroy the instance.",{"type":19,"tag":77,"props":630,"children":632},{"className":79,"code":631,"language":81,"meta":7,"style":7},"doctl compute ssh ephemeral\n",[633],{"type":19,"tag":27,"props":634,"children":635},{"__ignoreMap":7},[636],{"type":19,"tag":87,"props":637,"children":638},{"class":89,"line":90},[639,643,647,652],{"type":19,"tag":87,"props":640,"children":641},{"style":104},[642],{"type":24,"value":32},{"type":19,"tag":87,"props":644,"children":645},{"style":110},[646],{"type":24,"value":195},{"type":19,"tag":87,"props":648,"children":649},{"style":110},[650],{"type":24,"value":651}," ssh",{"type":19,"tag":87,"props":653,"children":654},{"style":110},[655],{"type":24,"value":656}," ephemeral\n",{"type":19,"tag":77,"props":658,"children":660},{"className":79,"code":659,"language":81,"meta":7,"style":7},"doctl compute droplet delete --force ephemeral\n",[661],{"type":19,"tag":27,"props":662,"children":663},{"__ignoreMap":7},[664],{"type":19,"tag":87,"props":665,"children":666},{"class":89,"line":90},[667,671,675,679,684,689],{"type":19,"tag":87,"props":668,"children":669},{"style":104},[670],{"type":24,"value":32},{"type":19,"tag":87,"props":672,"children":673},{"style":110},[674],{"type":24,"value":195},{"type":19,"tag":87,"props":676,"children":677},{"style":110},[678],{"type":24,"value":200},{"type":19,"tag":87,"props":680,"children":681},{"style":110},[682],{"type":24,"value":683}," delete",{"type":19,"tag":87,"props":685,"children":686},{"style":208},[687],{"type":24,"value":688}," --force",{"type":19,"tag":87,"props":690,"children":691},{"style":110},[692],{"type":24,"value":656},{"type":19,"tag":20,"props":694,"children":695},{},[696],{"type":24,"value":697},"All-in-all, I was up and running in about 20 minutes. What a handy utility!",{"type":19,"tag":699,"props":700,"children":701},"style",{},[702],{"type":24,"value":703},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":100,"depth":100,"links":705},[],"markdown","content:articles:doctl.md","content","articles/doctl.md","md",1718681824663] \ No newline at end of file diff --git a/articles/doctl/index.html b/articles/doctl/index.html index 439bfcc0..a1550dda 100644 --- a/articles/doctl/index.html +++ b/articles/doctl/index.html @@ -4,32 +4,32 @@ - - + + - - - - + + + + - + - - - - - - - - - - - - - -

        Exploring the Digital Ocean `doctl` Utility

        2023-01-01

        I recently had the need to spool up a small ephemeral Linux instance, and wanted to try something new by exploring the Digital Ocean doctl command line utility. + + + + + + + + + + + + + +

        Exploring the Digital Ocean `doctl` Utility

        2023-01-01

        I recently had the need to spool up a small ephemeral Linux instance, and wanted to try something new by exploring the Digital Ocean doctl command line utility. This proved to be an extremely easy way to configure, create, connect, and destroy a Linux box, and I foresee myself using this service even more in the future.

        To start things off, I had to install and setup authentication to Digital Ocean. Doing this on my Mac machine, I opted to use Homebrew.

        # install `doctl`
         brew install doctl
        @@ -64,5 +64,5 @@
             ephemeral
         

        Finally, I can connect, do my thing, and destroy the instance.

        doctl compute ssh ephemeral
         
        doctl compute droplet delete --force ephemeral
        -

        All-in-all, I was up and running in about 20 minutes. What a handy utility!

        - \ No newline at end of file +

        All-in-all, I was up and running in about 20 minutes. What a handy utility!

        + \ No newline at end of file diff --git a/articles/fennel-initial-exploration/_payload.json b/articles/fennel-initial-exploration/_payload.json index ba54605d..d3b14371 100644 --- a/articles/fennel-initial-exploration/_payload.json +++ b/articles/fennel-initial-exploration/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":1079},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"draft":6,"date":10,"tags":11,"categories":15,"cover_image":16,"excerpt":17,"body":27,"_type":1074,"_id":1075,"_source":1076,"_file":1077,"_extension":1078},"/articles/fennel-initial-exploration","articles",false,"","Impressions of Fennel with Hammerspoon","A while back I read an introductory book on Lisp programming titled, \"The Little\nSchemer\". This book opened my mind to new (to me) programming paradigms, and left me\nwith a strong desire to find a way to incorporate Lisp programming into my every day\nlife. It took some time, but I believe I've found what I've been looking for: Fennel.","2023-10-22",[12,13,14],"lisp","hammerspoon","fennel",[12],"/images/dall-e-fennel-hammer.jpeg",{"type":18,"children":19},"root",[20],{"type":21,"tag":22,"props":23,"children":24},"element","p",{},[25],{"type":26,"value":9},"text",{"type":18,"children":28,"toc":1068},[29,33,67,74,88,94,125,157,170,199,422,428,458,536,589,602,908,1013,1026,1032,1037,1051,1062],{"type":21,"tag":22,"props":30,"children":31},{},[32],{"type":26,"value":9},{"type":21,"tag":22,"props":34,"children":35},{},[36,38,47,49,56,58,65],{"type":26,"value":37},"The ",{"type":21,"tag":39,"props":40,"children":44},"a",{"href":41,"rel":42},"https://fennel-lang.org/",[43],"nofollow",[45],{"type":26,"value":46},"Fennel",{"type":26,"value":48}," programming language is a dialect of Lisp that boasts compatibility with\nLua, and it just so happens that two of my favorite applications are configured with\nexactly that language: ",{"type":21,"tag":39,"props":50,"children":53},{"href":51,"rel":52},"https://www.hammerspoon.org/",[43],[54],{"type":26,"value":55},"Hammerspoon",{"type":26,"value":57},", and ",{"type":21,"tag":39,"props":59,"children":62},{"href":60,"rel":61},"https://neovim.io/",[43],[63],{"type":26,"value":64},"Neovim",{"type":26,"value":66},".",{"type":21,"tag":68,"props":69,"children":71},"h2",{"id":70},"initial-observations",[72],{"type":26,"value":73},"Initial Observations",{"type":21,"tag":22,"props":75,"children":76},{},[77,79,86],{"type":26,"value":78},"To initially explore Fennel, I wanted to start small. My Hammerspoon configuration\nconsists of 7 ",{"type":21,"tag":39,"props":80,"children":83},{"href":81,"rel":82},"https://github.com/cmpadden/dotfiles/tree/795749fa17e1310bb001bb7deaa22be8689f0027/hammerspoon/.hammerspoon/modules",[43],[84],{"type":26,"value":85},"modules",{"type":26,"value":87}," that I use for operations such as: launching applications,\nmanaging windows, keeping my computer from going to sleep, and general operating system\nautomation. So the plan is to translate these modules into Fennel, while maintaining\nwithout breaking the existing functionality. However, at this point, I wasn't even sure\nhow to embed Fennel into my project...",{"type":21,"tag":68,"props":89,"children":91},{"id":90},"integrating-fennel-with-hammerspoon",[92],{"type":26,"value":93},"Integrating Fennel with Hammerspoon",{"type":21,"tag":22,"props":95,"children":96},{},[97,99,106,108,115,117,123],{"type":26,"value":98},"While official documentation exists describing how to ",{"type":21,"tag":39,"props":100,"children":103},{"href":101,"rel":102},"https://fennel-lang.org/setup#embedding-fennel",[43],[104],{"type":26,"value":105},"embed fennel",{"type":26,"value":107}," into your\nproject; it didn't provide me with enough clarity to know my next steps on integrating\nit with Hammerspoon. I found a few resources online demonstrating how to extend the\n",{"type":21,"tag":109,"props":110,"children":112},"code",{"className":111},[],[113],{"type":26,"value":114},"package.path",{"type":26,"value":116}," and ",{"type":21,"tag":109,"props":118,"children":120},{"className":119},[],[121],{"type":26,"value":122},"package.cpath",{"type":26,"value":124}," properties in Lua, but I was unable to get this to\nwork.",{"type":21,"tag":126,"props":127,"children":128},"ul",{},[129,139,148],{"type":21,"tag":130,"props":131,"children":132},"li",{},[133],{"type":21,"tag":39,"props":134,"children":137},{"href":135,"rel":136},"https://blog.exupero.org/hammerspoon-with-fennel/",[43],[138],{"type":26,"value":135},{"type":21,"tag":130,"props":140,"children":141},{},[142],{"type":21,"tag":39,"props":143,"children":146},{"href":144,"rel":145},"https://github.com/Hammerspoon/hammerspoon/issues/2377#issuecomment-636331435",[43],[147],{"type":26,"value":144},{"type":21,"tag":130,"props":149,"children":150},{},[151],{"type":21,"tag":39,"props":152,"children":155},{"href":153,"rel":154},"https://github.com/agzam/spacehammer/blob/master/init.lua",[43],[156],{"type":26,"value":153},{"type":21,"tag":22,"props":158,"children":159},{},[160,162,168],{"type":26,"value":161},"Ultimately, I opted to include the ",{"type":21,"tag":109,"props":163,"children":165},{"className":164},[],[166],{"type":26,"value":167},"fennel.lua",{"type":26,"value":169}," file to my Hammerspoon configuration,\nand while not ideal, it does make the configuration nicely self-contained. I'll leave it\nas a future task to include the module installed with LuaRocks.",{"type":21,"tag":22,"props":171,"children":172},{},[173,175,181,183,189,191,197],{"type":26,"value":174},"With Fennel now included in my Hammerspoon configuration, all I need to do is configure\nthe ",{"type":21,"tag":109,"props":176,"children":178},{"className":177},[],[179],{"type":26,"value":180},"fennel.path",{"type":26,"value":182}," to point to the ",{"type":21,"tag":109,"props":184,"children":186},{"className":185},[],[187],{"type":26,"value":188},"*.fnl",{"type":26,"value":190}," files in the ",{"type":21,"tag":109,"props":192,"children":194},{"className":193},[],[195],{"type":26,"value":196},".hammerspoon/",{"type":26,"value":198}," directory, and\nttranslating these modules can begin!",{"type":21,"tag":200,"props":201,"children":205},"pre",{"className":202,"code":203,"language":204,"meta":7,"style":7},"language-lua shiki shiki-themes github-light","-- init.lua\n\nlocal fennel = require('fennel')\n\nfennel.path = package.path .. \";\" .. os.getenv(\"HOME\") .. \"/.hammerspoon/?.fnl\"\n\ntable.insert(package.loaders or package.searchers, fennel.searcher)\n\nrequire 'main'\n","lua",[206],{"type":21,"tag":109,"props":207,"children":208},{"__ignoreMap":7},[209,221,231,274,282,350,358,400,408],{"type":21,"tag":210,"props":211,"children":214},"span",{"class":212,"line":213},"line",1,[215],{"type":21,"tag":210,"props":216,"children":218},{"style":217},"--shiki-default:#6A737D",[219],{"type":26,"value":220},"-- init.lua\n",{"type":21,"tag":210,"props":222,"children":224},{"class":212,"line":223},2,[225],{"type":21,"tag":210,"props":226,"children":228},{"emptyLinePlaceholder":227},true,[229],{"type":26,"value":230},"\n",{"type":21,"tag":210,"props":232,"children":234},{"class":212,"line":233},3,[235,241,247,252,258,263,269],{"type":21,"tag":210,"props":236,"children":238},{"style":237},"--shiki-default:#D73A49",[239],{"type":26,"value":240},"local",{"type":21,"tag":210,"props":242,"children":244},{"style":243},"--shiki-default:#24292E",[245],{"type":26,"value":246}," fennel ",{"type":21,"tag":210,"props":248,"children":249},{"style":237},[250],{"type":26,"value":251},"=",{"type":21,"tag":210,"props":253,"children":255},{"style":254},"--shiki-default:#005CC5",[256],{"type":26,"value":257}," require",{"type":21,"tag":210,"props":259,"children":260},{"style":243},[261],{"type":26,"value":262},"(",{"type":21,"tag":210,"props":264,"children":266},{"style":265},"--shiki-default:#032F62",[267],{"type":26,"value":268},"'fennel'",{"type":21,"tag":210,"props":270,"children":271},{"style":243},[272],{"type":26,"value":273},")\n",{"type":21,"tag":210,"props":275,"children":277},{"class":212,"line":276},4,[278],{"type":21,"tag":210,"props":279,"children":280},{"emptyLinePlaceholder":227},[281],{"type":26,"value":230},{"type":21,"tag":210,"props":283,"children":285},{"class":212,"line":284},5,[286,291,297,302,307,312,317,322,327,331,336,341,345],{"type":21,"tag":210,"props":287,"children":288},{"style":243},[289],{"type":26,"value":290},"fennel.",{"type":21,"tag":210,"props":292,"children":294},{"style":293},"--shiki-default:#6F42C1",[295],{"type":26,"value":296},"path",{"type":21,"tag":210,"props":298,"children":299},{"style":237},[300],{"type":26,"value":301}," =",{"type":21,"tag":210,"props":303,"children":304},{"style":254},[305],{"type":26,"value":306}," package.path",{"type":21,"tag":210,"props":308,"children":309},{"style":237},[310],{"type":26,"value":311}," ..",{"type":21,"tag":210,"props":313,"children":314},{"style":265},[315],{"type":26,"value":316}," \";\" ",{"type":21,"tag":210,"props":318,"children":319},{"style":237},[320],{"type":26,"value":321},"..",{"type":21,"tag":210,"props":323,"children":324},{"style":254},[325],{"type":26,"value":326}," os.getenv",{"type":21,"tag":210,"props":328,"children":329},{"style":243},[330],{"type":26,"value":262},{"type":21,"tag":210,"props":332,"children":333},{"style":265},[334],{"type":26,"value":335},"\"HOME\"",{"type":21,"tag":210,"props":337,"children":338},{"style":243},[339],{"type":26,"value":340},") ",{"type":21,"tag":210,"props":342,"children":343},{"style":237},[344],{"type":26,"value":321},{"type":21,"tag":210,"props":346,"children":347},{"style":265},[348],{"type":26,"value":349}," \"/.hammerspoon/?.fnl\"\n",{"type":21,"tag":210,"props":351,"children":353},{"class":212,"line":352},6,[354],{"type":21,"tag":210,"props":355,"children":356},{"emptyLinePlaceholder":227},[357],{"type":26,"value":230},{"type":21,"tag":210,"props":359,"children":361},{"class":212,"line":360},7,[362,367,371,376,381,386,391,396],{"type":21,"tag":210,"props":363,"children":364},{"style":254},[365],{"type":26,"value":366},"table.insert",{"type":21,"tag":210,"props":368,"children":369},{"style":243},[370],{"type":26,"value":262},{"type":21,"tag":210,"props":372,"children":373},{"style":254},[374],{"type":26,"value":375},"package.loaders",{"type":21,"tag":210,"props":377,"children":378},{"style":237},[379],{"type":26,"value":380}," or",{"type":21,"tag":210,"props":382,"children":383},{"style":254},[384],{"type":26,"value":385}," package.searchers",{"type":21,"tag":210,"props":387,"children":388},{"style":243},[389],{"type":26,"value":390},", fennel.",{"type":21,"tag":210,"props":392,"children":393},{"style":293},[394],{"type":26,"value":395},"searcher",{"type":21,"tag":210,"props":397,"children":398},{"style":243},[399],{"type":26,"value":273},{"type":21,"tag":210,"props":401,"children":403},{"class":212,"line":402},8,[404],{"type":21,"tag":210,"props":405,"children":406},{"emptyLinePlaceholder":227},[407],{"type":26,"value":230},{"type":21,"tag":210,"props":409,"children":411},{"class":212,"line":410},9,[412,417],{"type":21,"tag":210,"props":413,"children":414},{"style":254},[415],{"type":26,"value":416},"require",{"type":21,"tag":210,"props":418,"children":419},{"style":265},[420],{"type":26,"value":421}," 'main'\n",{"type":21,"tag":68,"props":423,"children":425},{"id":424},"translating-lua-to-fennel",[426],{"type":26,"value":427},"Translating Lua to Fennel",{"type":21,"tag":22,"props":429,"children":430},{},[431,433,440,442,448,450,456],{"type":26,"value":432},"As a Fennel novice, I was happy to see that the Fennel project provides an online\ncross-compiler for Lua and Fennel called ",{"type":21,"tag":39,"props":434,"children":437},{"href":435,"rel":436},"https://fennel-lang.org/see",[43],[438],{"type":26,"value":439},"anti-fennel",{"type":26,"value":441},", and while it can generate some\nstrange-looking Fennel code, it was an extremely useful tool for me to get\nup-and-running right away. For example, by pasting the simple ",{"type":21,"tag":109,"props":443,"children":445},{"className":444},[],[446],{"type":26,"value":447},"sleep",{"type":26,"value":449}," function\nfrom the ",{"type":21,"tag":109,"props":451,"children":453},{"className":452},[],[454],{"type":26,"value":455},"helpers",{"type":26,"value":457}," module into the compiler:",{"type":21,"tag":200,"props":459,"children":461},{"className":202,"code":460,"language":204,"meta":7,"style":7},"function sleep(ms)\n os.execute(\"sleep \" .. tonumber(ms) / 1000)\nend\n",[462],{"type":21,"tag":109,"props":463,"children":464},{"__ignoreMap":7},[465,483,528],{"type":21,"tag":210,"props":466,"children":467},{"class":212,"line":213},[468,473,478],{"type":21,"tag":210,"props":469,"children":470},{"style":237},[471],{"type":26,"value":472},"function",{"type":21,"tag":210,"props":474,"children":475},{"style":293},[476],{"type":26,"value":477}," sleep",{"type":21,"tag":210,"props":479,"children":480},{"style":243},[481],{"type":26,"value":482},"(ms)\n",{"type":21,"tag":210,"props":484,"children":485},{"class":212,"line":223},[486,491,495,500,504,509,514,519,524],{"type":21,"tag":210,"props":487,"children":488},{"style":254},[489],{"type":26,"value":490}," os.execute",{"type":21,"tag":210,"props":492,"children":493},{"style":243},[494],{"type":26,"value":262},{"type":21,"tag":210,"props":496,"children":497},{"style":265},[498],{"type":26,"value":499},"\"sleep \" ",{"type":21,"tag":210,"props":501,"children":502},{"style":237},[503],{"type":26,"value":321},{"type":21,"tag":210,"props":505,"children":506},{"style":254},[507],{"type":26,"value":508}," tonumber",{"type":21,"tag":210,"props":510,"children":511},{"style":243},[512],{"type":26,"value":513},"(ms) ",{"type":21,"tag":210,"props":515,"children":516},{"style":237},[517],{"type":26,"value":518},"/",{"type":21,"tag":210,"props":520,"children":521},{"style":254},[522],{"type":26,"value":523}," 1000",{"type":21,"tag":210,"props":525,"children":526},{"style":243},[527],{"type":26,"value":273},{"type":21,"tag":210,"props":529,"children":530},{"class":212,"line":233},[531],{"type":21,"tag":210,"props":532,"children":533},{"style":237},[534],{"type":26,"value":535},"end\n",{"type":21,"tag":200,"props":537,"children":540},{"className":538,"code":539,"language":12,"meta":7,"style":7},"language-lisp shiki shiki-themes github-light","(fn sleep [ms]\n (os.execute (.. \"sleep \" (/ (tonumber ms) 1000))))\n",[541],{"type":21,"tag":109,"props":542,"children":543},{"__ignoreMap":7},[544,552],{"type":21,"tag":210,"props":545,"children":546},{"class":212,"line":213},[547],{"type":21,"tag":210,"props":548,"children":549},{"style":243},[550],{"type":26,"value":551},"(fn sleep [ms]\n",{"type":21,"tag":210,"props":553,"children":554},{"class":212,"line":223},[555,560,565,570,574,579,584],{"type":21,"tag":210,"props":556,"children":557},{"style":243},[558],{"type":26,"value":559}," (os.execute (.. ",{"type":21,"tag":210,"props":561,"children":562},{"style":265},[563],{"type":26,"value":564},"\"sleep \"",{"type":21,"tag":210,"props":566,"children":567},{"style":243},[568],{"type":26,"value":569}," (",{"type":21,"tag":210,"props":571,"children":572},{"style":237},[573],{"type":26,"value":518},{"type":21,"tag":210,"props":575,"children":576},{"style":243},[577],{"type":26,"value":578}," (tonumber ms) ",{"type":21,"tag":210,"props":580,"children":581},{"style":254},[582],{"type":26,"value":583},"1000",{"type":21,"tag":210,"props":585,"children":586},{"style":243},[587],{"type":26,"value":588},"))))\n",{"type":21,"tag":22,"props":590,"children":591},{},[592,594,600],{"type":26,"value":593},"As another example, here is the output for my ",{"type":21,"tag":595,"props":596,"children":597},"em",{},[598],{"type":26,"value":599},"caffeine",{"type":26,"value":601}," toggle:",{"type":21,"tag":200,"props":603,"children":605},{"className":202,"code":604,"language":204,"meta":7,"style":7},"hs.hotkey.bind(HYPER, \"0\", function()\n hs.caffeinate.toggle(\"displayIdle\")\n if hs.caffeinate.get(\"displayIdle\") then\n helpers:show(\"Caffeine Enabled\", nil, helpers.styles.success, helpers.assets.check)\n else\n helpers:show(\"Caffeine Disabled\", nil, helpers.styles.error, helpers.assets.ban)\n end\nend)\n",[606],{"type":21,"tag":109,"props":607,"children":608},{"__ignoreMap":7},[609,655,690,733,810,818,888,896],{"type":21,"tag":210,"props":610,"children":611},{"class":212,"line":213},[612,617,622,626,631,636,641,646,650],{"type":21,"tag":210,"props":613,"children":614},{"style":243},[615],{"type":26,"value":616},"hs.",{"type":21,"tag":210,"props":618,"children":619},{"style":293},[620],{"type":26,"value":621},"hotkey",{"type":21,"tag":210,"props":623,"children":624},{"style":243},[625],{"type":26,"value":66},{"type":21,"tag":210,"props":627,"children":628},{"style":254},[629],{"type":26,"value":630},"bind",{"type":21,"tag":210,"props":632,"children":633},{"style":243},[634],{"type":26,"value":635},"(HYPER, ",{"type":21,"tag":210,"props":637,"children":638},{"style":265},[639],{"type":26,"value":640},"\"0\"",{"type":21,"tag":210,"props":642,"children":643},{"style":243},[644],{"type":26,"value":645},", ",{"type":21,"tag":210,"props":647,"children":648},{"style":237},[649],{"type":26,"value":472},{"type":21,"tag":210,"props":651,"children":652},{"style":243},[653],{"type":26,"value":654},"()\n",{"type":21,"tag":210,"props":656,"children":657},{"class":212,"line":223},[658,663,668,672,677,681,686],{"type":21,"tag":210,"props":659,"children":660},{"style":243},[661],{"type":26,"value":662}," hs.",{"type":21,"tag":210,"props":664,"children":665},{"style":293},[666],{"type":26,"value":667},"caffeinate",{"type":21,"tag":210,"props":669,"children":670},{"style":243},[671],{"type":26,"value":66},{"type":21,"tag":210,"props":673,"children":674},{"style":254},[675],{"type":26,"value":676},"toggle",{"type":21,"tag":210,"props":678,"children":679},{"style":243},[680],{"type":26,"value":262},{"type":21,"tag":210,"props":682,"children":683},{"style":265},[684],{"type":26,"value":685},"\"displayIdle\"",{"type":21,"tag":210,"props":687,"children":688},{"style":243},[689],{"type":26,"value":273},{"type":21,"tag":210,"props":691,"children":692},{"class":212,"line":233},[693,698,703,707,711,716,720,724,728],{"type":21,"tag":210,"props":694,"children":695},{"style":237},[696],{"type":26,"value":697}," if",{"type":21,"tag":210,"props":699,"children":700},{"style":243},[701],{"type":26,"value":702}," hs.",{"type":21,"tag":210,"props":704,"children":705},{"style":293},[706],{"type":26,"value":667},{"type":21,"tag":210,"props":708,"children":709},{"style":243},[710],{"type":26,"value":66},{"type":21,"tag":210,"props":712,"children":713},{"style":254},[714],{"type":26,"value":715},"get",{"type":21,"tag":210,"props":717,"children":718},{"style":243},[719],{"type":26,"value":262},{"type":21,"tag":210,"props":721,"children":722},{"style":265},[723],{"type":26,"value":685},{"type":21,"tag":210,"props":725,"children":726},{"style":243},[727],{"type":26,"value":340},{"type":21,"tag":210,"props":729,"children":730},{"style":237},[731],{"type":26,"value":732},"then\n",{"type":21,"tag":210,"props":734,"children":735},{"class":212,"line":276},[736,741,746,751,755,760,764,769,774,779,783,788,792,797,801,806],{"type":21,"tag":210,"props":737,"children":738},{"style":293},[739],{"type":26,"value":740}," helpers",{"type":21,"tag":210,"props":742,"children":743},{"style":243},[744],{"type":26,"value":745},":",{"type":21,"tag":210,"props":747,"children":748},{"style":254},[749],{"type":26,"value":750},"show",{"type":21,"tag":210,"props":752,"children":753},{"style":243},[754],{"type":26,"value":262},{"type":21,"tag":210,"props":756,"children":757},{"style":265},[758],{"type":26,"value":759},"\"Caffeine Enabled\"",{"type":21,"tag":210,"props":761,"children":762},{"style":243},[763],{"type":26,"value":645},{"type":21,"tag":210,"props":765,"children":766},{"style":254},[767],{"type":26,"value":768},"nil",{"type":21,"tag":210,"props":770,"children":771},{"style":243},[772],{"type":26,"value":773},", helpers.",{"type":21,"tag":210,"props":775,"children":776},{"style":293},[777],{"type":26,"value":778},"styles",{"type":21,"tag":210,"props":780,"children":781},{"style":243},[782],{"type":26,"value":66},{"type":21,"tag":210,"props":784,"children":785},{"style":293},[786],{"type":26,"value":787},"success",{"type":21,"tag":210,"props":789,"children":790},{"style":243},[791],{"type":26,"value":773},{"type":21,"tag":210,"props":793,"children":794},{"style":293},[795],{"type":26,"value":796},"assets",{"type":21,"tag":210,"props":798,"children":799},{"style":243},[800],{"type":26,"value":66},{"type":21,"tag":210,"props":802,"children":803},{"style":293},[804],{"type":26,"value":805},"check",{"type":21,"tag":210,"props":807,"children":808},{"style":243},[809],{"type":26,"value":273},{"type":21,"tag":210,"props":811,"children":812},{"class":212,"line":284},[813],{"type":21,"tag":210,"props":814,"children":815},{"style":237},[816],{"type":26,"value":817}," else\n",{"type":21,"tag":210,"props":819,"children":820},{"class":212,"line":352},[821,825,829,833,837,842,846,850,854,858,862,867,871,875,879,884],{"type":21,"tag":210,"props":822,"children":823},{"style":293},[824],{"type":26,"value":740},{"type":21,"tag":210,"props":826,"children":827},{"style":243},[828],{"type":26,"value":745},{"type":21,"tag":210,"props":830,"children":831},{"style":254},[832],{"type":26,"value":750},{"type":21,"tag":210,"props":834,"children":835},{"style":243},[836],{"type":26,"value":262},{"type":21,"tag":210,"props":838,"children":839},{"style":265},[840],{"type":26,"value":841},"\"Caffeine Disabled\"",{"type":21,"tag":210,"props":843,"children":844},{"style":243},[845],{"type":26,"value":645},{"type":21,"tag":210,"props":847,"children":848},{"style":254},[849],{"type":26,"value":768},{"type":21,"tag":210,"props":851,"children":852},{"style":243},[853],{"type":26,"value":773},{"type":21,"tag":210,"props":855,"children":856},{"style":293},[857],{"type":26,"value":778},{"type":21,"tag":210,"props":859,"children":860},{"style":243},[861],{"type":26,"value":66},{"type":21,"tag":210,"props":863,"children":864},{"style":293},[865],{"type":26,"value":866},"error",{"type":21,"tag":210,"props":868,"children":869},{"style":243},[870],{"type":26,"value":773},{"type":21,"tag":210,"props":872,"children":873},{"style":293},[874],{"type":26,"value":796},{"type":21,"tag":210,"props":876,"children":877},{"style":243},[878],{"type":26,"value":66},{"type":21,"tag":210,"props":880,"children":881},{"style":293},[882],{"type":26,"value":883},"ban",{"type":21,"tag":210,"props":885,"children":886},{"style":243},[887],{"type":26,"value":273},{"type":21,"tag":210,"props":889,"children":890},{"class":212,"line":360},[891],{"type":21,"tag":210,"props":892,"children":893},{"style":237},[894],{"type":26,"value":895}," end\n",{"type":21,"tag":210,"props":897,"children":898},{"class":212,"line":402},[899,904],{"type":21,"tag":210,"props":900,"children":901},{"style":237},[902],{"type":26,"value":903},"end",{"type":21,"tag":210,"props":905,"children":906},{"style":243},[907],{"type":26,"value":273},{"type":21,"tag":200,"props":909,"children":911},{"className":538,"code":910,"language":12,"meta":7,"style":7},"(hs.hotkey.bind HYPER :0\n (fn [] (hs.caffeinate.toggle :displayIdle)\n (if (hs.caffeinate.get :displayIdle)\n (helpers:show \"Caffeine Enabled\" nil helpers.styles.success helpers.assets.check)\n (helpers:show \"Caffeine Disabled\" nil helpers.styles.error helpers.assets.ban)))) \n",[912],{"type":21,"tag":109,"props":913,"children":914},{"__ignoreMap":7},[915,928,945,971,993],{"type":21,"tag":210,"props":916,"children":917},{"class":212,"line":213},[918,923],{"type":21,"tag":210,"props":919,"children":920},{"style":243},[921],{"type":26,"value":922},"(hs.hotkey.bind HYPER ",{"type":21,"tag":210,"props":924,"children":925},{"style":237},[926],{"type":26,"value":927},":0\n",{"type":21,"tag":210,"props":929,"children":930},{"class":212,"line":223},[931,936,941],{"type":21,"tag":210,"props":932,"children":933},{"style":243},[934],{"type":26,"value":935}," (fn [] (hs.caffeinate.toggle ",{"type":21,"tag":210,"props":937,"children":938},{"style":237},[939],{"type":26,"value":940},":displayIdle",{"type":21,"tag":210,"props":942,"children":943},{"style":243},[944],{"type":26,"value":273},{"type":21,"tag":210,"props":946,"children":947},{"class":212,"line":233},[948,953,958,963,967],{"type":21,"tag":210,"props":949,"children":950},{"style":243},[951],{"type":26,"value":952}," (",{"type":21,"tag":210,"props":954,"children":955},{"style":237},[956],{"type":26,"value":957},"if",{"type":21,"tag":210,"props":959,"children":960},{"style":243},[961],{"type":26,"value":962}," (hs.caffeinate.get ",{"type":21,"tag":210,"props":964,"children":965},{"style":237},[966],{"type":26,"value":940},{"type":21,"tag":210,"props":968,"children":969},{"style":243},[970],{"type":26,"value":273},{"type":21,"tag":210,"props":972,"children":973},{"class":212,"line":276},[974,979,983,988],{"type":21,"tag":210,"props":975,"children":976},{"style":243},[977],{"type":26,"value":978}," (helpers:show ",{"type":21,"tag":210,"props":980,"children":981},{"style":265},[982],{"type":26,"value":759},{"type":21,"tag":210,"props":984,"children":985},{"style":254},[986],{"type":26,"value":987}," nil",{"type":21,"tag":210,"props":989,"children":990},{"style":243},[991],{"type":26,"value":992}," helpers.styles.success helpers.assets.check)\n",{"type":21,"tag":210,"props":994,"children":995},{"class":212,"line":284},[996,1000,1004,1008],{"type":21,"tag":210,"props":997,"children":998},{"style":243},[999],{"type":26,"value":978},{"type":21,"tag":210,"props":1001,"children":1002},{"style":265},[1003],{"type":26,"value":841},{"type":21,"tag":210,"props":1005,"children":1006},{"style":254},[1007],{"type":26,"value":987},{"type":21,"tag":210,"props":1009,"children":1010},{"style":243},[1011],{"type":26,"value":1012}," helpers.styles.error helpers.assets.ban))))\n",{"type":21,"tag":22,"props":1014,"children":1015},{},[1016,1018,1024],{"type":26,"value":1017},"This was especially helpful for more gnarly modules like the ",{"type":21,"tag":109,"props":1019,"children":1021},{"className":1020},[],[1022],{"type":26,"value":1023},"window",{"type":26,"value":1025}," module used for\nwindow management, and seeing the Lua and Fennel code side-by-side was a kick starter in\nlearning the language!",{"type":21,"tag":68,"props":1027,"children":1029},{"id":1028},"next-steps",[1030],{"type":26,"value":1031},"Next Steps",{"type":21,"tag":22,"props":1033,"children":1034},{},[1035],{"type":26,"value":1036},"While my Fennel Hammerspoon configuration now works with parity to its Lua counterpart,\nI have not yet added new features or modules. I look forward to writing new Fennel code,\nand deepen my understanding of Lisp and the Fennel programming language.",{"type":21,"tag":22,"props":1038,"children":1039},{},[1040,1042,1049],{"type":26,"value":1041},"Additionally, before beginning this endeavor, I was already aware of projects like\n",{"type":21,"tag":39,"props":1043,"children":1046},{"href":1044,"rel":1045},"https://github.com/agzam/spacehammer",[43],[1047],{"type":26,"value":1048},"spacehammer",{"type":26,"value":1050},"; a wildly impressive Hammerspoon configuration written in Fennel, but,\nI wanted to start small and learn the integration myself. However, with the basics out\nof the way, I hope to explore this project further, and seek lessons-learned for the\nconfiguration of my own.",{"type":21,"tag":22,"props":1052,"children":1053},{},[1054,1056],{"type":26,"value":1055},"The full pull-request for translating my Lua Hammerspoon configuration to Fennel can be\nfound here: ",{"type":21,"tag":39,"props":1057,"children":1060},{"href":1058,"rel":1059},"https://github.com/cmpadden/dotfiles/pull/19/files",[43],[1061],{"type":26,"value":1058},{"type":21,"tag":1063,"props":1064,"children":1065},"style",{},[1066],{"type":26,"value":1067},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":223,"depth":223,"links":1069},[1070,1071,1072,1073],{"id":70,"depth":223,"text":73},{"id":90,"depth":223,"text":93},{"id":424,"depth":223,"text":427},{"id":1028,"depth":223,"text":1031},"markdown","content:articles:fennel-initial-exploration.md","content","articles/fennel-initial-exploration.md","md",1718428848849] \ No newline at end of file +[{"data":1,"prerenderedAt":1079},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"draft":6,"date":10,"tags":11,"categories":15,"cover_image":16,"excerpt":17,"body":27,"_type":1074,"_id":1075,"_source":1076,"_file":1077,"_extension":1078},"/articles/fennel-initial-exploration","articles",false,"","Impressions of Fennel with Hammerspoon","A while back I read an introductory book on Lisp programming titled, \"The Little\nSchemer\". This book opened my mind to new (to me) programming paradigms, and left me\nwith a strong desire to find a way to incorporate Lisp programming into my every day\nlife. It took some time, but I believe I've found what I've been looking for: Fennel.","2023-10-22",[12,13,14],"lisp","hammerspoon","fennel",[12],"/images/dall-e-fennel-hammer.jpeg",{"type":18,"children":19},"root",[20],{"type":21,"tag":22,"props":23,"children":24},"element","p",{},[25],{"type":26,"value":9},"text",{"type":18,"children":28,"toc":1068},[29,33,67,74,88,94,125,157,170,199,422,428,458,536,589,602,908,1013,1026,1032,1037,1051,1062],{"type":21,"tag":22,"props":30,"children":31},{},[32],{"type":26,"value":9},{"type":21,"tag":22,"props":34,"children":35},{},[36,38,47,49,56,58,65],{"type":26,"value":37},"The ",{"type":21,"tag":39,"props":40,"children":44},"a",{"href":41,"rel":42},"https://fennel-lang.org/",[43],"nofollow",[45],{"type":26,"value":46},"Fennel",{"type":26,"value":48}," programming language is a dialect of Lisp that boasts compatibility with\nLua, and it just so happens that two of my favorite applications are configured with\nexactly that language: ",{"type":21,"tag":39,"props":50,"children":53},{"href":51,"rel":52},"https://www.hammerspoon.org/",[43],[54],{"type":26,"value":55},"Hammerspoon",{"type":26,"value":57},", and ",{"type":21,"tag":39,"props":59,"children":62},{"href":60,"rel":61},"https://neovim.io/",[43],[63],{"type":26,"value":64},"Neovim",{"type":26,"value":66},".",{"type":21,"tag":68,"props":69,"children":71},"h2",{"id":70},"initial-observations",[72],{"type":26,"value":73},"Initial Observations",{"type":21,"tag":22,"props":75,"children":76},{},[77,79,86],{"type":26,"value":78},"To initially explore Fennel, I wanted to start small. My Hammerspoon configuration\nconsists of 7 ",{"type":21,"tag":39,"props":80,"children":83},{"href":81,"rel":82},"https://github.com/cmpadden/dotfiles/tree/795749fa17e1310bb001bb7deaa22be8689f0027/hammerspoon/.hammerspoon/modules",[43],[84],{"type":26,"value":85},"modules",{"type":26,"value":87}," that I use for operations such as: launching applications,\nmanaging windows, keeping my computer from going to sleep, and general operating system\nautomation. So the plan is to translate these modules into Fennel, while maintaining\nwithout breaking the existing functionality. However, at this point, I wasn't even sure\nhow to embed Fennel into my project...",{"type":21,"tag":68,"props":89,"children":91},{"id":90},"integrating-fennel-with-hammerspoon",[92],{"type":26,"value":93},"Integrating Fennel with Hammerspoon",{"type":21,"tag":22,"props":95,"children":96},{},[97,99,106,108,115,117,123],{"type":26,"value":98},"While official documentation exists describing how to ",{"type":21,"tag":39,"props":100,"children":103},{"href":101,"rel":102},"https://fennel-lang.org/setup#embedding-fennel",[43],[104],{"type":26,"value":105},"embed fennel",{"type":26,"value":107}," into your\nproject; it didn't provide me with enough clarity to know my next steps on integrating\nit with Hammerspoon. I found a few resources online demonstrating how to extend the\n",{"type":21,"tag":109,"props":110,"children":112},"code",{"className":111},[],[113],{"type":26,"value":114},"package.path",{"type":26,"value":116}," and ",{"type":21,"tag":109,"props":118,"children":120},{"className":119},[],[121],{"type":26,"value":122},"package.cpath",{"type":26,"value":124}," properties in Lua, but I was unable to get this to\nwork.",{"type":21,"tag":126,"props":127,"children":128},"ul",{},[129,139,148],{"type":21,"tag":130,"props":131,"children":132},"li",{},[133],{"type":21,"tag":39,"props":134,"children":137},{"href":135,"rel":136},"https://blog.exupero.org/hammerspoon-with-fennel/",[43],[138],{"type":26,"value":135},{"type":21,"tag":130,"props":140,"children":141},{},[142],{"type":21,"tag":39,"props":143,"children":146},{"href":144,"rel":145},"https://github.com/Hammerspoon/hammerspoon/issues/2377#issuecomment-636331435",[43],[147],{"type":26,"value":144},{"type":21,"tag":130,"props":149,"children":150},{},[151],{"type":21,"tag":39,"props":152,"children":155},{"href":153,"rel":154},"https://github.com/agzam/spacehammer/blob/master/init.lua",[43],[156],{"type":26,"value":153},{"type":21,"tag":22,"props":158,"children":159},{},[160,162,168],{"type":26,"value":161},"Ultimately, I opted to include the ",{"type":21,"tag":109,"props":163,"children":165},{"className":164},[],[166],{"type":26,"value":167},"fennel.lua",{"type":26,"value":169}," file to my Hammerspoon configuration,\nand while not ideal, it does make the configuration nicely self-contained. I'll leave it\nas a future task to include the module installed with LuaRocks.",{"type":21,"tag":22,"props":171,"children":172},{},[173,175,181,183,189,191,197],{"type":26,"value":174},"With Fennel now included in my Hammerspoon configuration, all I need to do is configure\nthe ",{"type":21,"tag":109,"props":176,"children":178},{"className":177},[],[179],{"type":26,"value":180},"fennel.path",{"type":26,"value":182}," to point to the ",{"type":21,"tag":109,"props":184,"children":186},{"className":185},[],[187],{"type":26,"value":188},"*.fnl",{"type":26,"value":190}," files in the ",{"type":21,"tag":109,"props":192,"children":194},{"className":193},[],[195],{"type":26,"value":196},".hammerspoon/",{"type":26,"value":198}," directory, and\nttranslating these modules can begin!",{"type":21,"tag":200,"props":201,"children":205},"pre",{"className":202,"code":203,"language":204,"meta":7,"style":7},"language-lua shiki shiki-themes github-light","-- init.lua\n\nlocal fennel = require('fennel')\n\nfennel.path = package.path .. \";\" .. os.getenv(\"HOME\") .. \"/.hammerspoon/?.fnl\"\n\ntable.insert(package.loaders or package.searchers, fennel.searcher)\n\nrequire 'main'\n","lua",[206],{"type":21,"tag":109,"props":207,"children":208},{"__ignoreMap":7},[209,221,231,274,282,350,358,400,408],{"type":21,"tag":210,"props":211,"children":214},"span",{"class":212,"line":213},"line",1,[215],{"type":21,"tag":210,"props":216,"children":218},{"style":217},"--shiki-default:#6A737D",[219],{"type":26,"value":220},"-- init.lua\n",{"type":21,"tag":210,"props":222,"children":224},{"class":212,"line":223},2,[225],{"type":21,"tag":210,"props":226,"children":228},{"emptyLinePlaceholder":227},true,[229],{"type":26,"value":230},"\n",{"type":21,"tag":210,"props":232,"children":234},{"class":212,"line":233},3,[235,241,247,252,258,263,269],{"type":21,"tag":210,"props":236,"children":238},{"style":237},"--shiki-default:#D73A49",[239],{"type":26,"value":240},"local",{"type":21,"tag":210,"props":242,"children":244},{"style":243},"--shiki-default:#24292E",[245],{"type":26,"value":246}," fennel ",{"type":21,"tag":210,"props":248,"children":249},{"style":237},[250],{"type":26,"value":251},"=",{"type":21,"tag":210,"props":253,"children":255},{"style":254},"--shiki-default:#005CC5",[256],{"type":26,"value":257}," require",{"type":21,"tag":210,"props":259,"children":260},{"style":243},[261],{"type":26,"value":262},"(",{"type":21,"tag":210,"props":264,"children":266},{"style":265},"--shiki-default:#032F62",[267],{"type":26,"value":268},"'fennel'",{"type":21,"tag":210,"props":270,"children":271},{"style":243},[272],{"type":26,"value":273},")\n",{"type":21,"tag":210,"props":275,"children":277},{"class":212,"line":276},4,[278],{"type":21,"tag":210,"props":279,"children":280},{"emptyLinePlaceholder":227},[281],{"type":26,"value":230},{"type":21,"tag":210,"props":283,"children":285},{"class":212,"line":284},5,[286,291,297,302,307,312,317,322,327,331,336,341,345],{"type":21,"tag":210,"props":287,"children":288},{"style":243},[289],{"type":26,"value":290},"fennel.",{"type":21,"tag":210,"props":292,"children":294},{"style":293},"--shiki-default:#6F42C1",[295],{"type":26,"value":296},"path",{"type":21,"tag":210,"props":298,"children":299},{"style":237},[300],{"type":26,"value":301}," =",{"type":21,"tag":210,"props":303,"children":304},{"style":254},[305],{"type":26,"value":306}," package.path",{"type":21,"tag":210,"props":308,"children":309},{"style":237},[310],{"type":26,"value":311}," ..",{"type":21,"tag":210,"props":313,"children":314},{"style":265},[315],{"type":26,"value":316}," \";\" ",{"type":21,"tag":210,"props":318,"children":319},{"style":237},[320],{"type":26,"value":321},"..",{"type":21,"tag":210,"props":323,"children":324},{"style":254},[325],{"type":26,"value":326}," os.getenv",{"type":21,"tag":210,"props":328,"children":329},{"style":243},[330],{"type":26,"value":262},{"type":21,"tag":210,"props":332,"children":333},{"style":265},[334],{"type":26,"value":335},"\"HOME\"",{"type":21,"tag":210,"props":337,"children":338},{"style":243},[339],{"type":26,"value":340},") ",{"type":21,"tag":210,"props":342,"children":343},{"style":237},[344],{"type":26,"value":321},{"type":21,"tag":210,"props":346,"children":347},{"style":265},[348],{"type":26,"value":349}," \"/.hammerspoon/?.fnl\"\n",{"type":21,"tag":210,"props":351,"children":353},{"class":212,"line":352},6,[354],{"type":21,"tag":210,"props":355,"children":356},{"emptyLinePlaceholder":227},[357],{"type":26,"value":230},{"type":21,"tag":210,"props":359,"children":361},{"class":212,"line":360},7,[362,367,371,376,381,386,391,396],{"type":21,"tag":210,"props":363,"children":364},{"style":254},[365],{"type":26,"value":366},"table.insert",{"type":21,"tag":210,"props":368,"children":369},{"style":243},[370],{"type":26,"value":262},{"type":21,"tag":210,"props":372,"children":373},{"style":254},[374],{"type":26,"value":375},"package.loaders",{"type":21,"tag":210,"props":377,"children":378},{"style":237},[379],{"type":26,"value":380}," or",{"type":21,"tag":210,"props":382,"children":383},{"style":254},[384],{"type":26,"value":385}," package.searchers",{"type":21,"tag":210,"props":387,"children":388},{"style":243},[389],{"type":26,"value":390},", fennel.",{"type":21,"tag":210,"props":392,"children":393},{"style":293},[394],{"type":26,"value":395},"searcher",{"type":21,"tag":210,"props":397,"children":398},{"style":243},[399],{"type":26,"value":273},{"type":21,"tag":210,"props":401,"children":403},{"class":212,"line":402},8,[404],{"type":21,"tag":210,"props":405,"children":406},{"emptyLinePlaceholder":227},[407],{"type":26,"value":230},{"type":21,"tag":210,"props":409,"children":411},{"class":212,"line":410},9,[412,417],{"type":21,"tag":210,"props":413,"children":414},{"style":254},[415],{"type":26,"value":416},"require",{"type":21,"tag":210,"props":418,"children":419},{"style":265},[420],{"type":26,"value":421}," 'main'\n",{"type":21,"tag":68,"props":423,"children":425},{"id":424},"translating-lua-to-fennel",[426],{"type":26,"value":427},"Translating Lua to Fennel",{"type":21,"tag":22,"props":429,"children":430},{},[431,433,440,442,448,450,456],{"type":26,"value":432},"As a Fennel novice, I was happy to see that the Fennel project provides an online\ncross-compiler for Lua and Fennel called ",{"type":21,"tag":39,"props":434,"children":437},{"href":435,"rel":436},"https://fennel-lang.org/see",[43],[438],{"type":26,"value":439},"anti-fennel",{"type":26,"value":441},", and while it can generate some\nstrange-looking Fennel code, it was an extremely useful tool for me to get\nup-and-running right away. For example, by pasting the simple ",{"type":21,"tag":109,"props":443,"children":445},{"className":444},[],[446],{"type":26,"value":447},"sleep",{"type":26,"value":449}," function\nfrom the ",{"type":21,"tag":109,"props":451,"children":453},{"className":452},[],[454],{"type":26,"value":455},"helpers",{"type":26,"value":457}," module into the compiler:",{"type":21,"tag":200,"props":459,"children":461},{"className":202,"code":460,"language":204,"meta":7,"style":7},"function sleep(ms)\n os.execute(\"sleep \" .. tonumber(ms) / 1000)\nend\n",[462],{"type":21,"tag":109,"props":463,"children":464},{"__ignoreMap":7},[465,483,528],{"type":21,"tag":210,"props":466,"children":467},{"class":212,"line":213},[468,473,478],{"type":21,"tag":210,"props":469,"children":470},{"style":237},[471],{"type":26,"value":472},"function",{"type":21,"tag":210,"props":474,"children":475},{"style":293},[476],{"type":26,"value":477}," sleep",{"type":21,"tag":210,"props":479,"children":480},{"style":243},[481],{"type":26,"value":482},"(ms)\n",{"type":21,"tag":210,"props":484,"children":485},{"class":212,"line":223},[486,491,495,500,504,509,514,519,524],{"type":21,"tag":210,"props":487,"children":488},{"style":254},[489],{"type":26,"value":490}," os.execute",{"type":21,"tag":210,"props":492,"children":493},{"style":243},[494],{"type":26,"value":262},{"type":21,"tag":210,"props":496,"children":497},{"style":265},[498],{"type":26,"value":499},"\"sleep \" ",{"type":21,"tag":210,"props":501,"children":502},{"style":237},[503],{"type":26,"value":321},{"type":21,"tag":210,"props":505,"children":506},{"style":254},[507],{"type":26,"value":508}," tonumber",{"type":21,"tag":210,"props":510,"children":511},{"style":243},[512],{"type":26,"value":513},"(ms) ",{"type":21,"tag":210,"props":515,"children":516},{"style":237},[517],{"type":26,"value":518},"/",{"type":21,"tag":210,"props":520,"children":521},{"style":254},[522],{"type":26,"value":523}," 1000",{"type":21,"tag":210,"props":525,"children":526},{"style":243},[527],{"type":26,"value":273},{"type":21,"tag":210,"props":529,"children":530},{"class":212,"line":233},[531],{"type":21,"tag":210,"props":532,"children":533},{"style":237},[534],{"type":26,"value":535},"end\n",{"type":21,"tag":200,"props":537,"children":540},{"className":538,"code":539,"language":12,"meta":7,"style":7},"language-lisp shiki shiki-themes github-light","(fn sleep [ms]\n (os.execute (.. \"sleep \" (/ (tonumber ms) 1000))))\n",[541],{"type":21,"tag":109,"props":542,"children":543},{"__ignoreMap":7},[544,552],{"type":21,"tag":210,"props":545,"children":546},{"class":212,"line":213},[547],{"type":21,"tag":210,"props":548,"children":549},{"style":243},[550],{"type":26,"value":551},"(fn sleep [ms]\n",{"type":21,"tag":210,"props":553,"children":554},{"class":212,"line":223},[555,560,565,570,574,579,584],{"type":21,"tag":210,"props":556,"children":557},{"style":243},[558],{"type":26,"value":559}," (os.execute (.. ",{"type":21,"tag":210,"props":561,"children":562},{"style":265},[563],{"type":26,"value":564},"\"sleep \"",{"type":21,"tag":210,"props":566,"children":567},{"style":243},[568],{"type":26,"value":569}," (",{"type":21,"tag":210,"props":571,"children":572},{"style":237},[573],{"type":26,"value":518},{"type":21,"tag":210,"props":575,"children":576},{"style":243},[577],{"type":26,"value":578}," (tonumber ms) ",{"type":21,"tag":210,"props":580,"children":581},{"style":254},[582],{"type":26,"value":583},"1000",{"type":21,"tag":210,"props":585,"children":586},{"style":243},[587],{"type":26,"value":588},"))))\n",{"type":21,"tag":22,"props":590,"children":591},{},[592,594,600],{"type":26,"value":593},"As another example, here is the output for my ",{"type":21,"tag":595,"props":596,"children":597},"em",{},[598],{"type":26,"value":599},"caffeine",{"type":26,"value":601}," toggle:",{"type":21,"tag":200,"props":603,"children":605},{"className":202,"code":604,"language":204,"meta":7,"style":7},"hs.hotkey.bind(HYPER, \"0\", function()\n hs.caffeinate.toggle(\"displayIdle\")\n if hs.caffeinate.get(\"displayIdle\") then\n helpers:show(\"Caffeine Enabled\", nil, helpers.styles.success, helpers.assets.check)\n else\n helpers:show(\"Caffeine Disabled\", nil, helpers.styles.error, helpers.assets.ban)\n end\nend)\n",[606],{"type":21,"tag":109,"props":607,"children":608},{"__ignoreMap":7},[609,655,690,733,810,818,888,896],{"type":21,"tag":210,"props":610,"children":611},{"class":212,"line":213},[612,617,622,626,631,636,641,646,650],{"type":21,"tag":210,"props":613,"children":614},{"style":243},[615],{"type":26,"value":616},"hs.",{"type":21,"tag":210,"props":618,"children":619},{"style":293},[620],{"type":26,"value":621},"hotkey",{"type":21,"tag":210,"props":623,"children":624},{"style":243},[625],{"type":26,"value":66},{"type":21,"tag":210,"props":627,"children":628},{"style":254},[629],{"type":26,"value":630},"bind",{"type":21,"tag":210,"props":632,"children":633},{"style":243},[634],{"type":26,"value":635},"(HYPER, ",{"type":21,"tag":210,"props":637,"children":638},{"style":265},[639],{"type":26,"value":640},"\"0\"",{"type":21,"tag":210,"props":642,"children":643},{"style":243},[644],{"type":26,"value":645},", ",{"type":21,"tag":210,"props":647,"children":648},{"style":237},[649],{"type":26,"value":472},{"type":21,"tag":210,"props":651,"children":652},{"style":243},[653],{"type":26,"value":654},"()\n",{"type":21,"tag":210,"props":656,"children":657},{"class":212,"line":223},[658,663,668,672,677,681,686],{"type":21,"tag":210,"props":659,"children":660},{"style":243},[661],{"type":26,"value":662}," hs.",{"type":21,"tag":210,"props":664,"children":665},{"style":293},[666],{"type":26,"value":667},"caffeinate",{"type":21,"tag":210,"props":669,"children":670},{"style":243},[671],{"type":26,"value":66},{"type":21,"tag":210,"props":673,"children":674},{"style":254},[675],{"type":26,"value":676},"toggle",{"type":21,"tag":210,"props":678,"children":679},{"style":243},[680],{"type":26,"value":262},{"type":21,"tag":210,"props":682,"children":683},{"style":265},[684],{"type":26,"value":685},"\"displayIdle\"",{"type":21,"tag":210,"props":687,"children":688},{"style":243},[689],{"type":26,"value":273},{"type":21,"tag":210,"props":691,"children":692},{"class":212,"line":233},[693,698,703,707,711,716,720,724,728],{"type":21,"tag":210,"props":694,"children":695},{"style":237},[696],{"type":26,"value":697}," if",{"type":21,"tag":210,"props":699,"children":700},{"style":243},[701],{"type":26,"value":702}," hs.",{"type":21,"tag":210,"props":704,"children":705},{"style":293},[706],{"type":26,"value":667},{"type":21,"tag":210,"props":708,"children":709},{"style":243},[710],{"type":26,"value":66},{"type":21,"tag":210,"props":712,"children":713},{"style":254},[714],{"type":26,"value":715},"get",{"type":21,"tag":210,"props":717,"children":718},{"style":243},[719],{"type":26,"value":262},{"type":21,"tag":210,"props":721,"children":722},{"style":265},[723],{"type":26,"value":685},{"type":21,"tag":210,"props":725,"children":726},{"style":243},[727],{"type":26,"value":340},{"type":21,"tag":210,"props":729,"children":730},{"style":237},[731],{"type":26,"value":732},"then\n",{"type":21,"tag":210,"props":734,"children":735},{"class":212,"line":276},[736,741,746,751,755,760,764,769,774,779,783,788,792,797,801,806],{"type":21,"tag":210,"props":737,"children":738},{"style":293},[739],{"type":26,"value":740}," helpers",{"type":21,"tag":210,"props":742,"children":743},{"style":243},[744],{"type":26,"value":745},":",{"type":21,"tag":210,"props":747,"children":748},{"style":254},[749],{"type":26,"value":750},"show",{"type":21,"tag":210,"props":752,"children":753},{"style":243},[754],{"type":26,"value":262},{"type":21,"tag":210,"props":756,"children":757},{"style":265},[758],{"type":26,"value":759},"\"Caffeine Enabled\"",{"type":21,"tag":210,"props":761,"children":762},{"style":243},[763],{"type":26,"value":645},{"type":21,"tag":210,"props":765,"children":766},{"style":254},[767],{"type":26,"value":768},"nil",{"type":21,"tag":210,"props":770,"children":771},{"style":243},[772],{"type":26,"value":773},", helpers.",{"type":21,"tag":210,"props":775,"children":776},{"style":293},[777],{"type":26,"value":778},"styles",{"type":21,"tag":210,"props":780,"children":781},{"style":243},[782],{"type":26,"value":66},{"type":21,"tag":210,"props":784,"children":785},{"style":293},[786],{"type":26,"value":787},"success",{"type":21,"tag":210,"props":789,"children":790},{"style":243},[791],{"type":26,"value":773},{"type":21,"tag":210,"props":793,"children":794},{"style":293},[795],{"type":26,"value":796},"assets",{"type":21,"tag":210,"props":798,"children":799},{"style":243},[800],{"type":26,"value":66},{"type":21,"tag":210,"props":802,"children":803},{"style":293},[804],{"type":26,"value":805},"check",{"type":21,"tag":210,"props":807,"children":808},{"style":243},[809],{"type":26,"value":273},{"type":21,"tag":210,"props":811,"children":812},{"class":212,"line":284},[813],{"type":21,"tag":210,"props":814,"children":815},{"style":237},[816],{"type":26,"value":817}," else\n",{"type":21,"tag":210,"props":819,"children":820},{"class":212,"line":352},[821,825,829,833,837,842,846,850,854,858,862,867,871,875,879,884],{"type":21,"tag":210,"props":822,"children":823},{"style":293},[824],{"type":26,"value":740},{"type":21,"tag":210,"props":826,"children":827},{"style":243},[828],{"type":26,"value":745},{"type":21,"tag":210,"props":830,"children":831},{"style":254},[832],{"type":26,"value":750},{"type":21,"tag":210,"props":834,"children":835},{"style":243},[836],{"type":26,"value":262},{"type":21,"tag":210,"props":838,"children":839},{"style":265},[840],{"type":26,"value":841},"\"Caffeine Disabled\"",{"type":21,"tag":210,"props":843,"children":844},{"style":243},[845],{"type":26,"value":645},{"type":21,"tag":210,"props":847,"children":848},{"style":254},[849],{"type":26,"value":768},{"type":21,"tag":210,"props":851,"children":852},{"style":243},[853],{"type":26,"value":773},{"type":21,"tag":210,"props":855,"children":856},{"style":293},[857],{"type":26,"value":778},{"type":21,"tag":210,"props":859,"children":860},{"style":243},[861],{"type":26,"value":66},{"type":21,"tag":210,"props":863,"children":864},{"style":293},[865],{"type":26,"value":866},"error",{"type":21,"tag":210,"props":868,"children":869},{"style":243},[870],{"type":26,"value":773},{"type":21,"tag":210,"props":872,"children":873},{"style":293},[874],{"type":26,"value":796},{"type":21,"tag":210,"props":876,"children":877},{"style":243},[878],{"type":26,"value":66},{"type":21,"tag":210,"props":880,"children":881},{"style":293},[882],{"type":26,"value":883},"ban",{"type":21,"tag":210,"props":885,"children":886},{"style":243},[887],{"type":26,"value":273},{"type":21,"tag":210,"props":889,"children":890},{"class":212,"line":360},[891],{"type":21,"tag":210,"props":892,"children":893},{"style":237},[894],{"type":26,"value":895}," end\n",{"type":21,"tag":210,"props":897,"children":898},{"class":212,"line":402},[899,904],{"type":21,"tag":210,"props":900,"children":901},{"style":237},[902],{"type":26,"value":903},"end",{"type":21,"tag":210,"props":905,"children":906},{"style":243},[907],{"type":26,"value":273},{"type":21,"tag":200,"props":909,"children":911},{"className":538,"code":910,"language":12,"meta":7,"style":7},"(hs.hotkey.bind HYPER :0\n (fn [] (hs.caffeinate.toggle :displayIdle)\n (if (hs.caffeinate.get :displayIdle)\n (helpers:show \"Caffeine Enabled\" nil helpers.styles.success helpers.assets.check)\n (helpers:show \"Caffeine Disabled\" nil helpers.styles.error helpers.assets.ban)))) \n",[912],{"type":21,"tag":109,"props":913,"children":914},{"__ignoreMap":7},[915,928,945,971,993],{"type":21,"tag":210,"props":916,"children":917},{"class":212,"line":213},[918,923],{"type":21,"tag":210,"props":919,"children":920},{"style":243},[921],{"type":26,"value":922},"(hs.hotkey.bind HYPER ",{"type":21,"tag":210,"props":924,"children":925},{"style":237},[926],{"type":26,"value":927},":0\n",{"type":21,"tag":210,"props":929,"children":930},{"class":212,"line":223},[931,936,941],{"type":21,"tag":210,"props":932,"children":933},{"style":243},[934],{"type":26,"value":935}," (fn [] (hs.caffeinate.toggle ",{"type":21,"tag":210,"props":937,"children":938},{"style":237},[939],{"type":26,"value":940},":displayIdle",{"type":21,"tag":210,"props":942,"children":943},{"style":243},[944],{"type":26,"value":273},{"type":21,"tag":210,"props":946,"children":947},{"class":212,"line":233},[948,953,958,963,967],{"type":21,"tag":210,"props":949,"children":950},{"style":243},[951],{"type":26,"value":952}," (",{"type":21,"tag":210,"props":954,"children":955},{"style":237},[956],{"type":26,"value":957},"if",{"type":21,"tag":210,"props":959,"children":960},{"style":243},[961],{"type":26,"value":962}," (hs.caffeinate.get ",{"type":21,"tag":210,"props":964,"children":965},{"style":237},[966],{"type":26,"value":940},{"type":21,"tag":210,"props":968,"children":969},{"style":243},[970],{"type":26,"value":273},{"type":21,"tag":210,"props":972,"children":973},{"class":212,"line":276},[974,979,983,988],{"type":21,"tag":210,"props":975,"children":976},{"style":243},[977],{"type":26,"value":978}," (helpers:show ",{"type":21,"tag":210,"props":980,"children":981},{"style":265},[982],{"type":26,"value":759},{"type":21,"tag":210,"props":984,"children":985},{"style":254},[986],{"type":26,"value":987}," nil",{"type":21,"tag":210,"props":989,"children":990},{"style":243},[991],{"type":26,"value":992}," helpers.styles.success helpers.assets.check)\n",{"type":21,"tag":210,"props":994,"children":995},{"class":212,"line":284},[996,1000,1004,1008],{"type":21,"tag":210,"props":997,"children":998},{"style":243},[999],{"type":26,"value":978},{"type":21,"tag":210,"props":1001,"children":1002},{"style":265},[1003],{"type":26,"value":841},{"type":21,"tag":210,"props":1005,"children":1006},{"style":254},[1007],{"type":26,"value":987},{"type":21,"tag":210,"props":1009,"children":1010},{"style":243},[1011],{"type":26,"value":1012}," helpers.styles.error helpers.assets.ban))))\n",{"type":21,"tag":22,"props":1014,"children":1015},{},[1016,1018,1024],{"type":26,"value":1017},"This was especially helpful for more gnarly modules like the ",{"type":21,"tag":109,"props":1019,"children":1021},{"className":1020},[],[1022],{"type":26,"value":1023},"window",{"type":26,"value":1025}," module used for\nwindow management, and seeing the Lua and Fennel code side-by-side was a kick starter in\nlearning the language!",{"type":21,"tag":68,"props":1027,"children":1029},{"id":1028},"next-steps",[1030],{"type":26,"value":1031},"Next Steps",{"type":21,"tag":22,"props":1033,"children":1034},{},[1035],{"type":26,"value":1036},"While my Fennel Hammerspoon configuration now works with parity to its Lua counterpart,\nI have not yet added new features or modules. I look forward to writing new Fennel code,\nand deepen my understanding of Lisp and the Fennel programming language.",{"type":21,"tag":22,"props":1038,"children":1039},{},[1040,1042,1049],{"type":26,"value":1041},"Additionally, before beginning this endeavor, I was already aware of projects like\n",{"type":21,"tag":39,"props":1043,"children":1046},{"href":1044,"rel":1045},"https://github.com/agzam/spacehammer",[43],[1047],{"type":26,"value":1048},"spacehammer",{"type":26,"value":1050},"; a wildly impressive Hammerspoon configuration written in Fennel, but,\nI wanted to start small and learn the integration myself. However, with the basics out\nof the way, I hope to explore this project further, and seek lessons-learned for the\nconfiguration of my own.",{"type":21,"tag":22,"props":1052,"children":1053},{},[1054,1056],{"type":26,"value":1055},"The full pull-request for translating my Lua Hammerspoon configuration to Fennel can be\nfound here: ",{"type":21,"tag":39,"props":1057,"children":1060},{"href":1058,"rel":1059},"https://github.com/cmpadden/dotfiles/pull/19/files",[43],[1061],{"type":26,"value":1058},{"type":21,"tag":1063,"props":1064,"children":1065},"style",{},[1066],{"type":26,"value":1067},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":223,"depth":223,"links":1069},[1070,1071,1072,1073],{"id":70,"depth":223,"text":73},{"id":90,"depth":223,"text":93},{"id":424,"depth":223,"text":427},{"id":1028,"depth":223,"text":1031},"markdown","content:articles:fennel-initial-exploration.md","content","articles/fennel-initial-exploration.md","md",1718681824660] \ No newline at end of file diff --git a/articles/fennel-initial-exploration/index.html b/articles/fennel-initial-exploration/index.html index 13592836..f69d926e 100644 --- a/articles/fennel-initial-exploration/index.html +++ b/articles/fennel-initial-exploration/index.html @@ -4,35 +4,35 @@ - - + + - - - - + + + + - + - - - - - - - - - - - - - - - - -

        Impressions of Fennel with Hammerspoon

        2023-10-22

        A while back I read an introductory book on Lisp programming titled, "The Little + + + + + + + + + + + + + + + + +

        Impressions of Fennel with Hammerspoon

        2023-10-22

        A while back I read an introductory book on Lisp programming titled, "The Little Schemer". This book opened my mind to new (to me) programming paradigms, and left me with a strong desire to find a way to incorporate Lisp programming into my every day life. It took some time, but I believe I've found what I've been looking for: Fennel.

        The Fennel programming language is a dialect of Lisp that boasts compatibility with @@ -90,5 +90,5 @@ I wanted to start small and learn the integration myself. However, with the basics out of the way, I hope to explore this project further, and seek lessons-learned for the configuration of my own.

        The full pull-request for translating my Lua Hammerspoon configuration to Fennel can be -found here: https://github.com/cmpadden/dotfiles/pull/19/files

        - \ No newline at end of file +found here: https://github.com/cmpadden/dotfiles/pull/19/files

        + \ No newline at end of file diff --git a/articles/index.html b/articles/index.html index d9df47f2..401f8df9 100644 --- a/articles/index.html +++ b/articles/index.html @@ -4,25 +4,25 @@ - - - - - - + + + + + + - + - - - - - - - - - -

        YubiKey's are a convenient way to introduce a physical form of two factor authentication into ones workflow. They support a variety of protocols, but in this guide we will walk through how to configure a YubiKey for use with OpenSSH via the "new" ed25519-sk key type that supports FIDO compliant hardware keys.

        unix
        configurations

        In order to sign git commits from within Vim using a plugin like tpope/vim-fugitive, it is necessary to configure the gpg-agent to use a GUI based pinentry-program.

        vim
        tip

        If you've ever had the need to transcribe a podcast, lecture, or some other audio recording, it turns out it's surprisingly easy with the extremely impressive whisper.cpp project. This high-performance fork of OpenAI's Whisper can run on all sorts of hardware -- including my M1 Mac Mini. Let's walk through an example from start-to-finish of transcribing an episode of the Alter Everything podcast.

        whisper.cpp
        ml

        If you are a user of Nuxt Content and you wish to configure an RSS feed for your website, it's a surprisingly straight forward process! In this article, we will walk through the code changes required to host an RSS feed for both a statically generated, and Universal Nuxt application.

        nuxt
        rss

        A while back I read an introductory book on Lisp programming titled, "The Little + + + + + + + + + +

        YubiKey's are a convenient way to introduce a physical form of two factor authentication into ones workflow. They support a variety of protocols, but in this guide we will walk through how to configure a YubiKey for use with OpenSSH via the "new" ed25519-sk key type that supports FIDO compliant hardware keys.

        unix
        configurations

        In order to sign git commits from within Vim using a plugin like tpope/vim-fugitive, it is necessary to configure the gpg-agent to use a GUI based pinentry-program.

        vim
        tip

        If you've ever had the need to transcribe a podcast, lecture, or some other audio recording, it turns out it's surprisingly easy with the extremely impressive whisper.cpp project. This high-performance fork of OpenAI's Whisper can run on all sorts of hardware -- including my M1 Mac Mini. Let's walk through an example from start-to-finish of transcribing an episode of the Alter Everything podcast.

        whisper.cpp
        ml

        If you are a user of Nuxt Content and you wish to configure an RSS feed for your website, it's a surprisingly straight forward process! In this article, we will walk through the code changes required to host an RSS feed for both a statically generated, and Universal Nuxt application.

        nuxt
        rss

        A while back I read an introductory book on Lisp programming titled, "The Little Schemer". This book opened my mind to new (to me) programming paradigms, and left me with a strong desire to find a way to incorporate Lisp programming into my every day life. It took some time, but I believe I've found what I've been looking for: Fennel.

        lisp
        hammerspoon
        fennel

        I recently had the need to spool up a small ephemeral Linux instance, and wanted to try something new by exploring the Digital Ocean doctl command line utility. @@ -43,5 +43,5 @@ few years, and have recently decided to dust it off.

        Since the last time the device has been powered on, there have been many great improvements to the firmware, and it was very-much due for an upgrade. The following steps outline how the firmware was upgraded on the APU from the -already-installed operating system -- CentOS.

        pcengine
        apu

        Tags

        apu
        archlinux
        bash
        configurations
        digital-ocean
        docker
        fennel
        hammerspoon
        homelab
        linux
        lisp
        micropython
        ml
        mocks
        nuxt
        pcengine
        rss
        selinux
        supermicro
        testing
        tip
        truenas
        tutorial
        unix
        vagrant
        vim
        whisper.cpp
        - \ No newline at end of file +already-installed operating system -- CentOS.

        pcengine
        apu

        Tags

        apu
        archlinux
        bash
        configurations
        digital-ocean
        docker
        fennel
        hammerspoon
        homelab
        linux
        lisp
        micropython
        ml
        mocks
        nuxt
        pcengine
        rss
        selinux
        supermicro
        testing
        tip
        truenas
        tutorial
        unix
        vagrant
        vim
        whisper.cpp
        + \ No newline at end of file diff --git a/articles/migrate-truenas-from-core-to-scale/_payload.json b/articles/migrate-truenas-from-core-to-scale/_payload.json index 2287d9b7..f8599d4c 100644 --- a/articles/migrate-truenas-from-core-to-scale/_payload.json +++ b/articles/migrate-truenas-from-core-to-scale/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":204},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"tags":11,"categories":15,"excerpt":16,"body":26,"_type":199,"_id":200,"_source":201,"_file":202,"_extension":203},"/articles/migrate-truenas-from-core-to-scale","articles",false,"","Migrate to TrueNAS Scale from TrueNAS Core","TrueNAS Scale offers a variety of interesting features that are not supported in its TrueNAS Core counterpart. Most notably, because the base operating system is Debian Linux, opposed to FreeBSD, there is native support for Linux containers via Docker, and Kubernetes Pods! This post walks through the steps required to upgrade from TrueNAS Core to TrueNAS Scale.","2021-12-28",[12,13,14],"homelab","supermicro","truenas",[12],{"type":17,"children":18},"root",[19],{"type":20,"tag":21,"props":22,"children":23},"element","p",{},[24],{"type":25,"value":9},"text",{"type":17,"children":27,"toc":196},[28,32,45,175,180],{"type":20,"tag":21,"props":29,"children":30},{},[31],{"type":25,"value":9},{"type":20,"tag":21,"props":33,"children":34},{},[35,37,43],{"type":25,"value":36},"Thankfully, the upgrade procedure to migrate from TrueNAS Core to TrueNAS Scale is relatively straight forward. All it requires is to create a bootable USB of the TrueNAS Scale image, boot the USB, and select ",{"type":20,"tag":38,"props":39,"children":40},"em",{},[41],{"type":25,"value":42},"Install/Upgrade",{"type":25,"value":44}," in the installation wizard. But for the sake of being thorough, you can find instructions on how to backup system configurations and install the OS below.",{"type":20,"tag":46,"props":47,"children":48},"ol",{},[49,96,125,130,154,159],{"type":20,"tag":50,"props":51,"children":52},"li",{},[53,55],{"type":25,"value":54},"Make a backup of your system’s configuration\n",{"type":20,"tag":46,"props":56,"children":57},{},[58,70],{"type":20,"tag":50,"props":59,"children":60},{},[61,63],{"type":25,"value":62},"Navigate to ",{"type":20,"tag":64,"props":65,"children":67},"code",{"className":66},[],[68],{"type":25,"value":69},"System > General",{"type":20,"tag":50,"props":71,"children":72},{},[73,75,81,83,88,90],{"type":25,"value":74},"Click ",{"type":20,"tag":64,"props":76,"children":78},{"className":77},[],[79],{"type":25,"value":80},"Save Config",{"type":25,"value":82},", check the ",{"type":20,"tag":38,"props":84,"children":85},{},[86],{"type":25,"value":87},"Export Secret Seed",{"type":25,"value":89}," box, and click ",{"type":20,"tag":64,"props":91,"children":93},{"className":92},[],[94],{"type":25,"value":95},"Save",{"type":20,"tag":50,"props":97,"children":98},{},[99,101],{"type":25,"value":100},"Export dataset keys for the encrypted pools\n",{"type":20,"tag":46,"props":102,"children":103},{},[104,114],{"type":20,"tag":50,"props":105,"children":106},{},[107,108],{"type":25,"value":62},{"type":20,"tag":64,"props":109,"children":111},{"className":110},[],[112],{"type":25,"value":113},"Storage > Pools",{"type":20,"tag":50,"props":115,"children":116},{},[117,119],{"type":25,"value":118},"Click the cog icon, and select ",{"type":20,"tag":64,"props":120,"children":122},{"className":121},[],[123],{"type":25,"value":124},"Export Dataset Keys",{"type":20,"tag":50,"props":126,"children":127},{},[128],{"type":25,"value":129},"Insert the TrueNAS Core bootable USB into the NAS",{"type":20,"tag":50,"props":131,"children":132},{},[133,135,140,142,147,149],{"type":25,"value":134},"From the Supermicro IPMI interface select ",{"type":20,"tag":38,"props":136,"children":137},{},[138],{"type":25,"value":139},"Remote Control",{"type":25,"value":141}," and ",{"type":20,"tag":38,"props":143,"children":144},{},[145],{"type":25,"value":146},"iKVM/HTML5",{"type":25,"value":148}," and select ",{"type":20,"tag":38,"props":150,"children":151},{},[152],{"type":25,"value":153},"Reboot",{"type":20,"tag":50,"props":155,"children":156},{},[157],{"type":25,"value":158},"Select the bootable USB as the boot device",{"type":20,"tag":50,"props":160,"children":161},{},[162,164,168,170],{"type":25,"value":163},"From the TrueNAS installation wizard, select ",{"type":20,"tag":38,"props":165,"children":166},{},[167],{"type":25,"value":42},{"type":25,"value":169},", select the drive that contains the TrueNAS installation, and select ",{"type":20,"tag":38,"props":171,"children":172},{},[173],{"type":25,"value":174},"Upgrade Install",{"type":20,"tag":21,"props":176,"children":177},{},[178],{"type":25,"value":179},"Reboot the device, and voila — you should be up-and-running! Give the system a quick rundown to validate that your settings and pools have transferred correctly, and then enjoy all the container goodness!",{"type":20,"tag":21,"props":181,"children":182},{},[183,185,194],{"type":25,"value":184},"For a breakdown of the differences between TrueNAS Core, Enterprise, and Scale, you can reference ",{"type":20,"tag":186,"props":187,"children":191},"a",{"href":188,"rel":189},"https://www.truenas.com/help-me-choose/",[190],"nofollow",[192],{"type":25,"value":193},"this table",{"type":25,"value":195},".",{"title":7,"searchDepth":197,"depth":197,"links":198},2,[],"markdown","content:articles:migrate-truenas-from-core-to-scale.md","content","articles/migrate-truenas-from-core-to-scale.md","md",1718428848853] \ No newline at end of file +[{"data":1,"prerenderedAt":204},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"tags":11,"categories":15,"excerpt":16,"body":26,"_type":199,"_id":200,"_source":201,"_file":202,"_extension":203},"/articles/migrate-truenas-from-core-to-scale","articles",false,"","Migrate to TrueNAS Scale from TrueNAS Core","TrueNAS Scale offers a variety of interesting features that are not supported in its TrueNAS Core counterpart. Most notably, because the base operating system is Debian Linux, opposed to FreeBSD, there is native support for Linux containers via Docker, and Kubernetes Pods! This post walks through the steps required to upgrade from TrueNAS Core to TrueNAS Scale.","2021-12-28",[12,13,14],"homelab","supermicro","truenas",[12],{"type":17,"children":18},"root",[19],{"type":20,"tag":21,"props":22,"children":23},"element","p",{},[24],{"type":25,"value":9},"text",{"type":17,"children":27,"toc":196},[28,32,45,175,180],{"type":20,"tag":21,"props":29,"children":30},{},[31],{"type":25,"value":9},{"type":20,"tag":21,"props":33,"children":34},{},[35,37,43],{"type":25,"value":36},"Thankfully, the upgrade procedure to migrate from TrueNAS Core to TrueNAS Scale is relatively straight forward. All it requires is to create a bootable USB of the TrueNAS Scale image, boot the USB, and select ",{"type":20,"tag":38,"props":39,"children":40},"em",{},[41],{"type":25,"value":42},"Install/Upgrade",{"type":25,"value":44}," in the installation wizard. But for the sake of being thorough, you can find instructions on how to backup system configurations and install the OS below.",{"type":20,"tag":46,"props":47,"children":48},"ol",{},[49,96,125,130,154,159],{"type":20,"tag":50,"props":51,"children":52},"li",{},[53,55],{"type":25,"value":54},"Make a backup of your system’s configuration\n",{"type":20,"tag":46,"props":56,"children":57},{},[58,70],{"type":20,"tag":50,"props":59,"children":60},{},[61,63],{"type":25,"value":62},"Navigate to ",{"type":20,"tag":64,"props":65,"children":67},"code",{"className":66},[],[68],{"type":25,"value":69},"System > General",{"type":20,"tag":50,"props":71,"children":72},{},[73,75,81,83,88,90],{"type":25,"value":74},"Click ",{"type":20,"tag":64,"props":76,"children":78},{"className":77},[],[79],{"type":25,"value":80},"Save Config",{"type":25,"value":82},", check the ",{"type":20,"tag":38,"props":84,"children":85},{},[86],{"type":25,"value":87},"Export Secret Seed",{"type":25,"value":89}," box, and click ",{"type":20,"tag":64,"props":91,"children":93},{"className":92},[],[94],{"type":25,"value":95},"Save",{"type":20,"tag":50,"props":97,"children":98},{},[99,101],{"type":25,"value":100},"Export dataset keys for the encrypted pools\n",{"type":20,"tag":46,"props":102,"children":103},{},[104,114],{"type":20,"tag":50,"props":105,"children":106},{},[107,108],{"type":25,"value":62},{"type":20,"tag":64,"props":109,"children":111},{"className":110},[],[112],{"type":25,"value":113},"Storage > Pools",{"type":20,"tag":50,"props":115,"children":116},{},[117,119],{"type":25,"value":118},"Click the cog icon, and select ",{"type":20,"tag":64,"props":120,"children":122},{"className":121},[],[123],{"type":25,"value":124},"Export Dataset Keys",{"type":20,"tag":50,"props":126,"children":127},{},[128],{"type":25,"value":129},"Insert the TrueNAS Core bootable USB into the NAS",{"type":20,"tag":50,"props":131,"children":132},{},[133,135,140,142,147,149],{"type":25,"value":134},"From the Supermicro IPMI interface select ",{"type":20,"tag":38,"props":136,"children":137},{},[138],{"type":25,"value":139},"Remote Control",{"type":25,"value":141}," and ",{"type":20,"tag":38,"props":143,"children":144},{},[145],{"type":25,"value":146},"iKVM/HTML5",{"type":25,"value":148}," and select ",{"type":20,"tag":38,"props":150,"children":151},{},[152],{"type":25,"value":153},"Reboot",{"type":20,"tag":50,"props":155,"children":156},{},[157],{"type":25,"value":158},"Select the bootable USB as the boot device",{"type":20,"tag":50,"props":160,"children":161},{},[162,164,168,170],{"type":25,"value":163},"From the TrueNAS installation wizard, select ",{"type":20,"tag":38,"props":165,"children":166},{},[167],{"type":25,"value":42},{"type":25,"value":169},", select the drive that contains the TrueNAS installation, and select ",{"type":20,"tag":38,"props":171,"children":172},{},[173],{"type":25,"value":174},"Upgrade Install",{"type":20,"tag":21,"props":176,"children":177},{},[178],{"type":25,"value":179},"Reboot the device, and voila — you should be up-and-running! Give the system a quick rundown to validate that your settings and pools have transferred correctly, and then enjoy all the container goodness!",{"type":20,"tag":21,"props":181,"children":182},{},[183,185,194],{"type":25,"value":184},"For a breakdown of the differences between TrueNAS Core, Enterprise, and Scale, you can reference ",{"type":20,"tag":186,"props":187,"children":191},"a",{"href":188,"rel":189},"https://www.truenas.com/help-me-choose/",[190],"nofollow",[192],{"type":25,"value":193},"this table",{"type":25,"value":195},".",{"title":7,"searchDepth":197,"depth":197,"links":198},2,[],"markdown","content:articles:migrate-truenas-from-core-to-scale.md","content","articles/migrate-truenas-from-core-to-scale.md","md",1718681824673] \ No newline at end of file diff --git a/articles/migrate-truenas-from-core-to-scale/index.html b/articles/migrate-truenas-from-core-to-scale/index.html index ded394b2..cec25114 100644 --- a/articles/migrate-truenas-from-core-to-scale/index.html +++ b/articles/migrate-truenas-from-core-to-scale/index.html @@ -4,29 +4,29 @@ - - + + - - - - + + + + - + - - - - - - - - - - - - -

        Migrate to TrueNAS Scale from TrueNAS Core

        2021-12-28

        TrueNAS Scale offers a variety of interesting features that are not supported in its TrueNAS Core counterpart. Most notably, because the base operating system is Debian Linux, opposed to FreeBSD, there is native support for Linux containers via Docker, and Kubernetes Pods! This post walks through the steps required to upgrade from TrueNAS Core to TrueNAS Scale.

        Thankfully, the upgrade procedure to migrate from TrueNAS Core to TrueNAS Scale is relatively straight forward. All it requires is to create a bootable USB of the TrueNAS Scale image, boot the USB, and select Install/Upgrade in the installation wizard. But for the sake of being thorough, you can find instructions on how to backup system configurations and install the OS below.

        1. Make a backup of your system’s configuration + + + + + + + + + + + + +

          Migrate to TrueNAS Scale from TrueNAS Core

          2021-12-28

          TrueNAS Scale offers a variety of interesting features that are not supported in its TrueNAS Core counterpart. Most notably, because the base operating system is Debian Linux, opposed to FreeBSD, there is native support for Linux containers via Docker, and Kubernetes Pods! This post walks through the steps required to upgrade from TrueNAS Core to TrueNAS Scale.

          Thankfully, the upgrade procedure to migrate from TrueNAS Core to TrueNAS Scale is relatively straight forward. All it requires is to create a bootable USB of the TrueNAS Scale image, boot the USB, and select Install/Upgrade in the installation wizard. But for the sake of being thorough, you can find instructions on how to backup system configurations and install the OS below.

          1. Make a backup of your system’s configuration
            1. Navigate to System > General
            2. Click Save Config, check the Export Secret Seed box, and click Save
          2. Export dataset keys for the encrypted pools -
            1. Navigate to Storage > Pools
            2. Click the cog icon, and select Export Dataset Keys
          3. Insert the TrueNAS Core bootable USB into the NAS
          4. From the Supermicro IPMI interface select Remote Control and iKVM/HTML5 and select Reboot
          5. Select the bootable USB as the boot device
          6. From the TrueNAS installation wizard, select Install/Upgrade, select the drive that contains the TrueNAS installation, and select Upgrade Install

          Reboot the device, and voila — you should be up-and-running! Give the system a quick rundown to validate that your settings and pools have transferred correctly, and then enjoy all the container goodness!

          For a breakdown of the differences between TrueNAS Core, Enterprise, and Scale, you can reference this table.

          - \ No newline at end of file +
          1. Navigate to Storage > Pools
          2. Click the cog icon, and select Export Dataset Keys
        2. Insert the TrueNAS Core bootable USB into the NAS
        3. From the Supermicro IPMI interface select Remote Control and iKVM/HTML5 and select Reboot
        4. Select the bootable USB as the boot device
        5. From the TrueNAS installation wizard, select Install/Upgrade, select the drive that contains the TrueNAS installation, and select Upgrade Install

        Reboot the device, and voila — you should be up-and-running! Give the system a quick rundown to validate that your settings and pools have transferred correctly, and then enjoy all the container goodness!

        For a breakdown of the differences between TrueNAS Core, Enterprise, and Scale, you can reference this table.

        + \ No newline at end of file diff --git a/articles/nuxt-content-rss-feed/_payload.json b/articles/nuxt-content-rss-feed/_payload.json index deed4c2e..54f8d68a 100644 --- a/articles/nuxt-content-rss-feed/_payload.json +++ b/articles/nuxt-content-rss-feed/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":1791},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"draft":6,"date":10,"tags":11,"categories":14,"cover_image":16,"excerpt":17,"body":39,"_type":1786,"_id":1787,"_source":1788,"_file":1789,"_extension":1790},"/articles/nuxt-content-rss-feed","articles",false,"","How To Add an RSS Feed to a Nuxt Website","If you are a user of Nuxt Content and you wish to configure an RSS feed for your website, it's a surprisingly straight forward process! In this article, we will walk through the code changes required to host an RSS feed for both a statically generated, and Universal Nuxt application.","2024-01-06",[12,13],"nuxt","rss",[15],"programming","/images/nuxt-content-rss-feed.jpg",{"type":18,"children":19},"root",[20],{"type":21,"tag":22,"props":23,"children":24},"element","p",{},[25,28,37],{"type":26,"value":27},"text","If you are a user of ",{"type":21,"tag":29,"props":30,"children":34},"a",{"href":31,"rel":32},"https://content.nuxt.com/",[33],"nofollow",[35],{"type":26,"value":36},"Nuxt Content",{"type":26,"value":38}," and you wish to configure an RSS feed for your website, it's a surprisingly straight forward process! In this article, we will walk through the code changes required to host an RSS feed for both a statically generated, and Universal Nuxt application.",{"type":18,"children":40,"toc":1781},[41,51,58,81,87,101,141,162,197,1139,1176,1246,1252,1265,1270,1297,1309,1685,1703,1775],{"type":21,"tag":22,"props":42,"children":43},{},[44,45,50],{"type":26,"value":27},{"type":21,"tag":29,"props":46,"children":48},{"href":31,"rel":47},[33],[49],{"type":26,"value":36},{"type":26,"value":38},{"type":21,"tag":52,"props":53,"children":55},"h2",{"id":54},"preface",[56],{"type":26,"value":57},"Preface",{"type":21,"tag":22,"props":59,"children":60},{},[61,63,70,72,79],{"type":26,"value":62},"In version 2 of Nuxt, the community module, ",{"type":21,"tag":29,"props":64,"children":67},{"href":65,"rel":66},"https://github.com/nuxt-community/feed-module",[33],[68],{"type":26,"value":69},"nuxt-community/feed-module",{"type":26,"value":71}," was a popular choice for adding an RSS feed to your website. However, there has been an unresolved ",{"type":21,"tag":29,"props":73,"children":76},{"href":74,"rel":75},"https://github.com/nuxt-community/feed-module/issues/106",[33],[77],{"type":26,"value":78},"open issue",{"type":26,"value":80}," since April 1st, 2022 to add support for Nuxt v3. Thankfully, implementing this feature without a module is relatively straight forward.",{"type":21,"tag":52,"props":82,"children":84},{"id":83},"instructions",[85],{"type":26,"value":86},"Instructions",{"type":21,"tag":22,"props":88,"children":89},{},[90,92,99],{"type":26,"value":91},"First, install the ",{"type":21,"tag":29,"props":93,"children":96},{"href":94,"rel":95},"https://www.npmjs.com/package/feed",[33],[97],{"type":26,"value":98},"feed",{"type":26,"value":100}," library into your project:",{"type":21,"tag":102,"props":103,"children":107},"pre",{"className":104,"code":105,"language":106,"meta":7,"style":7},"language-shell shiki shiki-themes github-light","npm i -D feed\n","shell",[108],{"type":21,"tag":109,"props":110,"children":111},"code",{"__ignoreMap":7},[112],{"type":21,"tag":113,"props":114,"children":117},"span",{"class":115,"line":116},"line",1,[118,124,130,136],{"type":21,"tag":113,"props":119,"children":121},{"style":120},"--shiki-default:#6F42C1",[122],{"type":26,"value":123},"npm",{"type":21,"tag":113,"props":125,"children":127},{"style":126},"--shiki-default:#032F62",[128],{"type":26,"value":129}," i",{"type":21,"tag":113,"props":131,"children":133},{"style":132},"--shiki-default:#005CC5",[134],{"type":26,"value":135}," -D",{"type":21,"tag":113,"props":137,"children":138},{"style":126},[139],{"type":26,"value":140}," feed\n",{"type":21,"tag":22,"props":142,"children":143},{},[144,146,152,154,160],{"type":26,"value":145},"Then, create a ",{"type":21,"tag":109,"props":147,"children":149},{"className":148},[],[150],{"type":26,"value":151},"server/",{"type":26,"value":153}," folder in your project if it does not already exist, and create a file named ",{"type":21,"tag":109,"props":155,"children":157},{"className":156},[],[158],{"type":26,"value":159},"server/routes/atom.ts",{"type":26,"value":161},".",{"type":21,"tag":22,"props":163,"children":164},{},[165,167,172,174,179,181,187,189,195],{"type":26,"value":166},"Here, we will leverage the ",{"type":21,"tag":109,"props":168,"children":170},{"className":169},[],[171],{"type":26,"value":98},{"type":26,"value":173}," library and construct an XML representation of our Nuxt content. As you can see, we first define our ",{"type":21,"tag":109,"props":175,"children":177},{"className":176},[],[178],{"type":26,"value":98},{"type":26,"value":180}," with metadata associated with our RSS feed. This will be used by RSS readers to provide context to the end user. Then, we query our Nuxt content with ",{"type":21,"tag":109,"props":182,"children":184},{"className":183},[],[185],{"type":26,"value":186},"serverQueryContent",{"type":26,"value":188}," and append a ",{"type":21,"tag":109,"props":190,"children":192},{"className":191},[],[193],{"type":26,"value":194},"feed.addItem",{"type":26,"value":196}," for each article.",{"type":21,"tag":102,"props":198,"children":202},{"className":199,"code":200,"language":201,"meta":7,"style":7},"language-ts shiki shiki-themes github-light","import { serverQueryContent } from '#content/server';\nimport { Feed } from 'feed';\n\nconst BASE_URL = \"https://mywebsite.com\"\nconst AUTHOR_NAME = \"Firstname Lastname\"\n\nexport default defineEventHandler(async (event) => {\n\n const feed = new Feed({\n title: \"My Title\",\n description: \"My Description\",\n id: BASE_URL,\n link: BASE_URL,\n language: \"en\",\n image: `${BASE_URL}/images/placeholder.png`,\n favicon: `${BASE_URL}/favicon.ico`,\n copyright: `All rights reserved ${new Date().getFullYear()}, ${AUTHOR_NAME}`,\n updated: new Date(),\n generator: \"Nuxt static site generation + Feed for Node.js\",\n feedLinks: {\n atom: `${BASE_URL}/atom`\n },\n author: {\n name: AUTHOR_NAME,\n }\n });\n\n const articles = await serverQueryContent(event).find();\n\n articles.forEach((article) => {\n feed.addItem({\n title: article.title ? article.title : \"Missing Title\",\n id: article._path,\n link: `${BASE_URL}${article._path}`,\n description: article.description,\n author: [\n {\n name: AUTHOR_NAME,\n },\n ],\n date: new Date(article.date),\n image: article.cover_image ? `${BASE_URL}/${article.cover_image}` : undefined\n });\n });\n\n return feed.atom1();\n});\n","ts",[203],{"type":21,"tag":109,"props":204,"children":205},{"__ignoreMap":7},[206,236,262,272,296,318,326,381,389,422,441,459,477,494,512,539,565,623,645,663,672,694,703,712,729,738,747,755,797,805,841,859,892,901,944,953,962,971,988,997,1006,1028,1082,1091,1099,1107,1130],{"type":21,"tag":113,"props":207,"children":208},{"class":115,"line":116},[209,215,221,226,231],{"type":21,"tag":113,"props":210,"children":212},{"style":211},"--shiki-default:#D73A49",[213],{"type":26,"value":214},"import",{"type":21,"tag":113,"props":216,"children":218},{"style":217},"--shiki-default:#24292E",[219],{"type":26,"value":220}," { serverQueryContent } ",{"type":21,"tag":113,"props":222,"children":223},{"style":211},[224],{"type":26,"value":225},"from",{"type":21,"tag":113,"props":227,"children":228},{"style":126},[229],{"type":26,"value":230}," '#content/server'",{"type":21,"tag":113,"props":232,"children":233},{"style":217},[234],{"type":26,"value":235},";\n",{"type":21,"tag":113,"props":237,"children":239},{"class":115,"line":238},2,[240,244,249,253,258],{"type":21,"tag":113,"props":241,"children":242},{"style":211},[243],{"type":26,"value":214},{"type":21,"tag":113,"props":245,"children":246},{"style":217},[247],{"type":26,"value":248}," { Feed } ",{"type":21,"tag":113,"props":250,"children":251},{"style":211},[252],{"type":26,"value":225},{"type":21,"tag":113,"props":254,"children":255},{"style":126},[256],{"type":26,"value":257}," 'feed'",{"type":21,"tag":113,"props":259,"children":260},{"style":217},[261],{"type":26,"value":235},{"type":21,"tag":113,"props":263,"children":265},{"class":115,"line":264},3,[266],{"type":21,"tag":113,"props":267,"children":269},{"emptyLinePlaceholder":268},true,[270],{"type":26,"value":271},"\n",{"type":21,"tag":113,"props":273,"children":275},{"class":115,"line":274},4,[276,281,286,291],{"type":21,"tag":113,"props":277,"children":278},{"style":211},[279],{"type":26,"value":280},"const",{"type":21,"tag":113,"props":282,"children":283},{"style":132},[284],{"type":26,"value":285}," BASE_URL",{"type":21,"tag":113,"props":287,"children":288},{"style":211},[289],{"type":26,"value":290}," =",{"type":21,"tag":113,"props":292,"children":293},{"style":126},[294],{"type":26,"value":295}," \"https://mywebsite.com\"\n",{"type":21,"tag":113,"props":297,"children":299},{"class":115,"line":298},5,[300,304,309,313],{"type":21,"tag":113,"props":301,"children":302},{"style":211},[303],{"type":26,"value":280},{"type":21,"tag":113,"props":305,"children":306},{"style":132},[307],{"type":26,"value":308}," AUTHOR_NAME",{"type":21,"tag":113,"props":310,"children":311},{"style":211},[312],{"type":26,"value":290},{"type":21,"tag":113,"props":314,"children":315},{"style":126},[316],{"type":26,"value":317}," \"Firstname Lastname\"\n",{"type":21,"tag":113,"props":319,"children":321},{"class":115,"line":320},6,[322],{"type":21,"tag":113,"props":323,"children":324},{"emptyLinePlaceholder":268},[325],{"type":26,"value":271},{"type":21,"tag":113,"props":327,"children":329},{"class":115,"line":328},7,[330,335,340,345,350,355,360,366,371,376],{"type":21,"tag":113,"props":331,"children":332},{"style":211},[333],{"type":26,"value":334},"export",{"type":21,"tag":113,"props":336,"children":337},{"style":211},[338],{"type":26,"value":339}," default",{"type":21,"tag":113,"props":341,"children":342},{"style":120},[343],{"type":26,"value":344}," defineEventHandler",{"type":21,"tag":113,"props":346,"children":347},{"style":217},[348],{"type":26,"value":349},"(",{"type":21,"tag":113,"props":351,"children":352},{"style":211},[353],{"type":26,"value":354},"async",{"type":21,"tag":113,"props":356,"children":357},{"style":217},[358],{"type":26,"value":359}," (",{"type":21,"tag":113,"props":361,"children":363},{"style":362},"--shiki-default:#E36209",[364],{"type":26,"value":365},"event",{"type":21,"tag":113,"props":367,"children":368},{"style":217},[369],{"type":26,"value":370},") ",{"type":21,"tag":113,"props":372,"children":373},{"style":211},[374],{"type":26,"value":375},"=>",{"type":21,"tag":113,"props":377,"children":378},{"style":217},[379],{"type":26,"value":380}," {\n",{"type":21,"tag":113,"props":382,"children":384},{"class":115,"line":383},8,[385],{"type":21,"tag":113,"props":386,"children":387},{"emptyLinePlaceholder":268},[388],{"type":26,"value":271},{"type":21,"tag":113,"props":390,"children":392},{"class":115,"line":391},9,[393,398,403,407,412,417],{"type":21,"tag":113,"props":394,"children":395},{"style":211},[396],{"type":26,"value":397}," const",{"type":21,"tag":113,"props":399,"children":400},{"style":132},[401],{"type":26,"value":402}," feed",{"type":21,"tag":113,"props":404,"children":405},{"style":211},[406],{"type":26,"value":290},{"type":21,"tag":113,"props":408,"children":409},{"style":211},[410],{"type":26,"value":411}," new",{"type":21,"tag":113,"props":413,"children":414},{"style":120},[415],{"type":26,"value":416}," Feed",{"type":21,"tag":113,"props":418,"children":419},{"style":217},[420],{"type":26,"value":421},"({\n",{"type":21,"tag":113,"props":423,"children":425},{"class":115,"line":424},10,[426,431,436],{"type":21,"tag":113,"props":427,"children":428},{"style":217},[429],{"type":26,"value":430}," title: ",{"type":21,"tag":113,"props":432,"children":433},{"style":126},[434],{"type":26,"value":435},"\"My Title\"",{"type":21,"tag":113,"props":437,"children":438},{"style":217},[439],{"type":26,"value":440},",\n",{"type":21,"tag":113,"props":442,"children":444},{"class":115,"line":443},11,[445,450,455],{"type":21,"tag":113,"props":446,"children":447},{"style":217},[448],{"type":26,"value":449}," description: ",{"type":21,"tag":113,"props":451,"children":452},{"style":126},[453],{"type":26,"value":454},"\"My Description\"",{"type":21,"tag":113,"props":456,"children":457},{"style":217},[458],{"type":26,"value":440},{"type":21,"tag":113,"props":460,"children":462},{"class":115,"line":461},12,[463,468,473],{"type":21,"tag":113,"props":464,"children":465},{"style":217},[466],{"type":26,"value":467}," id: ",{"type":21,"tag":113,"props":469,"children":470},{"style":132},[471],{"type":26,"value":472},"BASE_URL",{"type":21,"tag":113,"props":474,"children":475},{"style":217},[476],{"type":26,"value":440},{"type":21,"tag":113,"props":478,"children":480},{"class":115,"line":479},13,[481,486,490],{"type":21,"tag":113,"props":482,"children":483},{"style":217},[484],{"type":26,"value":485}," link: ",{"type":21,"tag":113,"props":487,"children":488},{"style":132},[489],{"type":26,"value":472},{"type":21,"tag":113,"props":491,"children":492},{"style":217},[493],{"type":26,"value":440},{"type":21,"tag":113,"props":495,"children":497},{"class":115,"line":496},14,[498,503,508],{"type":21,"tag":113,"props":499,"children":500},{"style":217},[501],{"type":26,"value":502}," language: ",{"type":21,"tag":113,"props":504,"children":505},{"style":126},[506],{"type":26,"value":507},"\"en\"",{"type":21,"tag":113,"props":509,"children":510},{"style":217},[511],{"type":26,"value":440},{"type":21,"tag":113,"props":513,"children":515},{"class":115,"line":514},15,[516,521,526,530,535],{"type":21,"tag":113,"props":517,"children":518},{"style":217},[519],{"type":26,"value":520}," image: ",{"type":21,"tag":113,"props":522,"children":523},{"style":126},[524],{"type":26,"value":525},"`${",{"type":21,"tag":113,"props":527,"children":528},{"style":132},[529],{"type":26,"value":472},{"type":21,"tag":113,"props":531,"children":532},{"style":126},[533],{"type":26,"value":534},"}/images/placeholder.png`",{"type":21,"tag":113,"props":536,"children":537},{"style":217},[538],{"type":26,"value":440},{"type":21,"tag":113,"props":540,"children":542},{"class":115,"line":541},16,[543,548,552,556,561],{"type":21,"tag":113,"props":544,"children":545},{"style":217},[546],{"type":26,"value":547}," favicon: ",{"type":21,"tag":113,"props":549,"children":550},{"style":126},[551],{"type":26,"value":525},{"type":21,"tag":113,"props":553,"children":554},{"style":132},[555],{"type":26,"value":472},{"type":21,"tag":113,"props":557,"children":558},{"style":126},[559],{"type":26,"value":560},"}/favicon.ico`",{"type":21,"tag":113,"props":562,"children":563},{"style":217},[564],{"type":26,"value":440},{"type":21,"tag":113,"props":566,"children":568},{"class":115,"line":567},17,[569,574,579,584,589,594,599,604,609,614,619],{"type":21,"tag":113,"props":570,"children":571},{"style":217},[572],{"type":26,"value":573}," copyright: ",{"type":21,"tag":113,"props":575,"children":576},{"style":126},[577],{"type":26,"value":578},"`All rights reserved ${",{"type":21,"tag":113,"props":580,"children":581},{"style":211},[582],{"type":26,"value":583},"new",{"type":21,"tag":113,"props":585,"children":586},{"style":120},[587],{"type":26,"value":588}," Date",{"type":21,"tag":113,"props":590,"children":591},{"style":126},[592],{"type":26,"value":593},"().",{"type":21,"tag":113,"props":595,"children":596},{"style":120},[597],{"type":26,"value":598},"getFullYear",{"type":21,"tag":113,"props":600,"children":601},{"style":126},[602],{"type":26,"value":603},"()",{"type":21,"tag":113,"props":605,"children":606},{"style":126},[607],{"type":26,"value":608},"}, ${",{"type":21,"tag":113,"props":610,"children":611},{"style":132},[612],{"type":26,"value":613},"AUTHOR_NAME",{"type":21,"tag":113,"props":615,"children":616},{"style":126},[617],{"type":26,"value":618},"}`",{"type":21,"tag":113,"props":620,"children":621},{"style":217},[622],{"type":26,"value":440},{"type":21,"tag":113,"props":624,"children":626},{"class":115,"line":625},18,[627,632,636,640],{"type":21,"tag":113,"props":628,"children":629},{"style":217},[630],{"type":26,"value":631}," updated: ",{"type":21,"tag":113,"props":633,"children":634},{"style":211},[635],{"type":26,"value":583},{"type":21,"tag":113,"props":637,"children":638},{"style":120},[639],{"type":26,"value":588},{"type":21,"tag":113,"props":641,"children":642},{"style":217},[643],{"type":26,"value":644},"(),\n",{"type":21,"tag":113,"props":646,"children":648},{"class":115,"line":647},19,[649,654,659],{"type":21,"tag":113,"props":650,"children":651},{"style":217},[652],{"type":26,"value":653}," generator: ",{"type":21,"tag":113,"props":655,"children":656},{"style":126},[657],{"type":26,"value":658},"\"Nuxt static site generation + Feed for Node.js\"",{"type":21,"tag":113,"props":660,"children":661},{"style":217},[662],{"type":26,"value":440},{"type":21,"tag":113,"props":664,"children":666},{"class":115,"line":665},20,[667],{"type":21,"tag":113,"props":668,"children":669},{"style":217},[670],{"type":26,"value":671}," feedLinks: {\n",{"type":21,"tag":113,"props":673,"children":675},{"class":115,"line":674},21,[676,681,685,689],{"type":21,"tag":113,"props":677,"children":678},{"style":217},[679],{"type":26,"value":680}," atom: ",{"type":21,"tag":113,"props":682,"children":683},{"style":126},[684],{"type":26,"value":525},{"type":21,"tag":113,"props":686,"children":687},{"style":132},[688],{"type":26,"value":472},{"type":21,"tag":113,"props":690,"children":691},{"style":126},[692],{"type":26,"value":693},"}/atom`\n",{"type":21,"tag":113,"props":695,"children":697},{"class":115,"line":696},22,[698],{"type":21,"tag":113,"props":699,"children":700},{"style":217},[701],{"type":26,"value":702}," },\n",{"type":21,"tag":113,"props":704,"children":706},{"class":115,"line":705},23,[707],{"type":21,"tag":113,"props":708,"children":709},{"style":217},[710],{"type":26,"value":711}," author: {\n",{"type":21,"tag":113,"props":713,"children":715},{"class":115,"line":714},24,[716,721,725],{"type":21,"tag":113,"props":717,"children":718},{"style":217},[719],{"type":26,"value":720}," name: ",{"type":21,"tag":113,"props":722,"children":723},{"style":132},[724],{"type":26,"value":613},{"type":21,"tag":113,"props":726,"children":727},{"style":217},[728],{"type":26,"value":440},{"type":21,"tag":113,"props":730,"children":732},{"class":115,"line":731},25,[733],{"type":21,"tag":113,"props":734,"children":735},{"style":217},[736],{"type":26,"value":737}," }\n",{"type":21,"tag":113,"props":739,"children":741},{"class":115,"line":740},26,[742],{"type":21,"tag":113,"props":743,"children":744},{"style":217},[745],{"type":26,"value":746}," });\n",{"type":21,"tag":113,"props":748,"children":750},{"class":115,"line":749},27,[751],{"type":21,"tag":113,"props":752,"children":753},{"emptyLinePlaceholder":268},[754],{"type":26,"value":271},{"type":21,"tag":113,"props":756,"children":758},{"class":115,"line":757},28,[759,763,768,772,777,782,787,792],{"type":21,"tag":113,"props":760,"children":761},{"style":211},[762],{"type":26,"value":397},{"type":21,"tag":113,"props":764,"children":765},{"style":132},[766],{"type":26,"value":767}," articles",{"type":21,"tag":113,"props":769,"children":770},{"style":211},[771],{"type":26,"value":290},{"type":21,"tag":113,"props":773,"children":774},{"style":211},[775],{"type":26,"value":776}," await",{"type":21,"tag":113,"props":778,"children":779},{"style":120},[780],{"type":26,"value":781}," serverQueryContent",{"type":21,"tag":113,"props":783,"children":784},{"style":217},[785],{"type":26,"value":786},"(event).",{"type":21,"tag":113,"props":788,"children":789},{"style":120},[790],{"type":26,"value":791},"find",{"type":21,"tag":113,"props":793,"children":794},{"style":217},[795],{"type":26,"value":796},"();\n",{"type":21,"tag":113,"props":798,"children":800},{"class":115,"line":799},29,[801],{"type":21,"tag":113,"props":802,"children":803},{"emptyLinePlaceholder":268},[804],{"type":26,"value":271},{"type":21,"tag":113,"props":806,"children":808},{"class":115,"line":807},30,[809,814,819,824,829,833,837],{"type":21,"tag":113,"props":810,"children":811},{"style":217},[812],{"type":26,"value":813}," articles.",{"type":21,"tag":113,"props":815,"children":816},{"style":120},[817],{"type":26,"value":818},"forEach",{"type":21,"tag":113,"props":820,"children":821},{"style":217},[822],{"type":26,"value":823},"((",{"type":21,"tag":113,"props":825,"children":826},{"style":362},[827],{"type":26,"value":828},"article",{"type":21,"tag":113,"props":830,"children":831},{"style":217},[832],{"type":26,"value":370},{"type":21,"tag":113,"props":834,"children":835},{"style":211},[836],{"type":26,"value":375},{"type":21,"tag":113,"props":838,"children":839},{"style":217},[840],{"type":26,"value":380},{"type":21,"tag":113,"props":842,"children":844},{"class":115,"line":843},31,[845,850,855],{"type":21,"tag":113,"props":846,"children":847},{"style":217},[848],{"type":26,"value":849}," feed.",{"type":21,"tag":113,"props":851,"children":852},{"style":120},[853],{"type":26,"value":854},"addItem",{"type":21,"tag":113,"props":856,"children":857},{"style":217},[858],{"type":26,"value":421},{"type":21,"tag":113,"props":860,"children":862},{"class":115,"line":861},32,[863,868,873,878,883,888],{"type":21,"tag":113,"props":864,"children":865},{"style":217},[866],{"type":26,"value":867}," title: article.title ",{"type":21,"tag":113,"props":869,"children":870},{"style":211},[871],{"type":26,"value":872},"?",{"type":21,"tag":113,"props":874,"children":875},{"style":217},[876],{"type":26,"value":877}," article.title ",{"type":21,"tag":113,"props":879,"children":880},{"style":211},[881],{"type":26,"value":882},":",{"type":21,"tag":113,"props":884,"children":885},{"style":126},[886],{"type":26,"value":887}," \"Missing Title\"",{"type":21,"tag":113,"props":889,"children":890},{"style":217},[891],{"type":26,"value":440},{"type":21,"tag":113,"props":893,"children":895},{"class":115,"line":894},33,[896],{"type":21,"tag":113,"props":897,"children":898},{"style":217},[899],{"type":26,"value":900}," id: article._path,\n",{"type":21,"tag":113,"props":902,"children":904},{"class":115,"line":903},34,[905,910,914,918,923,927,931,936,940],{"type":21,"tag":113,"props":906,"children":907},{"style":217},[908],{"type":26,"value":909}," link: ",{"type":21,"tag":113,"props":911,"children":912},{"style":126},[913],{"type":26,"value":525},{"type":21,"tag":113,"props":915,"children":916},{"style":132},[917],{"type":26,"value":472},{"type":21,"tag":113,"props":919,"children":920},{"style":126},[921],{"type":26,"value":922},"}${",{"type":21,"tag":113,"props":924,"children":925},{"style":217},[926],{"type":26,"value":828},{"type":21,"tag":113,"props":928,"children":929},{"style":126},[930],{"type":26,"value":161},{"type":21,"tag":113,"props":932,"children":933},{"style":217},[934],{"type":26,"value":935},"_path",{"type":21,"tag":113,"props":937,"children":938},{"style":126},[939],{"type":26,"value":618},{"type":21,"tag":113,"props":941,"children":942},{"style":217},[943],{"type":26,"value":440},{"type":21,"tag":113,"props":945,"children":947},{"class":115,"line":946},35,[948],{"type":21,"tag":113,"props":949,"children":950},{"style":217},[951],{"type":26,"value":952}," description: article.description,\n",{"type":21,"tag":113,"props":954,"children":956},{"class":115,"line":955},36,[957],{"type":21,"tag":113,"props":958,"children":959},{"style":217},[960],{"type":26,"value":961}," author: [\n",{"type":21,"tag":113,"props":963,"children":965},{"class":115,"line":964},37,[966],{"type":21,"tag":113,"props":967,"children":968},{"style":217},[969],{"type":26,"value":970}," {\n",{"type":21,"tag":113,"props":972,"children":974},{"class":115,"line":973},38,[975,980,984],{"type":21,"tag":113,"props":976,"children":977},{"style":217},[978],{"type":26,"value":979}," name: ",{"type":21,"tag":113,"props":981,"children":982},{"style":132},[983],{"type":26,"value":613},{"type":21,"tag":113,"props":985,"children":986},{"style":217},[987],{"type":26,"value":440},{"type":21,"tag":113,"props":989,"children":991},{"class":115,"line":990},39,[992],{"type":21,"tag":113,"props":993,"children":994},{"style":217},[995],{"type":26,"value":996}," },\n",{"type":21,"tag":113,"props":998,"children":1000},{"class":115,"line":999},40,[1001],{"type":21,"tag":113,"props":1002,"children":1003},{"style":217},[1004],{"type":26,"value":1005}," ],\n",{"type":21,"tag":113,"props":1007,"children":1009},{"class":115,"line":1008},41,[1010,1015,1019,1023],{"type":21,"tag":113,"props":1011,"children":1012},{"style":217},[1013],{"type":26,"value":1014}," date: ",{"type":21,"tag":113,"props":1016,"children":1017},{"style":211},[1018],{"type":26,"value":583},{"type":21,"tag":113,"props":1020,"children":1021},{"style":120},[1022],{"type":26,"value":588},{"type":21,"tag":113,"props":1024,"children":1025},{"style":217},[1026],{"type":26,"value":1027},"(article.date),\n",{"type":21,"tag":113,"props":1029,"children":1031},{"class":115,"line":1030},42,[1032,1037,1041,1046,1050,1055,1059,1063,1068,1072,1077],{"type":21,"tag":113,"props":1033,"children":1034},{"style":217},[1035],{"type":26,"value":1036}," image: article.cover_image ",{"type":21,"tag":113,"props":1038,"children":1039},{"style":211},[1040],{"type":26,"value":872},{"type":21,"tag":113,"props":1042,"children":1043},{"style":126},[1044],{"type":26,"value":1045}," `${",{"type":21,"tag":113,"props":1047,"children":1048},{"style":132},[1049],{"type":26,"value":472},{"type":21,"tag":113,"props":1051,"children":1052},{"style":126},[1053],{"type":26,"value":1054},"}/${",{"type":21,"tag":113,"props":1056,"children":1057},{"style":217},[1058],{"type":26,"value":828},{"type":21,"tag":113,"props":1060,"children":1061},{"style":126},[1062],{"type":26,"value":161},{"type":21,"tag":113,"props":1064,"children":1065},{"style":217},[1066],{"type":26,"value":1067},"cover_image",{"type":21,"tag":113,"props":1069,"children":1070},{"style":126},[1071],{"type":26,"value":618},{"type":21,"tag":113,"props":1073,"children":1074},{"style":211},[1075],{"type":26,"value":1076}," :",{"type":21,"tag":113,"props":1078,"children":1079},{"style":132},[1080],{"type":26,"value":1081}," undefined\n",{"type":21,"tag":113,"props":1083,"children":1085},{"class":115,"line":1084},43,[1086],{"type":21,"tag":113,"props":1087,"children":1088},{"style":217},[1089],{"type":26,"value":1090}," });\n",{"type":21,"tag":113,"props":1092,"children":1094},{"class":115,"line":1093},44,[1095],{"type":21,"tag":113,"props":1096,"children":1097},{"style":217},[1098],{"type":26,"value":746},{"type":21,"tag":113,"props":1100,"children":1102},{"class":115,"line":1101},45,[1103],{"type":21,"tag":113,"props":1104,"children":1105},{"emptyLinePlaceholder":268},[1106],{"type":26,"value":271},{"type":21,"tag":113,"props":1108,"children":1110},{"class":115,"line":1109},46,[1111,1116,1121,1126],{"type":21,"tag":113,"props":1112,"children":1113},{"style":211},[1114],{"type":26,"value":1115}," return",{"type":21,"tag":113,"props":1117,"children":1118},{"style":217},[1119],{"type":26,"value":1120}," feed.",{"type":21,"tag":113,"props":1122,"children":1123},{"style":120},[1124],{"type":26,"value":1125},"atom1",{"type":21,"tag":113,"props":1127,"children":1128},{"style":217},[1129],{"type":26,"value":796},{"type":21,"tag":113,"props":1131,"children":1133},{"class":115,"line":1132},47,[1134],{"type":21,"tag":113,"props":1135,"children":1136},{"style":217},[1137],{"type":26,"value":1138},"});\n",{"type":21,"tag":22,"props":1140,"children":1141},{},[1142,1144,1150,1152,1158,1160,1166,1168,1174],{"type":26,"value":1143},"And that's just about it! Except, if you are statically generating your website with the ",{"type":21,"tag":109,"props":1145,"children":1147},{"className":1146},[],[1148],{"type":26,"value":1149},"nuxt generate",{"type":26,"value":1151}," command, you will need to configure this server-side route to be pre-rendered on site generation. This is as simple as adding a ",{"type":21,"tag":109,"props":1153,"children":1155},{"className":1154},[],[1156],{"type":26,"value":1157},"nitro",{"type":26,"value":1159}," ",{"type":21,"tag":109,"props":1161,"children":1163},{"className":1162},[],[1164],{"type":26,"value":1165},"prerender",{"type":26,"value":1167}," definition in your ",{"type":21,"tag":109,"props":1169,"children":1171},{"className":1170},[],[1172],{"type":26,"value":1173},"nuxt.config.ts",{"type":26,"value":1175}," file, like so:",{"type":21,"tag":102,"props":1177,"children":1179},{"className":199,"code":1178,"language":201,"meta":7,"style":7},"nitro: {\n prerender: {\n routes: ['/atom']\n }\n}\n",[1180],{"type":21,"tag":109,"props":1181,"children":1182},{"__ignoreMap":7},[1183,1195,1207,1230,1238],{"type":21,"tag":113,"props":1184,"children":1185},{"class":115,"line":116},[1186,1190],{"type":21,"tag":113,"props":1187,"children":1188},{"style":120},[1189],{"type":26,"value":1157},{"type":21,"tag":113,"props":1191,"children":1192},{"style":217},[1193],{"type":26,"value":1194},": {\n",{"type":21,"tag":113,"props":1196,"children":1197},{"class":115,"line":238},[1198,1203],{"type":21,"tag":113,"props":1199,"children":1200},{"style":120},[1201],{"type":26,"value":1202}," prerender",{"type":21,"tag":113,"props":1204,"children":1205},{"style":217},[1206],{"type":26,"value":1194},{"type":21,"tag":113,"props":1208,"children":1209},{"class":115,"line":264},[1210,1215,1220,1225],{"type":21,"tag":113,"props":1211,"children":1212},{"style":120},[1213],{"type":26,"value":1214}," routes",{"type":21,"tag":113,"props":1216,"children":1217},{"style":217},[1218],{"type":26,"value":1219},": [",{"type":21,"tag":113,"props":1221,"children":1222},{"style":126},[1223],{"type":26,"value":1224},"'/atom'",{"type":21,"tag":113,"props":1226,"children":1227},{"style":217},[1228],{"type":26,"value":1229},"]\n",{"type":21,"tag":113,"props":1231,"children":1232},{"class":115,"line":274},[1233],{"type":21,"tag":113,"props":1234,"children":1235},{"style":217},[1236],{"type":26,"value":1237}," }\n",{"type":21,"tag":113,"props":1239,"children":1240},{"class":115,"line":298},[1241],{"type":21,"tag":113,"props":1242,"children":1243},{"style":217},[1244],{"type":26,"value":1245},"}\n",{"type":21,"tag":52,"props":1247,"children":1249},{"id":1248},"bonus",[1250],{"type":26,"value":1251},"Bonus",{"type":21,"tag":22,"props":1253,"children":1254},{},[1255,1257,1263],{"type":26,"value":1256},"You may also be interested in adding a ",{"type":21,"tag":109,"props":1258,"children":1260},{"className":1259},[],[1261],{"type":26,"value":1262},"sitemap.xml",{"type":26,"value":1264}," to your website. This can be done in almost an identical fashion!",{"type":21,"tag":22,"props":1266,"children":1267},{},[1268],{"type":26,"value":1269},"Install the dependency:",{"type":21,"tag":102,"props":1271,"children":1273},{"className":104,"code":1272,"language":106,"meta":7,"style":7},"npm i -D sitemap\n",[1274],{"type":21,"tag":109,"props":1275,"children":1276},{"__ignoreMap":7},[1277],{"type":21,"tag":113,"props":1278,"children":1279},{"class":115,"line":116},[1280,1284,1288,1292],{"type":21,"tag":113,"props":1281,"children":1282},{"style":120},[1283],{"type":26,"value":123},{"type":21,"tag":113,"props":1285,"children":1286},{"style":126},[1287],{"type":26,"value":129},{"type":21,"tag":113,"props":1289,"children":1290},{"style":132},[1291],{"type":26,"value":135},{"type":21,"tag":113,"props":1293,"children":1294},{"style":126},[1295],{"type":26,"value":1296}," sitemap\n",{"type":21,"tag":22,"props":1298,"children":1299},{},[1300,1302,1308],{"type":26,"value":1301},"Create a route at ",{"type":21,"tag":109,"props":1303,"children":1305},{"className":1304},[],[1306],{"type":26,"value":1307},"server/routes/sitemap.xml.ts",{"type":26,"value":882},{"type":21,"tag":102,"props":1310,"children":1312},{"className":199,"code":1311,"language":201,"meta":7,"style":7},"import { serverQueryContent } from '#content/server';\nimport { SitemapStream, streamToPromise } from 'sitemap';\n\nexport default defineEventHandler(async (event) => {\n const articles = await serverQueryContent(event).find();\n\n const sitemap = new SitemapStream({ hostname: 'https://my-website.com/' });\n\n // Add non nuxt content endpoints here\n sitemap.write({ url: '/' });\n sitemap.write({ url: '/articles' });\n\n // Dynamically generate routes for Nuxt markdown content\n articles.forEach((article) => sitemap.write({ url: article._path, changefreq: 'monthly' }));\n sitemap.end();\n\n return (await streamToPromise(sitemap));\n});\n",[1313],{"type":21,"tag":109,"props":1314,"children":1315},{"__ignoreMap":7},[1316,1339,1364,1371,1414,1449,1456,1496,1503,1512,1539,1563,1570,1578,1629,1645,1652,1678],{"type":21,"tag":113,"props":1317,"children":1318},{"class":115,"line":116},[1319,1323,1327,1331,1335],{"type":21,"tag":113,"props":1320,"children":1321},{"style":211},[1322],{"type":26,"value":214},{"type":21,"tag":113,"props":1324,"children":1325},{"style":217},[1326],{"type":26,"value":220},{"type":21,"tag":113,"props":1328,"children":1329},{"style":211},[1330],{"type":26,"value":225},{"type":21,"tag":113,"props":1332,"children":1333},{"style":126},[1334],{"type":26,"value":230},{"type":21,"tag":113,"props":1336,"children":1337},{"style":217},[1338],{"type":26,"value":235},{"type":21,"tag":113,"props":1340,"children":1341},{"class":115,"line":238},[1342,1346,1351,1355,1360],{"type":21,"tag":113,"props":1343,"children":1344},{"style":211},[1345],{"type":26,"value":214},{"type":21,"tag":113,"props":1347,"children":1348},{"style":217},[1349],{"type":26,"value":1350}," { SitemapStream, streamToPromise } ",{"type":21,"tag":113,"props":1352,"children":1353},{"style":211},[1354],{"type":26,"value":225},{"type":21,"tag":113,"props":1356,"children":1357},{"style":126},[1358],{"type":26,"value":1359}," 'sitemap'",{"type":21,"tag":113,"props":1361,"children":1362},{"style":217},[1363],{"type":26,"value":235},{"type":21,"tag":113,"props":1365,"children":1366},{"class":115,"line":264},[1367],{"type":21,"tag":113,"props":1368,"children":1369},{"emptyLinePlaceholder":268},[1370],{"type":26,"value":271},{"type":21,"tag":113,"props":1372,"children":1373},{"class":115,"line":274},[1374,1378,1382,1386,1390,1394,1398,1402,1406,1410],{"type":21,"tag":113,"props":1375,"children":1376},{"style":211},[1377],{"type":26,"value":334},{"type":21,"tag":113,"props":1379,"children":1380},{"style":211},[1381],{"type":26,"value":339},{"type":21,"tag":113,"props":1383,"children":1384},{"style":120},[1385],{"type":26,"value":344},{"type":21,"tag":113,"props":1387,"children":1388},{"style":217},[1389],{"type":26,"value":349},{"type":21,"tag":113,"props":1391,"children":1392},{"style":211},[1393],{"type":26,"value":354},{"type":21,"tag":113,"props":1395,"children":1396},{"style":217},[1397],{"type":26,"value":359},{"type":21,"tag":113,"props":1399,"children":1400},{"style":362},[1401],{"type":26,"value":365},{"type":21,"tag":113,"props":1403,"children":1404},{"style":217},[1405],{"type":26,"value":370},{"type":21,"tag":113,"props":1407,"children":1408},{"style":211},[1409],{"type":26,"value":375},{"type":21,"tag":113,"props":1411,"children":1412},{"style":217},[1413],{"type":26,"value":380},{"type":21,"tag":113,"props":1415,"children":1416},{"class":115,"line":298},[1417,1421,1425,1429,1433,1437,1441,1445],{"type":21,"tag":113,"props":1418,"children":1419},{"style":211},[1420],{"type":26,"value":397},{"type":21,"tag":113,"props":1422,"children":1423},{"style":132},[1424],{"type":26,"value":767},{"type":21,"tag":113,"props":1426,"children":1427},{"style":211},[1428],{"type":26,"value":290},{"type":21,"tag":113,"props":1430,"children":1431},{"style":211},[1432],{"type":26,"value":776},{"type":21,"tag":113,"props":1434,"children":1435},{"style":120},[1436],{"type":26,"value":781},{"type":21,"tag":113,"props":1438,"children":1439},{"style":217},[1440],{"type":26,"value":786},{"type":21,"tag":113,"props":1442,"children":1443},{"style":120},[1444],{"type":26,"value":791},{"type":21,"tag":113,"props":1446,"children":1447},{"style":217},[1448],{"type":26,"value":796},{"type":21,"tag":113,"props":1450,"children":1451},{"class":115,"line":320},[1452],{"type":21,"tag":113,"props":1453,"children":1454},{"emptyLinePlaceholder":268},[1455],{"type":26,"value":271},{"type":21,"tag":113,"props":1457,"children":1458},{"class":115,"line":328},[1459,1463,1468,1472,1476,1481,1486,1491],{"type":21,"tag":113,"props":1460,"children":1461},{"style":211},[1462],{"type":26,"value":397},{"type":21,"tag":113,"props":1464,"children":1465},{"style":132},[1466],{"type":26,"value":1467}," sitemap",{"type":21,"tag":113,"props":1469,"children":1470},{"style":211},[1471],{"type":26,"value":290},{"type":21,"tag":113,"props":1473,"children":1474},{"style":211},[1475],{"type":26,"value":411},{"type":21,"tag":113,"props":1477,"children":1478},{"style":120},[1479],{"type":26,"value":1480}," SitemapStream",{"type":21,"tag":113,"props":1482,"children":1483},{"style":217},[1484],{"type":26,"value":1485},"({ hostname: ",{"type":21,"tag":113,"props":1487,"children":1488},{"style":126},[1489],{"type":26,"value":1490},"'https://my-website.com/'",{"type":21,"tag":113,"props":1492,"children":1493},{"style":217},[1494],{"type":26,"value":1495}," });\n",{"type":21,"tag":113,"props":1497,"children":1498},{"class":115,"line":383},[1499],{"type":21,"tag":113,"props":1500,"children":1501},{"emptyLinePlaceholder":268},[1502],{"type":26,"value":271},{"type":21,"tag":113,"props":1504,"children":1505},{"class":115,"line":391},[1506],{"type":21,"tag":113,"props":1507,"children":1509},{"style":1508},"--shiki-default:#6A737D",[1510],{"type":26,"value":1511}," // Add non nuxt content endpoints here\n",{"type":21,"tag":113,"props":1513,"children":1514},{"class":115,"line":424},[1515,1520,1525,1530,1535],{"type":21,"tag":113,"props":1516,"children":1517},{"style":217},[1518],{"type":26,"value":1519}," sitemap.",{"type":21,"tag":113,"props":1521,"children":1522},{"style":120},[1523],{"type":26,"value":1524},"write",{"type":21,"tag":113,"props":1526,"children":1527},{"style":217},[1528],{"type":26,"value":1529},"({ url: ",{"type":21,"tag":113,"props":1531,"children":1532},{"style":126},[1533],{"type":26,"value":1534},"'/'",{"type":21,"tag":113,"props":1536,"children":1537},{"style":217},[1538],{"type":26,"value":1495},{"type":21,"tag":113,"props":1540,"children":1541},{"class":115,"line":443},[1542,1546,1550,1554,1559],{"type":21,"tag":113,"props":1543,"children":1544},{"style":217},[1545],{"type":26,"value":1519},{"type":21,"tag":113,"props":1547,"children":1548},{"style":120},[1549],{"type":26,"value":1524},{"type":21,"tag":113,"props":1551,"children":1552},{"style":217},[1553],{"type":26,"value":1529},{"type":21,"tag":113,"props":1555,"children":1556},{"style":126},[1557],{"type":26,"value":1558},"'/articles'",{"type":21,"tag":113,"props":1560,"children":1561},{"style":217},[1562],{"type":26,"value":1495},{"type":21,"tag":113,"props":1564,"children":1565},{"class":115,"line":461},[1566],{"type":21,"tag":113,"props":1567,"children":1568},{"emptyLinePlaceholder":268},[1569],{"type":26,"value":271},{"type":21,"tag":113,"props":1571,"children":1572},{"class":115,"line":479},[1573],{"type":21,"tag":113,"props":1574,"children":1575},{"style":1508},[1576],{"type":26,"value":1577}," // Dynamically generate routes for Nuxt markdown content\n",{"type":21,"tag":113,"props":1579,"children":1580},{"class":115,"line":496},[1581,1585,1589,1593,1597,1601,1605,1610,1614,1619,1624],{"type":21,"tag":113,"props":1582,"children":1583},{"style":217},[1584],{"type":26,"value":813},{"type":21,"tag":113,"props":1586,"children":1587},{"style":120},[1588],{"type":26,"value":818},{"type":21,"tag":113,"props":1590,"children":1591},{"style":217},[1592],{"type":26,"value":823},{"type":21,"tag":113,"props":1594,"children":1595},{"style":362},[1596],{"type":26,"value":828},{"type":21,"tag":113,"props":1598,"children":1599},{"style":217},[1600],{"type":26,"value":370},{"type":21,"tag":113,"props":1602,"children":1603},{"style":211},[1604],{"type":26,"value":375},{"type":21,"tag":113,"props":1606,"children":1607},{"style":217},[1608],{"type":26,"value":1609}," sitemap.",{"type":21,"tag":113,"props":1611,"children":1612},{"style":120},[1613],{"type":26,"value":1524},{"type":21,"tag":113,"props":1615,"children":1616},{"style":217},[1617],{"type":26,"value":1618},"({ url: article._path, changefreq: ",{"type":21,"tag":113,"props":1620,"children":1621},{"style":126},[1622],{"type":26,"value":1623},"'monthly'",{"type":21,"tag":113,"props":1625,"children":1626},{"style":217},[1627],{"type":26,"value":1628}," }));\n",{"type":21,"tag":113,"props":1630,"children":1631},{"class":115,"line":514},[1632,1636,1641],{"type":21,"tag":113,"props":1633,"children":1634},{"style":217},[1635],{"type":26,"value":1519},{"type":21,"tag":113,"props":1637,"children":1638},{"style":120},[1639],{"type":26,"value":1640},"end",{"type":21,"tag":113,"props":1642,"children":1643},{"style":217},[1644],{"type":26,"value":796},{"type":21,"tag":113,"props":1646,"children":1647},{"class":115,"line":541},[1648],{"type":21,"tag":113,"props":1649,"children":1650},{"emptyLinePlaceholder":268},[1651],{"type":26,"value":271},{"type":21,"tag":113,"props":1653,"children":1654},{"class":115,"line":567},[1655,1659,1663,1668,1673],{"type":21,"tag":113,"props":1656,"children":1657},{"style":211},[1658],{"type":26,"value":1115},{"type":21,"tag":113,"props":1660,"children":1661},{"style":217},[1662],{"type":26,"value":359},{"type":21,"tag":113,"props":1664,"children":1665},{"style":211},[1666],{"type":26,"value":1667},"await",{"type":21,"tag":113,"props":1669,"children":1670},{"style":120},[1671],{"type":26,"value":1672}," streamToPromise",{"type":21,"tag":113,"props":1674,"children":1675},{"style":217},[1676],{"type":26,"value":1677},"(sitemap));\n",{"type":21,"tag":113,"props":1679,"children":1680},{"class":115,"line":625},[1681],{"type":21,"tag":113,"props":1682,"children":1683},{"style":217},[1684],{"type":26,"value":1138},{"type":21,"tag":22,"props":1686,"children":1687},{},[1688,1690,1695,1697,1702],{"type":26,"value":1689},"And add the ",{"type":21,"tag":109,"props":1691,"children":1693},{"className":1692},[],[1694],{"type":26,"value":1165},{"type":26,"value":1696}," entry in your ",{"type":21,"tag":109,"props":1698,"children":1700},{"className":1699},[],[1701],{"type":26,"value":1173},{"type":26,"value":882},{"type":21,"tag":102,"props":1704,"children":1706},{"className":199,"code":1705,"language":201,"meta":7,"style":7},"nitro: {\n prerender: {\n routes: ['/sitemap.xml', '/atom']\n }\n}\n",[1707],{"type":21,"tag":109,"props":1708,"children":1709},{"__ignoreMap":7},[1710,1721,1732,1761,1768],{"type":21,"tag":113,"props":1711,"children":1712},{"class":115,"line":116},[1713,1717],{"type":21,"tag":113,"props":1714,"children":1715},{"style":120},[1716],{"type":26,"value":1157},{"type":21,"tag":113,"props":1718,"children":1719},{"style":217},[1720],{"type":26,"value":1194},{"type":21,"tag":113,"props":1722,"children":1723},{"class":115,"line":238},[1724,1728],{"type":21,"tag":113,"props":1725,"children":1726},{"style":120},[1727],{"type":26,"value":1202},{"type":21,"tag":113,"props":1729,"children":1730},{"style":217},[1731],{"type":26,"value":1194},{"type":21,"tag":113,"props":1733,"children":1734},{"class":115,"line":264},[1735,1739,1743,1748,1753,1757],{"type":21,"tag":113,"props":1736,"children":1737},{"style":120},[1738],{"type":26,"value":1214},{"type":21,"tag":113,"props":1740,"children":1741},{"style":217},[1742],{"type":26,"value":1219},{"type":21,"tag":113,"props":1744,"children":1745},{"style":126},[1746],{"type":26,"value":1747},"'/sitemap.xml'",{"type":21,"tag":113,"props":1749,"children":1750},{"style":217},[1751],{"type":26,"value":1752},", ",{"type":21,"tag":113,"props":1754,"children":1755},{"style":126},[1756],{"type":26,"value":1224},{"type":21,"tag":113,"props":1758,"children":1759},{"style":217},[1760],{"type":26,"value":1229},{"type":21,"tag":113,"props":1762,"children":1763},{"class":115,"line":274},[1764],{"type":21,"tag":113,"props":1765,"children":1766},{"style":217},[1767],{"type":26,"value":1237},{"type":21,"tag":113,"props":1769,"children":1770},{"class":115,"line":298},[1771],{"type":21,"tag":113,"props":1772,"children":1773},{"style":217},[1774],{"type":26,"value":1245},{"type":21,"tag":1776,"props":1777,"children":1778},"style",{},[1779],{"type":26,"value":1780},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":238,"depth":238,"links":1782},[1783,1784,1785],{"id":54,"depth":238,"text":57},{"id":83,"depth":238,"text":86},{"id":1248,"depth":238,"text":1251},"markdown","content:articles:nuxt-content-rss-feed.md","content","articles/nuxt-content-rss-feed.md","md",1718428848842] \ No newline at end of file +[{"data":1,"prerenderedAt":1791},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"draft":6,"date":10,"tags":11,"categories":14,"cover_image":16,"excerpt":17,"body":39,"_type":1786,"_id":1787,"_source":1788,"_file":1789,"_extension":1790},"/articles/nuxt-content-rss-feed","articles",false,"","How To Add an RSS Feed to a Nuxt Website","If you are a user of Nuxt Content and you wish to configure an RSS feed for your website, it's a surprisingly straight forward process! In this article, we will walk through the code changes required to host an RSS feed for both a statically generated, and Universal Nuxt application.","2024-01-06",[12,13],"nuxt","rss",[15],"programming","/images/nuxt-content-rss-feed.jpg",{"type":18,"children":19},"root",[20],{"type":21,"tag":22,"props":23,"children":24},"element","p",{},[25,28,37],{"type":26,"value":27},"text","If you are a user of ",{"type":21,"tag":29,"props":30,"children":34},"a",{"href":31,"rel":32},"https://content.nuxt.com/",[33],"nofollow",[35],{"type":26,"value":36},"Nuxt Content",{"type":26,"value":38}," and you wish to configure an RSS feed for your website, it's a surprisingly straight forward process! In this article, we will walk through the code changes required to host an RSS feed for both a statically generated, and Universal Nuxt application.",{"type":18,"children":40,"toc":1781},[41,51,58,81,87,101,141,162,197,1139,1176,1246,1252,1265,1270,1297,1309,1685,1703,1775],{"type":21,"tag":22,"props":42,"children":43},{},[44,45,50],{"type":26,"value":27},{"type":21,"tag":29,"props":46,"children":48},{"href":31,"rel":47},[33],[49],{"type":26,"value":36},{"type":26,"value":38},{"type":21,"tag":52,"props":53,"children":55},"h2",{"id":54},"preface",[56],{"type":26,"value":57},"Preface",{"type":21,"tag":22,"props":59,"children":60},{},[61,63,70,72,79],{"type":26,"value":62},"In version 2 of Nuxt, the community module, ",{"type":21,"tag":29,"props":64,"children":67},{"href":65,"rel":66},"https://github.com/nuxt-community/feed-module",[33],[68],{"type":26,"value":69},"nuxt-community/feed-module",{"type":26,"value":71}," was a popular choice for adding an RSS feed to your website. However, there has been an unresolved ",{"type":21,"tag":29,"props":73,"children":76},{"href":74,"rel":75},"https://github.com/nuxt-community/feed-module/issues/106",[33],[77],{"type":26,"value":78},"open issue",{"type":26,"value":80}," since April 1st, 2022 to add support for Nuxt v3. Thankfully, implementing this feature without a module is relatively straight forward.",{"type":21,"tag":52,"props":82,"children":84},{"id":83},"instructions",[85],{"type":26,"value":86},"Instructions",{"type":21,"tag":22,"props":88,"children":89},{},[90,92,99],{"type":26,"value":91},"First, install the ",{"type":21,"tag":29,"props":93,"children":96},{"href":94,"rel":95},"https://www.npmjs.com/package/feed",[33],[97],{"type":26,"value":98},"feed",{"type":26,"value":100}," library into your project:",{"type":21,"tag":102,"props":103,"children":107},"pre",{"className":104,"code":105,"language":106,"meta":7,"style":7},"language-shell shiki shiki-themes github-light","npm i -D feed\n","shell",[108],{"type":21,"tag":109,"props":110,"children":111},"code",{"__ignoreMap":7},[112],{"type":21,"tag":113,"props":114,"children":117},"span",{"class":115,"line":116},"line",1,[118,124,130,136],{"type":21,"tag":113,"props":119,"children":121},{"style":120},"--shiki-default:#6F42C1",[122],{"type":26,"value":123},"npm",{"type":21,"tag":113,"props":125,"children":127},{"style":126},"--shiki-default:#032F62",[128],{"type":26,"value":129}," i",{"type":21,"tag":113,"props":131,"children":133},{"style":132},"--shiki-default:#005CC5",[134],{"type":26,"value":135}," -D",{"type":21,"tag":113,"props":137,"children":138},{"style":126},[139],{"type":26,"value":140}," feed\n",{"type":21,"tag":22,"props":142,"children":143},{},[144,146,152,154,160],{"type":26,"value":145},"Then, create a ",{"type":21,"tag":109,"props":147,"children":149},{"className":148},[],[150],{"type":26,"value":151},"server/",{"type":26,"value":153}," folder in your project if it does not already exist, and create a file named ",{"type":21,"tag":109,"props":155,"children":157},{"className":156},[],[158],{"type":26,"value":159},"server/routes/atom.ts",{"type":26,"value":161},".",{"type":21,"tag":22,"props":163,"children":164},{},[165,167,172,174,179,181,187,189,195],{"type":26,"value":166},"Here, we will leverage the ",{"type":21,"tag":109,"props":168,"children":170},{"className":169},[],[171],{"type":26,"value":98},{"type":26,"value":173}," library and construct an XML representation of our Nuxt content. As you can see, we first define our ",{"type":21,"tag":109,"props":175,"children":177},{"className":176},[],[178],{"type":26,"value":98},{"type":26,"value":180}," with metadata associated with our RSS feed. This will be used by RSS readers to provide context to the end user. Then, we query our Nuxt content with ",{"type":21,"tag":109,"props":182,"children":184},{"className":183},[],[185],{"type":26,"value":186},"serverQueryContent",{"type":26,"value":188}," and append a ",{"type":21,"tag":109,"props":190,"children":192},{"className":191},[],[193],{"type":26,"value":194},"feed.addItem",{"type":26,"value":196}," for each article.",{"type":21,"tag":102,"props":198,"children":202},{"className":199,"code":200,"language":201,"meta":7,"style":7},"language-ts shiki shiki-themes github-light","import { serverQueryContent } from '#content/server';\nimport { Feed } from 'feed';\n\nconst BASE_URL = \"https://mywebsite.com\"\nconst AUTHOR_NAME = \"Firstname Lastname\"\n\nexport default defineEventHandler(async (event) => {\n\n const feed = new Feed({\n title: \"My Title\",\n description: \"My Description\",\n id: BASE_URL,\n link: BASE_URL,\n language: \"en\",\n image: `${BASE_URL}/images/placeholder.png`,\n favicon: `${BASE_URL}/favicon.ico`,\n copyright: `All rights reserved ${new Date().getFullYear()}, ${AUTHOR_NAME}`,\n updated: new Date(),\n generator: \"Nuxt static site generation + Feed for Node.js\",\n feedLinks: {\n atom: `${BASE_URL}/atom`\n },\n author: {\n name: AUTHOR_NAME,\n }\n });\n\n const articles = await serverQueryContent(event).find();\n\n articles.forEach((article) => {\n feed.addItem({\n title: article.title ? article.title : \"Missing Title\",\n id: article._path,\n link: `${BASE_URL}${article._path}`,\n description: article.description,\n author: [\n {\n name: AUTHOR_NAME,\n },\n ],\n date: new Date(article.date),\n image: article.cover_image ? `${BASE_URL}/${article.cover_image}` : undefined\n });\n });\n\n return feed.atom1();\n});\n","ts",[203],{"type":21,"tag":109,"props":204,"children":205},{"__ignoreMap":7},[206,236,262,272,296,318,326,381,389,422,441,459,477,494,512,539,565,623,645,663,672,694,703,712,729,738,747,755,797,805,841,859,892,901,944,953,962,971,988,997,1006,1028,1082,1091,1099,1107,1130],{"type":21,"tag":113,"props":207,"children":208},{"class":115,"line":116},[209,215,221,226,231],{"type":21,"tag":113,"props":210,"children":212},{"style":211},"--shiki-default:#D73A49",[213],{"type":26,"value":214},"import",{"type":21,"tag":113,"props":216,"children":218},{"style":217},"--shiki-default:#24292E",[219],{"type":26,"value":220}," { serverQueryContent } ",{"type":21,"tag":113,"props":222,"children":223},{"style":211},[224],{"type":26,"value":225},"from",{"type":21,"tag":113,"props":227,"children":228},{"style":126},[229],{"type":26,"value":230}," '#content/server'",{"type":21,"tag":113,"props":232,"children":233},{"style":217},[234],{"type":26,"value":235},";\n",{"type":21,"tag":113,"props":237,"children":239},{"class":115,"line":238},2,[240,244,249,253,258],{"type":21,"tag":113,"props":241,"children":242},{"style":211},[243],{"type":26,"value":214},{"type":21,"tag":113,"props":245,"children":246},{"style":217},[247],{"type":26,"value":248}," { Feed } ",{"type":21,"tag":113,"props":250,"children":251},{"style":211},[252],{"type":26,"value":225},{"type":21,"tag":113,"props":254,"children":255},{"style":126},[256],{"type":26,"value":257}," 'feed'",{"type":21,"tag":113,"props":259,"children":260},{"style":217},[261],{"type":26,"value":235},{"type":21,"tag":113,"props":263,"children":265},{"class":115,"line":264},3,[266],{"type":21,"tag":113,"props":267,"children":269},{"emptyLinePlaceholder":268},true,[270],{"type":26,"value":271},"\n",{"type":21,"tag":113,"props":273,"children":275},{"class":115,"line":274},4,[276,281,286,291],{"type":21,"tag":113,"props":277,"children":278},{"style":211},[279],{"type":26,"value":280},"const",{"type":21,"tag":113,"props":282,"children":283},{"style":132},[284],{"type":26,"value":285}," BASE_URL",{"type":21,"tag":113,"props":287,"children":288},{"style":211},[289],{"type":26,"value":290}," =",{"type":21,"tag":113,"props":292,"children":293},{"style":126},[294],{"type":26,"value":295}," \"https://mywebsite.com\"\n",{"type":21,"tag":113,"props":297,"children":299},{"class":115,"line":298},5,[300,304,309,313],{"type":21,"tag":113,"props":301,"children":302},{"style":211},[303],{"type":26,"value":280},{"type":21,"tag":113,"props":305,"children":306},{"style":132},[307],{"type":26,"value":308}," AUTHOR_NAME",{"type":21,"tag":113,"props":310,"children":311},{"style":211},[312],{"type":26,"value":290},{"type":21,"tag":113,"props":314,"children":315},{"style":126},[316],{"type":26,"value":317}," \"Firstname Lastname\"\n",{"type":21,"tag":113,"props":319,"children":321},{"class":115,"line":320},6,[322],{"type":21,"tag":113,"props":323,"children":324},{"emptyLinePlaceholder":268},[325],{"type":26,"value":271},{"type":21,"tag":113,"props":327,"children":329},{"class":115,"line":328},7,[330,335,340,345,350,355,360,366,371,376],{"type":21,"tag":113,"props":331,"children":332},{"style":211},[333],{"type":26,"value":334},"export",{"type":21,"tag":113,"props":336,"children":337},{"style":211},[338],{"type":26,"value":339}," default",{"type":21,"tag":113,"props":341,"children":342},{"style":120},[343],{"type":26,"value":344}," defineEventHandler",{"type":21,"tag":113,"props":346,"children":347},{"style":217},[348],{"type":26,"value":349},"(",{"type":21,"tag":113,"props":351,"children":352},{"style":211},[353],{"type":26,"value":354},"async",{"type":21,"tag":113,"props":356,"children":357},{"style":217},[358],{"type":26,"value":359}," (",{"type":21,"tag":113,"props":361,"children":363},{"style":362},"--shiki-default:#E36209",[364],{"type":26,"value":365},"event",{"type":21,"tag":113,"props":367,"children":368},{"style":217},[369],{"type":26,"value":370},") ",{"type":21,"tag":113,"props":372,"children":373},{"style":211},[374],{"type":26,"value":375},"=>",{"type":21,"tag":113,"props":377,"children":378},{"style":217},[379],{"type":26,"value":380}," {\n",{"type":21,"tag":113,"props":382,"children":384},{"class":115,"line":383},8,[385],{"type":21,"tag":113,"props":386,"children":387},{"emptyLinePlaceholder":268},[388],{"type":26,"value":271},{"type":21,"tag":113,"props":390,"children":392},{"class":115,"line":391},9,[393,398,403,407,412,417],{"type":21,"tag":113,"props":394,"children":395},{"style":211},[396],{"type":26,"value":397}," const",{"type":21,"tag":113,"props":399,"children":400},{"style":132},[401],{"type":26,"value":402}," feed",{"type":21,"tag":113,"props":404,"children":405},{"style":211},[406],{"type":26,"value":290},{"type":21,"tag":113,"props":408,"children":409},{"style":211},[410],{"type":26,"value":411}," new",{"type":21,"tag":113,"props":413,"children":414},{"style":120},[415],{"type":26,"value":416}," Feed",{"type":21,"tag":113,"props":418,"children":419},{"style":217},[420],{"type":26,"value":421},"({\n",{"type":21,"tag":113,"props":423,"children":425},{"class":115,"line":424},10,[426,431,436],{"type":21,"tag":113,"props":427,"children":428},{"style":217},[429],{"type":26,"value":430}," title: ",{"type":21,"tag":113,"props":432,"children":433},{"style":126},[434],{"type":26,"value":435},"\"My Title\"",{"type":21,"tag":113,"props":437,"children":438},{"style":217},[439],{"type":26,"value":440},",\n",{"type":21,"tag":113,"props":442,"children":444},{"class":115,"line":443},11,[445,450,455],{"type":21,"tag":113,"props":446,"children":447},{"style":217},[448],{"type":26,"value":449}," description: ",{"type":21,"tag":113,"props":451,"children":452},{"style":126},[453],{"type":26,"value":454},"\"My Description\"",{"type":21,"tag":113,"props":456,"children":457},{"style":217},[458],{"type":26,"value":440},{"type":21,"tag":113,"props":460,"children":462},{"class":115,"line":461},12,[463,468,473],{"type":21,"tag":113,"props":464,"children":465},{"style":217},[466],{"type":26,"value":467}," id: ",{"type":21,"tag":113,"props":469,"children":470},{"style":132},[471],{"type":26,"value":472},"BASE_URL",{"type":21,"tag":113,"props":474,"children":475},{"style":217},[476],{"type":26,"value":440},{"type":21,"tag":113,"props":478,"children":480},{"class":115,"line":479},13,[481,486,490],{"type":21,"tag":113,"props":482,"children":483},{"style":217},[484],{"type":26,"value":485}," link: ",{"type":21,"tag":113,"props":487,"children":488},{"style":132},[489],{"type":26,"value":472},{"type":21,"tag":113,"props":491,"children":492},{"style":217},[493],{"type":26,"value":440},{"type":21,"tag":113,"props":495,"children":497},{"class":115,"line":496},14,[498,503,508],{"type":21,"tag":113,"props":499,"children":500},{"style":217},[501],{"type":26,"value":502}," language: ",{"type":21,"tag":113,"props":504,"children":505},{"style":126},[506],{"type":26,"value":507},"\"en\"",{"type":21,"tag":113,"props":509,"children":510},{"style":217},[511],{"type":26,"value":440},{"type":21,"tag":113,"props":513,"children":515},{"class":115,"line":514},15,[516,521,526,530,535],{"type":21,"tag":113,"props":517,"children":518},{"style":217},[519],{"type":26,"value":520}," image: ",{"type":21,"tag":113,"props":522,"children":523},{"style":126},[524],{"type":26,"value":525},"`${",{"type":21,"tag":113,"props":527,"children":528},{"style":132},[529],{"type":26,"value":472},{"type":21,"tag":113,"props":531,"children":532},{"style":126},[533],{"type":26,"value":534},"}/images/placeholder.png`",{"type":21,"tag":113,"props":536,"children":537},{"style":217},[538],{"type":26,"value":440},{"type":21,"tag":113,"props":540,"children":542},{"class":115,"line":541},16,[543,548,552,556,561],{"type":21,"tag":113,"props":544,"children":545},{"style":217},[546],{"type":26,"value":547}," favicon: ",{"type":21,"tag":113,"props":549,"children":550},{"style":126},[551],{"type":26,"value":525},{"type":21,"tag":113,"props":553,"children":554},{"style":132},[555],{"type":26,"value":472},{"type":21,"tag":113,"props":557,"children":558},{"style":126},[559],{"type":26,"value":560},"}/favicon.ico`",{"type":21,"tag":113,"props":562,"children":563},{"style":217},[564],{"type":26,"value":440},{"type":21,"tag":113,"props":566,"children":568},{"class":115,"line":567},17,[569,574,579,584,589,594,599,604,609,614,619],{"type":21,"tag":113,"props":570,"children":571},{"style":217},[572],{"type":26,"value":573}," copyright: ",{"type":21,"tag":113,"props":575,"children":576},{"style":126},[577],{"type":26,"value":578},"`All rights reserved ${",{"type":21,"tag":113,"props":580,"children":581},{"style":211},[582],{"type":26,"value":583},"new",{"type":21,"tag":113,"props":585,"children":586},{"style":120},[587],{"type":26,"value":588}," Date",{"type":21,"tag":113,"props":590,"children":591},{"style":126},[592],{"type":26,"value":593},"().",{"type":21,"tag":113,"props":595,"children":596},{"style":120},[597],{"type":26,"value":598},"getFullYear",{"type":21,"tag":113,"props":600,"children":601},{"style":126},[602],{"type":26,"value":603},"()",{"type":21,"tag":113,"props":605,"children":606},{"style":126},[607],{"type":26,"value":608},"}, ${",{"type":21,"tag":113,"props":610,"children":611},{"style":132},[612],{"type":26,"value":613},"AUTHOR_NAME",{"type":21,"tag":113,"props":615,"children":616},{"style":126},[617],{"type":26,"value":618},"}`",{"type":21,"tag":113,"props":620,"children":621},{"style":217},[622],{"type":26,"value":440},{"type":21,"tag":113,"props":624,"children":626},{"class":115,"line":625},18,[627,632,636,640],{"type":21,"tag":113,"props":628,"children":629},{"style":217},[630],{"type":26,"value":631}," updated: ",{"type":21,"tag":113,"props":633,"children":634},{"style":211},[635],{"type":26,"value":583},{"type":21,"tag":113,"props":637,"children":638},{"style":120},[639],{"type":26,"value":588},{"type":21,"tag":113,"props":641,"children":642},{"style":217},[643],{"type":26,"value":644},"(),\n",{"type":21,"tag":113,"props":646,"children":648},{"class":115,"line":647},19,[649,654,659],{"type":21,"tag":113,"props":650,"children":651},{"style":217},[652],{"type":26,"value":653}," generator: ",{"type":21,"tag":113,"props":655,"children":656},{"style":126},[657],{"type":26,"value":658},"\"Nuxt static site generation + Feed for Node.js\"",{"type":21,"tag":113,"props":660,"children":661},{"style":217},[662],{"type":26,"value":440},{"type":21,"tag":113,"props":664,"children":666},{"class":115,"line":665},20,[667],{"type":21,"tag":113,"props":668,"children":669},{"style":217},[670],{"type":26,"value":671}," feedLinks: {\n",{"type":21,"tag":113,"props":673,"children":675},{"class":115,"line":674},21,[676,681,685,689],{"type":21,"tag":113,"props":677,"children":678},{"style":217},[679],{"type":26,"value":680}," atom: ",{"type":21,"tag":113,"props":682,"children":683},{"style":126},[684],{"type":26,"value":525},{"type":21,"tag":113,"props":686,"children":687},{"style":132},[688],{"type":26,"value":472},{"type":21,"tag":113,"props":690,"children":691},{"style":126},[692],{"type":26,"value":693},"}/atom`\n",{"type":21,"tag":113,"props":695,"children":697},{"class":115,"line":696},22,[698],{"type":21,"tag":113,"props":699,"children":700},{"style":217},[701],{"type":26,"value":702}," },\n",{"type":21,"tag":113,"props":704,"children":706},{"class":115,"line":705},23,[707],{"type":21,"tag":113,"props":708,"children":709},{"style":217},[710],{"type":26,"value":711}," author: {\n",{"type":21,"tag":113,"props":713,"children":715},{"class":115,"line":714},24,[716,721,725],{"type":21,"tag":113,"props":717,"children":718},{"style":217},[719],{"type":26,"value":720}," name: ",{"type":21,"tag":113,"props":722,"children":723},{"style":132},[724],{"type":26,"value":613},{"type":21,"tag":113,"props":726,"children":727},{"style":217},[728],{"type":26,"value":440},{"type":21,"tag":113,"props":730,"children":732},{"class":115,"line":731},25,[733],{"type":21,"tag":113,"props":734,"children":735},{"style":217},[736],{"type":26,"value":737}," }\n",{"type":21,"tag":113,"props":739,"children":741},{"class":115,"line":740},26,[742],{"type":21,"tag":113,"props":743,"children":744},{"style":217},[745],{"type":26,"value":746}," });\n",{"type":21,"tag":113,"props":748,"children":750},{"class":115,"line":749},27,[751],{"type":21,"tag":113,"props":752,"children":753},{"emptyLinePlaceholder":268},[754],{"type":26,"value":271},{"type":21,"tag":113,"props":756,"children":758},{"class":115,"line":757},28,[759,763,768,772,777,782,787,792],{"type":21,"tag":113,"props":760,"children":761},{"style":211},[762],{"type":26,"value":397},{"type":21,"tag":113,"props":764,"children":765},{"style":132},[766],{"type":26,"value":767}," articles",{"type":21,"tag":113,"props":769,"children":770},{"style":211},[771],{"type":26,"value":290},{"type":21,"tag":113,"props":773,"children":774},{"style":211},[775],{"type":26,"value":776}," await",{"type":21,"tag":113,"props":778,"children":779},{"style":120},[780],{"type":26,"value":781}," serverQueryContent",{"type":21,"tag":113,"props":783,"children":784},{"style":217},[785],{"type":26,"value":786},"(event).",{"type":21,"tag":113,"props":788,"children":789},{"style":120},[790],{"type":26,"value":791},"find",{"type":21,"tag":113,"props":793,"children":794},{"style":217},[795],{"type":26,"value":796},"();\n",{"type":21,"tag":113,"props":798,"children":800},{"class":115,"line":799},29,[801],{"type":21,"tag":113,"props":802,"children":803},{"emptyLinePlaceholder":268},[804],{"type":26,"value":271},{"type":21,"tag":113,"props":806,"children":808},{"class":115,"line":807},30,[809,814,819,824,829,833,837],{"type":21,"tag":113,"props":810,"children":811},{"style":217},[812],{"type":26,"value":813}," articles.",{"type":21,"tag":113,"props":815,"children":816},{"style":120},[817],{"type":26,"value":818},"forEach",{"type":21,"tag":113,"props":820,"children":821},{"style":217},[822],{"type":26,"value":823},"((",{"type":21,"tag":113,"props":825,"children":826},{"style":362},[827],{"type":26,"value":828},"article",{"type":21,"tag":113,"props":830,"children":831},{"style":217},[832],{"type":26,"value":370},{"type":21,"tag":113,"props":834,"children":835},{"style":211},[836],{"type":26,"value":375},{"type":21,"tag":113,"props":838,"children":839},{"style":217},[840],{"type":26,"value":380},{"type":21,"tag":113,"props":842,"children":844},{"class":115,"line":843},31,[845,850,855],{"type":21,"tag":113,"props":846,"children":847},{"style":217},[848],{"type":26,"value":849}," feed.",{"type":21,"tag":113,"props":851,"children":852},{"style":120},[853],{"type":26,"value":854},"addItem",{"type":21,"tag":113,"props":856,"children":857},{"style":217},[858],{"type":26,"value":421},{"type":21,"tag":113,"props":860,"children":862},{"class":115,"line":861},32,[863,868,873,878,883,888],{"type":21,"tag":113,"props":864,"children":865},{"style":217},[866],{"type":26,"value":867}," title: article.title ",{"type":21,"tag":113,"props":869,"children":870},{"style":211},[871],{"type":26,"value":872},"?",{"type":21,"tag":113,"props":874,"children":875},{"style":217},[876],{"type":26,"value":877}," article.title ",{"type":21,"tag":113,"props":879,"children":880},{"style":211},[881],{"type":26,"value":882},":",{"type":21,"tag":113,"props":884,"children":885},{"style":126},[886],{"type":26,"value":887}," \"Missing Title\"",{"type":21,"tag":113,"props":889,"children":890},{"style":217},[891],{"type":26,"value":440},{"type":21,"tag":113,"props":893,"children":895},{"class":115,"line":894},33,[896],{"type":21,"tag":113,"props":897,"children":898},{"style":217},[899],{"type":26,"value":900}," id: article._path,\n",{"type":21,"tag":113,"props":902,"children":904},{"class":115,"line":903},34,[905,910,914,918,923,927,931,936,940],{"type":21,"tag":113,"props":906,"children":907},{"style":217},[908],{"type":26,"value":909}," link: ",{"type":21,"tag":113,"props":911,"children":912},{"style":126},[913],{"type":26,"value":525},{"type":21,"tag":113,"props":915,"children":916},{"style":132},[917],{"type":26,"value":472},{"type":21,"tag":113,"props":919,"children":920},{"style":126},[921],{"type":26,"value":922},"}${",{"type":21,"tag":113,"props":924,"children":925},{"style":217},[926],{"type":26,"value":828},{"type":21,"tag":113,"props":928,"children":929},{"style":126},[930],{"type":26,"value":161},{"type":21,"tag":113,"props":932,"children":933},{"style":217},[934],{"type":26,"value":935},"_path",{"type":21,"tag":113,"props":937,"children":938},{"style":126},[939],{"type":26,"value":618},{"type":21,"tag":113,"props":941,"children":942},{"style":217},[943],{"type":26,"value":440},{"type":21,"tag":113,"props":945,"children":947},{"class":115,"line":946},35,[948],{"type":21,"tag":113,"props":949,"children":950},{"style":217},[951],{"type":26,"value":952}," description: article.description,\n",{"type":21,"tag":113,"props":954,"children":956},{"class":115,"line":955},36,[957],{"type":21,"tag":113,"props":958,"children":959},{"style":217},[960],{"type":26,"value":961}," author: [\n",{"type":21,"tag":113,"props":963,"children":965},{"class":115,"line":964},37,[966],{"type":21,"tag":113,"props":967,"children":968},{"style":217},[969],{"type":26,"value":970}," {\n",{"type":21,"tag":113,"props":972,"children":974},{"class":115,"line":973},38,[975,980,984],{"type":21,"tag":113,"props":976,"children":977},{"style":217},[978],{"type":26,"value":979}," name: ",{"type":21,"tag":113,"props":981,"children":982},{"style":132},[983],{"type":26,"value":613},{"type":21,"tag":113,"props":985,"children":986},{"style":217},[987],{"type":26,"value":440},{"type":21,"tag":113,"props":989,"children":991},{"class":115,"line":990},39,[992],{"type":21,"tag":113,"props":993,"children":994},{"style":217},[995],{"type":26,"value":996}," },\n",{"type":21,"tag":113,"props":998,"children":1000},{"class":115,"line":999},40,[1001],{"type":21,"tag":113,"props":1002,"children":1003},{"style":217},[1004],{"type":26,"value":1005}," ],\n",{"type":21,"tag":113,"props":1007,"children":1009},{"class":115,"line":1008},41,[1010,1015,1019,1023],{"type":21,"tag":113,"props":1011,"children":1012},{"style":217},[1013],{"type":26,"value":1014}," date: ",{"type":21,"tag":113,"props":1016,"children":1017},{"style":211},[1018],{"type":26,"value":583},{"type":21,"tag":113,"props":1020,"children":1021},{"style":120},[1022],{"type":26,"value":588},{"type":21,"tag":113,"props":1024,"children":1025},{"style":217},[1026],{"type":26,"value":1027},"(article.date),\n",{"type":21,"tag":113,"props":1029,"children":1031},{"class":115,"line":1030},42,[1032,1037,1041,1046,1050,1055,1059,1063,1068,1072,1077],{"type":21,"tag":113,"props":1033,"children":1034},{"style":217},[1035],{"type":26,"value":1036}," image: article.cover_image ",{"type":21,"tag":113,"props":1038,"children":1039},{"style":211},[1040],{"type":26,"value":872},{"type":21,"tag":113,"props":1042,"children":1043},{"style":126},[1044],{"type":26,"value":1045}," `${",{"type":21,"tag":113,"props":1047,"children":1048},{"style":132},[1049],{"type":26,"value":472},{"type":21,"tag":113,"props":1051,"children":1052},{"style":126},[1053],{"type":26,"value":1054},"}/${",{"type":21,"tag":113,"props":1056,"children":1057},{"style":217},[1058],{"type":26,"value":828},{"type":21,"tag":113,"props":1060,"children":1061},{"style":126},[1062],{"type":26,"value":161},{"type":21,"tag":113,"props":1064,"children":1065},{"style":217},[1066],{"type":26,"value":1067},"cover_image",{"type":21,"tag":113,"props":1069,"children":1070},{"style":126},[1071],{"type":26,"value":618},{"type":21,"tag":113,"props":1073,"children":1074},{"style":211},[1075],{"type":26,"value":1076}," :",{"type":21,"tag":113,"props":1078,"children":1079},{"style":132},[1080],{"type":26,"value":1081}," undefined\n",{"type":21,"tag":113,"props":1083,"children":1085},{"class":115,"line":1084},43,[1086],{"type":21,"tag":113,"props":1087,"children":1088},{"style":217},[1089],{"type":26,"value":1090}," });\n",{"type":21,"tag":113,"props":1092,"children":1094},{"class":115,"line":1093},44,[1095],{"type":21,"tag":113,"props":1096,"children":1097},{"style":217},[1098],{"type":26,"value":746},{"type":21,"tag":113,"props":1100,"children":1102},{"class":115,"line":1101},45,[1103],{"type":21,"tag":113,"props":1104,"children":1105},{"emptyLinePlaceholder":268},[1106],{"type":26,"value":271},{"type":21,"tag":113,"props":1108,"children":1110},{"class":115,"line":1109},46,[1111,1116,1121,1126],{"type":21,"tag":113,"props":1112,"children":1113},{"style":211},[1114],{"type":26,"value":1115}," return",{"type":21,"tag":113,"props":1117,"children":1118},{"style":217},[1119],{"type":26,"value":1120}," feed.",{"type":21,"tag":113,"props":1122,"children":1123},{"style":120},[1124],{"type":26,"value":1125},"atom1",{"type":21,"tag":113,"props":1127,"children":1128},{"style":217},[1129],{"type":26,"value":796},{"type":21,"tag":113,"props":1131,"children":1133},{"class":115,"line":1132},47,[1134],{"type":21,"tag":113,"props":1135,"children":1136},{"style":217},[1137],{"type":26,"value":1138},"});\n",{"type":21,"tag":22,"props":1140,"children":1141},{},[1142,1144,1150,1152,1158,1160,1166,1168,1174],{"type":26,"value":1143},"And that's just about it! Except, if you are statically generating your website with the ",{"type":21,"tag":109,"props":1145,"children":1147},{"className":1146},[],[1148],{"type":26,"value":1149},"nuxt generate",{"type":26,"value":1151}," command, you will need to configure this server-side route to be pre-rendered on site generation. This is as simple as adding a ",{"type":21,"tag":109,"props":1153,"children":1155},{"className":1154},[],[1156],{"type":26,"value":1157},"nitro",{"type":26,"value":1159}," ",{"type":21,"tag":109,"props":1161,"children":1163},{"className":1162},[],[1164],{"type":26,"value":1165},"prerender",{"type":26,"value":1167}," definition in your ",{"type":21,"tag":109,"props":1169,"children":1171},{"className":1170},[],[1172],{"type":26,"value":1173},"nuxt.config.ts",{"type":26,"value":1175}," file, like so:",{"type":21,"tag":102,"props":1177,"children":1179},{"className":199,"code":1178,"language":201,"meta":7,"style":7},"nitro: {\n prerender: {\n routes: ['/atom']\n }\n}\n",[1180],{"type":21,"tag":109,"props":1181,"children":1182},{"__ignoreMap":7},[1183,1195,1207,1230,1238],{"type":21,"tag":113,"props":1184,"children":1185},{"class":115,"line":116},[1186,1190],{"type":21,"tag":113,"props":1187,"children":1188},{"style":120},[1189],{"type":26,"value":1157},{"type":21,"tag":113,"props":1191,"children":1192},{"style":217},[1193],{"type":26,"value":1194},": {\n",{"type":21,"tag":113,"props":1196,"children":1197},{"class":115,"line":238},[1198,1203],{"type":21,"tag":113,"props":1199,"children":1200},{"style":120},[1201],{"type":26,"value":1202}," prerender",{"type":21,"tag":113,"props":1204,"children":1205},{"style":217},[1206],{"type":26,"value":1194},{"type":21,"tag":113,"props":1208,"children":1209},{"class":115,"line":264},[1210,1215,1220,1225],{"type":21,"tag":113,"props":1211,"children":1212},{"style":120},[1213],{"type":26,"value":1214}," routes",{"type":21,"tag":113,"props":1216,"children":1217},{"style":217},[1218],{"type":26,"value":1219},": [",{"type":21,"tag":113,"props":1221,"children":1222},{"style":126},[1223],{"type":26,"value":1224},"'/atom'",{"type":21,"tag":113,"props":1226,"children":1227},{"style":217},[1228],{"type":26,"value":1229},"]\n",{"type":21,"tag":113,"props":1231,"children":1232},{"class":115,"line":274},[1233],{"type":21,"tag":113,"props":1234,"children":1235},{"style":217},[1236],{"type":26,"value":1237}," }\n",{"type":21,"tag":113,"props":1239,"children":1240},{"class":115,"line":298},[1241],{"type":21,"tag":113,"props":1242,"children":1243},{"style":217},[1244],{"type":26,"value":1245},"}\n",{"type":21,"tag":52,"props":1247,"children":1249},{"id":1248},"bonus",[1250],{"type":26,"value":1251},"Bonus",{"type":21,"tag":22,"props":1253,"children":1254},{},[1255,1257,1263],{"type":26,"value":1256},"You may also be interested in adding a ",{"type":21,"tag":109,"props":1258,"children":1260},{"className":1259},[],[1261],{"type":26,"value":1262},"sitemap.xml",{"type":26,"value":1264}," to your website. This can be done in almost an identical fashion!",{"type":21,"tag":22,"props":1266,"children":1267},{},[1268],{"type":26,"value":1269},"Install the dependency:",{"type":21,"tag":102,"props":1271,"children":1273},{"className":104,"code":1272,"language":106,"meta":7,"style":7},"npm i -D sitemap\n",[1274],{"type":21,"tag":109,"props":1275,"children":1276},{"__ignoreMap":7},[1277],{"type":21,"tag":113,"props":1278,"children":1279},{"class":115,"line":116},[1280,1284,1288,1292],{"type":21,"tag":113,"props":1281,"children":1282},{"style":120},[1283],{"type":26,"value":123},{"type":21,"tag":113,"props":1285,"children":1286},{"style":126},[1287],{"type":26,"value":129},{"type":21,"tag":113,"props":1289,"children":1290},{"style":132},[1291],{"type":26,"value":135},{"type":21,"tag":113,"props":1293,"children":1294},{"style":126},[1295],{"type":26,"value":1296}," sitemap\n",{"type":21,"tag":22,"props":1298,"children":1299},{},[1300,1302,1308],{"type":26,"value":1301},"Create a route at ",{"type":21,"tag":109,"props":1303,"children":1305},{"className":1304},[],[1306],{"type":26,"value":1307},"server/routes/sitemap.xml.ts",{"type":26,"value":882},{"type":21,"tag":102,"props":1310,"children":1312},{"className":199,"code":1311,"language":201,"meta":7,"style":7},"import { serverQueryContent } from '#content/server';\nimport { SitemapStream, streamToPromise } from 'sitemap';\n\nexport default defineEventHandler(async (event) => {\n const articles = await serverQueryContent(event).find();\n\n const sitemap = new SitemapStream({ hostname: 'https://my-website.com/' });\n\n // Add non nuxt content endpoints here\n sitemap.write({ url: '/' });\n sitemap.write({ url: '/articles' });\n\n // Dynamically generate routes for Nuxt markdown content\n articles.forEach((article) => sitemap.write({ url: article._path, changefreq: 'monthly' }));\n sitemap.end();\n\n return (await streamToPromise(sitemap));\n});\n",[1313],{"type":21,"tag":109,"props":1314,"children":1315},{"__ignoreMap":7},[1316,1339,1364,1371,1414,1449,1456,1496,1503,1512,1539,1563,1570,1578,1629,1645,1652,1678],{"type":21,"tag":113,"props":1317,"children":1318},{"class":115,"line":116},[1319,1323,1327,1331,1335],{"type":21,"tag":113,"props":1320,"children":1321},{"style":211},[1322],{"type":26,"value":214},{"type":21,"tag":113,"props":1324,"children":1325},{"style":217},[1326],{"type":26,"value":220},{"type":21,"tag":113,"props":1328,"children":1329},{"style":211},[1330],{"type":26,"value":225},{"type":21,"tag":113,"props":1332,"children":1333},{"style":126},[1334],{"type":26,"value":230},{"type":21,"tag":113,"props":1336,"children":1337},{"style":217},[1338],{"type":26,"value":235},{"type":21,"tag":113,"props":1340,"children":1341},{"class":115,"line":238},[1342,1346,1351,1355,1360],{"type":21,"tag":113,"props":1343,"children":1344},{"style":211},[1345],{"type":26,"value":214},{"type":21,"tag":113,"props":1347,"children":1348},{"style":217},[1349],{"type":26,"value":1350}," { SitemapStream, streamToPromise } ",{"type":21,"tag":113,"props":1352,"children":1353},{"style":211},[1354],{"type":26,"value":225},{"type":21,"tag":113,"props":1356,"children":1357},{"style":126},[1358],{"type":26,"value":1359}," 'sitemap'",{"type":21,"tag":113,"props":1361,"children":1362},{"style":217},[1363],{"type":26,"value":235},{"type":21,"tag":113,"props":1365,"children":1366},{"class":115,"line":264},[1367],{"type":21,"tag":113,"props":1368,"children":1369},{"emptyLinePlaceholder":268},[1370],{"type":26,"value":271},{"type":21,"tag":113,"props":1372,"children":1373},{"class":115,"line":274},[1374,1378,1382,1386,1390,1394,1398,1402,1406,1410],{"type":21,"tag":113,"props":1375,"children":1376},{"style":211},[1377],{"type":26,"value":334},{"type":21,"tag":113,"props":1379,"children":1380},{"style":211},[1381],{"type":26,"value":339},{"type":21,"tag":113,"props":1383,"children":1384},{"style":120},[1385],{"type":26,"value":344},{"type":21,"tag":113,"props":1387,"children":1388},{"style":217},[1389],{"type":26,"value":349},{"type":21,"tag":113,"props":1391,"children":1392},{"style":211},[1393],{"type":26,"value":354},{"type":21,"tag":113,"props":1395,"children":1396},{"style":217},[1397],{"type":26,"value":359},{"type":21,"tag":113,"props":1399,"children":1400},{"style":362},[1401],{"type":26,"value":365},{"type":21,"tag":113,"props":1403,"children":1404},{"style":217},[1405],{"type":26,"value":370},{"type":21,"tag":113,"props":1407,"children":1408},{"style":211},[1409],{"type":26,"value":375},{"type":21,"tag":113,"props":1411,"children":1412},{"style":217},[1413],{"type":26,"value":380},{"type":21,"tag":113,"props":1415,"children":1416},{"class":115,"line":298},[1417,1421,1425,1429,1433,1437,1441,1445],{"type":21,"tag":113,"props":1418,"children":1419},{"style":211},[1420],{"type":26,"value":397},{"type":21,"tag":113,"props":1422,"children":1423},{"style":132},[1424],{"type":26,"value":767},{"type":21,"tag":113,"props":1426,"children":1427},{"style":211},[1428],{"type":26,"value":290},{"type":21,"tag":113,"props":1430,"children":1431},{"style":211},[1432],{"type":26,"value":776},{"type":21,"tag":113,"props":1434,"children":1435},{"style":120},[1436],{"type":26,"value":781},{"type":21,"tag":113,"props":1438,"children":1439},{"style":217},[1440],{"type":26,"value":786},{"type":21,"tag":113,"props":1442,"children":1443},{"style":120},[1444],{"type":26,"value":791},{"type":21,"tag":113,"props":1446,"children":1447},{"style":217},[1448],{"type":26,"value":796},{"type":21,"tag":113,"props":1450,"children":1451},{"class":115,"line":320},[1452],{"type":21,"tag":113,"props":1453,"children":1454},{"emptyLinePlaceholder":268},[1455],{"type":26,"value":271},{"type":21,"tag":113,"props":1457,"children":1458},{"class":115,"line":328},[1459,1463,1468,1472,1476,1481,1486,1491],{"type":21,"tag":113,"props":1460,"children":1461},{"style":211},[1462],{"type":26,"value":397},{"type":21,"tag":113,"props":1464,"children":1465},{"style":132},[1466],{"type":26,"value":1467}," sitemap",{"type":21,"tag":113,"props":1469,"children":1470},{"style":211},[1471],{"type":26,"value":290},{"type":21,"tag":113,"props":1473,"children":1474},{"style":211},[1475],{"type":26,"value":411},{"type":21,"tag":113,"props":1477,"children":1478},{"style":120},[1479],{"type":26,"value":1480}," SitemapStream",{"type":21,"tag":113,"props":1482,"children":1483},{"style":217},[1484],{"type":26,"value":1485},"({ hostname: ",{"type":21,"tag":113,"props":1487,"children":1488},{"style":126},[1489],{"type":26,"value":1490},"'https://my-website.com/'",{"type":21,"tag":113,"props":1492,"children":1493},{"style":217},[1494],{"type":26,"value":1495}," });\n",{"type":21,"tag":113,"props":1497,"children":1498},{"class":115,"line":383},[1499],{"type":21,"tag":113,"props":1500,"children":1501},{"emptyLinePlaceholder":268},[1502],{"type":26,"value":271},{"type":21,"tag":113,"props":1504,"children":1505},{"class":115,"line":391},[1506],{"type":21,"tag":113,"props":1507,"children":1509},{"style":1508},"--shiki-default:#6A737D",[1510],{"type":26,"value":1511}," // Add non nuxt content endpoints here\n",{"type":21,"tag":113,"props":1513,"children":1514},{"class":115,"line":424},[1515,1520,1525,1530,1535],{"type":21,"tag":113,"props":1516,"children":1517},{"style":217},[1518],{"type":26,"value":1519}," sitemap.",{"type":21,"tag":113,"props":1521,"children":1522},{"style":120},[1523],{"type":26,"value":1524},"write",{"type":21,"tag":113,"props":1526,"children":1527},{"style":217},[1528],{"type":26,"value":1529},"({ url: ",{"type":21,"tag":113,"props":1531,"children":1532},{"style":126},[1533],{"type":26,"value":1534},"'/'",{"type":21,"tag":113,"props":1536,"children":1537},{"style":217},[1538],{"type":26,"value":1495},{"type":21,"tag":113,"props":1540,"children":1541},{"class":115,"line":443},[1542,1546,1550,1554,1559],{"type":21,"tag":113,"props":1543,"children":1544},{"style":217},[1545],{"type":26,"value":1519},{"type":21,"tag":113,"props":1547,"children":1548},{"style":120},[1549],{"type":26,"value":1524},{"type":21,"tag":113,"props":1551,"children":1552},{"style":217},[1553],{"type":26,"value":1529},{"type":21,"tag":113,"props":1555,"children":1556},{"style":126},[1557],{"type":26,"value":1558},"'/articles'",{"type":21,"tag":113,"props":1560,"children":1561},{"style":217},[1562],{"type":26,"value":1495},{"type":21,"tag":113,"props":1564,"children":1565},{"class":115,"line":461},[1566],{"type":21,"tag":113,"props":1567,"children":1568},{"emptyLinePlaceholder":268},[1569],{"type":26,"value":271},{"type":21,"tag":113,"props":1571,"children":1572},{"class":115,"line":479},[1573],{"type":21,"tag":113,"props":1574,"children":1575},{"style":1508},[1576],{"type":26,"value":1577}," // Dynamically generate routes for Nuxt markdown content\n",{"type":21,"tag":113,"props":1579,"children":1580},{"class":115,"line":496},[1581,1585,1589,1593,1597,1601,1605,1610,1614,1619,1624],{"type":21,"tag":113,"props":1582,"children":1583},{"style":217},[1584],{"type":26,"value":813},{"type":21,"tag":113,"props":1586,"children":1587},{"style":120},[1588],{"type":26,"value":818},{"type":21,"tag":113,"props":1590,"children":1591},{"style":217},[1592],{"type":26,"value":823},{"type":21,"tag":113,"props":1594,"children":1595},{"style":362},[1596],{"type":26,"value":828},{"type":21,"tag":113,"props":1598,"children":1599},{"style":217},[1600],{"type":26,"value":370},{"type":21,"tag":113,"props":1602,"children":1603},{"style":211},[1604],{"type":26,"value":375},{"type":21,"tag":113,"props":1606,"children":1607},{"style":217},[1608],{"type":26,"value":1609}," sitemap.",{"type":21,"tag":113,"props":1611,"children":1612},{"style":120},[1613],{"type":26,"value":1524},{"type":21,"tag":113,"props":1615,"children":1616},{"style":217},[1617],{"type":26,"value":1618},"({ url: article._path, changefreq: ",{"type":21,"tag":113,"props":1620,"children":1621},{"style":126},[1622],{"type":26,"value":1623},"'monthly'",{"type":21,"tag":113,"props":1625,"children":1626},{"style":217},[1627],{"type":26,"value":1628}," }));\n",{"type":21,"tag":113,"props":1630,"children":1631},{"class":115,"line":514},[1632,1636,1641],{"type":21,"tag":113,"props":1633,"children":1634},{"style":217},[1635],{"type":26,"value":1519},{"type":21,"tag":113,"props":1637,"children":1638},{"style":120},[1639],{"type":26,"value":1640},"end",{"type":21,"tag":113,"props":1642,"children":1643},{"style":217},[1644],{"type":26,"value":796},{"type":21,"tag":113,"props":1646,"children":1647},{"class":115,"line":541},[1648],{"type":21,"tag":113,"props":1649,"children":1650},{"emptyLinePlaceholder":268},[1651],{"type":26,"value":271},{"type":21,"tag":113,"props":1653,"children":1654},{"class":115,"line":567},[1655,1659,1663,1668,1673],{"type":21,"tag":113,"props":1656,"children":1657},{"style":211},[1658],{"type":26,"value":1115},{"type":21,"tag":113,"props":1660,"children":1661},{"style":217},[1662],{"type":26,"value":359},{"type":21,"tag":113,"props":1664,"children":1665},{"style":211},[1666],{"type":26,"value":1667},"await",{"type":21,"tag":113,"props":1669,"children":1670},{"style":120},[1671],{"type":26,"value":1672}," streamToPromise",{"type":21,"tag":113,"props":1674,"children":1675},{"style":217},[1676],{"type":26,"value":1677},"(sitemap));\n",{"type":21,"tag":113,"props":1679,"children":1680},{"class":115,"line":625},[1681],{"type":21,"tag":113,"props":1682,"children":1683},{"style":217},[1684],{"type":26,"value":1138},{"type":21,"tag":22,"props":1686,"children":1687},{},[1688,1690,1695,1697,1702],{"type":26,"value":1689},"And add the ",{"type":21,"tag":109,"props":1691,"children":1693},{"className":1692},[],[1694],{"type":26,"value":1165},{"type":26,"value":1696}," entry in your ",{"type":21,"tag":109,"props":1698,"children":1700},{"className":1699},[],[1701],{"type":26,"value":1173},{"type":26,"value":882},{"type":21,"tag":102,"props":1704,"children":1706},{"className":199,"code":1705,"language":201,"meta":7,"style":7},"nitro: {\n prerender: {\n routes: ['/sitemap.xml', '/atom']\n }\n}\n",[1707],{"type":21,"tag":109,"props":1708,"children":1709},{"__ignoreMap":7},[1710,1721,1732,1761,1768],{"type":21,"tag":113,"props":1711,"children":1712},{"class":115,"line":116},[1713,1717],{"type":21,"tag":113,"props":1714,"children":1715},{"style":120},[1716],{"type":26,"value":1157},{"type":21,"tag":113,"props":1718,"children":1719},{"style":217},[1720],{"type":26,"value":1194},{"type":21,"tag":113,"props":1722,"children":1723},{"class":115,"line":238},[1724,1728],{"type":21,"tag":113,"props":1725,"children":1726},{"style":120},[1727],{"type":26,"value":1202},{"type":21,"tag":113,"props":1729,"children":1730},{"style":217},[1731],{"type":26,"value":1194},{"type":21,"tag":113,"props":1733,"children":1734},{"class":115,"line":264},[1735,1739,1743,1748,1753,1757],{"type":21,"tag":113,"props":1736,"children":1737},{"style":120},[1738],{"type":26,"value":1214},{"type":21,"tag":113,"props":1740,"children":1741},{"style":217},[1742],{"type":26,"value":1219},{"type":21,"tag":113,"props":1744,"children":1745},{"style":126},[1746],{"type":26,"value":1747},"'/sitemap.xml'",{"type":21,"tag":113,"props":1749,"children":1750},{"style":217},[1751],{"type":26,"value":1752},", ",{"type":21,"tag":113,"props":1754,"children":1755},{"style":126},[1756],{"type":26,"value":1224},{"type":21,"tag":113,"props":1758,"children":1759},{"style":217},[1760],{"type":26,"value":1229},{"type":21,"tag":113,"props":1762,"children":1763},{"class":115,"line":274},[1764],{"type":21,"tag":113,"props":1765,"children":1766},{"style":217},[1767],{"type":26,"value":1237},{"type":21,"tag":113,"props":1769,"children":1770},{"class":115,"line":298},[1771],{"type":21,"tag":113,"props":1772,"children":1773},{"style":217},[1774],{"type":26,"value":1245},{"type":21,"tag":1776,"props":1777,"children":1778},"style",{},[1779],{"type":26,"value":1780},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":238,"depth":238,"links":1782},[1783,1784,1785],{"id":54,"depth":238,"text":57},{"id":83,"depth":238,"text":86},{"id":1248,"depth":238,"text":1251},"markdown","content:articles:nuxt-content-rss-feed.md","content","articles/nuxt-content-rss-feed.md","md",1718681824633] \ No newline at end of file diff --git a/articles/nuxt-content-rss-feed/index.html b/articles/nuxt-content-rss-feed/index.html index f314f6e1..71d0399c 100644 --- a/articles/nuxt-content-rss-feed/index.html +++ b/articles/nuxt-content-rss-feed/index.html @@ -4,32 +4,32 @@ - - + + - - - - + + + + - + - - - - - - - - - - - - - -

        How To Add an RSS Feed to a Nuxt Website

        2024-01-06

        If you are a user of Nuxt Content and you wish to configure an RSS feed for your website, it's a surprisingly straight forward process! In this article, we will walk through the code changes required to host an RSS feed for both a statically generated, and Universal Nuxt application.

        Preface

        In version 2 of Nuxt, the community module, nuxt-community/feed-module was a popular choice for adding an RSS feed to your website. However, there has been an unresolved open issue since April 1st, 2022 to add support for Nuxt v3. Thankfully, implementing this feature without a module is relatively straight forward.

        Instructions

        First, install the feed library into your project:

        npm i -D feed
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +

        How To Add an RSS Feed to a Nuxt Website

        2024-01-06

        If you are a user of Nuxt Content and you wish to configure an RSS feed for your website, it's a surprisingly straight forward process! In this article, we will walk through the code changes required to host an RSS feed for both a statically generated, and Universal Nuxt application.

        Preface

        In version 2 of Nuxt, the community module, nuxt-community/feed-module was a popular choice for adding an RSS feed to your website. However, there has been an unresolved open issue since April 1st, 2022 to add support for Nuxt v3. Thankfully, implementing this feature without a module is relatively straight forward.

        Instructions

        First, install the feed library into your project:

        npm i -D feed
         

        Then, create a server/ folder in your project if it does not already exist, and create a file named server/routes/atom.ts.

        Here, we will leverage the feed library and construct an XML representation of our Nuxt content. As you can see, we first define our feed with metadata associated with our RSS feed. This will be used by RSS readers to provide context to the end user. Then, we query our Nuxt content with serverQueryContent and append a feed.addItem for each article.

        import { serverQueryContent } from '#content/server';
         import { Feed } from 'feed';
         
        @@ -106,5 +106,5 @@
             routes: ['/sitemap.xml', '/atom']
           }
         }
        -
        - \ No newline at end of file +
        + \ No newline at end of file diff --git a/articles/nuxt-v3-migration/_payload.json b/articles/nuxt-v3-migration/_payload.json index da253352..dbdc5700 100644 --- a/articles/nuxt-v3-migration/_payload.json +++ b/articles/nuxt-v3-migration/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":124},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"tags":11,"categories":13,"excerpt":15,"body":25,"_type":119,"_id":120,"_source":121,"_file":122,"_extension":123},"/articles/nuxt-v3-migration","articles",false,"","This Website Has Been Migrated to Nuxt 3 🎉","This website has been migrated to the latest version of the Nuxt web framework, and with it comes all of the exciting goodies that the Vue and Nuxt teams have been concocting over the past few years.\nNot to mention, all of the great plugins in the Vue ecosystem!","2022-12-31",[12],"nuxt",[14],"web",{"type":16,"children":17},"root",[18],{"type":19,"tag":20,"props":21,"children":22},"element","p",{},[23],{"type":24,"value":9},"text",{"type":16,"children":26,"toc":116},[27,31,47,56,61,66,111],{"type":19,"tag":20,"props":28,"children":29},{},[30],{"type":24,"value":9},{"type":19,"tag":20,"props":32,"children":33},{},[34,36,45],{"type":24,"value":35},"If you're curious what changes were required to make the migration, you can check out ",{"type":19,"tag":37,"props":38,"children":42},"a",{"href":39,"rel":40},"https://github.com/cmpadden/cmpadden.github.io/pull/3",[41],"nofollow",[43],{"type":24,"value":44},"pull request #3",{"type":24,"value":46}," in the GitHub repository.",{"type":19,"tag":20,"props":48,"children":49},{},[50],{"type":19,"tag":51,"props":52,"children":55},"img",{"alt":53,"src":54},"Screenshot of Nuxt Migration Pull Request","/images/nuxt-migration-pr.png",[],{"type":19,"tag":20,"props":57,"children":58},{},[59],{"type":24,"value":60},"While the documentation for making this migration is great, there were many breaking changes, and the overall process was quite tedious.\nFor this reason, I opted to generate a new project entirely, and port existing code to this clean slate.\nI believe that this resulted in a project with a bit less cruft.",{"type":19,"tag":20,"props":62,"children":63},{},[64],{"type":24,"value":65},"The most valuable resources for making these changes include:",{"type":19,"tag":67,"props":68,"children":69},"ul",{},[70,81,91,101],{"type":19,"tag":71,"props":72,"children":73},"li",{},[74],{"type":19,"tag":37,"props":75,"children":78},{"href":76,"rel":77},"https://nuxt.com/docs/migration/overview",[41],[79],{"type":24,"value":80},"The Nuxt Migration Guide",{"type":19,"tag":71,"props":82,"children":83},{},[84],{"type":19,"tag":37,"props":85,"children":88},{"href":86,"rel":87},"https://nuxt.com/docs/getting-started/introduction",[41],[89],{"type":24,"value":90},"The Nuxt Framework Guide",{"type":19,"tag":71,"props":92,"children":93},{},[94],{"type":19,"tag":37,"props":95,"children":98},{"href":96,"rel":97},"https://tailwindcss.nuxt.dev/",[41],[99],{"type":24,"value":100},"Nuxt Tailwind Module Documentation",{"type":19,"tag":71,"props":102,"children":103},{},[104],{"type":19,"tag":37,"props":105,"children":108},{"href":106,"rel":107},"https://content.nuxtjs.org/",[41],[109],{"type":24,"value":110},"Nuxt Content Module Documentation",{"type":19,"tag":20,"props":112,"children":113},{},[114],{"type":24,"value":115},"Part of the delay for doing this upgrade was in waiting for module developers to support this major release.\nI'm super thankful for all of the hard work they've don, and I'm excited to explore all of the new features available!\nI just hope that the breaking changes in this release don't cause too much fracturing of the community, as it does feel like déjà vu of Python 2 and 3.",{"title":7,"searchDepth":117,"depth":117,"links":118},2,[],"markdown","content:articles:nuxt-v3-migration.md","content","articles/nuxt-v3-migration.md","md",1718428848852] \ No newline at end of file +[{"data":1,"prerenderedAt":124},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"tags":11,"categories":13,"excerpt":15,"body":25,"_type":119,"_id":120,"_source":121,"_file":122,"_extension":123},"/articles/nuxt-v3-migration","articles",false,"","This Website Has Been Migrated to Nuxt 3 🎉","This website has been migrated to the latest version of the Nuxt web framework, and with it comes all of the exciting goodies that the Vue and Nuxt teams have been concocting over the past few years.\nNot to mention, all of the great plugins in the Vue ecosystem!","2022-12-31",[12],"nuxt",[14],"web",{"type":16,"children":17},"root",[18],{"type":19,"tag":20,"props":21,"children":22},"element","p",{},[23],{"type":24,"value":9},"text",{"type":16,"children":26,"toc":116},[27,31,47,56,61,66,111],{"type":19,"tag":20,"props":28,"children":29},{},[30],{"type":24,"value":9},{"type":19,"tag":20,"props":32,"children":33},{},[34,36,45],{"type":24,"value":35},"If you're curious what changes were required to make the migration, you can check out ",{"type":19,"tag":37,"props":38,"children":42},"a",{"href":39,"rel":40},"https://github.com/cmpadden/cmpadden.github.io/pull/3",[41],"nofollow",[43],{"type":24,"value":44},"pull request #3",{"type":24,"value":46}," in the GitHub repository.",{"type":19,"tag":20,"props":48,"children":49},{},[50],{"type":19,"tag":51,"props":52,"children":55},"img",{"alt":53,"src":54},"Screenshot of Nuxt Migration Pull Request","/images/nuxt-migration-pr.png",[],{"type":19,"tag":20,"props":57,"children":58},{},[59],{"type":24,"value":60},"While the documentation for making this migration is great, there were many breaking changes, and the overall process was quite tedious.\nFor this reason, I opted to generate a new project entirely, and port existing code to this clean slate.\nI believe that this resulted in a project with a bit less cruft.",{"type":19,"tag":20,"props":62,"children":63},{},[64],{"type":24,"value":65},"The most valuable resources for making these changes include:",{"type":19,"tag":67,"props":68,"children":69},"ul",{},[70,81,91,101],{"type":19,"tag":71,"props":72,"children":73},"li",{},[74],{"type":19,"tag":37,"props":75,"children":78},{"href":76,"rel":77},"https://nuxt.com/docs/migration/overview",[41],[79],{"type":24,"value":80},"The Nuxt Migration Guide",{"type":19,"tag":71,"props":82,"children":83},{},[84],{"type":19,"tag":37,"props":85,"children":88},{"href":86,"rel":87},"https://nuxt.com/docs/getting-started/introduction",[41],[89],{"type":24,"value":90},"The Nuxt Framework Guide",{"type":19,"tag":71,"props":92,"children":93},{},[94],{"type":19,"tag":37,"props":95,"children":98},{"href":96,"rel":97},"https://tailwindcss.nuxt.dev/",[41],[99],{"type":24,"value":100},"Nuxt Tailwind Module Documentation",{"type":19,"tag":71,"props":102,"children":103},{},[104],{"type":19,"tag":37,"props":105,"children":108},{"href":106,"rel":107},"https://content.nuxtjs.org/",[41],[109],{"type":24,"value":110},"Nuxt Content Module Documentation",{"type":19,"tag":20,"props":112,"children":113},{},[114],{"type":24,"value":115},"Part of the delay for doing this upgrade was in waiting for module developers to support this major release.\nI'm super thankful for all of the hard work they've don, and I'm excited to explore all of the new features available!\nI just hope that the breaking changes in this release don't cause too much fracturing of the community, as it does feel like déjà vu of Python 2 and 3.",{"title":7,"searchDepth":117,"depth":117,"links":118},2,[],"markdown","content:articles:nuxt-v3-migration.md","content","articles/nuxt-v3-migration.md","md",1718681824669] \ No newline at end of file diff --git a/articles/nuxt-v3-migration/index.html b/articles/nuxt-v3-migration/index.html index c17fcbd5..15dc7304 100644 --- a/articles/nuxt-v3-migration/index.html +++ b/articles/nuxt-v3-migration/index.html @@ -4,31 +4,31 @@ - - + + - - - - + + + + - + - - - - - - - - - - - -

        This Website Has Been Migrated to Nuxt 3 🎉

        2022-12-31

        This website has been migrated to the latest version of the Nuxt web framework, and with it comes all of the exciting goodies that the Vue and Nuxt teams have been concocting over the past few years. + + + + + + + + + + + +

        This Website Has Been Migrated to Nuxt 3 🎉

        2022-12-31

        This website has been migrated to the latest version of the Nuxt web framework, and with it comes all of the exciting goodies that the Vue and Nuxt teams have been concocting over the past few years. Not to mention, all of the great plugins in the Vue ecosystem!

        If you're curious what changes were required to make the migration, you can check out pull request #3 in the GitHub repository.

        Screenshot of Nuxt Migration Pull Request

        While the documentation for making this migration is great, there were many breaking changes, and the overall process was quite tedious. For this reason, I opted to generate a new project entirely, and port existing code to this clean slate. I believe that this resulted in a project with a bit less cruft.

        The most valuable resources for making these changes include:

        Part of the delay for doing this upgrade was in waiting for module developers to support this major release. I'm super thankful for all of the hard work they've don, and I'm excited to explore all of the new features available! -I just hope that the breaking changes in this release don't cause too much fracturing of the community, as it does feel like déjà vu of Python 2 and 3.

        - \ No newline at end of file +I just hope that the breaking changes in this release don't cause too much fracturing of the community, as it does feel like déjà vu of Python 2 and 3.

        + \ No newline at end of file diff --git a/articles/persistent-archlinux-usb/_payload.json b/articles/persistent-archlinux-usb/_payload.json index eb80ec83..0c7326f3 100644 --- a/articles/persistent-archlinux-usb/_payload.json +++ b/articles/persistent-archlinux-usb/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":1336},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"draft":6,"tags":11,"categories":14,"excerpt":16,"body":26,"_type":1331,"_id":1332,"_source":1333,"_file":1334,"_extension":1335},"/articles/persistent-archlinux-usb","articles",false,"","Create a Persistent Arch Linux Bootable USB with Vagrant","When installing a linux distribution, it is common for the instructions to have\nthe user create a bootable USB, boot from the device, and proceed with the\ninstallation procedure from that live medium. However, this blog post will\noutline an alternative approach where a virtual machine created with Vagrant\nwill be used in favor of the live medium.","2020-01-09",[12,13],"vagrant","archlinux",[15],"linux",{"type":17,"children":18},"root",[19],{"type":20,"tag":21,"props":22,"children":23},"element","p",{},[24],{"type":25,"value":9},"text",{"type":17,"children":27,"toc":1320},[28,32,39,85,91,98,115,152,165,190,246,354,367,388,654,660,674,681,705,825,831,846,885,908,941,947,1002,1067,1073,1081,1089,1097,1120,1128,1133,1138,1144,1174,1204,1210,1314],{"type":20,"tag":21,"props":29,"children":30},{},[31],{"type":25,"value":9},{"type":20,"tag":33,"props":34,"children":36},"h1",{"id":35},"preface",[37],{"type":25,"value":38},"Preface",{"type":20,"tag":21,"props":40,"children":41},{},[42,44,51,53,83],{"type":25,"value":43},"The original intention was to use Docker for this process -- leveraging the\n",{"type":20,"tag":45,"props":46,"children":48},"code",{"className":47},[],[49],{"type":25,"value":50},"--device",{"type":25,"value":52}," flag and mounting the target USB device in the Docker container,\nbut the underlying hypervisor in Docker Desktop for Mac does not support this.\n",{"type":20,"tag":54,"props":55,"children":56},"sup",{},[57,66,68,75,76],{"type":20,"tag":58,"props":59,"children":63},"a",{"href":60,"rel":61},"https://docs.docker.com/docker-for-mac/docker-toolbox/",[62],"nofollow",[64],{"type":25,"value":65},"1",{"type":25,"value":67}," ",{"type":20,"tag":58,"props":69,"children":72},{"href":70,"rel":71},"https://github.com/moby/hyperkit",[62],[73],{"type":25,"value":74},"2",{"type":25,"value":67},{"type":20,"tag":58,"props":77,"children":80},{"href":78,"rel":79},"https://github.com/docker/for-mac/issues/900",[62],[81],{"type":25,"value":82},"3",{"type":25,"value":84}," While there are workarounds using Docker\nMachine, Vagrant felt like the path of least resistance.",{"type":20,"tag":33,"props":86,"children":88},{"id":87},"instructions",[89],{"type":25,"value":90},"Instructions",{"type":20,"tag":92,"props":93,"children":95},"h2",{"id":94},"create-an-arch-linux-virtual-machine-with-vagrant",[96],{"type":25,"value":97},"Create an Arch Linux Virtual Machine with Vagrant",{"type":20,"tag":21,"props":99,"children":100},{},[101,103,113],{"type":25,"value":102},"Get the latest Arch Linux image ",{"type":20,"tag":54,"props":104,"children":105},{},[106],{"type":20,"tag":58,"props":107,"children":110},{"href":108,"rel":109},"https://app.vagrantup.com/archlinux/boxes/archlinux",[62],[111],{"type":25,"value":112},"4",{"type":25,"value":114}," from the Vagrant Cloud Box\nCatalog.",{"type":20,"tag":116,"props":117,"children":121},"pre",{"code":118,"language":119,"meta":7,"className":120,"style":7},"vagrant box add archlinux/archlinux\n","bash","language-bash shiki shiki-themes github-light",[122],{"type":20,"tag":45,"props":123,"children":124},{"__ignoreMap":7},[125],{"type":20,"tag":126,"props":127,"children":130},"span",{"class":128,"line":129},"line",1,[131,136,142,147],{"type":20,"tag":126,"props":132,"children":134},{"style":133},"--shiki-default:#6F42C1",[135],{"type":25,"value":12},{"type":20,"tag":126,"props":137,"children":139},{"style":138},"--shiki-default:#032F62",[140],{"type":25,"value":141}," box",{"type":20,"tag":126,"props":143,"children":144},{"style":138},[145],{"type":25,"value":146}," add",{"type":20,"tag":126,"props":148,"children":149},{"style":138},[150],{"type":25,"value":151}," archlinux/archlinux\n",{"type":20,"tag":21,"props":153,"children":154},{},[155,157,163],{"type":25,"value":156},"Determine the USB vendor information for the thumb-drive that we will\npass-through to the virtual machine. Using the ",{"type":20,"tag":45,"props":158,"children":160},{"className":159},[],[161],{"type":25,"value":162},"VBoxManage",{"type":25,"value":164}," utility that comes\nwith Virtual Box, list the devices, and make note of the Vendor and Product ID.",{"type":20,"tag":116,"props":166,"children":168},{"code":167,"language":119,"meta":7,"className":120,"style":7}," VBoxManage list usbhost\n",[169],{"type":20,"tag":45,"props":170,"children":171},{"__ignoreMap":7},[172],{"type":20,"tag":126,"props":173,"children":174},{"class":128,"line":129},[175,180,185],{"type":20,"tag":126,"props":176,"children":177},{"style":133},[178],{"type":25,"value":179}," VBoxManage",{"type":20,"tag":126,"props":181,"children":182},{"style":138},[183],{"type":25,"value":184}," list",{"type":20,"tag":126,"props":186,"children":187},{"style":138},[188],{"type":25,"value":189}," usbhost\n",{"type":20,"tag":21,"props":191,"children":192},{},[193,195,201,203,209,211,229,231,237,239,244],{"type":25,"value":194},"Create a ",{"type":20,"tag":45,"props":196,"children":198},{"className":197},[],[199],{"type":25,"value":200},"Vagrantfile",{"type":25,"value":202}," with ",{"type":20,"tag":45,"props":204,"children":206},{"className":205},[],[207],{"type":25,"value":208},"archlinx/archlinux",{"type":25,"value":210}," as the target box, and the USB\ndevice information that is passed through. ",{"type":20,"tag":54,"props":212,"children":213},{},[214,221,222],{"type":20,"tag":58,"props":215,"children":218},{"href":216,"rel":217},"https://antonyjepson.wordpress.com/2012/01/26/quickly-attaching-usb-devices-to-virtualbox-guests-using-vboxmanage/",[62],[219],{"type":25,"value":220},"5",{"type":25,"value":67},{"type":20,"tag":58,"props":223,"children":226},{"href":224,"rel":225},"https://gist.github.com/dscape/7d829c0c116ef419f963",[62],[227],{"type":25,"value":228},"6",{"type":25,"value":230}," Vagrant\noffers a handy customization parameter ",{"type":20,"tag":45,"props":232,"children":234},{"className":233},[],[235],{"type":25,"value":236},"vb.customize",{"type":25,"value":238}," that calls the\n",{"type":20,"tag":45,"props":240,"children":242},{"className":241},[],[243],{"type":25,"value":162},{"type":25,"value":245}," command under-the-hood, allowing one to enable the guest machine\nto access the host machine's USB devices.",{"type":20,"tag":116,"props":247,"children":251},{"code":248,"language":249,"meta":7,"className":250,"style":7},"# -*- mode: ruby -*-\n# vi: set ft=ruby :\n\nVagrant.configure(\"2\") do |config|\n config.vm.box = \"archlinux/archlinux\"\n config.vm.provider \"virtualbox\" do |vb|\n vb.name = \"archlinux\"\n vb.customize ['modifyvm', :id, '--usb', 'on']\n vb.customize ['usbfilter', 'add', '1', '--target', :id, '--name', 'SanDisk Ultra Fit', '--vendorid', '0x0781', '--productid', '0x5583']\n end\nend\n","txt","language-txt shiki shiki-themes github-light",[252],{"type":20,"tag":45,"props":253,"children":254},{"__ignoreMap":7},[255,263,272,282,291,300,309,318,327,336,345],{"type":20,"tag":126,"props":256,"children":257},{"class":128,"line":129},[258],{"type":20,"tag":126,"props":259,"children":260},{},[261],{"type":25,"value":262},"# -*- mode: ruby -*-\n",{"type":20,"tag":126,"props":264,"children":266},{"class":128,"line":265},2,[267],{"type":20,"tag":126,"props":268,"children":269},{},[270],{"type":25,"value":271},"# vi: set ft=ruby :\n",{"type":20,"tag":126,"props":273,"children":275},{"class":128,"line":274},3,[276],{"type":20,"tag":126,"props":277,"children":279},{"emptyLinePlaceholder":278},true,[280],{"type":25,"value":281},"\n",{"type":20,"tag":126,"props":283,"children":285},{"class":128,"line":284},4,[286],{"type":20,"tag":126,"props":287,"children":288},{},[289],{"type":25,"value":290},"Vagrant.configure(\"2\") do |config|\n",{"type":20,"tag":126,"props":292,"children":294},{"class":128,"line":293},5,[295],{"type":20,"tag":126,"props":296,"children":297},{},[298],{"type":25,"value":299}," config.vm.box = \"archlinux/archlinux\"\n",{"type":20,"tag":126,"props":301,"children":303},{"class":128,"line":302},6,[304],{"type":20,"tag":126,"props":305,"children":306},{},[307],{"type":25,"value":308}," config.vm.provider \"virtualbox\" do |vb|\n",{"type":20,"tag":126,"props":310,"children":312},{"class":128,"line":311},7,[313],{"type":20,"tag":126,"props":314,"children":315},{},[316],{"type":25,"value":317}," vb.name = \"archlinux\"\n",{"type":20,"tag":126,"props":319,"children":321},{"class":128,"line":320},8,[322],{"type":20,"tag":126,"props":323,"children":324},{},[325],{"type":25,"value":326}," vb.customize ['modifyvm', :id, '--usb', 'on']\n",{"type":20,"tag":126,"props":328,"children":330},{"class":128,"line":329},9,[331],{"type":20,"tag":126,"props":332,"children":333},{},[334],{"type":25,"value":335}," vb.customize ['usbfilter', 'add', '1', '--target', :id, '--name', 'SanDisk Ultra Fit', '--vendorid', '0x0781', '--productid', '0x5583']\n",{"type":20,"tag":126,"props":337,"children":339},{"class":128,"line":338},10,[340],{"type":20,"tag":126,"props":341,"children":342},{},[343],{"type":25,"value":344}," end\n",{"type":20,"tag":126,"props":346,"children":348},{"class":128,"line":347},11,[349],{"type":20,"tag":126,"props":350,"children":351},{},[352],{"type":25,"value":353},"end\n",{"type":20,"tag":21,"props":355,"children":356},{},[357,359,365],{"type":25,"value":358},"When virtual machine is brought up, the ",{"type":20,"tag":45,"props":360,"children":362},{"className":361},[],[363],{"type":25,"value":364},"usbfilter",{"type":25,"value":366}," is applied, and the guest\nis able to access to the host machine's USB device that was specified in the\nfilter.",{"type":20,"tag":21,"props":368,"children":369},{},[370,372,378,380,386],{"type":25,"value":371},"Start the machine, ",{"type":20,"tag":45,"props":373,"children":375},{"className":374},[],[376],{"type":25,"value":377},"ssh",{"type":25,"value":379}," into the guest, and list the devices to confirm that\nthe USB device is available (see: ",{"type":20,"tag":45,"props":381,"children":383},{"className":382},[],[384],{"type":25,"value":385},"/dev/sdb",{"type":25,"value":387},").",{"type":20,"tag":116,"props":389,"children":391},{"code":390,"language":119,"meta":7,"className":120,"style":7},"$ vagrant up\n$ vagrant ssh\n[vagrant@archlinux ~]$ lsblk\nNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nsda 8:0 0 20G 0 disk\n├─sda1 8:1 0 1.9G 0 part [SWAP]\n└─sda2 8:2 0 18.1G 0 part /\nsdb 8:16 1 28.7G 0 disk\n└─sdb1 8:17 1 8G 0 part\n",[392],{"type":20,"tag":45,"props":393,"children":394},{"__ignoreMap":7},[395,413,429,449,487,521,557,592,623],{"type":20,"tag":126,"props":396,"children":397},{"class":128,"line":129},[398,403,408],{"type":20,"tag":126,"props":399,"children":400},{"style":133},[401],{"type":25,"value":402},"$",{"type":20,"tag":126,"props":404,"children":405},{"style":138},[406],{"type":25,"value":407}," vagrant",{"type":20,"tag":126,"props":409,"children":410},{"style":138},[411],{"type":25,"value":412}," up\n",{"type":20,"tag":126,"props":414,"children":415},{"class":128,"line":265},[416,420,424],{"type":20,"tag":126,"props":417,"children":418},{"style":133},[419],{"type":25,"value":402},{"type":20,"tag":126,"props":421,"children":422},{"style":138},[423],{"type":25,"value":407},{"type":20,"tag":126,"props":425,"children":426},{"style":138},[427],{"type":25,"value":428}," ssh\n",{"type":20,"tag":126,"props":430,"children":431},{"class":128,"line":274},[432,438,444],{"type":20,"tag":126,"props":433,"children":435},{"style":434},"--shiki-default:#24292E",[436],{"type":25,"value":437},"[vagrant@archlinux ",{"type":20,"tag":126,"props":439,"children":441},{"style":440},"--shiki-default:#D73A49",[442],{"type":25,"value":443},"~",{"type":20,"tag":126,"props":445,"children":446},{"style":434},[447],{"type":25,"value":448},"]$ lsblk\n",{"type":20,"tag":126,"props":450,"children":451},{"class":128,"line":284},[452,457,462,467,472,477,482],{"type":20,"tag":126,"props":453,"children":454},{"style":133},[455],{"type":25,"value":456},"NAME",{"type":20,"tag":126,"props":458,"children":459},{"style":138},[460],{"type":25,"value":461}," MAJ:MIN",{"type":20,"tag":126,"props":463,"children":464},{"style":138},[465],{"type":25,"value":466}," RM",{"type":20,"tag":126,"props":468,"children":469},{"style":138},[470],{"type":25,"value":471}," SIZE",{"type":20,"tag":126,"props":473,"children":474},{"style":138},[475],{"type":25,"value":476}," RO",{"type":20,"tag":126,"props":478,"children":479},{"style":138},[480],{"type":25,"value":481}," TYPE",{"type":20,"tag":126,"props":483,"children":484},{"style":138},[485],{"type":25,"value":486}," MOUNTPOINT\n",{"type":20,"tag":126,"props":488,"children":489},{"class":128,"line":293},[490,495,500,506,511,516],{"type":20,"tag":126,"props":491,"children":492},{"style":133},[493],{"type":25,"value":494},"sda",{"type":20,"tag":126,"props":496,"children":497},{"style":138},[498],{"type":25,"value":499}," 8:0",{"type":20,"tag":126,"props":501,"children":503},{"style":502},"--shiki-default:#005CC5",[504],{"type":25,"value":505}," 0",{"type":20,"tag":126,"props":507,"children":508},{"style":138},[509],{"type":25,"value":510}," 20G",{"type":20,"tag":126,"props":512,"children":513},{"style":502},[514],{"type":25,"value":515}," 0",{"type":20,"tag":126,"props":517,"children":518},{"style":138},[519],{"type":25,"value":520}," disk\n",{"type":20,"tag":126,"props":522,"children":523},{"class":128,"line":302},[524,529,534,538,543,547,552],{"type":20,"tag":126,"props":525,"children":526},{"style":133},[527],{"type":25,"value":528},"├─sda1",{"type":20,"tag":126,"props":530,"children":531},{"style":138},[532],{"type":25,"value":533}," 8:1",{"type":20,"tag":126,"props":535,"children":536},{"style":502},[537],{"type":25,"value":505},{"type":20,"tag":126,"props":539,"children":540},{"style":138},[541],{"type":25,"value":542}," 1.9G",{"type":20,"tag":126,"props":544,"children":545},{"style":502},[546],{"type":25,"value":515},{"type":20,"tag":126,"props":548,"children":549},{"style":138},[550],{"type":25,"value":551}," part",{"type":20,"tag":126,"props":553,"children":554},{"style":434},[555],{"type":25,"value":556}," [SWAP]\n",{"type":20,"tag":126,"props":558,"children":559},{"class":128,"line":311},[560,565,570,574,579,583,587],{"type":20,"tag":126,"props":561,"children":562},{"style":133},[563],{"type":25,"value":564},"└─sda2",{"type":20,"tag":126,"props":566,"children":567},{"style":138},[568],{"type":25,"value":569}," 8:2",{"type":20,"tag":126,"props":571,"children":572},{"style":502},[573],{"type":25,"value":505},{"type":20,"tag":126,"props":575,"children":576},{"style":138},[577],{"type":25,"value":578}," 18.1G",{"type":20,"tag":126,"props":580,"children":581},{"style":502},[582],{"type":25,"value":515},{"type":20,"tag":126,"props":584,"children":585},{"style":138},[586],{"type":25,"value":551},{"type":20,"tag":126,"props":588,"children":589},{"style":138},[590],{"type":25,"value":591}," /\n",{"type":20,"tag":126,"props":593,"children":594},{"class":128,"line":320},[595,600,605,610,615,619],{"type":20,"tag":126,"props":596,"children":597},{"style":133},[598],{"type":25,"value":599},"sdb",{"type":20,"tag":126,"props":601,"children":602},{"style":138},[603],{"type":25,"value":604}," 8:16",{"type":20,"tag":126,"props":606,"children":607},{"style":502},[608],{"type":25,"value":609}," 1",{"type":20,"tag":126,"props":611,"children":612},{"style":138},[613],{"type":25,"value":614}," 28.7G",{"type":20,"tag":126,"props":616,"children":617},{"style":502},[618],{"type":25,"value":515},{"type":20,"tag":126,"props":620,"children":621},{"style":138},[622],{"type":25,"value":520},{"type":20,"tag":126,"props":624,"children":625},{"class":128,"line":329},[626,631,636,640,645,649],{"type":20,"tag":126,"props":627,"children":628},{"style":133},[629],{"type":25,"value":630},"└─sdb1",{"type":20,"tag":126,"props":632,"children":633},{"style":138},[634],{"type":25,"value":635}," 8:17",{"type":20,"tag":126,"props":637,"children":638},{"style":502},[639],{"type":25,"value":609},{"type":20,"tag":126,"props":641,"children":642},{"style":138},[643],{"type":25,"value":644}," 8G",{"type":20,"tag":126,"props":646,"children":647},{"style":502},[648],{"type":25,"value":515},{"type":20,"tag":126,"props":650,"children":651},{"style":138},[652],{"type":25,"value":653}," part\n",{"type":20,"tag":92,"props":655,"children":657},{"id":656},"install-arch-linux-on-the-usb-drive",[658],{"type":25,"value":659},"Install Arch Linux on the USB Drive",{"type":20,"tag":21,"props":661,"children":662},{},[663,665,672],{"type":25,"value":664},"The ",{"type":20,"tag":58,"props":666,"children":669},{"href":667,"rel":668},"https://wiki.archlinux.org/index.php/Installation_guide",[62],[670],{"type":25,"value":671},"Arch Linux Installation Guide",{"type":25,"value":673}," outlines the installation procedure in\ngreat detail -- the following steps follow this closely with a few alteration\ndue to installing onto removable media.",{"type":20,"tag":675,"props":676,"children":678},"h3",{"id":677},"partition-the-disk-uefi-with-gpt",[679],{"type":25,"value":680},"Partition the Disk (UEFI with GPT)",{"type":20,"tag":116,"props":682,"children":684},{"code":683,"language":119,"meta":7,"className":120,"style":7},"[root@archlinux ~]# fdisk /dev/sdb\n",[685],{"type":20,"tag":45,"props":686,"children":687},{"__ignoreMap":7},[688],{"type":20,"tag":126,"props":689,"children":690},{"class":128,"line":129},[691,696,700],{"type":20,"tag":126,"props":692,"children":693},{"style":434},[694],{"type":25,"value":695},"[root@archlinux ",{"type":20,"tag":126,"props":697,"children":698},{"style":440},[699],{"type":25,"value":443},{"type":20,"tag":126,"props":701,"children":702},{"style":434},[703],{"type":25,"value":704},"]# fdisk /dev/sdb\n",{"type":20,"tag":116,"props":706,"children":708},{"code":707,"language":249,"meta":7,"className":250,"style":7},"Command (m for help): p\nDisk /dev/sdb: 28.66 GiB, 30752636928 bytes, 60063744 sectors\nDisk model: Ultra Fit\nUnits: sectors of 1 * 512 = 512 bytes\nSector size (logical/physical): 512 bytes / 512 bytes\nI/O size (minimum/optimal): 512 bytes / 512 bytes\nDisklabel type: gpt\nDisk identifier: E1D6C445-1B79-AB4D-A442-FA4AD6DF4ECC\n\nDevice Start End Sectors Size Type\n/dev/sdb1 2048 1050623 1048576 512M EFI System\n/dev/sdb2 1050624 60063710 59013087 28.1G Linux filesystem\n\nFilesystem/RAID signature on partition 1 will be wiped.\n",[709],{"type":20,"tag":45,"props":710,"children":711},{"__ignoreMap":7},[712,720,728,736,744,752,760,768,776,783,791,799,808,816],{"type":20,"tag":126,"props":713,"children":714},{"class":128,"line":129},[715],{"type":20,"tag":126,"props":716,"children":717},{},[718],{"type":25,"value":719},"Command (m for help): p\n",{"type":20,"tag":126,"props":721,"children":722},{"class":128,"line":265},[723],{"type":20,"tag":126,"props":724,"children":725},{},[726],{"type":25,"value":727},"Disk /dev/sdb: 28.66 GiB, 30752636928 bytes, 60063744 sectors\n",{"type":20,"tag":126,"props":729,"children":730},{"class":128,"line":274},[731],{"type":20,"tag":126,"props":732,"children":733},{},[734],{"type":25,"value":735},"Disk model: Ultra Fit\n",{"type":20,"tag":126,"props":737,"children":738},{"class":128,"line":284},[739],{"type":20,"tag":126,"props":740,"children":741},{},[742],{"type":25,"value":743},"Units: sectors of 1 * 512 = 512 bytes\n",{"type":20,"tag":126,"props":745,"children":746},{"class":128,"line":293},[747],{"type":20,"tag":126,"props":748,"children":749},{},[750],{"type":25,"value":751},"Sector size (logical/physical): 512 bytes / 512 bytes\n",{"type":20,"tag":126,"props":753,"children":754},{"class":128,"line":302},[755],{"type":20,"tag":126,"props":756,"children":757},{},[758],{"type":25,"value":759},"I/O size (minimum/optimal): 512 bytes / 512 bytes\n",{"type":20,"tag":126,"props":761,"children":762},{"class":128,"line":311},[763],{"type":20,"tag":126,"props":764,"children":765},{},[766],{"type":25,"value":767},"Disklabel type: gpt\n",{"type":20,"tag":126,"props":769,"children":770},{"class":128,"line":320},[771],{"type":20,"tag":126,"props":772,"children":773},{},[774],{"type":25,"value":775},"Disk identifier: E1D6C445-1B79-AB4D-A442-FA4AD6DF4ECC\n",{"type":20,"tag":126,"props":777,"children":778},{"class":128,"line":329},[779],{"type":20,"tag":126,"props":780,"children":781},{"emptyLinePlaceholder":278},[782],{"type":25,"value":281},{"type":20,"tag":126,"props":784,"children":785},{"class":128,"line":338},[786],{"type":20,"tag":126,"props":787,"children":788},{},[789],{"type":25,"value":790},"Device Start End Sectors Size Type\n",{"type":20,"tag":126,"props":792,"children":793},{"class":128,"line":347},[794],{"type":20,"tag":126,"props":795,"children":796},{},[797],{"type":25,"value":798},"/dev/sdb1 2048 1050623 1048576 512M EFI System\n",{"type":20,"tag":126,"props":800,"children":802},{"class":128,"line":801},12,[803],{"type":20,"tag":126,"props":804,"children":805},{},[806],{"type":25,"value":807},"/dev/sdb2 1050624 60063710 59013087 28.1G Linux filesystem\n",{"type":20,"tag":126,"props":809,"children":811},{"class":128,"line":810},13,[812],{"type":20,"tag":126,"props":813,"children":814},{"emptyLinePlaceholder":278},[815],{"type":25,"value":281},{"type":20,"tag":126,"props":817,"children":819},{"class":128,"line":818},14,[820],{"type":20,"tag":126,"props":821,"children":822},{},[823],{"type":25,"value":824},"Filesystem/RAID signature on partition 1 will be wiped.\n",{"type":20,"tag":675,"props":826,"children":828},{"id":827},"format-the-partitions",[829],{"type":25,"value":830},"Format the Partitions",{"type":20,"tag":21,"props":832,"children":833},{},[834,836],{"type":25,"value":835},"The UEFI specification mandates support for FAT file-systems, and FAT32 is\nrecommended for removable media. ",{"type":20,"tag":54,"props":837,"children":838},{},[839],{"type":20,"tag":58,"props":840,"children":843},{"href":841,"rel":842},"https://wiki.archlinux.org/index.php/EFI_system_partition#Format_the_partition",[62],[844],{"type":25,"value":845},"7",{"type":20,"tag":116,"props":847,"children":849},{"code":848,"language":119,"meta":7,"className":120,"style":7},"[root@archlinux ~]# pacman -Sy dosfstools\n[root@archlinux ~]# mkfs.fat -F32 /dev/sdb1\n",[850],{"type":20,"tag":45,"props":851,"children":852},{"__ignoreMap":7},[853,869],{"type":20,"tag":126,"props":854,"children":855},{"class":128,"line":129},[856,860,864],{"type":20,"tag":126,"props":857,"children":858},{"style":434},[859],{"type":25,"value":695},{"type":20,"tag":126,"props":861,"children":862},{"style":440},[863],{"type":25,"value":443},{"type":20,"tag":126,"props":865,"children":866},{"style":434},[867],{"type":25,"value":868},"]# pacman -Sy dosfstools\n",{"type":20,"tag":126,"props":870,"children":871},{"class":128,"line":265},[872,876,880],{"type":20,"tag":126,"props":873,"children":874},{"style":434},[875],{"type":25,"value":695},{"type":20,"tag":126,"props":877,"children":878},{"style":440},[879],{"type":25,"value":443},{"type":20,"tag":126,"props":881,"children":882},{"style":434},[883],{"type":25,"value":884},"]# mkfs.fat -F32 /dev/sdb1\n",{"type":20,"tag":21,"props":886,"children":887},{},[888,890,896,898],{"type":25,"value":889},"As for the root partition, it is recommended to use ",{"type":20,"tag":45,"props":891,"children":893},{"className":892},[],[894],{"type":25,"value":895},"ext4",{"type":25,"value":897}," without a journal to\nreduce the reads and writes to the file-system as this is detrimental to the\nflash-based USB drive. ",{"type":20,"tag":54,"props":899,"children":900},{},[901],{"type":20,"tag":58,"props":902,"children":905},{"href":903,"rel":904},"https://wiki.archlinux.org/index.php/Install_Arch_Linux_on_a_USB_key#Installation_tweaks",[62],[906],{"type":25,"value":907},"8",{"type":20,"tag":116,"props":909,"children":911},{"code":910,"language":119,"meta":7,"className":120,"style":7},"[root@archlinux ~]# mkfs.ext4 -O \"^has_journal\" /dev/sdb2\n",[912],{"type":20,"tag":45,"props":913,"children":914},{"__ignoreMap":7},[915],{"type":20,"tag":126,"props":916,"children":917},{"class":128,"line":129},[918,922,926,931,936],{"type":20,"tag":126,"props":919,"children":920},{"style":434},[921],{"type":25,"value":695},{"type":20,"tag":126,"props":923,"children":924},{"style":440},[925],{"type":25,"value":443},{"type":20,"tag":126,"props":927,"children":928},{"style":434},[929],{"type":25,"value":930},"]# mkfs.ext4 -O ",{"type":20,"tag":126,"props":932,"children":933},{"style":138},[934],{"type":25,"value":935},"\"^has_journal\"",{"type":20,"tag":126,"props":937,"children":938},{"style":434},[939],{"type":25,"value":940}," /dev/sdb2\n",{"type":20,"tag":675,"props":942,"children":944},{"id":943},"mount-the-partitions-and-bootstrap-the-environment",[945],{"type":25,"value":946},"Mount the Partitions and Bootstrap the Environment",{"type":20,"tag":116,"props":948,"children":950},{"code":949,"language":119,"meta":7,"className":120,"style":7},"[root@archlinux ~]# mount /dev/sdb2 /mnt\n[root@archlinux ~]# mkdir -p /mnt/boot/efi\n[root@archlinux ~]# mount /dev/sdb1 /mnt/boot/efi\n",[951],{"type":20,"tag":45,"props":952,"children":953},{"__ignoreMap":7},[954,970,986],{"type":20,"tag":126,"props":955,"children":956},{"class":128,"line":129},[957,961,965],{"type":20,"tag":126,"props":958,"children":959},{"style":434},[960],{"type":25,"value":695},{"type":20,"tag":126,"props":962,"children":963},{"style":440},[964],{"type":25,"value":443},{"type":20,"tag":126,"props":966,"children":967},{"style":434},[968],{"type":25,"value":969},"]# mount /dev/sdb2 /mnt\n",{"type":20,"tag":126,"props":971,"children":972},{"class":128,"line":265},[973,977,981],{"type":20,"tag":126,"props":974,"children":975},{"style":434},[976],{"type":25,"value":695},{"type":20,"tag":126,"props":978,"children":979},{"style":440},[980],{"type":25,"value":443},{"type":20,"tag":126,"props":982,"children":983},{"style":434},[984],{"type":25,"value":985},"]# mkdir -p /mnt/boot/efi\n",{"type":20,"tag":126,"props":987,"children":988},{"class":128,"line":274},[989,993,997],{"type":20,"tag":126,"props":990,"children":991},{"style":434},[992],{"type":25,"value":695},{"type":20,"tag":126,"props":994,"children":995},{"style":440},[996],{"type":25,"value":443},{"type":20,"tag":126,"props":998,"children":999},{"style":434},[1000],{"type":25,"value":1001},"]# mount /dev/sdb1 /mnt/boot/efi\n",{"type":20,"tag":116,"props":1003,"children":1005},{"code":1004,"language":119,"meta":7,"className":120,"style":7},"[root@archlinux ~]# pacman -S arch-install-scripts\n[root@archlinux ~]# pacstrap /mnt base linux linux-firmware\n[root@archlinux ~]# genfstab -U /mnt >> /mnt/etc/fstab\n",[1006],{"type":20,"tag":45,"props":1007,"children":1008},{"__ignoreMap":7},[1009,1025,1041],{"type":20,"tag":126,"props":1010,"children":1011},{"class":128,"line":129},[1012,1016,1020],{"type":20,"tag":126,"props":1013,"children":1014},{"style":434},[1015],{"type":25,"value":695},{"type":20,"tag":126,"props":1017,"children":1018},{"style":440},[1019],{"type":25,"value":443},{"type":20,"tag":126,"props":1021,"children":1022},{"style":434},[1023],{"type":25,"value":1024},"]# pacman -S arch-install-scripts\n",{"type":20,"tag":126,"props":1026,"children":1027},{"class":128,"line":265},[1028,1032,1036],{"type":20,"tag":126,"props":1029,"children":1030},{"style":434},[1031],{"type":25,"value":695},{"type":20,"tag":126,"props":1033,"children":1034},{"style":440},[1035],{"type":25,"value":443},{"type":20,"tag":126,"props":1037,"children":1038},{"style":434},[1039],{"type":25,"value":1040},"]# pacstrap /mnt base linux linux-firmware\n",{"type":20,"tag":126,"props":1042,"children":1043},{"class":128,"line":274},[1044,1048,1052,1057,1062],{"type":20,"tag":126,"props":1045,"children":1046},{"style":434},[1047],{"type":25,"value":695},{"type":20,"tag":126,"props":1049,"children":1050},{"style":440},[1051],{"type":25,"value":443},{"type":20,"tag":126,"props":1053,"children":1054},{"style":434},[1055],{"type":25,"value":1056},"]# genfstab -U /mnt ",{"type":20,"tag":126,"props":1058,"children":1059},{"style":440},[1060],{"type":25,"value":1061},">>",{"type":20,"tag":126,"props":1063,"children":1064},{"style":434},[1065],{"type":25,"value":1066}," /mnt/etc/fstab\n",{"type":20,"tag":675,"props":1068,"children":1070},{"id":1069},"configure-the-new-environment",[1071],{"type":25,"value":1072},"Configure the New Environment",{"type":20,"tag":116,"props":1074,"children":1076},{"code":1075},"[root@archlinux ~]# arch-chroot /mnt\n",[1077],{"type":20,"tag":45,"props":1078,"children":1079},{"__ignoreMap":7},[1080],{"type":25,"value":1075},{"type":20,"tag":116,"props":1082,"children":1084},{"code":1083},"[root@archlinux /]# ln -sf /usr/share/zoneinfo/US/Eastern /etc/localtime\n[root@archlinux /]# hwclock --systohc\n[root@archlinux /]# sed -i 's/#en_US.UTF-8/en_US.UTF-8/' /etc/locale.gen\n[root@archlinux /]# locale-gen\n[root@archlinux /]# echo \"LANG=en_US.UTF-8\" > /etc/locale.conf\n",[1085],{"type":20,"tag":45,"props":1086,"children":1087},{"__ignoreMap":7},[1088],{"type":25,"value":1083},{"type":20,"tag":116,"props":1090,"children":1092},{"code":1091},"[root@archlinux /]# hostnamectl set-hostname usb\n[root@archlinux /]# echo \"127.0.0.1 localhost\" >> /etc/hosts\n[root@archlinux /]# echo \"::1 localhost\" >> /etc/hosts\n",[1093],{"type":20,"tag":45,"props":1094,"children":1095},{"__ignoreMap":7},[1096],{"type":25,"value":1091},{"type":20,"tag":21,"props":1098,"children":1099},{},[1100,1102,1108,1110],{"type":25,"value":1101},"Note, one difference here from a standard installation is that the\n",{"type":20,"tag":45,"props":1103,"children":1105},{"className":1104},[],[1106],{"type":25,"value":1107},"--removable",{"type":25,"value":1109}," flag is specified when installing the GRUB bootloader.\n",{"type":20,"tag":54,"props":1111,"children":1112},{},[1113],{"type":20,"tag":58,"props":1114,"children":1117},{"href":1115,"rel":1116},"https://wiki.archlinux.org/index.php/GRUB#UEFI_systems",[62],[1118],{"type":25,"value":1119},"10",{"type":20,"tag":116,"props":1121,"children":1123},{"code":1122},"[root@archlinux /]# pacman -S grub\n[root@archlinux /]# grub-install --target=x86_64-efi --efi-directory=/boot/efi --removable --recheck\n[root@usb /]# grub-mkconfig -o /boot/grub/grub.cfg\n",[1124],{"type":20,"tag":45,"props":1125,"children":1126},{"__ignoreMap":7},[1127],{"type":25,"value":1122},{"type":20,"tag":21,"props":1129,"children":1130},{},[1131],{"type":25,"value":1132},"Shutdown the virtual machine, restart the host machine, and boot the newly\ncreated Arch Linux thumb-drive!",{"type":20,"tag":21,"props":1134,"children":1135},{},[1136],{"type":25,"value":1137},"🎉",{"type":20,"tag":92,"props":1139,"children":1141},{"id":1140},"side-note",[1142],{"type":25,"value":1143},"Side-note",{"type":20,"tag":21,"props":1145,"children":1146},{},[1147,1149,1155,1157,1162,1164],{"type":25,"value":1148},"It was attempted to use the ",{"type":20,"tag":45,"props":1150,"children":1152},{"className":1151},[],[1153],{"type":25,"value":1154},"controlvm usbattach",{"type":25,"value":1156}," command to pass the USB\ndevice to the guest machine, but this did not work as it expects the virtual\nmachine to already be running, and the ",{"type":20,"tag":45,"props":1158,"children":1160},{"className":1159},[],[1161],{"type":25,"value":236},{"type":25,"value":1163}," option runs prior to\nbooting the machine. ",{"type":20,"tag":54,"props":1165,"children":1166},{},[1167],{"type":20,"tag":58,"props":1168,"children":1171},{"href":1169,"rel":1170},"https://www.vagrantup.com/docs/virtualbox/configuration.html#vboxmanage-customizations",[62],[1172],{"type":25,"value":1173},"11",{"type":20,"tag":116,"props":1175,"children":1177},{"code":1176,"language":249,"meta":7,"className":250,"style":7},"Command: [\"controlvm\", \"060a716b-1965-49e2-bc56-12beed5df716\", \"usbattach36fc9e60-c465-11cf-8056-444553540000\"]\n\nStderr: VBoxManage.exe: error: Machine '060a716b-1965-49e2-bc56-12beed5df716' is not currently running.\n",[1178],{"type":20,"tag":45,"props":1179,"children":1180},{"__ignoreMap":7},[1181,1189,1196],{"type":20,"tag":126,"props":1182,"children":1183},{"class":128,"line":129},[1184],{"type":20,"tag":126,"props":1185,"children":1186},{},[1187],{"type":25,"value":1188},"Command: [\"controlvm\", \"060a716b-1965-49e2-bc56-12beed5df716\", \"usbattach36fc9e60-c465-11cf-8056-444553540000\"]\n",{"type":20,"tag":126,"props":1190,"children":1191},{"class":128,"line":265},[1192],{"type":20,"tag":126,"props":1193,"children":1194},{"emptyLinePlaceholder":278},[1195],{"type":25,"value":281},{"type":20,"tag":126,"props":1197,"children":1198},{"class":128,"line":274},[1199],{"type":20,"tag":126,"props":1200,"children":1201},{},[1202],{"type":25,"value":1203},"Stderr: VBoxManage.exe: error: Machine '060a716b-1965-49e2-bc56-12beed5df716' is not currently running.\n",{"type":20,"tag":92,"props":1205,"children":1207},{"id":1206},"references",[1208],{"type":25,"value":1209},"References",{"type":20,"tag":1211,"props":1212,"children":1213},"ol",{},[1214,1224,1233,1242,1251,1260,1269,1278,1287,1296,1305],{"type":20,"tag":1215,"props":1216,"children":1217},"li",{},[1218],{"type":20,"tag":58,"props":1219,"children":1221},{"href":60,"rel":1220},[62],[1222],{"type":25,"value":1223},"Docker Desktop on Mac vs. Docker Toolbox",{"type":20,"tag":1215,"props":1225,"children":1226},{},[1227],{"type":20,"tag":58,"props":1228,"children":1230},{"href":70,"rel":1229},[62],[1231],{"type":25,"value":1232},"GitHub - HyperKit",{"type":20,"tag":1215,"props":1234,"children":1235},{},[1236],{"type":20,"tag":58,"props":1237,"children":1239},{"href":78,"rel":1238},[62],[1240],{"type":25,"value":1241},"GitHub - Docker for Mac - Issue #900",{"type":20,"tag":1215,"props":1243,"children":1244},{},[1245],{"type":20,"tag":58,"props":1246,"children":1248},{"href":108,"rel":1247},[62],[1249],{"type":25,"value":1250},"Vagrant Cloud - Arch Linux",{"type":20,"tag":1215,"props":1252,"children":1253},{},[1254],{"type":20,"tag":58,"props":1255,"children":1257},{"href":216,"rel":1256},[62],[1258],{"type":25,"value":1259},"Attaching USB Devices to VirtualBox Guests using VBoxManage",{"type":20,"tag":1215,"props":1261,"children":1262},{},[1263],{"type":20,"tag":58,"props":1264,"children":1266},{"href":224,"rel":1265},[62],[1267],{"type":25,"value":1268},"GitHub Gist - Vagrant USB Filter",{"type":20,"tag":1215,"props":1270,"children":1271},{},[1272],{"type":20,"tag":58,"props":1273,"children":1275},{"href":841,"rel":1274},[62],[1276],{"type":25,"value":1277},"Arch Linux Wiki - EFI System Partition - Format Partitions",{"type":20,"tag":1215,"props":1279,"children":1280},{},[1281],{"type":20,"tag":58,"props":1282,"children":1284},{"href":903,"rel":1283},[62],[1285],{"type":25,"value":1286},"Arch Linux Wiki - Arch Linux on USB - Installation Tweaks",{"type":20,"tag":1215,"props":1288,"children":1289},{},[1290],{"type":20,"tag":58,"props":1291,"children":1293},{"href":667,"rel":1292},[62],[1294],{"type":25,"value":1295},"Arch Linux Wiki - Installation Guide",{"type":20,"tag":1215,"props":1297,"children":1298},{},[1299],{"type":20,"tag":58,"props":1300,"children":1302},{"href":1115,"rel":1301},[62],[1303],{"type":25,"value":1304},"Arch Linux Wiki - GRUB - UEFI Systems",{"type":20,"tag":1215,"props":1306,"children":1307},{},[1308],{"type":20,"tag":58,"props":1309,"children":1311},{"href":1169,"rel":1310},[62],[1312],{"type":25,"value":1313},"Vagrant VBoxManage Customizations ",{"type":20,"tag":1315,"props":1316,"children":1317},"style",{},[1318],{"type":25,"value":1319},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":265,"depth":265,"links":1321},[1322,1323,1329,1330],{"id":94,"depth":265,"text":97},{"id":656,"depth":265,"text":659,"children":1324},[1325,1326,1327,1328],{"id":677,"depth":274,"text":680},{"id":827,"depth":274,"text":830},{"id":943,"depth":274,"text":946},{"id":1069,"depth":274,"text":1072},{"id":1140,"depth":265,"text":1143},{"id":1206,"depth":265,"text":1209},"markdown","content:articles:persistent-archlinux-usb.md","content","articles/persistent-archlinux-usb.md","md",1718428848857] \ No newline at end of file +[{"data":1,"prerenderedAt":1336},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"draft":6,"tags":11,"categories":14,"excerpt":16,"body":26,"_type":1331,"_id":1332,"_source":1333,"_file":1334,"_extension":1335},"/articles/persistent-archlinux-usb","articles",false,"","Create a Persistent Arch Linux Bootable USB with Vagrant","When installing a linux distribution, it is common for the instructions to have\nthe user create a bootable USB, boot from the device, and proceed with the\ninstallation procedure from that live medium. However, this blog post will\noutline an alternative approach where a virtual machine created with Vagrant\nwill be used in favor of the live medium.","2020-01-09",[12,13],"vagrant","archlinux",[15],"linux",{"type":17,"children":18},"root",[19],{"type":20,"tag":21,"props":22,"children":23},"element","p",{},[24],{"type":25,"value":9},"text",{"type":17,"children":27,"toc":1320},[28,32,39,85,91,98,115,152,165,190,246,354,367,388,654,660,674,681,705,825,831,846,885,908,941,947,1002,1067,1073,1081,1089,1097,1120,1128,1133,1138,1144,1174,1204,1210,1314],{"type":20,"tag":21,"props":29,"children":30},{},[31],{"type":25,"value":9},{"type":20,"tag":33,"props":34,"children":36},"h1",{"id":35},"preface",[37],{"type":25,"value":38},"Preface",{"type":20,"tag":21,"props":40,"children":41},{},[42,44,51,53,83],{"type":25,"value":43},"The original intention was to use Docker for this process -- leveraging the\n",{"type":20,"tag":45,"props":46,"children":48},"code",{"className":47},[],[49],{"type":25,"value":50},"--device",{"type":25,"value":52}," flag and mounting the target USB device in the Docker container,\nbut the underlying hypervisor in Docker Desktop for Mac does not support this.\n",{"type":20,"tag":54,"props":55,"children":56},"sup",{},[57,66,68,75,76],{"type":20,"tag":58,"props":59,"children":63},"a",{"href":60,"rel":61},"https://docs.docker.com/docker-for-mac/docker-toolbox/",[62],"nofollow",[64],{"type":25,"value":65},"1",{"type":25,"value":67}," ",{"type":20,"tag":58,"props":69,"children":72},{"href":70,"rel":71},"https://github.com/moby/hyperkit",[62],[73],{"type":25,"value":74},"2",{"type":25,"value":67},{"type":20,"tag":58,"props":77,"children":80},{"href":78,"rel":79},"https://github.com/docker/for-mac/issues/900",[62],[81],{"type":25,"value":82},"3",{"type":25,"value":84}," While there are workarounds using Docker\nMachine, Vagrant felt like the path of least resistance.",{"type":20,"tag":33,"props":86,"children":88},{"id":87},"instructions",[89],{"type":25,"value":90},"Instructions",{"type":20,"tag":92,"props":93,"children":95},"h2",{"id":94},"create-an-arch-linux-virtual-machine-with-vagrant",[96],{"type":25,"value":97},"Create an Arch Linux Virtual Machine with Vagrant",{"type":20,"tag":21,"props":99,"children":100},{},[101,103,113],{"type":25,"value":102},"Get the latest Arch Linux image ",{"type":20,"tag":54,"props":104,"children":105},{},[106],{"type":20,"tag":58,"props":107,"children":110},{"href":108,"rel":109},"https://app.vagrantup.com/archlinux/boxes/archlinux",[62],[111],{"type":25,"value":112},"4",{"type":25,"value":114}," from the Vagrant Cloud Box\nCatalog.",{"type":20,"tag":116,"props":117,"children":121},"pre",{"code":118,"language":119,"meta":7,"className":120,"style":7},"vagrant box add archlinux/archlinux\n","bash","language-bash shiki shiki-themes github-light",[122],{"type":20,"tag":45,"props":123,"children":124},{"__ignoreMap":7},[125],{"type":20,"tag":126,"props":127,"children":130},"span",{"class":128,"line":129},"line",1,[131,136,142,147],{"type":20,"tag":126,"props":132,"children":134},{"style":133},"--shiki-default:#6F42C1",[135],{"type":25,"value":12},{"type":20,"tag":126,"props":137,"children":139},{"style":138},"--shiki-default:#032F62",[140],{"type":25,"value":141}," box",{"type":20,"tag":126,"props":143,"children":144},{"style":138},[145],{"type":25,"value":146}," add",{"type":20,"tag":126,"props":148,"children":149},{"style":138},[150],{"type":25,"value":151}," archlinux/archlinux\n",{"type":20,"tag":21,"props":153,"children":154},{},[155,157,163],{"type":25,"value":156},"Determine the USB vendor information for the thumb-drive that we will\npass-through to the virtual machine. Using the ",{"type":20,"tag":45,"props":158,"children":160},{"className":159},[],[161],{"type":25,"value":162},"VBoxManage",{"type":25,"value":164}," utility that comes\nwith Virtual Box, list the devices, and make note of the Vendor and Product ID.",{"type":20,"tag":116,"props":166,"children":168},{"code":167,"language":119,"meta":7,"className":120,"style":7}," VBoxManage list usbhost\n",[169],{"type":20,"tag":45,"props":170,"children":171},{"__ignoreMap":7},[172],{"type":20,"tag":126,"props":173,"children":174},{"class":128,"line":129},[175,180,185],{"type":20,"tag":126,"props":176,"children":177},{"style":133},[178],{"type":25,"value":179}," VBoxManage",{"type":20,"tag":126,"props":181,"children":182},{"style":138},[183],{"type":25,"value":184}," list",{"type":20,"tag":126,"props":186,"children":187},{"style":138},[188],{"type":25,"value":189}," usbhost\n",{"type":20,"tag":21,"props":191,"children":192},{},[193,195,201,203,209,211,229,231,237,239,244],{"type":25,"value":194},"Create a ",{"type":20,"tag":45,"props":196,"children":198},{"className":197},[],[199],{"type":25,"value":200},"Vagrantfile",{"type":25,"value":202}," with ",{"type":20,"tag":45,"props":204,"children":206},{"className":205},[],[207],{"type":25,"value":208},"archlinx/archlinux",{"type":25,"value":210}," as the target box, and the USB\ndevice information that is passed through. ",{"type":20,"tag":54,"props":212,"children":213},{},[214,221,222],{"type":20,"tag":58,"props":215,"children":218},{"href":216,"rel":217},"https://antonyjepson.wordpress.com/2012/01/26/quickly-attaching-usb-devices-to-virtualbox-guests-using-vboxmanage/",[62],[219],{"type":25,"value":220},"5",{"type":25,"value":67},{"type":20,"tag":58,"props":223,"children":226},{"href":224,"rel":225},"https://gist.github.com/dscape/7d829c0c116ef419f963",[62],[227],{"type":25,"value":228},"6",{"type":25,"value":230}," Vagrant\noffers a handy customization parameter ",{"type":20,"tag":45,"props":232,"children":234},{"className":233},[],[235],{"type":25,"value":236},"vb.customize",{"type":25,"value":238}," that calls the\n",{"type":20,"tag":45,"props":240,"children":242},{"className":241},[],[243],{"type":25,"value":162},{"type":25,"value":245}," command under-the-hood, allowing one to enable the guest machine\nto access the host machine's USB devices.",{"type":20,"tag":116,"props":247,"children":251},{"code":248,"language":249,"meta":7,"className":250,"style":7},"# -*- mode: ruby -*-\n# vi: set ft=ruby :\n\nVagrant.configure(\"2\") do |config|\n config.vm.box = \"archlinux/archlinux\"\n config.vm.provider \"virtualbox\" do |vb|\n vb.name = \"archlinux\"\n vb.customize ['modifyvm', :id, '--usb', 'on']\n vb.customize ['usbfilter', 'add', '1', '--target', :id, '--name', 'SanDisk Ultra Fit', '--vendorid', '0x0781', '--productid', '0x5583']\n end\nend\n","txt","language-txt shiki shiki-themes github-light",[252],{"type":20,"tag":45,"props":253,"children":254},{"__ignoreMap":7},[255,263,272,282,291,300,309,318,327,336,345],{"type":20,"tag":126,"props":256,"children":257},{"class":128,"line":129},[258],{"type":20,"tag":126,"props":259,"children":260},{},[261],{"type":25,"value":262},"# -*- mode: ruby -*-\n",{"type":20,"tag":126,"props":264,"children":266},{"class":128,"line":265},2,[267],{"type":20,"tag":126,"props":268,"children":269},{},[270],{"type":25,"value":271},"# vi: set ft=ruby :\n",{"type":20,"tag":126,"props":273,"children":275},{"class":128,"line":274},3,[276],{"type":20,"tag":126,"props":277,"children":279},{"emptyLinePlaceholder":278},true,[280],{"type":25,"value":281},"\n",{"type":20,"tag":126,"props":283,"children":285},{"class":128,"line":284},4,[286],{"type":20,"tag":126,"props":287,"children":288},{},[289],{"type":25,"value":290},"Vagrant.configure(\"2\") do |config|\n",{"type":20,"tag":126,"props":292,"children":294},{"class":128,"line":293},5,[295],{"type":20,"tag":126,"props":296,"children":297},{},[298],{"type":25,"value":299}," config.vm.box = \"archlinux/archlinux\"\n",{"type":20,"tag":126,"props":301,"children":303},{"class":128,"line":302},6,[304],{"type":20,"tag":126,"props":305,"children":306},{},[307],{"type":25,"value":308}," config.vm.provider \"virtualbox\" do |vb|\n",{"type":20,"tag":126,"props":310,"children":312},{"class":128,"line":311},7,[313],{"type":20,"tag":126,"props":314,"children":315},{},[316],{"type":25,"value":317}," vb.name = \"archlinux\"\n",{"type":20,"tag":126,"props":319,"children":321},{"class":128,"line":320},8,[322],{"type":20,"tag":126,"props":323,"children":324},{},[325],{"type":25,"value":326}," vb.customize ['modifyvm', :id, '--usb', 'on']\n",{"type":20,"tag":126,"props":328,"children":330},{"class":128,"line":329},9,[331],{"type":20,"tag":126,"props":332,"children":333},{},[334],{"type":25,"value":335}," vb.customize ['usbfilter', 'add', '1', '--target', :id, '--name', 'SanDisk Ultra Fit', '--vendorid', '0x0781', '--productid', '0x5583']\n",{"type":20,"tag":126,"props":337,"children":339},{"class":128,"line":338},10,[340],{"type":20,"tag":126,"props":341,"children":342},{},[343],{"type":25,"value":344}," end\n",{"type":20,"tag":126,"props":346,"children":348},{"class":128,"line":347},11,[349],{"type":20,"tag":126,"props":350,"children":351},{},[352],{"type":25,"value":353},"end\n",{"type":20,"tag":21,"props":355,"children":356},{},[357,359,365],{"type":25,"value":358},"When virtual machine is brought up, the ",{"type":20,"tag":45,"props":360,"children":362},{"className":361},[],[363],{"type":25,"value":364},"usbfilter",{"type":25,"value":366}," is applied, and the guest\nis able to access to the host machine's USB device that was specified in the\nfilter.",{"type":20,"tag":21,"props":368,"children":369},{},[370,372,378,380,386],{"type":25,"value":371},"Start the machine, ",{"type":20,"tag":45,"props":373,"children":375},{"className":374},[],[376],{"type":25,"value":377},"ssh",{"type":25,"value":379}," into the guest, and list the devices to confirm that\nthe USB device is available (see: ",{"type":20,"tag":45,"props":381,"children":383},{"className":382},[],[384],{"type":25,"value":385},"/dev/sdb",{"type":25,"value":387},").",{"type":20,"tag":116,"props":389,"children":391},{"code":390,"language":119,"meta":7,"className":120,"style":7},"$ vagrant up\n$ vagrant ssh\n[vagrant@archlinux ~]$ lsblk\nNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nsda 8:0 0 20G 0 disk\n├─sda1 8:1 0 1.9G 0 part [SWAP]\n└─sda2 8:2 0 18.1G 0 part /\nsdb 8:16 1 28.7G 0 disk\n└─sdb1 8:17 1 8G 0 part\n",[392],{"type":20,"tag":45,"props":393,"children":394},{"__ignoreMap":7},[395,413,429,449,487,521,557,592,623],{"type":20,"tag":126,"props":396,"children":397},{"class":128,"line":129},[398,403,408],{"type":20,"tag":126,"props":399,"children":400},{"style":133},[401],{"type":25,"value":402},"$",{"type":20,"tag":126,"props":404,"children":405},{"style":138},[406],{"type":25,"value":407}," vagrant",{"type":20,"tag":126,"props":409,"children":410},{"style":138},[411],{"type":25,"value":412}," up\n",{"type":20,"tag":126,"props":414,"children":415},{"class":128,"line":265},[416,420,424],{"type":20,"tag":126,"props":417,"children":418},{"style":133},[419],{"type":25,"value":402},{"type":20,"tag":126,"props":421,"children":422},{"style":138},[423],{"type":25,"value":407},{"type":20,"tag":126,"props":425,"children":426},{"style":138},[427],{"type":25,"value":428}," ssh\n",{"type":20,"tag":126,"props":430,"children":431},{"class":128,"line":274},[432,438,444],{"type":20,"tag":126,"props":433,"children":435},{"style":434},"--shiki-default:#24292E",[436],{"type":25,"value":437},"[vagrant@archlinux ",{"type":20,"tag":126,"props":439,"children":441},{"style":440},"--shiki-default:#D73A49",[442],{"type":25,"value":443},"~",{"type":20,"tag":126,"props":445,"children":446},{"style":434},[447],{"type":25,"value":448},"]$ lsblk\n",{"type":20,"tag":126,"props":450,"children":451},{"class":128,"line":284},[452,457,462,467,472,477,482],{"type":20,"tag":126,"props":453,"children":454},{"style":133},[455],{"type":25,"value":456},"NAME",{"type":20,"tag":126,"props":458,"children":459},{"style":138},[460],{"type":25,"value":461}," MAJ:MIN",{"type":20,"tag":126,"props":463,"children":464},{"style":138},[465],{"type":25,"value":466}," RM",{"type":20,"tag":126,"props":468,"children":469},{"style":138},[470],{"type":25,"value":471}," SIZE",{"type":20,"tag":126,"props":473,"children":474},{"style":138},[475],{"type":25,"value":476}," RO",{"type":20,"tag":126,"props":478,"children":479},{"style":138},[480],{"type":25,"value":481}," TYPE",{"type":20,"tag":126,"props":483,"children":484},{"style":138},[485],{"type":25,"value":486}," MOUNTPOINT\n",{"type":20,"tag":126,"props":488,"children":489},{"class":128,"line":293},[490,495,500,506,511,516],{"type":20,"tag":126,"props":491,"children":492},{"style":133},[493],{"type":25,"value":494},"sda",{"type":20,"tag":126,"props":496,"children":497},{"style":138},[498],{"type":25,"value":499}," 8:0",{"type":20,"tag":126,"props":501,"children":503},{"style":502},"--shiki-default:#005CC5",[504],{"type":25,"value":505}," 0",{"type":20,"tag":126,"props":507,"children":508},{"style":138},[509],{"type":25,"value":510}," 20G",{"type":20,"tag":126,"props":512,"children":513},{"style":502},[514],{"type":25,"value":515}," 0",{"type":20,"tag":126,"props":517,"children":518},{"style":138},[519],{"type":25,"value":520}," disk\n",{"type":20,"tag":126,"props":522,"children":523},{"class":128,"line":302},[524,529,534,538,543,547,552],{"type":20,"tag":126,"props":525,"children":526},{"style":133},[527],{"type":25,"value":528},"├─sda1",{"type":20,"tag":126,"props":530,"children":531},{"style":138},[532],{"type":25,"value":533}," 8:1",{"type":20,"tag":126,"props":535,"children":536},{"style":502},[537],{"type":25,"value":505},{"type":20,"tag":126,"props":539,"children":540},{"style":138},[541],{"type":25,"value":542}," 1.9G",{"type":20,"tag":126,"props":544,"children":545},{"style":502},[546],{"type":25,"value":515},{"type":20,"tag":126,"props":548,"children":549},{"style":138},[550],{"type":25,"value":551}," part",{"type":20,"tag":126,"props":553,"children":554},{"style":434},[555],{"type":25,"value":556}," [SWAP]\n",{"type":20,"tag":126,"props":558,"children":559},{"class":128,"line":311},[560,565,570,574,579,583,587],{"type":20,"tag":126,"props":561,"children":562},{"style":133},[563],{"type":25,"value":564},"└─sda2",{"type":20,"tag":126,"props":566,"children":567},{"style":138},[568],{"type":25,"value":569}," 8:2",{"type":20,"tag":126,"props":571,"children":572},{"style":502},[573],{"type":25,"value":505},{"type":20,"tag":126,"props":575,"children":576},{"style":138},[577],{"type":25,"value":578}," 18.1G",{"type":20,"tag":126,"props":580,"children":581},{"style":502},[582],{"type":25,"value":515},{"type":20,"tag":126,"props":584,"children":585},{"style":138},[586],{"type":25,"value":551},{"type":20,"tag":126,"props":588,"children":589},{"style":138},[590],{"type":25,"value":591}," /\n",{"type":20,"tag":126,"props":593,"children":594},{"class":128,"line":320},[595,600,605,610,615,619],{"type":20,"tag":126,"props":596,"children":597},{"style":133},[598],{"type":25,"value":599},"sdb",{"type":20,"tag":126,"props":601,"children":602},{"style":138},[603],{"type":25,"value":604}," 8:16",{"type":20,"tag":126,"props":606,"children":607},{"style":502},[608],{"type":25,"value":609}," 1",{"type":20,"tag":126,"props":611,"children":612},{"style":138},[613],{"type":25,"value":614}," 28.7G",{"type":20,"tag":126,"props":616,"children":617},{"style":502},[618],{"type":25,"value":515},{"type":20,"tag":126,"props":620,"children":621},{"style":138},[622],{"type":25,"value":520},{"type":20,"tag":126,"props":624,"children":625},{"class":128,"line":329},[626,631,636,640,645,649],{"type":20,"tag":126,"props":627,"children":628},{"style":133},[629],{"type":25,"value":630},"└─sdb1",{"type":20,"tag":126,"props":632,"children":633},{"style":138},[634],{"type":25,"value":635}," 8:17",{"type":20,"tag":126,"props":637,"children":638},{"style":502},[639],{"type":25,"value":609},{"type":20,"tag":126,"props":641,"children":642},{"style":138},[643],{"type":25,"value":644}," 8G",{"type":20,"tag":126,"props":646,"children":647},{"style":502},[648],{"type":25,"value":515},{"type":20,"tag":126,"props":650,"children":651},{"style":138},[652],{"type":25,"value":653}," part\n",{"type":20,"tag":92,"props":655,"children":657},{"id":656},"install-arch-linux-on-the-usb-drive",[658],{"type":25,"value":659},"Install Arch Linux on the USB Drive",{"type":20,"tag":21,"props":661,"children":662},{},[663,665,672],{"type":25,"value":664},"The ",{"type":20,"tag":58,"props":666,"children":669},{"href":667,"rel":668},"https://wiki.archlinux.org/index.php/Installation_guide",[62],[670],{"type":25,"value":671},"Arch Linux Installation Guide",{"type":25,"value":673}," outlines the installation procedure in\ngreat detail -- the following steps follow this closely with a few alteration\ndue to installing onto removable media.",{"type":20,"tag":675,"props":676,"children":678},"h3",{"id":677},"partition-the-disk-uefi-with-gpt",[679],{"type":25,"value":680},"Partition the Disk (UEFI with GPT)",{"type":20,"tag":116,"props":682,"children":684},{"code":683,"language":119,"meta":7,"className":120,"style":7},"[root@archlinux ~]# fdisk /dev/sdb\n",[685],{"type":20,"tag":45,"props":686,"children":687},{"__ignoreMap":7},[688],{"type":20,"tag":126,"props":689,"children":690},{"class":128,"line":129},[691,696,700],{"type":20,"tag":126,"props":692,"children":693},{"style":434},[694],{"type":25,"value":695},"[root@archlinux ",{"type":20,"tag":126,"props":697,"children":698},{"style":440},[699],{"type":25,"value":443},{"type":20,"tag":126,"props":701,"children":702},{"style":434},[703],{"type":25,"value":704},"]# fdisk /dev/sdb\n",{"type":20,"tag":116,"props":706,"children":708},{"code":707,"language":249,"meta":7,"className":250,"style":7},"Command (m for help): p\nDisk /dev/sdb: 28.66 GiB, 30752636928 bytes, 60063744 sectors\nDisk model: Ultra Fit\nUnits: sectors of 1 * 512 = 512 bytes\nSector size (logical/physical): 512 bytes / 512 bytes\nI/O size (minimum/optimal): 512 bytes / 512 bytes\nDisklabel type: gpt\nDisk identifier: E1D6C445-1B79-AB4D-A442-FA4AD6DF4ECC\n\nDevice Start End Sectors Size Type\n/dev/sdb1 2048 1050623 1048576 512M EFI System\n/dev/sdb2 1050624 60063710 59013087 28.1G Linux filesystem\n\nFilesystem/RAID signature on partition 1 will be wiped.\n",[709],{"type":20,"tag":45,"props":710,"children":711},{"__ignoreMap":7},[712,720,728,736,744,752,760,768,776,783,791,799,808,816],{"type":20,"tag":126,"props":713,"children":714},{"class":128,"line":129},[715],{"type":20,"tag":126,"props":716,"children":717},{},[718],{"type":25,"value":719},"Command (m for help): p\n",{"type":20,"tag":126,"props":721,"children":722},{"class":128,"line":265},[723],{"type":20,"tag":126,"props":724,"children":725},{},[726],{"type":25,"value":727},"Disk /dev/sdb: 28.66 GiB, 30752636928 bytes, 60063744 sectors\n",{"type":20,"tag":126,"props":729,"children":730},{"class":128,"line":274},[731],{"type":20,"tag":126,"props":732,"children":733},{},[734],{"type":25,"value":735},"Disk model: Ultra Fit\n",{"type":20,"tag":126,"props":737,"children":738},{"class":128,"line":284},[739],{"type":20,"tag":126,"props":740,"children":741},{},[742],{"type":25,"value":743},"Units: sectors of 1 * 512 = 512 bytes\n",{"type":20,"tag":126,"props":745,"children":746},{"class":128,"line":293},[747],{"type":20,"tag":126,"props":748,"children":749},{},[750],{"type":25,"value":751},"Sector size (logical/physical): 512 bytes / 512 bytes\n",{"type":20,"tag":126,"props":753,"children":754},{"class":128,"line":302},[755],{"type":20,"tag":126,"props":756,"children":757},{},[758],{"type":25,"value":759},"I/O size (minimum/optimal): 512 bytes / 512 bytes\n",{"type":20,"tag":126,"props":761,"children":762},{"class":128,"line":311},[763],{"type":20,"tag":126,"props":764,"children":765},{},[766],{"type":25,"value":767},"Disklabel type: gpt\n",{"type":20,"tag":126,"props":769,"children":770},{"class":128,"line":320},[771],{"type":20,"tag":126,"props":772,"children":773},{},[774],{"type":25,"value":775},"Disk identifier: E1D6C445-1B79-AB4D-A442-FA4AD6DF4ECC\n",{"type":20,"tag":126,"props":777,"children":778},{"class":128,"line":329},[779],{"type":20,"tag":126,"props":780,"children":781},{"emptyLinePlaceholder":278},[782],{"type":25,"value":281},{"type":20,"tag":126,"props":784,"children":785},{"class":128,"line":338},[786],{"type":20,"tag":126,"props":787,"children":788},{},[789],{"type":25,"value":790},"Device Start End Sectors Size Type\n",{"type":20,"tag":126,"props":792,"children":793},{"class":128,"line":347},[794],{"type":20,"tag":126,"props":795,"children":796},{},[797],{"type":25,"value":798},"/dev/sdb1 2048 1050623 1048576 512M EFI System\n",{"type":20,"tag":126,"props":800,"children":802},{"class":128,"line":801},12,[803],{"type":20,"tag":126,"props":804,"children":805},{},[806],{"type":25,"value":807},"/dev/sdb2 1050624 60063710 59013087 28.1G Linux filesystem\n",{"type":20,"tag":126,"props":809,"children":811},{"class":128,"line":810},13,[812],{"type":20,"tag":126,"props":813,"children":814},{"emptyLinePlaceholder":278},[815],{"type":25,"value":281},{"type":20,"tag":126,"props":817,"children":819},{"class":128,"line":818},14,[820],{"type":20,"tag":126,"props":821,"children":822},{},[823],{"type":25,"value":824},"Filesystem/RAID signature on partition 1 will be wiped.\n",{"type":20,"tag":675,"props":826,"children":828},{"id":827},"format-the-partitions",[829],{"type":25,"value":830},"Format the Partitions",{"type":20,"tag":21,"props":832,"children":833},{},[834,836],{"type":25,"value":835},"The UEFI specification mandates support for FAT file-systems, and FAT32 is\nrecommended for removable media. ",{"type":20,"tag":54,"props":837,"children":838},{},[839],{"type":20,"tag":58,"props":840,"children":843},{"href":841,"rel":842},"https://wiki.archlinux.org/index.php/EFI_system_partition#Format_the_partition",[62],[844],{"type":25,"value":845},"7",{"type":20,"tag":116,"props":847,"children":849},{"code":848,"language":119,"meta":7,"className":120,"style":7},"[root@archlinux ~]# pacman -Sy dosfstools\n[root@archlinux ~]# mkfs.fat -F32 /dev/sdb1\n",[850],{"type":20,"tag":45,"props":851,"children":852},{"__ignoreMap":7},[853,869],{"type":20,"tag":126,"props":854,"children":855},{"class":128,"line":129},[856,860,864],{"type":20,"tag":126,"props":857,"children":858},{"style":434},[859],{"type":25,"value":695},{"type":20,"tag":126,"props":861,"children":862},{"style":440},[863],{"type":25,"value":443},{"type":20,"tag":126,"props":865,"children":866},{"style":434},[867],{"type":25,"value":868},"]# pacman -Sy dosfstools\n",{"type":20,"tag":126,"props":870,"children":871},{"class":128,"line":265},[872,876,880],{"type":20,"tag":126,"props":873,"children":874},{"style":434},[875],{"type":25,"value":695},{"type":20,"tag":126,"props":877,"children":878},{"style":440},[879],{"type":25,"value":443},{"type":20,"tag":126,"props":881,"children":882},{"style":434},[883],{"type":25,"value":884},"]# mkfs.fat -F32 /dev/sdb1\n",{"type":20,"tag":21,"props":886,"children":887},{},[888,890,896,898],{"type":25,"value":889},"As for the root partition, it is recommended to use ",{"type":20,"tag":45,"props":891,"children":893},{"className":892},[],[894],{"type":25,"value":895},"ext4",{"type":25,"value":897}," without a journal to\nreduce the reads and writes to the file-system as this is detrimental to the\nflash-based USB drive. ",{"type":20,"tag":54,"props":899,"children":900},{},[901],{"type":20,"tag":58,"props":902,"children":905},{"href":903,"rel":904},"https://wiki.archlinux.org/index.php/Install_Arch_Linux_on_a_USB_key#Installation_tweaks",[62],[906],{"type":25,"value":907},"8",{"type":20,"tag":116,"props":909,"children":911},{"code":910,"language":119,"meta":7,"className":120,"style":7},"[root@archlinux ~]# mkfs.ext4 -O \"^has_journal\" /dev/sdb2\n",[912],{"type":20,"tag":45,"props":913,"children":914},{"__ignoreMap":7},[915],{"type":20,"tag":126,"props":916,"children":917},{"class":128,"line":129},[918,922,926,931,936],{"type":20,"tag":126,"props":919,"children":920},{"style":434},[921],{"type":25,"value":695},{"type":20,"tag":126,"props":923,"children":924},{"style":440},[925],{"type":25,"value":443},{"type":20,"tag":126,"props":927,"children":928},{"style":434},[929],{"type":25,"value":930},"]# mkfs.ext4 -O ",{"type":20,"tag":126,"props":932,"children":933},{"style":138},[934],{"type":25,"value":935},"\"^has_journal\"",{"type":20,"tag":126,"props":937,"children":938},{"style":434},[939],{"type":25,"value":940}," /dev/sdb2\n",{"type":20,"tag":675,"props":942,"children":944},{"id":943},"mount-the-partitions-and-bootstrap-the-environment",[945],{"type":25,"value":946},"Mount the Partitions and Bootstrap the Environment",{"type":20,"tag":116,"props":948,"children":950},{"code":949,"language":119,"meta":7,"className":120,"style":7},"[root@archlinux ~]# mount /dev/sdb2 /mnt\n[root@archlinux ~]# mkdir -p /mnt/boot/efi\n[root@archlinux ~]# mount /dev/sdb1 /mnt/boot/efi\n",[951],{"type":20,"tag":45,"props":952,"children":953},{"__ignoreMap":7},[954,970,986],{"type":20,"tag":126,"props":955,"children":956},{"class":128,"line":129},[957,961,965],{"type":20,"tag":126,"props":958,"children":959},{"style":434},[960],{"type":25,"value":695},{"type":20,"tag":126,"props":962,"children":963},{"style":440},[964],{"type":25,"value":443},{"type":20,"tag":126,"props":966,"children":967},{"style":434},[968],{"type":25,"value":969},"]# mount /dev/sdb2 /mnt\n",{"type":20,"tag":126,"props":971,"children":972},{"class":128,"line":265},[973,977,981],{"type":20,"tag":126,"props":974,"children":975},{"style":434},[976],{"type":25,"value":695},{"type":20,"tag":126,"props":978,"children":979},{"style":440},[980],{"type":25,"value":443},{"type":20,"tag":126,"props":982,"children":983},{"style":434},[984],{"type":25,"value":985},"]# mkdir -p /mnt/boot/efi\n",{"type":20,"tag":126,"props":987,"children":988},{"class":128,"line":274},[989,993,997],{"type":20,"tag":126,"props":990,"children":991},{"style":434},[992],{"type":25,"value":695},{"type":20,"tag":126,"props":994,"children":995},{"style":440},[996],{"type":25,"value":443},{"type":20,"tag":126,"props":998,"children":999},{"style":434},[1000],{"type":25,"value":1001},"]# mount /dev/sdb1 /mnt/boot/efi\n",{"type":20,"tag":116,"props":1003,"children":1005},{"code":1004,"language":119,"meta":7,"className":120,"style":7},"[root@archlinux ~]# pacman -S arch-install-scripts\n[root@archlinux ~]# pacstrap /mnt base linux linux-firmware\n[root@archlinux ~]# genfstab -U /mnt >> /mnt/etc/fstab\n",[1006],{"type":20,"tag":45,"props":1007,"children":1008},{"__ignoreMap":7},[1009,1025,1041],{"type":20,"tag":126,"props":1010,"children":1011},{"class":128,"line":129},[1012,1016,1020],{"type":20,"tag":126,"props":1013,"children":1014},{"style":434},[1015],{"type":25,"value":695},{"type":20,"tag":126,"props":1017,"children":1018},{"style":440},[1019],{"type":25,"value":443},{"type":20,"tag":126,"props":1021,"children":1022},{"style":434},[1023],{"type":25,"value":1024},"]# pacman -S arch-install-scripts\n",{"type":20,"tag":126,"props":1026,"children":1027},{"class":128,"line":265},[1028,1032,1036],{"type":20,"tag":126,"props":1029,"children":1030},{"style":434},[1031],{"type":25,"value":695},{"type":20,"tag":126,"props":1033,"children":1034},{"style":440},[1035],{"type":25,"value":443},{"type":20,"tag":126,"props":1037,"children":1038},{"style":434},[1039],{"type":25,"value":1040},"]# pacstrap /mnt base linux linux-firmware\n",{"type":20,"tag":126,"props":1042,"children":1043},{"class":128,"line":274},[1044,1048,1052,1057,1062],{"type":20,"tag":126,"props":1045,"children":1046},{"style":434},[1047],{"type":25,"value":695},{"type":20,"tag":126,"props":1049,"children":1050},{"style":440},[1051],{"type":25,"value":443},{"type":20,"tag":126,"props":1053,"children":1054},{"style":434},[1055],{"type":25,"value":1056},"]# genfstab -U /mnt ",{"type":20,"tag":126,"props":1058,"children":1059},{"style":440},[1060],{"type":25,"value":1061},">>",{"type":20,"tag":126,"props":1063,"children":1064},{"style":434},[1065],{"type":25,"value":1066}," /mnt/etc/fstab\n",{"type":20,"tag":675,"props":1068,"children":1070},{"id":1069},"configure-the-new-environment",[1071],{"type":25,"value":1072},"Configure the New Environment",{"type":20,"tag":116,"props":1074,"children":1076},{"code":1075},"[root@archlinux ~]# arch-chroot /mnt\n",[1077],{"type":20,"tag":45,"props":1078,"children":1079},{"__ignoreMap":7},[1080],{"type":25,"value":1075},{"type":20,"tag":116,"props":1082,"children":1084},{"code":1083},"[root@archlinux /]# ln -sf /usr/share/zoneinfo/US/Eastern /etc/localtime\n[root@archlinux /]# hwclock --systohc\n[root@archlinux /]# sed -i 's/#en_US.UTF-8/en_US.UTF-8/' /etc/locale.gen\n[root@archlinux /]# locale-gen\n[root@archlinux /]# echo \"LANG=en_US.UTF-8\" > /etc/locale.conf\n",[1085],{"type":20,"tag":45,"props":1086,"children":1087},{"__ignoreMap":7},[1088],{"type":25,"value":1083},{"type":20,"tag":116,"props":1090,"children":1092},{"code":1091},"[root@archlinux /]# hostnamectl set-hostname usb\n[root@archlinux /]# echo \"127.0.0.1 localhost\" >> /etc/hosts\n[root@archlinux /]# echo \"::1 localhost\" >> /etc/hosts\n",[1093],{"type":20,"tag":45,"props":1094,"children":1095},{"__ignoreMap":7},[1096],{"type":25,"value":1091},{"type":20,"tag":21,"props":1098,"children":1099},{},[1100,1102,1108,1110],{"type":25,"value":1101},"Note, one difference here from a standard installation is that the\n",{"type":20,"tag":45,"props":1103,"children":1105},{"className":1104},[],[1106],{"type":25,"value":1107},"--removable",{"type":25,"value":1109}," flag is specified when installing the GRUB bootloader.\n",{"type":20,"tag":54,"props":1111,"children":1112},{},[1113],{"type":20,"tag":58,"props":1114,"children":1117},{"href":1115,"rel":1116},"https://wiki.archlinux.org/index.php/GRUB#UEFI_systems",[62],[1118],{"type":25,"value":1119},"10",{"type":20,"tag":116,"props":1121,"children":1123},{"code":1122},"[root@archlinux /]# pacman -S grub\n[root@archlinux /]# grub-install --target=x86_64-efi --efi-directory=/boot/efi --removable --recheck\n[root@usb /]# grub-mkconfig -o /boot/grub/grub.cfg\n",[1124],{"type":20,"tag":45,"props":1125,"children":1126},{"__ignoreMap":7},[1127],{"type":25,"value":1122},{"type":20,"tag":21,"props":1129,"children":1130},{},[1131],{"type":25,"value":1132},"Shutdown the virtual machine, restart the host machine, and boot the newly\ncreated Arch Linux thumb-drive!",{"type":20,"tag":21,"props":1134,"children":1135},{},[1136],{"type":25,"value":1137},"🎉",{"type":20,"tag":92,"props":1139,"children":1141},{"id":1140},"side-note",[1142],{"type":25,"value":1143},"Side-note",{"type":20,"tag":21,"props":1145,"children":1146},{},[1147,1149,1155,1157,1162,1164],{"type":25,"value":1148},"It was attempted to use the ",{"type":20,"tag":45,"props":1150,"children":1152},{"className":1151},[],[1153],{"type":25,"value":1154},"controlvm usbattach",{"type":25,"value":1156}," command to pass the USB\ndevice to the guest machine, but this did not work as it expects the virtual\nmachine to already be running, and the ",{"type":20,"tag":45,"props":1158,"children":1160},{"className":1159},[],[1161],{"type":25,"value":236},{"type":25,"value":1163}," option runs prior to\nbooting the machine. ",{"type":20,"tag":54,"props":1165,"children":1166},{},[1167],{"type":20,"tag":58,"props":1168,"children":1171},{"href":1169,"rel":1170},"https://www.vagrantup.com/docs/virtualbox/configuration.html#vboxmanage-customizations",[62],[1172],{"type":25,"value":1173},"11",{"type":20,"tag":116,"props":1175,"children":1177},{"code":1176,"language":249,"meta":7,"className":250,"style":7},"Command: [\"controlvm\", \"060a716b-1965-49e2-bc56-12beed5df716\", \"usbattach36fc9e60-c465-11cf-8056-444553540000\"]\n\nStderr: VBoxManage.exe: error: Machine '060a716b-1965-49e2-bc56-12beed5df716' is not currently running.\n",[1178],{"type":20,"tag":45,"props":1179,"children":1180},{"__ignoreMap":7},[1181,1189,1196],{"type":20,"tag":126,"props":1182,"children":1183},{"class":128,"line":129},[1184],{"type":20,"tag":126,"props":1185,"children":1186},{},[1187],{"type":25,"value":1188},"Command: [\"controlvm\", \"060a716b-1965-49e2-bc56-12beed5df716\", \"usbattach36fc9e60-c465-11cf-8056-444553540000\"]\n",{"type":20,"tag":126,"props":1190,"children":1191},{"class":128,"line":265},[1192],{"type":20,"tag":126,"props":1193,"children":1194},{"emptyLinePlaceholder":278},[1195],{"type":25,"value":281},{"type":20,"tag":126,"props":1197,"children":1198},{"class":128,"line":274},[1199],{"type":20,"tag":126,"props":1200,"children":1201},{},[1202],{"type":25,"value":1203},"Stderr: VBoxManage.exe: error: Machine '060a716b-1965-49e2-bc56-12beed5df716' is not currently running.\n",{"type":20,"tag":92,"props":1205,"children":1207},{"id":1206},"references",[1208],{"type":25,"value":1209},"References",{"type":20,"tag":1211,"props":1212,"children":1213},"ol",{},[1214,1224,1233,1242,1251,1260,1269,1278,1287,1296,1305],{"type":20,"tag":1215,"props":1216,"children":1217},"li",{},[1218],{"type":20,"tag":58,"props":1219,"children":1221},{"href":60,"rel":1220},[62],[1222],{"type":25,"value":1223},"Docker Desktop on Mac vs. Docker Toolbox",{"type":20,"tag":1215,"props":1225,"children":1226},{},[1227],{"type":20,"tag":58,"props":1228,"children":1230},{"href":70,"rel":1229},[62],[1231],{"type":25,"value":1232},"GitHub - HyperKit",{"type":20,"tag":1215,"props":1234,"children":1235},{},[1236],{"type":20,"tag":58,"props":1237,"children":1239},{"href":78,"rel":1238},[62],[1240],{"type":25,"value":1241},"GitHub - Docker for Mac - Issue #900",{"type":20,"tag":1215,"props":1243,"children":1244},{},[1245],{"type":20,"tag":58,"props":1246,"children":1248},{"href":108,"rel":1247},[62],[1249],{"type":25,"value":1250},"Vagrant Cloud - Arch Linux",{"type":20,"tag":1215,"props":1252,"children":1253},{},[1254],{"type":20,"tag":58,"props":1255,"children":1257},{"href":216,"rel":1256},[62],[1258],{"type":25,"value":1259},"Attaching USB Devices to VirtualBox Guests using VBoxManage",{"type":20,"tag":1215,"props":1261,"children":1262},{},[1263],{"type":20,"tag":58,"props":1264,"children":1266},{"href":224,"rel":1265},[62],[1267],{"type":25,"value":1268},"GitHub Gist - Vagrant USB Filter",{"type":20,"tag":1215,"props":1270,"children":1271},{},[1272],{"type":20,"tag":58,"props":1273,"children":1275},{"href":841,"rel":1274},[62],[1276],{"type":25,"value":1277},"Arch Linux Wiki - EFI System Partition - Format Partitions",{"type":20,"tag":1215,"props":1279,"children":1280},{},[1281],{"type":20,"tag":58,"props":1282,"children":1284},{"href":903,"rel":1283},[62],[1285],{"type":25,"value":1286},"Arch Linux Wiki - Arch Linux on USB - Installation Tweaks",{"type":20,"tag":1215,"props":1288,"children":1289},{},[1290],{"type":20,"tag":58,"props":1291,"children":1293},{"href":667,"rel":1292},[62],[1294],{"type":25,"value":1295},"Arch Linux Wiki - Installation Guide",{"type":20,"tag":1215,"props":1297,"children":1298},{},[1299],{"type":20,"tag":58,"props":1300,"children":1302},{"href":1115,"rel":1301},[62],[1303],{"type":25,"value":1304},"Arch Linux Wiki - GRUB - UEFI Systems",{"type":20,"tag":1215,"props":1306,"children":1307},{},[1308],{"type":20,"tag":58,"props":1309,"children":1311},{"href":1169,"rel":1310},[62],[1312],{"type":25,"value":1313},"Vagrant VBoxManage Customizations ",{"type":20,"tag":1315,"props":1316,"children":1317},"style",{},[1318],{"type":25,"value":1319},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":265,"depth":265,"links":1321},[1322,1323,1329,1330],{"id":94,"depth":265,"text":97},{"id":656,"depth":265,"text":659,"children":1324},[1325,1326,1327,1328],{"id":677,"depth":274,"text":680},{"id":827,"depth":274,"text":830},{"id":943,"depth":274,"text":946},{"id":1069,"depth":274,"text":1072},{"id":1140,"depth":265,"text":1143},{"id":1206,"depth":265,"text":1209},"markdown","content:articles:persistent-archlinux-usb.md","content","articles/persistent-archlinux-usb.md","md",1718681824685] \ No newline at end of file diff --git a/articles/persistent-archlinux-usb/index.html b/articles/persistent-archlinux-usb/index.html index 86132c5e..12ebd3f6 100644 --- a/articles/persistent-archlinux-usb/index.html +++ b/articles/persistent-archlinux-usb/index.html @@ -4,36 +4,36 @@ - - + + - - - - + + + + - + - - - - - - - - - - - - - - - - - -

        Create a Persistent Arch Linux Bootable USB with Vagrant

        2020-01-09

        When installing a linux distribution, it is common for the instructions to have + + + + + + + + + + + + + + + + + +

        Create a Persistent Arch Linux Bootable USB with Vagrant

        2020-01-09

        When installing a linux distribution, it is common for the instructions to have the user create a bootable USB, boot from the device, and proceed with the installation procedure from that live medium. However, this blog post will outline an alternative approach where a virtual machine created with Vagrant @@ -123,5 +123,5 @@ booting the machine. 11

        Command: ["controlvm", "060a716b-1965-49e2-bc56-12beed5df716", "usbattach36fc9e60-c465-11cf-8056-444553540000"]
         
         Stderr: VBoxManage.exe: error: Machine '060a716b-1965-49e2-bc56-12beed5df716' is not currently running.
        -

        References

        1. Docker Desktop on Mac vs. Docker Toolbox
        2. GitHub - HyperKit
        3. GitHub - Docker for Mac - Issue #900
        4. Vagrant Cloud - Arch Linux
        5. Attaching USB Devices to VirtualBox Guests using VBoxManage
        6. GitHub Gist - Vagrant USB Filter
        7. Arch Linux Wiki - EFI System Partition - Format Partitions
        8. Arch Linux Wiki - Arch Linux on USB - Installation Tweaks
        9. Arch Linux Wiki - Installation Guide
        10. Arch Linux Wiki - GRUB - UEFI Systems
        11. Vagrant VBoxManage Customizations
        - \ No newline at end of file +

        References

        1. Docker Desktop on Mac vs. Docker Toolbox
        2. GitHub - HyperKit
        3. GitHub - Docker for Mac - Issue #900
        4. Vagrant Cloud - Arch Linux
        5. Attaching USB Devices to VirtualBox Guests using VBoxManage
        6. GitHub Gist - Vagrant USB Filter
        7. Arch Linux Wiki - EFI System Partition - Format Partitions
        8. Arch Linux Wiki - Arch Linux on USB - Installation Tweaks
        9. Arch Linux Wiki - Installation Guide
        10. Arch Linux Wiki - GRUB - UEFI Systems
        11. Vagrant VBoxManage Customizations
        + \ No newline at end of file diff --git a/articles/podcast-transcription-whispercpp/_payload.json b/articles/podcast-transcription-whispercpp/_payload.json index d4f1ab3b..335e583f 100644 --- a/articles/podcast-transcription-whispercpp/_payload.json +++ b/articles/podcast-transcription-whispercpp/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":749},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"draft":6,"date":10,"tags":11,"categories":14,"excerpt":16,"body":55,"_type":744,"_id":745,"_source":746,"_file":747,"_extension":748},"/articles/podcast-transcription-whispercpp","articles",false,"","Easily Transcribe Podcasts with Whisper.cpp","If you've ever had the need to transcribe a podcast, lecture, or some other audio recording, it turns out it's surprisingly easy with the extremely impressive whisper.cpp project. This high-performance fork of OpenAI's Whisper can run on all sorts of hardware -- including my M1 Mac Mini. Let's walk through an example from start-to-finish of transcribing an episode of the Alter Everything podcast.","2024-01-08",[12,13],"whisper.cpp","ml",[15],"programming",{"type":17,"children":18},"root",[19],{"type":20,"tag":21,"props":22,"children":23},"element","p",{},[24,27,35,37,44,46,53],{"type":25,"value":26},"text","If you've ever had the need to transcribe a podcast, lecture, or some other audio recording, it turns out it's surprisingly easy with the extremely impressive ",{"type":20,"tag":28,"props":29,"children":33},"a",{"href":30,"rel":31},"https://github.com/ggerganov/whisper.cpp",[32],"nofollow",[34],{"type":25,"value":12},{"type":25,"value":36}," project. This high-performance fork of ",{"type":20,"tag":28,"props":38,"children":41},{"href":39,"rel":40},"https://github.com/openai/whisper",[32],[42],{"type":25,"value":43},"OpenAI's Whisper",{"type":25,"value":45}," can run on all sorts of hardware -- including my M1 Mac Mini. Let's walk through an example from start-to-finish of transcribing an episode of the ",{"type":20,"tag":28,"props":47,"children":50},{"href":48,"rel":49},"https://podcasts.apple.com/us/podcast/alter-everything/id1356137854",[32],[51],{"type":25,"value":52},"Alter Everything",{"type":25,"value":54}," podcast.",{"type":17,"children":56,"toc":739},[57,79,86,130,222,234,399,412,424,550,555,720,725,733],{"type":20,"tag":21,"props":58,"children":59},{},[60,61,66,67,72,73,78],{"type":25,"value":26},{"type":20,"tag":28,"props":62,"children":64},{"href":30,"rel":63},[32],[65],{"type":25,"value":12},{"type":25,"value":36},{"type":20,"tag":28,"props":68,"children":70},{"href":39,"rel":69},[32],[71],{"type":25,"value":43},{"type":25,"value":45},{"type":20,"tag":28,"props":74,"children":76},{"href":48,"rel":75},[32],[77],{"type":25,"value":52},{"type":25,"value":54},{"type":20,"tag":80,"props":81,"children":83},"h2",{"id":82},"obtain-audio-files",[84],{"type":25,"value":85},"Obtain Audio File(s)",{"type":20,"tag":21,"props":87,"children":88},{},[89,91,98,100,106,108,113,115,120,122,128],{"type":25,"value":90},"First, let's get the ",{"type":20,"tag":92,"props":93,"children":95},"code",{"className":94},[],[96],{"type":25,"value":97},"wav",{"type":25,"value":99}," file from YouTube using the ",{"type":20,"tag":92,"props":101,"children":103},{"className":102},[],[104],{"type":25,"value":105},"youtube-dl",{"type":25,"value":107}," utility. It should be noted that ",{"type":20,"tag":92,"props":109,"children":111},{"className":110},[],[112],{"type":25,"value":12},{"type":25,"value":114}," expects ",{"type":20,"tag":92,"props":116,"children":118},{"className":117},[],[119],{"type":25,"value":97},{"type":25,"value":121}," filetypes, and this utility defaults to ",{"type":20,"tag":92,"props":123,"children":125},{"className":124},[],[126],{"type":25,"value":127},"mp3",{"type":25,"value":129},".",{"type":20,"tag":131,"props":132,"children":136},"pre",{"code":133,"language":134,"meta":7,"className":135,"style":7}," $ youtube-dl \\\n --extract-audio \\\n --audio-format wav \\\n --output podcast.wav \\\n \"https://www.youtube.com/watch?v=CoUN690wSYQ\"\n","sh","language-sh shiki shiki-themes github-light",[137],{"type":20,"tag":92,"props":138,"children":139},{"__ignoreMap":7},[140,164,177,195,213],{"type":20,"tag":141,"props":142,"children":145},"span",{"class":143,"line":144},"line",1,[146,152,158],{"type":20,"tag":141,"props":147,"children":149},{"style":148},"--shiki-default:#6F42C1",[150],{"type":25,"value":151}," $",{"type":20,"tag":141,"props":153,"children":155},{"style":154},"--shiki-default:#032F62",[156],{"type":25,"value":157}," youtube-dl",{"type":20,"tag":141,"props":159,"children":161},{"style":160},"--shiki-default:#005CC5",[162],{"type":25,"value":163}," \\\n",{"type":20,"tag":141,"props":165,"children":167},{"class":143,"line":166},2,[168,173],{"type":20,"tag":141,"props":169,"children":170},{"style":160},[171],{"type":25,"value":172}," --extract-audio",{"type":20,"tag":141,"props":174,"children":175},{"style":160},[176],{"type":25,"value":163},{"type":20,"tag":141,"props":178,"children":180},{"class":143,"line":179},3,[181,186,191],{"type":20,"tag":141,"props":182,"children":183},{"style":160},[184],{"type":25,"value":185}," --audio-format",{"type":20,"tag":141,"props":187,"children":188},{"style":154},[189],{"type":25,"value":190}," wav",{"type":20,"tag":141,"props":192,"children":193},{"style":160},[194],{"type":25,"value":163},{"type":20,"tag":141,"props":196,"children":198},{"class":143,"line":197},4,[199,204,209],{"type":20,"tag":141,"props":200,"children":201},{"style":160},[202],{"type":25,"value":203}," --output",{"type":20,"tag":141,"props":205,"children":206},{"style":154},[207],{"type":25,"value":208}," podcast.wav",{"type":20,"tag":141,"props":210,"children":211},{"style":160},[212],{"type":25,"value":163},{"type":20,"tag":141,"props":214,"children":216},{"class":143,"line":215},5,[217],{"type":20,"tag":141,"props":218,"children":219},{"style":154},[220],{"type":25,"value":221}," \"https://www.youtube.com/watch?v=CoUN690wSYQ\"\n",{"type":20,"tag":21,"props":223,"children":224},{},[225,227,232],{"type":25,"value":226},"This file has a 44.1 kHz sample rate, and ",{"type":20,"tag":92,"props":228,"children":230},{"className":229},[],[231],{"type":25,"value":12},{"type":25,"value":233}," expects 16 kHz, so let's go ahead and convert that.",{"type":20,"tag":131,"props":235,"children":237},{"code":236,"language":134,"meta":7,"className":135,"style":7}," $ file podcast.wav\npodcast.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 44100 Hz\n\n $ ffmpeg -i podcast.wav -ar 16000 podcast-16khz.wav\n\n $ file podcast-16khz.wav\npodcast-16khz.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 16000 Hz\n\n# NOTE: it looks like it's possible to specify this conversion as a post-process as a\n# flag to the `youtube-dl` command -- I will explore this further next time...\n# youtube-dl --extract-audio --audio-quality 0 --audio-format mp3 --postprocessor-args \"-ar 44100\" %dl%\n",[238],{"type":20,"tag":92,"props":239,"children":240},{"__ignoreMap":7},[241,258,277,286,322,329,345,363,371,381,390],{"type":20,"tag":141,"props":242,"children":243},{"class":143,"line":144},[244,248,253],{"type":20,"tag":141,"props":245,"children":246},{"style":148},[247],{"type":25,"value":151},{"type":20,"tag":141,"props":249,"children":250},{"style":154},[251],{"type":25,"value":252}," file",{"type":20,"tag":141,"props":254,"children":255},{"style":154},[256],{"type":25,"value":257}," podcast.wav\n",{"type":20,"tag":141,"props":259,"children":260},{"class":143,"line":166},[261,266,271],{"type":20,"tag":141,"props":262,"children":263},{"style":148},[264],{"type":25,"value":265},"podcast.wav:",{"type":20,"tag":141,"props":267,"children":268},{"style":154},[269],{"type":25,"value":270}," RIFF",{"type":20,"tag":141,"props":272,"children":274},{"style":273},"--shiki-default:#24292E",[275],{"type":25,"value":276}," (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 44100 Hz\n",{"type":20,"tag":141,"props":278,"children":279},{"class":143,"line":179},[280],{"type":20,"tag":141,"props":281,"children":283},{"emptyLinePlaceholder":282},true,[284],{"type":25,"value":285},"\n",{"type":20,"tag":141,"props":287,"children":288},{"class":143,"line":197},[289,293,298,303,307,312,317],{"type":20,"tag":141,"props":290,"children":291},{"style":148},[292],{"type":25,"value":151},{"type":20,"tag":141,"props":294,"children":295},{"style":154},[296],{"type":25,"value":297}," ffmpeg",{"type":20,"tag":141,"props":299,"children":300},{"style":160},[301],{"type":25,"value":302}," -i",{"type":20,"tag":141,"props":304,"children":305},{"style":154},[306],{"type":25,"value":208},{"type":20,"tag":141,"props":308,"children":309},{"style":160},[310],{"type":25,"value":311}," -ar",{"type":20,"tag":141,"props":313,"children":314},{"style":160},[315],{"type":25,"value":316}," 16000",{"type":20,"tag":141,"props":318,"children":319},{"style":154},[320],{"type":25,"value":321}," podcast-16khz.wav\n",{"type":20,"tag":141,"props":323,"children":324},{"class":143,"line":215},[325],{"type":20,"tag":141,"props":326,"children":327},{"emptyLinePlaceholder":282},[328],{"type":25,"value":285},{"type":20,"tag":141,"props":330,"children":332},{"class":143,"line":331},6,[333,337,341],{"type":20,"tag":141,"props":334,"children":335},{"style":148},[336],{"type":25,"value":151},{"type":20,"tag":141,"props":338,"children":339},{"style":154},[340],{"type":25,"value":252},{"type":20,"tag":141,"props":342,"children":343},{"style":154},[344],{"type":25,"value":321},{"type":20,"tag":141,"props":346,"children":348},{"class":143,"line":347},7,[349,354,358],{"type":20,"tag":141,"props":350,"children":351},{"style":148},[352],{"type":25,"value":353},"podcast-16khz.wav:",{"type":20,"tag":141,"props":355,"children":356},{"style":154},[357],{"type":25,"value":270},{"type":20,"tag":141,"props":359,"children":360},{"style":273},[361],{"type":25,"value":362}," (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 16000 Hz\n",{"type":20,"tag":141,"props":364,"children":366},{"class":143,"line":365},8,[367],{"type":20,"tag":141,"props":368,"children":369},{"emptyLinePlaceholder":282},[370],{"type":25,"value":285},{"type":20,"tag":141,"props":372,"children":374},{"class":143,"line":373},9,[375],{"type":20,"tag":141,"props":376,"children":378},{"style":377},"--shiki-default:#6A737D",[379],{"type":25,"value":380},"# NOTE: it looks like it's possible to specify this conversion as a post-process as a\n",{"type":20,"tag":141,"props":382,"children":384},{"class":143,"line":383},10,[385],{"type":20,"tag":141,"props":386,"children":387},{"style":377},[388],{"type":25,"value":389},"# flag to the `youtube-dl` command -- I will explore this further next time...\n",{"type":20,"tag":141,"props":391,"children":393},{"class":143,"line":392},11,[394],{"type":20,"tag":141,"props":395,"children":396},{"style":377},[397],{"type":25,"value":398},"# youtube-dl --extract-audio --audio-quality 0 --audio-format mp3 --postprocessor-args \"-ar 44100\" %dl%\n",{"type":20,"tag":80,"props":400,"children":402},{"id":401},"build-whispercpp-transcribe-audio",[403,405,410],{"type":25,"value":404},"Build ",{"type":20,"tag":92,"props":406,"children":408},{"className":407},[],[409],{"type":25,"value":12},{"type":25,"value":411}," & Transcribe Audio",{"type":20,"tag":21,"props":413,"children":414},{},[415,417,422],{"type":25,"value":416},"Then, let's get the latest version of ",{"type":20,"tag":92,"props":418,"children":420},{"className":419},[],[421],{"type":25,"value":12},{"type":25,"value":423},", download the English Whisper model, and build the example.",{"type":20,"tag":131,"props":425,"children":427},{"code":426,"language":134,"meta":7,"className":135,"style":7},"# Clone the `whisper.cpp` repository\n $ git clone --depth 1 git@github.com:ggerganov/whisper.cpp && cd whisper.cpp\n\n# Download the English Whisper model in `ggml` format\n $ bash ./models/download-ggml-model.sh base.en\n\n# Build the main example\n $ make\n",[428],{"type":20,"tag":92,"props":429,"children":430},{"__ignoreMap":7},[431,439,486,493,501,523,530,538],{"type":20,"tag":141,"props":432,"children":433},{"class":143,"line":144},[434],{"type":20,"tag":141,"props":435,"children":436},{"style":377},[437],{"type":25,"value":438},"# Clone the `whisper.cpp` repository\n",{"type":20,"tag":141,"props":440,"children":441},{"class":143,"line":166},[442,446,451,456,461,466,471,476,481],{"type":20,"tag":141,"props":443,"children":444},{"style":148},[445],{"type":25,"value":151},{"type":20,"tag":141,"props":447,"children":448},{"style":154},[449],{"type":25,"value":450}," git",{"type":20,"tag":141,"props":452,"children":453},{"style":154},[454],{"type":25,"value":455}," clone",{"type":20,"tag":141,"props":457,"children":458},{"style":160},[459],{"type":25,"value":460}," --depth",{"type":20,"tag":141,"props":462,"children":463},{"style":160},[464],{"type":25,"value":465}," 1",{"type":20,"tag":141,"props":467,"children":468},{"style":154},[469],{"type":25,"value":470}," git@github.com:ggerganov/whisper.cpp",{"type":20,"tag":141,"props":472,"children":473},{"style":273},[474],{"type":25,"value":475}," && ",{"type":20,"tag":141,"props":477,"children":478},{"style":160},[479],{"type":25,"value":480},"cd",{"type":20,"tag":141,"props":482,"children":483},{"style":154},[484],{"type":25,"value":485}," whisper.cpp\n",{"type":20,"tag":141,"props":487,"children":488},{"class":143,"line":179},[489],{"type":20,"tag":141,"props":490,"children":491},{"emptyLinePlaceholder":282},[492],{"type":25,"value":285},{"type":20,"tag":141,"props":494,"children":495},{"class":143,"line":197},[496],{"type":20,"tag":141,"props":497,"children":498},{"style":377},[499],{"type":25,"value":500},"# Download the English Whisper model in `ggml` format\n",{"type":20,"tag":141,"props":502,"children":503},{"class":143,"line":215},[504,508,513,518],{"type":20,"tag":141,"props":505,"children":506},{"style":148},[507],{"type":25,"value":151},{"type":20,"tag":141,"props":509,"children":510},{"style":154},[511],{"type":25,"value":512}," bash",{"type":20,"tag":141,"props":514,"children":515},{"style":154},[516],{"type":25,"value":517}," ./models/download-ggml-model.sh",{"type":20,"tag":141,"props":519,"children":520},{"style":154},[521],{"type":25,"value":522}," base.en\n",{"type":20,"tag":141,"props":524,"children":525},{"class":143,"line":331},[526],{"type":20,"tag":141,"props":527,"children":528},{"emptyLinePlaceholder":282},[529],{"type":25,"value":285},{"type":20,"tag":141,"props":531,"children":532},{"class":143,"line":347},[533],{"type":20,"tag":141,"props":534,"children":535},{"style":377},[536],{"type":25,"value":537},"# Build the main example\n",{"type":20,"tag":141,"props":539,"children":540},{"class":143,"line":365},[541,545],{"type":20,"tag":141,"props":542,"children":543},{"style":148},[544],{"type":25,"value":151},{"type":20,"tag":141,"props":546,"children":547},{"style":154},[548],{"type":25,"value":549}," make\n",{"type":20,"tag":21,"props":551,"children":552},{},[553],{"type":25,"value":554},"And finally, let's transcribe that podcast!",{"type":20,"tag":131,"props":556,"children":558},{"code":557,"language":134,"meta":7,"className":135,"style":7}," $ ./main \\\n -m ~/workspace/whisper.cpp/models/ggml-base.en.bin \\\n -f ~/Downloads/podcast-16khz.wav \\\n --output-vtt \\\n --output-file out\n\n# whisper_print_timings: load time = 114.71 ms\n# whisper_print_timings: fallbacks = 0 p / 0 h\n# whisper_print_timings: mel time = 692.20 ms\n# whisper_print_timings: sample time = 22278.10 ms / 27893 runs ( 0.80 ms per run)\n# whisper_print_timings: encode time = 10000.75 ms / 55 runs ( 181.83 ms per run)\n# whisper_print_timings: decode time = 331.77 ms / 54 runs ( 6.14 ms per run)\n# whisper_print_timings: batchd time = 45236.73 ms / 27566 runs ( 1.64 ms per run)\n# whisper_print_timings: prompt time = 1921.90 ms / 11832 runs ( 0.16 ms per run)\n# whisper_print_timings: total time = 80709.54 ms\n",[559],{"type":20,"tag":92,"props":560,"children":561},{"__ignoreMap":7},[562,578,595,612,624,637,644,652,660,668,676,684,693,702,711],{"type":20,"tag":141,"props":563,"children":564},{"class":143,"line":144},[565,569,574],{"type":20,"tag":141,"props":566,"children":567},{"style":148},[568],{"type":25,"value":151},{"type":20,"tag":141,"props":570,"children":571},{"style":154},[572],{"type":25,"value":573}," ./main",{"type":20,"tag":141,"props":575,"children":576},{"style":160},[577],{"type":25,"value":163},{"type":20,"tag":141,"props":579,"children":580},{"class":143,"line":166},[581,586,591],{"type":20,"tag":141,"props":582,"children":583},{"style":160},[584],{"type":25,"value":585}," -m",{"type":20,"tag":141,"props":587,"children":588},{"style":154},[589],{"type":25,"value":590}," ~/workspace/whisper.cpp/models/ggml-base.en.bin",{"type":20,"tag":141,"props":592,"children":593},{"style":160},[594],{"type":25,"value":163},{"type":20,"tag":141,"props":596,"children":597},{"class":143,"line":179},[598,603,608],{"type":20,"tag":141,"props":599,"children":600},{"style":160},[601],{"type":25,"value":602}," -f",{"type":20,"tag":141,"props":604,"children":605},{"style":154},[606],{"type":25,"value":607}," ~/Downloads/podcast-16khz.wav",{"type":20,"tag":141,"props":609,"children":610},{"style":160},[611],{"type":25,"value":163},{"type":20,"tag":141,"props":613,"children":614},{"class":143,"line":197},[615,620],{"type":20,"tag":141,"props":616,"children":617},{"style":160},[618],{"type":25,"value":619}," --output-vtt",{"type":20,"tag":141,"props":621,"children":622},{"style":160},[623],{"type":25,"value":163},{"type":20,"tag":141,"props":625,"children":626},{"class":143,"line":215},[627,632],{"type":20,"tag":141,"props":628,"children":629},{"style":160},[630],{"type":25,"value":631}," --output-file",{"type":20,"tag":141,"props":633,"children":634},{"style":154},[635],{"type":25,"value":636}," out\n",{"type":20,"tag":141,"props":638,"children":639},{"class":143,"line":331},[640],{"type":20,"tag":141,"props":641,"children":642},{"emptyLinePlaceholder":282},[643],{"type":25,"value":285},{"type":20,"tag":141,"props":645,"children":646},{"class":143,"line":347},[647],{"type":20,"tag":141,"props":648,"children":649},{"style":377},[650],{"type":25,"value":651},"# whisper_print_timings: load time = 114.71 ms\n",{"type":20,"tag":141,"props":653,"children":654},{"class":143,"line":365},[655],{"type":20,"tag":141,"props":656,"children":657},{"style":377},[658],{"type":25,"value":659},"# whisper_print_timings: fallbacks = 0 p / 0 h\n",{"type":20,"tag":141,"props":661,"children":662},{"class":143,"line":373},[663],{"type":20,"tag":141,"props":664,"children":665},{"style":377},[666],{"type":25,"value":667},"# whisper_print_timings: mel time = 692.20 ms\n",{"type":20,"tag":141,"props":669,"children":670},{"class":143,"line":383},[671],{"type":20,"tag":141,"props":672,"children":673},{"style":377},[674],{"type":25,"value":675},"# whisper_print_timings: sample time = 22278.10 ms / 27893 runs ( 0.80 ms per run)\n",{"type":20,"tag":141,"props":677,"children":678},{"class":143,"line":392},[679],{"type":20,"tag":141,"props":680,"children":681},{"style":377},[682],{"type":25,"value":683},"# whisper_print_timings: encode time = 10000.75 ms / 55 runs ( 181.83 ms per run)\n",{"type":20,"tag":141,"props":685,"children":687},{"class":143,"line":686},12,[688],{"type":20,"tag":141,"props":689,"children":690},{"style":377},[691],{"type":25,"value":692},"# whisper_print_timings: decode time = 331.77 ms / 54 runs ( 6.14 ms per run)\n",{"type":20,"tag":141,"props":694,"children":696},{"class":143,"line":695},13,[697],{"type":20,"tag":141,"props":698,"children":699},{"style":377},[700],{"type":25,"value":701},"# whisper_print_timings: batchd time = 45236.73 ms / 27566 runs ( 1.64 ms per run)\n",{"type":20,"tag":141,"props":703,"children":705},{"class":143,"line":704},14,[706],{"type":20,"tag":141,"props":707,"children":708},{"style":377},[709],{"type":25,"value":710},"# whisper_print_timings: prompt time = 1921.90 ms / 11832 runs ( 0.16 ms per run)\n",{"type":20,"tag":141,"props":712,"children":714},{"class":143,"line":713},15,[715],{"type":20,"tag":141,"props":716,"children":717},{"style":377},[718],{"type":25,"value":719},"# whisper_print_timings: total time = 80709.54 ms\n",{"type":20,"tag":21,"props":721,"children":722},{},[723],{"type":25,"value":724},"A full podcast transcribed in ~80 seconds on an M1 Mac Mini -- not too bad!",{"type":20,"tag":131,"props":726,"children":728},{"code":727},"# out.vtt\n\n00:00:00.000 --> 00:00:06.480\n >> Hi everyone. We recently launched a short engagement feedback survey for the Alter Everything\n\n00:00:06.480 --> 00:00:11.360\n podcast. Click the link in the episode description wherever you're listening to let us know what\n\n00:00:11.360 --> 00:00:16.320\n you think and help us improve our show.\n\n00:00:16.320 --> 00:00:21.200\n Welcome to Alter Everything, a podcast about data science and analytics culture. I'm Megan\n\n00:00:21.200 --> 00:00:26.440\n Dibble and today I'm talking with Nick Schrock, CTO and founder of Dagster Labs. We discussed\n\n00:00:26.440 --> 00:00:31.560\n data engineering trends, challenges in the field, why he started his company, and what\n\n00:00:31.560 --> 00:00:38.960\n makes him excited about the future of data engineering. Let's get started.\n\n00:00:38.960 --> 00:00:42.720\n >> Hi, Nick. It's great to have you on our show today. Thanks for being here.\n\n00:00:42.720 --> 00:00:43.920\n >> Thanks for having me.\n\n00:00:43.920 --> 00:00:48.280\n >> Yeah. Could you start off by giving an introduction to yourself for our listeners?\n\n00:00:48.280 --> 00:00:52.920\n >> Sure. My name is Nick Schrock. I'm the CTO and founder of Dagster Labs. There's the\n\n00:00:52.920 --> 00:00:59.520\n company behind Dagster, which is a data orchestration framework. Prior to doing this, I was an engineer\n\n00:00:59.520 --> 00:01:05.960\n at Facebook from 2009, 2017. While I was there, I found a team called product infrastructure\n\n00:01:05.960 --> 00:01:09.800\n whose goal was to make our application developers more efficient and productive, and a bunch\n\n00:01:09.800 --> 00:01:13.840\n of open source work came out of that actually, one of which was React, which I had nothing\n\n00:01:13.840 --> 00:01:18.040\n to do with, but actually the CEO of Dagster Labs co-created and I personally co-created\n\n00:01:18.040 --> 00:01:22.640\n GraphQL. So as I like to say, Pete and I were present at the creation of the full hipster\n\n00:01:22.640 --> 00:01:28.680\n stack. I moved on to Facebook in 2017, figuring out what to do next, and this data engineering\n\n00:01:28.680 --> 00:01:32.960\n and data orchestration problem really got me hooked actually quite soon after I left,\n\n00:01:32.960 --> 00:01:36.280\n and the rest is history. I'm sure we'll get into that more.\n",[729],{"type":20,"tag":92,"props":730,"children":731},{"__ignoreMap":7},[732],{"type":25,"value":727},{"type":20,"tag":734,"props":735,"children":736},"style",{},[737],{"type":25,"value":738},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":166,"depth":166,"links":740},[741,742],{"id":82,"depth":166,"text":85},{"id":401,"depth":166,"text":743},"Build whisper.cpp & Transcribe Audio","markdown","content:articles:podcast-transcription-whispercpp.md","content","articles/podcast-transcription-whispercpp.md","md",1718428848841] \ No newline at end of file +[{"data":1,"prerenderedAt":749},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"draft":6,"date":10,"tags":11,"categories":14,"excerpt":16,"body":55,"_type":744,"_id":745,"_source":746,"_file":747,"_extension":748},"/articles/podcast-transcription-whispercpp","articles",false,"","Easily Transcribe Podcasts with Whisper.cpp","If you've ever had the need to transcribe a podcast, lecture, or some other audio recording, it turns out it's surprisingly easy with the extremely impressive whisper.cpp project. This high-performance fork of OpenAI's Whisper can run on all sorts of hardware -- including my M1 Mac Mini. Let's walk through an example from start-to-finish of transcribing an episode of the Alter Everything podcast.","2024-01-08",[12,13],"whisper.cpp","ml",[15],"programming",{"type":17,"children":18},"root",[19],{"type":20,"tag":21,"props":22,"children":23},"element","p",{},[24,27,35,37,44,46,53],{"type":25,"value":26},"text","If you've ever had the need to transcribe a podcast, lecture, or some other audio recording, it turns out it's surprisingly easy with the extremely impressive ",{"type":20,"tag":28,"props":29,"children":33},"a",{"href":30,"rel":31},"https://github.com/ggerganov/whisper.cpp",[32],"nofollow",[34],{"type":25,"value":12},{"type":25,"value":36}," project. This high-performance fork of ",{"type":20,"tag":28,"props":38,"children":41},{"href":39,"rel":40},"https://github.com/openai/whisper",[32],[42],{"type":25,"value":43},"OpenAI's Whisper",{"type":25,"value":45}," can run on all sorts of hardware -- including my M1 Mac Mini. Let's walk through an example from start-to-finish of transcribing an episode of the ",{"type":20,"tag":28,"props":47,"children":50},{"href":48,"rel":49},"https://podcasts.apple.com/us/podcast/alter-everything/id1356137854",[32],[51],{"type":25,"value":52},"Alter Everything",{"type":25,"value":54}," podcast.",{"type":17,"children":56,"toc":739},[57,79,86,130,222,234,399,412,424,550,555,720,725,733],{"type":20,"tag":21,"props":58,"children":59},{},[60,61,66,67,72,73,78],{"type":25,"value":26},{"type":20,"tag":28,"props":62,"children":64},{"href":30,"rel":63},[32],[65],{"type":25,"value":12},{"type":25,"value":36},{"type":20,"tag":28,"props":68,"children":70},{"href":39,"rel":69},[32],[71],{"type":25,"value":43},{"type":25,"value":45},{"type":20,"tag":28,"props":74,"children":76},{"href":48,"rel":75},[32],[77],{"type":25,"value":52},{"type":25,"value":54},{"type":20,"tag":80,"props":81,"children":83},"h2",{"id":82},"obtain-audio-files",[84],{"type":25,"value":85},"Obtain Audio File(s)",{"type":20,"tag":21,"props":87,"children":88},{},[89,91,98,100,106,108,113,115,120,122,128],{"type":25,"value":90},"First, let's get the ",{"type":20,"tag":92,"props":93,"children":95},"code",{"className":94},[],[96],{"type":25,"value":97},"wav",{"type":25,"value":99}," file from YouTube using the ",{"type":20,"tag":92,"props":101,"children":103},{"className":102},[],[104],{"type":25,"value":105},"youtube-dl",{"type":25,"value":107}," utility. It should be noted that ",{"type":20,"tag":92,"props":109,"children":111},{"className":110},[],[112],{"type":25,"value":12},{"type":25,"value":114}," expects ",{"type":20,"tag":92,"props":116,"children":118},{"className":117},[],[119],{"type":25,"value":97},{"type":25,"value":121}," filetypes, and this utility defaults to ",{"type":20,"tag":92,"props":123,"children":125},{"className":124},[],[126],{"type":25,"value":127},"mp3",{"type":25,"value":129},".",{"type":20,"tag":131,"props":132,"children":136},"pre",{"code":133,"language":134,"meta":7,"className":135,"style":7}," $ youtube-dl \\\n --extract-audio \\\n --audio-format wav \\\n --output podcast.wav \\\n \"https://www.youtube.com/watch?v=CoUN690wSYQ\"\n","sh","language-sh shiki shiki-themes github-light",[137],{"type":20,"tag":92,"props":138,"children":139},{"__ignoreMap":7},[140,164,177,195,213],{"type":20,"tag":141,"props":142,"children":145},"span",{"class":143,"line":144},"line",1,[146,152,158],{"type":20,"tag":141,"props":147,"children":149},{"style":148},"--shiki-default:#6F42C1",[150],{"type":25,"value":151}," $",{"type":20,"tag":141,"props":153,"children":155},{"style":154},"--shiki-default:#032F62",[156],{"type":25,"value":157}," youtube-dl",{"type":20,"tag":141,"props":159,"children":161},{"style":160},"--shiki-default:#005CC5",[162],{"type":25,"value":163}," \\\n",{"type":20,"tag":141,"props":165,"children":167},{"class":143,"line":166},2,[168,173],{"type":20,"tag":141,"props":169,"children":170},{"style":160},[171],{"type":25,"value":172}," --extract-audio",{"type":20,"tag":141,"props":174,"children":175},{"style":160},[176],{"type":25,"value":163},{"type":20,"tag":141,"props":178,"children":180},{"class":143,"line":179},3,[181,186,191],{"type":20,"tag":141,"props":182,"children":183},{"style":160},[184],{"type":25,"value":185}," --audio-format",{"type":20,"tag":141,"props":187,"children":188},{"style":154},[189],{"type":25,"value":190}," wav",{"type":20,"tag":141,"props":192,"children":193},{"style":160},[194],{"type":25,"value":163},{"type":20,"tag":141,"props":196,"children":198},{"class":143,"line":197},4,[199,204,209],{"type":20,"tag":141,"props":200,"children":201},{"style":160},[202],{"type":25,"value":203}," --output",{"type":20,"tag":141,"props":205,"children":206},{"style":154},[207],{"type":25,"value":208}," podcast.wav",{"type":20,"tag":141,"props":210,"children":211},{"style":160},[212],{"type":25,"value":163},{"type":20,"tag":141,"props":214,"children":216},{"class":143,"line":215},5,[217],{"type":20,"tag":141,"props":218,"children":219},{"style":154},[220],{"type":25,"value":221}," \"https://www.youtube.com/watch?v=CoUN690wSYQ\"\n",{"type":20,"tag":21,"props":223,"children":224},{},[225,227,232],{"type":25,"value":226},"This file has a 44.1 kHz sample rate, and ",{"type":20,"tag":92,"props":228,"children":230},{"className":229},[],[231],{"type":25,"value":12},{"type":25,"value":233}," expects 16 kHz, so let's go ahead and convert that.",{"type":20,"tag":131,"props":235,"children":237},{"code":236,"language":134,"meta":7,"className":135,"style":7}," $ file podcast.wav\npodcast.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 44100 Hz\n\n $ ffmpeg -i podcast.wav -ar 16000 podcast-16khz.wav\n\n $ file podcast-16khz.wav\npodcast-16khz.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 16000 Hz\n\n# NOTE: it looks like it's possible to specify this conversion as a post-process as a\n# flag to the `youtube-dl` command -- I will explore this further next time...\n# youtube-dl --extract-audio --audio-quality 0 --audio-format mp3 --postprocessor-args \"-ar 44100\" %dl%\n",[238],{"type":20,"tag":92,"props":239,"children":240},{"__ignoreMap":7},[241,258,277,286,322,329,345,363,371,381,390],{"type":20,"tag":141,"props":242,"children":243},{"class":143,"line":144},[244,248,253],{"type":20,"tag":141,"props":245,"children":246},{"style":148},[247],{"type":25,"value":151},{"type":20,"tag":141,"props":249,"children":250},{"style":154},[251],{"type":25,"value":252}," file",{"type":20,"tag":141,"props":254,"children":255},{"style":154},[256],{"type":25,"value":257}," podcast.wav\n",{"type":20,"tag":141,"props":259,"children":260},{"class":143,"line":166},[261,266,271],{"type":20,"tag":141,"props":262,"children":263},{"style":148},[264],{"type":25,"value":265},"podcast.wav:",{"type":20,"tag":141,"props":267,"children":268},{"style":154},[269],{"type":25,"value":270}," RIFF",{"type":20,"tag":141,"props":272,"children":274},{"style":273},"--shiki-default:#24292E",[275],{"type":25,"value":276}," (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 44100 Hz\n",{"type":20,"tag":141,"props":278,"children":279},{"class":143,"line":179},[280],{"type":20,"tag":141,"props":281,"children":283},{"emptyLinePlaceholder":282},true,[284],{"type":25,"value":285},"\n",{"type":20,"tag":141,"props":287,"children":288},{"class":143,"line":197},[289,293,298,303,307,312,317],{"type":20,"tag":141,"props":290,"children":291},{"style":148},[292],{"type":25,"value":151},{"type":20,"tag":141,"props":294,"children":295},{"style":154},[296],{"type":25,"value":297}," ffmpeg",{"type":20,"tag":141,"props":299,"children":300},{"style":160},[301],{"type":25,"value":302}," -i",{"type":20,"tag":141,"props":304,"children":305},{"style":154},[306],{"type":25,"value":208},{"type":20,"tag":141,"props":308,"children":309},{"style":160},[310],{"type":25,"value":311}," -ar",{"type":20,"tag":141,"props":313,"children":314},{"style":160},[315],{"type":25,"value":316}," 16000",{"type":20,"tag":141,"props":318,"children":319},{"style":154},[320],{"type":25,"value":321}," podcast-16khz.wav\n",{"type":20,"tag":141,"props":323,"children":324},{"class":143,"line":215},[325],{"type":20,"tag":141,"props":326,"children":327},{"emptyLinePlaceholder":282},[328],{"type":25,"value":285},{"type":20,"tag":141,"props":330,"children":332},{"class":143,"line":331},6,[333,337,341],{"type":20,"tag":141,"props":334,"children":335},{"style":148},[336],{"type":25,"value":151},{"type":20,"tag":141,"props":338,"children":339},{"style":154},[340],{"type":25,"value":252},{"type":20,"tag":141,"props":342,"children":343},{"style":154},[344],{"type":25,"value":321},{"type":20,"tag":141,"props":346,"children":348},{"class":143,"line":347},7,[349,354,358],{"type":20,"tag":141,"props":350,"children":351},{"style":148},[352],{"type":25,"value":353},"podcast-16khz.wav:",{"type":20,"tag":141,"props":355,"children":356},{"style":154},[357],{"type":25,"value":270},{"type":20,"tag":141,"props":359,"children":360},{"style":273},[361],{"type":25,"value":362}," (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 16000 Hz\n",{"type":20,"tag":141,"props":364,"children":366},{"class":143,"line":365},8,[367],{"type":20,"tag":141,"props":368,"children":369},{"emptyLinePlaceholder":282},[370],{"type":25,"value":285},{"type":20,"tag":141,"props":372,"children":374},{"class":143,"line":373},9,[375],{"type":20,"tag":141,"props":376,"children":378},{"style":377},"--shiki-default:#6A737D",[379],{"type":25,"value":380},"# NOTE: it looks like it's possible to specify this conversion as a post-process as a\n",{"type":20,"tag":141,"props":382,"children":384},{"class":143,"line":383},10,[385],{"type":20,"tag":141,"props":386,"children":387},{"style":377},[388],{"type":25,"value":389},"# flag to the `youtube-dl` command -- I will explore this further next time...\n",{"type":20,"tag":141,"props":391,"children":393},{"class":143,"line":392},11,[394],{"type":20,"tag":141,"props":395,"children":396},{"style":377},[397],{"type":25,"value":398},"# youtube-dl --extract-audio --audio-quality 0 --audio-format mp3 --postprocessor-args \"-ar 44100\" %dl%\n",{"type":20,"tag":80,"props":400,"children":402},{"id":401},"build-whispercpp-transcribe-audio",[403,405,410],{"type":25,"value":404},"Build ",{"type":20,"tag":92,"props":406,"children":408},{"className":407},[],[409],{"type":25,"value":12},{"type":25,"value":411}," & Transcribe Audio",{"type":20,"tag":21,"props":413,"children":414},{},[415,417,422],{"type":25,"value":416},"Then, let's get the latest version of ",{"type":20,"tag":92,"props":418,"children":420},{"className":419},[],[421],{"type":25,"value":12},{"type":25,"value":423},", download the English Whisper model, and build the example.",{"type":20,"tag":131,"props":425,"children":427},{"code":426,"language":134,"meta":7,"className":135,"style":7},"# Clone the `whisper.cpp` repository\n $ git clone --depth 1 git@github.com:ggerganov/whisper.cpp && cd whisper.cpp\n\n# Download the English Whisper model in `ggml` format\n $ bash ./models/download-ggml-model.sh base.en\n\n# Build the main example\n $ make\n",[428],{"type":20,"tag":92,"props":429,"children":430},{"__ignoreMap":7},[431,439,486,493,501,523,530,538],{"type":20,"tag":141,"props":432,"children":433},{"class":143,"line":144},[434],{"type":20,"tag":141,"props":435,"children":436},{"style":377},[437],{"type":25,"value":438},"# Clone the `whisper.cpp` repository\n",{"type":20,"tag":141,"props":440,"children":441},{"class":143,"line":166},[442,446,451,456,461,466,471,476,481],{"type":20,"tag":141,"props":443,"children":444},{"style":148},[445],{"type":25,"value":151},{"type":20,"tag":141,"props":447,"children":448},{"style":154},[449],{"type":25,"value":450}," git",{"type":20,"tag":141,"props":452,"children":453},{"style":154},[454],{"type":25,"value":455}," clone",{"type":20,"tag":141,"props":457,"children":458},{"style":160},[459],{"type":25,"value":460}," --depth",{"type":20,"tag":141,"props":462,"children":463},{"style":160},[464],{"type":25,"value":465}," 1",{"type":20,"tag":141,"props":467,"children":468},{"style":154},[469],{"type":25,"value":470}," git@github.com:ggerganov/whisper.cpp",{"type":20,"tag":141,"props":472,"children":473},{"style":273},[474],{"type":25,"value":475}," && ",{"type":20,"tag":141,"props":477,"children":478},{"style":160},[479],{"type":25,"value":480},"cd",{"type":20,"tag":141,"props":482,"children":483},{"style":154},[484],{"type":25,"value":485}," whisper.cpp\n",{"type":20,"tag":141,"props":487,"children":488},{"class":143,"line":179},[489],{"type":20,"tag":141,"props":490,"children":491},{"emptyLinePlaceholder":282},[492],{"type":25,"value":285},{"type":20,"tag":141,"props":494,"children":495},{"class":143,"line":197},[496],{"type":20,"tag":141,"props":497,"children":498},{"style":377},[499],{"type":25,"value":500},"# Download the English Whisper model in `ggml` format\n",{"type":20,"tag":141,"props":502,"children":503},{"class":143,"line":215},[504,508,513,518],{"type":20,"tag":141,"props":505,"children":506},{"style":148},[507],{"type":25,"value":151},{"type":20,"tag":141,"props":509,"children":510},{"style":154},[511],{"type":25,"value":512}," bash",{"type":20,"tag":141,"props":514,"children":515},{"style":154},[516],{"type":25,"value":517}," ./models/download-ggml-model.sh",{"type":20,"tag":141,"props":519,"children":520},{"style":154},[521],{"type":25,"value":522}," base.en\n",{"type":20,"tag":141,"props":524,"children":525},{"class":143,"line":331},[526],{"type":20,"tag":141,"props":527,"children":528},{"emptyLinePlaceholder":282},[529],{"type":25,"value":285},{"type":20,"tag":141,"props":531,"children":532},{"class":143,"line":347},[533],{"type":20,"tag":141,"props":534,"children":535},{"style":377},[536],{"type":25,"value":537},"# Build the main example\n",{"type":20,"tag":141,"props":539,"children":540},{"class":143,"line":365},[541,545],{"type":20,"tag":141,"props":542,"children":543},{"style":148},[544],{"type":25,"value":151},{"type":20,"tag":141,"props":546,"children":547},{"style":154},[548],{"type":25,"value":549}," make\n",{"type":20,"tag":21,"props":551,"children":552},{},[553],{"type":25,"value":554},"And finally, let's transcribe that podcast!",{"type":20,"tag":131,"props":556,"children":558},{"code":557,"language":134,"meta":7,"className":135,"style":7}," $ ./main \\\n -m ~/workspace/whisper.cpp/models/ggml-base.en.bin \\\n -f ~/Downloads/podcast-16khz.wav \\\n --output-vtt \\\n --output-file out\n\n# whisper_print_timings: load time = 114.71 ms\n# whisper_print_timings: fallbacks = 0 p / 0 h\n# whisper_print_timings: mel time = 692.20 ms\n# whisper_print_timings: sample time = 22278.10 ms / 27893 runs ( 0.80 ms per run)\n# whisper_print_timings: encode time = 10000.75 ms / 55 runs ( 181.83 ms per run)\n# whisper_print_timings: decode time = 331.77 ms / 54 runs ( 6.14 ms per run)\n# whisper_print_timings: batchd time = 45236.73 ms / 27566 runs ( 1.64 ms per run)\n# whisper_print_timings: prompt time = 1921.90 ms / 11832 runs ( 0.16 ms per run)\n# whisper_print_timings: total time = 80709.54 ms\n",[559],{"type":20,"tag":92,"props":560,"children":561},{"__ignoreMap":7},[562,578,595,612,624,637,644,652,660,668,676,684,693,702,711],{"type":20,"tag":141,"props":563,"children":564},{"class":143,"line":144},[565,569,574],{"type":20,"tag":141,"props":566,"children":567},{"style":148},[568],{"type":25,"value":151},{"type":20,"tag":141,"props":570,"children":571},{"style":154},[572],{"type":25,"value":573}," ./main",{"type":20,"tag":141,"props":575,"children":576},{"style":160},[577],{"type":25,"value":163},{"type":20,"tag":141,"props":579,"children":580},{"class":143,"line":166},[581,586,591],{"type":20,"tag":141,"props":582,"children":583},{"style":160},[584],{"type":25,"value":585}," -m",{"type":20,"tag":141,"props":587,"children":588},{"style":154},[589],{"type":25,"value":590}," ~/workspace/whisper.cpp/models/ggml-base.en.bin",{"type":20,"tag":141,"props":592,"children":593},{"style":160},[594],{"type":25,"value":163},{"type":20,"tag":141,"props":596,"children":597},{"class":143,"line":179},[598,603,608],{"type":20,"tag":141,"props":599,"children":600},{"style":160},[601],{"type":25,"value":602}," -f",{"type":20,"tag":141,"props":604,"children":605},{"style":154},[606],{"type":25,"value":607}," ~/Downloads/podcast-16khz.wav",{"type":20,"tag":141,"props":609,"children":610},{"style":160},[611],{"type":25,"value":163},{"type":20,"tag":141,"props":613,"children":614},{"class":143,"line":197},[615,620],{"type":20,"tag":141,"props":616,"children":617},{"style":160},[618],{"type":25,"value":619}," --output-vtt",{"type":20,"tag":141,"props":621,"children":622},{"style":160},[623],{"type":25,"value":163},{"type":20,"tag":141,"props":625,"children":626},{"class":143,"line":215},[627,632],{"type":20,"tag":141,"props":628,"children":629},{"style":160},[630],{"type":25,"value":631}," --output-file",{"type":20,"tag":141,"props":633,"children":634},{"style":154},[635],{"type":25,"value":636}," out\n",{"type":20,"tag":141,"props":638,"children":639},{"class":143,"line":331},[640],{"type":20,"tag":141,"props":641,"children":642},{"emptyLinePlaceholder":282},[643],{"type":25,"value":285},{"type":20,"tag":141,"props":645,"children":646},{"class":143,"line":347},[647],{"type":20,"tag":141,"props":648,"children":649},{"style":377},[650],{"type":25,"value":651},"# whisper_print_timings: load time = 114.71 ms\n",{"type":20,"tag":141,"props":653,"children":654},{"class":143,"line":365},[655],{"type":20,"tag":141,"props":656,"children":657},{"style":377},[658],{"type":25,"value":659},"# whisper_print_timings: fallbacks = 0 p / 0 h\n",{"type":20,"tag":141,"props":661,"children":662},{"class":143,"line":373},[663],{"type":20,"tag":141,"props":664,"children":665},{"style":377},[666],{"type":25,"value":667},"# whisper_print_timings: mel time = 692.20 ms\n",{"type":20,"tag":141,"props":669,"children":670},{"class":143,"line":383},[671],{"type":20,"tag":141,"props":672,"children":673},{"style":377},[674],{"type":25,"value":675},"# whisper_print_timings: sample time = 22278.10 ms / 27893 runs ( 0.80 ms per run)\n",{"type":20,"tag":141,"props":677,"children":678},{"class":143,"line":392},[679],{"type":20,"tag":141,"props":680,"children":681},{"style":377},[682],{"type":25,"value":683},"# whisper_print_timings: encode time = 10000.75 ms / 55 runs ( 181.83 ms per run)\n",{"type":20,"tag":141,"props":685,"children":687},{"class":143,"line":686},12,[688],{"type":20,"tag":141,"props":689,"children":690},{"style":377},[691],{"type":25,"value":692},"# whisper_print_timings: decode time = 331.77 ms / 54 runs ( 6.14 ms per run)\n",{"type":20,"tag":141,"props":694,"children":696},{"class":143,"line":695},13,[697],{"type":20,"tag":141,"props":698,"children":699},{"style":377},[700],{"type":25,"value":701},"# whisper_print_timings: batchd time = 45236.73 ms / 27566 runs ( 1.64 ms per run)\n",{"type":20,"tag":141,"props":703,"children":705},{"class":143,"line":704},14,[706],{"type":20,"tag":141,"props":707,"children":708},{"style":377},[709],{"type":25,"value":710},"# whisper_print_timings: prompt time = 1921.90 ms / 11832 runs ( 0.16 ms per run)\n",{"type":20,"tag":141,"props":712,"children":714},{"class":143,"line":713},15,[715],{"type":20,"tag":141,"props":716,"children":717},{"style":377},[718],{"type":25,"value":719},"# whisper_print_timings: total time = 80709.54 ms\n",{"type":20,"tag":21,"props":721,"children":722},{},[723],{"type":25,"value":724},"A full podcast transcribed in ~80 seconds on an M1 Mac Mini -- not too bad!",{"type":20,"tag":131,"props":726,"children":728},{"code":727},"# out.vtt\n\n00:00:00.000 --> 00:00:06.480\n >> Hi everyone. We recently launched a short engagement feedback survey for the Alter Everything\n\n00:00:06.480 --> 00:00:11.360\n podcast. Click the link in the episode description wherever you're listening to let us know what\n\n00:00:11.360 --> 00:00:16.320\n you think and help us improve our show.\n\n00:00:16.320 --> 00:00:21.200\n Welcome to Alter Everything, a podcast about data science and analytics culture. I'm Megan\n\n00:00:21.200 --> 00:00:26.440\n Dibble and today I'm talking with Nick Schrock, CTO and founder of Dagster Labs. We discussed\n\n00:00:26.440 --> 00:00:31.560\n data engineering trends, challenges in the field, why he started his company, and what\n\n00:00:31.560 --> 00:00:38.960\n makes him excited about the future of data engineering. Let's get started.\n\n00:00:38.960 --> 00:00:42.720\n >> Hi, Nick. It's great to have you on our show today. Thanks for being here.\n\n00:00:42.720 --> 00:00:43.920\n >> Thanks for having me.\n\n00:00:43.920 --> 00:00:48.280\n >> Yeah. Could you start off by giving an introduction to yourself for our listeners?\n\n00:00:48.280 --> 00:00:52.920\n >> Sure. My name is Nick Schrock. I'm the CTO and founder of Dagster Labs. There's the\n\n00:00:52.920 --> 00:00:59.520\n company behind Dagster, which is a data orchestration framework. Prior to doing this, I was an engineer\n\n00:00:59.520 --> 00:01:05.960\n at Facebook from 2009, 2017. While I was there, I found a team called product infrastructure\n\n00:01:05.960 --> 00:01:09.800\n whose goal was to make our application developers more efficient and productive, and a bunch\n\n00:01:09.800 --> 00:01:13.840\n of open source work came out of that actually, one of which was React, which I had nothing\n\n00:01:13.840 --> 00:01:18.040\n to do with, but actually the CEO of Dagster Labs co-created and I personally co-created\n\n00:01:18.040 --> 00:01:22.640\n GraphQL. So as I like to say, Pete and I were present at the creation of the full hipster\n\n00:01:22.640 --> 00:01:28.680\n stack. I moved on to Facebook in 2017, figuring out what to do next, and this data engineering\n\n00:01:28.680 --> 00:01:32.960\n and data orchestration problem really got me hooked actually quite soon after I left,\n\n00:01:32.960 --> 00:01:36.280\n and the rest is history. I'm sure we'll get into that more.\n",[729],{"type":20,"tag":92,"props":730,"children":731},{"__ignoreMap":7},[732],{"type":25,"value":727},{"type":20,"tag":734,"props":735,"children":736},"style",{},[737],{"type":25,"value":738},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":166,"depth":166,"links":740},[741,742],{"id":82,"depth":166,"text":85},{"id":401,"depth":166,"text":743},"Build whisper.cpp & Transcribe Audio","markdown","content:articles:podcast-transcription-whispercpp.md","content","articles/podcast-transcription-whispercpp.md","md",1718681824632] \ No newline at end of file diff --git a/articles/podcast-transcription-whispercpp/index.html b/articles/podcast-transcription-whispercpp/index.html index f2f01c65..c0c48dea 100644 --- a/articles/podcast-transcription-whispercpp/index.html +++ b/articles/podcast-transcription-whispercpp/index.html @@ -4,32 +4,32 @@ - - + + - - - - + + + + - + - - - - - - - - - - - - - -

        Easily Transcribe Podcasts with Whisper.cpp

        2024-01-08

        If you've ever had the need to transcribe a podcast, lecture, or some other audio recording, it turns out it's surprisingly easy with the extremely impressive whisper.cpp project. This high-performance fork of OpenAI's Whisper can run on all sorts of hardware -- including my M1 Mac Mini. Let's walk through an example from start-to-finish of transcribing an episode of the Alter Everything podcast.

        Obtain Audio File(s)

        First, let's get the wav file from YouTube using the youtube-dl utility. It should be noted that whisper.cpp expects wav filetypes, and this utility defaults to mp3.

         $ youtube-dl \
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +

        Easily Transcribe Podcasts with Whisper.cpp

        2024-01-08

        If you've ever had the need to transcribe a podcast, lecture, or some other audio recording, it turns out it's surprisingly easy with the extremely impressive whisper.cpp project. This high-performance fork of OpenAI's Whisper can run on all sorts of hardware -- including my M1 Mac Mini. Let's walk through an example from start-to-finish of transcribing an episode of the Alter Everything podcast.

        Obtain Audio File(s)

        First, let's get the wav file from YouTube using the youtube-dl utility. It should be noted that whisper.cpp expects wav filetypes, and this utility defaults to mp3.

         $ youtube-dl \
             --extract-audio \
             --audio-format wav \
             --output podcast.wav \
        @@ -129,5 +129,5 @@
         
         00:01:32.960 --> 00:01:36.280
          and the rest is history. I'm sure we'll get into that more.
        -
        - \ No newline at end of file +
        + \ No newline at end of file diff --git a/articles/quick-tip-rerunning-bash-commands/_payload.json b/articles/quick-tip-rerunning-bash-commands/_payload.json index 31e7664b..06b44c0c 100644 --- a/articles/quick-tip-rerunning-bash-commands/_payload.json +++ b/articles/quick-tip-rerunning-bash-commands/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":646},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"draft":6,"tags":11,"categories":14,"excerpt":16,"body":36,"_type":641,"_id":642,"_source":643,"_file":644,"_extension":645},"/articles/quick-tip-rerunning-bash-commands","articles",false,"","Tip: Re-running Bash Commands","Do you ever find yourself having to re-run a Bash command? I often find this\nhappening to myself when I neglect to use sudo for a command that requires\nroot privileges.","2021-09-22",[12,13],"tip","bash",[15],"tips",{"type":17,"children":18},"root",[19],{"type":20,"tag":21,"props":22,"children":23},"element","p",{},[24,27,34],{"type":25,"value":26},"text","Do you ever find yourself having to re-run a Bash command? I often find this\nhappening to myself when I neglect to use ",{"type":20,"tag":28,"props":29,"children":31},"code",{"className":30},[],[32],{"type":25,"value":33},"sudo",{"type":25,"value":35}," for a command that requires\nroot privileges.",{"type":17,"children":37,"toc":639},[38,48,134,161,245,250,279,381,409,463,476,511,530,572,599,603,633],{"type":20,"tag":21,"props":39,"children":40},{},[41,42,47],{"type":25,"value":26},{"type":20,"tag":28,"props":43,"children":45},{"className":44},[],[46],{"type":25,"value":33},{"type":25,"value":35},{"type":20,"tag":49,"props":50,"children":53},"pre",{"className":51,"code":52,"language":13,"meta":7,"style":7},"language-bash shiki shiki-themes github-light","$ pacman -Syu\nerror: you cannot perform this operation unless you are root.\n",[54],{"type":20,"tag":28,"props":55,"children":56},{"__ignoreMap":7},[57,81],{"type":20,"tag":58,"props":59,"children":62},"span",{"class":60,"line":61},"line",1,[63,69,75],{"type":20,"tag":58,"props":64,"children":66},{"style":65},"--shiki-default:#6F42C1",[67],{"type":25,"value":68},"$",{"type":20,"tag":58,"props":70,"children":72},{"style":71},"--shiki-default:#032F62",[73],{"type":25,"value":74}," pacman",{"type":20,"tag":58,"props":76,"children":78},{"style":77},"--shiki-default:#005CC5",[79],{"type":25,"value":80}," -Syu\n",{"type":20,"tag":58,"props":82,"children":84},{"class":60,"line":83},2,[85,90,95,100,105,110,115,120,124,129],{"type":20,"tag":58,"props":86,"children":87},{"style":65},[88],{"type":25,"value":89},"error:",{"type":20,"tag":58,"props":91,"children":92},{"style":71},[93],{"type":25,"value":94}," you",{"type":20,"tag":58,"props":96,"children":97},{"style":71},[98],{"type":25,"value":99}," cannot",{"type":20,"tag":58,"props":101,"children":102},{"style":71},[103],{"type":25,"value":104}," perform",{"type":20,"tag":58,"props":106,"children":107},{"style":71},[108],{"type":25,"value":109}," this",{"type":20,"tag":58,"props":111,"children":112},{"style":71},[113],{"type":25,"value":114}," operation",{"type":20,"tag":58,"props":116,"children":117},{"style":71},[118],{"type":25,"value":119}," unless",{"type":20,"tag":58,"props":121,"children":122},{"style":71},[123],{"type":25,"value":94},{"type":20,"tag":58,"props":125,"children":126},{"style":71},[127],{"type":25,"value":128}," are",{"type":20,"tag":58,"props":130,"children":131},{"style":71},[132],{"type":25,"value":133}," root.\n",{"type":20,"tag":21,"props":135,"children":136},{},[137,139,145,147,152,154,159],{"type":25,"value":138},"Well, I have good news for you -- you can easily re-issue a command with the\n",{"type":20,"tag":28,"props":140,"children":142},{"className":141},[],[143],{"type":25,"value":144},"!!",{"type":25,"value":146}," designator! Simply type ",{"type":20,"tag":28,"props":148,"children":150},{"className":149},[],[151],{"type":25,"value":33},{"type":25,"value":153}," followed by ",{"type":20,"tag":28,"props":155,"children":157},{"className":156},[],[158],{"type":25,"value":144},{"type":25,"value":160}," and you're good to go.",{"type":20,"tag":49,"props":162,"children":164},{"className":51,"code":163,"language":13,"meta":7,"style":7},"$ sudo !!\nsudo pacman -Syu\n[sudo] password for colton:\n:: Synchronizing package databases...\n",[165],{"type":20,"tag":28,"props":166,"children":167},{"__ignoreMap":7},[168,185,200,221],{"type":20,"tag":58,"props":169,"children":170},{"class":60,"line":61},[171,175,180],{"type":20,"tag":58,"props":172,"children":173},{"style":65},[174],{"type":25,"value":68},{"type":20,"tag":58,"props":176,"children":177},{"style":71},[178],{"type":25,"value":179}," sudo",{"type":20,"tag":58,"props":181,"children":182},{"style":71},[183],{"type":25,"value":184}," !!\n",{"type":20,"tag":58,"props":186,"children":187},{"class":60,"line":83},[188,192,196],{"type":20,"tag":58,"props":189,"children":190},{"style":65},[191],{"type":25,"value":33},{"type":20,"tag":58,"props":193,"children":194},{"style":71},[195],{"type":25,"value":74},{"type":20,"tag":58,"props":197,"children":198},{"style":77},[199],{"type":25,"value":80},{"type":20,"tag":58,"props":201,"children":203},{"class":60,"line":202},3,[204,210,216],{"type":20,"tag":58,"props":205,"children":207},{"style":206},"--shiki-default:#24292E",[208],{"type":25,"value":209},"[sudo] password ",{"type":20,"tag":58,"props":211,"children":213},{"style":212},"--shiki-default:#D73A49",[214],{"type":25,"value":215},"for",{"type":20,"tag":58,"props":217,"children":218},{"style":206},[219],{"type":25,"value":220}," colton:\n",{"type":20,"tag":58,"props":222,"children":224},{"class":60,"line":223},4,[225,230,235,240],{"type":20,"tag":58,"props":226,"children":227},{"style":77},[228],{"type":25,"value":229},"::",{"type":20,"tag":58,"props":231,"children":232},{"style":71},[233],{"type":25,"value":234}," Synchronizing",{"type":20,"tag":58,"props":236,"children":237},{"style":71},[238],{"type":25,"value":239}," package",{"type":20,"tag":58,"props":241,"children":242},{"style":71},[243],{"type":25,"value":244}," databases...\n",{"type":20,"tag":21,"props":246,"children":247},{},[248],{"type":25,"value":249},"--",{"type":20,"tag":21,"props":251,"children":252},{},[253,255,261,263,269,271,277],{"type":25,"value":254},"Commands that are prefixed with a bang, ",{"type":20,"tag":28,"props":256,"children":258},{"className":257},[],[259],{"type":25,"value":260},"!",{"type":25,"value":262},", are considered ",{"type":20,"tag":264,"props":265,"children":266},"em",{},[267],{"type":25,"value":268},"Event\nDesignators,",{"type":25,"value":270}," and are references to your command-line history. You can take a\nlook at your history with the ",{"type":20,"tag":28,"props":272,"children":274},{"className":273},[],[275],{"type":25,"value":276},"history",{"type":25,"value":278}," command.",{"type":20,"tag":49,"props":280,"children":282},{"className":51,"code":281,"language":13,"meta":7,"style":7},"$ history\n 1021 touch hello_world.txt\n 1022 ls\n 1023 echo \"Here we go again!\"\n 1024 find . -name *.py\n",[283],{"type":20,"tag":28,"props":284,"children":285},{"__ignoreMap":7},[286,298,316,329,347],{"type":20,"tag":58,"props":287,"children":288},{"class":60,"line":61},[289,293],{"type":20,"tag":58,"props":290,"children":291},{"style":65},[292],{"type":25,"value":68},{"type":20,"tag":58,"props":294,"children":295},{"style":71},[296],{"type":25,"value":297}," history\n",{"type":20,"tag":58,"props":299,"children":300},{"class":60,"line":83},[301,306,311],{"type":20,"tag":58,"props":302,"children":303},{"style":65},[304],{"type":25,"value":305}," 1021",{"type":20,"tag":58,"props":307,"children":308},{"style":71},[309],{"type":25,"value":310}," touch",{"type":20,"tag":58,"props":312,"children":313},{"style":71},[314],{"type":25,"value":315}," hello_world.txt\n",{"type":20,"tag":58,"props":317,"children":318},{"class":60,"line":202},[319,324],{"type":20,"tag":58,"props":320,"children":321},{"style":65},[322],{"type":25,"value":323}," 1022",{"type":20,"tag":58,"props":325,"children":326},{"style":71},[327],{"type":25,"value":328}," ls\n",{"type":20,"tag":58,"props":330,"children":331},{"class":60,"line":223},[332,337,342],{"type":20,"tag":58,"props":333,"children":334},{"style":65},[335],{"type":25,"value":336}," 1023",{"type":20,"tag":58,"props":338,"children":339},{"style":71},[340],{"type":25,"value":341}," echo",{"type":20,"tag":58,"props":343,"children":344},{"style":71},[345],{"type":25,"value":346}," \"Here we go again!\"\n",{"type":20,"tag":58,"props":348,"children":350},{"class":60,"line":349},5,[351,356,361,366,371,376],{"type":20,"tag":58,"props":352,"children":353},{"style":65},[354],{"type":25,"value":355}," 1024",{"type":20,"tag":58,"props":357,"children":358},{"style":71},[359],{"type":25,"value":360}," find",{"type":20,"tag":58,"props":362,"children":363},{"style":71},[364],{"type":25,"value":365}," .",{"type":20,"tag":58,"props":367,"children":368},{"style":77},[369],{"type":25,"value":370}," -name",{"type":20,"tag":58,"props":372,"children":373},{"style":77},[374],{"type":25,"value":375}," *",{"type":20,"tag":58,"props":377,"children":378},{"style":71},[379],{"type":25,"value":380},".py\n",{"type":20,"tag":21,"props":382,"children":383},{},[384,386,391,393,399,401,407],{"type":25,"value":385},"There are many ways to use ",{"type":20,"tag":28,"props":387,"children":389},{"className":388},[],[390],{"type":25,"value":260},{"type":25,"value":392}," in your shell. For example, if you wanted to\nre-issue a specific command in your history, you could use ",{"type":20,"tag":28,"props":394,"children":396},{"className":395},[],[397],{"type":25,"value":398},"!n",{"type":25,"value":400}," where ",{"type":20,"tag":28,"props":402,"children":404},{"className":403},[],[405],{"type":25,"value":406},"n",{"type":25,"value":408}," is\nthe number next to the command in your history.",{"type":20,"tag":49,"props":410,"children":412},{"className":51,"code":411,"language":13,"meta":7,"style":7},"$ !1023\necho \"Here we go again!\"\nHere we go again!\n",[413],{"type":20,"tag":28,"props":414,"children":415},{"__ignoreMap":7},[416,428,440],{"type":20,"tag":58,"props":417,"children":418},{"class":60,"line":61},[419,423],{"type":20,"tag":58,"props":420,"children":421},{"style":65},[422],{"type":25,"value":68},{"type":20,"tag":58,"props":424,"children":425},{"style":71},[426],{"type":25,"value":427}," !1023\n",{"type":20,"tag":58,"props":429,"children":430},{"class":60,"line":83},[431,436],{"type":20,"tag":58,"props":432,"children":433},{"style":77},[434],{"type":25,"value":435},"echo",{"type":20,"tag":58,"props":437,"children":438},{"style":71},[439],{"type":25,"value":346},{"type":20,"tag":58,"props":441,"children":442},{"class":60,"line":202},[443,448,453,458],{"type":20,"tag":58,"props":444,"children":445},{"style":65},[446],{"type":25,"value":447},"Here",{"type":20,"tag":58,"props":449,"children":450},{"style":71},[451],{"type":25,"value":452}," we",{"type":20,"tag":58,"props":454,"children":455},{"style":71},[456],{"type":25,"value":457}," go",{"type":20,"tag":58,"props":459,"children":460},{"style":71},[461],{"type":25,"value":462}," again!\n",{"type":20,"tag":21,"props":464,"children":465},{},[466,468,474],{"type":25,"value":467},"Or... if you wanted to run the command you issued 4-commands ago, you can use\n",{"type":20,"tag":28,"props":469,"children":471},{"className":470},[],[472],{"type":25,"value":473},"!-4",{"type":25,"value":475},".",{"type":20,"tag":49,"props":477,"children":479},{"className":51,"code":478,"language":13,"meta":7,"style":7},"$ !-4\nls\nhello_world.txt\n",[480],{"type":20,"tag":28,"props":481,"children":482},{"__ignoreMap":7},[483,495,503],{"type":20,"tag":58,"props":484,"children":485},{"class":60,"line":61},[486,490],{"type":20,"tag":58,"props":487,"children":488},{"style":65},[489],{"type":25,"value":68},{"type":20,"tag":58,"props":491,"children":492},{"style":71},[493],{"type":25,"value":494}," !-4\n",{"type":20,"tag":58,"props":496,"children":497},{"class":60,"line":83},[498],{"type":20,"tag":58,"props":499,"children":500},{"style":65},[501],{"type":25,"value":502},"ls\n",{"type":20,"tag":58,"props":504,"children":505},{"class":60,"line":202},[506],{"type":20,"tag":58,"props":507,"children":508},{"style":65},[509],{"type":25,"value":510},"hello_world.txt\n",{"type":20,"tag":21,"props":512,"children":513},{},[514,516,521,523,529],{"type":25,"value":515},"Or... if you wanted to run the last command that started with the string\n",{"type":20,"tag":264,"props":517,"children":518},{},[519],{"type":25,"value":520},"find",{"type":25,"value":522},", you can use ",{"type":20,"tag":28,"props":524,"children":526},{"className":525},[],[527],{"type":25,"value":528},"!find",{"type":25,"value":475},{"type":20,"tag":49,"props":531,"children":533},{"className":51,"code":532,"language":13,"meta":7,"style":7},"$ !find\nfind . -name *.py\n",[534],{"type":20,"tag":28,"props":535,"children":536},{"__ignoreMap":7},[537,549],{"type":20,"tag":58,"props":538,"children":539},{"class":60,"line":61},[540,544],{"type":20,"tag":58,"props":541,"children":542},{"style":65},[543],{"type":25,"value":68},{"type":20,"tag":58,"props":545,"children":546},{"style":71},[547],{"type":25,"value":548}," !find\n",{"type":20,"tag":58,"props":550,"children":551},{"class":60,"line":83},[552,556,560,564,568],{"type":20,"tag":58,"props":553,"children":554},{"style":65},[555],{"type":25,"value":520},{"type":20,"tag":58,"props":557,"children":558},{"style":71},[559],{"type":25,"value":365},{"type":20,"tag":58,"props":561,"children":562},{"style":77},[563],{"type":25,"value":370},{"type":20,"tag":58,"props":565,"children":566},{"style":77},[567],{"type":25,"value":375},{"type":20,"tag":58,"props":569,"children":570},{"style":71},[571],{"type":25,"value":380},{"type":20,"tag":21,"props":573,"children":574},{},[575,577,582,584,589,591,597],{"type":25,"value":576},"Be sure to check out the ",{"type":20,"tag":264,"props":578,"children":579},{},[580],{"type":25,"value":581},"Event Designators",{"type":25,"value":583}," section of the ",{"type":20,"tag":28,"props":585,"children":587},{"className":586},[],[588],{"type":25,"value":13},{"type":25,"value":590}," ",{"type":20,"tag":28,"props":592,"children":594},{"className":593},[],[595],{"type":25,"value":596},"man",{"type":25,"value":598}," pages\nfor more information!",{"type":20,"tag":21,"props":600,"children":601},{},[602],{"type":25,"value":249},{"type":20,"tag":21,"props":604,"children":605},{},[606,608,617,619,624,626,631],{"type":25,"value":607},"As an aside, for even faster command-line history navigation, be sure to check\nout the excellent ",{"type":20,"tag":609,"props":610,"children":614},"a",{"href":611,"rel":612},"https://github.com/junegunn/fzf",[613],"nofollow",[615],{"type":25,"value":616},"fzf",{"type":25,"value":618}," utility by ",{"type":20,"tag":264,"props":620,"children":621},{},[622],{"type":25,"value":623},"junegunn.",{"type":25,"value":625},"\nOne of the many features of ",{"type":20,"tag":28,"props":627,"children":629},{"className":628},[],[630],{"type":25,"value":616},{"type":25,"value":632}," is browsing and re-issuing commands from your\ncommand-line history with a fuzzy-finder!",{"type":20,"tag":634,"props":635,"children":636},"style",{},[637],{"type":25,"value":638},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":83,"depth":83,"links":640},[],"markdown","content:articles:quick-tip-rerunning-bash-commands.md","content","articles/quick-tip-rerunning-bash-commands.md","md",1718428848856] \ No newline at end of file +[{"data":1,"prerenderedAt":646},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"draft":6,"tags":11,"categories":14,"excerpt":16,"body":36,"_type":641,"_id":642,"_source":643,"_file":644,"_extension":645},"/articles/quick-tip-rerunning-bash-commands","articles",false,"","Tip: Re-running Bash Commands","Do you ever find yourself having to re-run a Bash command? I often find this\nhappening to myself when I neglect to use sudo for a command that requires\nroot privileges.","2021-09-22",[12,13],"tip","bash",[15],"tips",{"type":17,"children":18},"root",[19],{"type":20,"tag":21,"props":22,"children":23},"element","p",{},[24,27,34],{"type":25,"value":26},"text","Do you ever find yourself having to re-run a Bash command? I often find this\nhappening to myself when I neglect to use ",{"type":20,"tag":28,"props":29,"children":31},"code",{"className":30},[],[32],{"type":25,"value":33},"sudo",{"type":25,"value":35}," for a command that requires\nroot privileges.",{"type":17,"children":37,"toc":639},[38,48,134,161,245,250,279,381,409,463,476,511,530,572,599,603,633],{"type":20,"tag":21,"props":39,"children":40},{},[41,42,47],{"type":25,"value":26},{"type":20,"tag":28,"props":43,"children":45},{"className":44},[],[46],{"type":25,"value":33},{"type":25,"value":35},{"type":20,"tag":49,"props":50,"children":53},"pre",{"className":51,"code":52,"language":13,"meta":7,"style":7},"language-bash shiki shiki-themes github-light","$ pacman -Syu\nerror: you cannot perform this operation unless you are root.\n",[54],{"type":20,"tag":28,"props":55,"children":56},{"__ignoreMap":7},[57,81],{"type":20,"tag":58,"props":59,"children":62},"span",{"class":60,"line":61},"line",1,[63,69,75],{"type":20,"tag":58,"props":64,"children":66},{"style":65},"--shiki-default:#6F42C1",[67],{"type":25,"value":68},"$",{"type":20,"tag":58,"props":70,"children":72},{"style":71},"--shiki-default:#032F62",[73],{"type":25,"value":74}," pacman",{"type":20,"tag":58,"props":76,"children":78},{"style":77},"--shiki-default:#005CC5",[79],{"type":25,"value":80}," -Syu\n",{"type":20,"tag":58,"props":82,"children":84},{"class":60,"line":83},2,[85,90,95,100,105,110,115,120,124,129],{"type":20,"tag":58,"props":86,"children":87},{"style":65},[88],{"type":25,"value":89},"error:",{"type":20,"tag":58,"props":91,"children":92},{"style":71},[93],{"type":25,"value":94}," you",{"type":20,"tag":58,"props":96,"children":97},{"style":71},[98],{"type":25,"value":99}," cannot",{"type":20,"tag":58,"props":101,"children":102},{"style":71},[103],{"type":25,"value":104}," perform",{"type":20,"tag":58,"props":106,"children":107},{"style":71},[108],{"type":25,"value":109}," this",{"type":20,"tag":58,"props":111,"children":112},{"style":71},[113],{"type":25,"value":114}," operation",{"type":20,"tag":58,"props":116,"children":117},{"style":71},[118],{"type":25,"value":119}," unless",{"type":20,"tag":58,"props":121,"children":122},{"style":71},[123],{"type":25,"value":94},{"type":20,"tag":58,"props":125,"children":126},{"style":71},[127],{"type":25,"value":128}," are",{"type":20,"tag":58,"props":130,"children":131},{"style":71},[132],{"type":25,"value":133}," root.\n",{"type":20,"tag":21,"props":135,"children":136},{},[137,139,145,147,152,154,159],{"type":25,"value":138},"Well, I have good news for you -- you can easily re-issue a command with the\n",{"type":20,"tag":28,"props":140,"children":142},{"className":141},[],[143],{"type":25,"value":144},"!!",{"type":25,"value":146}," designator! Simply type ",{"type":20,"tag":28,"props":148,"children":150},{"className":149},[],[151],{"type":25,"value":33},{"type":25,"value":153}," followed by ",{"type":20,"tag":28,"props":155,"children":157},{"className":156},[],[158],{"type":25,"value":144},{"type":25,"value":160}," and you're good to go.",{"type":20,"tag":49,"props":162,"children":164},{"className":51,"code":163,"language":13,"meta":7,"style":7},"$ sudo !!\nsudo pacman -Syu\n[sudo] password for colton:\n:: Synchronizing package databases...\n",[165],{"type":20,"tag":28,"props":166,"children":167},{"__ignoreMap":7},[168,185,200,221],{"type":20,"tag":58,"props":169,"children":170},{"class":60,"line":61},[171,175,180],{"type":20,"tag":58,"props":172,"children":173},{"style":65},[174],{"type":25,"value":68},{"type":20,"tag":58,"props":176,"children":177},{"style":71},[178],{"type":25,"value":179}," sudo",{"type":20,"tag":58,"props":181,"children":182},{"style":71},[183],{"type":25,"value":184}," !!\n",{"type":20,"tag":58,"props":186,"children":187},{"class":60,"line":83},[188,192,196],{"type":20,"tag":58,"props":189,"children":190},{"style":65},[191],{"type":25,"value":33},{"type":20,"tag":58,"props":193,"children":194},{"style":71},[195],{"type":25,"value":74},{"type":20,"tag":58,"props":197,"children":198},{"style":77},[199],{"type":25,"value":80},{"type":20,"tag":58,"props":201,"children":203},{"class":60,"line":202},3,[204,210,216],{"type":20,"tag":58,"props":205,"children":207},{"style":206},"--shiki-default:#24292E",[208],{"type":25,"value":209},"[sudo] password ",{"type":20,"tag":58,"props":211,"children":213},{"style":212},"--shiki-default:#D73A49",[214],{"type":25,"value":215},"for",{"type":20,"tag":58,"props":217,"children":218},{"style":206},[219],{"type":25,"value":220}," colton:\n",{"type":20,"tag":58,"props":222,"children":224},{"class":60,"line":223},4,[225,230,235,240],{"type":20,"tag":58,"props":226,"children":227},{"style":77},[228],{"type":25,"value":229},"::",{"type":20,"tag":58,"props":231,"children":232},{"style":71},[233],{"type":25,"value":234}," Synchronizing",{"type":20,"tag":58,"props":236,"children":237},{"style":71},[238],{"type":25,"value":239}," package",{"type":20,"tag":58,"props":241,"children":242},{"style":71},[243],{"type":25,"value":244}," databases...\n",{"type":20,"tag":21,"props":246,"children":247},{},[248],{"type":25,"value":249},"--",{"type":20,"tag":21,"props":251,"children":252},{},[253,255,261,263,269,271,277],{"type":25,"value":254},"Commands that are prefixed with a bang, ",{"type":20,"tag":28,"props":256,"children":258},{"className":257},[],[259],{"type":25,"value":260},"!",{"type":25,"value":262},", are considered ",{"type":20,"tag":264,"props":265,"children":266},"em",{},[267],{"type":25,"value":268},"Event\nDesignators,",{"type":25,"value":270}," and are references to your command-line history. You can take a\nlook at your history with the ",{"type":20,"tag":28,"props":272,"children":274},{"className":273},[],[275],{"type":25,"value":276},"history",{"type":25,"value":278}," command.",{"type":20,"tag":49,"props":280,"children":282},{"className":51,"code":281,"language":13,"meta":7,"style":7},"$ history\n 1021 touch hello_world.txt\n 1022 ls\n 1023 echo \"Here we go again!\"\n 1024 find . -name *.py\n",[283],{"type":20,"tag":28,"props":284,"children":285},{"__ignoreMap":7},[286,298,316,329,347],{"type":20,"tag":58,"props":287,"children":288},{"class":60,"line":61},[289,293],{"type":20,"tag":58,"props":290,"children":291},{"style":65},[292],{"type":25,"value":68},{"type":20,"tag":58,"props":294,"children":295},{"style":71},[296],{"type":25,"value":297}," history\n",{"type":20,"tag":58,"props":299,"children":300},{"class":60,"line":83},[301,306,311],{"type":20,"tag":58,"props":302,"children":303},{"style":65},[304],{"type":25,"value":305}," 1021",{"type":20,"tag":58,"props":307,"children":308},{"style":71},[309],{"type":25,"value":310}," touch",{"type":20,"tag":58,"props":312,"children":313},{"style":71},[314],{"type":25,"value":315}," hello_world.txt\n",{"type":20,"tag":58,"props":317,"children":318},{"class":60,"line":202},[319,324],{"type":20,"tag":58,"props":320,"children":321},{"style":65},[322],{"type":25,"value":323}," 1022",{"type":20,"tag":58,"props":325,"children":326},{"style":71},[327],{"type":25,"value":328}," ls\n",{"type":20,"tag":58,"props":330,"children":331},{"class":60,"line":223},[332,337,342],{"type":20,"tag":58,"props":333,"children":334},{"style":65},[335],{"type":25,"value":336}," 1023",{"type":20,"tag":58,"props":338,"children":339},{"style":71},[340],{"type":25,"value":341}," echo",{"type":20,"tag":58,"props":343,"children":344},{"style":71},[345],{"type":25,"value":346}," \"Here we go again!\"\n",{"type":20,"tag":58,"props":348,"children":350},{"class":60,"line":349},5,[351,356,361,366,371,376],{"type":20,"tag":58,"props":352,"children":353},{"style":65},[354],{"type":25,"value":355}," 1024",{"type":20,"tag":58,"props":357,"children":358},{"style":71},[359],{"type":25,"value":360}," find",{"type":20,"tag":58,"props":362,"children":363},{"style":71},[364],{"type":25,"value":365}," .",{"type":20,"tag":58,"props":367,"children":368},{"style":77},[369],{"type":25,"value":370}," -name",{"type":20,"tag":58,"props":372,"children":373},{"style":77},[374],{"type":25,"value":375}," *",{"type":20,"tag":58,"props":377,"children":378},{"style":71},[379],{"type":25,"value":380},".py\n",{"type":20,"tag":21,"props":382,"children":383},{},[384,386,391,393,399,401,407],{"type":25,"value":385},"There are many ways to use ",{"type":20,"tag":28,"props":387,"children":389},{"className":388},[],[390],{"type":25,"value":260},{"type":25,"value":392}," in your shell. For example, if you wanted to\nre-issue a specific command in your history, you could use ",{"type":20,"tag":28,"props":394,"children":396},{"className":395},[],[397],{"type":25,"value":398},"!n",{"type":25,"value":400}," where ",{"type":20,"tag":28,"props":402,"children":404},{"className":403},[],[405],{"type":25,"value":406},"n",{"type":25,"value":408}," is\nthe number next to the command in your history.",{"type":20,"tag":49,"props":410,"children":412},{"className":51,"code":411,"language":13,"meta":7,"style":7},"$ !1023\necho \"Here we go again!\"\nHere we go again!\n",[413],{"type":20,"tag":28,"props":414,"children":415},{"__ignoreMap":7},[416,428,440],{"type":20,"tag":58,"props":417,"children":418},{"class":60,"line":61},[419,423],{"type":20,"tag":58,"props":420,"children":421},{"style":65},[422],{"type":25,"value":68},{"type":20,"tag":58,"props":424,"children":425},{"style":71},[426],{"type":25,"value":427}," !1023\n",{"type":20,"tag":58,"props":429,"children":430},{"class":60,"line":83},[431,436],{"type":20,"tag":58,"props":432,"children":433},{"style":77},[434],{"type":25,"value":435},"echo",{"type":20,"tag":58,"props":437,"children":438},{"style":71},[439],{"type":25,"value":346},{"type":20,"tag":58,"props":441,"children":442},{"class":60,"line":202},[443,448,453,458],{"type":20,"tag":58,"props":444,"children":445},{"style":65},[446],{"type":25,"value":447},"Here",{"type":20,"tag":58,"props":449,"children":450},{"style":71},[451],{"type":25,"value":452}," we",{"type":20,"tag":58,"props":454,"children":455},{"style":71},[456],{"type":25,"value":457}," go",{"type":20,"tag":58,"props":459,"children":460},{"style":71},[461],{"type":25,"value":462}," again!\n",{"type":20,"tag":21,"props":464,"children":465},{},[466,468,474],{"type":25,"value":467},"Or... if you wanted to run the command you issued 4-commands ago, you can use\n",{"type":20,"tag":28,"props":469,"children":471},{"className":470},[],[472],{"type":25,"value":473},"!-4",{"type":25,"value":475},".",{"type":20,"tag":49,"props":477,"children":479},{"className":51,"code":478,"language":13,"meta":7,"style":7},"$ !-4\nls\nhello_world.txt\n",[480],{"type":20,"tag":28,"props":481,"children":482},{"__ignoreMap":7},[483,495,503],{"type":20,"tag":58,"props":484,"children":485},{"class":60,"line":61},[486,490],{"type":20,"tag":58,"props":487,"children":488},{"style":65},[489],{"type":25,"value":68},{"type":20,"tag":58,"props":491,"children":492},{"style":71},[493],{"type":25,"value":494}," !-4\n",{"type":20,"tag":58,"props":496,"children":497},{"class":60,"line":83},[498],{"type":20,"tag":58,"props":499,"children":500},{"style":65},[501],{"type":25,"value":502},"ls\n",{"type":20,"tag":58,"props":504,"children":505},{"class":60,"line":202},[506],{"type":20,"tag":58,"props":507,"children":508},{"style":65},[509],{"type":25,"value":510},"hello_world.txt\n",{"type":20,"tag":21,"props":512,"children":513},{},[514,516,521,523,529],{"type":25,"value":515},"Or... if you wanted to run the last command that started with the string\n",{"type":20,"tag":264,"props":517,"children":518},{},[519],{"type":25,"value":520},"find",{"type":25,"value":522},", you can use ",{"type":20,"tag":28,"props":524,"children":526},{"className":525},[],[527],{"type":25,"value":528},"!find",{"type":25,"value":475},{"type":20,"tag":49,"props":531,"children":533},{"className":51,"code":532,"language":13,"meta":7,"style":7},"$ !find\nfind . -name *.py\n",[534],{"type":20,"tag":28,"props":535,"children":536},{"__ignoreMap":7},[537,549],{"type":20,"tag":58,"props":538,"children":539},{"class":60,"line":61},[540,544],{"type":20,"tag":58,"props":541,"children":542},{"style":65},[543],{"type":25,"value":68},{"type":20,"tag":58,"props":545,"children":546},{"style":71},[547],{"type":25,"value":548}," !find\n",{"type":20,"tag":58,"props":550,"children":551},{"class":60,"line":83},[552,556,560,564,568],{"type":20,"tag":58,"props":553,"children":554},{"style":65},[555],{"type":25,"value":520},{"type":20,"tag":58,"props":557,"children":558},{"style":71},[559],{"type":25,"value":365},{"type":20,"tag":58,"props":561,"children":562},{"style":77},[563],{"type":25,"value":370},{"type":20,"tag":58,"props":565,"children":566},{"style":77},[567],{"type":25,"value":375},{"type":20,"tag":58,"props":569,"children":570},{"style":71},[571],{"type":25,"value":380},{"type":20,"tag":21,"props":573,"children":574},{},[575,577,582,584,589,591,597],{"type":25,"value":576},"Be sure to check out the ",{"type":20,"tag":264,"props":578,"children":579},{},[580],{"type":25,"value":581},"Event Designators",{"type":25,"value":583}," section of the ",{"type":20,"tag":28,"props":585,"children":587},{"className":586},[],[588],{"type":25,"value":13},{"type":25,"value":590}," ",{"type":20,"tag":28,"props":592,"children":594},{"className":593},[],[595],{"type":25,"value":596},"man",{"type":25,"value":598}," pages\nfor more information!",{"type":20,"tag":21,"props":600,"children":601},{},[602],{"type":25,"value":249},{"type":20,"tag":21,"props":604,"children":605},{},[606,608,617,619,624,626,631],{"type":25,"value":607},"As an aside, for even faster command-line history navigation, be sure to check\nout the excellent ",{"type":20,"tag":609,"props":610,"children":614},"a",{"href":611,"rel":612},"https://github.com/junegunn/fzf",[613],"nofollow",[615],{"type":25,"value":616},"fzf",{"type":25,"value":618}," utility by ",{"type":20,"tag":264,"props":620,"children":621},{},[622],{"type":25,"value":623},"junegunn.",{"type":25,"value":625},"\nOne of the many features of ",{"type":20,"tag":28,"props":627,"children":629},{"className":628},[],[630],{"type":25,"value":616},{"type":25,"value":632}," is browsing and re-issuing commands from your\ncommand-line history with a fuzzy-finder!",{"type":20,"tag":634,"props":635,"children":636},"style",{},[637],{"type":25,"value":638},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":83,"depth":83,"links":640},[],"markdown","content:articles:quick-tip-rerunning-bash-commands.md","content","articles/quick-tip-rerunning-bash-commands.md","md",1718681824679] \ No newline at end of file diff --git a/articles/quick-tip-rerunning-bash-commands/index.html b/articles/quick-tip-rerunning-bash-commands/index.html index ccdba99c..d0fd7584 100644 --- a/articles/quick-tip-rerunning-bash-commands/index.html +++ b/articles/quick-tip-rerunning-bash-commands/index.html @@ -4,32 +4,32 @@ - - + + - - - - + + + + - + - - - - - - - - - - - - - -

        Tip: Re-running Bash Commands

        2021-09-22

        Do you ever find yourself having to re-run a Bash command? I often find this + + + + + + + + + + + + + +

        Tip: Re-running Bash Commands

        2021-09-22

        Do you ever find yourself having to re-run a Bash command? I often find this happening to myself when I neglect to use sudo for a command that requires root privileges.

        $ pacman -Syu
         error: you cannot perform this operation unless you are root.
        @@ -61,5 +61,5 @@
         for more information!

        --

        As an aside, for even faster command-line history navigation, be sure to check out the excellent fzf utility by junegunn. One of the many features of fzf is browsing and re-issuing commands from your -command-line history with a fuzzy-finder!

        - \ No newline at end of file +command-line history with a fuzzy-finder!

        + \ No newline at end of file diff --git a/articles/reset-ipmi-password-from-host-os/_payload.json b/articles/reset-ipmi-password-from-host-os/_payload.json index fb36376c..3dbc7904 100644 --- a/articles/reset-ipmi-password-from-host-os/_payload.json +++ b/articles/reset-ipmi-password-from-host-os/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":202},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"tags":11,"categories":15,"excerpt":16,"body":26,"_type":197,"_id":198,"_source":199,"_file":200,"_extension":201},"/articles/reset-ipmi-password-from-host-os","articles",false,"","Reset IPMI Credentials from the Host OS","If you ever find yourself locked out of the Intelligent Platform Management Interface (IPMI) of a server, these\ninstructions will guide your through the process of resetting the credentials to their default values from the host\noperating system.","2021-12-27",[12,13,14],"homelab","supermicro","truenas",[12],{"type":17,"children":18},"root",[19],{"type":20,"tag":21,"props":22,"children":23},"element","p",{},[24],{"type":25,"value":9},"text",{"type":17,"children":27,"toc":194},[28,32,54,67,72,81,100,108,113,118,123,131],{"type":20,"tag":21,"props":29,"children":30},{},[31],{"type":25,"value":9},{"type":20,"tag":21,"props":33,"children":34},{},[35,37,44,46,52],{"type":25,"value":36},"If you are using an operating system like TrueNAS -- good news! It's possible to reset the IPMI password directly from\nthe web interface. This is done by navigating to ",{"type":20,"tag":38,"props":39,"children":41},"code",{"className":40},[],[42],{"type":25,"value":43},"Network > IPMI",{"type":25,"value":45},", and simply entering a new value in the ",{"type":20,"tag":47,"props":48,"children":49},"em",{},[50],{"type":25,"value":51},"IPMI\nPassword Reset",{"type":25,"value":53}," field.",{"type":20,"tag":21,"props":55,"children":56},{},[57,59,65],{"type":25,"value":58},"If you are using some other OS that doesn't have this feature, you can achieve similar results by using the ",{"type":20,"tag":38,"props":60,"children":62},{"className":61},[],[63],{"type":25,"value":64},"ipmitool",{"type":25,"value":66},"\ncommand-line utility.",{"type":20,"tag":21,"props":68,"children":69},{},[70],{"type":25,"value":71},"First, you'll want to determine the user ID associated with the user for whom you'd like to reset the password.",{"type":20,"tag":73,"props":74,"children":76},"pre",{"code":75},"# ipmitool user list\nID Name Callin Link Auth IPMI Msg Channel Priv Limit\n1 true false false Unknown (0x00)\n2 ADMIN true false false Unknown (0x00)\n",[77],{"type":20,"tag":38,"props":78,"children":79},{"__ignoreMap":7},[80],{"type":25,"value":75},{"type":20,"tag":21,"props":82,"children":83},{},[84,86,91,93,98],{"type":25,"value":85},"In this case, we will be resetting the password for ",{"type":20,"tag":47,"props":87,"children":88},{},[89],{"type":25,"value":90},"ADMIN",{"type":25,"value":92}," who has a user ID of ",{"type":20,"tag":47,"props":94,"children":95},{},[96],{"type":25,"value":97},"2",{"type":25,"value":99},". Then we'll assign the new\npassword like so:",{"type":20,"tag":73,"props":101,"children":103},{"code":102},"# ipmitool user set password 2 \u003Cpassword>\n",[104],{"type":20,"tag":38,"props":105,"children":106},{"__ignoreMap":7},[107],{"type":25,"value":102},{"type":20,"tag":21,"props":109,"children":110},{},[111],{"type":25,"value":112},"And you should be good to go!",{"type":20,"tag":21,"props":114,"children":115},{},[116],{"type":25,"value":117},"...",{"type":20,"tag":21,"props":119,"children":120},{},[121],{"type":25,"value":122},"Alternatively, if you'd like to factory reset the baseboard management controller (BMC), which will reset the IPMI\ncredentials to their default value, you can issue the following command.",{"type":20,"tag":73,"props":124,"children":126},{"code":125},"# ipmitool raw 0x3c 0x40\n",[127],{"type":20,"tag":38,"props":128,"children":129},{"__ignoreMap":7},[130],{"type":25,"value":125},{"type":20,"tag":21,"props":132,"children":133},{},[134,136,142,144,150,152,158,159,165,167,176,178,183,185,192],{"type":25,"value":135},"Where ",{"type":20,"tag":38,"props":137,"children":139},{"className":138},[],[140],{"type":25,"value":141},"0x3c",{"type":25,"value":143}," is the ",{"type":20,"tag":38,"props":145,"children":147},{"className":146},[],[148],{"type":25,"value":149},"\u003Cnetfn>",{"type":25,"value":151}," argument, a.k.a. the network function code that defines the functional routing for\nmessages, and ",{"type":20,"tag":38,"props":153,"children":155},{"className":154},[],[156],{"type":25,"value":157},"0x40",{"type":25,"value":143},{"type":20,"tag":38,"props":160,"children":162},{"className":161},[],[163],{"type":25,"value":164},"\u003Ccmd>",{"type":25,"value":166},". According to section 5.1 of the ",{"type":20,"tag":168,"props":169,"children":173},"a",{"href":170,"rel":171},"https://www.intel.com/content/dam/www/public/us/en/documents/product-briefs/ipmi-second-gen-interface-spec-v2-rev1-1.pdf",[172],"nofollow",[174],{"type":25,"value":175},"IPMI interface\nspecification",{"type":25,"value":177},",\n",{"type":20,"tag":47,"props":179,"children":180},{},[181],{"type":25,"value":182},"netfn",{"type":25,"value":184}," codes ranging from 0x30 to 0x3F are reserved for vendor specific functions. I searched around for some\nSupermicro references on these vendor specific network functions without much luck other than various ",{"type":20,"tag":168,"props":186,"children":189},{"href":187,"rel":188},"https://www.supermicro.com/support/faqs/faq.cfm?faq=15448",[172],[190],{"type":25,"value":191},"support\nresponses",{"type":25,"value":193}," on how to reset a device. Bummer!",{"title":7,"searchDepth":195,"depth":195,"links":196},2,[],"markdown","content:articles:reset-ipmi-password-from-host-os.md","content","articles/reset-ipmi-password-from-host-os.md","md",1718428848854] \ No newline at end of file +[{"data":1,"prerenderedAt":202},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"tags":11,"categories":15,"excerpt":16,"body":26,"_type":197,"_id":198,"_source":199,"_file":200,"_extension":201},"/articles/reset-ipmi-password-from-host-os","articles",false,"","Reset IPMI Credentials from the Host OS","If you ever find yourself locked out of the Intelligent Platform Management Interface (IPMI) of a server, these\ninstructions will guide your through the process of resetting the credentials to their default values from the host\noperating system.","2021-12-27",[12,13,14],"homelab","supermicro","truenas",[12],{"type":17,"children":18},"root",[19],{"type":20,"tag":21,"props":22,"children":23},"element","p",{},[24],{"type":25,"value":9},"text",{"type":17,"children":27,"toc":194},[28,32,54,67,72,81,100,108,113,118,123,131],{"type":20,"tag":21,"props":29,"children":30},{},[31],{"type":25,"value":9},{"type":20,"tag":21,"props":33,"children":34},{},[35,37,44,46,52],{"type":25,"value":36},"If you are using an operating system like TrueNAS -- good news! It's possible to reset the IPMI password directly from\nthe web interface. This is done by navigating to ",{"type":20,"tag":38,"props":39,"children":41},"code",{"className":40},[],[42],{"type":25,"value":43},"Network > IPMI",{"type":25,"value":45},", and simply entering a new value in the ",{"type":20,"tag":47,"props":48,"children":49},"em",{},[50],{"type":25,"value":51},"IPMI\nPassword Reset",{"type":25,"value":53}," field.",{"type":20,"tag":21,"props":55,"children":56},{},[57,59,65],{"type":25,"value":58},"If you are using some other OS that doesn't have this feature, you can achieve similar results by using the ",{"type":20,"tag":38,"props":60,"children":62},{"className":61},[],[63],{"type":25,"value":64},"ipmitool",{"type":25,"value":66},"\ncommand-line utility.",{"type":20,"tag":21,"props":68,"children":69},{},[70],{"type":25,"value":71},"First, you'll want to determine the user ID associated with the user for whom you'd like to reset the password.",{"type":20,"tag":73,"props":74,"children":76},"pre",{"code":75},"# ipmitool user list\nID Name Callin Link Auth IPMI Msg Channel Priv Limit\n1 true false false Unknown (0x00)\n2 ADMIN true false false Unknown (0x00)\n",[77],{"type":20,"tag":38,"props":78,"children":79},{"__ignoreMap":7},[80],{"type":25,"value":75},{"type":20,"tag":21,"props":82,"children":83},{},[84,86,91,93,98],{"type":25,"value":85},"In this case, we will be resetting the password for ",{"type":20,"tag":47,"props":87,"children":88},{},[89],{"type":25,"value":90},"ADMIN",{"type":25,"value":92}," who has a user ID of ",{"type":20,"tag":47,"props":94,"children":95},{},[96],{"type":25,"value":97},"2",{"type":25,"value":99},". Then we'll assign the new\npassword like so:",{"type":20,"tag":73,"props":101,"children":103},{"code":102},"# ipmitool user set password 2 \u003Cpassword>\n",[104],{"type":20,"tag":38,"props":105,"children":106},{"__ignoreMap":7},[107],{"type":25,"value":102},{"type":20,"tag":21,"props":109,"children":110},{},[111],{"type":25,"value":112},"And you should be good to go!",{"type":20,"tag":21,"props":114,"children":115},{},[116],{"type":25,"value":117},"...",{"type":20,"tag":21,"props":119,"children":120},{},[121],{"type":25,"value":122},"Alternatively, if you'd like to factory reset the baseboard management controller (BMC), which will reset the IPMI\ncredentials to their default value, you can issue the following command.",{"type":20,"tag":73,"props":124,"children":126},{"code":125},"# ipmitool raw 0x3c 0x40\n",[127],{"type":20,"tag":38,"props":128,"children":129},{"__ignoreMap":7},[130],{"type":25,"value":125},{"type":20,"tag":21,"props":132,"children":133},{},[134,136,142,144,150,152,158,159,165,167,176,178,183,185,192],{"type":25,"value":135},"Where ",{"type":20,"tag":38,"props":137,"children":139},{"className":138},[],[140],{"type":25,"value":141},"0x3c",{"type":25,"value":143}," is the ",{"type":20,"tag":38,"props":145,"children":147},{"className":146},[],[148],{"type":25,"value":149},"\u003Cnetfn>",{"type":25,"value":151}," argument, a.k.a. the network function code that defines the functional routing for\nmessages, and ",{"type":20,"tag":38,"props":153,"children":155},{"className":154},[],[156],{"type":25,"value":157},"0x40",{"type":25,"value":143},{"type":20,"tag":38,"props":160,"children":162},{"className":161},[],[163],{"type":25,"value":164},"\u003Ccmd>",{"type":25,"value":166},". According to section 5.1 of the ",{"type":20,"tag":168,"props":169,"children":173},"a",{"href":170,"rel":171},"https://www.intel.com/content/dam/www/public/us/en/documents/product-briefs/ipmi-second-gen-interface-spec-v2-rev1-1.pdf",[172],"nofollow",[174],{"type":25,"value":175},"IPMI interface\nspecification",{"type":25,"value":177},",\n",{"type":20,"tag":47,"props":179,"children":180},{},[181],{"type":25,"value":182},"netfn",{"type":25,"value":184}," codes ranging from 0x30 to 0x3F are reserved for vendor specific functions. I searched around for some\nSupermicro references on these vendor specific network functions without much luck other than various ",{"type":20,"tag":168,"props":186,"children":189},{"href":187,"rel":188},"https://www.supermicro.com/support/faqs/faq.cfm?faq=15448",[172],[190],{"type":25,"value":191},"support\nresponses",{"type":25,"value":193}," on how to reset a device. Bummer!",{"title":7,"searchDepth":195,"depth":195,"links":196},2,[],"markdown","content:articles:reset-ipmi-password-from-host-os.md","content","articles/reset-ipmi-password-from-host-os.md","md",1718681824676] \ No newline at end of file diff --git a/articles/reset-ipmi-password-from-host-os/index.html b/articles/reset-ipmi-password-from-host-os/index.html index 12f83590..33a34a17 100644 --- a/articles/reset-ipmi-password-from-host-os/index.html +++ b/articles/reset-ipmi-password-from-host-os/index.html @@ -4,32 +4,32 @@ - - + + - - - - + + + + - + - - - - - - - - - - - - - -

        Reset IPMI Credentials from the Host OS

        2021-12-27

        If you ever find yourself locked out of the Intelligent Platform Management Interface (IPMI) of a server, these + + + + + + + + + + + + + +

        Reset IPMI Credentials from the Host OS

        2021-12-27

        If you ever find yourself locked out of the Intelligent Platform Management Interface (IPMI) of a server, these instructions will guide your through the process of resetting the credentials to their default values from the host operating system.

        If you are using an operating system like TrueNAS -- good news! It's possible to reset the IPMI password directly from the web interface. This is done by navigating to Network > IPMI, and simply entering a new value in the IPMI @@ -47,5 +47,5 @@ specification, netfn codes ranging from 0x30 to 0x3F are reserved for vendor specific functions. I searched around for some Supermicro references on these vendor specific network functions without much luck other than various support -responses on how to reset a device. Bummer!

        - \ No newline at end of file +responses on how to reset a device. Bummer!

        + \ No newline at end of file diff --git a/articles/ssh-ed25519-sk-yubikey/_payload.json b/articles/ssh-ed25519-sk-yubikey/_payload.json index ec08ad2b..1362cec7 100644 --- a/articles/ssh-ed25519-sk-yubikey/_payload.json +++ b/articles/ssh-ed25519-sk-yubikey/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":516},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"draft":6,"date":10,"tags":11,"categories":14,"excerpt":17,"body":46,"_type":511,"_id":512,"_source":513,"_file":514,"_extension":515},"/articles/ssh-ed25519-sk-yubikey","articles",false,"","Configuring a YubiKey for use with OpenSSH","YubiKey's are a convenient way to introduce a physical form of two factor authentication into ones workflow. They support a variety of protocols, but in this guide we will walk through how to configure a YubiKey for use with OpenSSH via the \"new\" ed25519-sk key type that supports FIDO compliant hardware keys.","2024-06-09",[12,13],"unix","configurations",[15,16],"tooling","tips",{"type":18,"children":19},"root",[20],{"type":21,"tag":22,"props":23,"children":24},"element","p",{},[25,35,37,44],{"type":21,"tag":26,"props":27,"children":31},"a",{"href":28,"rel":29},"https://www.yubico.com/",[30],"nofollow",[32],{"type":33,"value":34},"text","YubiKey's",{"type":33,"value":36}," are a convenient way to introduce a physical form of two factor authentication into ones workflow. They support a variety of protocols, but in this guide we will walk through how to configure a YubiKey for use with OpenSSH via the \"new\" ",{"type":21,"tag":38,"props":39,"children":41},"code",{"className":40},[],[42],{"type":33,"value":43},"ed25519-sk",{"type":33,"value":45}," key type that supports FIDO compliant hardware keys.",{"type":18,"children":47,"toc":509},[48,63,77,86,100,143,148,192,205,238,243,376,389,484,503],{"type":21,"tag":22,"props":49,"children":50},{},[51,56,57,62],{"type":21,"tag":26,"props":52,"children":54},{"href":28,"rel":53},[30],[55],{"type":33,"value":34},{"type":33,"value":36},{"type":21,"tag":38,"props":58,"children":60},{"className":59},[],[61],{"type":33,"value":43},{"type":33,"value":45},{"type":21,"tag":22,"props":64,"children":65},{},[66,68,75],{"type":33,"value":67},"In ",{"type":21,"tag":26,"props":69,"children":72},{"href":70,"rel":71},"https://www.openssh.com/txt/release-8.2",[30],[73],{"type":33,"value":74},"release 8.2 of OpenSSH",{"type":33,"value":76}," support for FIDO devices was added with public key types \"ecdsa-sk\" and \"ed25519-sk\" (-sk standing for \"security key\"). This key type is supported by YubiKey's with firmware version 5.2.3 or higher.",{"type":21,"tag":78,"props":79,"children":80},"blockquote",{},[81],{"type":21,"tag":22,"props":82,"children":83},{},[84],{"type":33,"value":85},"This release adds support for FIDO/U2F hardware authenticators to OpenSSH. U2F/FIDO are open standards for inexpensive two-factor authentication hardware that are widely used for website authentication. In OpenSSH FIDO devices are supported by new public key types \"ecdsa-sk\" and \"ed25519-sk\", along with corresponding certificate types.",{"type":21,"tag":22,"props":87,"children":88},{},[89,91,98],{"type":33,"value":90},"Let's get started by installing the latest version of OpenSSH via ",{"type":21,"tag":26,"props":92,"children":95},{"href":93,"rel":94},"https://brew.sh/",[30],[96],{"type":33,"value":97},"Homebrew",{"type":33,"value":99},", along with the YubiKey Manager (ykman) CLI. The version of OpenSSH included with macOS is not compatible.",{"type":21,"tag":101,"props":102,"children":106},"pre",{"className":103,"code":104,"language":105,"meta":7,"style":7},"language-sh shiki shiki-themes github-light","$ brew install openssh ykman\n","sh",[107],{"type":21,"tag":38,"props":108,"children":109},{"__ignoreMap":7},[110],{"type":21,"tag":111,"props":112,"children":115},"span",{"class":113,"line":114},"line",1,[116,122,128,133,138],{"type":21,"tag":111,"props":117,"children":119},{"style":118},"--shiki-default:#6F42C1",[120],{"type":33,"value":121},"$",{"type":21,"tag":111,"props":123,"children":125},{"style":124},"--shiki-default:#032F62",[126],{"type":33,"value":127}," brew",{"type":21,"tag":111,"props":129,"children":130},{"style":124},[131],{"type":33,"value":132}," install",{"type":21,"tag":111,"props":134,"children":135},{"style":124},[136],{"type":33,"value":137}," openssh",{"type":21,"tag":111,"props":139,"children":140},{"style":124},[141],{"type":33,"value":142}," ykman\n",{"type":21,"tag":22,"props":144,"children":145},{},[146],{"type":33,"value":147},"Then, let's confirm that our YubiKey has a firmware that is greater than 5.2.3:",{"type":21,"tag":101,"props":149,"children":151},{"className":103,"code":150,"language":105,"meta":7,"style":7},"$ ykman list\nYubiKey 5Ci (5.4.3) [OTP+FIDO+CCID]\n",[152],{"type":21,"tag":38,"props":153,"children":154},{"__ignoreMap":7},[155,172],{"type":21,"tag":111,"props":156,"children":157},{"class":113,"line":114},[158,162,167],{"type":21,"tag":111,"props":159,"children":160},{"style":118},[161],{"type":33,"value":121},{"type":21,"tag":111,"props":163,"children":164},{"style":124},[165],{"type":33,"value":166}," ykman",{"type":21,"tag":111,"props":168,"children":169},{"style":124},[170],{"type":33,"value":171}," list\n",{"type":21,"tag":111,"props":173,"children":175},{"class":113,"line":174},2,[176,181,186],{"type":21,"tag":111,"props":177,"children":178},{"style":118},[179],{"type":33,"value":180},"YubiKey",{"type":21,"tag":111,"props":182,"children":183},{"style":124},[184],{"type":33,"value":185}," 5Ci",{"type":21,"tag":111,"props":187,"children":189},{"style":188},"--shiki-default:#24292E",[190],{"type":33,"value":191}," (5.4.3) [OTP+FIDO+CCID]\n",{"type":21,"tag":22,"props":193,"children":194},{},[195,197,203],{"type":33,"value":196},"Next, we'll go ahead and enable a pin on our device via the ",{"type":21,"tag":38,"props":198,"children":200},{"className":199},[],[201],{"type":33,"value":202},"change-pin",{"type":33,"value":204}," command, as this a requirement for our use.",{"type":21,"tag":101,"props":206,"children":208},{"className":103,"code":207,"language":105,"meta":7,"style":7},"$ ykman fido access change-pin\n",[209],{"type":21,"tag":38,"props":210,"children":211},{"__ignoreMap":7},[212],{"type":21,"tag":111,"props":213,"children":214},{"class":113,"line":114},[215,219,223,228,233],{"type":21,"tag":111,"props":216,"children":217},{"style":118},[218],{"type":33,"value":121},{"type":21,"tag":111,"props":220,"children":221},{"style":124},[222],{"type":33,"value":166},{"type":21,"tag":111,"props":224,"children":225},{"style":124},[226],{"type":33,"value":227}," fido",{"type":21,"tag":111,"props":229,"children":230},{"style":124},[231],{"type":33,"value":232}," access",{"type":21,"tag":111,"props":234,"children":235},{"style":124},[236],{"type":33,"value":237}," change-pin\n",{"type":21,"tag":22,"props":239,"children":240},{},[241],{"type":33,"value":242},"And last, we'll generate the key on our device!",{"type":21,"tag":101,"props":244,"children":246},{"className":103,"code":245,"language":105,"meta":7,"style":7},"$ ssh-keygen -t ed25519-sk -O resident\nGenerating public/private ed25519-sk key pair.\nYou may need to touch your authenticator to authorize key generation.\n...\n",[247],{"type":21,"tag":38,"props":248,"children":249},{"__ignoreMap":7},[250,283,310,367],{"type":21,"tag":111,"props":251,"children":252},{"class":113,"line":114},[253,257,262,268,273,278],{"type":21,"tag":111,"props":254,"children":255},{"style":118},[256],{"type":33,"value":121},{"type":21,"tag":111,"props":258,"children":259},{"style":124},[260],{"type":33,"value":261}," ssh-keygen",{"type":21,"tag":111,"props":263,"children":265},{"style":264},"--shiki-default:#005CC5",[266],{"type":33,"value":267}," -t",{"type":21,"tag":111,"props":269,"children":270},{"style":124},[271],{"type":33,"value":272}," ed25519-sk",{"type":21,"tag":111,"props":274,"children":275},{"style":264},[276],{"type":33,"value":277}," -O",{"type":21,"tag":111,"props":279,"children":280},{"style":124},[281],{"type":33,"value":282}," resident\n",{"type":21,"tag":111,"props":284,"children":285},{"class":113,"line":174},[286,291,296,300,305],{"type":21,"tag":111,"props":287,"children":288},{"style":118},[289],{"type":33,"value":290},"Generating",{"type":21,"tag":111,"props":292,"children":293},{"style":124},[294],{"type":33,"value":295}," public/private",{"type":21,"tag":111,"props":297,"children":298},{"style":124},[299],{"type":33,"value":272},{"type":21,"tag":111,"props":301,"children":302},{"style":124},[303],{"type":33,"value":304}," key",{"type":21,"tag":111,"props":306,"children":307},{"style":124},[308],{"type":33,"value":309}," pair.\n",{"type":21,"tag":111,"props":311,"children":313},{"class":113,"line":312},3,[314,319,324,329,334,339,344,349,353,358,362],{"type":21,"tag":111,"props":315,"children":316},{"style":118},[317],{"type":33,"value":318},"You",{"type":21,"tag":111,"props":320,"children":321},{"style":124},[322],{"type":33,"value":323}," may",{"type":21,"tag":111,"props":325,"children":326},{"style":124},[327],{"type":33,"value":328}," need",{"type":21,"tag":111,"props":330,"children":331},{"style":124},[332],{"type":33,"value":333}," to",{"type":21,"tag":111,"props":335,"children":336},{"style":124},[337],{"type":33,"value":338}," touch",{"type":21,"tag":111,"props":340,"children":341},{"style":124},[342],{"type":33,"value":343}," your",{"type":21,"tag":111,"props":345,"children":346},{"style":124},[347],{"type":33,"value":348}," authenticator",{"type":21,"tag":111,"props":350,"children":351},{"style":124},[352],{"type":33,"value":333},{"type":21,"tag":111,"props":354,"children":355},{"style":124},[356],{"type":33,"value":357}," authorize",{"type":21,"tag":111,"props":359,"children":360},{"style":124},[361],{"type":33,"value":304},{"type":21,"tag":111,"props":363,"children":364},{"style":124},[365],{"type":33,"value":366}," generation.\n",{"type":21,"tag":111,"props":368,"children":370},{"class":113,"line":369},4,[371],{"type":21,"tag":111,"props":372,"children":373},{"style":264},[374],{"type":33,"value":375},"...\n",{"type":21,"tag":22,"props":377,"children":378},{},[379,381,387],{"type":33,"value":380},"We specify ",{"type":21,"tag":382,"props":383,"children":384},"em",{},[385],{"type":33,"value":386},"resident",{"type":33,"value":388}," to indicate that the key handle is to be stored on the YubiKey itself, since we will be using this device with multiple computers.",{"type":21,"tag":101,"props":390,"children":394},{"className":391,"code":392,"language":393,"meta":7,"style":7},"language-txt shiki shiki-themes github-light","resident\n Indicate that the key handle should be stored on the FIDO\n authenticator itself. This makes it easier to use the\n authenticator on multiple computers. Resident keys may be\n supported on FIDO2 authenticators and typically require that a PIN\n be set on the authenticator prior to generation. Resident keys\n may be loaded off the authenticator using ssh-add(1). Storing\n both parts of a key on a FIDO authenticator increases the\n likelihood of an attacker being able to use a stolen authenticator\n device.\n","txt",[395],{"type":21,"tag":38,"props":396,"children":397},{"__ignoreMap":7},[398,406,414,422,430,439,448,457,466,475],{"type":21,"tag":111,"props":399,"children":400},{"class":113,"line":114},[401],{"type":21,"tag":111,"props":402,"children":403},{},[404],{"type":33,"value":405},"resident\n",{"type":21,"tag":111,"props":407,"children":408},{"class":113,"line":174},[409],{"type":21,"tag":111,"props":410,"children":411},{},[412],{"type":33,"value":413}," Indicate that the key handle should be stored on the FIDO\n",{"type":21,"tag":111,"props":415,"children":416},{"class":113,"line":312},[417],{"type":21,"tag":111,"props":418,"children":419},{},[420],{"type":33,"value":421}," authenticator itself. This makes it easier to use the\n",{"type":21,"tag":111,"props":423,"children":424},{"class":113,"line":369},[425],{"type":21,"tag":111,"props":426,"children":427},{},[428],{"type":33,"value":429}," authenticator on multiple computers. Resident keys may be\n",{"type":21,"tag":111,"props":431,"children":433},{"class":113,"line":432},5,[434],{"type":21,"tag":111,"props":435,"children":436},{},[437],{"type":33,"value":438}," supported on FIDO2 authenticators and typically require that a PIN\n",{"type":21,"tag":111,"props":440,"children":442},{"class":113,"line":441},6,[443],{"type":21,"tag":111,"props":444,"children":445},{},[446],{"type":33,"value":447}," be set on the authenticator prior to generation. Resident keys\n",{"type":21,"tag":111,"props":449,"children":451},{"class":113,"line":450},7,[452],{"type":21,"tag":111,"props":453,"children":454},{},[455],{"type":33,"value":456}," may be loaded off the authenticator using ssh-add(1). Storing\n",{"type":21,"tag":111,"props":458,"children":460},{"class":113,"line":459},8,[461],{"type":21,"tag":111,"props":462,"children":463},{},[464],{"type":33,"value":465}," both parts of a key on a FIDO authenticator increases the\n",{"type":21,"tag":111,"props":467,"children":469},{"class":113,"line":468},9,[470],{"type":21,"tag":111,"props":471,"children":472},{},[473],{"type":33,"value":474}," likelihood of an attacker being able to use a stolen authenticator\n",{"type":21,"tag":111,"props":476,"children":478},{"class":113,"line":477},10,[479],{"type":21,"tag":111,"props":480,"children":481},{},[482],{"type":33,"value":483}," device.\n",{"type":21,"tag":22,"props":485,"children":486},{},[487,489,494,496,501],{"type":33,"value":488},"And that's all it takes -- simple enough. Now, when interacting with ",{"type":21,"tag":382,"props":490,"children":491},{},[492],{"type":33,"value":493},"ssh",{"type":33,"value":495}," or ",{"type":21,"tag":382,"props":497,"children":498},{},[499],{"type":33,"value":500},"git",{"type":33,"value":502}," you will be prompted to touch the YubiKey to bring that little bit of physical 2FA.",{"type":21,"tag":504,"props":505,"children":506},"style",{},[507],{"type":33,"value":508},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":174,"depth":174,"links":510},[],"markdown","content:articles:ssh-ed25519-sk-yubikey.md","content","articles/ssh-ed25519-sk-yubikey.md","md",1718428848839] \ No newline at end of file +[{"data":1,"prerenderedAt":516},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"draft":6,"date":10,"tags":11,"categories":14,"excerpt":17,"body":46,"_type":511,"_id":512,"_source":513,"_file":514,"_extension":515},"/articles/ssh-ed25519-sk-yubikey","articles",false,"","Configuring a YubiKey for use with OpenSSH","YubiKey's are a convenient way to introduce a physical form of two factor authentication into ones workflow. They support a variety of protocols, but in this guide we will walk through how to configure a YubiKey for use with OpenSSH via the \"new\" ed25519-sk key type that supports FIDO compliant hardware keys.","2024-06-09",[12,13],"unix","configurations",[15,16],"tooling","tips",{"type":18,"children":19},"root",[20],{"type":21,"tag":22,"props":23,"children":24},"element","p",{},[25,35,37,44],{"type":21,"tag":26,"props":27,"children":31},"a",{"href":28,"rel":29},"https://www.yubico.com/",[30],"nofollow",[32],{"type":33,"value":34},"text","YubiKey's",{"type":33,"value":36}," are a convenient way to introduce a physical form of two factor authentication into ones workflow. They support a variety of protocols, but in this guide we will walk through how to configure a YubiKey for use with OpenSSH via the \"new\" ",{"type":21,"tag":38,"props":39,"children":41},"code",{"className":40},[],[42],{"type":33,"value":43},"ed25519-sk",{"type":33,"value":45}," key type that supports FIDO compliant hardware keys.",{"type":18,"children":47,"toc":509},[48,63,77,86,100,143,148,192,205,238,243,376,389,484,503],{"type":21,"tag":22,"props":49,"children":50},{},[51,56,57,62],{"type":21,"tag":26,"props":52,"children":54},{"href":28,"rel":53},[30],[55],{"type":33,"value":34},{"type":33,"value":36},{"type":21,"tag":38,"props":58,"children":60},{"className":59},[],[61],{"type":33,"value":43},{"type":33,"value":45},{"type":21,"tag":22,"props":64,"children":65},{},[66,68,75],{"type":33,"value":67},"In ",{"type":21,"tag":26,"props":69,"children":72},{"href":70,"rel":71},"https://www.openssh.com/txt/release-8.2",[30],[73],{"type":33,"value":74},"release 8.2 of OpenSSH",{"type":33,"value":76}," support for FIDO devices was added with public key types \"ecdsa-sk\" and \"ed25519-sk\" (-sk standing for \"security key\"). This key type is supported by YubiKey's with firmware version 5.2.3 or higher.",{"type":21,"tag":78,"props":79,"children":80},"blockquote",{},[81],{"type":21,"tag":22,"props":82,"children":83},{},[84],{"type":33,"value":85},"This release adds support for FIDO/U2F hardware authenticators to OpenSSH. U2F/FIDO are open standards for inexpensive two-factor authentication hardware that are widely used for website authentication. In OpenSSH FIDO devices are supported by new public key types \"ecdsa-sk\" and \"ed25519-sk\", along with corresponding certificate types.",{"type":21,"tag":22,"props":87,"children":88},{},[89,91,98],{"type":33,"value":90},"Let's get started by installing the latest version of OpenSSH via ",{"type":21,"tag":26,"props":92,"children":95},{"href":93,"rel":94},"https://brew.sh/",[30],[96],{"type":33,"value":97},"Homebrew",{"type":33,"value":99},", along with the YubiKey Manager (ykman) CLI. The version of OpenSSH included with macOS is not compatible.",{"type":21,"tag":101,"props":102,"children":106},"pre",{"className":103,"code":104,"language":105,"meta":7,"style":7},"language-sh shiki shiki-themes github-light","$ brew install openssh ykman\n","sh",[107],{"type":21,"tag":38,"props":108,"children":109},{"__ignoreMap":7},[110],{"type":21,"tag":111,"props":112,"children":115},"span",{"class":113,"line":114},"line",1,[116,122,128,133,138],{"type":21,"tag":111,"props":117,"children":119},{"style":118},"--shiki-default:#6F42C1",[120],{"type":33,"value":121},"$",{"type":21,"tag":111,"props":123,"children":125},{"style":124},"--shiki-default:#032F62",[126],{"type":33,"value":127}," brew",{"type":21,"tag":111,"props":129,"children":130},{"style":124},[131],{"type":33,"value":132}," install",{"type":21,"tag":111,"props":134,"children":135},{"style":124},[136],{"type":33,"value":137}," openssh",{"type":21,"tag":111,"props":139,"children":140},{"style":124},[141],{"type":33,"value":142}," ykman\n",{"type":21,"tag":22,"props":144,"children":145},{},[146],{"type":33,"value":147},"Then, let's confirm that our YubiKey has a firmware that is greater than 5.2.3:",{"type":21,"tag":101,"props":149,"children":151},{"className":103,"code":150,"language":105,"meta":7,"style":7},"$ ykman list\nYubiKey 5Ci (5.4.3) [OTP+FIDO+CCID]\n",[152],{"type":21,"tag":38,"props":153,"children":154},{"__ignoreMap":7},[155,172],{"type":21,"tag":111,"props":156,"children":157},{"class":113,"line":114},[158,162,167],{"type":21,"tag":111,"props":159,"children":160},{"style":118},[161],{"type":33,"value":121},{"type":21,"tag":111,"props":163,"children":164},{"style":124},[165],{"type":33,"value":166}," ykman",{"type":21,"tag":111,"props":168,"children":169},{"style":124},[170],{"type":33,"value":171}," list\n",{"type":21,"tag":111,"props":173,"children":175},{"class":113,"line":174},2,[176,181,186],{"type":21,"tag":111,"props":177,"children":178},{"style":118},[179],{"type":33,"value":180},"YubiKey",{"type":21,"tag":111,"props":182,"children":183},{"style":124},[184],{"type":33,"value":185}," 5Ci",{"type":21,"tag":111,"props":187,"children":189},{"style":188},"--shiki-default:#24292E",[190],{"type":33,"value":191}," (5.4.3) [OTP+FIDO+CCID]\n",{"type":21,"tag":22,"props":193,"children":194},{},[195,197,203],{"type":33,"value":196},"Next, we'll go ahead and enable a pin on our device via the ",{"type":21,"tag":38,"props":198,"children":200},{"className":199},[],[201],{"type":33,"value":202},"change-pin",{"type":33,"value":204}," command, as this a requirement for our use.",{"type":21,"tag":101,"props":206,"children":208},{"className":103,"code":207,"language":105,"meta":7,"style":7},"$ ykman fido access change-pin\n",[209],{"type":21,"tag":38,"props":210,"children":211},{"__ignoreMap":7},[212],{"type":21,"tag":111,"props":213,"children":214},{"class":113,"line":114},[215,219,223,228,233],{"type":21,"tag":111,"props":216,"children":217},{"style":118},[218],{"type":33,"value":121},{"type":21,"tag":111,"props":220,"children":221},{"style":124},[222],{"type":33,"value":166},{"type":21,"tag":111,"props":224,"children":225},{"style":124},[226],{"type":33,"value":227}," fido",{"type":21,"tag":111,"props":229,"children":230},{"style":124},[231],{"type":33,"value":232}," access",{"type":21,"tag":111,"props":234,"children":235},{"style":124},[236],{"type":33,"value":237}," change-pin\n",{"type":21,"tag":22,"props":239,"children":240},{},[241],{"type":33,"value":242},"And last, we'll generate the key on our device!",{"type":21,"tag":101,"props":244,"children":246},{"className":103,"code":245,"language":105,"meta":7,"style":7},"$ ssh-keygen -t ed25519-sk -O resident\nGenerating public/private ed25519-sk key pair.\nYou may need to touch your authenticator to authorize key generation.\n...\n",[247],{"type":21,"tag":38,"props":248,"children":249},{"__ignoreMap":7},[250,283,310,367],{"type":21,"tag":111,"props":251,"children":252},{"class":113,"line":114},[253,257,262,268,273,278],{"type":21,"tag":111,"props":254,"children":255},{"style":118},[256],{"type":33,"value":121},{"type":21,"tag":111,"props":258,"children":259},{"style":124},[260],{"type":33,"value":261}," ssh-keygen",{"type":21,"tag":111,"props":263,"children":265},{"style":264},"--shiki-default:#005CC5",[266],{"type":33,"value":267}," -t",{"type":21,"tag":111,"props":269,"children":270},{"style":124},[271],{"type":33,"value":272}," ed25519-sk",{"type":21,"tag":111,"props":274,"children":275},{"style":264},[276],{"type":33,"value":277}," -O",{"type":21,"tag":111,"props":279,"children":280},{"style":124},[281],{"type":33,"value":282}," resident\n",{"type":21,"tag":111,"props":284,"children":285},{"class":113,"line":174},[286,291,296,300,305],{"type":21,"tag":111,"props":287,"children":288},{"style":118},[289],{"type":33,"value":290},"Generating",{"type":21,"tag":111,"props":292,"children":293},{"style":124},[294],{"type":33,"value":295}," public/private",{"type":21,"tag":111,"props":297,"children":298},{"style":124},[299],{"type":33,"value":272},{"type":21,"tag":111,"props":301,"children":302},{"style":124},[303],{"type":33,"value":304}," key",{"type":21,"tag":111,"props":306,"children":307},{"style":124},[308],{"type":33,"value":309}," pair.\n",{"type":21,"tag":111,"props":311,"children":313},{"class":113,"line":312},3,[314,319,324,329,334,339,344,349,353,358,362],{"type":21,"tag":111,"props":315,"children":316},{"style":118},[317],{"type":33,"value":318},"You",{"type":21,"tag":111,"props":320,"children":321},{"style":124},[322],{"type":33,"value":323}," may",{"type":21,"tag":111,"props":325,"children":326},{"style":124},[327],{"type":33,"value":328}," need",{"type":21,"tag":111,"props":330,"children":331},{"style":124},[332],{"type":33,"value":333}," to",{"type":21,"tag":111,"props":335,"children":336},{"style":124},[337],{"type":33,"value":338}," touch",{"type":21,"tag":111,"props":340,"children":341},{"style":124},[342],{"type":33,"value":343}," your",{"type":21,"tag":111,"props":345,"children":346},{"style":124},[347],{"type":33,"value":348}," authenticator",{"type":21,"tag":111,"props":350,"children":351},{"style":124},[352],{"type":33,"value":333},{"type":21,"tag":111,"props":354,"children":355},{"style":124},[356],{"type":33,"value":357}," authorize",{"type":21,"tag":111,"props":359,"children":360},{"style":124},[361],{"type":33,"value":304},{"type":21,"tag":111,"props":363,"children":364},{"style":124},[365],{"type":33,"value":366}," generation.\n",{"type":21,"tag":111,"props":368,"children":370},{"class":113,"line":369},4,[371],{"type":21,"tag":111,"props":372,"children":373},{"style":264},[374],{"type":33,"value":375},"...\n",{"type":21,"tag":22,"props":377,"children":378},{},[379,381,387],{"type":33,"value":380},"We specify ",{"type":21,"tag":382,"props":383,"children":384},"em",{},[385],{"type":33,"value":386},"resident",{"type":33,"value":388}," to indicate that the key handle is to be stored on the YubiKey itself, since we will be using this device with multiple computers.",{"type":21,"tag":101,"props":390,"children":394},{"className":391,"code":392,"language":393,"meta":7,"style":7},"language-txt shiki shiki-themes github-light","resident\n Indicate that the key handle should be stored on the FIDO\n authenticator itself. This makes it easier to use the\n authenticator on multiple computers. Resident keys may be\n supported on FIDO2 authenticators and typically require that a PIN\n be set on the authenticator prior to generation. Resident keys\n may be loaded off the authenticator using ssh-add(1). Storing\n both parts of a key on a FIDO authenticator increases the\n likelihood of an attacker being able to use a stolen authenticator\n device.\n","txt",[395],{"type":21,"tag":38,"props":396,"children":397},{"__ignoreMap":7},[398,406,414,422,430,439,448,457,466,475],{"type":21,"tag":111,"props":399,"children":400},{"class":113,"line":114},[401],{"type":21,"tag":111,"props":402,"children":403},{},[404],{"type":33,"value":405},"resident\n",{"type":21,"tag":111,"props":407,"children":408},{"class":113,"line":174},[409],{"type":21,"tag":111,"props":410,"children":411},{},[412],{"type":33,"value":413}," Indicate that the key handle should be stored on the FIDO\n",{"type":21,"tag":111,"props":415,"children":416},{"class":113,"line":312},[417],{"type":21,"tag":111,"props":418,"children":419},{},[420],{"type":33,"value":421}," authenticator itself. This makes it easier to use the\n",{"type":21,"tag":111,"props":423,"children":424},{"class":113,"line":369},[425],{"type":21,"tag":111,"props":426,"children":427},{},[428],{"type":33,"value":429}," authenticator on multiple computers. Resident keys may be\n",{"type":21,"tag":111,"props":431,"children":433},{"class":113,"line":432},5,[434],{"type":21,"tag":111,"props":435,"children":436},{},[437],{"type":33,"value":438}," supported on FIDO2 authenticators and typically require that a PIN\n",{"type":21,"tag":111,"props":440,"children":442},{"class":113,"line":441},6,[443],{"type":21,"tag":111,"props":444,"children":445},{},[446],{"type":33,"value":447}," be set on the authenticator prior to generation. Resident keys\n",{"type":21,"tag":111,"props":449,"children":451},{"class":113,"line":450},7,[452],{"type":21,"tag":111,"props":453,"children":454},{},[455],{"type":33,"value":456}," may be loaded off the authenticator using ssh-add(1). Storing\n",{"type":21,"tag":111,"props":458,"children":460},{"class":113,"line":459},8,[461],{"type":21,"tag":111,"props":462,"children":463},{},[464],{"type":33,"value":465}," both parts of a key on a FIDO authenticator increases the\n",{"type":21,"tag":111,"props":467,"children":469},{"class":113,"line":468},9,[470],{"type":21,"tag":111,"props":471,"children":472},{},[473],{"type":33,"value":474}," likelihood of an attacker being able to use a stolen authenticator\n",{"type":21,"tag":111,"props":476,"children":478},{"class":113,"line":477},10,[479],{"type":21,"tag":111,"props":480,"children":481},{},[482],{"type":33,"value":483}," device.\n",{"type":21,"tag":22,"props":485,"children":486},{},[487,489,494,496,501],{"type":33,"value":488},"And that's all it takes -- simple enough. Now, when interacting with ",{"type":21,"tag":382,"props":490,"children":491},{},[492],{"type":33,"value":493},"ssh",{"type":33,"value":495}," or ",{"type":21,"tag":382,"props":497,"children":498},{},[499],{"type":33,"value":500},"git",{"type":33,"value":502}," you will be prompted to touch the YubiKey to bring that little bit of physical 2FA.",{"type":21,"tag":504,"props":505,"children":506},"style",{},[507],{"type":33,"value":508},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":174,"depth":174,"links":510},[],"markdown","content:articles:ssh-ed25519-sk-yubikey.md","content","articles/ssh-ed25519-sk-yubikey.md","md",1718681824630] \ No newline at end of file diff --git a/articles/ssh-ed25519-sk-yubikey/index.html b/articles/ssh-ed25519-sk-yubikey/index.html index f74960af..1efdb1cc 100644 --- a/articles/ssh-ed25519-sk-yubikey/index.html +++ b/articles/ssh-ed25519-sk-yubikey/index.html @@ -4,33 +4,33 @@ - - + + - - - - + + + + - + - - - - - - - - - - - - - - -

        Configuring a YubiKey for use with OpenSSH

        2024-06-09

        YubiKey's are a convenient way to introduce a physical form of two factor authentication into ones workflow. They support a variety of protocols, but in this guide we will walk through how to configure a YubiKey for use with OpenSSH via the "new" ed25519-sk key type that supports FIDO compliant hardware keys.

        In release 8.2 of OpenSSH support for FIDO devices was added with public key types "ecdsa-sk" and "ed25519-sk" (-sk standing for "security key"). This key type is supported by YubiKey's with firmware version 5.2.3 or higher.

        This release adds support for FIDO/U2F hardware authenticators to OpenSSH. U2F/FIDO are open standards for inexpensive two-factor authentication hardware that are widely used for website authentication. In OpenSSH FIDO devices are supported by new public key types "ecdsa-sk" and "ed25519-sk", along with corresponding certificate types.

        Let's get started by installing the latest version of OpenSSH via Homebrew, along with the YubiKey Manager (ykman) CLI. The version of OpenSSH included with macOS is not compatible.

        $ brew install openssh ykman
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +

        Configuring a YubiKey for use with OpenSSH

        2024-06-09

        YubiKey's are a convenient way to introduce a physical form of two factor authentication into ones workflow. They support a variety of protocols, but in this guide we will walk through how to configure a YubiKey for use with OpenSSH via the "new" ed25519-sk key type that supports FIDO compliant hardware keys.

        In release 8.2 of OpenSSH support for FIDO devices was added with public key types "ecdsa-sk" and "ed25519-sk" (-sk standing for "security key"). This key type is supported by YubiKey's with firmware version 5.2.3 or higher.

        This release adds support for FIDO/U2F hardware authenticators to OpenSSH. U2F/FIDO are open standards for inexpensive two-factor authentication hardware that are widely used for website authentication. In OpenSSH FIDO devices are supported by new public key types "ecdsa-sk" and "ed25519-sk", along with corresponding certificate types.

        Let's get started by installing the latest version of OpenSSH via Homebrew, along with the YubiKey Manager (ykman) CLI. The version of OpenSSH included with macOS is not compatible.

        $ brew install openssh ykman
         

        Then, let's confirm that our YubiKey has a firmware that is greater than 5.2.3:

        $ ykman list
         YubiKey 5Ci (5.4.3) [OTP+FIDO+CCID]
         

        Next, we'll go ahead and enable a pin on our device via the change-pin command, as this a requirement for our use.

        $ ykman fido access change-pin
        @@ -48,5 +48,5 @@
                 both parts of a key on a FIDO authenticator increases the
                 likelihood of an attacker being able to use a stolen authenticator
                 device.
        -

        And that's all it takes -- simple enough. Now, when interacting with ssh or git you will be prompted to touch the YubiKey to bring that little bit of physical 2FA.

        - \ No newline at end of file +

        And that's all it takes -- simple enough. Now, when interacting with ssh or git you will be prompted to touch the YubiKey to bring that little bit of physical 2FA.

        + \ No newline at end of file diff --git a/articles/unit-testing-micropython-with-mocks/_payload.json b/articles/unit-testing-micropython-with-mocks/_payload.json index da5870ba..f262fb25 100644 --- a/articles/unit-testing-micropython-with-mocks/_payload.json +++ b/articles/unit-testing-micropython-with-mocks/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":689},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"draft":6,"tags":11,"categories":16,"excerpt":19,"body":29,"_type":684,"_id":685,"_source":686,"_file":687,"_extension":688},"/articles/unit-testing-micropython-with-mocks","articles",false,"","Unit Testing in MicroPython with Mocks","Unit testing code for embedded systems can be challenging. While it's possible\nto leverage emulators, write side-effect free code, or run tests on the\nhardware itself, it's often easiest to unit test the code on your personal\ncomputer with mocked hardware functionality.","2020-02-07",[12,13,14,15],"micropython","testing","mocks","tutorial",[17,18],"python","embedded",{"type":20,"children":21},"root",[22],{"type":23,"tag":24,"props":25,"children":26},"element","p",{},[27],{"type":28,"value":9},"text",{"type":20,"children":30,"toc":681},[31,35,42,47,53,75,252,278,398,419,618,646,653,675],{"type":23,"tag":24,"props":32,"children":33},{},[34],{"type":28,"value":9},{"type":23,"tag":36,"props":37,"children":39},"h1",{"id":38},"mocking",[40],{"type":28,"value":41},"Mocking",{"type":23,"tag":24,"props":43,"children":44},{},[45],{"type":28,"value":46},"Mocks allow us to replace the hardware interfacing functionality under-the-hood\nwith predefined results and side-effects. For example, if there is a piece of\nlogic that retrieves values from an accelerometer to get a device's\norientation, it would be possible to mock the returned values of the\naccelerometer -- allowing us to run the unit tests on a device that does not\nhave an accelerometer sensor installed.",{"type":23,"tag":36,"props":48,"children":50},{"id":49},"a-micropython-mocking-example",[51],{"type":28,"value":52},"A MicroPython Mocking Example",{"type":23,"tag":24,"props":54,"children":55},{},[56,58,65,67,73],{"type":28,"value":57},"In this example, we will be unit testing a module named ",{"type":23,"tag":59,"props":60,"children":62},"code",{"className":61},[],[63],{"type":28,"value":64},"time_logger",{"type":28,"value":66},", that\ndepends on the MicroPython library ",{"type":23,"tag":59,"props":68,"children":70},{"className":69},[],[71],{"type":28,"value":72},"utime",{"type":28,"value":74}," to log the most recent Epoch time to\na file.",{"type":23,"tag":76,"props":77,"children":80},"pre",{"className":78,"code":79,"language":17,"meta":7,"style":7},"language-python shiki shiki-themes github-light","# time_logger.py\n\nclass TimeLogger(object):\n\n def save_time(self):\n \"\"\" Overwrite a file with the most recent Epoch timestamp from `utime`\n \"\"\"\n with open(\"LAST_KNOWN_TIME\", \"w+\") as f:\n f.write(str(utime.time()))\n",[81],{"type":23,"tag":59,"props":82,"children":83},{"__ignoreMap":7},[84,96,106,139,147,166,176,185,233],{"type":23,"tag":85,"props":86,"children":89},"span",{"class":87,"line":88},"line",1,[90],{"type":23,"tag":85,"props":91,"children":93},{"style":92},"--shiki-default:#6A737D",[94],{"type":28,"value":95},"# time_logger.py\n",{"type":23,"tag":85,"props":97,"children":99},{"class":87,"line":98},2,[100],{"type":23,"tag":85,"props":101,"children":103},{"emptyLinePlaceholder":102},true,[104],{"type":28,"value":105},"\n",{"type":23,"tag":85,"props":107,"children":109},{"class":87,"line":108},3,[110,116,122,128,134],{"type":23,"tag":85,"props":111,"children":113},{"style":112},"--shiki-default:#D73A49",[114],{"type":28,"value":115},"class",{"type":23,"tag":85,"props":117,"children":119},{"style":118},"--shiki-default:#6F42C1",[120],{"type":28,"value":121}," TimeLogger",{"type":23,"tag":85,"props":123,"children":125},{"style":124},"--shiki-default:#24292E",[126],{"type":28,"value":127},"(",{"type":23,"tag":85,"props":129,"children":131},{"style":130},"--shiki-default:#005CC5",[132],{"type":28,"value":133},"object",{"type":23,"tag":85,"props":135,"children":136},{"style":124},[137],{"type":28,"value":138},"):\n",{"type":23,"tag":85,"props":140,"children":142},{"class":87,"line":141},4,[143],{"type":23,"tag":85,"props":144,"children":145},{"emptyLinePlaceholder":102},[146],{"type":28,"value":105},{"type":23,"tag":85,"props":148,"children":150},{"class":87,"line":149},5,[151,156,161],{"type":23,"tag":85,"props":152,"children":153},{"style":112},[154],{"type":28,"value":155}," def",{"type":23,"tag":85,"props":157,"children":158},{"style":118},[159],{"type":28,"value":160}," save_time",{"type":23,"tag":85,"props":162,"children":163},{"style":124},[164],{"type":28,"value":165},"(self):\n",{"type":23,"tag":85,"props":167,"children":169},{"class":87,"line":168},6,[170],{"type":23,"tag":85,"props":171,"children":173},{"style":172},"--shiki-default:#032F62",[174],{"type":28,"value":175}," \"\"\" Overwrite a file with the most recent Epoch timestamp from `utime`\n",{"type":23,"tag":85,"props":177,"children":179},{"class":87,"line":178},7,[180],{"type":23,"tag":85,"props":181,"children":182},{"style":172},[183],{"type":28,"value":184}," \"\"\"\n",{"type":23,"tag":85,"props":186,"children":188},{"class":87,"line":187},8,[189,194,199,203,208,213,218,223,228],{"type":23,"tag":85,"props":190,"children":191},{"style":112},[192],{"type":28,"value":193}," with",{"type":23,"tag":85,"props":195,"children":196},{"style":130},[197],{"type":28,"value":198}," open",{"type":23,"tag":85,"props":200,"children":201},{"style":124},[202],{"type":28,"value":127},{"type":23,"tag":85,"props":204,"children":205},{"style":172},[206],{"type":28,"value":207},"\"LAST_KNOWN_TIME\"",{"type":23,"tag":85,"props":209,"children":210},{"style":124},[211],{"type":28,"value":212},", ",{"type":23,"tag":85,"props":214,"children":215},{"style":172},[216],{"type":28,"value":217},"\"w+\"",{"type":23,"tag":85,"props":219,"children":220},{"style":124},[221],{"type":28,"value":222},") ",{"type":23,"tag":85,"props":224,"children":225},{"style":112},[226],{"type":28,"value":227},"as",{"type":23,"tag":85,"props":229,"children":230},{"style":124},[231],{"type":28,"value":232}," f:\n",{"type":23,"tag":85,"props":234,"children":236},{"class":87,"line":235},9,[237,242,247],{"type":23,"tag":85,"props":238,"children":239},{"style":124},[240],{"type":28,"value":241}," f.write(",{"type":23,"tag":85,"props":243,"children":244},{"style":130},[245],{"type":28,"value":246},"str",{"type":23,"tag":85,"props":248,"children":249},{"style":124},[250],{"type":28,"value":251},"(utime.time()))\n",{"type":23,"tag":24,"props":253,"children":254},{},[255,257,262,264,269,271,276],{"type":28,"value":256},"First, because the ",{"type":23,"tag":59,"props":258,"children":260},{"className":259},[],[261],{"type":28,"value":72},{"type":28,"value":263}," module is not installed on the machine that the unit\ntests on, we must mock ",{"type":23,"tag":59,"props":265,"children":267},{"className":266},[],[268],{"type":28,"value":72},{"type":28,"value":270}," module before importing ",{"type":23,"tag":59,"props":272,"children":274},{"className":273},[],[275],{"type":28,"value":64},{"type":28,"value":277}," in our\nunit test file.",{"type":23,"tag":76,"props":279,"children":281},{"className":78,"code":280,"language":17,"meta":7,"style":7},"# test_time_logger.py\n\nimport unittest\n\nfrom unittest.mock import MagicMock\n\nsys.modules['utime'] = MagicMock()\nfrom time_logger import TimeLogger\n",[282],{"type":23,"tag":59,"props":283,"children":284},{"__ignoreMap":7},[285,293,300,313,320,342,349,377],{"type":23,"tag":85,"props":286,"children":287},{"class":87,"line":88},[288],{"type":23,"tag":85,"props":289,"children":290},{"style":92},[291],{"type":28,"value":292},"# test_time_logger.py\n",{"type":23,"tag":85,"props":294,"children":295},{"class":87,"line":98},[296],{"type":23,"tag":85,"props":297,"children":298},{"emptyLinePlaceholder":102},[299],{"type":28,"value":105},{"type":23,"tag":85,"props":301,"children":302},{"class":87,"line":108},[303,308],{"type":23,"tag":85,"props":304,"children":305},{"style":112},[306],{"type":28,"value":307},"import",{"type":23,"tag":85,"props":309,"children":310},{"style":124},[311],{"type":28,"value":312}," unittest\n",{"type":23,"tag":85,"props":314,"children":315},{"class":87,"line":141},[316],{"type":23,"tag":85,"props":317,"children":318},{"emptyLinePlaceholder":102},[319],{"type":28,"value":105},{"type":23,"tag":85,"props":321,"children":322},{"class":87,"line":149},[323,328,333,337],{"type":23,"tag":85,"props":324,"children":325},{"style":112},[326],{"type":28,"value":327},"from",{"type":23,"tag":85,"props":329,"children":330},{"style":124},[331],{"type":28,"value":332}," unittest.mock ",{"type":23,"tag":85,"props":334,"children":335},{"style":112},[336],{"type":28,"value":307},{"type":23,"tag":85,"props":338,"children":339},{"style":124},[340],{"type":28,"value":341}," MagicMock\n",{"type":23,"tag":85,"props":343,"children":344},{"class":87,"line":168},[345],{"type":23,"tag":85,"props":346,"children":347},{"emptyLinePlaceholder":102},[348],{"type":28,"value":105},{"type":23,"tag":85,"props":350,"children":351},{"class":87,"line":178},[352,357,362,367,372],{"type":23,"tag":85,"props":353,"children":354},{"style":124},[355],{"type":28,"value":356},"sys.modules[",{"type":23,"tag":85,"props":358,"children":359},{"style":172},[360],{"type":28,"value":361},"'utime'",{"type":23,"tag":85,"props":363,"children":364},{"style":124},[365],{"type":28,"value":366},"] ",{"type":23,"tag":85,"props":368,"children":369},{"style":112},[370],{"type":28,"value":371},"=",{"type":23,"tag":85,"props":373,"children":374},{"style":124},[375],{"type":28,"value":376}," MagicMock()\n",{"type":23,"tag":85,"props":378,"children":379},{"class":87,"line":187},[380,384,389,393],{"type":23,"tag":85,"props":381,"children":382},{"style":112},[383],{"type":28,"value":327},{"type":23,"tag":85,"props":385,"children":386},{"style":124},[387],{"type":28,"value":388}," time_logger ",{"type":23,"tag":85,"props":390,"children":391},{"style":112},[392],{"type":28,"value":307},{"type":23,"tag":85,"props":394,"children":395},{"style":124},[396],{"type":28,"value":397}," TimeLogger\n",{"type":23,"tag":24,"props":399,"children":400},{},[401,403,409,411,417],{"type":28,"value":402},"Then, we can write a test that patches the ",{"type":23,"tag":59,"props":404,"children":406},{"className":405},[],[407],{"type":28,"value":408},"utime.time",{"type":28,"value":410}," functionality so that\nit returns a value of our choosing -- in this case, ",{"type":23,"tag":59,"props":412,"children":414},{"className":413},[],[415],{"type":28,"value":416},"1234",{"type":28,"value":418},".",{"type":23,"tag":76,"props":420,"children":422},{"className":78,"code":421,"language":17,"meta":7,"style":7},"class TestTimeLogger(unittest.TestCase):\n\n def test_save_time(self):\n \"\"\" Verify that the Epoch time is written to file\n \"\"\"\n with unittest.mock.patch(\"utime.time\", return_value=1234):\n t = TimeLogger()\n t.save_time()\n with open(\"LAST_KNOWN_TIME\") as f:\n self.assertEqual(\"1234\", f.read())\n",[423],{"type":23,"tag":59,"props":424,"children":425},{"__ignoreMap":7},[426,460,467,483,491,498,537,554,562,594],{"type":23,"tag":85,"props":427,"children":428},{"class":87,"line":88},[429,433,438,442,447,451,456],{"type":23,"tag":85,"props":430,"children":431},{"style":112},[432],{"type":28,"value":115},{"type":23,"tag":85,"props":434,"children":435},{"style":118},[436],{"type":28,"value":437}," TestTimeLogger",{"type":23,"tag":85,"props":439,"children":440},{"style":124},[441],{"type":28,"value":127},{"type":23,"tag":85,"props":443,"children":444},{"style":118},[445],{"type":28,"value":446},"unittest",{"type":23,"tag":85,"props":448,"children":449},{"style":124},[450],{"type":28,"value":418},{"type":23,"tag":85,"props":452,"children":453},{"style":118},[454],{"type":28,"value":455},"TestCase",{"type":23,"tag":85,"props":457,"children":458},{"style":124},[459],{"type":28,"value":138},{"type":23,"tag":85,"props":461,"children":462},{"class":87,"line":98},[463],{"type":23,"tag":85,"props":464,"children":465},{"emptyLinePlaceholder":102},[466],{"type":28,"value":105},{"type":23,"tag":85,"props":468,"children":469},{"class":87,"line":108},[470,474,479],{"type":23,"tag":85,"props":471,"children":472},{"style":112},[473],{"type":28,"value":155},{"type":23,"tag":85,"props":475,"children":476},{"style":118},[477],{"type":28,"value":478}," test_save_time",{"type":23,"tag":85,"props":480,"children":481},{"style":124},[482],{"type":28,"value":165},{"type":23,"tag":85,"props":484,"children":485},{"class":87,"line":141},[486],{"type":23,"tag":85,"props":487,"children":488},{"style":172},[489],{"type":28,"value":490}," \"\"\" Verify that the Epoch time is written to file\n",{"type":23,"tag":85,"props":492,"children":493},{"class":87,"line":149},[494],{"type":23,"tag":85,"props":495,"children":496},{"style":172},[497],{"type":28,"value":184},{"type":23,"tag":85,"props":499,"children":500},{"class":87,"line":168},[501,505,510,515,519,525,529,533],{"type":23,"tag":85,"props":502,"children":503},{"style":112},[504],{"type":28,"value":193},{"type":23,"tag":85,"props":506,"children":507},{"style":124},[508],{"type":28,"value":509}," unittest.mock.patch(",{"type":23,"tag":85,"props":511,"children":512},{"style":172},[513],{"type":28,"value":514},"\"utime.time\"",{"type":23,"tag":85,"props":516,"children":517},{"style":124},[518],{"type":28,"value":212},{"type":23,"tag":85,"props":520,"children":522},{"style":521},"--shiki-default:#E36209",[523],{"type":28,"value":524},"return_value",{"type":23,"tag":85,"props":526,"children":527},{"style":112},[528],{"type":28,"value":371},{"type":23,"tag":85,"props":530,"children":531},{"style":130},[532],{"type":28,"value":416},{"type":23,"tag":85,"props":534,"children":535},{"style":124},[536],{"type":28,"value":138},{"type":23,"tag":85,"props":538,"children":539},{"class":87,"line":178},[540,545,549],{"type":23,"tag":85,"props":541,"children":542},{"style":124},[543],{"type":28,"value":544}," t ",{"type":23,"tag":85,"props":546,"children":547},{"style":112},[548],{"type":28,"value":371},{"type":23,"tag":85,"props":550,"children":551},{"style":124},[552],{"type":28,"value":553}," TimeLogger()\n",{"type":23,"tag":85,"props":555,"children":556},{"class":87,"line":187},[557],{"type":23,"tag":85,"props":558,"children":559},{"style":124},[560],{"type":28,"value":561}," t.save_time()\n",{"type":23,"tag":85,"props":563,"children":564},{"class":87,"line":235},[565,570,574,578,582,586,590],{"type":23,"tag":85,"props":566,"children":567},{"style":112},[568],{"type":28,"value":569}," with",{"type":23,"tag":85,"props":571,"children":572},{"style":130},[573],{"type":28,"value":198},{"type":23,"tag":85,"props":575,"children":576},{"style":124},[577],{"type":28,"value":127},{"type":23,"tag":85,"props":579,"children":580},{"style":172},[581],{"type":28,"value":207},{"type":23,"tag":85,"props":583,"children":584},{"style":124},[585],{"type":28,"value":222},{"type":23,"tag":85,"props":587,"children":588},{"style":112},[589],{"type":28,"value":227},{"type":23,"tag":85,"props":591,"children":592},{"style":124},[593],{"type":28,"value":232},{"type":23,"tag":85,"props":595,"children":597},{"class":87,"line":596},10,[598,603,608,613],{"type":23,"tag":85,"props":599,"children":600},{"style":130},[601],{"type":28,"value":602}," self",{"type":23,"tag":85,"props":604,"children":605},{"style":124},[606],{"type":28,"value":607},".assertEqual(",{"type":23,"tag":85,"props":609,"children":610},{"style":172},[611],{"type":28,"value":612},"\"1234\"",{"type":23,"tag":85,"props":614,"children":615},{"style":124},[616],{"type":28,"value":617},", f.read())\n",{"type":23,"tag":24,"props":619,"children":620},{},[621,623,629,631,637,639,644],{"type":28,"value":622},"Now, when the ",{"type":23,"tag":59,"props":624,"children":626},{"className":625},[],[627],{"type":28,"value":628},"save_time",{"type":28,"value":630}," method gets the latest time from ",{"type":23,"tag":59,"props":632,"children":634},{"className":633},[],[635],{"type":28,"value":636},"utime.time()",{"type":28,"value":638},", the\nvalue will be patched to return ",{"type":23,"tag":59,"props":640,"children":642},{"className":641},[],[643],{"type":28,"value":416},{"type":28,"value":645},". That value will be written to a file,\nand our unit test will pass!",{"type":23,"tag":647,"props":648,"children":650},"h2",{"id":649},"references",[651],{"type":28,"value":652},"References",{"type":23,"tag":654,"props":655,"children":656},"ol",{},[657],{"type":23,"tag":658,"props":659,"children":660},"li",{},[661],{"type":23,"tag":662,"props":663,"children":667},"a",{"href":664,"rel":665},"https://docs.python.org/3/library/unittest.html",[666],"nofollow",[668,673],{"type":23,"tag":59,"props":669,"children":671},{"className":670},[],[672],{"type":28,"value":446},{"type":28,"value":674}," — Unit testing framework",{"type":23,"tag":676,"props":677,"children":678},"style",{},[679],{"type":28,"value":680},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":98,"depth":98,"links":682},[683],{"id":649,"depth":98,"text":652},"markdown","content:articles:unit-testing-micropython-with-mocks.md","content","articles/unit-testing-micropython-with-mocks.md","md",1718428848856] \ No newline at end of file +[{"data":1,"prerenderedAt":689},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"draft":6,"tags":11,"categories":16,"excerpt":19,"body":29,"_type":684,"_id":685,"_source":686,"_file":687,"_extension":688},"/articles/unit-testing-micropython-with-mocks","articles",false,"","Unit Testing in MicroPython with Mocks","Unit testing code for embedded systems can be challenging. While it's possible\nto leverage emulators, write side-effect free code, or run tests on the\nhardware itself, it's often easiest to unit test the code on your personal\ncomputer with mocked hardware functionality.","2020-02-07",[12,13,14,15],"micropython","testing","mocks","tutorial",[17,18],"python","embedded",{"type":20,"children":21},"root",[22],{"type":23,"tag":24,"props":25,"children":26},"element","p",{},[27],{"type":28,"value":9},"text",{"type":20,"children":30,"toc":681},[31,35,42,47,53,75,252,278,398,419,618,646,653,675],{"type":23,"tag":24,"props":32,"children":33},{},[34],{"type":28,"value":9},{"type":23,"tag":36,"props":37,"children":39},"h1",{"id":38},"mocking",[40],{"type":28,"value":41},"Mocking",{"type":23,"tag":24,"props":43,"children":44},{},[45],{"type":28,"value":46},"Mocks allow us to replace the hardware interfacing functionality under-the-hood\nwith predefined results and side-effects. For example, if there is a piece of\nlogic that retrieves values from an accelerometer to get a device's\norientation, it would be possible to mock the returned values of the\naccelerometer -- allowing us to run the unit tests on a device that does not\nhave an accelerometer sensor installed.",{"type":23,"tag":36,"props":48,"children":50},{"id":49},"a-micropython-mocking-example",[51],{"type":28,"value":52},"A MicroPython Mocking Example",{"type":23,"tag":24,"props":54,"children":55},{},[56,58,65,67,73],{"type":28,"value":57},"In this example, we will be unit testing a module named ",{"type":23,"tag":59,"props":60,"children":62},"code",{"className":61},[],[63],{"type":28,"value":64},"time_logger",{"type":28,"value":66},", that\ndepends on the MicroPython library ",{"type":23,"tag":59,"props":68,"children":70},{"className":69},[],[71],{"type":28,"value":72},"utime",{"type":28,"value":74}," to log the most recent Epoch time to\na file.",{"type":23,"tag":76,"props":77,"children":80},"pre",{"className":78,"code":79,"language":17,"meta":7,"style":7},"language-python shiki shiki-themes github-light","# time_logger.py\n\nclass TimeLogger(object):\n\n def save_time(self):\n \"\"\" Overwrite a file with the most recent Epoch timestamp from `utime`\n \"\"\"\n with open(\"LAST_KNOWN_TIME\", \"w+\") as f:\n f.write(str(utime.time()))\n",[81],{"type":23,"tag":59,"props":82,"children":83},{"__ignoreMap":7},[84,96,106,139,147,166,176,185,233],{"type":23,"tag":85,"props":86,"children":89},"span",{"class":87,"line":88},"line",1,[90],{"type":23,"tag":85,"props":91,"children":93},{"style":92},"--shiki-default:#6A737D",[94],{"type":28,"value":95},"# time_logger.py\n",{"type":23,"tag":85,"props":97,"children":99},{"class":87,"line":98},2,[100],{"type":23,"tag":85,"props":101,"children":103},{"emptyLinePlaceholder":102},true,[104],{"type":28,"value":105},"\n",{"type":23,"tag":85,"props":107,"children":109},{"class":87,"line":108},3,[110,116,122,128,134],{"type":23,"tag":85,"props":111,"children":113},{"style":112},"--shiki-default:#D73A49",[114],{"type":28,"value":115},"class",{"type":23,"tag":85,"props":117,"children":119},{"style":118},"--shiki-default:#6F42C1",[120],{"type":28,"value":121}," TimeLogger",{"type":23,"tag":85,"props":123,"children":125},{"style":124},"--shiki-default:#24292E",[126],{"type":28,"value":127},"(",{"type":23,"tag":85,"props":129,"children":131},{"style":130},"--shiki-default:#005CC5",[132],{"type":28,"value":133},"object",{"type":23,"tag":85,"props":135,"children":136},{"style":124},[137],{"type":28,"value":138},"):\n",{"type":23,"tag":85,"props":140,"children":142},{"class":87,"line":141},4,[143],{"type":23,"tag":85,"props":144,"children":145},{"emptyLinePlaceholder":102},[146],{"type":28,"value":105},{"type":23,"tag":85,"props":148,"children":150},{"class":87,"line":149},5,[151,156,161],{"type":23,"tag":85,"props":152,"children":153},{"style":112},[154],{"type":28,"value":155}," def",{"type":23,"tag":85,"props":157,"children":158},{"style":118},[159],{"type":28,"value":160}," save_time",{"type":23,"tag":85,"props":162,"children":163},{"style":124},[164],{"type":28,"value":165},"(self):\n",{"type":23,"tag":85,"props":167,"children":169},{"class":87,"line":168},6,[170],{"type":23,"tag":85,"props":171,"children":173},{"style":172},"--shiki-default:#032F62",[174],{"type":28,"value":175}," \"\"\" Overwrite a file with the most recent Epoch timestamp from `utime`\n",{"type":23,"tag":85,"props":177,"children":179},{"class":87,"line":178},7,[180],{"type":23,"tag":85,"props":181,"children":182},{"style":172},[183],{"type":28,"value":184}," \"\"\"\n",{"type":23,"tag":85,"props":186,"children":188},{"class":87,"line":187},8,[189,194,199,203,208,213,218,223,228],{"type":23,"tag":85,"props":190,"children":191},{"style":112},[192],{"type":28,"value":193}," with",{"type":23,"tag":85,"props":195,"children":196},{"style":130},[197],{"type":28,"value":198}," open",{"type":23,"tag":85,"props":200,"children":201},{"style":124},[202],{"type":28,"value":127},{"type":23,"tag":85,"props":204,"children":205},{"style":172},[206],{"type":28,"value":207},"\"LAST_KNOWN_TIME\"",{"type":23,"tag":85,"props":209,"children":210},{"style":124},[211],{"type":28,"value":212},", ",{"type":23,"tag":85,"props":214,"children":215},{"style":172},[216],{"type":28,"value":217},"\"w+\"",{"type":23,"tag":85,"props":219,"children":220},{"style":124},[221],{"type":28,"value":222},") ",{"type":23,"tag":85,"props":224,"children":225},{"style":112},[226],{"type":28,"value":227},"as",{"type":23,"tag":85,"props":229,"children":230},{"style":124},[231],{"type":28,"value":232}," f:\n",{"type":23,"tag":85,"props":234,"children":236},{"class":87,"line":235},9,[237,242,247],{"type":23,"tag":85,"props":238,"children":239},{"style":124},[240],{"type":28,"value":241}," f.write(",{"type":23,"tag":85,"props":243,"children":244},{"style":130},[245],{"type":28,"value":246},"str",{"type":23,"tag":85,"props":248,"children":249},{"style":124},[250],{"type":28,"value":251},"(utime.time()))\n",{"type":23,"tag":24,"props":253,"children":254},{},[255,257,262,264,269,271,276],{"type":28,"value":256},"First, because the ",{"type":23,"tag":59,"props":258,"children":260},{"className":259},[],[261],{"type":28,"value":72},{"type":28,"value":263}," module is not installed on the machine that the unit\ntests on, we must mock ",{"type":23,"tag":59,"props":265,"children":267},{"className":266},[],[268],{"type":28,"value":72},{"type":28,"value":270}," module before importing ",{"type":23,"tag":59,"props":272,"children":274},{"className":273},[],[275],{"type":28,"value":64},{"type":28,"value":277}," in our\nunit test file.",{"type":23,"tag":76,"props":279,"children":281},{"className":78,"code":280,"language":17,"meta":7,"style":7},"# test_time_logger.py\n\nimport unittest\n\nfrom unittest.mock import MagicMock\n\nsys.modules['utime'] = MagicMock()\nfrom time_logger import TimeLogger\n",[282],{"type":23,"tag":59,"props":283,"children":284},{"__ignoreMap":7},[285,293,300,313,320,342,349,377],{"type":23,"tag":85,"props":286,"children":287},{"class":87,"line":88},[288],{"type":23,"tag":85,"props":289,"children":290},{"style":92},[291],{"type":28,"value":292},"# test_time_logger.py\n",{"type":23,"tag":85,"props":294,"children":295},{"class":87,"line":98},[296],{"type":23,"tag":85,"props":297,"children":298},{"emptyLinePlaceholder":102},[299],{"type":28,"value":105},{"type":23,"tag":85,"props":301,"children":302},{"class":87,"line":108},[303,308],{"type":23,"tag":85,"props":304,"children":305},{"style":112},[306],{"type":28,"value":307},"import",{"type":23,"tag":85,"props":309,"children":310},{"style":124},[311],{"type":28,"value":312}," unittest\n",{"type":23,"tag":85,"props":314,"children":315},{"class":87,"line":141},[316],{"type":23,"tag":85,"props":317,"children":318},{"emptyLinePlaceholder":102},[319],{"type":28,"value":105},{"type":23,"tag":85,"props":321,"children":322},{"class":87,"line":149},[323,328,333,337],{"type":23,"tag":85,"props":324,"children":325},{"style":112},[326],{"type":28,"value":327},"from",{"type":23,"tag":85,"props":329,"children":330},{"style":124},[331],{"type":28,"value":332}," unittest.mock ",{"type":23,"tag":85,"props":334,"children":335},{"style":112},[336],{"type":28,"value":307},{"type":23,"tag":85,"props":338,"children":339},{"style":124},[340],{"type":28,"value":341}," MagicMock\n",{"type":23,"tag":85,"props":343,"children":344},{"class":87,"line":168},[345],{"type":23,"tag":85,"props":346,"children":347},{"emptyLinePlaceholder":102},[348],{"type":28,"value":105},{"type":23,"tag":85,"props":350,"children":351},{"class":87,"line":178},[352,357,362,367,372],{"type":23,"tag":85,"props":353,"children":354},{"style":124},[355],{"type":28,"value":356},"sys.modules[",{"type":23,"tag":85,"props":358,"children":359},{"style":172},[360],{"type":28,"value":361},"'utime'",{"type":23,"tag":85,"props":363,"children":364},{"style":124},[365],{"type":28,"value":366},"] ",{"type":23,"tag":85,"props":368,"children":369},{"style":112},[370],{"type":28,"value":371},"=",{"type":23,"tag":85,"props":373,"children":374},{"style":124},[375],{"type":28,"value":376}," MagicMock()\n",{"type":23,"tag":85,"props":378,"children":379},{"class":87,"line":187},[380,384,389,393],{"type":23,"tag":85,"props":381,"children":382},{"style":112},[383],{"type":28,"value":327},{"type":23,"tag":85,"props":385,"children":386},{"style":124},[387],{"type":28,"value":388}," time_logger ",{"type":23,"tag":85,"props":390,"children":391},{"style":112},[392],{"type":28,"value":307},{"type":23,"tag":85,"props":394,"children":395},{"style":124},[396],{"type":28,"value":397}," TimeLogger\n",{"type":23,"tag":24,"props":399,"children":400},{},[401,403,409,411,417],{"type":28,"value":402},"Then, we can write a test that patches the ",{"type":23,"tag":59,"props":404,"children":406},{"className":405},[],[407],{"type":28,"value":408},"utime.time",{"type":28,"value":410}," functionality so that\nit returns a value of our choosing -- in this case, ",{"type":23,"tag":59,"props":412,"children":414},{"className":413},[],[415],{"type":28,"value":416},"1234",{"type":28,"value":418},".",{"type":23,"tag":76,"props":420,"children":422},{"className":78,"code":421,"language":17,"meta":7,"style":7},"class TestTimeLogger(unittest.TestCase):\n\n def test_save_time(self):\n \"\"\" Verify that the Epoch time is written to file\n \"\"\"\n with unittest.mock.patch(\"utime.time\", return_value=1234):\n t = TimeLogger()\n t.save_time()\n with open(\"LAST_KNOWN_TIME\") as f:\n self.assertEqual(\"1234\", f.read())\n",[423],{"type":23,"tag":59,"props":424,"children":425},{"__ignoreMap":7},[426,460,467,483,491,498,537,554,562,594],{"type":23,"tag":85,"props":427,"children":428},{"class":87,"line":88},[429,433,438,442,447,451,456],{"type":23,"tag":85,"props":430,"children":431},{"style":112},[432],{"type":28,"value":115},{"type":23,"tag":85,"props":434,"children":435},{"style":118},[436],{"type":28,"value":437}," TestTimeLogger",{"type":23,"tag":85,"props":439,"children":440},{"style":124},[441],{"type":28,"value":127},{"type":23,"tag":85,"props":443,"children":444},{"style":118},[445],{"type":28,"value":446},"unittest",{"type":23,"tag":85,"props":448,"children":449},{"style":124},[450],{"type":28,"value":418},{"type":23,"tag":85,"props":452,"children":453},{"style":118},[454],{"type":28,"value":455},"TestCase",{"type":23,"tag":85,"props":457,"children":458},{"style":124},[459],{"type":28,"value":138},{"type":23,"tag":85,"props":461,"children":462},{"class":87,"line":98},[463],{"type":23,"tag":85,"props":464,"children":465},{"emptyLinePlaceholder":102},[466],{"type":28,"value":105},{"type":23,"tag":85,"props":468,"children":469},{"class":87,"line":108},[470,474,479],{"type":23,"tag":85,"props":471,"children":472},{"style":112},[473],{"type":28,"value":155},{"type":23,"tag":85,"props":475,"children":476},{"style":118},[477],{"type":28,"value":478}," test_save_time",{"type":23,"tag":85,"props":480,"children":481},{"style":124},[482],{"type":28,"value":165},{"type":23,"tag":85,"props":484,"children":485},{"class":87,"line":141},[486],{"type":23,"tag":85,"props":487,"children":488},{"style":172},[489],{"type":28,"value":490}," \"\"\" Verify that the Epoch time is written to file\n",{"type":23,"tag":85,"props":492,"children":493},{"class":87,"line":149},[494],{"type":23,"tag":85,"props":495,"children":496},{"style":172},[497],{"type":28,"value":184},{"type":23,"tag":85,"props":499,"children":500},{"class":87,"line":168},[501,505,510,515,519,525,529,533],{"type":23,"tag":85,"props":502,"children":503},{"style":112},[504],{"type":28,"value":193},{"type":23,"tag":85,"props":506,"children":507},{"style":124},[508],{"type":28,"value":509}," unittest.mock.patch(",{"type":23,"tag":85,"props":511,"children":512},{"style":172},[513],{"type":28,"value":514},"\"utime.time\"",{"type":23,"tag":85,"props":516,"children":517},{"style":124},[518],{"type":28,"value":212},{"type":23,"tag":85,"props":520,"children":522},{"style":521},"--shiki-default:#E36209",[523],{"type":28,"value":524},"return_value",{"type":23,"tag":85,"props":526,"children":527},{"style":112},[528],{"type":28,"value":371},{"type":23,"tag":85,"props":530,"children":531},{"style":130},[532],{"type":28,"value":416},{"type":23,"tag":85,"props":534,"children":535},{"style":124},[536],{"type":28,"value":138},{"type":23,"tag":85,"props":538,"children":539},{"class":87,"line":178},[540,545,549],{"type":23,"tag":85,"props":541,"children":542},{"style":124},[543],{"type":28,"value":544}," t ",{"type":23,"tag":85,"props":546,"children":547},{"style":112},[548],{"type":28,"value":371},{"type":23,"tag":85,"props":550,"children":551},{"style":124},[552],{"type":28,"value":553}," TimeLogger()\n",{"type":23,"tag":85,"props":555,"children":556},{"class":87,"line":187},[557],{"type":23,"tag":85,"props":558,"children":559},{"style":124},[560],{"type":28,"value":561}," t.save_time()\n",{"type":23,"tag":85,"props":563,"children":564},{"class":87,"line":235},[565,570,574,578,582,586,590],{"type":23,"tag":85,"props":566,"children":567},{"style":112},[568],{"type":28,"value":569}," with",{"type":23,"tag":85,"props":571,"children":572},{"style":130},[573],{"type":28,"value":198},{"type":23,"tag":85,"props":575,"children":576},{"style":124},[577],{"type":28,"value":127},{"type":23,"tag":85,"props":579,"children":580},{"style":172},[581],{"type":28,"value":207},{"type":23,"tag":85,"props":583,"children":584},{"style":124},[585],{"type":28,"value":222},{"type":23,"tag":85,"props":587,"children":588},{"style":112},[589],{"type":28,"value":227},{"type":23,"tag":85,"props":591,"children":592},{"style":124},[593],{"type":28,"value":232},{"type":23,"tag":85,"props":595,"children":597},{"class":87,"line":596},10,[598,603,608,613],{"type":23,"tag":85,"props":599,"children":600},{"style":130},[601],{"type":28,"value":602}," self",{"type":23,"tag":85,"props":604,"children":605},{"style":124},[606],{"type":28,"value":607},".assertEqual(",{"type":23,"tag":85,"props":609,"children":610},{"style":172},[611],{"type":28,"value":612},"\"1234\"",{"type":23,"tag":85,"props":614,"children":615},{"style":124},[616],{"type":28,"value":617},", f.read())\n",{"type":23,"tag":24,"props":619,"children":620},{},[621,623,629,631,637,639,644],{"type":28,"value":622},"Now, when the ",{"type":23,"tag":59,"props":624,"children":626},{"className":625},[],[627],{"type":28,"value":628},"save_time",{"type":28,"value":630}," method gets the latest time from ",{"type":23,"tag":59,"props":632,"children":634},{"className":633},[],[635],{"type":28,"value":636},"utime.time()",{"type":28,"value":638},", the\nvalue will be patched to return ",{"type":23,"tag":59,"props":640,"children":642},{"className":641},[],[643],{"type":28,"value":416},{"type":28,"value":645},". That value will be written to a file,\nand our unit test will pass!",{"type":23,"tag":647,"props":648,"children":650},"h2",{"id":649},"references",[651],{"type":28,"value":652},"References",{"type":23,"tag":654,"props":655,"children":656},"ol",{},[657],{"type":23,"tag":658,"props":659,"children":660},"li",{},[661],{"type":23,"tag":662,"props":663,"children":667},"a",{"href":664,"rel":665},"https://docs.python.org/3/library/unittest.html",[666],"nofollow",[668,673],{"type":23,"tag":59,"props":669,"children":671},{"className":670},[],[672],{"type":28,"value":446},{"type":28,"value":674}," — Unit testing framework",{"type":23,"tag":676,"props":677,"children":678},"style",{},[679],{"type":28,"value":680},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":98,"depth":98,"links":682},[683],{"id":649,"depth":98,"text":652},"markdown","content:articles:unit-testing-micropython-with-mocks.md","content","articles/unit-testing-micropython-with-mocks.md","md",1718681824682] \ No newline at end of file diff --git a/articles/unit-testing-micropython-with-mocks/index.html b/articles/unit-testing-micropython-with-mocks/index.html index 41aaebba..a8197350 100644 --- a/articles/unit-testing-micropython-with-mocks/index.html +++ b/articles/unit-testing-micropython-with-mocks/index.html @@ -4,35 +4,35 @@ - - + + - - - - + + + + - + - - - - - - - - - - - - - - - - -

        Unit Testing in MicroPython with Mocks

        2020-02-07

        Unit testing code for embedded systems can be challenging. While it's possible + + + + + + + + + + + + + + + + +

        Unit Testing in MicroPython with Mocks

        2020-02-07

        Unit testing code for embedded systems can be challenging. While it's possible to leverage emulators, write side-effect free code, or run tests on the hardware itself, it's often easiest to unit test the code on your personal computer with mocked hardware functionality.

        Mocking

        Mocks allow us to replace the hardware interfacing functionality under-the-hood @@ -74,5 +74,5 @@ self.assertEqual("1234", f.read())

        Now, when the save_time method gets the latest time from utime.time(), the value will be patched to return 1234. That value will be written to a file, -and our unit test will pass!

        References

        1. unittest — Unit testing framework
        - \ No newline at end of file +and our unit test will pass!

        References

        1. unittest — Unit testing framework
        + \ No newline at end of file diff --git a/articles/vim-fugitive-gpg-pinentry/_payload.json b/articles/vim-fugitive-gpg-pinentry/_payload.json index f029a543..fdd7f196 100644 --- a/articles/vim-fugitive-gpg-pinentry/_payload.json +++ b/articles/vim-fugitive-gpg-pinentry/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":322},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"draft":6,"date":10,"tags":11,"categories":14,"excerpt":17,"body":56,"_type":317,"_id":318,"_source":319,"_file":320,"_extension":321},"/articles/vim-fugitive-gpg-pinentry","articles",false,"","Using pinentry-mac to sign commits from vim-fugitive","In order to sign git commits from within Vim using a plugin like tpope/vim-fugitive, it is necessary to configure the gpg-agent to use a GUI based pinentry-program.","2024-05-11",[12,13],"vim","tip",[15,16],"tooling","tips",{"type":18,"children":19},"root",[20],{"type":21,"tag":22,"props":23,"children":24},"element","p",{},[25,28,37,39,46,48,54],{"type":26,"value":27},"text","In order to sign git commits from within Vim using a plugin like ",{"type":21,"tag":29,"props":30,"children":34},"a",{"href":31,"rel":32},"https://github.com/tpope/vim-fugitive",[33],"nofollow",[35],{"type":26,"value":36},"tpope/vim-fugitive",{"type":26,"value":38},", it is necessary to configure the ",{"type":21,"tag":40,"props":41,"children":43},"code",{"className":42},[],[44],{"type":26,"value":45},"gpg-agent",{"type":26,"value":47}," to use a GUI based ",{"type":21,"tag":40,"props":49,"children":51},{"className":50},[],[52],{"type":26,"value":53},"pinentry-program",{"type":26,"value":55},".",{"type":18,"children":57,"toc":313},[58,80,87,129,135,140,178,198,206,218,250,255,302,307],{"type":21,"tag":22,"props":59,"children":60},{},[61,62,67,68,73,74,79],{"type":26,"value":27},{"type":21,"tag":29,"props":63,"children":65},{"href":31,"rel":64},[33],[66],{"type":26,"value":36},{"type":26,"value":38},{"type":21,"tag":40,"props":69,"children":71},{"className":70},[],[72],{"type":26,"value":45},{"type":26,"value":47},{"type":21,"tag":40,"props":75,"children":77},{"className":76},[],[78],{"type":26,"value":53},{"type":26,"value":55},{"type":21,"tag":81,"props":82,"children":84},"h2",{"id":83},"preface",[85],{"type":26,"value":86},"Preface",{"type":21,"tag":22,"props":88,"children":89},{},[90,92,99,101,106,107,112,114,120,122,128],{"type":26,"value":91},"The man, the myth, the legend, Timothy Popallopollis himself ",{"type":21,"tag":29,"props":93,"children":96},{"href":94,"rel":95},"https://github.com/tpope/vim-fugitive/issues/846#issuecomment-253816577",[33],[97],{"type":26,"value":98},"recommends",{"type":26,"value":100}," configuring your ",{"type":21,"tag":40,"props":102,"children":104},{"className":103},[],[105],{"type":26,"value":45},{"type":26,"value":47},{"type":21,"tag":40,"props":108,"children":110},{"className":109},[],[111],{"type":26,"value":53},{"type":26,"value":113},". On macOS this can be done quite by simply installing ",{"type":21,"tag":40,"props":115,"children":117},{"className":116},[],[118],{"type":26,"value":119},"pinentry-mac",{"type":26,"value":121},", and updating your ",{"type":21,"tag":40,"props":123,"children":125},{"className":124},[],[126],{"type":26,"value":127},"gpg-agent.conf",{"type":26,"value":55},{"type":21,"tag":81,"props":130,"children":132},{"id":131},"configuration",[133],{"type":26,"value":134},"Configuration",{"type":21,"tag":22,"props":136,"children":137},{},[138],{"type":26,"value":139},"First things first, let's install the pinentry program.",{"type":21,"tag":141,"props":142,"children":146},"pre",{"code":143,"language":144,"meta":7,"className":145,"style":7},"$ brew install pinentry-mac\n","bash","language-bash shiki shiki-themes github-light",[147],{"type":21,"tag":40,"props":148,"children":149},{"__ignoreMap":7},[150],{"type":21,"tag":151,"props":152,"children":155},"span",{"class":153,"line":154},"line",1,[156,162,168,173],{"type":21,"tag":151,"props":157,"children":159},{"style":158},"--shiki-default:#6F42C1",[160],{"type":26,"value":161},"$",{"type":21,"tag":151,"props":163,"children":165},{"style":164},"--shiki-default:#032F62",[166],{"type":26,"value":167}," brew",{"type":21,"tag":151,"props":169,"children":170},{"style":164},[171],{"type":26,"value":172}," install",{"type":21,"tag":151,"props":174,"children":175},{"style":164},[176],{"type":26,"value":177}," pinentry-mac\n",{"type":21,"tag":22,"props":179,"children":180},{},[181,183,188,190,196],{"type":26,"value":182},"Then, all we need to do is set the ",{"type":21,"tag":40,"props":184,"children":186},{"className":185},[],[187],{"type":26,"value":53},{"type":26,"value":189}," option in your ",{"type":21,"tag":40,"props":191,"children":193},{"className":192},[],[194],{"type":26,"value":195},"~/.gnupg/gpg-agent.conf",{"type":26,"value":197}," file.",{"type":21,"tag":141,"props":199,"children":201},{"code":200},"default-cache-ttl 600\nmax-cache-ttl 7200\npinentry-program /opt/homebrew/bin/pinentry-mac\n",[202],{"type":21,"tag":40,"props":203,"children":204},{"__ignoreMap":7},[205],{"type":26,"value":200},{"type":21,"tag":22,"props":207,"children":208},{},[209,211,217],{"type":26,"value":210},"If your don't know the path to your pinentry program, you can throw down a quick ",{"type":21,"tag":40,"props":212,"children":214},{"className":213},[],[215],{"type":26,"value":216},"which",{"type":26,"value":55},{"type":21,"tag":141,"props":219,"children":221},{"code":220,"language":144,"meta":7,"className":145,"style":7},"$ which pinentry-mac\n/opt/homebrew/bin/pinentry-mac\n",[222],{"type":21,"tag":40,"props":223,"children":224},{"__ignoreMap":7},[225,241],{"type":21,"tag":151,"props":226,"children":227},{"class":153,"line":154},[228,232,237],{"type":21,"tag":151,"props":229,"children":230},{"style":158},[231],{"type":26,"value":161},{"type":21,"tag":151,"props":233,"children":234},{"style":164},[235],{"type":26,"value":236}," which",{"type":21,"tag":151,"props":238,"children":239},{"style":164},[240],{"type":26,"value":177},{"type":21,"tag":151,"props":242,"children":244},{"class":153,"line":243},2,[245],{"type":21,"tag":151,"props":246,"children":247},{"style":158},[248],{"type":26,"value":249},"/opt/homebrew/bin/pinentry-mac\n",{"type":21,"tag":22,"props":251,"children":252},{},[253],{"type":26,"value":254},"Or use your Homebrew prefix.",{"type":21,"tag":141,"props":256,"children":258},{"code":257,"language":144,"meta":7,"className":145,"style":7},"$ echo $(brew --prefix)/bin/pinentry-mac\n/opt/homebrew/bin/pinentry-mac\n",[259],{"type":21,"tag":40,"props":260,"children":261},{"__ignoreMap":7},[262,295],{"type":21,"tag":151,"props":263,"children":264},{"class":153,"line":154},[265,269,274,279,284,290],{"type":21,"tag":151,"props":266,"children":267},{"style":158},[268],{"type":26,"value":161},{"type":21,"tag":151,"props":270,"children":271},{"style":164},[272],{"type":26,"value":273}," echo",{"type":21,"tag":151,"props":275,"children":276},{"style":164},[277],{"type":26,"value":278}," $(",{"type":21,"tag":151,"props":280,"children":281},{"style":158},[282],{"type":26,"value":283},"brew",{"type":21,"tag":151,"props":285,"children":287},{"style":286},"--shiki-default:#005CC5",[288],{"type":26,"value":289}," --prefix",{"type":21,"tag":151,"props":291,"children":292},{"style":164},[293],{"type":26,"value":294},")/bin/pinentry-mac\n",{"type":21,"tag":151,"props":296,"children":297},{"class":153,"line":243},[298],{"type":21,"tag":151,"props":299,"children":300},{"style":158},[301],{"type":26,"value":249},{"type":21,"tag":22,"props":303,"children":304},{},[305],{"type":26,"value":306},"But that's all it takes. Now, you should be prompted to enter your gpg pin in an external window when signing commits from vim.",{"type":21,"tag":308,"props":309,"children":310},"style",{},[311],{"type":26,"value":312},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":243,"depth":243,"links":314},[315,316],{"id":83,"depth":243,"text":86},{"id":131,"depth":243,"text":134},"markdown","content:articles:vim-fugitive-gpg-pinentry.md","content","articles/vim-fugitive-gpg-pinentry.md","md",1718428848840] \ No newline at end of file +[{"data":1,"prerenderedAt":322},["Reactive",2],{"page-data":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"draft":6,"date":10,"tags":11,"categories":14,"excerpt":17,"body":56,"_type":317,"_id":318,"_source":319,"_file":320,"_extension":321},"/articles/vim-fugitive-gpg-pinentry","articles",false,"","Using pinentry-mac to sign commits from vim-fugitive","In order to sign git commits from within Vim using a plugin like tpope/vim-fugitive, it is necessary to configure the gpg-agent to use a GUI based pinentry-program.","2024-05-11",[12,13],"vim","tip",[15,16],"tooling","tips",{"type":18,"children":19},"root",[20],{"type":21,"tag":22,"props":23,"children":24},"element","p",{},[25,28,37,39,46,48,54],{"type":26,"value":27},"text","In order to sign git commits from within Vim using a plugin like ",{"type":21,"tag":29,"props":30,"children":34},"a",{"href":31,"rel":32},"https://github.com/tpope/vim-fugitive",[33],"nofollow",[35],{"type":26,"value":36},"tpope/vim-fugitive",{"type":26,"value":38},", it is necessary to configure the ",{"type":21,"tag":40,"props":41,"children":43},"code",{"className":42},[],[44],{"type":26,"value":45},"gpg-agent",{"type":26,"value":47}," to use a GUI based ",{"type":21,"tag":40,"props":49,"children":51},{"className":50},[],[52],{"type":26,"value":53},"pinentry-program",{"type":26,"value":55},".",{"type":18,"children":57,"toc":313},[58,80,87,129,135,140,178,198,206,218,250,255,302,307],{"type":21,"tag":22,"props":59,"children":60},{},[61,62,67,68,73,74,79],{"type":26,"value":27},{"type":21,"tag":29,"props":63,"children":65},{"href":31,"rel":64},[33],[66],{"type":26,"value":36},{"type":26,"value":38},{"type":21,"tag":40,"props":69,"children":71},{"className":70},[],[72],{"type":26,"value":45},{"type":26,"value":47},{"type":21,"tag":40,"props":75,"children":77},{"className":76},[],[78],{"type":26,"value":53},{"type":26,"value":55},{"type":21,"tag":81,"props":82,"children":84},"h2",{"id":83},"preface",[85],{"type":26,"value":86},"Preface",{"type":21,"tag":22,"props":88,"children":89},{},[90,92,99,101,106,107,112,114,120,122,128],{"type":26,"value":91},"The man, the myth, the legend, Timothy Popallopollis himself ",{"type":21,"tag":29,"props":93,"children":96},{"href":94,"rel":95},"https://github.com/tpope/vim-fugitive/issues/846#issuecomment-253816577",[33],[97],{"type":26,"value":98},"recommends",{"type":26,"value":100}," configuring your ",{"type":21,"tag":40,"props":102,"children":104},{"className":103},[],[105],{"type":26,"value":45},{"type":26,"value":47},{"type":21,"tag":40,"props":108,"children":110},{"className":109},[],[111],{"type":26,"value":53},{"type":26,"value":113},". On macOS this can be done quite by simply installing ",{"type":21,"tag":40,"props":115,"children":117},{"className":116},[],[118],{"type":26,"value":119},"pinentry-mac",{"type":26,"value":121},", and updating your ",{"type":21,"tag":40,"props":123,"children":125},{"className":124},[],[126],{"type":26,"value":127},"gpg-agent.conf",{"type":26,"value":55},{"type":21,"tag":81,"props":130,"children":132},{"id":131},"configuration",[133],{"type":26,"value":134},"Configuration",{"type":21,"tag":22,"props":136,"children":137},{},[138],{"type":26,"value":139},"First things first, let's install the pinentry program.",{"type":21,"tag":141,"props":142,"children":146},"pre",{"code":143,"language":144,"meta":7,"className":145,"style":7},"$ brew install pinentry-mac\n","bash","language-bash shiki shiki-themes github-light",[147],{"type":21,"tag":40,"props":148,"children":149},{"__ignoreMap":7},[150],{"type":21,"tag":151,"props":152,"children":155},"span",{"class":153,"line":154},"line",1,[156,162,168,173],{"type":21,"tag":151,"props":157,"children":159},{"style":158},"--shiki-default:#6F42C1",[160],{"type":26,"value":161},"$",{"type":21,"tag":151,"props":163,"children":165},{"style":164},"--shiki-default:#032F62",[166],{"type":26,"value":167}," brew",{"type":21,"tag":151,"props":169,"children":170},{"style":164},[171],{"type":26,"value":172}," install",{"type":21,"tag":151,"props":174,"children":175},{"style":164},[176],{"type":26,"value":177}," pinentry-mac\n",{"type":21,"tag":22,"props":179,"children":180},{},[181,183,188,190,196],{"type":26,"value":182},"Then, all we need to do is set the ",{"type":21,"tag":40,"props":184,"children":186},{"className":185},[],[187],{"type":26,"value":53},{"type":26,"value":189}," option in your ",{"type":21,"tag":40,"props":191,"children":193},{"className":192},[],[194],{"type":26,"value":195},"~/.gnupg/gpg-agent.conf",{"type":26,"value":197}," file.",{"type":21,"tag":141,"props":199,"children":201},{"code":200},"default-cache-ttl 600\nmax-cache-ttl 7200\npinentry-program /opt/homebrew/bin/pinentry-mac\n",[202],{"type":21,"tag":40,"props":203,"children":204},{"__ignoreMap":7},[205],{"type":26,"value":200},{"type":21,"tag":22,"props":207,"children":208},{},[209,211,217],{"type":26,"value":210},"If your don't know the path to your pinentry program, you can throw down a quick ",{"type":21,"tag":40,"props":212,"children":214},{"className":213},[],[215],{"type":26,"value":216},"which",{"type":26,"value":55},{"type":21,"tag":141,"props":219,"children":221},{"code":220,"language":144,"meta":7,"className":145,"style":7},"$ which pinentry-mac\n/opt/homebrew/bin/pinentry-mac\n",[222],{"type":21,"tag":40,"props":223,"children":224},{"__ignoreMap":7},[225,241],{"type":21,"tag":151,"props":226,"children":227},{"class":153,"line":154},[228,232,237],{"type":21,"tag":151,"props":229,"children":230},{"style":158},[231],{"type":26,"value":161},{"type":21,"tag":151,"props":233,"children":234},{"style":164},[235],{"type":26,"value":236}," which",{"type":21,"tag":151,"props":238,"children":239},{"style":164},[240],{"type":26,"value":177},{"type":21,"tag":151,"props":242,"children":244},{"class":153,"line":243},2,[245],{"type":21,"tag":151,"props":246,"children":247},{"style":158},[248],{"type":26,"value":249},"/opt/homebrew/bin/pinentry-mac\n",{"type":21,"tag":22,"props":251,"children":252},{},[253],{"type":26,"value":254},"Or use your Homebrew prefix.",{"type":21,"tag":141,"props":256,"children":258},{"code":257,"language":144,"meta":7,"className":145,"style":7},"$ echo $(brew --prefix)/bin/pinentry-mac\n/opt/homebrew/bin/pinentry-mac\n",[259],{"type":21,"tag":40,"props":260,"children":261},{"__ignoreMap":7},[262,295],{"type":21,"tag":151,"props":263,"children":264},{"class":153,"line":154},[265,269,274,279,284,290],{"type":21,"tag":151,"props":266,"children":267},{"style":158},[268],{"type":26,"value":161},{"type":21,"tag":151,"props":270,"children":271},{"style":164},[272],{"type":26,"value":273}," echo",{"type":21,"tag":151,"props":275,"children":276},{"style":164},[277],{"type":26,"value":278}," $(",{"type":21,"tag":151,"props":280,"children":281},{"style":158},[282],{"type":26,"value":283},"brew",{"type":21,"tag":151,"props":285,"children":287},{"style":286},"--shiki-default:#005CC5",[288],{"type":26,"value":289}," --prefix",{"type":21,"tag":151,"props":291,"children":292},{"style":164},[293],{"type":26,"value":294},")/bin/pinentry-mac\n",{"type":21,"tag":151,"props":296,"children":297},{"class":153,"line":243},[298],{"type":21,"tag":151,"props":299,"children":300},{"style":158},[301],{"type":26,"value":249},{"type":21,"tag":22,"props":303,"children":304},{},[305],{"type":26,"value":306},"But that's all it takes. Now, you should be prompted to enter your gpg pin in an external window when signing commits from vim.",{"type":21,"tag":308,"props":309,"children":310},"style",{},[311],{"type":26,"value":312},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":243,"depth":243,"links":314},[315,316],{"id":83,"depth":243,"text":86},{"id":131,"depth":243,"text":134},"markdown","content:articles:vim-fugitive-gpg-pinentry.md","content","articles/vim-fugitive-gpg-pinentry.md","md",1718681824631] \ No newline at end of file diff --git a/articles/vim-fugitive-gpg-pinentry/index.html b/articles/vim-fugitive-gpg-pinentry/index.html index bf6a1ec2..325848a5 100644 --- a/articles/vim-fugitive-gpg-pinentry/index.html +++ b/articles/vim-fugitive-gpg-pinentry/index.html @@ -4,32 +4,32 @@ - - + + - - - - + + + + - + - - - - - - - - - - - - - -

        Using pinentry-mac to sign commits from vim-fugitive

        2024-05-11

        In order to sign git commits from within Vim using a plugin like tpope/vim-fugitive, it is necessary to configure the gpg-agent to use a GUI based pinentry-program.

        Preface

        The man, the myth, the legend, Timothy Popallopollis himself recommends configuring your gpg-agent to use a GUI based pinentry-program. On macOS this can be done quite by simply installing pinentry-mac, and updating your gpg-agent.conf.

        Configuration

        First things first, let's install the pinentry program.

        $ brew install pinentry-mac
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +

        Using pinentry-mac to sign commits from vim-fugitive

        2024-05-11

        In order to sign git commits from within Vim using a plugin like tpope/vim-fugitive, it is necessary to configure the gpg-agent to use a GUI based pinentry-program.

        Preface

        The man, the myth, the legend, Timothy Popallopollis himself recommends configuring your gpg-agent to use a GUI based pinentry-program. On macOS this can be done quite by simply installing pinentry-mac, and updating your gpg-agent.conf.

        Configuration

        First things first, let's install the pinentry program.

        $ brew install pinentry-mac
         

        Then, all we need to do is set the pinentry-program option in your ~/.gnupg/gpg-agent.conf file.

        default-cache-ttl 600
         max-cache-ttl 7200
         pinentry-program /opt/homebrew/bin/pinentry-mac
        @@ -37,5 +37,5 @@
         /opt/homebrew/bin/pinentry-mac
         

        Or use your Homebrew prefix.

        $ echo $(brew --prefix)/bin/pinentry-mac
         /opt/homebrew/bin/pinentry-mac
        -

        But that's all it takes. Now, you should be prompted to enter your gpg pin in an external window when signing commits from vim.

        - \ No newline at end of file +

        But that's all it takes. Now, you should be prompted to enter your gpg pin in an external window when signing commits from vim.

        + \ No newline at end of file diff --git a/atom/index.html b/atom/index.html index 9650a431..81a7fe72 100644 --- a/atom/index.html +++ b/atom/index.html @@ -2,7 +2,7 @@ https://cmpadden.github.io cmpadden.github.io - 2024-06-15T05:20:48.404Z + 2024-06-18T03:37:04.153Z Nuxt static site generation + Feed for Node.js Colton Padden diff --git a/card/_payload.json b/card/_payload.json index b7905b04..e4b3b665 100644 --- a/card/_payload.json +++ b/card/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718428847844] \ No newline at end of file +[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718681823578] \ No newline at end of file diff --git a/card/index.html b/card/index.html index a00754bb..a8a6146f 100644 --- a/card/index.html +++ b/card/index.html @@ -4,13 +4,12 @@ - - - - - - - - -
        TL;DR
        Name
        Colton
        Profession
        Astronaut
        Hobby
        Skydiving
        - \ No newline at end of file + + + + + + + +
        TL;DR
        Name
        Colton
        Profession
        Astronaut
        Hobby
        Skydiving
        + \ No newline at end of file diff --git a/examples/nested_transitions/_payload.json b/examples/nested_transitions/_payload.json index 8eb71bd6..e4b3b665 100644 --- a/examples/nested_transitions/_payload.json +++ b/examples/nested_transitions/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718428847845] \ No newline at end of file +[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718681823578] \ No newline at end of file diff --git a/examples/nested_transitions/index.html b/examples/nested_transitions/index.html index 78869a4e..72636bd2 100644 --- a/examples/nested_transitions/index.html +++ b/examples/nested_transitions/index.html @@ -4,12 +4,12 @@ - - - - - - - -
        - \ No newline at end of file + + + + + + + +
        + \ No newline at end of file diff --git a/images/previews/metronome.png b/images/previews/metronome.png index dc54aaa6625b72e0d76acfec79b71ddefd82c667..e6fd0bc2067c7e62a7ce12db1152867e75d33c1a 100644 GIT binary patch literal 160916 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 z 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 literal 120092 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 AQUCw| diff --git a/index.html b/index.html index 691cb1a3..cab5266e 100644 --- a/index.html +++ b/index.html @@ -4,17 +4,16 @@ - - - - - - - - + + + + + + + - - - -
        I am a
        Data Engineer
        helping lead the way of modern data orchestration at Dagster.
        Previously, I worked at Gemini building the future of finance, and before that at Georgetown University's Massive Data Institute building data warehousing and processing solutions to help social scientists and researchers more easily leverage large-scale organic data.
        - \ No newline at end of file + + + +
        Currently, I am helping educate engineers and building the future of data orchestration at Dagster.
        Previously, I worked at Gemini building the data platform that provided company-wide insights into the exchange and business. At Georgetown University's Massive Data Institute building data warehousing, processing solutions, and portals to aid social scientists and researchers to leverage large-scale organic data. And previously I provided consulting for financial institutions and government agencies in the D.C. area around data practices, and identity and access management.
        + \ No newline at end of file diff --git a/playground/_payload.json b/playground/_payload.json index 754b2c49..64b35ece 100644 --- a/playground/_payload.json +++ b/playground/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718428847848] \ No newline at end of file +[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718681823584] \ No newline at end of file diff --git a/playground/audio/_payload.json b/playground/audio/_payload.json index 40baef75..621c3e40 100644 --- a/playground/audio/_payload.json +++ b/playground/audio/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718428847846] \ No newline at end of file +[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718681823580] \ No newline at end of file diff --git a/playground/audio/index.html b/playground/audio/index.html index 660ed7a8..083c2b12 100644 --- a/playground/audio/index.html +++ b/playground/audio/index.html @@ -4,12 +4,12 @@ - - - - - - - -
        Enable
        Disable
        Time Domain Waveform
        Frequency Spectrogram
        Frequency Bar Chart
        Frequency Buffer History
        IndexMeanMinMaxFFTBuffer
        Time Domain Buffer History
        IndexMeanMinMaxFFTBuffer
        - \ No newline at end of file + + + + + + + +
        Enable
        Disable
        Time Domain Waveform
        Frequency Spectrogram
        Frequency Bar Chart
        Frequency Buffer History
        IndexMeanMinMaxFFTBuffer
        Time Domain Buffer History
        IndexMeanMinMaxFFTBuffer
        + \ No newline at end of file diff --git a/playground/chords/_payload.json b/playground/chords/_payload.json index c75e83f9..b84ebb79 100644 --- a/playground/chords/_payload.json +++ b/playground/chords/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718428847847] \ No newline at end of file +[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718681823582] \ No newline at end of file diff --git a/playground/chords/index.html b/playground/chords/index.html index a27e584a..3c88f3da 100644 --- a/playground/chords/index.html +++ b/playground/chords/index.html @@ -4,12 +4,12 @@ - - - - - - - -
        Unfortunately, the Web MIDI API is not supported in all browsers...
        - \ No newline at end of file + + + + + + + +
        Unfortunately, the Web MIDI API is not supported in all browsers...
        + \ No newline at end of file diff --git a/playground/french/_payload.json b/playground/french/_payload.json index 754b2c49..20452206 100644 --- a/playground/french/_payload.json +++ b/playground/french/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718428847848] \ No newline at end of file +[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718681823583] \ No newline at end of file diff --git a/playground/french/index.html b/playground/french/index.html index cf2bba1f..7f455959 100644 --- a/playground/french/index.html +++ b/playground/french/index.html @@ -4,14 +4,14 @@ - - - - - + + + + + - - - -
        1000 French Conjugations
        Loading...
        - \ No newline at end of file + + + +
        1000 French Conjugations
        Loading...
        + \ No newline at end of file diff --git a/playground/index.html b/playground/index.html index d0eaf774..1151d815 100644 --- a/playground/index.html +++ b/playground/index.html @@ -4,13 +4,13 @@ - - - - - - - - -
        - \ No newline at end of file + + + + + + + + +
        + \ No newline at end of file diff --git a/playground/matrix/_payload.json b/playground/matrix/_payload.json index f3426b68..ab3f92ab 100644 --- a/playground/matrix/_payload.json +++ b/playground/matrix/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718428847849] \ No newline at end of file +[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718681823585] \ No newline at end of file diff --git a/playground/matrix/index.html b/playground/matrix/index.html index bcf6c4cb..0a401d9b 100644 --- a/playground/matrix/index.html +++ b/playground/matrix/index.html @@ -4,12 +4,12 @@ - - - - - - - -
        Walk through the steps of matrix multiplication with randomly generated matrices. Press the Spacebar or click the buttons to iterate through the steps.
        Matrix A
        Matrix B
        - \ No newline at end of file + + + + + + + +
        Walk through the steps of matrix multiplication with randomly generated matrices. Press the Spacebar or click the buttons to iterate through the steps.
        Matrix A
        Matrix B
        + \ No newline at end of file diff --git a/playground/metronome/_payload.json b/playground/metronome/_payload.json index 3da046a8..b778e57f 100644 --- a/playground/metronome/_payload.json +++ b/playground/metronome/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718428847850] \ No newline at end of file +[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718681823587] \ No newline at end of file diff --git a/playground/metronome/index.html b/playground/metronome/index.html index 905aadfd..50100e1b 100644 --- a/playground/metronome/index.html +++ b/playground/metronome/index.html @@ -4,12 +4,12 @@ - - - - - - - -
        - \ No newline at end of file + + + + + + + +
        + \ No newline at end of file diff --git a/playground/midi/_payload.json b/playground/midi/_payload.json index 3da046a8..544fb02f 100644 --- a/playground/midi/_payload.json +++ b/playground/midi/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718428847850] \ No newline at end of file +[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718681823588] \ No newline at end of file diff --git a/playground/midi/index.html b/playground/midi/index.html index 743015f3..23bc1fa5 100644 --- a/playground/midi/index.html +++ b/playground/midi/index.html @@ -4,12 +4,12 @@ - - - - - - - -
        Unfortunately, the Web MIDI API is not supported in all browsers...
        - \ No newline at end of file + + + + + + + +
        Unfortunately, the Web MIDI API is not supported in all browsers...
        + \ No newline at end of file diff --git a/playground/palettes/mountains/_payload.json b/playground/palettes/mountains/_payload.json index 4a3b8a09..544fb02f 100644 --- a/playground/palettes/mountains/_payload.json +++ b/playground/palettes/mountains/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718428847851] \ No newline at end of file +[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718681823588] \ No newline at end of file diff --git a/playground/palettes/mountains/index.html b/playground/palettes/mountains/index.html index ea122183..040c6497 100644 --- a/playground/palettes/mountains/index.html +++ b/playground/palettes/mountains/index.html @@ -4,12 +4,12 @@ - - - - - - - -
        Click or tap anywhere to redraw the waves!
        - \ No newline at end of file + + + + + + + +
        Click or tap anywhere to redraw the waves!
        + \ No newline at end of file diff --git a/playground/palettes/variance/_payload.json b/playground/palettes/variance/_payload.json index 6300965c..e9333a76 100644 --- a/playground/palettes/variance/_payload.json +++ b/playground/palettes/variance/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718428847852] \ No newline at end of file +[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718681823589] \ No newline at end of file diff --git a/playground/palettes/variance/index.html b/playground/palettes/variance/index.html index 85b5795c..8fb3bcf8 100644 --- a/playground/palettes/variance/index.html +++ b/playground/palettes/variance/index.html @@ -4,12 +4,12 @@ - - - - - - - -
        - \ No newline at end of file + + + + + + + +
        + \ No newline at end of file diff --git a/playground/plotter/_payload.json b/playground/plotter/_payload.json index c05bfbc0..e448c6fa 100644 --- a/playground/plotter/_payload.json +++ b/playground/plotter/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718428847853] \ No newline at end of file +[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718681823590] \ No newline at end of file diff --git a/playground/plotter/index.html b/playground/plotter/index.html index 1635f132..e0e0ec88 100644 --- a/playground/plotter/index.html +++ b/playground/plotter/index.html @@ -4,12 +4,12 @@ - - - - - - - -
        - \ No newline at end of file + + + + + + + +
        + \ No newline at end of file diff --git a/playground/tiling/_payload.json b/playground/tiling/_payload.json index 0df1a108..9334918a 100644 --- a/playground/tiling/_payload.json +++ b/playground/tiling/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718428847854] \ No newline at end of file +[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718681823595] \ No newline at end of file diff --git a/playground/tiling/index.html b/playground/tiling/index.html index 6fc07797..0e949361 100644 --- a/playground/tiling/index.html +++ b/playground/tiling/index.html @@ -4,12 +4,12 @@ - - - - - - - -
        m-ary tree based tiling
        - \ No newline at end of file + + + + + + + +
        m-ary tree based tiling
        + \ No newline at end of file diff --git a/playground/waves/_payload.json b/playground/waves/_payload.json index 6150e1f0..0b84e89f 100644 --- a/playground/waves/_payload.json +++ b/playground/waves/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718428847855] \ No newline at end of file +[{"data":1,"prerenderedAt":3},["Reactive",2],{},1718681823596] \ No newline at end of file diff --git a/playground/waves/index.html b/playground/waves/index.html index 6fa1d1be..73d04a8f 100644 --- a/playground/waves/index.html +++ b/playground/waves/index.html @@ -4,12 +4,12 @@ - - - - - - - -
        y(x) = A sin((2π / λ) x)
        y(x) = A cos((2π / λ) x)
        y(x) = A tan((2π / λ) x)
        Click or tap anywhere to clear the canvas!
        - \ No newline at end of file + + + + + + + +
        y(x) = A sin((2π / λ) x)
        y(x) = A cos((2π / λ) x)
        y(x) = A tan((2π / λ) x)
        Click or tap anywhere to clear the canvas!
        + \ No newline at end of file